int IGRFCall(double date, double flat, double flon, double elev, double *x, double *y, double *z) { int i; char *envstr; char file1[256]; char file2[256]; double ext[3]={0.0,0.0,0.0}; double a2 = 40680925.0; double b2 = 40408588.0; if (igrf_date !=date) { for (i=0;(dtemod[i] !=0) && (dtemod[i]<date);i++); if (i==0) return -1; i--; igrf_date=date; envstr=getenv("IGRF_PATH"); sprintf(file1,"%s/%s",envstr,filmod[i]); getshc(file1, &nmax1, &erad, gh1); sprintf(file2,"%s/%s",envstr,filmod[i+1]); getshc(file2, &nmax2, &erad, gh2); if (i < 12) { interpshc(date, dtemod[i], nmax1, gh1, dtemod[i+1], nmax2, gh2, &nmax, gha); interpshc(date+1,dtemod[i], nmax1, gh1, dtemod[i+1], nmax2, gh2, &nmax, ghb); } else { extrapshc(date, dtemod[i], nmax1, gh1, nmax2, gh2, &nmax, gha); extrapshc(date+1,dtemod[i], nmax1, gh1, nmax2, gh2, &nmax, ghb); } } shval3(1, flat, flon, elev, erad, a2, b2, nmax, gha, 0, ext, x, y, z); return 0; }
int main () { double inArray[MAXCOEFF]; for (int i=1; i<=MAXCOEFF; i++) { inArray[i] = i; } pointCoords loc; loc.lat = 0; loc.lon = 0; loc.elev = 0; shval3( loc, 10, &inArray[0], 3, 10.0, 10.0, 10.0); return 0; }
int IGRFCall(double date, double flat, double flon, double elev, double *x, double *y, double *z) { int i; char *envstr; char file1[256]; char file2[256]; char line[256]; FILE *fp; double ext[3]={0.0,0.0,0.0}; double a2 = 40680925.0; double b2 = 40408588.0; if (dtemax==0) { envstr=getenv("IGRF_PATH"); sprintf(file1,"%s/%s",envstr,"coef.dat"); fp=fopen(file1,"r"); if (fp==NULL) return -1; int i=0; while (fgets(line,255,fp) !=NULL) { sscanf(line,"%s %lf",filmod[i],&dtemod[i]); i++; } dtemod[i]=0; dtemax=i-2; fclose(fp); } if (igrf_date !=date) { for (i=0;(dtemod[i] !=0) && (dtemod[i]<date);i++); if (i==0) return -1; i--; igrf_date=date; envstr=getenv("IGRF_PATH"); sprintf(file1,"%s/%s",envstr,filmod[i]); getshc(file1, &nmax1, &erad, gh1); sprintf(file2,"%s/%s",envstr,filmod[i+1]); getshc(file2, &nmax2, &erad, gh2); if (i < dtemax) { interpshc(date, dtemod[i], nmax1, gh1, dtemod[i+1], nmax2, gh2, &nmax, gha); interpshc(date+1,dtemod[i], nmax1, gh1, dtemod[i+1], nmax2, gh2, &nmax, ghb); } else { extrapshc(date, dtemod[i], nmax1, gh1, nmax2, gh2, &nmax, gha); extrapshc(date+1,dtemod[i], nmax1, gh1, nmax2, gh2, &nmax, ghb); } } shval3(2, flat, flon, elev, erad, a2, b2, nmax, gha, 0, ext, x, y, z); return 0; }
void geomag(geomag_vector *gStr) { /* Variable declaration */ double sdate = gStr->sdate; double latitude = gStr->latitude; double longitude = gStr->longitude; double alt = gStr->alt; /* Control variables */ uint8_t igdgc = 2; /* GEOCENTRIC */ static int max1; static int max2; static int max3; static int nmax; static uint8_t model[] = "IGRF2015"; static double epoch; static double yrmin; static double yrmax; static double minyr; static double maxyr; static double altmin; static double altmax; static double minalt; static double maxalt; /* Obtain the desired model file and read the data */ if (PREV_SDATE == 0) { epoch = 2015.00; max1 = 13; max2 = 8; max3 = 0; yrmin = 2015.00; yrmax = 2020.00; altmin = -1.0; altmax = 600.0; minyr = yrmin; maxyr = yrmax; } PREV_SDATE = sdate; /* Get altitude min and max for selected model. */ minalt = altmin; maxalt = altmax; /* Get Coordinate prefs */ /* If needed modify ranges to reflect coords. */ if (igdgc == 2) { minalt += 6371.2; /* Add radius to ranges. */ maxalt += 6371.2; } /** This will compute everything needed for 1 point in time. **/ getshc(1, max1, 1); getshc(0, max2, 2); nmax = extrapsh(sdate, epoch, max1, max2, 3); nmax = extrapsh(sdate + 1, epoch, max1, max2, 4); /* Do the first calculations */ shval3(igdgc, latitude, longitude, alt, nmax, 3, IEXT, EXT_COEFF1, EXT_COEFF2, EXT_COEFF3); dihf(3); shval3(igdgc, latitude, longitude, alt, nmax, 4, IEXT, EXT_COEFF1, EXT_COEFF2, EXT_COEFF3); dihf(4); d = d * (RAD2DEG); i = i * (RAD2DEG); /* deal with geographic and magnetic poles */ /* at magnetic poles */ if (h < 100.0) { d = GEO_NAN; /* while rest is ok */ } /* at geographic poles */ if (90.0 - fabs(latitude) <= 0.001) { x = GEO_NAN; y = GEO_NAN; d = GEO_NAN; /* while rest is ok */ } /** Above will compute everything for 1 point in time. **/ gStr->Xm = x; gStr->Ym = y; gStr->Zm = z; gStr->decl = d; gStr->incl = i; gStr->h = h; gStr->f = f; }