| Line | Branch | Exec | Source | 
    
      | 1 |  |  | ! $Id: readaerosol_optic.F90 3630 2020-02-10 10:04:40Z fairhead $ | 
    
      | 2 |  |  | ! | 
    
      | 3 |  | ✗ | SUBROUTINE readaerosol_optic(debut, flag_aerosol, itap, rjourvrai, & | 
    
      | 4 |  | ✗ | pdtphys, pplay, paprs, t_seri, rhcl, presnivs, & | 
    
      | 5 |  |  | mass_solu_aero, mass_solu_aero_pi, & | 
    
      | 6 |  | ✗ | tau_aero, piz_aero, cg_aero, & | 
    
      | 7 |  | ✗ | tausum_aero, tau3d_aero ) | 
    
      | 8 |  |  |  | 
    
      | 9 |  |  | ! This routine will : | 
    
      | 10 |  |  | ! 1) recevie the aerosols(already read and interpolated) corresponding to flag_aerosol | 
    
      | 11 |  |  | ! 2) calculate the optical properties for the aerosols | 
    
      | 12 |  |  | ! | 
    
      | 13 |  |  |  | 
    
      | 14 |  |  | USE dimphy | 
    
      | 15 |  |  | USE aero_mod | 
    
      | 16 |  |  | USE phys_local_var_mod, only: sconcso4,sconcno3,sconcoa,sconcbc,sconcss,sconcdust, & | 
    
      | 17 |  |  | concso4,concno3,concoa,concbc,concss,concdust,loadso4,loadoa,loadbc,loadss,loaddust, & | 
    
      | 18 |  |  | load_tmp1,load_tmp2,load_tmp3,load_tmp4,load_tmp5,load_tmp6,load_tmp7 | 
    
      | 19 |  |  | IMPLICIT NONE | 
    
      | 20 |  |  |  | 
    
      | 21 |  |  | ! Input arguments | 
    
      | 22 |  |  | !**************************************************************************************** | 
    
      | 23 |  |  | LOGICAL, INTENT(IN)                      :: debut | 
    
      | 24 |  |  | INTEGER, INTENT(IN)                      :: flag_aerosol | 
    
      | 25 |  |  | INTEGER, INTENT(IN)                      :: itap | 
    
      | 26 |  |  | REAL, INTENT(IN)                         :: rjourvrai | 
    
      | 27 |  |  | REAL, INTENT(IN)                         :: pdtphys | 
    
      | 28 |  |  | REAL, DIMENSION(klon,klev), INTENT(IN)   :: pplay | 
    
      | 29 |  |  | REAL, DIMENSION(klon,klev+1), INTENT(IN) :: paprs | 
    
      | 30 |  |  | REAL, DIMENSION(klon,klev), INTENT(IN)   :: t_seri | 
    
      | 31 |  |  | REAL, DIMENSION(klon,klev), INTENT(IN)   :: rhcl   ! humidite relative ciel clair | 
    
      | 32 |  |  | REAL, DIMENSION(klev), INTENT(IN)        :: presnivs | 
    
      | 33 |  |  |  | 
    
      | 34 |  |  | ! Output arguments | 
    
      | 35 |  |  | !**************************************************************************************** | 
    
      | 36 |  |  | REAL, DIMENSION(klon,klev), INTENT(OUT)     :: mass_solu_aero    ! Total mass for all soluble aerosols | 
    
      | 37 |  |  | REAL, DIMENSION(klon,klev), INTENT(OUT)     :: mass_solu_aero_pi !     -"-     preindustrial values | 
    
      | 38 |  |  | REAL, DIMENSION(klon,klev,naero_grp,nbands), INTENT(OUT) :: tau_aero    ! Aerosol optical thickness | 
    
      | 39 |  |  | REAL, DIMENSION(klon,klev,naero_grp,nbands), INTENT(OUT) :: piz_aero    ! Single scattering albedo aerosol | 
    
      | 40 |  |  | REAL, DIMENSION(klon,klev,naero_grp,nbands), INTENT(OUT) :: cg_aero     ! asymmetry parameter aerosol | 
    
      | 41 |  |  | !  REAL, DIMENSION(klon,nwave,naero_spc), INTENT(OUT)       :: tausum_aero | 
    
      | 42 |  |  | !  REAL, DIMENSION(klon,klev,nwave,naero_spc), INTENT(OUT)  :: tau3d_aero | 
    
      | 43 |  |  | !--correction mini bug OB | 
    
      | 44 |  |  | REAL, DIMENSION(klon,nwave,naero_tot), INTENT(OUT)       :: tausum_aero | 
    
      | 45 |  |  | REAL, DIMENSION(klon,klev,nwave,naero_tot), INTENT(OUT)  :: tau3d_aero | 
    
      | 46 |  |  |  | 
    
      | 47 |  |  | ! Local variables | 
    
      | 48 |  |  | !**************************************************************************************** | 
    
      | 49 |  | ✗ | REAL, DIMENSION(klon)        :: aerindex ! POLDER aerosol index | 
    
      | 50 |  | ✗ | REAL, DIMENSION(klon,klev)   :: sulfate  ! SO4 aerosol concentration [ug/m3] | 
    
      | 51 |  | ✗ | REAL, DIMENSION(klon,klev)   :: bcsol    ! BC soluble concentration [ug/m3] | 
    
      | 52 |  | ✗ | REAL, DIMENSION(klon,klev)   :: bcins    ! BC insoluble concentration [ug/m3] | 
    
      | 53 |  | ✗ | REAL, DIMENSION(klon,klev)   :: pomsol   ! POM soluble concentration [ug/m3] | 
    
      | 54 |  | ✗ | REAL, DIMENSION(klon,klev)   :: pomins   ! POM insoluble concentration [ug/m3] | 
    
      | 55 |  | ✗ | REAL, DIMENSION(klon,klev)   :: cidust    ! DUST aerosol concentration  [ug/m3] | 
    
      | 56 |  | ✗ | REAL, DIMENSION(klon,klev)   :: sscoarse  ! SS Coarse concentration [ug/m3] | 
    
      | 57 |  | ✗ | REAL, DIMENSION(klon,klev)   :: sssupco   ! SS Super Coarse concentration [ug/m3] | 
    
      | 58 |  | ✗ | REAL, DIMENSION(klon,klev)   :: ssacu     ! SS Acumulation concentration [ug/m3] | 
    
      | 59 |  | ✗ | REAL, DIMENSION(klon,klev)   :: sulfate_pi | 
    
      | 60 |  | ✗ | REAL, DIMENSION(klon,klev)   :: bcsol_pi | 
    
      | 61 |  | ✗ | REAL, DIMENSION(klon,klev)   :: bcins_pi | 
    
      | 62 |  | ✗ | REAL, DIMENSION(klon,klev)   :: pomsol_pi | 
    
      | 63 |  | ✗ | REAL, DIMENSION(klon,klev)   :: pomins_pi | 
    
      | 64 |  | ✗ | REAL, DIMENSION(klon,klev)   :: cidust_pi | 
    
      | 65 |  | ✗ | REAL, DIMENSION(klon,klev)   :: sscoarse_pi | 
    
      | 66 |  | ✗ | REAL, DIMENSION(klon,klev)   :: sssupco_pi | 
    
      | 67 |  | ✗ | REAL, DIMENSION(klon,klev)   :: ssacu_pi | 
    
      | 68 |  | ✗ | REAL, DIMENSION(klon,klev)   :: pdel | 
    
      | 69 |  | ✗ | REAL, DIMENSION(klon,klev,naero_tot) :: m_allaer | 
    
      | 70 |  | ✗ | REAL, DIMENSION(klon,klev,naero_tot) :: m_allaer_pi !RAF | 
    
      | 71 |  |  | !  REAL, DIMENSION(klon,naero_tot)      :: fractnat_allaer !RAF delete?? | 
    
      | 72 |  |  |  | 
    
      | 73 |  |  | INTEGER :: k, i | 
    
      | 74 |  |  |  | 
    
      | 75 |  |  | !**************************************************************************************** | 
    
      | 76 |  |  | ! 1) Get aerosol mass | 
    
      | 77 |  |  | ! | 
    
      | 78 |  |  | !**************************************************************************************** | 
    
      | 79 |  |  | ! Read and interpolate sulfate | 
    
      | 80 |  | ✗ | IF ( flag_aerosol .EQ. 1 .OR. & | 
    
      | 81 |  |  | flag_aerosol .EQ. 6 ) THEN | 
    
      | 82 |  |  |  | 
    
      | 83 |  | ✗ | CALL readaerosol_interp(id_ASSO4M_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, sulfate, sulfate_pi,loadso4) | 
    
      | 84 |  |  | ELSE | 
    
      | 85 |  | ✗ | sulfate(:,:) = 0. ; sulfate_pi(:,:) = 0. | 
    
      | 86 |  | ✗ | loadso4=0. | 
    
      | 87 |  |  | END IF | 
    
      | 88 |  |  |  | 
    
      | 89 |  |  | ! Read and interpolate bcsol and bcins | 
    
      | 90 |  | ✗ | IF ( flag_aerosol .EQ. 2 .OR. & | 
    
      | 91 |  |  | flag_aerosol .EQ. 6 ) THEN | 
    
      | 92 |  |  |  | 
    
      | 93 |  |  | ! Get bc aerosol distribution | 
    
      | 94 |  | ✗ | CALL readaerosol_interp(id_ASBCM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, bcsol, bcsol_pi, load_tmp1) | 
    
      | 95 |  | ✗ | CALL readaerosol_interp(id_AIBCM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, bcins, bcins_pi, load_tmp2) | 
    
      | 96 |  | ✗ | loadbc(:)=load_tmp1(:)+load_tmp2(:) | 
    
      | 97 |  |  | ELSE | 
    
      | 98 |  | ✗ | bcsol(:,:) = 0. ; bcsol_pi(:,:) = 0. | 
    
      | 99 |  | ✗ | bcins(:,:) = 0. ; bcins_pi(:,:) = 0. | 
    
      | 100 |  | ✗ | loadbc=0. | 
    
      | 101 |  |  | END IF | 
    
      | 102 |  |  |  | 
    
      | 103 |  |  |  | 
    
      | 104 |  |  | ! Read and interpolate pomsol and pomins | 
    
      | 105 |  | ✗ | IF ( flag_aerosol .EQ. 3 .OR. & | 
    
      | 106 |  |  | flag_aerosol .EQ. 6 ) THEN | 
    
      | 107 |  |  |  | 
    
      | 108 |  | ✗ | CALL readaerosol_interp(id_ASPOMM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, pomsol, pomsol_pi, load_tmp3) | 
    
      | 109 |  | ✗ | CALL readaerosol_interp(id_AIPOMM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, pomins, pomins_pi, load_tmp4) | 
    
      | 110 |  | ✗ | loadoa(:)=load_tmp3(:)+load_tmp4(:) | 
    
      | 111 |  |  | ELSE | 
    
      | 112 |  | ✗ | pomsol(:,:) = 0. ; pomsol_pi(:,:) = 0. | 
    
      | 113 |  | ✗ | pomins(:,:) = 0. ; pomins_pi(:,:) = 0. | 
    
      | 114 |  | ✗ | loadoa=0. | 
    
      | 115 |  |  | END IF | 
    
      | 116 |  |  |  | 
    
      | 117 |  |  |  | 
    
      | 118 |  |  | ! Read and interpolate csssm, ssssm, assssm | 
    
      | 119 |  | ✗ | IF (flag_aerosol .EQ. 4 .OR. & | 
    
      | 120 |  |  | flag_aerosol .EQ. 6 ) THEN | 
    
      | 121 |  |  |  | 
    
      | 122 |  | ✗ | CALL readaerosol_interp(id_SSSSM_phy ,itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, sssupco, sssupco_pi,  load_tmp5) | 
    
      | 123 |  | ✗ | CALL readaerosol_interp(id_CSSSM_phy ,itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, sscoarse,sscoarse_pi, load_tmp6) | 
    
      | 124 |  | ✗ | CALL readaerosol_interp(id_ASSSM_phy ,itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, ssacu,   ssacu_pi,    load_tmp7) | 
    
      | 125 |  | ✗ | loadss(:)=load_tmp5(:)+load_tmp6(:)+load_tmp7(:) | 
    
      | 126 |  |  | ELSE | 
    
      | 127 |  | ✗ | sscoarse(:,:) = 0. ; sscoarse_pi(:,:) = 0. | 
    
      | 128 |  | ✗ | ssacu(:,:)    = 0. ; ssacu_pi(:,:) = 0. | 
    
      | 129 |  | ✗ | sssupco(:,:)  = 0. ; sssupco_pi = 0. | 
    
      | 130 |  | ✗ | loadss=0. | 
    
      | 131 |  |  | ENDIF | 
    
      | 132 |  |  |  | 
    
      | 133 |  |  | ! Read and interpolate cidustm | 
    
      | 134 |  | ✗ | IF (flag_aerosol .EQ. 5 .OR.  & | 
    
      | 135 |  |  | flag_aerosol .EQ. 6 ) THEN | 
    
      | 136 |  |  |  | 
    
      | 137 |  | ✗ | CALL readaerosol_interp(id_CIDUSTM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, cidust, cidust_pi, loaddust) | 
    
      | 138 |  |  | ELSE | 
    
      | 139 |  | ✗ | cidust(:,:) = 0. ; cidust_pi(:,:) = 0. | 
    
      | 140 |  | ✗ | loaddust=0. | 
    
      | 141 |  |  | ENDIF | 
    
      | 142 |  |  |  | 
    
      | 143 |  |  | ! | 
    
      | 144 |  |  | ! Store all aerosols in one variable | 
    
      | 145 |  |  | ! | 
    
      | 146 |  | ✗ | m_allaer(:,:,id_ASBCM_phy)  = bcsol(:,:)        ! ASBCM | 
    
      | 147 |  | ✗ | m_allaer(:,:,id_ASPOMM_phy) = pomsol(:,:)       ! ASPOMM | 
    
      | 148 |  | ✗ | m_allaer(:,:,id_ASSO4M_phy) = sulfate(:,:)      ! ASSO4M (= SO4) | 
    
      | 149 |  | ✗ | m_allaer(:,:,id_CSSO4M_phy) = 0.                ! CSSO4M | 
    
      | 150 |  | ✗ | m_allaer(:,:,id_SSSSM_phy)  = sssupco(:,:)      ! SSSSM | 
    
      | 151 |  | ✗ | m_allaer(:,:,id_CSSSM_phy)  = sscoarse(:,:)     ! CSSSM | 
    
      | 152 |  | ✗ | m_allaer(:,:,id_ASSSM_phy)  = ssacu(:,:)        ! ASSSM | 
    
      | 153 |  | ✗ | m_allaer(:,:,id_CIDUSTM_phy)= cidust(:,:)       ! CIDUSTM | 
    
      | 154 |  | ✗ | m_allaer(:,:,id_AIBCM_phy)  = bcins(:,:)        ! AIBCM | 
    
      | 155 |  | ✗ | m_allaer(:,:,id_AIPOMM_phy) = pomins(:,:)       ! AIPOMM | 
    
      | 156 |  | ✗ | m_allaer(:,:,id_ASNO3M_phy) = 0.0 | 
    
      | 157 |  | ✗ | m_allaer(:,:,id_CSNO3M_phy) = 0.0 | 
    
      | 158 |  | ✗ | m_allaer(:,:,id_CINO3M_phy) = 0.0 | 
    
      | 159 |  |  |  | 
    
      | 160 |  |  | !RAF | 
    
      | 161 |  | ✗ | m_allaer_pi(:,:,id_ASBCM_phy)   = bcsol_pi(:,:)        ! ASBCM pre-ind | 
    
      | 162 |  | ✗ | m_allaer_pi(:,:,id_ASPOMM_phy)  = pomsol_pi(:,:)       ! ASPOMM pre-ind | 
    
      | 163 |  | ✗ | m_allaer_pi(:,:,id_ASSO4M_phy)  = sulfate_pi(:,:)      ! ASSO4M (= SO4) pre-ind | 
    
      | 164 |  | ✗ | m_allaer_pi(:,:,id_CSSO4M_phy)  = 0.                   ! CSSO4M pre-ind | 
    
      | 165 |  | ✗ | m_allaer_pi(:,:,id_SSSSM_phy)   = sssupco_pi(:,:)      ! SSSSM pre-ind | 
    
      | 166 |  | ✗ | m_allaer_pi(:,:,id_CSSSM_phy)   = sscoarse_pi(:,:)     ! CSSSM pre-ind | 
    
      | 167 |  | ✗ | m_allaer_pi(:,:,id_ASSSM_phy)   = ssacu_pi(:,:)        ! ASSSM pre-ind | 
    
      | 168 |  | ✗ | m_allaer_pi(:,:,id_CIDUSTM_phy) = cidust_pi(:,:)       ! CIDUSTM pre-ind | 
    
      | 169 |  | ✗ | m_allaer_pi(:,:,id_AIBCM_phy)   = bcins_pi(:,:)        ! AIBCM pre-ind | 
    
      | 170 |  | ✗ | m_allaer_pi(:,:,id_AIPOMM_phy)  = pomins_pi(:,:)       ! AIPOMM pre-ind | 
    
      | 171 |  | ✗ | m_allaer_pi(:,:,id_ASNO3M_phy) = 0.0 | 
    
      | 172 |  | ✗ | m_allaer_pi(:,:,id_CSNO3M_phy) = 0.0 | 
    
      | 173 |  | ✗ | m_allaer_pi(:,:,id_CINO3M_phy) = 0.0 | 
    
      | 174 |  |  | ! | 
    
      | 175 |  |  | ! Calculate the total mass of all soluble aersosols | 
    
      | 176 |  |  | ! | 
    
      | 177 |  | ✗ | mass_solu_aero(:,:)    = sulfate(:,:)    + bcsol(:,:)    + pomsol(:,:) + ssacu(:,:) | 
    
      | 178 |  | ✗ | mass_solu_aero_pi(:,:) = sulfate_pi(:,:) + bcsol_pi(:,:) + pomsol_pi(:,:) + ssacu_pi(:,:) | 
    
      | 179 |  |  |  | 
    
      | 180 |  |  | !**************************************************************************************** | 
    
      | 181 |  |  | ! 2) Calculate optical properties for the aerosols | 
    
      | 182 |  |  | ! | 
    
      | 183 |  |  | !**************************************************************************************** | 
    
      | 184 |  | ✗ | DO k = 1, klev | 
    
      | 185 |  | ✗ | DO i = 1, klon | 
    
      | 186 |  | ✗ | pdel(i,k) = paprs(i,k) - paprs (i,k+1) | 
    
      | 187 |  |  | END DO | 
    
      | 188 |  |  | END DO | 
    
      | 189 |  |  |  | 
    
      | 190 |  |  | ! RAF delete??     fractnat_allaer(:,:) = 0. | 
    
      | 191 |  |  | ! RAF fractnat_allaer -> m_allaer_pi | 
    
      | 192 |  |  |  | 
    
      | 193 |  |  | CALL aeropt_2bands( & | 
    
      | 194 |  |  | pdel, m_allaer, pdtphys, rhcl, & | 
    
      | 195 |  |  | tau_aero, piz_aero, cg_aero,   & | 
    
      | 196 |  |  | m_allaer_pi, flag_aerosol, & | 
    
      | 197 |  | ✗ | pplay, t_seri, presnivs) | 
    
      | 198 |  |  |  | 
    
      | 199 |  |  | ! aeropt_5wv only for validation and diagnostics. | 
    
      | 200 |  |  | CALL aeropt_5wv(                    & | 
    
      | 201 |  |  | pdel, m_allaer,                & | 
    
      | 202 |  |  | pdtphys, rhcl, aerindex,       & | 
    
      | 203 |  |  | flag_aerosol, pplay, t_seri,   & | 
    
      | 204 |  | ✗ | tausum_aero, tau3d_aero, presnivs) | 
    
      | 205 |  |  |  | 
    
      | 206 |  |  | ! Diagnostics calculation for CMIP5 protocol | 
    
      | 207 |  | ✗ | sconcso4(:)=m_allaer(:,1,id_ASSO4M_phy)*1.e-9 | 
    
      | 208 |  | ✗ | sconcno3(:)=m_allaer(:,1,id_ASNO3M_phy)*1.e-9 | 
    
      | 209 |  | ✗ | sconcoa(:)=(m_allaer(:,1,id_ASPOMM_phy)+m_allaer(:,1,id_AIPOMM_phy))*1.e-9 | 
    
      | 210 |  | ✗ | sconcbc(:)=(m_allaer(:,1,id_ASBCM_phy)+m_allaer(:,1,id_AIBCM_phy))*1.e-9 | 
    
      | 211 |  | ✗ | sconcss(:)=(m_allaer(:,1,id_ASSSM_phy)+m_allaer(:,1,id_CSSSM_phy)+m_allaer(:,1,id_SSSSM_phy))*1.e-9 | 
    
      | 212 |  | ✗ | sconcdust(:)=m_allaer(:,1,id_CIDUSTM_phy)*1.e-9 | 
    
      | 213 |  | ✗ | concso4(:,:)=m_allaer(:,:,id_ASSO4M_phy)*1.e-9 | 
    
      | 214 |  | ✗ | concno3(:,:)=m_allaer(:,:,id_ASNO3M_phy)*1.e-9 | 
    
      | 215 |  | ✗ | concoa(:,:)=(m_allaer(:,:,id_ASPOMM_phy)+m_allaer(:,:,id_AIPOMM_phy))*1.e-9 | 
    
      | 216 |  | ✗ | concbc(:,:)=(m_allaer(:,:,id_ASBCM_phy)+m_allaer(:,:,id_AIBCM_phy))*1.e-9 | 
    
      | 217 |  | ✗ | concss(:,:)=(m_allaer(:,:,id_ASSSM_phy)+m_allaer(:,:,id_CSSSM_phy)+m_allaer(:,:,id_SSSSM_phy))*1.e-9 | 
    
      | 218 |  | ✗ | concdust(:,:)=m_allaer(:,:,id_CIDUSTM_phy)*1.e-9 | 
    
      | 219 |  |  |  | 
    
      | 220 |  | ✗ | END SUBROUTINE readaerosol_optic | 
    
      | 221 |  |  |  |