
! splaeropt_lw_rrtm.F90 2014-05-13 C. Kleinschmitt
!                      2016-05-03 O. Boucher 

! This routine feeds aerosol LW properties to RRTM
! we only consider absorption (not scattering)

SUBROUTINE SPLAEROPT_LW_RRTM(ok_alw, zdm, tr_seri)

  USE dimphy
  USE aero_mod
  USE infotrac_phy, ONLY: nqtot, nbtr, tracers
  USE phys_state_var_mod, ONLY: tau_aero_lw_rrtm
  USE lmdz_yoerad, ONLY: NLW

  IMPLICIT NONE

  INCLUDE "clesphys.h"

  ! Input arguments:

  LOGICAL, INTENT(IN) :: ok_alw
  REAL, DIMENSION(klon, klev), INTENT(IN) :: zdm
  REAL, DIMENSION(klon, klev, nbtr), INTENT(IN) :: tr_seri

  ! Local arguments : 

  INTEGER, PARAMETER :: naero_soluble = 2    ! 1- accumulation soluble; 2- coarse soluble
  INTEGER, PARAMETER :: naero_insoluble = 2  ! 1- coarse dust; 2- supercoarse dust
  INTEGER, PARAMETER :: naero = naero_soluble + naero_insoluble

  INTEGER inu, itr, iq, spinsol
  CHARACTER*20 modname

  !--absorption coefficient for coarse and super-coarse DUST
  REAL :: alpha_abs_CIDUST_16bands(nbands_lw_rrtm, naero_insoluble)   !--unit m2/g
  DATA alpha_abs_CIDUST_16bands /                         &
          ! Dust CO insoluble
          0.001, 0.003, 0.005, 0.006, 0.011, 0.031, 0.157, 0.102, &
          0.017, 0.056, 0.032, 0.008, 0.010, 0.011, 0.013, 0.016, &
          ! Dust SC insoluble
          0.002, 0.004, 0.007, 0.010, 0.018, 0.043, 0.099, 0.071, &
          0.021, 0.056, 0.033, 0.011, 0.013, 0.014, 0.016, 0.018 /

  modname = 'splaeropt_lw_rrtm'

  IF (NLW/=nbands_lw_rrtm) THEN
    CALL abort_physic(modname, 'Erreur NLW doit etre egal a 16 pour cette routine', 1)
  ENDIF

  IF (ok_alw) THEN

    !--initialisation
    tau_aero_lw_rrtm = 0.0

    itr = 0
    DO iq = 1, nqtot
      IF(.NOT.tracers(iq)%isInPhysics) CYCLE
      itr = itr + 1
      SELECT CASE(tracers(iq)%name)
      CASE('PREC', 'FINE', 'COSS'); CYCLE                  !--precursor or fine/coarde accumulation mode
      CASE('CODU'); spinsol = 1                            !--coarse mode dust
      CASE('SCDU'); spinsol = 2                            !--super coarse mode dust
      CASE DEFAULT; CALL abort_physic(modname, 'I cannot do aerosol optics for ' // tracers(iq)%name, 1)
      END SELECT

      DO inu = 1, NLW

        !--total aerosol
        tau_aero_lw_rrtm(:, :, 2, inu) = tau_aero_lw_rrtm(:, :, 2, inu) + tr_seri(:, :, itr) * zdm(:, :) * alpha_abs_CIDUST_16bands(inu, spinsol)
        !--no aerosol at all
        tau_aero_lw_rrtm(:, :, 1, inu) = tau_aero_lw_rrtm(:, :, 1, inu) + 0.0

      ENDDO

    ENDDO

    !--avoid very small values
    tau_aero_lw_rrtm = MAX(tau_aero_lw_rrtm, 1.e-15)

  ELSE
    !--default value
    tau_aero_lw_rrtm = 1.e-15
  ENDIF

END SUBROUTINE SPLAEROPT_LW_RRTM
