C*********************************************************************
C***             S U B R O U T I N E       G I G R F              ****
C*********************************************************************
      SUBROUTINE GIGRF(NGEN, YEAR)
      PARAMETER (MAXCOLS=50, MAXLINS=399, MAXGEN=10)
      CHARACTER*60 PATH, FILE
C--------------------------------------------------------------------
C PATH-name setting on the next line should be replaced by actual one
      PARAMETER (PATH='/home/SHARE/data/IGRFCOEF/igrf00.coef')
C--------------------------------------------------------------------
      CHARACTER*460 LINE
      DIMENSION YRM(MAXCOLS)
      DIMENSION CB(399), CV(399), GH(20,20), GHT(20,20), FM(6)
C
      IF(NGEN.LT.1.OR.NGEN.GT.MAXGEN) THEN
        WRITE(6,'(A,I3)') '*** ERR ***  UNKNOWN  NGEN =', NGEN
        STOP 9
      ENDIF
      FILE = PATH
      I = INDEX(FILE, '00')
      IF(I.EQ.0) STOP 90
      WRITE(FILE(I:I+1),'(I2.2)') NGEN
      OPEN(73,FILE=FILE,STATUS='OLD')
      READ(73,*) MAX, NCOLS, Y1, Y2
      IF(MAX.LT.8.OR.MAX.GT.19) STOP 91
      IF(NCOLS.LT.2.OR.NCOLS.GT.MAXCOLS) STOP 92
      NLINS = (MAX+1)*(MAX+1) - 1
      IF(YEAR.LT.Y1.OR.YEAR.GT.Y2) WRITE(6,'(A,I2.2,A,F8.3)')
     *     '*** WRN ***  IGRF-', NGEN, ' NOT DEFINED FOR  ', YEAR
      READ(73,'(1X,A)') LINE
      READ(LINE,*) N, M, (YRM(I),I=1,NCOLS-1)
      DO 6 K=2,NCOLS-1
        IF(YEAR.LT.YRM(K)) GO TO 7
    6 CONTINUE
      K = NCOLS
      DY = 0.
      GO TO 8
    7 DY = YRM(K) - YRM(K-1)
    8 TZERO = YRM(K-1)
      DO 80 L=1,NLINS
        READ(73,'(1X,A)') LINE
        READ(LINE,*) (DMY,I=1,K), CB(L), CV(L)
   80 CONTINUE
      CLOSE(73)
      IF(DY.NE.0.) THEN
        DO 81 L=1,NLINS
          CV(L) = (CV(L) - CB(L)) / DY
   81   CONTINUE
      ENDIF
      L = 0
      DO 82 N=2,MAX+1
      L = L + 1
      GH(N,1) = CB(L)
      GHT(N,1) = CV(L)
      DO 82 M=2,N
      L = L + 1
      GH(N,M) = CB(L)
      GHT(N,M) = CV(L)
      L = L + 1
      GH(M-1,N) = CB(L)
      GHT(M-1,N) = CV(L)
   82 CONTINUE
      CALL FIELD(6378.137, 298.25722, 6371.2, MAX)
      CALL TCOEF(GH, GHT, TZERO, 0, DMY)
      CALL TYEAR(YEAR)
      RETURN
C---
      ENTRY IGRFC(FIDO, FKEIDO, HGHT, F)
      CALL MFLDG(FIDO, FKEIDO, HGHT/1000., X, Y, Z, F)
      RETURN
C---
      ENTRY IGRFM(FM)
      CALL GCOMP(X, Y, Z)
      PAI = 3.14159 / 180.
      FM(1) = X
      FM(2) = Y
      FM(3) = Z
      FM(4) = SQRT(X*X + Y*Y)
      FM(5) = ATAN2(Z, FM(4)) / PAI
      FM(6) = ATAN2(Y, X) / PAI
      RETURN
      END
