#include void opnpinc(int argc, char *argv[]); int premsg(char *str); int prompt(char *str); void gparma(char *str, int lnam, char *nam); void gparmd(char *str, double *dv); void sdgrf(double year); void spgrf(double year); void sigrf(double year); void gigrf(int gen, double year); void gparmd2(char *str, double *dv1, double *dv2); void igrfc(double fido, double fkeido, double hght, double *tf); void igrfm(double fm[6]); void clspin(); int main(int argc, char *argv[]) { char str[3], cns, cew; int m, n=-3; double year=0.; double latd, latf, lond, lonf, alt, f, fm[6]; opnpinc(argc, argv); premsg("\nCalculate IGRF components\n"); while (n < -2) { prompt("Select model - DGRF (d), PGRF (p), IGRF (i),\n"); gparma(" or by Generation (1-) ==> ", 3, str); if ((str[0]=='d') || (str[0]=='D')) n = -2; else if ((str[0]=='p') || (str[0]=='P')) n = -1; else if ((str[0]=='i') || (str[0]=='I')) n = 0; else if ((str[0]>='0') || (str[0]<='9')) { m = str[0] - '0'; if ((m!=0) && ((str[1]=='\0') || (str[1]==' '))) n = m; else if ((str[1]>='0') || (str[1]<='9')) n = m*10 + str[1] - '0'; } } while (year < 1900.) gparmd("Select the YEAR of calculation ==> ", &year); if (n == -2) { sdgrf(year); printf("\nDGRF in %7.2f\n", year); } else if (n == -1) { spgrf(year); printf("\nPGRF in %7.2f\n", year); } else if (n == 0) { sigrf(year); printf("\nIGRF in %7.2f\n", year); } else { gigrf(n, year); printf("\nIGRF-%d in %7.2f\n\n", n,year); } while (1) { latd = 99999.; latf = 0.; lond = 0.; lonf = 0.; alt = 0.; prompt(" Latitude ? [deg. min.]\n"); gparmd2(" < Hit RETURN to Quit > ==> ", &latd,&latf); if (latd == 99999.) { fputc('\n',stderr); break; } gparmd2(" Longitude ? [deg. min.] ==> ", &lond,&lonf); gparmd(" Altitude ? [in meters] ==> ", &alt); latd = latd+latf/60.; lond = lond+lonf/60.; igrfc(latd, lond, alt, &f); igrfm(fm); if (latd < 0.) { cns = 'S'; latd = -latd; } else cns = 'N'; if (lond < 0.) { cew = 'W'; lond = -lond; } else cew = 'E'; printf("%7.3f %c %8.3f %c %6.0f m : F =%8.1f H =%8.1f Z =%8.1f\n", latd, cns, lond, cew, alt, f, fm[3], fm[2]); printf(" dip =%8.4f dec =%8.4f\n\n", fm[4], fm[5]); } clspin(); return(0); }