Changeset 2199


Ignore:
Timestamp:
Dec 13, 2019, 2:06:35 PM (5 years ago)
Author:
mvals
Message:

Mars GCM:
Implementation of a new parametrization of the dust entrainment by slope winds above the sub-grid scale topography. The parametrization is activated with the flag slpwind=.true. (set to "false" by
default) in callphys.def. The new parametrization involves the new tracers topdust_mass and topdust_number.
MV

Location:
trunk/LMDZ.MARS
Files:
1 added
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.MARS/README

    r2189 r2199  
    27982798surface tracers) in co2condens.
    27992799
    2800  
     2800== 13/12/2019 == MV
     2801Implementation of a new parametrization of the dust entrainment by slope winds above the sub-grid scale topography. The parametrization is activated with the flag slpwind=.true. (set to "false" by default) in callphys.def. The new parametrization involves the new tracers topdust_mass and topdust_number.
  • trunk/LMDZ.MARS/libf/phymars/aeropacity_mod.F

    r2161 r2199  
    99     &    QREFvis3d,QREFir3d,omegaREFir3d,
    1010     &    totstormfract,clearatm,dsords,
     11     &    alpha_hmons,nohmons,
    1112     &    clearsky,totcloudfrac)
    1213                                                         
     
    1516      use tracer_mod, only: noms, igcm_h2o_ice, igcm_dust_mass,
    1617     &                      igcm_dust_submicron, rho_dust, rho_ice,
    17      &                      nqdust, igcm_stormdust_mass
     18     &                      nqdust, igcm_stormdust_mass,
     19     &                      igcm_topdust_mass
    1820      use geometry_mod, only: latitude ! grid point latitudes (rad)
    1921      use comgeomfi_h, only: sinlat ! sines of grid point latitudes
     
    2830     &            iaer_dust_conrath,iaer_dust_doubleq,
    2931     &            iaer_dust_submicron,iaer_h2o_ice,
    30      &            iaer_stormdust_doubleq
     32     &            iaer_stormdust_doubleq,
     33     &            iaer_topdust_doubleq
    3134      USE calcstormfract_mod
    3235       IMPLICIT NONE
     
    9497      LOGICAL, INTENT(IN) :: clearatm
    9598      REAL, INTENT(IN) :: totstormfract(ngrid)
     99      LOGICAL, INTENT(IN) :: nohmons
     100      REAL, INTENT(IN) :: alpha_hmons(ngrid)
    96101      REAL, INTENT(OUT) ::  tauscaling(ngrid) ! Scaling factor for qdust and Ndust
    97102      REAL,INTENT(IN) :: totcloudfrac(ngrid) ! total cloud fraction
     
    176181          txt=name_iaer(iaer)
    177182        ! CW17: choice tauscaling for stormdust or not
    178           IF ((txt(1:4).eq."dust").OR.(txt(1:5).eq."storm")) THEN
     183          IF ((txt(1:4).eq."dust").OR.(txt(1:5).eq."storm")
     184     &         .OR.(txt(1:3).eq."top")) THEN !MV19: topdust tracer
    179185            naerdust=naerdust+1
    180186            iaerdust(naerdust)=iaer
     
    517523        ENDIF
    518524c==================================================================
     525        CASE("topdust_doubleq") aerkind ! MV18 : Two-moment scheme for
     526c       topdust  (transport of mass and number mixing ratio)
     527c==================================================================
     528c       aerosol is calculated twice : once "above" the sub-grid mountain (nohmons=false)
     529c       and once in the part of the mesh without the sub-grid mountain (nohmons=true)
     530        aerosol(1:ngrid,1:nlayer,iaer) = 0.
     531        IF (nohmons) THEN  ! considering part of the mesh without storm
     532          aerosol(1:ngrid,1:nlayer,iaer)=1.e-25
     533        ELSE  ! part of the mesh with concentred dust storm
     534          DO l=1,nlayer
     535!             IF (l.LE.cstdustlevel) THEN
     536!c          Opacity in the first levels is held constant to
     537!c           avoid unrealistic values due to constant lifting:
     538!               DO ig=1,ngrid
     539!                  aerosol(ig,l,iaer) =
     540!     &           (  0.75 * QREFvis3d(ig,cstdustlevel,iaer) /
     541!     &           ( rho_dust * reffrad(ig,cstdustlevel,iaer) )  ) *
     542!     &           pq(ig,cstdustlevel,igcm_topdust_mass) *
     543!     &           ( pplev(ig,l) - pplev(ig,l+1) ) / g
     544!               ENDDO
     545!             ELSE
     546              DO ig=1,ngrid
     547                 aerosol(ig,l,iaer) =
     548     &           (  0.75 * QREFvis3d(ig,l,iaer) /
     549     &           ( rho_dust * reffrad(ig,l,iaer) )  ) *
     550     &           pq(ig,l,igcm_topdust_mass) *
     551     &           ( pplev(ig,l) - pplev(ig,l+1) ) / g
     552              ENDDO
     553!             ENDIF
     554
     555          ENDDO
     556        ENDIF
     557c==================================================================
    519558        END SELECT aerkind
    520559c     -----------------------------------
     
    733772      ENDIF
    734773#endif
    735               tauref(ig) = tauref(ig) +
    736      &                    aerosol(ig,l,iaerdust(iaer))
     774!              tauref(ig) = tauref(ig) +
     775!     &                    aerosol(ig,l,iaerdust(iaer))
     776c      MV19: tauref must ALWAYS contain the opacity of all dust tracers
     777       IF (name_iaer(iaerdust(iaer)).eq."dust_doubleq") THEN
     778              tauref(ig) = tauref(ig) +
     779     &  (  0.75 * QREFvis3d(ig,l,iaerdust(iaer)) /
     780     &  ( rho_dust * reffrad(ig,l,iaerdust(iaer)) )  ) *
     781     &  pq(ig,l,igcm_dust_mass) *
     782     &  ( pplev(ig,l) - pplev(ig,l+1) ) / g
     783       ELSE IF (name_iaer(iaerdust(iaer)).eq."stormdust_doubleq") THEN
     784              tauref(ig) = tauref(ig) +
     785     &  (  0.75 * QREFvis3d(ig,l,iaerdust(iaer)) /
     786     &  ( rho_dust * reffrad(ig,l,iaerdust(iaer)) )  ) *
     787     &  pq(ig,l,igcm_stormdust_mass) *
     788     &  ( pplev(ig,l) - pplev(ig,l+1) ) / g
     789       ELSE IF (name_iaer(iaerdust(iaer)).eq."topdust_doubleq") THEN
     790              tauref(ig) = tauref(ig) +
     791     &  (  0.75 * QREFvis3d(ig,l,iaerdust(iaer)) /
     792     &  ( rho_dust * reffrad(ig,l,iaerdust(iaer)) )  ) *
     793     &  pq(ig,l,igcm_topdust_mass) *
     794     &  ( pplev(ig,l) - pplev(ig,l+1) ) / g
     795       ENDIF
     796
    737797            ENDDO
    738798          ENDDO
     
    821881
    822882c -----------------------------------------------------------------
    823 c -----------------------------------------------------------------
    824883c aerosol/X for stormdust to prepare calculation of radiative transfer
    825884c -----------------------------------------------------------------
    826       if (rdstorm) then
     885      IF (rdstorm) THEN
    827886         DO l=1,nlayer
    828887           DO ig=1,ngrid
     888               ! stormdust: opacity relative to the storm fraction (stormdust/x)
    829889               aerosol(ig,l,iaer_stormdust_doubleq) =
    830890     &           aerosol(ig,l,iaer_stormdust_doubleq)/totstormfract(ig)
    831891           ENDDO
    832892         ENDDO
    833       endif
    834 
     893      ENDIF
     894
     895c -----------------------------------------------------------------
     896c aerosol/X for topdust to prepare calculation of radiative transfer
     897c -----------------------------------------------------------------
     898      IF (slpwind) THEN
     899        DO ig=1,ngrid
     900          IF (alpha_hmons(ig) .gt. 0.) THEN
     901            DO l=1,nlayer
     902             ! topdust: opacity relative to the storm fraction (topdust/x)
     903              aerosol(ig,l,iaer_topdust_doubleq) =
     904     &        aerosol(ig,l,iaer_topdust_doubleq)/alpha_hmons(ig)
     905            ENDDO
     906          ENDIF
     907        ENDDO
     908      ENDIF
    835909
    836910      END SUBROUTINE aeropacity
  • trunk/LMDZ.MARS/libf/phymars/callkeys.h

    r2179 r2199  
    1515     &   ,calltherm,callrichsl,callslope,tituscap,callyamada4,co2clouds &
    1616     &   ,co2useh2o,meteo_flux,CLFvaryingCO2,spantCO2,CLFvarying        &
    17      &   ,satindexco2,rdstorm,calllott_nonoro,latentheat
     17     &   ,satindexco2,rdstorm,slpwind,calllott_nonoro,latentheat
    1818     
    1919      COMMON/callkeys_i/iradia,iaervar,iddist,ilwd,ilwb,ilwn,ncouche    &
     
    6666      logical active,doubleq,submicron,lifting,callddevil,scavenging
    6767      logical rdstorm ! rocket dust storm parametrization
     68      logical slpwind ! entrainment by slope wind parametrization
    6869      logical latentheat ! latent heat release from ground water ice sublimation/condensation
    6970      logical sedimentation
  • trunk/LMDZ.MARS/libf/phymars/callradite_mod.F

    r1983 r2199  
    99     $     dtlw,dtsw,fluxsurf_lw,fluxsurf_sw,fluxtop_lw,
    1010     $     fluxtop_sw,tauref,tau,aerosol,dsodust,tauscaling,
    11      $     taucloudtes,rdust,rice,nuice,co2ice,rstormdust,
    12      $     totstormfract,clearatm,dsords,
     11     $     taucloudtes,rdust,rice,nuice,co2ice,rstormdust,rtopdust,
     12     $     totstormfract,clearatm,dsords,alpha_hmons,nohmons,
    1313     $     clearsky,totcloudfrac)
    1414
     
    1919     &            iaer_dust_conrath,iaer_dust_doubleq,
    2020     &            iaer_dust_submicron,iaer_h2o_ice,
    21      &            iaer_stormdust_doubleq 
     21     &            iaer_stormdust_doubleq,iaer_topdust_doubleq
    2222      use yomlw_h, only: gcp, nlaylte
    2323      use comcstfi_h, only: g,cpp
     
    205205      REAL dsords(ngrid,nlayer) ! density scaled opacity for rocket dust storm dust
    206206
     207c     entrainment by slope wind
     208      LOGICAL, INTENT(IN) :: nohmons ! true for background dust
     209      REAL, INTENT(IN) :: alpha_hmons(ngrid) ! sub-grid scale topography mesh fraction
     210      REAL,INTENT(OUT) :: rtopdust(ngrid,nlayer)  ! Topdust geometric mean radius (m)
     211
    207212c     sub-grid scale water ice clouds
    208213      LOGICAL,INTENT(IN) :: clearsky
     
    304309         iaer_h2o_ice=0
    305310         iaer_stormdust_doubleq=0
     311         iaer_topdust_doubleq=0
    306312
    307313         aer_count=0
     
    342348             if (name_iaer(iaer).eq."stormdust_doubleq") then
    343349               iaer_stormdust_doubleq = iaer
     350               aer_count = aer_count + 1
     351             endif
     352           enddo
     353         end if
     354         if (slpwind.AND.active) then
     355           do iaer=1,naerkind
     356             if (name_iaer(iaer).eq."topdust_doubleq") then
     357               iaer_topdust_doubleq = iaer
    344358               aer_count = aer_count + 1
    345359             endif
     
    392406c     Updating aerosol size distributions:
    393407      CALL updatereffrad(ngrid,nlayer,
    394      &                rdust,rstormdust,rice,nuice,
     408     &                rdust,rstormdust,rtopdust,rice,nuice,
    395409     &                reffrad,nueffrad,
    396410     &                pq,tauscaling,tau,pplay)
     
    408422     &    QREFvis3d,QREFir3d,omegaREFir3d,
    409423     &    totstormfract,clearatm,dsords,
     424     &    alpha_hmons,nohmons,
    410425     &    clearsky,totcloudfrac)
    411426
  • trunk/LMDZ.MARS/libf/phymars/callsedim_mod.F

    r1983 r2199  
    66
    77      SUBROUTINE callsedim(ngrid,nlay,ptimestep,
    8      &                pplev,zlev,zlay,pt,pdt,rdust,rstormdust,rice,
    9      &                rsedcloud,rhocloud,
     8     &                pplev,zlev,zlay,pt,pdt,
     9     &                rdust,rstormdust,rtopdust,
     10     &                rice,rsedcloud,rhocloud,
    1011     &                pq,pdqfi,pdqsed,pdqs_sed,nq,
    1112     &                tau,tauscaling)
     
    1920     &                      igcm_ccnco2_mass,igcm_ccnco2_number,
    2021     &                      igcm_co2_ice, igcm_stormdust_mass,
    21      &                      igcm_stormdust_number
     22     &                      igcm_stormdust_number,igcm_topdust_mass,
     23     &                      igcm_topdust_number
    2224      USE newsedim_mod, ONLY: newsedim
    2325      USE comcstfi_h, ONLY: g
     
    6466      real,intent(out) :: rdust(ngrid,nlay) ! Dust geometric mean radius (m)
    6567      real,intent(out) :: rstormdust(ngrid,nlay) ! Stormdust geometric mean radius (m)
     68      real,intent(out) :: rtopdust(ngrid,nlay) ! topdust geometric mean radius (m)
    6669      real,intent(out) :: rice(ngrid,nlay)  ! H2O Ice geometric mean radius (m)
    6770c     Sedimentation radius of water ice
     
    9497      real r0stormdust(ngrid,nlay) ! Geometric mean radius used for stormdust (m)
    9598!                                    !   CCNs (m)
     99      real r0topdust(ngrid,nlay) ! Geometric mean radius used for topdust (m)
     100!                                    !   CCNs (m)
    96101      real,save :: beta ! correction for the shape of the ice particles (cf. newsedim)
    97102c     for ice radius computation
     
    138143                                       !stormdust mass mix. ratio
    139144      INTEGER,SAVE :: istormdust_number !  index of tracer containing
    140                                         !stormdust number mix. ratio                     
     145                                        !stormdust number mix. ratio
     146      INTEGER,SAVE :: itopdust_mass  !  index of tracer containing
     147                                       !topdust mass mix. ratio
     148      INTEGER,SAVE :: itopdust_number !  index of tracer containing
     149                                        !topdust number mix. ratio                       
    141150      INTEGER,SAVE :: iccnco2_number ! index of tracer containing CCN number
    142151      INTEGER,SAVE :: iccnco2_mass ! index of tracer containing CCN number
     
    283292           endif
    284293       ENDIF !of if (rdstorm)
    285      
     294
     295       IF (slpwind) THEN ! identifying topdust tracers for sedimentation
     296           itopdust_mass=0      ! dummy initialization
     297           itopdust_number=0    ! dummy initialization
     298
     299           do iq=1,nq
     300             if (noms(iq).eq."topdust_mass") then
     301               itopdust_mass=iq
     302               write(*,*)"callsedim: itopdust_mass=",itopdust_mass
     303             endif
     304             if (noms(iq).eq."topdust_number") then
     305               itopdust_number=iq
     306               write(*,*)"callsedim: itopdust_number=",
     307     &                                           itopdust_number
     308             endif
     309           enddo
     310
     311           ! check that we did find the tracers
     312           if ((itopdust_mass.eq.0).or.(itopdust_number.eq.0)) then
     313             write(*,*) 'callsedim: error! could not identify'
     314             write(*,*) ' tracers for topdust mass and number mixing'
     315             write(*,*) ' ratio and slpwind is activated!'
     316             stop
     317           endif
     318       ENDIF !of if (slpwind)
     319
    286320        firstcall=.false.
    287321      ENDIF ! of IF (firstcall)
     
    325359        end do
    326360      endif
    327       ! rocket dust storm
     361c    rocket dust storm
    328362      if (rdstorm) then
    329363        do l=1,nlay
     
    337371        end do
    338372      endif
     373c     entrainment by slope wind
     374      if (slpwind) then
     375        do l=1,nlay
     376          do ig=1, ngrid
     377     
     378         call updaterdust(zqi(ig,l,igcm_topdust_mass),
     379     &               zqi(ig,l,igcm_topdust_number),r0topdust(ig,l),
     380     &               tauscaling(ig))
     381         
     382          end do
     383        end do
     384      endif
    339385c =================================================================
    340386      do iq=1,nq
     
    346392c         DOUBLEQ CASE
    347393c -----------------------------------------------------------------
    348           if ((doubleq.and.
     394          if ( doubleq.and.
    349395     &     ((iq.eq.idust_mass).or.(iq.eq.idust_number).or.
    350      &     (iq.eq.istormdust_mass).or.(iq.eq.istormdust_number)))) then
     396     &     (iq.eq.istormdust_mass).or.(iq.eq.istormdust_number).or.
     397     &     (iq.eq.itopdust_mass).or.(iq.eq.itopdust_number)) ) then
    351398     
    352399c           Computing size distribution:
     
    366413                end do
    367414              end do
     415            else if ((iq.eq.itopdust_mass).or.
     416     &                                (iq.eq.itopdust_number)) then
     417              do  l=1,nlay
     418                do ig=1, ngrid
     419                  r0(ig,l)=r0topdust(ig,l)
     420                end do
     421              end do
    368422            endif
    369423            sigma0 = varian
     
    371425c        Computing mass mixing ratio for each particle size
    372426c        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    373           IF ((iq.EQ.idust_mass).or.(iq.EQ.istormdust_mass)) then
     427          IF ((iq.EQ.idust_mass).or.(iq.EQ.istormdust_mass)
     428     &                          .or.(iq.EQ.itopdust_mass)) then
    374429            radpower = 2
    375430          ELSE  ! number
     
    514569       ENDDO
    515570      endif ! of if (rdstorm)
     571
     572      if (slpwind) then
     573       DO l = 1, nlay
     574        DO ig=1,ngrid
     575         call updaterdust(zqi(ig,l,igcm_topdust_mass),
     576     &                zqi(ig,l,igcm_topdust_number),rtopdust(ig,l),
     577     &                tauscaling(ig))   
     578        ENDDO
     579       ENDDO
     580      endif ! of if (slpwind)
    516581 
    517582c     Update the ice particle size "rice"
  • trunk/LMDZ.MARS/libf/phymars/conf_phys.F

    r2184 r2199  
    298298        write(*,*)" coeff_detrainment = ",coeff_detrainment
    299299
     300! entrainment by slope wind scheme
     301         write(*,*)"call slope wind lifting parametrization"
     302         slpwind=.false. ! default value
     303         call getin("slpwind",slpwind)
     304         write(*,*)" slpwind = ",slpwind
     305
    300306! latent heat release from ground water ice sublimation/condensation
    301307         write(*,*)"latent heat release during sublimation",
     
    430436           endif
    431437         endif
    432 ! rocket dust storm
     438! rocket dust storm and entrainment by slope wind
    433439! Test of incompatibility:
    434 ! if rdstorm is used, then doubleq should be true
    435          if (rdstorm.and..not.doubleq) then
    436            print*,'if rdstorm is used, then doubleq should be used !'
    437            stop
    438          endif
    439          if (rdstorm.and..not.active) then
    440            print*,'if rdstorm is used, then active should be used !'
     440! if rdstorm or slpwind is used, then doubleq should be true
     441         if ((rdstorm.or.slpwind).and..not.doubleq) then
     442           print*,'if rdstorm or slpwind is used, then doubleq
     443     &            should be used !'
     444           stop
     445         endif
     446         if ((rdstorm.or.slpwind).and..not.active) then
     447           print*,'if rdstorm or slpwind is used, then active
     448     &            should be used !'
    441449           stop
    442450         endif
    443451         if (rdstorm.and..not.lifting) then
    444            print*,'if rdstorm is used, then lifting should be used !'
    445            stop
    446          endif
    447          if (rdstorm.and..not.freedust) then
    448            print*,'if rdstorm is used, then freedust should be used !'
     452           print*,'if rdstorm is used, then lifting
     453     &            should be used !'
     454           stop
     455         endif
     456         if ((rdstorm.or.slpwind).and..not.freedust) then
     457           print*,'if rdstorm or slpwind is used, then freedust
     458     &            should be used !'
    449459           stop
    450460         endif
    451461         if (rdstorm.and.(dustinjection.eq.0)) then
    452            print*,'if rdstorm is used, then dustinjection should
    453      &            be used !'
     462           print*,'if rdstorm is used, then dustinjection
     463     &            should be used !'
    454464           stop
    455465         endif
     
    765775          ! and picky compilers who know name_iaer(2) is out of bounds
    766776          j=2
    767          IF (rdstorm.AND..NOT.activice) name_iaer(2) =
     777         IF (rdstorm.AND..NOT.activice.AND..NOT.slpwind) name_iaer(2) =
    768778     &                       "stormdust_doubleq" !! storm dust two-moment scheme
    769          IF (rdstorm.AND.water.AND.activice) name_iaer(3) =
    770      &                                             "stormdust_doubleq"
     779         IF (rdstorm.AND.water.AND.activice.AND..NOT.slpwind)
     780     &              name_iaer(3) = "stormdust_doubleq"
     781         IF (slpwind.AND..NOT.activice.AND..NOT.rdstorm) name_iaer(2) =
     782     &                       "topdust_doubleq" !! storm dust two-moment scheme
     783         IF (slpwind.AND.water.AND.activice.AND..NOT.rdstorm)
     784     &              name_iaer(3) =  "topdust_doubleq"
     785         IF (rdstorm.AND.slpwind.AND..NOT.activice) THEN
     786             name_iaer(2) = "stormdust_doubleq"
     787             name_iaer(3) = "topdust_doubleq"
     788         ENDIF
     789         IF (rdstorm.AND.slpwind.AND.water.AND.activice) THEN
     790             name_iaer(3) = "stormdust_doubleq"
     791             name_iaer(4) = "topdust_doubleq"
     792         ENDIF
    771793         IF (water.AND.activice) name_iaer(j) = "h2o_ice"      !! radiatively-active clouds
    772794         IF (submicron.AND.active) name_iaer(j) = "dust_submicron" !! JBM experimental stuff
  • trunk/LMDZ.MARS/libf/phymars/dimradmars_mod.F90

    r1974 r2199  
    3333                              ! particles
    3434  integer iaer_stormdust_doubleq ! Storm dust profile is given by the
     35                              ! mass mixing ratio of the two moment scheme
     36                              ! method (doubleq)
     37  integer iaer_topdust_doubleq ! top dust profile is given by the
    3538                              ! mass mixing ratio of the two moment scheme
    3639                              ! method (doubleq)
  • trunk/LMDZ.MARS/libf/phymars/dyn1d/testphys1d.F

    r2167 r2199  
    556556      zsig(1)=0.E+0
    557557      zgam(1)=0.E+0
    558       zthe(1)=0.E+0     
     558      zthe(1)=0.E+0
     559c
     560c  for the slope wind scheme
     561c  ---------------------------------
     562
    559563      hmons(1)=0.E+0
     564      PRINT *,'hmons is initialized to ',hmons(1)
    560565      summit(1)=0.E+0
     566      PRINT *,'summit is initialized to ',summit(1)
    561567      base(1)=0.E+0
    562      
     568c
     569c  Default values initializing the coefficients calculated later
     570c  ---------------------------------
     571
     572      tauscaling(1)=1. ! calculated in aeropacity_mod.F
     573      totcloudfrac(1)=1. ! calculated in watercloud_mod.F     
     574
    563575c   Specific initializations for "physiq"
    564576c   -------------------------------------
  • trunk/LMDZ.MARS/libf/phymars/initracer.F

    r1974 r2199  
    7272      igcm_stormdust_mass=0
    7373      igcm_stormdust_number=0
     74      igcm_topdust_mass=0
     75      igcm_topdust_number=0
    7476      igcm_co2=0
    7577      igcm_co=0
     
    161163          endif
    162164        enddo
    163       endif ! of if (rdstorm)     
     165      endif ! of if (rdstorm)
     166       if (slpwind) then
     167        do iq=1,nq
     168          if (noms(iq).eq."topdust_mass") then
     169            igcm_topdust_mass=iq
     170            count=count+1
     171          endif
     172          if (noms(iq).eq."topdust_number") then
     173            igcm_topdust_number=iq
     174            count=count+1
     175          endif
     176        enddo
     177      endif ! of if (slpwind)   
    164178      ! 2. find chemistry and water tracers
    165179      do iq=1,nq
     
    480494          radius(igcm_stormdust_number) = reff_storm
    481495        end if !(rdstorm)
     496!c ----------------------------------------------------------------------
     497!c slope wind scheme
     498!c you need a radius value for topdust to active its sedimentation
     499!c we take the same value as for the normal dust
     500        if (slpwind) then
     501          rho_q(igcm_topdust_mass)=rho_dust
     502          rho_q(igcm_topdust_number)=rho_dust
     503          radius(igcm_topdust_mass) = 3.e-6
     504          radius(igcm_topdust_number) = 3.e-6
     505        end if !(slpwind)
    482506!c ----------------------------------------------------------------------
    483507     
     
    676700           write(*,*) "  cannot use rdstorm option without ",
    677701     &                "a stormdust_number tracer !"
     702           stop
     703         endif
     704       endif
     705
     706       if (slpwind) then
     707       ! verify that we indeed have topdust_mass and topdust_number tracers
     708         if (igcm_topdust_mass.eq.0) then
     709           write(*,*) "initracer: error !!"
     710           write(*,*) "  cannot use slpwind option without ",
     711     &                "a topdust_mass tracer !"
     712           stop
     713         endif
     714         if (igcm_topdust_number.eq.0) then
     715           write(*,*) "initracer: error !!"
     716           write(*,*) "  cannot use slpwind option without ",
     717     &                "a topdust_number tracer !"
    678718           stop
    679719         endif
  • trunk/LMDZ.MARS/libf/phymars/phys_state_var_init_mod.F90

    r2162 r2199  
    4949      use rocketduststorm_mod, only: ini_rocketduststorm_mod, &
    5050                                     end_rocketduststorm_mod
     51      use topmons_mod, only: ini_topmons_mod, &
     52                             end_topmons_mod
    5153      use calchim_mod, only: ini_calchim_mod,end_calchim_mod
    5254      use watercloud_mod, only: ini_watercloud_mod, &
     
    120122      call end_rocketduststorm_mod
    121123      call ini_rocketduststorm_mod(ngrid)
    122      
     124
     125      ! allocate arrays in "topmons_mod":
     126      call end_topmons_mod
     127      call ini_topmons_mod(ngrid,nlayer)
     128
    123129      ! allocate arrays in "calchim_mod" (aeronomars)
    124130      call end_calchim_mod
  • trunk/LMDZ.MARS/libf/phymars/physiq_mod.F

    r2184 r2199  
    2424      use rocketduststorm_mod, only: rocketduststorm, dustliftday
    2525      use calcstormfract_mod, only: calcstormfract
     26      use topmons_mod, only: topmons,alpha_hmons
    2627      use tracer_mod, only: noms, mmol, igcm_co2, igcm_n2, igcm_co2_ice,
    2728     &                      igcm_co, igcm_o, igcm_h2o_vap, igcm_h2o_ice,
     
    3233     &                      nuice_ref, rho_ice, rho_dust, ref_r0,
    3334     &                      igcm_he, igcm_stormdust_mass,
    34      &                      igcm_stormdust_number
     35     &                      igcm_stormdust_number, igcm_topdust_mass,
     36     &                      igcm_topdust_number
    3537      use comsoil_h, only: inertiedat, ! soil thermal inertia
    3638     &                     tsoil, nsoilmx ! number of subsurface layers
     
    275277                                    !            - in a mesh with stormdust and background dust (false)
    276278                                    !            - in a mesh with background dust only (true)
     279c     entrainment by slope winds
     280      logical nohmons               ! nohmons used to calculate twice the radiative
     281                                    ! transfer when slpwind is active :
     282                                    !            - in a mesh with topdust and background dust (false)
     283                                    !            - in a mesh with background dust only (true)
    277284     
    278285      real,parameter :: odpref=610. ! DOD reference pressure (Pa)
     
    348355      real rdust(ngrid,nlayer) ! dust geometric mean radius (m)
    349356      real rstormdust(ngrid,nlayer) ! stormdust geometric mean radius (m)
     357      real rtopdust(ngrid,nlayer)   ! topdust geometric mean radius (m)
    350358      integer igmin, lmin
    351359      logical tdiag
     
    390398      REAL rdsndust(ngrid,nlayer) ! true n stormdust (kg/kg)
    391399      REAL rdsqdust(ngrid,nlayer) ! true q stormdust (kg/kg)
    392       REAL wspeed(ngrid,nlayer+1) ! vertical speed tracer stormdust
     400      REAL wspeed(ngrid,nlayer+1) ! vertical velocity stormdust tracer
    393401      REAL dsodust(ngrid,nlayer)
    394402      REAL dsords(ngrid,nlayer)
     403      REAL wtop(ngrid,nlayer+1) ! vertical velocity topdust tracer
    395404
    396405      REAL nccnco2(ngrid,nlayer)   ! true n ccnco2 (kg/kg)
     
    456465      real tf_clf, ntf_clf ! tf: fraction of clouds, ntf: fraction without clouds
    457466      real rave2(ngrid), totrave2(ngrid) ! Mean water ice mean radius (m)
     467
     468c entrainment by slope winds above sb-grid scale topography
     469      REAL pdqtop(ngrid,nlayer,nq) ! tendency for dust after topmons
     470      REAL hmax,hmin
     471      REAL hsummit(ngrid)
    458472
    459473c=======================================================================
     
    593607         endif
    594608#endif
    595                    
     609
     610c        Initialize mountain mesh fraction for the entrainment by slope wind param.
     611c        ~~~~~~~~~~~~~~~
     612        if (slpwind) then
     613          !! alpha_hmons calculation
     614          if (ngrid.gt.1) then
     615            call planetwide_maxval(hmons,hmax )
     616            call planetwide_minval(hmons,hmin )
     617            do ig=1,ngrid
     618              alpha_hmons(ig)= 0.5*(hmons(ig)-hmin)/(hmax-hmin)
     619            enddo
     620          else
     621            hmin=0.
     622            hmax=23162.1 !set here the height of the sub-grid scaled topography
     623            do ig=1,ngrid               
     624              alpha_hmons(ig)= (hmons(ig)-hmin)/(hmax-hmin) !0.1*(hmons(ig)-hmin)/(hmax-hmin)
     625              print*,"1D, hmons=",hmons(ig),"alpha=",alpha_hmons(ig)
     626            enddo
     627          endif ! (ngrid.gt.1)
     628        endif ! if (slpwind)
     629                 
    596630      ENDIF        !  (end of "if firstcall")
    597631
     
    785819           ! callradite for background dust
    786820           clearatm=.true.
     821           !! callradite for background dust in the case of slope wind entrainment
     822           nohmons=.true.
    787823c          Radiative transfer
    788824c          ------------------
     
    793829     &     zdtlw,zdtsw,fluxsurf_lw,fluxsurf_sw,fluxtop_lw,
    794830     &     fluxtop_sw,tauref,tau,aerosol,dsodust,tauscaling,
    795      &     taucloudtes,rdust,rice,nuice,co2ice,rstormdust,
    796      &     totstormfract,clearatm,dsords,
     831     &     taucloudtes,rdust,rice,nuice,co2ice,rstormdust,rtopdust,
     832     &     totstormfract,clearatm,dsords,alpha_hmons,nohmons,
    797833     &     clearsky,totcloudfrac)
    798834
     
    809845     &              fluxsurf_swclf,fluxtop_lwclf,fluxtop_swclf,tauref,
    810846     &              tau,aerosol,dsodust,tauscaling,taucloudtesclf,rdust,
    811      &              rice,nuice,co2ice,rstormdust,totstormfract,
    812      &              clearatm,dsords,clearsky,totcloudfrac)
     847     &              rice,nuice,co2ice,rstormdust,rtopdust,totstormfract,
     848     &              clearatm,dsords,alpha_hmons,nohmons,
     849     &              clearsky,totcloudfrac)
    813850               clearsky = .false.  ! just in case.
    814851               ! Sum the fluxes and heating rates from cloudy/clear
     
    839876            ENDIF ! (CLFvarying)
    840877           
    841            ! Dustinjection
    842            if (dustinjection.gt.0) then
    843              CALL compute_dtau(ngrid,nlayer,
    844      &                          zday,pplev,tauref,
    845      &                          ptimestep,dustliftday,local_time)
    846            endif
     878!           ! Dustinjection
     879!           if (dustinjection.gt.0) then
     880!             CALL compute_dtau(ngrid,nlayer,
     881!     &                         zday,pplev,tauref,
     882!     &                         ptimestep,dustliftday,local_time)
     883!           endif
    847884c============================================================================
    848885           
     
    9691006      ENDIF ! of IF (callrad)
    9701007
    971 c     3. Rocket dust storm
     1008c     3.1 Rocket dust storm
    9721009c    -------------------------------------------
    9731010      IF (rdstorm) THEN
     
    10031040c               input sub-grid scale cloud
    10041041     &                      clearsky,totcloudfrac,
     1042c               input sub-grid scale topography
     1043     &                      nohmons,alpha_hmons,
    10051044c               output
    1006      &                      pdqrds,wspeed,dsodust,dsords)
     1045     &                      pdqrds,wspeed,dsodust,dsords,
     1046     &                      tauref)
    10071047                   
    10081048c      update the tendencies of both dust after vertical transport
     
    10481088
    10491089      ENDIF ! end of if(rdstorm)
     1090
     1091c     3.2 Dust entrained from the PBL up to the top of sub-grid scale topography
     1092c    -------------------------------------------
     1093      IF (slpwind) THEN
     1094         if (ngrid.gt.1) then
     1095           hsummit(:)=summit(:)-phisfi(:)/g
     1096         else
     1097           hsummit(:)=14000.
     1098         endif
     1099         nohmons=.false.
     1100         pdqtop(:,:,:)=0. 
     1101         CALL topmons(ngrid,nlayer,nq,ptime,ptimestep,
     1102     &                pq,pdq,pt,pdt,zplev,zplay,zzlev,
     1103     &                zzlay,zdtsw,zdtlw,
     1104     &                icount,zday,zls,tsurf,igout,aerosol,
     1105     &                totstormfract,clearatm,dsords,
     1106     &                clearsky,totcloudfrac,
     1107     &                nohmons,hsummit,
     1108     &                pdqtop,wtop,dsodust,
     1109     &                tauref)
     1110     
     1111                   
     1112c      update the tendencies of both dust after vertical transport
     1113         DO l=1,nlayer
     1114          DO ig=1,ngrid
     1115           pdq(ig,l,igcm_topdust_mass)=
     1116     & pdq(ig,l,igcm_topdust_mass)+
     1117     &                      pdqtop(ig,l,igcm_topdust_mass)
     1118           pdq(ig,l,igcm_topdust_number)=
     1119     & pdq(ig,l,igcm_topdust_number)+
     1120     &                      pdqtop(ig,l,igcm_topdust_number)
     1121           pdq(ig,l,igcm_dust_mass)=
     1122     & pdq(ig,l,igcm_dust_mass)+ pdqtop(ig,l,igcm_dust_mass)
     1123           pdq(ig,l,igcm_dust_number)=
     1124     & pdq(ig,l,igcm_dust_number)+pdqtop(ig,l,igcm_dust_number)
     1125
     1126          ENDDO
     1127         ENDDO
     1128
     1129      ENDIF ! end of if (slpwind)
     1130
     1131c     3.3 Dust injection from the surface
     1132c    -------------------------------------------
     1133           if (dustinjection.gt.0) then
     1134             CALL compute_dtau(ngrid,nlayer,
     1135     &                          zday,pplev,tauref,
     1136     &                          ptimestep,dustliftday,local_time)
     1137           endif ! end of if (dustinjection.gt.0)
    10501138
    10511139c-----------------------------------------------------------------------
     
    15511639c Zdqssed isn't
    15521640           call callsedim(ngrid,nlayer,ptimestep,
    1553      &                zplev,zzlev,zzlay,pt,pdt,rdust,rstormdust,
     1641     &                zplev,zzlev,zzlay,pt,pdt,
     1642     &                rdust,rstormdust,rtopdust,
    15541643     &                rice,rsedcloud,rhocloud,
    15551644     &                pq,pdq,zdqsed,zdqssed,nq,
  • trunk/LMDZ.MARS/libf/phymars/rocketduststorm_mod.F90

    r2160 r2199  
    2626!             input sub-grid scale cloud
    2727                                 clearsky,totcloudfrac,                &
     28!             input sub-grid scale topography
     29                                 nohmons,alpha_hmons,                  &
    2830!             output
    29                                  pdqrds,wrad,dsodust,dsords)
     31                                 pdqrds,wrad,dsodust,dsords,           &
     32                                 tauref)
    3033
    3134      USE tracer_mod, only: igcm_stormdust_mass,igcm_stormdust_number &
     
    7578!     sbgrid scale water ice clouds
    7679      logical, intent(in) :: clearsky
    77       real, intent(in) :: totcloudfrac(ngrid)     
     80      real, intent(in) :: totcloudfrac(ngrid)
     81
     82!     sbgrid scale topography
     83      LOGICAL, INTENT(IN) :: nohmons
     84      REAL, INTENT(IN) :: alpha_hmons(ngrid)   
    7885 
    7986!--------------------------------------------------------
     
    8592      REAL, INTENT(OUT) :: dsodust(ngrid,nlayer) ! density scaled opacity of env. dust
    8693      REAL, INTENT(OUT) :: dsords(ngrid,nlayer) ! density scaled opacity of storm dust
     94      REAL, INTENT(OUT) :: tauref(ngrid)
    8795
    8896!--------------------------------------------------------
     
    146154      REAL  fluxtop_lw1(ngrid)
    147155      REAL  fluxtop_sw1(ngrid,2)
    148       REAL  tauref(ngrid)
    149156      REAL  tau(ngrid,naerkind)
    150157      REAL  aerosol(ngrid,nlayer,naerkind)
     
    153160      REAL  rdust(ngrid,nlayer)
    154161      REAL  rstormdust(ngrid,nlayer)
     162      REAL  rtopdust(ngrid,nlayer)
    155163      REAL  rice(ngrid,nlayer)
    156164      REAL  nuice(ngrid,nlayer)
     
    229237      ! 1. Call the second radiative transfer for stormdust, obtain the extra heating
    230238      ! *********************************************************************
    231       CALL callradite(icount,ngrid,nlayer,nq,zday,zls,pq,albedo,       &
    232                  emis,mu0,pplev,pplay,pt,tsurf,fract,dist_sol,igout,   &
    233                  zdtlw1,zdtsw1,fluxsurf_lw1,fluxsurf_sw1,fluxtop_lw1,  &
    234                  fluxtop_sw1,tauref,tau,aerosol,dsodust,tauscaling,    &
    235                  taucloudtes,rdust,rice,nuice,co2ice,rstormdust,      &
    236                  totstormfract,clearatm,dsords,                 &
     239      CALL callradite(icount,ngrid,nlayer,nq,zday,zls,pq,albedo,          &
     240                 emis,mu0,pplev,pplay,pt,tsurf,fract,dist_sol,igout,      &
     241                 zdtlw1,zdtsw1,fluxsurf_lw1,fluxsurf_sw1,fluxtop_lw1,     &
     242                 fluxtop_sw1,tauref,tau,aerosol,dsodust,tauscaling,       &
     243                 taucloudtes,rdust,rice,nuice,co2ice,rstormdust,rtopdust, &
     244                 totstormfract,clearatm,dsords,alpha_hmons,nohmons,       &
    237245                 clearsky,totcloudfrac)
    238246
  • trunk/LMDZ.MARS/libf/phymars/suaer.F90

    r1974 r2199  
    66                    iaer_dust_conrath,iaer_dust_doubleq,&
    77                    iaer_dust_submicron,iaer_h2o_ice,&
    8                     iaer_stormdust_doubleq,&
     8                    iaer_stormdust_doubleq,iaer_topdust_doubleq,&
    99                    file_id,radiustab, gvis, omegavis, &
    1010                    QVISsQREF, gIR, omegaIR, &
     
    156156!==================================================================
    157157        CASE("stormdust_doubleq") aerkind   ! Two-moment scheme for stormdust - radiative properties
     158!==================================================================
     159!       Visible domain:
     160        file_id(iaer,1) = 'optprop_dustvis_TM_n50.dat' !T-Matrix
     161!       Infrared domain:
     162        file_id(iaer,2) = 'optprop_dustir_n50.dat'     !Mie
     163!       Reference wavelength in the visible:
     164        longrefvis(iaer)=0.67E-6
     165!       If not equal to 0.67e-6 -> change readtesassim accordingly;
     166!       Reference wavelength in the infrared:
     167        longrefir(iaer)=dustrefir
     168!==================================================================
     169        CASE("topdust_doubleq") aerkind   ! Two-moment scheme for topdust - radiative properties
    158170!==================================================================
    159171!       Visible domain:
  • trunk/LMDZ.MARS/libf/phymars/tracer_mod.F90

    r1974 r2199  
    4444      integer,save :: igcm_stormdust_mass   !  storm dust mass mixing ratio
    4545      integer,save :: igcm_stormdust_number !  storm dust number mixing ratio
    46    
     46      integer,save :: igcm_topdust_mass   !  topdust mass mixing ratio
     47      integer,save :: igcm_topdust_number !  topdust number mixing ratio
     48
    4749      integer,save :: igcm_ccnco2_mass   ! CCN (dust and/or water ice) for CO2 mass mixing ratio
    4850      integer,save :: igcm_ccnco2_number ! CCN (dust and/or water ice) for CO2 number mixing ratio
  • trunk/LMDZ.MARS/libf/phymars/updatereffrad_mod.F

    r1974 r2199  
    66     
    77      SUBROUTINE updatereffrad(ngrid,nlayer,
    8      &                rdust,rstormdust,rice,nuice,
     8     &                rdust,rstormdust,rtopdust,rice,nuice,
    99     &                reffrad,nueffrad,
    1010     &                pq,tauscaling,tau,pplay)
     
    1515     &                       igcm_ccn_number, nuice_ref, varian,
    1616     &                       ref_r0, igcm_dust_submicron,
    17      &                       igcm_stormdust_mass,igcm_stormdust_number
     17     &                       igcm_stormdust_mass,igcm_stormdust_number,
     18     &                       igcm_topdust_mass,igcm_topdust_number
    1819       USE dimradmars_mod, only: nueffdust,naerkind,
    1920     &            name_iaer,
    2021     &            iaer_dust_conrath,iaer_dust_doubleq,
    2122     &            iaer_dust_submicron,iaer_h2o_ice,
    22      &            iaer_stormdust_doubleq
     23     &            iaer_stormdust_doubleq,iaer_topdust_doubleq
    2324
    2425       IMPLICIT NONE
     
    5859      REAL, INTENT(in) :: pq(ngrid,nlayer,nqmx)
    5960      REAL, INTENT(out) :: rdust(ngrid,nlayer) ! Dust geometric mean radius (m)
    60       REAL, INTENT(out) :: rstormdust(ngrid,nlayer) ! Dust geometric mean radius (m)
     61      REAL, INTENT(out) :: rstormdust(ngrid,nlayer) ! Dust geometric mean radius (m)   
     62      REAL, INTENT(out) :: rtopdust(ngrid,nlayer) ! Dust geometric mean radius (m)
    6163      REAL, INTENT(in) :: pplay(ngrid,nlayer) ! altitude at the middle of the layers
    6264      REAL, INTENT(in) :: tau(ngrid,naerkind)
     
    118120              call updaterdust(pq(ig,l,igcm_stormdust_mass),
    119121     &                 pq(ig,l,igcm_stormdust_number),rstormdust(ig,l))
     122              nueffdust(ig,l) = exp(varian**2.)-1.
     123             ENDDO
     124           ENDDO
     125        ENDIF
     126
     127        ! updating radius of topdust particles
     128        IF (slpwind.AND.active) THEN
     129          DO l=1,nlayer
     130            DO ig=1, ngrid
     131              call updaterdust(pq(ig,l,igcm_topdust_mass),
     132     &                 pq(ig,l,igcm_topdust_number),rtopdust(ig,l))
    120133              nueffdust(ig,l) = exp(varian**2.)-1.
    121134             ENDDO
     
    224237          ENDDO
    225238c==================================================================
     239        CASE("topdust_doubleq") aerkind! MV18: Two-moment scheme for
     240c       topdust; same distribution than normal dust
     241c==================================================================
     242          DO l=1,nlayer
     243            DO ig=1,ngrid
     244              reffrad(ig,l,iaer) = rtopdust(ig,l) * ref_r0
     245              nueffrad(ig,l,iaer) = nueffdust(ig,l)
     246            ENDDO
     247          ENDDO
     248c==================================================================
    226249        END SELECT aerkind
    227250      ENDDO ! iaer (loop on aerosol kind)
Note: See TracChangeset for help on using the changeset viewer.