C*********************************************************************
C***             S U B R O U T I N E       S I G R F              ****
C*********************************************************************
      SUBROUTINE SIGRF(YEAR)
      DIMENSION DF(120,10), RF(120,7), SV(80,7),
     *          GH(20,20), GHT(20,20)
      DATA (RF(I,1),I=1,120) / -30339., -2123.,  5758.,
     *     -1654.,  2994., -2006.,  1567.,   130.,  1297., -2036.,
     *    -403.,1289., 242., 843.,-176., 958., 805., 149., 492.,-280.,
     *    -392.,   8., 256.,-265.,-223., 357.,  16., 246., 125., -26.,
     *    -123.,-161.,-107., -51.,  77.,  47.,  60., -14.,   4., 106.,
     *    -229.,  68.,   3., -32.,  -4., -10.,-112., -13.,  71., -54.,
     *     -57.,   0., -27.,  12.,  -8., -25.,   9.,  -9.,  23.,  13.,
     *     -19.,  -2., -17.,  10.,   9.,   3.,  -3., -13., -12.,   5.,
     *      -4., -17.,   7.,   4.,  -5.,  22.,  12.,  -3.,   6., -16.,
     *       40*0./
      DATA (RF(I,2),I=1,120) / -30186., -2036.,  5735.,
     *     -1898.,  2997., -2124.,  1551.,   -37.,  1299., -2144.,
     *    -361.,1296., 249., 805.,-253., 951., 807., 148., 462.,-264.,
     *    -393.,  37., 235.,-307.,-204., 368.,  39., 275., 142., -20.,
     *    -147.,-161., -99., -38.,  74.,  46.,  57., -23.,  15., 102.,
     *    -210.,  88.,  -1., -43.,  -8.,  -9.,-114.,  -4.,  66., -57.,
     *     -68.,  -7., -24.,   7.,  -4., -22.,  11.,  -9.,  27.,  11.,
     *     -17.,  -8., -14.,  11.,  13.,   4.,   3., -15., -12.,   2.,
     *      -4., -19.,   6.,   1.,  -2.,  18.,   9.,  -6.,   1., -19.,
     *       40*0./
      DATA (RF(I,3),I=1,120) / -29988., -1957.,  5606.,
     *     -1997.,  3028., -2129.,  1662.,  -199.,  1279., -2181.,
     *    -335.,1251., 271., 833.,-252., 938., 783., 212., 398.,-257.,
     *    -419.,  53., 199.,-298.,-219., 357.,  46., 261., 149., -74.,
     *    -150.,-162., -78., -48.,  92.,  49.,  65., -15.,  42.,  93.,
     *    -192.,  71.,   4., -43.,  14.,  -2.,-108.,  17.,  70., -59.,
     *     -83.,   2., -28.,  20.,  -5., -13.,  16.,   1.,  18.,  11.,
     *     -23.,  -2., -10.,  20.,   7.,   7.,   1., -18., -11.,   4.,
     *      -7., -22.,   4.,   9.,   3.,  16.,   7., -13.,  -1., -15.,
     *       6.,  11., -21.,   2.,  16., -12.,   9.,   9.,  -5.,  -3.,
     *      -7.,  -1.,   9.,   7.,  10.,   1.,  -6.,  -5.,   2.,  -3.,
     *      -4.,   1.,   2.,   1.,  -5.,   2.,  -2.,   5.,   5.,  -4.,
     *       3.,  -1.,   1.,  -2.,   2.,   4.,   3.,  -1.,   0.,  -6./
      DATA (RF(I,4),I=1,120) / -29877., -1903.,  5497.,
     *     -2073.,  3045., -2191.,  1691.,  -309.,  1300., -2208.,
     *    -312.,1244., 284., 835.,-296., 937., 780., 233., 363.,-250.,
     *    -426.,  68., 169.,-298.,-215., 356.,  47., 253., 148., -94.,
     *    -155.,-161., -75., -48.,  95.,  52.,  65., -16.,  50.,  90.,
     *    -186.,  69.,   4., -50.,  17.,  -4.,-102.,  20.,  75., -61.,
     *     -82.,   2., -26.,  24.,  -1.,  -6.,  23.,   4.,  17.,   9.,
     *     -21.,   0.,  -6.,  21.,   6.,   7.,   0., -21., -11.,   5.,
     *      -9., -25.,   2.,  11.,   4.,  12.,   4., -16.,  -6., -10.,
     *       5.,  10., -21.,   1.,  16., -12.,   9.,   9.,  -5.,  -3.,
     *      -6.,  -1.,   9.,   7.,  10.,   2.,  -6.,  -5.,   2.,  -4.,
     *      -4.,   1.,   2.,   0.,  -5.,   3.,  -2.,   6.,   5.,  -4.,
     *       3.,   0.,   1.,  -1.,   2.,   4.,   3.,   0.,   0.,  -6./
      DATA (RF(I,5),I=1,120) / -29775., -1851.,  5411.,
     *     -2136.,  3058., -2278.,  1693.,  -380.,  1315., -2240.,
     *    -287.,1246., 293., 807.,-348., 939., 782., 248., 324.,-240.,
     *    -423.,  87., 142.,-299.,-211., 353.,  47., 244., 153.,-111.,
     *    -154.,-166., -69., -37.,  98.,  61.,  64., -16.,  60.,  83.,
     *    -178.,  68.,   2., -52.,  17.,   2., -96.,  27.,  77., -64.,
     *     -81.,   4., -27.,  28.,   1.,   1.,  20.,   6.,  16.,  10.,
     *     -23.,   0.,  -5.,  22.,   5.,  10.,  -1., -20., -11.,   7.,
     *     -12., -22.,   4.,  12.,   4.,  11.,   3., -16.,  -6., -11.,
     *       4.,  10., -21.,   1.,  15., -12.,  10.,   9.,  -6.,  -4.,
     *      -6.,  -1.,   9.,   7.,   9.,   2.,  -7.,  -6.,   2.,  -4.,
     *      -4.,   1.,   2.,   0.,  -5.,   3.,  -2.,   6.,   4.,  -4.,
     *       3.,   0.,   1.,  -1.,   2.,   4.,   3.,   0.,   0.,  -6./
      DATA (RF(I,6),I=1,120) / -29682., -1789.,  5318.,
     *     -2197.,  3074., -2356.,  1685.,  -425.,  1329., -2268.,
     *    -263.,1249., 302., 769.,-406., 941., 782., 262., 291.,-232.,
     *    -421.,  98., 116.,-301.,-210., 352.,  44., 237., 157.,-122.,
     *    -152.,-167., -64., -26.,  99.,  66.,  64., -16.,  65.,  77.,
     *    -172.,  67.,   2., -57.,  17.,   4., -94.,  28.,  78., -67.,
     *     -77.,   1., -25.,  29.,   3.,   4.,  22.,   8.,  16.,  10.,
     *     -23.,  -2.,  -3.,  24.,   4.,  12.,  -1., -20.,  -9.,   7.,
     *     -14., -21.,   4.,  12.,   5.,  10.,   0., -17.,  -7., -10.,
     *       4.,   9., -19.,   1.,  15., -12.,  11.,   9.,  -7.,  -4.,
     *      -7.,  -2.,   9.,   7.,   7.,   0.,  -8.,  -6.,   1.,  -3.,
     *      -4.,   2.,   2.,   1.,  -5.,   3.,  -2.,   6.,   4.,  -4.,
     *       3.,   0.,   1.,  -2.,   3.,   3.,   3.,  -1.,   0.,  -6./
      DATA (RF(I,7),I=1,120) / -29615., -1728.,  5186.,
     *     -2267.,  3072., -2478.,  1672.,  -458.,  1341., -2290.,
     *    -227.,1253., 296., 715.,-492., 935., 787., 272., 251.,-232.,
     *    -405., 119., 110.,-304.,-217., 351.,  44., 222., 172.,-131.,
     *    -134.,-169., -40., -12., 107.,  72.,  68., -17.,  74.,  64.,
     *    -161.,  65.,  -5., -61.,  17.,   1., -91.,  44.,  79., -74.,
     *     -65.,   0., -24.,  33.,   6.,   9.,  24.,   7.,  15.,   8.,
     *     -25.,  -2.,  -6.,  25.,   6.,  12.,  -9., -22.,  -8.,   8.,
     *     -17., -21.,   9.,  15.,   7.,   9.,  -8., -16.,  -7.,  -3.,
     *       5.,   9., -20.,   3.,  13.,  -8.,  12.,   6.,  -6.,  -9.,
     *      -8.,  -2.,   9.,   9.,   4.,  -4.,  -8.,  -8.,   5.,  -2.,
     *      -6.,   1.,   2.,   0.,  -3.,   4.,   0.,   5.,   4.,  -6.,
     *       1.,  -1.,   2.,  -3.,   4.,   0.,   0.,  -2.,  -1.,  -8./
      DATA (SV(I,1),I=1,80) /
     *     15.3,  8.7, -2.3,-24.4,  0.3,-11.8, -1.6,-16.7,  0.2,-10.8,
     *      4.2,  0.7,  0.7, -3.8, -7.7, -0.7,  0.2, -0.1, -3.0,  1.6,
     *     -0.1,  2.9, -2.1, -4.2,  1.9,  1.1,  2.3,  2.9,  1.7,  0.6,
     *     -2.4,  0.0,  0.8,  1.3, -0.3, -0.1, -0.3, -0.9,  1.1, -0.4,
     *      1.9,  2.0, -0.4, -1.1, -0.4,  0.1, -0.2,  0.9, -0.5, -0.3,
     *     -1.1, -0.7,  0.3, -0.5,  0.4,  0.3,  0.2,  0.0,  0.4, -0.2,
     *      0.2, -0.6,  0.3,  0.1,  0.4,  0.1,  0.6, -0.2,  0.0, -0.3,
     *      0.0, -0.2, -0.1, -0.3,  0.3, -0.4, -0.3, -0.3, -0.5, -0.3/
      DATA (SV(I,2),I=1,80) /
     *     25.6, 10.0,-10.2,-24.9,  0.7, -3.0,  4.3,-18.9, -3.8,-10.4,
     *      6.9, -4.1,  2.5, -4.2, -5.0, -0.2, -2.0,  5.0, -3.9,  0.8,
     *     -2.1,  1.7, -3.1, -1.0,  0.3, -0.7,  1.2,  1.1,  2.3, -1.6,
     *     -2.0, -0.5,  1.3,  1.0,  1.1,  0.2,  0.5, -0.5,  2.0, -0.1,
     *      2.8, -0.2,  0.0, -1.3,  0.9,  0.7, -0.1,  1.7,  0.0,  0.0,
     *     -1.4,  0.0, -0.1,  0.6,  0.3,  0.9,  0.3,  0.3, -0.7,  0.3,
     *      0.1, -0.5,  0.8,  0.2,  0.3, -0.2,  0.0, -0.4,  0.2, -0.2,
     *     -0.4, -0.3, -0.3,  0.4,  0.6, -0.3, -0.3, -0.6, -0.1,  0.3/
      DATA (SV(I,3),I=1,80) /
     *     22.4, 11.3,-15.9,-18.3,  3.2,-12.7,  7.0,-25.2,  0.0, -6.5,
     *      0.2, -0.7,  2.7,  1.0, -7.9, -1.4, -1.4,  4.6, -8.2,  1.6,
     *     -1.8,  2.9, -5.0,  0.4,  1.5,  0.4,  1.8, -0.8, -0.4, -3.3,
     *      0.0,  0.2,  1.3,  1.4,  2.1,  0.4,  0.0, -0.5,  3.4, -1.4,
     *      0.8,  0.0,  0.8, -1.6,  0.3,  0.5, -0.1,  0.0, -1.0, -0.8,
     *     -0.4,  0.4,  0.4,  0.5,  0.2,  1.6,  1.4,  0.1, -0.5,  0.1,
     *     -0.1,  0.0,  1.1,  0.8, -0.2, -0.1, -0.3, -0.7,  0.3,  0.0,
     *     -0.8, -0.8, -0.2,  0.2,  0.7,  0.2, -0.3, -1.1,  1.2,  0.8/
      DATA (SV(I,4),I=1,80) /
     *     23.2, 10.0,-24.5,-13.7,  3.4,-11.5,  7.0,-20.2,  5.1, -4.6,
     *      5.3, -0.6,  2.3,  0.1,-10.8,  0.1, -0.6,  3.8, -7.8,  2.2,
     *     -1.4,  2.5, -6.8,  0.9,  1.3,  0.1,  0.1, -1.5, -0.2, -3.2,
     *     -0.1,  0.1,  0.6, -0.1,  0.0,  1.4, -0.3, -0.4,  1.7, -1.1,
     *      0.6, -0.8,  0.0, -2.3,  0.9, -0.5,  1.2, -0.1,  0.2, -0.6,
     *      0.2, -0.5,  1.0,  0.8,  1.1,  1.0,  1.9,  0.4,  0.3, -0.5,
     *      0.2, -0.1,  0.9,  0.7,  0.0,  0.1,  0.3, -1.0,  0.4,  0.1,
     *     -0.3, -0.8, -0.3,  0.2,  0.1, -0.8, -0.5, -0.1, -0.8,  1.3/
      DATA (SV(I,5),I=1,80) /
     *     18.0, 10.6,-16.1,-12.9,  2.4,-15.8,  0.0,-13.8,  3.3, -6.7,
     *      4.4,  0.1,  1.6, -5.9,-10.6,  0.5,  0.6,  2.6, -7.0,  1.8,
     *      0.5,  3.1, -5.5, -1.4,  0.6, -0.1, -0.1, -1.6,  0.5, -3.1,
     *      0.4, -0.1,  1.7,  2.3,  0.4,  1.3, -0.2,  0.2,  1.8, -1.3,
     *      1.3,  0.0, -0.2, -0.9,  0.1,  0.5,  1.2,  1.2,  0.6, -0.5,
     *      0.6, -0.3,  0.2,  0.6,  0.8,  1.6, -0.5,  0.2, -0.2,  0.2,
     *      0.0,  0.3,  0.0,  0.2, -0.7,  0.5, -0.2, -0.2,  0.1,  0.3,
     *     -1.1,  0.3,  0.0,  0.4, -0.1, -0.5, -0.5, -0.3, -0.6,  0.6/
      DATA (SV(I,6),I=1,80) /
     *     17.6, 13.0,-18.3,-13.2,  3.7,-15.0, -0.8, -8.8,  1.5, -6.4,
     *      4.1, -0.2,  2.2, -8.1,-12.1,  0.8,  0.9,  1.8, -6.9,  1.2,
     *      0.5,  2.7, -4.6, -1.0,  0.8,  0.1,  0.2, -1.5,  1.2, -2.0,
     *      0.3, -0.1,  1.8,  2.3,  0.9,  0.5, -0.4,  0.3,  0.6, -1.6,
     *      1.9, -0.2, -0.2, -0.9, -0.2,  1.0,  0.0,  2.2, -0.2, -0.8,
     *      0.8, -0.6,  0.2,  0.6,  0.6,  1.2, -0.4,  0.1,  0.0,  0.2,
     *     -0.3, -0.6,  0.0,  0.3, -0.2,  0.4,  0.1, -0.2,  0.4,  0.2,
     *     -1.1,  0.7,  0.3,  0.0,  0.2, -1.2, -0.9, -0.7, -0.3, -0.6/
      DATA (SV(I,7),I=1,80) /
     *     14.6, 10.7,-22.5,-12.4,  1.1,-20.6, -1.1, -9.6,  0.7, -5.4,
     *      6.0,  0.9, -0.1, -7.7,-14.2, -1.3,  1.6,  2.1, -7.3,  1.3,
     *      2.9,  5.0, -3.2,  0.3,  0.0, -0.7, -0.1, -2.1,  0.6, -2.8,
     *      1.7, -0.8,  1.9,  2.5,  0.1,  1.0, -0.4, -0.2,  0.9, -1.4,
     *      2.0,  0.0, -0.6, -0.8, -0.3,  0.0,  1.2,  0.9, -0.4, -0.4,
     *      1.1, -0.3,  0.0,  1.1,  0.3,  1.1, -0.1, -0.2, -0.6,  0.6,
     *     -0.7, -0.9,  0.2, -0.3,  0.2,  0.1, -0.3,  0.0,  0.4,  0.0,
     *     -1.0,  0.3,  0.3,  0.6, -0.5, -0.4, -0.7,  0.3, -0.4,  0.7/
      DATA (DF(I,1),I=1,120) / -30594., -2285.,  5810.,
     *     -1244.,  2990., -1702.,  1578.,   477.,  1282., -1834.,
     *    -499.,1255., 186., 913., -11., 944., 776., 144., 544.,-276.,
     *    -421., -55., 304.,-178.,-253., 346., -12., 194.,  95., -20.,
     *     -67.,-142.,-119., -82.,  82.,  59.,  57.,   6.,   6., 100.,
     *    -246.,  16., -25.,  -9.,  21., -16.,-104., -39.,  70., -40.,
     *     -45.,   0., -18.,   0.,   2., -29.,   6., -10.,  28.,  15.,
     *     -17.,  29., -22.,  13.,   7.,  12.,  -8., -21.,  -5., -12.,
     *       9.,  -7.,   7.,   2., -10.,  18.,   7.,   3.,   2., -11.,
     *       5., -21., -27.,   1.,  17., -11.,  29.,   3.,  -9.,  16.,
     *       4.,  -3.,   9.,  -4.,   6.,  -3.,   1.,  -4.,   8.,  -3.,
     *      11.,   5.,   1.,   1.,   2., -20.,  -5.,  -1.,  -1.,  -6.,
     *       8.,   6.,  -1.,  -4.,  -3.,  -2.,   5.,   0.,  -2.,  -2./
      DATA (DF(I,2),I=1,120) / -30554., -2250.,  5815.,
     *     -1341.,  2998., -1810.,  1576.,   381.,  1297., -1889.,
     *    -476.,1274., 206., 896., -46., 954., 792., 136., 528.,-278.,
     *    -408., -37., 303.,-210.,-240., 349.,   3., 211., 103., -20.,
     *     -87.,-147.,-122., -76.,  80.,  54.,  57.,  -1.,   4.,  99.,
     *    -247.,  33., -16., -12.,  12., -12.,-105., -30.,  65., -55.,
     *     -35.,   2., -17.,   1.,   0., -40.,  10.,  -7.,  36.,   5.,
     *     -18.,  19., -16.,  22.,  15.,   5.,  -4., -22.,  -1.,   0.,
     *      11., -21.,  15.,  -8., -13.,  17.,   5.,  -4.,  -1., -17.,
     *       3.,  -7., -24.,  -1.,  19., -25.,  12.,  10.,   2.,   5.,
     *       2.,  -5.,   8.,  -2.,   8.,   3., -11.,   8.,  -7.,  -8.,
     *       4.,  13.,  -1.,  -2.,  13., -10.,  -4.,   2.,   4.,  -3.,
     *      12.,   6.,   3.,  -3.,   2.,   6.,  10.,  11.,   3.,   8./
      DATA (DF(I,3),I=1,120) / -30500., -2215.,  5820.,
     *     -1440.,  3003., -1898.,  1581.,   291.,  1302., -1944.,
     *    -462.,1288., 216., 882., -83., 958., 796., 133., 510.,-274.,
     *    -397., -23., 290.,-230.,-229., 360.,  15., 230., 110., -23.,
     *     -98.,-152.,-121., -69.,  78.,  47.,  57.,  -9.,   3.,  96.,
     *    -247.,  48.,  -8., -16.,   7., -12.,-107., -24.,  65., -56.,
     *     -50.,   2., -24.,  10.,  -4., -32.,   8., -11.,  28.,   9.,
     *     -20.,  18., -18.,  11.,   9.,  10.,  -6., -15., -14.,   5.,
     *       6., -23.,  10.,   3.,  -7.,  23.,   6.,  -4.,   9., -13.,
     *       4.,   9., -11.,  -4.,  12.,  -5.,   7.,   2.,   6.,   4.,
     *      -2.,   1.,  10.,   2.,   7.,   2.,  -6.,   5.,   5.,  -3.,
     *      -5.,  -4.,  -1.,   0.,   2.,  -8.,  -3.,  -2.,   7.,  -4.,
     *       4.,   1.,  -2.,  -3.,   6.,   7.,  -2.,  -1.,   0.,  -3./
      DATA (DF(I,4),I=1,120) / -30421., -2169.,  5791.,
     *     -1555.,  3002., -1967.,  1590.,   206.,  1302., -1992.,
     *    -414.,1289., 224., 878.,-130., 957., 800., 135., 504.,-278.,
     *    -394.,   3., 269.,-255.,-222., 362.,  16., 242., 125., -26.,
     *    -117.,-156.,-114., -63.,  81.,  46.,  58., -10.,   1.,  99.,
     *    -237.,  60.,  -1., -20.,  -2., -11.,-113., -17.,  67., -56.,
     *     -55.,   5., -28.,  15.,  -6., -32.,   7.,  -7.,  23.,  17.,
     *     -18.,   8., -17.,  15.,   6.,  11.,  -4., -14., -11.,   7.,
     *       2., -18.,  10.,   4.,  -5.,  23.,  10.,   1.,   8., -20.,
     *       4.,   6., -18.,   0.,  12.,  -9.,   2.,   1.,   0.,   4.,
     *      -3.,  -1.,   9.,  -2.,   8.,   3.,   0.,  -1.,   5.,   1.,
     *      -3.,   4.,   4.,   1.,   0.,   0.,  -1.,   2.,   4.,  -5.,
     *       6.,   1.,   1.,  -1.,  -1.,   6.,   2.,   0.,   0.,  -7./
      DATA (DF(I,5),I=1,120) / -30334., -2119.,  5776.,
     *     -1662.,  2997., -2016.,  1594.,   114.,  1297., -2038.,
     *    -404.,1292., 240., 856.,-165., 957., 804., 148., 479.,-269.,
     *    -390.,  13., 252.,-269.,-219., 358.,  19., 254., 128., -31.,
     *    -126.,-157., -97., -62.,  81.,  45.,  61., -11.,   8., 100.,
     *    -228.,  68.,   4., -32.,   1.,  -8.,-111.,  -7.,  75., -57.,
     *     -61.,   4., -27.,  13.,  -2., -26.,   6.,  -6.,  26.,  13.,
     *     -23.,   1., -12.,  13.,   5.,   7.,  -4., -12., -14.,   9.,
     *       0., -16.,   8.,   4.,  -1.,  24.,  11.,  -3.,   4., -17.,
     *       8.,  10., -22.,   2.,  15., -13.,   7.,  10.,  -4.,  -1.,
     *      -5.,  -1.,  10.,   5.,  10.,   1.,  -4.,  -2.,   1.,  -2.,
     *      -3.,   2.,   2.,   1.,  -5.,   2.,  -2.,   6.,   4.,  -4.,
     *       4.,   0.,   0.,  -2.,   2.,   3.,   2.,   0.,   0.,  -6./
      DATA (DF(I,6),I=1,120) / -30220., -2068.,  5737.,
     *     -1781.,  3000., -2047.,  1611.,    25.,  1287., -2091.,
     *    -366.,1278., 251., 838.,-196., 952., 800., 167., 461.,-266.,
     *    -395.,  26., 234.,-279.,-216., 359.,  26., 262., 139., -42.,
     *    -139.,-160., -91., -56.,  83.,  43.,  64., -12.,  15., 100.,
     *    -212.,  72.,   2., -37.,   3.,  -6.,-112.,   1.,  72., -57.,
     *     -70.,   1., -27.,  14.,  -4., -22.,   8.,  -2.,  23.,  13.,
     *     -23.,  -2., -11.,  14.,   6.,   7.,  -2., -15., -13.,   6.,
     *      -3., -17.,   5.,   6.,   0.,  21.,  11.,  -6.,   3., -16.,
     *       8.,  10., -21.,   2.,  16., -12.,   6.,  10.,  -4.,  -1.,
     *      -5.,   0.,  10.,   3.,  11.,   1.,  -2.,  -1.,   1.,  -3.,
     *      -3.,   1.,   2.,   1.,  -5.,   3.,  -1.,   4.,   6.,  -4.,
     *       4.,   0.,   1.,  -1.,   0.,   3.,   3.,   1.,  -1.,  -4./
      DATA (DF(I,7),I=1,120) / -30100., -2013.,  5675.,
     *     -1902.,  3010., -2067.,  1632.,   -68.,  1276., -2144.,
     *    -333.,1260., 262., 830.,-223., 946., 791., 191., 438.,-265.,
     *    -405.,  39., 216.,-288.,-218., 356.,  31., 264., 148., -59.,
     *    -152.,-159., -83., -49.,  88.,  45.,  66., -13.,  28.,  99.,
     *    -198.,  75.,   1., -41.,   6.,  -4.,-111.,  11.,  71., -56.,
     *     -77.,   1., -26.,  16.,  -5., -14.,  10.,   0.,  22.,  12.,
     *     -23.,  -5., -12.,  14.,   6.,   6.,  -1., -16., -12.,   4.,
     *      -8., -19.,   4.,   6.,   0.,  18.,  10., -10.,   1., -17.,
     *       7.,  10., -21.,   2.,  16., -12.,   7.,  10.,  -4.,  -1.,
     *      -5.,  -1.,  10.,   4.,  11.,   1.,  -3.,  -2.,   1.,  -3.,
     *      -3.,   1.,   2.,   1.,  -5.,   3.,  -2.,   4.,   5.,  -4.,
     *       4.,  -1.,   1.,  -1.,   0.,   3.,   3.,   1.,  -1.,  -5./
      DATA (DF(I,8),I=1,120) / -29992., -1956.,  5604.,
     *     -1997.,  3027., -2129.,  1663.,  -200.,  1281., -2180.,
     *    -336.,1251., 271., 833.,-252., 938., 782., 212., 398.,-257.,
     *    -419.,  53., 199.,-297.,-218., 357.,  46., 261., 150., -74.,
     *    -151.,-162., -78., -48.,  92.,  48.,  66., -15.,  42.,  93.,
     *    -192.,  71.,   4., -43.,  14.,  -2.,-108.,  17.,  72., -59.,
     *     -82.,   2., -27.,  21.,  -5., -12.,  16.,   1.,  18.,  11.,
     *     -23.,  -2., -10.,  18.,   6.,   7.,   0., -18., -11.,   4.,
     *      -7., -22.,   4.,   9.,   3.,  16.,   6., -13.,  -1., -15.,
     *       5.,  10., -21.,   1.,  16., -12.,   9.,   9.,  -5.,  -3.,
     *      -6.,  -1.,   9.,   7.,  10.,   2.,  -6.,  -5.,   2.,  -4.,
     *      -4.,   1.,   2.,   0.,  -5.,   3.,  -2.,   6.,   5.,  -4.,
     *       3.,   0.,   1.,  -1.,   2.,   4.,   3.,   0.,   0.,  -6./
      DATA (DF(I,9),I=1,120) / -29873., -1905.,  5500.,
     *     -2072.,  3044., -2197.,  1687.,  -306.,  1296., -2208.,
     *    -310.,1247., 284., 829.,-297., 936., 780., 232., 361.,-249.,
     *    -424.,  69., 170.,-297.,-214., 355.,  47., 253., 150., -93.,
     *    -154.,-164., -75., -46.,  95.,  53.,  65., -16.,  51.,  88.,
     *    -185.,  69.,   4., -48.,  16.,  -1.,-102.,  21.,  74., -62.,
     *     -83.,   3., -27.,  24.,  -2.,  -6.,  20.,   4.,  17.,  10.,
     *     -23.,   0.,  -7.,  21.,   6.,   8.,   0., -19., -11.,   5.,
     *      -9., -23.,   4.,  11.,   4.,  14.,   4., -15.,  -4., -11.,
     *       5.,  10., -21.,   1.,  15., -12.,   9.,   9.,  -6.,  -3.,
     *      -6.,  -1.,   9.,   7.,   9.,   1.,  -7.,  -5.,   2.,  -4.,
     *      -4.,   1.,   3.,   0.,  -5.,   3.,  -2.,   6.,   5.,  -4.,
     *       3.,   0.,   1.,  -1.,   2.,   4.,   3.,   0.,   0.,  -6./
      DATA (DF(I,10),I=1,120) / -29775., -1848.,  5406.,
     *     -2131.,  3059., -2279.,  1686.,  -373.,  1314., -2239.,
     *    -284.,1248., 293., 802.,-352., 939., 780., 247., 325.,-240.,
     *    -423.,  84., 141.,-299.,-214., 353.,  46., 245., 154.,-109.,
     *    -153.,-165., -69., -36.,  97.,  61.,  65., -16.,  59.,  82.,
     *    -178.,  69.,   3., -52.,  18.,   1., -96.,  24.,  77., -64.,
     *     -80.,   2., -26.,  26.,   0.,  -1.,  21.,   5.,  17.,   9.,
     *     -23.,   0.,  -4.,  23.,   5.,  10.,  -1., -19., -10.,   6.,
     *     -12., -22.,   3.,  12.,   4.,  12.,   2., -16.,  -6., -10.,
     *       4.,   9., -20.,   1.,  15., -12.,  11.,   9.,  -7.,  -4.,
     *      -7.,  -2.,   9.,   7.,   8.,   1.,  -7.,  -6.,   2.,  -3.,
     *      -4.,   2.,   2.,   1.,  -5.,   3.,  -2.,   6.,   4.,  -4.,
     *       3.,   0.,   1.,  -2.,   3.,   3.,   3.,  -1.,   0.,  -6./
