Ignore:
Timestamp:
Mar 26, 2026, 7:09:02 PM (9 days ago)
Author:
asima
Message:

Major changes (don't change results):
Subroutine sp_aop_profile in the mo_simple_plume.f90 module is split in 2 subroutines:

  • sp_aod550_profile, for calculations at 550um ; only called in macv2sp once per timestep ;
  • sp_aop_profile only keeps the calculations of profiles of optical properties at other wavelengths ;

it is called in macv2sp for aod diagnostics at 443 and 865um,
and for each of the 25 wavelengths filling the 6 RRTM bands.

Minor :

  • subroutine name MACv2SP changed in macv2sp for coherence with file name ;
  • dNovrN becomes an argument INTENT(OUT) of macv2sp (instead of making USE from phys_local_var_mod) ;
  • lfactor variable name was used with 2 different meanings : eq 10 and eq 12 from Stevens et al. (2017); celui from eq(10) was renamed as 'lextinct'
  • parameter nmon = 12 : removed because not used ;
  • variable aod_lmd : renamed as aod_lmdz.
File:
1 edited

Legend:

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

    r6102 r6128  
    1 SUBROUTINE MACv2SP(pphis,pplay,paprs,xlon,xlat,tau_allaer,piz_allaer,cg_allaer)
     1SUBROUTINE macv2sp(pphis,pplay,paprs,xlon,xlat,tau_allaer,piz_allaer,cg_allaer,dNovrN)
    22  !
    33  !--routine to read the MACv2SP plume and compute optical properties
     
    1313  !--dNovrN   = enhancement factor for CDNC
    1414  !
    15   USE mo_simple_plumes, ONLY: sp_aop_profile, sp_setup, sp_initialized, aerosols_SP_forcing_year
     15  USE mo_simple_plumes, ONLY: sp_aod550_profile, sp_aop_profile, sp_setup       ! subroutines
     16  USE mo_simple_plumes, ONLY: nplumes, sp_initialized, aerosols_SP_forcing_year ! variables
    1617  USE phys_cal_mod, ONLY : year_cur, year_len, days_elapsed
    1718  USE dimphy
    1819  USE aero_mod
    19   USE phys_local_var_mod, ONLY: t_seri, od443aer, od550aer, od865aer, ec550aer, dryod550aer, od550lt1aer, od550SPaer, dNovrN
    20   !!USE YOMCST, ONLY : RD, RG
     20  USE phys_local_var_mod, ONLY: t_seri, od443aer, od550aer, od865aer, ec550aer, dryod550aer, od550lt1aer, od550SPaer
    2121  !
    2222  USE yomcst_mod_h
     
    3535  REAL, DIMENSION(klon,klev,2,nbands_sw_rrtm), INTENT(INOUT) :: cg_allaer  !  asymmetry parameter aerosol
    3636  !
     37  REAL,DIMENSION(klon),INTENT(OUT)       :: dNovrN   !< anthropogenic increase in cloud drop number concentration (factor)
     38  !
     39  REAL,DIMENSION(klon,klev,nplumes) :: aod550
    3740  REAL,DIMENSION(klon,klev) :: aod_prof, ssa_prof, asy_prof
    3841  REAL,DIMENSION(klon,klev) :: z, dz
    3942  REAL,DIMENSION(klon)      :: oro, zrho, zt
    4043  !
    41   INTEGER, PARAMETER :: nmon = 12
    42   !
    43   REAL, PARAMETER    :: l443 = 443.0, l550 = 550.0, l865 = 865.0 !--wavelengths in nm
     44  REAL, PARAMETER    :: l443 = 443.0, l865 = 865.0 !--wavelengths in nm for diagnostics (other than 550 nm calculated by default)
    4445  !
    4546  INTEGER, PARAMETER :: Nwvmax=25
     
    5859  !
    5960  REAL :: zlambda, zweight
    60 !  REAL :: year_fr  ! also a dimension name in SP aerosol file ; renamed more properly "decimal_year"
    6161  REAL :: decimal_year
    6262  !
     
    8383  IF (.NOT.sp_initialized) CALL sp_setup
    8484
    85   !--fractional year
    86   !
    87   ! Original version, bugged :
    88   ! year_fr = FLOAT(year_cur) + (FLOAT(day_cur)-0.5) / FLOAT(year_len)
    89   ! Correction ASima & FH :
    90 !  year_fr= float(year_cur) + float(days_elapsed)/float(year_len)
    91 ! Choice between yearly vs fixed_year forcing, depending on 'aerosols_SP_forcing_year'
     85  !--fractional year :
     86  !   Original version, bugged :       year_fr = FLOAT(year_cur) + (FLOAT(day_cur)-0.5) / FLOAT(year_len)
     87  !   Correction 2026-03, FH & ASima : year_fr= float(year_cur) + float(days_elapsed)/float(year_len)
     88  ! Name changed in decimal_year ; choice between yearly vs fixed_year forcing, depending on 'aerosols_SP_forcing_year'
    9289  IF (aerosols_SP_forcing_year.EQ.-9999) THEN
    9390     decimal_year= float(year_cur) + float(days_elapsed)/float(year_len)
     
    9996     CALL abort_physic ('macv2sp','year not supported by plume model',1)
    10097  ENDIF
    101   !
    102   !--call to sp routine -- 443 nm
    103   !
    104   CALL sp_aop_profile                                    ( &
    105        klev     ,klon ,l443 ,oro    ,xlon     ,xlat      , &
    106        decimal_year  ,z    ,dz   ,dNovrN ,aod_prof ,ssa_prof  , &
    107        asy_prof )
    108   !
    109   !--AOD calculations for diagnostics
    110   od443aer(:)= od443aer(:)+SUM(aod_prof(:,:),dim=2)
    111   !
    112   !--call to sp routine -- 550 nm
    113   !
    114   CALL sp_aop_profile                                    ( &
    115        klev     ,klon ,l550 ,oro    ,xlon     ,xlat      , &
    116        decimal_year  ,z    ,dz   ,dNovrN ,aod_prof ,ssa_prof  , &
    117        asy_prof )
    118   !
    119   !--AOD calculations for diagnostics
    120   ! (ASima : new diagnostic od550SPaer; corrected od550lt1aer and dryod550aer)
    121   !--a/ AOD of SP aerosols = vertical sum of SP aod profile
     98
     99  !
     100  !--call SUBROUTINE sp_aod550_profile once ; all the wavelength-dependent profiles and 2D diagnostics will use aod550 profile
     101  !
     102  CALL sp_aod550_profile                                                 ( &
     103       klev           ,klon       ,oro        ,xlon           ,xlat      , &
     104       decimal_year   ,z          ,dz         ,dNovrN         , aod550   )
     105
     106  !--AOD550 calculations for diagnostics
     107  !
     108  ! aod550 profile = sum over the 'nplumes' dimension
     109  aod_prof(:,:)=SUM(aod550(:,:,:),dim=3)
     110  !
     111  !--a/ AOD of SP anthropic aerosols = vertical sum of SP aod profile
    122112  od550SPaer(:)=SUM(aod_prof(:,:),dim=2)
    123113  !
     
    126116  !
    127117  !--c/ fine-mode AOD = Inca1850(fine mode) + SP
    128   ! original, bugged : includes od550aer of Inca1850
    129   !od550lt1aer(:)=od550lt1aer(:)+od550aer(:)
    130118  od550lt1aer(:)=od550lt1aer(:)+od550SPaer(:)
    131119  !
    132120  !--d/ dry AOD
    133   ! original, bugged : includes od550aer of Inca1850
    134   !dryod550aer(:)=dryod550aer(:)+od550aer(:)
    135121  dryod550aer(:)=dryod550aer(:)+od550SPaer(:)
    136   !
    137122  !
    138123  !--extinction coefficient for diagnostic
    139124  ec550aer(:,:)=ec550aer(:,:)+aod_prof(:,:)/dz(:,:)
    140125  !
     126
     127  ! Diagnostic AOD calculations for other wavelengths : 443 and 865 nm 
     128  !--call to sp routine -- 443 nm
     129  !
     130  CALL sp_aop_profile                                    ( &
     131       klev     ,klon ,  l443         , &
     132       aod550   ,aod_prof ,ssa_prof  , &
     133       asy_prof )
     134
     135  od443aer(:)= od443aer(:)+SUM(aod_prof(:,:),dim=2)
     136
    141137  !--call to sp routine -- 865 nm
    142138  !
    143139  CALL sp_aop_profile                                    ( &
    144        klev     ,klon ,l865 ,oro    ,xlon     ,xlat      , &
    145        decimal_year  ,z    ,dz   ,dNovrN ,aod_prof ,ssa_prof  , &
     140       klev     ,klon ,  l865         , &
     141       aod550  ,aod_prof ,ssa_prof  , &
    146142       asy_prof )
    147   !
    148   !--AOD calculations for diagnostics
     143
    149144  od865aer(:)=od865aer(:)+SUM(aod_prof(:,:),dim=2)
     145
    150146  !
    151147  !--re-weighting of piz and cg arrays before adding the anthropogenic aerosols
     
    184180    ENDIF
    185181    !
    186     CALL sp_aop_profile                                       ( &
    187          klev     ,klon ,zlambda ,oro    ,xlon     ,xlat      , &
    188          decimal_year  ,z    ,dz      ,dNovrN ,aod_prof ,ssa_prof  , &
    189          asy_prof )
     182  CALL sp_aop_profile                                    ( &
     183       klev     ,klon ,  zlambda         , &
     184       aod550   ,aod_prof ,ssa_prof  , &
     185       asy_prof )
     186
     187
    190188    !
    191189    !--adding up the quantities tau, piz*tau and cg*piz*tau
     
    200198  piz_allaer(:,:,2,:)=piz_allaer(:,:,2,:)/tau_allaer(:,:,2,:)
    201199  !
    202 END SUBROUTINE MACv2SP
     200END SUBROUTINE macv2sp
Note: See TracChangeset for help on using the changeset viewer.