/*
* C Source code
* This program computes an experimental semivariogram using common
* method described by Journel and Huijbregts, "Mining Geostatistics"
* 1978.
* It takes an input text file called "dbQuery.txt" of 5 columns:
* ID EASTING NORTHING ELEVATION CONCENTRATION
* Output is a text file "svar.o" of 4 columns:
* LAG SEMIVARIANCE ST.DEVIATION
* Written by Bart Faulkner, 1998
* RS Kerr Environmental Research Center
* PO Box 1198
* Ada, OK 74820
*
*/
#include "svar.h"
int nsvardata;
int main(void)
{
int vchk=1,hchk=1;
hchk=hsvar(90.,0.9);
return 0;
}
hsvar(double cone_ang, double csize)
{
int i,j,k,l,ll,clipto,span,entno,lastrow,nelem[maxvect];
float east[maxvect],north[maxvect],elev[maxvect],bchem[maxvect],d[1000];
double lag[maxvect],gam[maxvect],std[maxvect];
double maxeast,mineast,maxnorth,minnorth,maxelev,minelev,rad_ang,arg_ang;
double diff,sumdist[maxvect],avdist[maxvect],zdiffsq[maxvect],avzdiffsq[maxvect];
double sdevgamma[maxvect],latdiff;
FILE *ifp, *ofp;
#define hcone_side <
ifp=fopen("dbQuery.txt","r");
ofp=fopen("svar.o","wb");
rad_ang=cone_ang*3.141592654/180.;
for (i=0; i<maxvect; i++) {
east[i]=0.;
north[i]=0.;
elev[i]=0.;
bchem[i]=0.;
}
for (i=0; fscanf(ifp, "%d",&entno) != EOF; ++i) {
fscanf(ifp,"%f %f %f %f\n",&east[i],&north[i],&elev[i],&bchem[i]);
lastrow=i;
}
maxeast=0.;
mineast=1.e10;
maxnorth=0.;
minnorth=1.e10;
maxelev=0.;
minelev=1.e10;
for (i=0; i<=lastrow; i++) {
for (j=0; j<=lastrow; j++) {
if (east[i] > east[j] && east[i] > maxeast) maxeast=east[i];
if (east[i] < east[j] && east[i] < mineast) mineast=east[i];
if (north[i] > north[j] && north[i] > maxnorth) maxnorth=north[i];
if (north[i] < north[j] && north[i] < minnorth) minnorth=north[i];
if (elev[i] > elev[j] && elev[i] > maxelev) maxelev=elev[i];
if (elev[i] < elev[j] && elev[i] < minelev) minelev=elev[i];
}
}
span= (int) (maxelev-minelev)/csize;
for (i=0; i<span; i++) d[i]= (double) csize*i;
/* Calculate semivariogram: */
printf("calculating semivariogram...");
for (i=0; i<lastrow; i++) {
for (j=1; j<=lastrow; j++) {
latdiff=sqrt(pow((east[i]-east[j-1]),2.)+pow((north[i]-north[j-1]),2.));
arg_ang=atan(latdiff/fabs(elev[i]-elev[j-1]));
if (fabs(arg_ang) hcone_side fabs(rad_ang)) {
diff=sqrt(pow((east[i]-east[j-1]),2.)+pow((north[i]-north[j-1]),2.)+
pow(elev[i]-elev[j-1],2.));
for (k=1; k<span; k++) {
if (diff > d[k-1] && diff < d[k]) {
nelem[k]+=1;
sumdist[k]=sumdist[k]+diff;
avdist[k]=sumdist[k]/nelem[k];
zdiffsq[k]=zdiffsq[k]+0.5*pow((bchem[i]-bchem[j]),2.);
avzdiffsq[k]=zdiffsq[k]/nelem[k];
sdevgamma[k]=2.*sqrt((2.*pow(avzdiffsq[k],2.)/nelem[k]));
}
}
}
}
}
ll=-1;
for (l=0; l<span; l++) {
if (avdist[l] != 0. && avzdiffsq[l] != 0.) {
ll=ll+1;
lag[ll]=avdist[l];
gam[ll]=avzdiffsq[l];
std[ll]=sdevgamma[l];
clipto=ll;
}
}
for (ll=0; ll<clipto; ll++) {
fprintf(ofp,"%f %f %f\n",lag[ll],gam[ll],std[ll]);
}
nsvardata=clipto;
printf("\n%d\n",nsvardata);
return 0;
}