C
      L = IFIX(YEAR - 1965.) / 5
      IF(L.LT.1) L = 1
      IF(L.GT.7) L = 7
      MAX = 10
      IF(L.LE.2) MAX = 8
      IF(YEAR.LT.1955..OR.YEAR.GT.2005.) WRITE(6,'(A,F8.3)')
     *     '*** WRN ***  IGRF NOT DEFINED FOR  ', YEAR
      I = 0
      DO 1 N=2,9
      I = I + 1
      GH(N,1) = RF(I,L)
      GHT(N,1) = SV(I,L)
      DO 1 M=2,N
      I = I + 1
      GH(N,M) = RF(I,L)
      GHT(N,M) = SV(I,L)
      I = I + 1
      GH(M-1,N) = RF(I,L)
      GHT(M-1,N) = SV(I,L)
    1 CONTINUE
      DO 2 N=10,11
      I = I + 1
      GH(N,1) = RF(I,L)
      GHT(N,1) = 0.
      DO 2 M=2,N
      I = I + 1
      GH(N,M) = RF(I,L)
      GHT(N,M) = 0.
      I = I + 1
      GH(M-1,N) = RF(I,L)
      GHT(M-1,N) = 0.
    2 CONTINUE
      TZERO = FLOAT(L*5 + 1965)
      IF(L.EQ.1) TZERO = 1965.
      GO TO 5
