chp20.f 9.13 KB
      subroutine chp20 (year,rre,thetr,phir,br,bt,bp,bb,ier)
c*
c***********************************************************************
c*
c*PRO MAGLIB
c*
c*VER 20.07.07 - V 1.0
c*
c*AUT spec. CNES - JC KOSIK - fevrier 2001
c*AUT port. AKKA
c*
c*ROL Theme : Modeles de champs magnetiques
c*ROL         Calcul des composantes du champ magnetique apres 2020.
c*
c*PAR year  (I) : annee fractionnaire (>= 2020.)
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 (gauss)
c*PAR bt    (O) : composante tangentielle du champ magnetique le long
c*PAR           : du meridien positive vers le bas (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 - 20.07.07 - Creation
c*                             Coefficients de Schmidt et
c*                             variations seculaires provisoires 2020
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,rre,thetr,phir,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(195),lgt(195)
c*LOC lg, lgt : coeeficients apres l'an 2020
c
      integer kmax
c*LOC kmax : nombre de pas de calcul (= 14)
c
      integer l,k,jj,nm,ntot,inc
c*LOC l,k,jj,nm,ntot,inc : indices de boucles et de tableaux
c
      double precision gg(14,14),ggt(14,14),hh(14,14),hht(14,14)
      double precision g(14,14),h(14,14),sh(14,14),fn(14),fm(14)
      double precision cp(14),sp(14),p(14,14),dp(14,14),const(14,14)
      double precision f1, f2, tzero, tmold,t,cph,sph,ct,st
      double precision rrmag,ar,aor,temp,par
c*LOC Variables de travail intermediaires
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
c     Creation juillet 2020 - coefficients lg et lgt
c
      data lg/
     > -294048,-14509,46525,-24996,29820,-29916,16770,-7346,13632,
     > -23812,-821,12362,2419,
     >  5257,-5434,9030,8095,2819,863,-1584,-3094,1997,480,-3497,
     > -2343,3632,477,
     >  1878,2083,-1407,-1212,-1512,323,135,989,660,655,-191,729,251,
     > -1215,
     >  528,-362,-645,135,89,-647,681,806,-767,-515,-82,-169,565,22,
     >  158,235,64,-22,-72,-272,98,-18,237,97,84,-176,-153,-5,
     >  128,-211,-117,153,149,137,36,-165,-69,-3,28,50,84,-234,
     >  29,110,-15,98,-11,-51,-132,-63,11,78,88,4,-93,-14,
     > -119,96,-19,-62,34,-1,-2,17,36,-9,48,7,-86,-9,
     > -1,19,-43,14,-34,-24,-1,-38,-88,30,-14,0,-25,25,
     >  23,-6,-9,-4,3,6,-7,-2,-1,-17,14,-16,-6,-30,
     >  2,-20,31,-26,-20,-1,-12,5,5,13,14,-12,-18,7,
     >  1,3,8,5,-2,-3,6,-5,2,1,-9,-11,0,-3,
     >  5,1,-9,-9,5,6,7,14,-3,-4,8,-13,0,-1,
     >  8,3,0,-1,4,5,1,5,5,-4,-5,-4,-4,-6
     > /
c
       data lgt/
     >  57,74,-259,-110,-70,-302,-21,-224,22,-59,60,31,-11,
     > -120,5,-12,-16,-1,-59,65,52,36,-51,-50,-3,5,0,
     > -6,25,2,-6,13,30,9,3,-5,-3,0,4,-16,13,
     > -13,-14,8,0,0,9,10,-1,-2,6,0,6,7,-8,
     >  1,-2,-5,-11,-8,1,8,3,0,1,-2,-1,6,4,
     >  -2,-1,5,4,-3,3,-4,-1,5,4,0,0,0,0,
     >  0,0,0,0,0,0,0,0,0,0,0,0,0,0,
     >  0,0,0,0,0,0,0,0,0,0,0,0,0,0,
     >  0,0,0,0,0,0,0,0,0,0,0,0,0,0,
     >  0,0,0,0,0,0,0,0,0,0,0,0,0,0,
     >  0,0,0,0,0,0,0,0,0,0,0,0,0,0,
     >  0,0,0,0,0,0,0,0,0,0,0,0,0,0,
     >  0,0,0,0,0,0,0,0,0,0,0,0,0,0,
     >  0,0,0,0,0,0,0,0,0,0,0,0,0,0
     > /
c
      data kmax /14/
c
      data f1 /10.d0/, f2 /10.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 /2020.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
         ntot = 0
         do 60 k = 2, kmax
c
            gg(k,1)  = dble(lg(ntot+1))
            ggt(k,1) = dble(lgt(ntot+1))
c
            nm = 2 * k - 1
            do 50 l = 2, k
               inc      = 2 * l - 2
               gg(k,l)  = dble(lg(ntot+inc))
               ggt(k,l) = dble(lgt(ntot+inc))
               hh(k,l)  = dble(lg(ntot+inc+1))
               hht(k,l) = dble(lgt(ntot+inc+1))
50          continue
c
            ntot = ntot + nm
60       continue
c
         do 80 k = 2, kmax
            gg(k,1)  = gg(k,1) * sh(k,1) / f1
            ggt(k,1) = ggt(k,1) * sh(k,1) / f2
            do 70 l = 2, k
               gg(k,l)  = gg(k,l)  * sh(k,l) / f1
               ggt(k,l) = ggt(k,l) * sh(k,l) / f2
               hh(k,l)  = hh(k,l)  * sh(k,l) / f1
               hht(k,l) = hht(k,l) * sh(k,l) / f2
70          continue
80       continue
      endif
c
      if (year .ne. tmold) then
         tmold = year
         t     = year - tzero
         do 100 k = 2, kmax
            g(k,1) = gg(k,1) + t * ggt(k,1)
            do 90 l = 2,k
               g(k,l) = gg(k,l) + t * ggt(k,l)
               h(k,l) = hh(k,l) + t * hht(k,l)
90          continue
c
100      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 110 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
110   continue
      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
      do 130 k = 3, kmax
c
         ar = aor * ar
c
         do 120 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
c
120      continue
c
130   continue
c
      bp = bp / st
c
c     ---------------------------------------
c*FON Expression du champ magnetique en gauss
c     ---------------------------------------
c
      br = br / 100000.d0
      bt = bt / 100000.d0
      bp = bp / 100000.d0
c
      bb = dsqrt(br * br + bt * bt + bp * bp)
c
c     ****************
c     Fin de programme
c     ****************
c
      return
      end