Esempio n. 1
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];
    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;
} 
Esempio n. 2
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;
}
Esempio n. 3
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;
}