C---
      ENTRY SDGRF(YEAR)
      L = IFIX(YEAR - 1940.) / 5
      IF(L.LT.1) L = 1
      IF(L.GT.(MXDG-1)) L = MXDG-1
      MAX = 10
      IF(YEAR.LT.1945..OR.YEAR.GT.1990.) WRITE(6,'(A,F8.3)')
     *     '*** WRN ***  DGRF NOT DEFINED FOR  ', YEAR
      I = 0
      DO 3 N=2,11
      I = I + 1
      GH(N,1) = DF(I,L)
      GHT(N,1) = (DF(I,L+1) - DF(I,L)) / 5.
      DO 3 M=2,N
      I = I + 1
      GH(N,M) = DF(I,L)
      GHT(N,M) = (DF(I,L+1) - DF(I,L)) / 5.
      I = I + 1
      GH(M-1,N) = DF(I,L)
      GHT(M-1,N) = (DF(I,L+1) - DF(I,L)) / 5.
    3 CONTINUE
      TZERO = FLOAT(L*5 + 1940)
      GO TO 5
C---
      ENTRY SPGRF(YEAR)
      L = IFIX(YEAR - 1940.) / 5
      IF(L.LT.7) L = 7
      IF(L.GT.10) L = 10
      MAX = 10
      IF(YEAR.LT.1975..OR.YEAR.GT.1995.) WRITE(6,'(A,F8.3)')
     *     '*** WRN ***  PGRF NOT DEFINED FOR  ', YEAR
      I = 0
      DO 4 N=2,11
      I = I + 1
      GH(N,1) = DF(I,L)
      GHT(N,1) = (RF(I,L-4) - DF(I,L)) / 5.
      DO 4 M=2,N
      I = I + 1
      GH(N,M) = DF(I,L)
      GHT(N,M) = (RF(I,L-4) - DF(I,L)) / 5.
      I = I + 1
      GH(M-1,N) = DF(I,L)
      GHT(M-1,N) = (RF(I,L-4) - DF(I,L)) / 5.
    4 CONTINUE
      TZERO = FLOAT(L*5 + 1940)
      GO TO 5
