Ignore:
Timestamp:
Jan 30, 2026, 12:40:55 PM (4 weeks ago)
Author:
emillour
Message:

Mars PCM:
Cleanup and correction around thermospheric processes: ensure that the
tendencies from previous processes are included before being sent to
the next process (was not the case for conduction).
EM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.MARS/libf/aeronomars/thermosphere_mod.F

    r4024 r4035  
    1010      subroutine thermosphere(ngrid,nlayer,nq,
    1111     &     pplev,pplay,dist_sol,
    12      $     mu0,ptimestep,ptime,zday,tsurf,zzlev,zzlay,
    13      &     pt,pq,pu,pv,pdt,pdq,
     12     $     mu0,ptimestep,zday,tsurf,zzlev,zzlay,
     13     &     pt,pq,pu,pv,pdt,pdq,pdu,pdv,
    1414     $     zdteuv,zdtconduc,zdumolvis,zdvmolvis,zdqmoldiff,
    1515     $     PhiEscH,PhiEscH2,PhiEscD)
     
    3131      integer,intent(in) :: nlayer ! number of atmospheric layers
    3232      integer,intent(in) :: nq ! number of advected tracers
    33       REAL,INTENT(in) :: pplay(ngrid,nlayer)
    34       REAL,INTENT(in) :: pplev(ngrid,nlayer+1)
    35       REAL,INTENT(in) :: zzlay(ngrid,nlayer)
    36       REAL,INTENT(in) :: zzlev(ngrid,nlayer+1)
    37       REAL,INTENT(in) :: pt(ngrid,nlayer)
    38       REAL,INTENT(in) :: zday
    39       REAL,INTENT(in) :: dist_sol
    40       REAL,INTENT(in) :: mu0(ngrid)
    41       REAL,INTENT(in) :: pq(ngrid,nlayer,nq)
    42       REAL,INTENT(in) :: ptimestep
    43       REAL,INTENT(in) :: ptime
    44       REAL,INTENT(in) :: tsurf(ngrid)
    45       REAL,INTENT(in) :: pu(ngrid,nlayer),pv(ngrid,nlayer)
    46       REAL,INTENT(in) :: pdt(ngrid,nlayer),pdq(ngrid,nlayer,nq)
     33      REAL,INTENT(in) :: pplay(ngrid,nlayer) ! mid-layer pressure (Pa)
     34      REAL,INTENT(in) :: pplev(ngrid,nlayer+1) ! inter-layer pressure (Pa)
     35      REAL,INTENT(in) :: zzlay(ngrid,nlayer) ! altitude of mid-layer (m)
     36      REAL,INTENT(in) :: zzlev(ngrid,nlayer+1) ! altitude of layer boundaries (m)
     37      REAL,INTENT(in) :: pt(ngrid,nlayer) ! input temperature (K)
     38      REAL,INTENT(in) :: zday ! Mars date (sols since Ls=0)
     39      REAL,INTENT(in) :: dist_sol ! Sun-Mars distance (AU)
     40      REAL,INTENT(in) :: mu0(ngrid) ! cosine of solar zenith angle
     41      REAL,INTENT(in) :: pq(ngrid,nlayer,nq) ! input tracer mixing ratio (kg/kg_air)
     42      REAL,INTENT(in) :: ptimestep ! physics time step (s)
     43      REAL,INTENT(in) :: tsurf(ngrid) ! surface temperature (K)
     44      REAL,INTENT(in) :: pu(ngrid,nlayer) ! input zonal wind (m/s)
     45      REAL,INTENT(in) :: pv(ngrid,nlayer) ! input meridional wind (m/s)
    4746
    48       REAL,INTENT(out) :: zdteuv(ngrid,nlayer)
    49       REAL,INTENT(out) :: zdtconduc(ngrid,nlayer)
    50       REAL,INTENT(out) :: zdumolvis(ngrid,nlayer)
    51       REAL,INTENT(out) :: zdvmolvis(ngrid,nlayer)
    52       REAL,INTENT(out) :: zdqmoldiff(ngrid,nlayer,nq)
    53       REAL*8,INTENT(out) :: PhiEscH,PhiEscH2,PhiEscD
     47      REAL,INTENT(out) :: zdteuv(ngrid,nlayer) ! tendency due to EUV (K/s)
     48      REAL,INTENT(out) :: zdtconduc(ngrid,nlayer) ! tendency due to conduction (K/s)
     49      REAL,INTENT(out) :: zdumolvis(ngrid,nlayer) ! tendency due to viscosity (m/s/s)
     50      REAL,INTENT(out) :: zdvmolvis(ngrid,nlayer) ! tendency due to viscosity (m/s/s)
     51      REAL,INTENT(out) :: zdqmoldiff(ngrid,nlayer,nq) ! tendency due to diffusion (kg/kg_air/s)
     52      REAL*8,INTENT(out) :: PhiEscH ! total escape flux of H (s-1)
     53      REAL*8,INTENT(out) :: PhiEscH2 ! total escape flux of H2 (s-1)
     54      REAL*8,INTENT(out) :: PhiEscD ! total escape flux of D (s-1)
     55
     56      REAL,INTENT(inout) :: pdt(ngrid,nlayer) ! tendency on temperature (K/s)
     57      REAL,INTENT(inout) :: pdq(ngrid,nlayer,nq) ! tendency on tracers (kg/kg_air/s)
     58      REAL,INTENT(inout) :: pdu(ngrid,nlayer) ! tendency on zonal wind (m/s/s)
     59      REAL,INTENT(inout) :: pdv(ngrid,nlayer) ! tendency on meridional wind (m/s/s)
    5460
    5561      INTEGER :: l,ig
     
    6874
    6975      ! initialize tendencies to zero in all cases
    70       ! (tendencies are added later on, even if parametrization is not called)
    7176      zdteuv(1:ngrid,1:nlayer)=0
    7277      zdtconduc(1:ngrid,1:nlayer)=0
     
    7782      if (calleuv) then
    7883        call euvheat(ngrid,nlayer,nq,pt,pdt,pplev,pplay,zzlay,
    79      $               mu0,ptimestep,ptime,zday,pq,pdq,zdteuv)
     84     $               mu0,ptimestep,zday,pq,pdq,zdteuv)
     85        ! update tendency on temperature
     86        pdt(:,:)=pdt(:,:)+zdteuv(:,:)
    8087      endif
    8188
    8289      if (callconduct) THEN
    83         call conduction(ngrid,nlayer,ptimestep,pplay,pplev,pt,zdteuv,
     90        call conduction(ngrid,nlayer,ptimestep,pplay,pplev,pt,pdt,
    8491     $                   tsurf,zzlev,zzlay,zdtconduc)
     92        ! update tendency on temperature
     93        pdt(:,:)=pdt(:,:)+zdtconduc(:,:)
    8594      endif
    8695
    8796      if (callmolvis) THEN
    8897        call molvis(ngrid,nlayer,ptimestep,pplay,pplev,pt,
    89      &                zdteuv,zdtconduc,pu,
    90      $                   tsurf,zzlev,zzlay,zdumolvis)
     98     &                pdt,pu,tsurf,zzlev,zzlay,zdumolvis)
    9199        call molvis(ngrid,nlayer,ptimestep,pplay,pplev,pt,
    92      &                zdteuv,zdtconduc,pv,
    93      $                   tsurf,zzlev,zzlay,zdvmolvis)
     100     &                pdt,pv,tsurf,zzlev,zzlay,zdvmolvis)
     101        ! update tendencies on winds
     102        pdu(:,:)=pdu(:,:)+zdumolvis(:,:)
     103        pdv(:,:)=pdv(:,:)+zdvmolvis(:,:)
    94104      endif
    95105
     
    99109        call moldiff_red(ngrid,nlayer,nq,
    100110     &                   pplay,pplev,pt,pdt,pq,pdq,ptimestep,
    101      &                   zzlay,zdteuv,zdtconduc,zdqmoldiff,
    102      &                   PhiEscH,PhiEscH2,PhiEscD)
     111     &                   zdqmoldiff,PhiEscH,PhiEscH2,PhiEscD)
    103112       else
    104113        ! new MPF (modified pass flow) scheme
    105114        call moldiff_MPF(ngrid,nlayer,nq,
    106115     &                   pplay,pplev,pt,pdt,pq,pdq,ptimestep,
    107      &                   zzlay,zdteuv,zdtconduc,zdqmoldiff,
    108      &                   PhiEscH,PhiEscH2,PhiEscD)
     116     &                   zdqmoldiff,PhiEscH,PhiEscH2,PhiEscD)
    109117       endif ! of if (moldiff_scheme==1)
    110       endif
     118
     119       ! update tendencies on tracers
     120       pdq(:,:,:)=pdq(:,:,:)+zdqmoldiff(:,:,:)
     121       
     122      endif ! of if (callmoldiff)
    111123
    112124      end subroutine thermosphere
Note: See TracChangeset for help on using the changeset viewer.