chp15.f 9.09 KB
      subroutine chp15 (year,rre,thetr,phir,br,bt,bp,bb,ier)
c*
c***********************************************************************
c*
c*PRO MAGLIB
c*
c*VER 17.02.23 - 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 2015.
c*
c*PAR year  (I) : annee fractionnaire (>= 2015.)
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 - 17.02.23 - Coefficients de Schmidt et
c*                             variations seculaires provisoires 2015
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 2015
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     Revision février 2017 - coefficients lg et lgt
c
      data lg/
     > -294420,-15010,47971,-24451,30129,-28456,16767,-6419,13507,
     > -23523,-1153,12256,2449,
     >  5820,-5384,9076,8137,2833,1204,-1887,-3349,1809,704,-3295,
     > -2326,3601,473,
     >  1924,1970,-1409,-1193,-1575,160,41,1002,700,677,-208,727,332,
     > -1299,
     >  589,-289,-667,132,73,-709,626,816,-761,-541,-68,-195,518,57,
     >  150,244,94,34,-28,-274,68,-22,242,88,101,-169,-183,-32,
     >  133,-206,-146,134,162,117,57,-159,-91,-20,21,54,88,-216,
     >  31,108,-33,118,7,-68,-133,-69,-1,78,87,10,-91,-40,
     > -105,84,-19,-63,32,1,-4,5,46,-5,44,18,-79,-7,
     > -6,21,-42,24,-28,-18,-12,-36,-87,31,-15,-1,-23,20,
     >  20,-7,-8,-11,6,8,-7,-2,2,-22,17,-14,-2,-25,
     >  4,-20,35,-24,-19,-2,-11,4,4,12,19,-8,-22,9,
     >  3,1,7,5,-1,-3,3,-4,2,2,-9,-9,-1,0,
     >  7,0,-9,-9,4,4,5,16,-5,-5,10,-12,-2,-1,
     >  8,4,-1,-1,3,4,1,5,5,-3,-4,-4,-3,-8
     > /
c
       data lgt/
     >  103,181,-266,-87,-33,-274,21,-141,34,-55,82,-7,-4,
     > -101,18,-7,2,-13,-91,53,41,29,-43,-52,-2,5,6,
     > -13,17,-1,-12,14,34,39,0,-3,-1,0,-7,-21,21,
     > -7,-12,2,3,9,16,10,3,-2,8,-5,4,13,-2,
     >  1,-3,-6,-6,-8,1,2,-2,2,0,-3,-6,3,5,
     >  1,-2,5,4,-2,1,-3,-4,3,3,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 /2015.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