C
    5 CALL FIELD(6378.16, 298.25, 6371.2, MAX)
      CALL TCOEF(GH, GHT, TZERO, 0, DUMMY)
      CALL TYEAR(YEAR)
      RETURN
      END
C*********************************************************************
C***             S U B R O U T I N E       F I E L D              ****
C*********************************************************************
      SUBROUTINE FIELD(ARE, AFLAT, ARA, MAXA)
      IMPLICIT REAL*8 (C-H,O-Z)
      SAVE
      DIMENSION AGH(20,20), AGHT(20,20), AEXT(3)
      DIMENSION GH(20,20), GHT(20,20), EXT(3), G(20,20)
      DIMENSION RAR(20), CSP(20), SNP(20), P(20,21)
C
      RA = ARA
      MAX = MAXA
      MAX1 = MAX + 1
      RPRE = 1.D0 - 1.D0/AFLAT
      RE = ARE
      RP = RE * RPRE
      RE2 = RE * RE
      RE4 = RE2 * RE2
      RP2 = RP * RP
      RP4 = RP2 * RP2
      KG = 2
      KGC = 0
      KPH = 1
      PAI = 3.1415926535898D0 / 180.D0
      RETURN
C---
      ENTRY TCOEF(AGH, AGHT, ATZERO, KEXTA, AEXT)
      TZERO = ATZERO
      KEXT = KEXTA
      GH(1,1) = 0.
      GHT(1,1) = 0.
      DO 110 NN=2,MAX1
      GH(NN,1) = AGH(NN,1)
      GHT(NN,1) = AGHT(NN,1)
      FAC = DSQRT(2.D0)
      DO 110 MM=2,NN
      FAC = FAC / DSQRT(DFLOAT((NN+MM-2)*(NN-MM+1)))
      GH(NN,MM) = AGH(NN,MM) * FAC
      GHT(NN,MM) = AGHT(NN,MM) * FAC
      GH(MM-1,NN) = AGH(MM-1,NN) * FAC
      GHT(MM-1,NN) = AGHT(MM-1,NN) * FAC
  110 CONTINUE
      IF(KEXT.EQ.0) GO TO 11
      DO 120 N=1,3
      EXT(N) = AEXT(N)
  120 CONTINUE
      GO TO 12
   11 DO 130 N=1,3
      EXT(N) = 0.
  130 CONTINUE
   12 RETURN
