Ignore:
Timestamp:
Jul 18, 2018, 4:48:34 PM (6 years ago)
Author:
mvals
Message:

Mars GCM:
Integration of the detached dust layer parametrizations (rocket dust storm, slope wind lifting, CW, and dust injection scheme, DB).
Still experimental, default behaviour (rdstorm=.false., dustinjection=0) identical to previous revision.
NB: Updated newstart requires an updated "surface.nc" containing the "hmons" field.
EM+MV

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.MARS/libf/phymars/aeropacity_mod.F

    r1861 r1974  
    77      SUBROUTINE aeropacity(ngrid,nlayer,nq,zday,pplay,pplev,ls,
    88     &    pq,tauscaling,tauref,tau,taucloudtes,aerosol,dsodust,reffrad,
    9      &    nueffrad,QREFvis3d,QREFir3d,omegaREFvis3d,omegaREFir3d,
     9     &    QREFvis3d,QREFir3d,omegaREFir3d,
     10     &    totstormfract,clearatm,dsords,
    1011     &    clearsky,totcloudfrac)
    11                                                    
     12                                                        
    1213! to use  'getin'
    1314      USE ioipsl_getincom, only: getin
    1415      use tracer_mod, only: noms, igcm_h2o_ice, igcm_dust_mass,
    1516     &                      igcm_dust_submicron, rho_dust, rho_ice,
    16      &                      nqdust
     17     &                      nqdust, igcm_stormdust_mass
    1718      use geometry_mod, only: latitude ! grid point latitudes (rad)
    1819      use comgeomfi_h, only: sinlat ! sines of grid point latitudes
     
    2627     &            iaerdust,tauvis,
    2728     &            iaer_dust_conrath,iaer_dust_doubleq,
    28      &            iaer_dust_submicron,iaer_h2o_ice
     29     &            iaer_dust_submicron,iaer_h2o_ice,
     30     &            iaer_stormdust_doubleq
     31      USE calcstormfract_mod
    2932       IMPLICIT NONE
    3033c=======================================================================
     
    5659c   QREFvis3d(ngrid,nlayer,naerkind) \ 3d extinction coefficients
    5760c   QREFir3d(ngrid,nlayer,naerkind)  / at reference wavelengths;
    58 c   omegaREFvis3d(ngrid,nlayer,naerkind) \ 3d single scat. albedo
    5961c   omegaREFir3d(ngrid,nlayer,naerkind)  / at reference wavelengths;
    6062c
     
    6567c   aerosol      aerosol(ig,l,1) is the dust optical
    6668c                depth in layer l, grid point ig
    67 
     69c   taualldust   CW17 total opacity for all dust scatterer stormdust included
    6870c
    6971c=======================================================================
    70 #include "callkeys.h"
     72      include "callkeys.h"
    7173
    7274c-----------------------------------------------------------------------
     
    7779c    Input/Output
    7880c    ------------
    79       INTEGER ngrid,nlayer,nq
    80 
    81       REAL ls,zday,expfactor   
    82       REAL pplev(ngrid,nlayer+1),pplay(ngrid,nlayer)
    83       REAL pq(ngrid,nlayer,nq)
    84       REAL tauref(ngrid), tau(ngrid,naerkind)
    85       REAL aerosol(ngrid,nlayer,naerkind)
    86       REAL dsodust(ngrid,nlayer)
    87       REAL reffrad(ngrid,nlayer,naerkind)
    88       REAL nueffrad(ngrid,nlayer,naerkind)
    89       REAL QREFvis3d(ngrid,nlayer,naerkind)
    90       REAL QREFir3d(ngrid,nlayer,naerkind)
    91       REAL omegaREFvis3d(ngrid,nlayer,naerkind)
    92       REAL omegaREFir3d(ngrid,nlayer,naerkind)
    93       real,intent(in) :: totcloudfrac(ngrid) ! total cloud fraction
    94       logical,intent(in) :: clearsky ! true for part without clouds,
    95                                      ! false for part with clouds (total or sub-grid clouds)
    96       real :: CLFtot ! total cloud fraction
     81      INTEGER, INTENT(IN) :: ngrid,nlayer,nq
     82      REAL, INTENT(IN) :: ls,zday
     83      REAL, INTENT(IN) ::  pplev(ngrid,nlayer+1),pplay(ngrid,nlayer)
     84      REAL, INTENT(IN) ::  pq(ngrid,nlayer,nq)
     85      REAL, INTENT(OUT) :: tauref(ngrid)
     86      REAL, INTENT(OUT) :: tau(ngrid,naerkind)
     87      REAL, INTENT(OUT) :: aerosol(ngrid,nlayer,naerkind)
     88      REAL, INTENT(OUT) :: dsodust(ngrid,nlayer)
     89      REAL, INTENT(OUT) ::  dsords(ngrid,nlayer) !dso of stormdust 
     90      REAL, INTENT(INOUT) :: reffrad(ngrid,nlayer,naerkind)
     91      REAL, INTENT(IN) :: QREFvis3d(ngrid,nlayer,naerkind)
     92      REAL, INTENT(IN) :: QREFir3d(ngrid,nlayer,naerkind)
     93      REAL, INTENT(IN) ::  omegaREFir3d(ngrid,nlayer,naerkind)
     94      LOGICAL, INTENT(IN) :: clearatm
     95      REAL, INTENT(IN) :: totstormfract(ngrid)
     96      REAL, INTENT(OUT) ::  tauscaling(ngrid) ! Scaling factor for qdust and Ndust
     97      REAL,INTENT(IN) :: totcloudfrac(ngrid) ! total cloud fraction
     98      LOGICAL,INTENT(IN) :: clearsky ! true for part without clouds,false for part with clouds (total or sub-grid clouds)
    9799c
    98100c    Local variables :
    99101c    -----------------
     102      REAL CLFtot ! total cloud fraction
     103      real expfactor
    100104      INTEGER l,ig,iq,i,j
    101105      INTEGER iaer           ! Aerosol index
     
    110114c       for dust or water ice particles in the radiative transfer
    111115c       (see callradite.F for more information).
    112       REAL taudusttmp(ngrid)! Temporary dust opacity
    113                                !   used before scaling
    114       REAL tauscaling(ngrid) ! Scaling factor for qdust and Ndust
     116      REAL taudusttmp(ngrid)! Temporary dust opacity used before scaling
     117      REAL taubackdusttmp(ngrid)! Temporary background dust opacity used before scaling
     118      REAL taualldust(ngrid)! dust opacity all dust
     119      REAL taudust(ngrid)! dust opacity dust doubleq
     120      REAL taustormdust(ngrid)! dust opacity stormdust doubleq
     121      REAL taustormdusttmp(ngrid)! dust opacity stormdust doubleq before tauscaling
    115122      REAL taudustvis(ngrid) ! Dust opacity after scaling
    116123      REAL taudusttes(ngrid) ! Dust opacity at IR ref. wav. as
     
    157164
    158165      tau(1:ngrid,1:naerkind)=0
     166      dsords(:,:)=0. !CW17: initialize dsords
     167      dsodust(:,:)=0.
    159168
    160169! identify tracers
     
    166175        DO iaer=1,naerkind
    167176          txt=name_iaer(iaer)
    168           IF (txt(1:4).eq."dust") THEN
     177        ! CW17: choice tauscaling for stormdust or not
     178          IF ((txt(1:4).eq."dust").OR.(txt(1:5).eq."storm")) THEN
    169179            naerdust=naerdust+1
    170180            iaerdust(naerdust)=iaer
     
    213223        call getin("tauvis",tauvis)
    214224
    215         IF (freedust) THEN
     225        IF (freedust.or.rdstorm) THEN ! if rdstorm no need to held opacity constant at the first levels
    216226          cstdustlevel = 1
    217227        ELSE
    218           cstdustlevel = cstdustlevel0
     228          cstdustlevel = cstdustlevel0 !Opacity in the first levels is held constant to
     229                                       !avoid unrealistic values due to constant lifting
    219230        ENDIF
    220231
     
    374385     &          ( pplev(ig,l) - pplev(ig,l+1) ) / g
    375386                ! DENSITY SCALED OPACITY IN INFRARED:
    376                 dsodust(ig,l) =
    377      &          (  0.75 * QREFir3d(ig,cstdustlevel,iaer) /
    378      &          ( rho_dust * reffrad(ig,cstdustlevel,iaer) )  ) *
    379      &          pq(ig,cstdustlevel,igcm_dust_mass)
     387!                dsodust(ig,l) =
     388!     &          (  0.75 * QREFir3d(ig,cstdustlevel,iaer) /
     389!     &          ( rho_dust * reffrad(ig,cstdustlevel,iaer) )  ) *
     390!     &          pq(ig,cstdustlevel,igcm_dust_mass)
    380391              ENDDO
    381392            ELSE
     
    387398     &          ( pplev(ig,l) - pplev(ig,l+1) ) / g
    388399                ! DENSITY SCALED OPACITY IN INFRARED:
    389                 dsodust(ig,l) =
    390      &          (  0.75 * QREFir3d(ig,l,iaer) /
    391      &          ( rho_dust * reffrad(ig,l,iaer) )  ) *
    392      &          pq(ig,l,igcm_dust_mass)
     400!                dsodust(ig,l) =
     401!     &          (  0.75 * QREFir3d(ig,l,iaer) /
     402!     &          ( rho_dust * reffrad(ig,l,iaer) )  ) *
     403!     &          pq(ig,l,igcm_dust_mass)
    393404              ENDDO
    394405            ENDIF
     
    473484        ENDIF ! end (clearsky)
    474485
    475 c       3. Outputs -- Now done in physiq.F
    476 !        IF (ngrid.NE.1) THEN
    477 !          CALL WRITEDIAGFI(ngrid,'tauVIS','tauext VIS refwvl',
    478 !     &      ' ',2,taucloudvis)
    479 !          CALL WRITEDIAGFI(ngrid,'tauTES','tauabs IR refwvl',
    480 !     &      ' ',2,taucloudtes)
    481 !          IF (callstats) THEN
    482 !            CALL wstats(ngrid,'tauVIS','tauext VIS refwvl',
    483 !     &        ' ',2,taucloudvis)
    484 !            CALL wstats(ngrid,'tauTES','tauabs IR refwvl',
    485 !     &        ' ',2,taucloudtes)
    486 !          ENDIF
    487 !        ELSE
    488 !         CALL writeg1d(ngrid,1,taucloudtes,'tautes','NU')
    489 !        ENDIF
     486c==================================================================
     487        CASE("stormdust_doubleq") aerkind ! CW17 : Two-moment scheme for
     488c       stormdust  (transport of mass and number mixing ratio)
     489c==================================================================
     490c       aerosol is calculated twice : once within the dust storm (clearatm=false)
     491c       and once in the part of the mesh without dust storm (clearatm=true)
     492        aerosol(1:ngrid,1:nlayer,iaer) = 0.
     493        IF (clearatm) THEN  ! considering part of the mesh without storm
     494          aerosol(1:ngrid,1:nlayer,iaer)=1.e-25
     495        ELSE  ! part of the mesh with concentred dust storm
     496          DO l=1,nlayer
     497             IF (l.LE.cstdustlevel) THEN
     498c          Opacity in the first levels is held constant to
     499c           avoid unrealistic values due to constant lifting:
     500               DO ig=1,ngrid
     501                  aerosol(ig,l,iaer) =
     502     &           (  0.75 * QREFvis3d(ig,cstdustlevel,iaer) /
     503     &           ( rho_dust * reffrad(ig,cstdustlevel,iaer) )  ) *
     504     &           pq(ig,cstdustlevel,igcm_stormdust_mass) *
     505     &           ( pplev(ig,l) - pplev(ig,l+1) ) / g
     506               ENDDO
     507             ELSE
     508              DO ig=1,ngrid
     509                 aerosol(ig,l,iaer) =
     510     &           (  0.75 * QREFvis3d(ig,l,iaer) /
     511     &           ( rho_dust * reffrad(ig,l,iaer) )  ) *
     512     &           pq(ig,l,igcm_stormdust_mass) *
     513     &           ( pplev(ig,l) - pplev(ig,l+1) ) / g
     514              ENDDO
     515             ENDIF
     516          ENDDO
     517        ENDIF
    490518c==================================================================
    491519        END SELECT aerkind
     
    498526c   is originally scaled to an equivalent odpref Pa pressure surface.
    499527c -----------------------------------------------------------------
     528
    500529
    501530#ifdef DUSTSTORM
     
    640669      IF (freedust) THEN
    641670          tauscaling(:) = 1.
    642 
     671c        opacity obtained with stormdust
     672        IF (rdstorm) THEN
     673           taustormdusttmp(1:ngrid)=0.
     674           DO l=1,nlayer
     675             DO ig=1,ngrid
     676                taustormdusttmp(ig) = taustormdusttmp(ig)+
     677     &            aerosol(ig,l,iaerdust(2))
     678             ENDDO
     679           ENDDO
     680           !opacity obtained with background dust only
     681           taubackdusttmp(1:ngrid)=0. 
     682           DO l=1,nlayer
     683             DO ig=1,ngrid
     684                taubackdusttmp(ig) = taubackdusttmp(ig)+
     685     &           aerosol(ig,l,iaerdust(1))
     686             ENDDO
     687           ENDDO
     688        ENDIF !rdsstorm
    643689      ELSE
    644690c       Temporary scaling factor
     
    669715     &                aerosol(ig,l,iaerdust(iaer))* tauscaling(ig))
    670716          ENDDO
    671         ENDDO
    672       ENDDO
    673 
    674       DO l=1,nlayer
    675         DO ig=1,ngrid
    676           dsodust(ig,l) = max(1E-20,dsodust(ig,l)* tauscaling(ig))
    677717        ENDDO
    678718      ENDDO
     
    700740        tauref(:) = tauref(:) * odpref / pplev(:,1)
    701741      ENDIF
    702      
    703 c output for debug
    704 c        IF (ngrid.NE.1) THEN
    705 c             CALL WRITEDIAGFI(ngrid,'taudusttmp','virtual tau dust',
    706 c     &      '#',2,taudusttmp)
    707 c             CALL WRITEDIAGFI(ngrid,'tausca','tauscaling',
    708 c     &      '#',2,tauscaling)
    709 c        ELSE
    710 c             CALL WRITEDIAGFI(ngrid,'taudusttmp','virtual tau dust',
    711 c     &      '#',0,taudusttmp)
    712 c             CALL WRITEDIAGFI(ngrid,'tausca','tauscaling',
    713 c     &      '#',0,tauscaling)
    714 c        ENDIF
     742
    715743c -----------------------------------------------------------------
    716744c Column integrated visible optical depth in each point
     
    724752      ENDDO
    725753
     754c     for diagnostics: opacity for all dust scatterers stormdust included
     755      taualldust(1:ngrid)=0.
     756      DO iaer=1,naerdust
     757        DO l=1,nlayer
     758          DO ig=1,ngrid
     759            taualldust(ig) = taualldust(ig) +
     760     &                         aerosol(ig,l,iaerdust(iaer))
     761          ENDDO
     762        ENDDO
     763      ENDDO
     764     
     765      IF (rdstorm) THEN
     766 
     767c     for diagnostics: opacity for dust in background only 
     768       taudust(1:ngrid)=0.
     769        DO l=1,nlayer
     770         DO ig=1,ngrid
     771           taudust(ig) = taudust(ig) +
     772     &                       aerosol(ig,l,iaer_dust_doubleq)
     773         ENDDO
     774        ENDDO
     775
     776c     for diagnostics: opacity for dust in storm only 
     777       taustormdust(1:ngrid)=0.
     778        DO l=1,nlayer
     779         DO ig=1,ngrid
     780           taustormdust(ig) = taustormdust(ig) +
     781     &                       aerosol(ig,l,iaer_stormdust_doubleq)
     782         ENDDO
     783        ENDDO
     784 
     785      ENDIF
     786     
     787
    726788#ifdef DUSTSTORM
    727789      IF (firstcall) THEN
     
    733795c Density scaled opacity and column opacity output
    734796c -----------------------------------------------------------------
    735 c      dsodust(1:ngrid,1:nlayer) = 0.
    736 c      DO iaer=1,naerdust
    737 c        DO l=1,nlayer
    738 c          DO ig=1,ngrid
    739 c            dsodust(ig,l) = dsodust(ig,l) +
    740 c     &                      aerosol(ig,l,iaerdust(iaer)) * g /
    741 c     &                      (pplev(ig,l) - pplev(ig,l+1))
    742 c          ENDDO
    743 c        ENDDO
    744 c        IF (ngrid.NE.1) THEN
    745 c          write(txt2,'(i1.1)') iaer
    746 c          call WRITEDIAGFI(ngrid,'taudust'//txt2,
    747 c     &                    'Dust col opacity',
    748 c     &                    ' ',2,tau(1,iaerdust(iaer)))
    749 c          IF (callstats) THEN
    750 c            CALL wstats(ngrid,'taudust'//txt2,
    751 c     &                 'Dust col opacity',
    752 c     &                 ' ',2,tau(1,iaerdust(iaer)))
    753 c          ENDIF
    754 c        ENDIF
    755 c      ENDDO
    756 
    757 c      IF (ngrid.NE.1) THEN
    758 c       CALL WRITEDIAGFI(ngrid,'dsodust','tau*g/dp',
    759 c    &                    'm2.kg-1',3,dsodust)
    760 c        IF (callstats) THEN
    761 c          CALL wstats(ngrid,'dsodust',
    762 c     &               'tau*g/dp',
    763 c     &               'm2.kg-1',3,dsodust)
    764 c        ENDIF
    765 c      ELSE
    766 c        CALL WRITEDIAGFI(ngrid,"dsodust","dsodust","m2.kg-1",1,
    767 c     &                   dsodust)
    768 c      ENDIF ! of IF (ngrid.NE.1)
    769 c -----------------------------------------------------------------
     797          IF (rdstorm) then
     798            DO l=1,nlayer
     799              IF (l.LE.cstdustlevel) THEN
     800                DO ig=1,ngrid
     801                  dsodust(ig,l)=dsodust(ig,l) +
     802     &                      aerosol(ig,l,iaer_dust_doubleq) * g /
     803     &                      (pplev(ig,l) - pplev(ig,l+1))
     804
     805                  dsords(ig,l) = dsords(ig,l) +
     806     &              aerosol(ig,l,iaer_stormdust_doubleq)* g/
     807     &              (pplev(ig,l) - pplev(ig,l+1))
     808                ENDDO
     809              ELSE
     810                DO ig=1,ngrid
     811                  dsodust(ig,l) =dsodust(ig,l) +
     812     &                      aerosol(ig,l,iaer_dust_doubleq) * g /
     813     &                      (pplev(ig,l) - pplev(ig,l+1))
     814                   dsords(ig,l) = dsords(ig,l) +
     815     &                        aerosol(ig,l,iaer_stormdust_doubleq)* g/
     816     &                        (pplev(ig,l) - pplev(ig,l+1))
     817                ENDDO
     818              ENDIF
     819            ENDDO
     820          ENDIF
     821
     822c -----------------------------------------------------------------
     823c -----------------------------------------------------------------
     824c aerosol/X for stormdust to prepare calculation of radiative transfer
     825c -----------------------------------------------------------------
     826      if (rdstorm) then
     827         DO l=1,nlayer
     828           DO ig=1,ngrid
     829               aerosol(ig,l,iaer_stormdust_doubleq) =
     830     &           aerosol(ig,l,iaer_stormdust_doubleq)/totstormfract(ig)
     831           ENDDO
     832         ENDDO
     833      endif
     834
    770835
    771836      END SUBROUTINE aeropacity
Note: See TracChangeset for help on using the changeset viewer.