Ignore:
Timestamp:
Jan 2, 2017, 11:24:30 PM (8 years ago)
Author:
oboucher
Message:

Swapping the order of CSSO4 and ASSO4 aerosols (and fixing an issue on aerindex). Preparing the ground for nitrate aerosols (coarse soluble, accumulation soluble, coarse insoluble). Modifying the LW aeropt routine so that it is compatible with both INCA and climatological aerosols (for dust only). Adding a new flag ok_alw for activating aerosol direct LW effect (for dust only). This change is bit comparable for flag_aerosol=6, flag_rrtm=1, NSW=6.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ5/trunk/libf/phylmd/rrtm/aeropt_lw_rrtm.F90

    r2504 r2738  
    22! aeropt_lw_rrtm.F90 2014-05-13 C. Kleinschmitt
    33!                    2016-05-03 O. Boucher
     4!                    2016-12-17 O. Boucher
    45!
    56! This routine feeds aerosol LW properties to RRTM
    67! we only consider absorption (not scattering)
     8! we only consider dust for now
    79
    8 SUBROUTINE AEROPT_LW_RRTM(aerosol_couple,paprs,tr_seri)
     10SUBROUTINE AEROPT_LW_RRTM(ok_alw, pdel, zrho, flag_aerosol, m_allaer, m_allaer_pi)
    911
    1012  USE dimphy
    1113  USE aero_mod
    12   USE infotrac_phy
    1314  USE phys_state_var_mod, ONLY : tau_aero_lw_rrtm
    1415  USE YOERAD, ONLY : NLW
     16  USE YOMCST
    1517
    1618  IMPLICIT NONE
    1719
    18   INCLUDE "YOMCST.h"
    1920  INCLUDE "clesphys.h"
    2021  !
    2122  ! Input arguments:
    2223  !
    23   LOGICAL, INTENT(IN)                         :: aerosol_couple
    24   REAL, DIMENSION(klon,klev+1), INTENT(in)    :: paprs
    25   REAL, DIMENSION(klon,klev,nbtr), INTENT(in) :: tr_seri
    26   !
    27   REAL, DIMENSION(klon,klev) :: zdp, mass_temp
    28   !
     24  LOGICAL, INTENT(IN)                                 :: ok_alw
     25  INTEGER, INTENT(IN)                                 :: flag_aerosol
     26  REAL, DIMENSION(klon,klev),     INTENT(in)          :: pdel, zrho
     27  REAL, DIMENSION(klon,klev,naero_tot),   INTENT(in)  :: m_allaer, m_allaer_pi
    2928  !
    3029  INTEGER inu, i, k
    31   INTEGER :: id_ASBCM, id_ASPOMM, id_ASSO4M, id_ASMSAM, id_CSSO4M, id_CSMSAM, id_SSSSM
    32   INTEGER :: id_CSSSM, id_ASSSM, id_CIDUSTM, id_AIBCM, id_AIPOMM, id_ASNO3M, id_CSNO3M, id_CINO3M
    33 
     30  REAL :: zdh(klon,klev)
     31  REAL :: tmp_var, tmp_var_pi
    3432  !
    3533  !--absorption coefficient for CIDUST
    3634  REAL:: alpha_abs_CIDUST_16bands(nbands_lw_rrtm)   !--unit m2/g
    3735  DATA alpha_abs_CIDUST_16bands /              &
    38        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, &
    39        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 /
     36  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, &
     37  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 /
    4038  !
    4139  IF (NLW.NE.nbands_lw_rrtm) THEN
    42      print *,'Erreur NLW doit etre egal a 16 pour cette routine'
    43      stop
     40     PRINT *,'Erreur NLW doit etre egal a 16 pour cette routine'
     41     STOP
    4442  ENDIF
    4543  !
    46   IF (aerosol_couple) THEN
    47   !
    48       do i=1,nbtr
    49       select case(trim(solsym(i)))
    50          case ("ASBCM")
    51             id_ASBCM = i
    52          case ("ASPOMM")
    53             id_ASPOMM = i
    54          case ("ASSO4M")
    55             id_ASSO4M = i
    56          case ("ASMSAM")
    57             id_ASMSAM = i
    58          case ("CSSO4M")
    59             id_CSSO4M = i
    60          case ("CSMSAM")
    61             id_CSMSAM = i
    62          case ("SSSSM")
    63             id_SSSSM = i
    64          case ("CSSSM")
    65             id_CSSSM = i
    66          case ("ASSSM")
    67             id_ASSSM = i
    68          case ("CIDUSTM")
    69             id_CIDUSTM = i
    70          case ("AIBCM")
    71             id_AIBCM = i
    72          case ("AIPOMM")
    73             id_AIPOMM = i
    74          case ("ASNO3M")
    75             id_ASNO3M = i
    76          case ("CSNO3M")
    77             id_CSNO3M = i
    78          case ("CINO3M")
    79             id_CINO3M = i
    80          end select
    81     enddo
     44  IF (ok_alw) THEN                                   !--aerosol LW effects
     45   !
     46   IF (flag_aerosol.EQ.5.OR.flag_aerosol.EQ.6) THEN  !--Dust
     47    !
     48    zdh(:,:)=pdel(:,:)/(RG*zrho(:,:))      !-- m
    8249    !
    8350    DO k=1, klev
    84        zdp(:,k) = (paprs(:,k)-paprs(:,k+1))/RG !--kg/m2
    85     ENDDO
    86     !
    87     !--for now only consider dust
    88     mass_temp(:,:)=tr_seri(:,:,id_CIDUSTM)  !--kg/kg
    89     !
    90     DO inu=1,NLW
    91       !
    92       !--total aerosol
    93       tau_aero_lw_rrtm(:,:,2,inu) = mass_temp(:,:)*zdp(:,:)*1000.*alpha_abs_CIDUST_16bands(inu)
    94       !--no aerosol at all
    95       tau_aero_lw_rrtm(:,:,1,inu) = 0.0
     51      DO i=1, klon
     52         !
     53         tmp_var   =m_allaer(i,k,id_CIDUSTM_phy)   /1.e6*zdh(i,k) !-- g/m2
     54         tmp_var_pi=m_allaer_pi(i,k,id_CIDUSTM_phy)/1.e6*zdh(i,k) !-- g/m2
     55         !
     56         DO inu=1, NLW
     57           !
     58           !--total aerosol
     59           tau_aero_lw_rrtm(i,k,2,inu) = MAX(1.e-15,tmp_var*alpha_abs_CIDUST_16bands(inu))
     60           !--natural aerosol
     61           tau_aero_lw_rrtm(i,k,1,inu) = MAX(1.e-15,tmp_var_pi*alpha_abs_CIDUST_16bands(inu))
     62           !
     63         ENDDO
     64      ENDDO
    9665      !
    9766    ENDDO
    9867    !
    99     !--avoid very small values
    100     tau_aero_lw_rrtm = MAX(tau_aero_lw_rrtm,1.e-15)
    101     !
    102   ELSE !--not aerosol_couple
     68   ENDIF
     69   !
     70  ELSE !--no aerosol LW effects
    10371    !
    104     !--no LW effects if not coupled to INCA
    10572    tau_aero_lw_rrtm = 1.e-15
    10673  ENDIF
Note: See TracChangeset for help on using the changeset viewer.