C---
      ENTRY TYEAR(AYEAR)
      DYEAR = AYEAR - TZERO
      DO 140 NN=1,MAX1
      DO 140 MM=1,MAX1
      G(NN,MM) = GH(NN,MM) + GHT(NN,MM)*DYEAR
  140 CONTINUE
      RETURN
C---
      ENTRY MFLDG(ALAT, ALON, AHI, AX, AY, AZ, AF)
      IF(KG.EQ.1.AND.BLAT.EQ.ALAT.AND.BHI.EQ.AHI) GO TO 24
      KG = 1
      KR = 1
      KTH = 1
      BLAT = ALAT
      BHI = AHI
      RLAT = ALAT * PAI
      HI = AHI
      SLAT = DSIN(RLAT)
      SLAT2 = SLAT * SLAT
      CLAT2 = 1.D0 - SLAT2
      RM2 = RE2*CLAT2 + RP2*SLAT2
      RM = DSQRT(RM2)
      RRM = (RE4*CLAT2 + RP4*SLAT2) / RM2
      R = DSQRT(RRM + 2.D0*HI*RM + HI*HI)
      CTH = SLAT * (HI + RP2/RM) / R
      STH = DSQRT(1.D0 - CTH*CTH)
      GO TO 24
C---
      ENTRY MFLDC(ATHE, ALON, AR, AX, AY, AZ, AF)
      IF(KG.EQ.0) GO TO 21
      KG = 0
      KR = 1
      KTH = 1
      GO TO 22
   21 IF(BTHE.NE.ATHE) KTH = 1
      IF(BR.NE.AR) KR = 1
   22 IF(KR.EQ.0) GO TO 23
      BR = AR
      R = AR
   23 IF(KTH.EQ.0) GO TO 24
      BTHE = ATHE
      THE = ATHE * PAI
      CTH = DCOS(THE)
      STH = DSQRT(1.D0 - CTH*CTH)
