chp70_95.f 12.7 KB
      subroutine chp70_95 (year,rre,thetr,phir,br,bt,bp,bb,ier)
c*
c***********************************************************************
c*
c*PRO MAGLIB
c*
c*VER 99.03.31 - V 1.0
c*VER 01.06.05 - V 2.0
c*VER 03.01.06 - V 2.1
c*VER 01.01.07 - V 3.0
c*
c*AUT spec. CNES - JC KOSIK - janvier 1991
c*AUT port. CISI
c*
c*ROL Theme : Modeles de champs magnetiques
c*ROL         Calcul du champ magnetique pour la periode
c*ROL         comprise entre 1970 et 1995.
c*
c*PAR year  (I) : annee fractionnaire (entre 1970. et 1995.)
c*
c*PAR rre   (I) : distance radiale geocentrique (rayons terrestres)
c*PAR thetr (I) : colatitude geocentrique (radians)
c*PAR phir  (I) : longitude geocentrique (radians)
c*
c*PAR br    (O) : composante radiale du champ magnetique le long du
c*              : meridien positive vers l'exterieur (gauss)
c*PAR bt    (O) : composante tangentielle du champ magnetique le long
c*PAR           : du meridien positive vers le sud (gauss)
c*PAR bp    (O) : composante azimuthale du champ magnetique, positive
c*PAR           : vers l'est (gauss)
c*
c*PAR bb    (O) : module du champ magnetique (gauss)
c*
c*PAR ier   (O) : code de retour
c*
c*NOT ier       : sans objet
c*
c*NOT common    : util, util2
c*
c*INF utilise   : sans objet
c*
c*HST version 1.0 - 99.03.31 - creation de la maglib au CDPP
c*HST version 2.0 - 01.06.05 - correction de commentaires de code
c*HST version 2.1 - 03.01.06 - corrections en compilation avec g77
c*HST version 3.0 - 01.01.07 - coefficients definitifs du champ 1995
c*HST                        - remplace dgchnew de la version 2.1
c*
c***********************************************************************
c*
      implicit none
c
c     ---------------------------------
c*FON Declaration identificateur rcs_id
c     ---------------------------------
c
      character rcs_id*100
c
c     --------------------------
c*FON Declaration des parametres
c     --------------------------
c
      double precision year
      double precision rre, thetr, phir
      double precision br, bt, bp, bb
      integer ier
c
c     ----------------------------------
c*FON Declaration des variables communes
c     ----------------------------------
c
      double precision pi,dpi,rad,deg,pid,xmu,rayt
c
c*COM pi   : constante pi (obtenue a partir de acos(-1.))
c*COM dpi  : constante 2 * pi
c*COM pid  : constante pi / 2
c*COM rad  : facteur de conversion degres  ----> radians
c*COM deg  : facteur de conversion radians ----> degres
c*COM xmu  : constante de gravitation terrestre (km**3/sec**2)
c*COM rayt : rayon equatorial terrestre (km)
c
      common/util/pi,dpi,rad,deg,pid,xmu,rayt
c
      double precision rgmt
c
c*COM rgmt : rayon geocentrique terrestre (km)
c
      common/util2/rgmt
c
c     ---------------------------------
c*FON Declaration des variables locales
c     ---------------------------------
c
      integer lg(120,6)
c*LOC lg : coefficients entre 1970 et 1995
c
      integer kmax
c*LOC kmax : nombre de pas de calcul (= 11)
c
      integer i,k,l,jj,imin,imax,ntot,nm,inc
c*LOC i,k,l,jj,imin,imax,ntot,nm,inc : indices de boucles et de tableaux
c
      double precision sh(11,11),gg(11,11),hh(11,11)
      double precision g(11,11),h(11,11),fn(11),fm(11)
      double precision cp(11),sp(11),p(11,11),dp(11,11),const(11,11)
      double precision tzero(6)
      double precision tmold, delt, cph, sph, ct, st, rrmag, ar, aor
      double precision temp, par, f1
c
      SAVE
c
c     ---------------------------------
c*FON Affectation identificateur rcs_id
c     ---------------------------------
c
      data rcs_id /"
     >$Id$"/
