Ignore:
Timestamp:
May 19, 2023, 12:49:25 PM (19 months ago)
Author:
jnaar
Message:

Architecture changes in watercloud_mod, improvedclouds_mod in preparation for adaptative timestep of clouds (not yet implemented). Changes prevent bit by bit correspondance with previous revision. "simpleclouds" routine broken.

File:
1 edited

Legend:

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

    r2934 r2966  
    2727     &                      qperemin
    2828      use dimradmars_mod, only: naerkind
     29      use conc_mod, only: mmean
    2930      use write_output_mod, only: write_output
    3031      IMPLICIT NONE
     
    4546c
    4647c  2004 - 2012
     48c
     49c     2023: J. Naar, adding different subtimestep on each grid cell
     50c          plus not doing microphysics if no water present
     51c          plus simpleclouds no longer in the loop for microphysics
    4752c=======================================================================
    4853
     
    105110
    106111      ! global tendency (clouds+physics)
     112      ! JN : keeping this for simpleclouds scheme
    107113      REAL sum_subpdq(ngrid,nlay,nq)      ! cf. pdqcloud
    108114      REAL sum_subpdt(ngrid,nlay)         ! cf. pdtcloud
     
    137143     
    138144      !$OMP THREADPRIVATE(flagcloud)
     145 
     146! Scheme for adaptative timestep J. Naar 2023
     147c      LOGICAL :: computed_micro(ngrid,nlay) ! Check if microphy was done in this cell
     148      REAL :: computed_micro(ngrid,nlay) ! Check if microphy was done inthis cell (logical)
     149      REAL :: zt_micro(ngrid,nlay) ! Temperature during microphysics (K)
     150      REAL :: zq_micro(ngrid,nlay,nq) ! Tracers during microphysics (kg/kg)
     151      REAL :: zqsat_micro(ngrid,nlay) ! Theoritical q(h2o_vap) at saturation (kg/kg)
     152      INTEGER :: zimicro(ngrid,nlay)    ! Number of ptimestep divisions
     153      REAL :: zpotcond_inst(ngrid,nlay) ! condensable water at the beginning of physics (kg/kg)
     154      REAL :: zpotcond_full(ngrid,nlay) ! condensable water with integrated tendancies (kg/kg)
     155      REAL :: zpotcond(ngrid,nlay) ! maximal condensable water, used to
     156compute adaptative subdivision of ptimestep
     157
    139158
    140159c    ** un petit test de coherence
     
    282301c------------------------------------------------------------------
    283302      rhocloud(1:ngrid,1:nlay) = rho_dust
    284       DO microstep=1,imicro
    285      
     303
     304
     305c     Initialisation of all the stuff JN2023
     306c      computed_micro(1:ngrid,1:nlay)=.false.
     307      computed_micro(1:ngrid,1:nlay)=0.
     308      zt_micro(:,:)=pt(:,:)
     309      zq_micro(:,:,:)=pq(:,:,:)
     310      zq_micro(:,:,:)=pq(:,:,:)
     311      call watersat(ngrid*nlay,zt_micro,pplay,zqsat_micro)
     312      zpotcond_inst=zq_micro(:,:,igcm_h2o_vap) - zqsat_micro
     313      call watersat(ngrid*nlay,zt_micro+pdt*ptimestep,pplay,zqsat_micro)
     314      zpotcond_full=(zq_micro(:,:,igcm_h2o_vap)+
     315     &             pdq(:,:,igcm_h2o_vap)*ptimestep) - zqsat_micro
     316      zimicro(1:ngrid,1:nlay)=imicro
     317      if (cloud_adapt_ts) then
     318              call adapt_imicro(ptimestep,zpotcond(ig,l),
     319     $                   zimicro(ig,l))
     320      endif! (cloud_adapt_ts) then
     321      DO l=1,nlay
     322        DO ig=1,ngrid
     323c         Start by computing the condensable water vapor amount
     324          if (zpotcond_full(ig,l).gt.0.) then
     325            zpotcond(ig,l)=max(zpotcond_inst(ig,l),zpotcond_full(ig,l))
     326          else if (zpotcond_full(ig,l).le.0.) then
     327            zpotcond(ig,l)=min(zpotcond_inst(ig,l),zpotcond_full(ig,l))
     328          endif! (zpotcond_full.gt.0.) then
     329          microtimestep=ptimestep/real(zimicro(ig,l))
     330c         Check if microphysics is even needed, that is if enough action
     331c         is happening water-wise
     332          if ((pq(ig,l,igcm_h2o_ice)+pdq(ig,l,igcm_h2o_ice)*ptimestep
     333     &      .gt.1e-22) .or. (abs(zpotcond(ig,l)).gt.1e-22)) then
     334c         Eventuellement sortir simpleclouds de la boucle egalement
     335          computed_micro(ig,l)=1.
     336          DO microstep=1,zimicro(ig,l)
     337     
     338
     339c JN : incrementing after main microphysics scheme
     340c Previously we were incrementing tendencies, we now
     341c increment tracers and temperature directly
     342c We are thus starting at the end of the first iteration
     343c
    286344c-------------------------------------------------------------------
    287 c   1.  Tendencies:
    288 c------------------
    289 
    290 
    291 c------ Temperature tendency subpdt
    292         ! Each microtimestep we give the cloud scheme a stepped entry subpdt instead of pdt
    293         ! If imicro=1 subpdt is the same as pdt
    294         DO l=1,nlay
    295           DO ig=1,ngrid
    296              sum_subpdt(ig,l) = sum_subpdt(ig,l)
    297      &        + pdt(ig,l) ! At each micro timestep we add pdt in order to have a stepped entry
    298           ENDDO
    299         ENDDO
    300 c------ Tracers tendencies subpdq are additionned
    301 c------ At each micro timestep we add pdq in order to have a stepped entry
    302         IF (microphys) THEN
    303           DO l=1,nlay
    304             DO ig=1,ngrid
    305               sum_subpdq(ig,l,igcm_dust_mass) =
    306      &            sum_subpdq(ig,l,igcm_dust_mass)
    307      &          + pdq(ig,l,igcm_dust_mass)
    308               sum_subpdq(ig,l,igcm_dust_number) =
    309      &            sum_subpdq(ig,l,igcm_dust_number)
    310      &          + pdq(ig,l,igcm_dust_number)
    311               sum_subpdq(ig,l,igcm_ccn_mass) =
    312      &            sum_subpdq(ig,l,igcm_ccn_mass)
    313      &          + pdq(ig,l,igcm_ccn_mass)
    314               sum_subpdq(ig,l,igcm_ccn_number) =
    315      &            sum_subpdq(ig,l,igcm_ccn_number)
    316      &          + pdq(ig,l,igcm_ccn_number)
    317             ENDDO
    318           ENDDO
    319         ENDIF
    320         DO l=1,nlay
    321           DO ig=1,ngrid
    322             sum_subpdq(ig,l,igcm_h2o_ice) =
    323      &          sum_subpdq(ig,l,igcm_h2o_ice)
    324      &        + pdq(ig,l,igcm_h2o_ice)
    325             sum_subpdq(ig,l,igcm_h2o_vap) =
    326      &          sum_subpdq(ig,l,igcm_h2o_vap)
    327      &        + pdq(ig,l,igcm_h2o_vap)
    328             IF (hdo) THEN
    329             sum_subpdq(ig,l,igcm_hdo_ice) =
    330      &          sum_subpdq(ig,l,igcm_hdo_ice)
    331      &        + pdq(ig,l,igcm_hdo_ice)
    332             sum_subpdq(ig,l,igcm_hdo_vap) =
    333      &          sum_subpdq(ig,l,igcm_hdo_vap)
    334      &        + pdq(ig,l,igcm_hdo_vap)
    335             ENDIF !hdo
    336           ENDDO
    337         ENDDO     
    338        
    339 c-------------------------------------------------------------------
    340 c   2.  Main call to the different cloud schemes:
     345c   1.  Main call to the different cloud schemes:
    341346c------------------------------------------------
    342347        IF (microphys) THEN
    343            CALL improvedclouds(ngrid,nlay,microtimestep,
    344      &             pplay,pteff,sum_subpdt,
    345      &             pqeff,sum_subpdq,subpdqcloud,subpdtcloud,
    346      &             nq,tauscaling)
     348           CALL improvedclouds(microtimestep,
     349     &          pplay(ig,l),zt_micro(ig,l),
     350     &          zq_micro(ig,l,:),subpdqcloud(ig,l,:),
     351     &          subpdtcloud(ig,l),nq,tauscaling(ig),mmean(ig,l))
    347352
    348353        ELSE
     354c Simpleclouds should maybe be taken out and put in a specific loop ?
    349355           CALL simpleclouds(ngrid,nlay,microtimestep,
    350356     &             pplay,pzlay,pteff,sum_subpdt,
     
    354360
    355361c-------------------------------------------------------------------
    356 c   3.  Updating tendencies after cloud scheme:
     362c   2.  Updating tracers and temperature after cloud scheme:
    357363c-----------------------------------------------
    358364
    359365        IF (microphys) THEN
    360           DO l=1,nlay
    361             DO ig=1,ngrid
    362               sum_subpdq(ig,l,igcm_dust_mass) =
    363      &            sum_subpdq(ig,l,igcm_dust_mass)
    364      &          + subpdqcloud(ig,l,igcm_dust_mass)
    365               sum_subpdq(ig,l,igcm_dust_number) =
    366      &            sum_subpdq(ig,l,igcm_dust_number)
    367      &          + subpdqcloud(ig,l,igcm_dust_number)
    368               sum_subpdq(ig,l,igcm_ccn_mass) =
    369      &            sum_subpdq(ig,l,igcm_ccn_mass)
    370      &          + subpdqcloud(ig,l,igcm_ccn_mass)
    371               sum_subpdq(ig,l,igcm_ccn_number) =
    372      &            sum_subpdq(ig,l,igcm_ccn_number)
    373      &          + subpdqcloud(ig,l,igcm_ccn_number)
    374             ENDDO
    375           ENDDO
     366              zq_micro(ig,l,igcm_dust_mass) =
     367     &         zq_micro(ig,l,igcm_dust_mass)+(pdq(ig,l,igcm_dust_mass)
     368     &         +subpdqcloud(ig,l,igcm_dust_mass))*microtimestep
     369              zq_micro(ig,l,igcm_dust_number) =
     370     &         zq_micro(ig,l,igcm_dust_number)
     371     &         +(pdq(ig,l,igcm_dust_number)
     372     &         + subpdqcloud(ig,l,igcm_dust_number))*microtimestep
     373              zq_micro(ig,l,igcm_ccn_mass) =
     374     &         zq_micro(ig,l,igcm_ccn_mass) +
     375     &         (pdq(ig,l,igcm_ccn_mass)
     376     &         +subpdqcloud(ig,l,igcm_ccn_mass))*microtimestep
     377              zq_micro(ig,l,igcm_ccn_number) =
     378     &          zq_micro(ig,l,igcm_ccn_number) +
     379     &         (pdq(ig,l,igcm_ccn_number)
     380     &          + subpdqcloud(ig,l,igcm_ccn_number))*microtimestep
    376381        ENDIF
    377         DO l=1,nlay
    378           DO ig=1,ngrid
    379             sum_subpdq(ig,l,igcm_h2o_ice) =
    380      &          sum_subpdq(ig,l,igcm_h2o_ice)
    381      &        + subpdqcloud(ig,l,igcm_h2o_ice)
    382             sum_subpdq(ig,l,igcm_h2o_vap) =
    383      &          sum_subpdq(ig,l,igcm_h2o_vap)
    384      &        + subpdqcloud(ig,l,igcm_h2o_vap)
     382            zq_micro(ig,l,igcm_h2o_ice) =
     383     &       zq_micro(ig,l,igcm_h2o_ice)+
     384     &         (pdq(ig,l,igcm_h2o_ice)
     385     &        + subpdqcloud(ig,l,igcm_h2o_ice))*microtimestep
     386            zq_micro(ig,l,igcm_h2o_vap) =
     387     &       zq_micro(ig,l,igcm_h2o_vap)+
     388     &         (pdq(ig,l,igcm_h2o_vap)
     389     &        + subpdqcloud(ig,l,igcm_h2o_vap))*microtimestep
    385390
    386391            IF (hdo) THEN
    387             sum_subpdq(ig,l,igcm_hdo_ice) =
    388      &          sum_subpdq(ig,l,igcm_hdo_ice)
    389      &        + subpdqcloud(ig,l,igcm_hdo_ice)
    390             sum_subpdq(ig,l,igcm_hdo_vap) =
    391      &          sum_subpdq(ig,l,igcm_hdo_vap)
    392      &        + subpdqcloud(ig,l,igcm_hdo_vap)
     392            zq_micro(ig,l,igcm_hdo_ice) =
     393     &       zq_micro(ig,l,igcm_hdo_ice)+
     394     &         (pdq(ig,l,igcm_hdo_ice)
     395     &        + subpdqcloud(ig,l,igcm_hdo_ice))*microtimestep
     396            zq_micro(ig,l,igcm_hdo_vap) =
     397     &       zq_micro(ig,l,igcm_hdo_vap)+
     398     &         (pdq(ig,l,igcm_hdo_vap)
     399     &        + subpdqcloud(ig,l,igcm_hdo_vap))*microtimestep
    393400            ENDIF ! hdo
    394401
    395           ENDDO
    396         ENDDO
    397         
     402c  Could also set subpdtcloud to 0 if not activice to make it simpler
     403            zt_micro(ig,l) = zt_micro(ig,l)+
     404     &           pdt(ig,l)*microtimestep
    398405        IF (activice) THEN
    399           DO l=1,nlay
    400             DO ig=1,ngrid
    401               sum_subpdt(ig,l) =
    402      &            sum_subpdt(ig,l) + subpdtcloud(ig,l)
    403             ENDDO
    404           ENDDO
     406              zt_micro(ig,l) = zt_micro(ig,l)+
     407     &           subpdtcloud(ig,l)*microtimestep
    405408        ENDIF
    406 
    407409!      !! Example of how to use writediagmicrofi useful to
    408410!      !! get outputs at each microphysical sub-timestep (better to be used in 1D)
     
    411413!     &      'subpdtcloud','K/s',1,subpdtcloud(:,:))     
    412414 
    413       ENDDO ! of DO microstep=1,imicro
    414      
     415          ENDDO ! of DO microstep=1,imicro
     416          endif! (zq(ig,l,igcm_h2o_ice)+pdq(ig,l,igcm_h2o_ice)*ptimestep
     417!     &      .gt.1e-22).or.(abs(zpotcond).gt.1e-22) then
     418        ENDDO ! ig=1,ngrid
     419      ENDDO ! l=1,nlay
     420
     421     
     422c------ Useful outputs to check how it went
     423      call write_output("computed_micro","computed_micro "//
     424     &   "after microphysics","logical",computed_micro(:,:))
     425      call write_output("zimicro","Used number of subtimestep "//
     426     &   "in cloud microphysics","integer",real(zimicro(:,:)))
    415427c-------------------------------------------------------------------
    416 c   6.  Compute final tendencies after time loop:
     428c   3.  Compute final tendencies after time loop:
    417429c------------------------------------------------
    418430
     
    420432       DO l=1,nlay
    421433         DO ig=1,ngrid
    422              pdtcloud(ig,l) =
    423      &         sum_subpdt(ig,l)/real(imicro)-pdt(ig,l)
    424           ENDDO
     434         pdtcloud(ig,l) = -pdt(ig,l)+
     435     &        (zt_micro(ig,l)-pt(ig,l)) / ptimestep
     436         ENDDO
    425437       ENDDO
    426        
     438
    427439c------ Tracers tendencies pdqcloud
    428440       DO l=1,nlay
    429441         DO ig=1,ngrid
    430             pdqcloud(ig,l,igcm_h2o_ice) =
    431      &        sum_subpdq(ig,l,igcm_h2o_ice)/real(imicro)
    432      &       - pdq(ig,l,igcm_h2o_ice)
    433             pdqcloud(ig,l,igcm_h2o_vap) =
    434      &        sum_subpdq(ig,l,igcm_h2o_vap)/real(imicro)
    435      &       - pdq(ig,l,igcm_h2o_vap)
     442            pdqcloud(ig,l,igcm_h2o_ice) =
     443     &        -pdq(ig,l,igcm_h2o_ice)+
     444     &       (zq_micro(ig,l,igcm_h2o_ice) -
     445     &        pq(ig,l,igcm_h2o_ice)) / ptimestep
     446            pdqcloud(ig,l,igcm_h2o_vap) =
     447     &        -pdq(ig,l,igcm_h2o_vap)+
     448     &       (zq_micro(ig,l,igcm_h2o_vap) -
     449     &        pq(ig,l,igcm_h2o_vap)) / ptimestep
    436450            IF (hdo) THEN
    437             pdqcloud(ig,l,igcm_hdo_ice) =
    438      &        sum_subpdq(ig,l,igcm_hdo_ice)/real(imicro)
    439      &       - pdq(ig,l,igcm_hdo_ice)
    440             pdqcloud(ig,l,igcm_hdo_vap) =
    441      &        sum_subpdq(ig,l,igcm_hdo_vap)/real(imicro)
    442      &       - pdq(ig,l,igcm_hdo_vap)
     451            pdqcloud(ig,l,igcm_hdo_ice) =
     452     &        -pdq(ig,l,igcm_hdo_ice)+
     453     &       (zq_micro(ig,l,igcm_hdo_ice) -
     454     &        pq(ig,l,igcm_hdo_ice)) / ptimestep
     455            pdqcloud(ig,l,igcm_hdo_vap) =
     456     &        -pdq(ig,l,igcm_hdo_vap)+
     457     &       (zq_micro(ig,l,igcm_hdo_vap) -
     458     &        pq(ig,l,igcm_hdo_vap)) / ptimestep
    443459            ENDIF !hdo
    444460         ENDDO
    445        ENDDO
    446        
     461       ENDDO       
     462
    447463       IF(microphys) THEN
    448464        DO l=1,nlay
    449465         DO ig=1,ngrid
    450             pdqcloud(ig,l,igcm_ccn_mass) =
    451      &        sum_subpdq(ig,l,igcm_ccn_mass)/real(imicro)
    452      &       - pdq(ig,l,igcm_ccn_mass)
    453             pdqcloud(ig,l,igcm_ccn_number) =
    454      &        sum_subpdq(ig,l,igcm_ccn_number)/real(imicro)
    455      &       - pdq(ig,l,igcm_ccn_number)
     466            pdqcloud(ig,l,igcm_ccn_mass) =
     467     &        -pdq(ig,l,igcm_ccn_mass)+
     468     &       (zq_micro(ig,l,igcm_ccn_mass) -
     469     &        pq(ig,l,igcm_ccn_mass)) / ptimestep
     470            pdqcloud(ig,l,igcm_ccn_number) =
     471     &        -pdq(ig,l,igcm_ccn_number)+
     472     &       (zq_micro(ig,l,igcm_ccn_number) -
     473     &        pq(ig,l,igcm_ccn_number)) / ptimestep
    456474         ENDDO
    457475        ENDDO
    458476       ENDIF
    459        
     477
    460478       IF(scavenging) THEN
    461479        DO l=1,nlay
    462480         DO ig=1,ngrid
    463             pdqcloud(ig,l,igcm_dust_mass) =
    464      &        sum_subpdq(ig,l,igcm_dust_mass)/real(imicro)
    465      &       - pdq(ig,l,igcm_dust_mass)
    466             pdqcloud(ig,l,igcm_dust_number) =
    467      &        sum_subpdq(ig,l,igcm_dust_number)/real(imicro)
    468      &       - pdq(ig,l,igcm_dust_number)
     481            pdqcloud(ig,l,igcm_dust_mass) =
     482     &        -pdq(ig,l,igcm_dust_mass)+
     483     &       (zq_micro(ig,l,igcm_dust_mass) -
     484     &        pq(ig,l,igcm_dust_mass)) / ptimestep
     485            pdqcloud(ig,l,igcm_dust_number) =
     486     &        -pdq(ig,l,igcm_dust_number)+
     487     &       (zq_micro(ig,l,igcm_dust_number) -
     488     &        pq(ig,l,igcm_dust_number)) / ptimestep
    469489         ENDDO
    470490        ENDDO
     
    764784       end subroutine end_watercloud_mod
    765785
     786
     787
     788       SUBROUTINE adapt_imicro(ptimestep,potcond,
     789     $                     zimicro)
     790
     791c Pas de temps adaptatif pour les nuages
     792
     793      real,intent(in) :: ptimestep ! total duration of physics (sec)
     794      real,intent(in) :: potcond ! total duration of physics (sec)
     795      real :: alpha, beta ! total duration of physics (sec)
     796      integer,intent(out) :: zimicro ! number of ptimestep division
     797
     798c       zimicro = ptimestep*alpha*potcond**beta
     799       zimicro = 30
     800
     801       END SUBROUTINE adapt_imicro
     802
     803
    766804      END MODULE watercloud_mod
Note: See TracChangeset for help on using the changeset viewer.