C
   24 IF(BLON.NE.ALON) KPH = 1
      IF(KPH.EQ.0) GO TO 25
      BLON = ALON
      PHI = ALON * PAI
      CPH = DCOS(PHI)
      SPH = DSIN(PHI)
C
   25 IF(KR.EQ.0) GO TO 26
      KR = 0
      T = RA / R
      RAR(1) = T * T
      DO 210 N=1,MAX
      RAR(N+1) = RAR(N) * T
  210 CONTINUE
C
   26 IF(KPH.EQ.0) GO TO 27
      KPH = 0
      CSP(1) = 1.D0
      SNP(1) = 0.
      DO 220 M=1,MAX
      CSP(M+1) = CSP(M)*CPH - SNP(M)*SPH
      SNP(M+1) = SNP(M)*CPH + CSP(M)*SPH
  220 CONTINUE
C
   27 IF(KTH.EQ.0) GO TO 28
      KTH = 0
      P(1,1) = 1.D0
      P(1,2) = 0.
      P(2,1) = CTH
      P(2,2) = STH
      P(1,3) = -STH
      P(2,3) = CTH
      DO 230 N=2,MAX
      P(N+1,1) = (P(N,1)*CTH*(N+N-1) - P(N-1,1)*(N-1)) / N
      P(1,N+2) = (P(N+1,1)*CTH - P(N,1)) * N / STH
      DO 230 M=1,N
      P(N+1,M+1) = (P(N,M)*(N+M-1) - P(N+1,M)*CTH*(N-M+1)) / STH
      P(M+1,N+2) = P(N+1,M)*(N+M)*(N-M+1) - P(N+1,M+1)*CTH*M/STH
  230 CONTINUE