c
c     --------------------------
c*FON Affectation des constantes
c     --------------------------
c
      data (lg(i,1),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/
c
      data (lg(i,2),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/
c
      data (lg(i,3),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/
c
      data (lg(i,4),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/
c
      data (lg(i,5),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
c    Revision octobre 2006, nouveaux lg
c
      data (lg(i,6),i=1,120)/
     > -29692, -1784, 5306, -2200, 3070, -2366, 1681, -413, 1335, -2267,
     > -262, 1249, 302, 759, -427, 940, 780, 262, 290, -236, 
     > -418, 97, 122, -306, -214, 352, 46, 235, 165, -118,
     > -143, -166, -55, -17, 107, 68, 67, -17, 68, 72,
     > -170, 67, -1, -58, 19, 1, -93, 36, 77, -72,
     > -69, 1, -25, 28, 4, 5, 24, 4, 17, 8,
     > -24, -2, -6, 25, 6, 11, -6, -21, -9, 8, 
     > -14, -23, 9, 15, 6, 11, -5, -16, -7, -4,
     > 4, 9, -20, 3, 15, -10, 12, 8, -6, -8,
     > -8, -1, 8, 10, 5, -2, -8, -8, 3, -3,
     > -6, 1, 2, 0, -4, 4, -1, 5, 4, -5,
     > 2, -1, 2, -2, 5, 1, 1, -2, 0, -7/
c
      data kmax /11/
c
      data f1 /1.d0/
c
      data sp(1)  /0.d0/
      data p(1,1)  /1.d0/
      data cp(1)   /1.d0/
      data dp(1,1) /0.d0/
c
      data tzero /1970.d0, 1975.d0, 1980.d0, 1985.d0,
     >            1990.d0, 1995.d0/
c
      data tmold /0.d0/
c     
      data sh(1,1) /0.d0/
c
c     ******************
c     Debut de programme
c     ******************
c
c     ---------------
c*FON Initialisations
c     ---------------
c
      ier = 0
c
      if (sh(1,1) .ne. -1.d0) then
         sh(1,1) = -1.d0
c
c        ---------------------------------------------------
c*FON    Calcul des coefficients de shmidt et des constantes
c        ---------------------------------------------------
c
         do 20 k = 1, kmax
            fn(k) = k
            do 10 l = 1, k
               fm(l) = l - 1
               const(k,l) = dble((k-2)**2 - (l - 1)**2)
     >                      / dble((2 * k - 3) * (2 * k - 5))
10         continue
20      continue
c
         do 40 k = 2, kmax
            sh(k,1) = dble(2 * k - 3) * sh(k-1,1) / dble(k-1)
            jj = 2
            do 30 l = 2, k
               sh(k,l) = sh(k,l-1) * dsqrt(dble((k - l + 1) * jj)
     >                   / (k + l - 2))
               jj = 1
30          continue
40       continue
c
      endif
c
c     ------------------------------------------------------------
c*FON Calcul des deux modeles de champ entourant la date de calcul
c*FON et calcul de l'intervalle de temps pour l'interpolation
c     ------------------------------------------------------------
c
      if (year .ne. tmold) then
         tmold = year
         imin  = idint((year - 1970.d0) / 5.d0) + 1
         imax  = imin + 1
         delt  = (year - tzero(imin)) / 5.d0
c
         ntot = 0
         do 60  k = 2, kmax
            gg(k,1) = dble(lg(ntot+1,imin))
     >                + dble(lg(ntot+1,imax)
     >                - lg(ntot+1,imin)) * delt
            l = 1
c
            nm = 2 * k - 1
            do 50 l = 2, k
               inc = 2 * l - 2
               gg(k,l) =  dble(lg(ntot+inc,imin))
     >                    + dble(lg(ntot+inc,imax)
     >                    - lg(ntot+inc,imin)) * delt

               hh(k,l) = dble(lg(ntot+inc+1,imin))
     >                   + dble(lg(ntot+inc+1,imax)
     >                   - lg(ntot+inc+1,imin)) * delt
c
50          continue
            ntot = ntot + nm
60       continue
         do 80 k = 2, kmax
            g(k,1) = gg(k,1) * sh(k,1) / f1
            do 70 l = 2, k
                g(k,l) = gg(k,l) * sh(k,l) / f1
               h(k,l) = hh(k,l) * sh(k,l) / f1
70         continue
80      continue
c
      endif
c
      cph = dcos(phir)
      sph = dsin(phir)
c
      if (thetr .ne. 0.d0) then
         ct = dcos(thetr)
         st = dsin(thetr)
      else
         ct = 1.0d0
         st = 1.d-15
      endif
      sp(2) = sph
      cp(2) = cph
c
      do 90 k = 3, kmax
c
         sp(k) = sp(2) * cp(k-1) + cp(2) * sp(k-1)
         cp(k) = cp(2) * cp(k-1) - sp(2) * sp(k-1)
c
90    continue
c
      rrmag   = rre * rayt / rgmt
      aor     = 1.d0 / rrmag
      ar      = aor * aor * aor
      p(2,1)  = ct
      dp(2,1) = -st
      p(2,2)  = st
      dp(2,2) = ct
c
      br = -(2.d0 * ar) * (g(2,1) * p(2,1) + p(2,2)
     >     * (g(2,2) * cp(2) + h(2,2) * sp(2)))
      bt = ar * (g(2,1) * dp(2,1) + dp(2,2) *
     >     (g(2,2) * cp(2) + h(2,2) * sp(2))) 
      bp = ar * (h(2, 2) * cp(2) - g(2,2) * sp(2)) * p(2,2)
c
      k = 2
      l = 12
c
      do 110 k = 3, kmax
c
         ar = aor * ar
c
         do 100 l = 1, k
c
            if (k .eq. l) then
               p(k,k)  = st * p(k-1,k-1)
               dp(k,k) = st * dp(k-1,k-1) + ct * p(k-1,k-1)
            else
               p(k,l)  = ct * p(k-1,l) - const(k,l) * p(k-2,l)
               dp(k,l) = ct * dp(k-1,l) - st * p(k-1,l) 
     >                   - const(k,l) * dp(k-2,l)
            endif
c
            par = p(k,l) * ar
c
            if (l .eq. 1) then
               temp = g(k,l)
            else
               temp  = g(k,l) * cp(l) + h(k,l) * sp(l)
               bp    = bp - (g(k,l) * sp(l) - h(k,l)
     >                 * cp(l)) * fm(l) * par
            endif
            br = br - temp * fn(k) * par
            bt = bt + temp * dp(k,l) * ar
100      continue
c
110   continue
c
      bp = bp / st
c
      bb = dsqrt(br * br + bt * bt + bp * bp)
c
c     ****************
c     Fin de programme
c     ****************
c
      return
      end