Ignore:
Timestamp:
Apr 1, 2026, 6:36:00 PM (9 days ago)
Author:
asima
Message:

Bug fix for Simple Plume aerosols:
the orography was incorrectly accounted for in the aod vertical profile (since the original CMIP6 implementation)
ASima, FHourdin

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/mo_simple_plumes.f90

    r6128 r6149  
    2121!! @par Copyright
    2222!!
    23 !! 2026-03, A.Sima (LMD): for calculation optimisation, the main subroutine sp_aop_profile is split in 2 subroutines :
     23!! 2026-03
     24!!  A.Sima (LMD): for calculation optimisation, the main subroutine sp_aop_profile is split in 2 subroutines :
    2425!!      sp_aod550_profile : calculates aod550um profile from macv2sp data (which are for 550um themselves), and dNovrN factor   
    2526!!           at each timestep is only called in macv2sp once ;
     
    2829!!            - aod diagnostics at 443 and 865um,
    2930!!            - optical properties (aod, ssa, asy) for the Nwvmax=25 wavelengths filling the 6 RRTM bands   
     31!!  ASima, FH : bug corrected in aod vertical profile calculation, concerning the impact of orography
    3032!
    3133MODULE mo_simple_plumes
     
    3739  INTEGER, PARAMETER, PUBLIC :: nplumes   = 9       !< Number of plumes
    3840
    39 !  INTEGER, PARAMETER ::                        &
    40 !       nplumes   = 9                          ,& !< Number of plumes
    4141  INTEGER, PARAMETER ::                        &
    4242       nfeatures = 2                          ,& !< Number of features per plume
     
    7373!$OMP THREADPRIVATE(sig_lon_E,sig_lon_W,sig_lat_E,sig_lat_W,theta,ftr_weight,year_weight,ann_cycle)
    7474
     75  REAL, SAVE ::  beta_sum       (nplumes)                ! numerically calculated integral of beta function (ASima,FH)
     76!$OMP THREADPRIVATE(beta_sum)
     77
    7578  REAL ::                                      &
    7679       time_weight    (nfeatures,nplumes)     ,& !< Time weights
     
    8588  ! climatology.  The information needs to be either read by each processor or distributed to processors.
    8689  !
     90  ! (ASima,FH : added call to sp_beta_sup to compute the integral of beta profile by plume, only once at initialisation
     91  !
    8792  SUBROUTINE sp_setup
    8893    !
     
    290295    CALL bcast(ann_cycle)
    291296    !
     297    !(ASima,FH) Calculate beta function integral for the 9 plumes
     298    CALL sp_beta_sum
     299    !
    292300    sp_initialized = .TRUE.
    293301    !
     
    295303    !
    296304  END SUBROUTINE sp_setup
     305  !
     306  ! ------------------------------------------------------------------------------------------------------------------------
     307  !  (ASima, FH) sp_beta_sum : numerically calculates the integral of beta function for each of the 9 plumes :
     308  !     B(p_i, q_i) in eq.(8) of Stevens et al (2017)
     309  !  To be only called once in the beginning of an integration period, same as (and just after) sp_setup.
     310  !  The beta-function vertical profiles of optical properties apply from 0 (sea level) to zmax=15 km.
     311  !  They only depend of plume caracteristics read in SP aerosol file.
     312  ! 
     313  SUBROUTINE sp_beta_sum
     314    !
     315    ! ----------
     316    !
     317    !
     318  INTEGER, PARAMETER :: nmax=1000       ! nb. of layers for discretisation of 0 to 1 interval
     319
     320!REAL, DIMENSION(nplumes) :: beta_sum   ! numerically calculated integral of beta function
     321
     322  INTEGER :: iplume, k
     323
     324  REAL :: eta, d_eta                    ! normalised height and thickness of a discretisation layer
     325  REAL :: beta_eta                      ! beta function value at relative height eta
     326
     327
     328  d_eta = 1/float(nmax)   !  = layer thickness in discretisation of 0 to 1 interval
     329
     330  ! For each plume, sum over beta function values at the middle of each d_eta layer
     331  DO iplume=1,nplumes 
     332   
     333      beta_sum(iplume) = 0.  !  initialisation
     334
     335      DO k=1,nmax
     336          eta = (k - 0.5)/float(nmax)
     337          beta_eta = eta**(beta_a(iplume)-1.) * (1.-eta)**(beta_b(iplume)-1.)
     338          beta_sum(iplume) = beta_sum(iplume) + beta_eta * d_eta
     339      ENDDO
     340   ENDDO
     341!   DO iplume=1,nplumes
     342!    print*,'beta_sum(',iplume,') = ', beta_sum(iplume)
     343!   ENDDO
     344   !
     345   RETURN
     346   !
     347  END SUBROUTINE sp_beta_sum
    297348  !
    298349  ! ------------------------------------------------------------------------------------------------------------------------
     
    339390  !              It also computes the dNovrN factor used to mimic Twomey (aci) effect by multiplying preind. cloud droplet number
    340391  !
    341   SUBROUTINE sp_aod550_profile                                                                           ( &
    342        nlevels        ,ncol           ,oro            ,lon            ,lat            , &
     392  SUBROUTINE sp_aod550_profile                                                 ( &
     393       nlevels        ,ncol           ,lon            ,lat            , &
    343394       decimal_year   ,z              ,dz             ,dNovrN         , aod550   )
    344395
     
    352403    REAL, INTENT(IN)           :: &
    353404         decimal_year,            & !< Fractional Year (1903.0 is the 0Z on the first of January 1903, Gregorian)
    354          oro(ncol),               & !< orographic height (m)
    355405         lon(ncol),               & !< longitude
    356406         lat(ncol),               & !< latitude
     
    363413
    364414    INTEGER                    :: iplume, icol, k
     415   
     416    REAL, PARAMETER            :: zmax = 15000 ! max altitude up to which beta-function profiles apply
    365417
    366418    REAL                       ::  &
    367          eta(ncol,nlevels),        & !< normalized height (by 15 km)
    368          z_beta(ncol,nlevels),     & !< profile for scaling column optical depth
     419         eta_lmdz(ncol,nlevels),   & !< normalized height (by zmax = 15 km) 
     420         d_eta_lmdz(ncol,nlevels), & !< normalized height (by zmax = 15 km)
    369421         prof(ncol,nlevels),       & !< scaled profile (by beta function)
    370          beta_sum(ncol),           & !< vertical sum of beta function
    371422         cw_an(ncol),              & !< column weight for simple plume (anthropogenic) AOD at 550 nm
    372423         cw_bg(ncol),              & !< column weight for fine-mode natural background AOD at 550 nm
     
    401452    DO k=1,nlevels
    402453      DO icol=1,ncol
    403         z_beta(icol,k)   = MERGE(1.0, 0.0, z(icol,k) >= oro(icol))
    404         eta(icol,k)      = MAX(0.0,MIN(1.0,z(icol,k)/15000.))
     454         eta_lmdz(icol,k)      = MIN(1.0,z(icol,k)/15000.)
     455         d_eta_lmdz(icol,k)      = dz(icol,k)/15000.
    405456      ENDDO
    406457    ENDDO
     
    411462    ENDDO
    412463    !
     464!    DO iplume=1,nplumes
     465!     print*,'IN sp_aod550 : beta_sum(',iplume,') = ', beta_sum(iplume)
     466!    ENDDO
     467
    413468    ! sum contribution from plumes to construct composite profiles of aerosol optical properties
    414469    !
     
    417472      ! calculate vertical distribution function from parameters of beta distribution
    418473      !
    419       DO icol=1,ncol
    420         beta_sum(icol) = 0.
    421       ENDDO
    422474      DO k=1,nlevels
    423475        DO icol=1,ncol
    424           prof(icol,k)   = (eta(icol,k)**(beta_a(iplume)-1.) * (1.-eta(icol,k))**(beta_b(iplume)-1.)) * dz(icol,k)
    425           beta_sum(icol) = beta_sum(icol) + prof(icol,k)
    426         ENDDO
    427       ENDDO
    428       DO k=1,nlevels
    429         DO icol=1,ncol
    430           prof(icol,k)   = ( prof(icol,k) / beta_sum(icol) ) * z_beta(icol,k)
     476           prof(icol,k)   = (eta_lmdz(icol,k)**(beta_a(iplume)-1.) * (1.-eta_lmdz(icol,k))**(beta_b(iplume)-1.)) * d_eta_lmdz(icol,k)/beta_sum(iplume)
    431477        ENDDO
    432478      ENDDO
     
    495541  ! ------------------------------------------------------------------------------------------------------------------------
    496542
    497   SUBROUTINE sp_aop_profile                                                                        ( &
    498        nlevels        ,ncol           ,lambda                     , &
    499        aod550         ,aod_prof       ,ssa_prof       , &
    500        asy_prof       )
     543  SUBROUTINE sp_aop_profile                                    ( &
     544       nlevels        ,ncol           ,lambda                  , &
     545       aod550         ,aod_prof       ,ssa_prof       ,asy_prof  )
    501546    !
    502547    ! ----------
Note: See TracChangeset for help on using the changeset viewer.