Date: Mon, 24 Nov 2003 17:16:49 +0100 From: Jean-Jacques Valette To: urs Hugentobler Cc: petr.stepanek@cls.fr, martine Feissel-Vernier , Karine Le Bail , gilles Tavernier , jean-pierre.granier@cnes.fr, laurent Soudarin , Biancale Richard Subject: DORIS and DTM1994 Dear Urs and Petr, Following our DORIS meeting in Berne, I have asked to Richard about the DTM air Drag model applied in the GINS software. The reference of the original work from F. Barlier et al. is: F. Barlier, C. Berger, J.L. Falin, G. Kokckarts and G. Thuillier. A Thermospheric model based on the satellite drag data. Ann. Geophys., t. 34, 1 , 1978, p 9-24. You will find the fortran 90 code in the attached file. It is the one Laurent routinely uses for the LEGOS/CLS analysis center. Richard mentioned some recent refinements of this model, so-called DTM2000 based on the CHAMP accelorometer data. It is also available and may be asked to Richard or Sean Bruinsma (Sean.Bruinsma@cnes.fr). Many thanks to Richard and GRGS team and hope it will help in your analysis. Best regards, JJacques ------------------------------------------------------------------------------ Jean-Jacques VALETTE (Jean-Jacques.Valette@cls.fr) COLLECTE LOCALISATION SATELLITES 8-10 Rue Hermès Parc Technologique du Canal 31526 Ramonville-Saint-Agne Cedex FRANCE Tel (+33) 05.61.39.47.62 Fax (+33) 05.61.39.48.06 http://www.cls.fr ------------------------------------------------------------------------------- [ Part 2: "Attached Text" ] subroutine dtm94(day,f,fbar,ap,alti,hl,alat,xlon,tz,tinf,ro,wmm,ddh) ! !*********************************************************************** ! ! HISTORIQUE ! ---------- ! ! ROLE ! ---- !*auteur !*version decembre 94 !*but calcul de la temperature, concentrations, densite totale !*par entrees ! day=jour de l annee ! f=flux instantane a t - 1j ! fbar=flux moyen a t ! akp= kp tri-horaire (avec un delai de 6-abs(alat)*0.033 en heure) ! alti=altitude en km superieure a 120 km ! hl=heure locale + 12h (en radian) ! aphi= latitude du point en radian ! alon= longitude du point en radian !*par sorties ! tz=temperature a l altitude alti ! tinf=temperature exospherique ! dbc(1)=concentration hydrogene atomique ! dbc(2)=concentration helium ! dbc(3)=concentration oxygene atomique ! dbc(4)=concentration azote moleculaire ! dbc(5)=concentration oxygene moleculaire ! ro=densite totale en g/cm3 ! wmm=masse moleculaire moyenne ! ddh=derivee de la densite par rapport a l'altitude en km ! ! ARGUMENTS ! --------- !*ARG day E jour de l annee !*ARG f E flux instantane a t - 1j et derive !*ARG fbar E flux moyen a t et derive !*ARG ap E? ap moyen (DTM), a t, -1j et derivees !*ARG alti E altitude en km superieue a 120 km !*ARG hl E heure locale + 12h !*ARG alat E latitude du point en radian !*ARG xlon E longitude du point en radian !*ARG tz S temperature a l altitude alti !*ARG tinf S temperature exospherique !*ARG ro S densite totale en g/cm3 !*ARG wmm S masse moleculaire moyenne !*ARG ddh S derivee de la densite par rapport a l'altitude en km ! ! MODULES ! ------- ! ! APPELES ! ------- ! ! APPELANTS ! --------- ! !*********************************************************************** ! use f90_kind use common_plgdtm use common_hlocal use common_cons use gldtm94_interface use bint_interface ! pour inline bint use egalite_interface ! !.. Implicit Declarations .. implicit none ! !.. Parameters .. integer, parameter :: nlatm94 = 39 ! !.. Formal Arguments .. real(SINGLE), intent(in) :: day real(SINGLE), intent(in) :: f real(SINGLE), intent(in) :: fbar real(SINGLE), dimension(7), intent(in) :: ap real(SINGLE), intent(in) :: alti real(SINGLE), intent(in) :: hl real(SINGLE), intent(in) :: alat real(SINGLE), intent(in) :: xlon real(SINGLE), intent(out) :: tz real(SINGLE), intent(out) :: tinf real(SINGLE), intent(out) :: ro real(SINGLE), intent(out) :: wmm real(SINGLE), intent(out) :: ddh ! !.. Local Scalars .. integer :: i,ikp real(SINGLE) :: cpmg = .19081_S real(SINGLE) :: gsurf = 980.665_S real(SINGLE) :: re = 6356.77_S real(SINGLE) :: rgas = 831.4_S real(SINGLE) :: spmg = .98163_S real(SINGLE) :: xlmg = -1.2392_S real(SINGLE) :: zlb = 120._S real(SINGLE) :: akp,apt,c,c2,c4,clmlmg,cmg,cmg2,cmg4,dzeta,expsz,fbm150, & fmfb,gamma,gdelaz2,gdelh,gdelhe,gdelo,gdelo2,gdelt,glb,sbc,s2, & sigma,sigzeta,sp,t120,t120tz,tinftz,tp120,upapg,zeta ! !.. Local Arrays .. integer, dimension(6) :: ma real(SINGLE), dimension(6) :: alefa,cc,dbc,dbase,fz,vma real(SINGLE), dimension(nlatm94) :: & az2,daz2,dh,dhe,do2,dtt,h,he,o,o2,t0,tp,tt,xdo ! !.. Intrinsic Functions .. intrinsic abs, asin, cos, exp, sin ! !.. Data Declarations .. data alefa/-0.40_S,-0.38_S,0._S,0._S,0._S,0._S/ data ma/1,4,16,28,32,14/ data vma/ & 1.6606e-24_S,6.6423e-24_S,26.569e-24_S,46.4958e-24_S,53.1381e-24_S,23.2479e-24_S/ data (tt(i), i = 1,39)/ & 1000.5_S,0.94610e-02_S,0.42671e-01_S,0.17948e-02_S,-0.79900e-05_S,0.33674e-02_S, & 0.22629e-01_S,0.37865e-01_S,-0.19230e-01_S,-0.92415e-02_S,-0.21066e03_S, & 0.10326e-01_S,0.28856e-01_S,-0.76311e02_S,-0.18498e00_S,-0.20306e-01_S, & 0.14473e-01_S,-0.36306e01_S,-0.28940e-01_S,-0.17367e03_S,-0.10819e00_S, & -0.19993e-02_S,0.33966e-02_S,-0.16132e-01_S,-0.96095e-02_S,-0.10455e00_S, & 0.45752e-02_S,0.45844e-02_S,0.17764e-01_S,-0.42270e-02_S,-0.35667e-02_S, & -0.36061e-03_S,0.10493e-01_S,0.45712e-02_S,-0.21751e-04_S,0.15110e-02_S, & 0.21666e-02_S,-0.11423e-05_S,0.65823e-04_S/ data (h(i), i = 1,39)/ & 1.761e+05_S,-1.33700e-01_S,0._S,-1.24600e-02_S,0._S,-1.93000e-02_S,-6.00000e-02_S, & -0.20000e-02_S,5.87800e-02_S,0._S,9.22700e01_S,0._S,0._S,0._S,3.30100e-01_S, & 1.04500e-01_S,0._S,-1.47700e01_S,-9.06500e-02_S,-7.20000e01_S,2.09400e-01_S, & 2.83000e-02_S,0._S,8.57100e-02_S,-2.47500e-02_S,3.83000e-01_S,2.94100e-02_S,0._S, & -3.97400e-03_S,4.35600e-02_S,0._S,0._S,0._S,0._S,0._S,0._S,0._S,0._S,0._S/ data (he(i), i = 1,39)/ & 2.791e+07_S,0.10965e00_S,-0.19084e00_S,-0.20772e-03_S,0.48346e-05_S,0.21123e-02_S, & 0.22119e-03_S,-0.16174e00_S,-0.92223e-01_S,-0.83007e-02_S,0.21353e03_S, & 0.23504e00_S,-0.79051e-01_S,0.11040e03_S,-0.12677e01_S,-0.18512e-01_S, & 0.66625e-01_S,-0.18703e03_S,-0.42149e-01_S,-0.21671e03_S,-0.12779e00_S, & -0.61824e-02_S,-0.17450e-01_S,-0.43600e-01_S,-0.52850e-01_S,0.31204e00_S, & -0.21372e-01_S,-0.24529e-01_S,-0.36727e-02_S,-0.88330e-01_S,0.33991e-01_S, & 0.51314e-02_S,-0.14740e-01_S,0.85563e-02_S,0.19571e-02_S,-0.45034e-02_S, & -0.10241e00_S,-0.16867e-04_S,-0.14265e-02_S/ data (o(i), i = 1,39)/ & 0.8472e+11_S,-0.66447e-01_S,-0.97415e-01_S,0.12284e-02_S,0.44976e-05_S, & 0.53580e-02_S,0.25573e-02_S,-0.98221e-01_S,0.10091e00_S,0.62609e-02_S,0.11565e02_S, & 0.17600e00_S,-0.71284e-01_S,0.10639e03_S,0.33295e00_S,-0.11448e00_S,-0.42425e-02_S, & -0.67511e00_S,-0.41712e-01_S,0.13443e03_S,-0.65932e-01_S,-0.19344e-01_S, & -0.85846e-02_S,0.86347e-01_S,0.85679e-01_S,0.45486e-01_S,-0.38719e-01_S, & -0.12872e-01_S,-0.91778e-01_S,0.42617e-01_S,0.43386e-01_S,0.56894e-02_S, & 0.66512e-02_S,-0.10174e-01_S,0.27058e-02_S,-0.47104e-02_S,-0.14639e-01_S, & -0.64057e-05_S,0.15178e-02_S/ data (az2(i), i = 1,39)/ & 3.2045e+11_S,-0.14019e00_S,0.57220e-01_S,0.11260e-02_S,-0.20779e-05_S, & 0.34239e-02_S,-0.11588e-01_S,+0.55158e-01_S,-0.10049e-01_S,-0.43905e-01_S, & 0.19594e03_S,0.32483e-01_S,0.56500e-01_S,0.88202e02_S,0.28812e00_S,-0.31427e-01_S, & 0.00000e00_S,-0.20015e03_S,0.60700e-01_S,0.51153e02_S,-0.46104e-01_S, & -0.97000e-02_S,0.34910e-02_S,0._S,0._S,-0.73329e-01_S,0.21159e-01_S,0.70334e-02_S,0._S, & 0._S,-0.69199e-02_S,0._S,-0.72899e-02_S,0._S,-0.29200e-02_S,0.27047e-02_S, & -0.59939e-02_S,0.00000e00_S,0.82127e-02_S/ data o2(1)/4.775e+10_S/ data t0(1)/380.0_S/ data tp(1)/14.348_S/ ! ! ... Executable Statements ... ! ! ddh = 0._S ro = 0._S ! ! calcul des polynomes de legendre c = sin(alat) c2 = c * c c4 = c2 * c2 sbc = cos(alat) s2 = sbc * sbc p10 = c p20 = 1.5_S*c2 - 0.5_S p30 = c * (2.5_S*c2-1.5_S) p40 = 4.375_S*c4 - 3.75_S*c2 + 0.375_S p50 = c * (7.875_S*c4-8.75_S*c2+1.875_S) p11 = sbc p21 = 3._S * c * sbc p31 = sbc * (7.5_S*c2-1.5_S) p41 = c * sbc * (17.5_S*c2-7.5_S) p51 = sbc * (39.375_S*c4-26.25_S*c2+1.875_S) p22 = 3._S * s2 p32 = 15._S * c * s2 p42 = s2 * (52.5_S*c2-7.5_S) p52 = 3._S*c*p42 - 2._S*p32 p33 = 15._S * sbc * s2 ! ! calcul des polynomes de legendre / pole magnetique (79n,71w) clmlmg = cos(xlon-xlmg) sp = sbc*cpmg*clmlmg + c*spmg if (sp > 1._S) then sp = 1.0_S end if if (sp < -1._S) then sp = -1._S end if ! cmg = sp ! pole magnetique cmg2 = cmg * cmg cmg4 = cmg2 * cmg2 p10mg = cmg p20mg = 1.5_S*cmg2 - 0.5_S p40mg = 4.375_S*cmg4 - 3.75_S*cmg2 + 0.375_S ! ! heure locale hl0 = hl + pi ch = cos(hl0) sh = sin(hl0) c2h = ch*ch - sh*sh s2h = 2._S * ch * sh c3h = c2h*ch - s2h*sh s3h = s2h*ch + c2h*sh ! ! flux fmfb = f - fbar fbm150 = fbar - 150._S ! ! kp apt = ap(4) + 2._S*abs(asin(cmg))/pi*(ap(3)-ap(4)) akp = bint(apt) ! ! calcul de la fonction g(l) / tinf, t120, tp120 ikp = 1 call gldtm94(fmfb,fbm150,akp,day,tt,gdelt,1._S,ikp) dtt(1) = 1._S + gdelt tinf = tt(1) * dtt(1) t120 = t0(1) tp120 = tp(1) ! Attention BUG: pour certaines configurations tinf est inferieur ! a t120 ce qui est impossible. ! on impose donc tinf =t120+1 si tinf