C
   28 X = 0.
      Y = 0.
      Z = 0.
      DO 250 N=1,MAX
      TX = G(N+1,1) * P(1,N+2)
      TY = 0.
      TZ = G(N+1,1) * P(N+1,1)
      DO 240 M=1,N
      TX = TX + (G(N+1,M+1)*CSP(M+1)+G(M,N+1)*SNP(M+1))*P(M+1,N+2)
      TY = TY + (G(N+1,M+1)*SNP(M+1)-G(M,N+1)*CSP(M+1))*P(N+1,M+1)*M
      TZ = TZ + (G(N+1,M+1)*CSP(M+1)+G(M,N+1)*SNP(M+1))*P(N+1,M+1)
  240 CONTINUE
      X = X + RAR(N+1) * TX
      Y = Y + RAR(N+1) * TY
      Z = Z - RAR(N+1) * TZ * (N+1)
  250 CONTINUE
      Y = Y / STH
C
      IF(KEXT.EQ.0) GO TO 29
      TX = EXT(2)*CPH + EXT(3)*SPH
      TY = EXT(2)*SPH - EXT(3)*CPH
      TZ = EXT(1)*STH - TX*CTH
      TX = EXT(1)*CTH + TX*STH
      X = X - TX
      Y = Y + TY
      Z = Z + TZ
C
   29 F = DSQRT(X*X + Y*Y + Z*Z)
      AX = X
      AY = Y
      AZ = Z
      AF = F
      RETURN
C---
      ENTRY GCOMP(AXG, AYG, AZG)
      IF(KG.EQ.1) GO TO 33
      IF(KGC.EQ.0) GO TO 31
      IF(BTHC.EQ.BTHE) GO TO 34
   31 KGC = 1
      BTHC = BTHE
      SLAT = CTH
      CLAT = STH
      IF(CLAT.LT.1.5D-9) GO TO 34
      RC = R * CTH
      RS = R * STH
      REP2 = RE2 - RP2
      TLAT = SLAT / CLAT
      TLAT2 = TLAT * TLAT
      RLAT = DATAN(TLAT)
   32 RLATP = RLAT
      RMC2 = RE2 + RP2*TLAT2
      RMC = DSQRT(RMC2)
      RMC3 = RMC2 * RMC
      FP = RP2*REP2*TLAT/RMC3  + RC/TLAT2
      F = REP2/RMC + RC/TLAT - RS
      TLAT = TLAT + F/FP
      TLAT2 = TLAT * TLAT
      RLAT = DATAN(TLAT)
      D = DABS(RLAT - RLATP)
      IF(D.GT.1.5D-9) GO TO 32
      CLAT2 = 1.D0 / (1.D0 + TLAT2)
      CLAT = DSQRT(CLAT2)
      SLAT = TLAT * CLAT
      GO TO 34
   33 KGC = 0
      CLAT = DSQRT(CLAT2)
   34 CGA = CTH*SLAT + STH*CLAT
      SGA = CTH*CLAT - STH*SLAT
      XG = X*CGA - Z*SGA
      ZG = X*SGA + Z*CGA
      AXG = XG
      AYG = Y
      AZG = ZG
      RETURN
      END
