source: LMDZ5/branches/testing/libf/phylmd/rrtm/readaerosol_optic_rrtm.F90 @ 2160

Last change on this file since 2160 was 2160, checked in by Laurent Fairhead, 10 years ago

Merged trunk changes -r2070:2158 into testing branch. Compilation problems introduced by revision r2155 have been corrected by hand

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:keywords set to Author Date Id Revi
File size: 15.2 KB
Line 
1! $Id: readaerosol_optic_rrtm.F90 2160 2014-11-28 15:36:29Z fairhead $
2!
3SUBROUTINE readaerosol_optic_rrtm(debut, aerosol_couple,  &
4     new_aod, flag_aerosol, itap, rjourvrai, &
5     pdtphys, pplay, paprs, t_seri, rhcl, presnivs, &
6     tr_seri, mass_solu_aero, mass_solu_aero_pi, &
7     tau_aero, piz_aero, cg_aero, &
8     tausum_aero, tau3d_aero )
9
10  ! This routine will :
11  ! 1) recevie the aerosols(already read and interpolated) corresponding to flag_aerosol
12  ! 2) calculate the optical properties for the aerosols
13  !
14
15  USE dimphy
16  USE aero_mod
17  USE phys_local_var_mod, only: sconcso4,sconcno3,sconcoa,sconcbc,sconcss,sconcdust, &
18       concso4,concno3,concoa,concbc,concss,concdust,loadso4,loadoa,loadbc,loadss,loaddust, &
19       load_tmp1,load_tmp2,load_tmp3,load_tmp4,load_tmp5,load_tmp6,load_tmp7
20
21  USE infotrac
22
23  IMPLICIT NONE
24  include "clesphys.h"
25  include "YOMCST.h"
26
27
28  ! Input arguments
29  !****************************************************************************************
30  LOGICAL, INTENT(IN)                      :: debut
31  LOGICAL, INTENT(IN)                      :: aerosol_couple
32  LOGICAL, INTENT(IN)                      :: new_aod
33  INTEGER, INTENT(IN)                      :: flag_aerosol
34  INTEGER, INTENT(IN)                      :: itap
35  REAL, INTENT(IN)                         :: rjourvrai
36  REAL, INTENT(IN)                         :: pdtphys
37  REAL, DIMENSION(klon,klev), INTENT(IN)   :: pplay
38  REAL, DIMENSION(klon,klev+1), INTENT(IN) :: paprs
39  REAL, DIMENSION(klon,klev), INTENT(IN)   :: t_seri
40  REAL, DIMENSION(klon,klev), INTENT(IN)   :: rhcl   ! humidite relative ciel clair
41  REAL, DIMENSION(klev), INTENT(IN)        :: presnivs
42  REAL, DIMENSION(klon,klev,nbtr), INTENT(IN) :: tr_seri ! concentration tracer
43
44  ! Output arguments
45  !****************************************************************************************
46  REAL, DIMENSION(klon,klev), INTENT(OUT)     :: mass_solu_aero    ! Total mass for all soluble aerosols
47  REAL, DIMENSION(klon,klev), INTENT(OUT)     :: mass_solu_aero_pi !     -"-     preindustrial values
48  REAL, DIMENSION(klon,klev,2,NSW), INTENT(OUT) :: tau_aero    ! Aerosol optical thickness
49  REAL, DIMENSION(klon,klev,2,NSW), INTENT(OUT) :: piz_aero    ! Single scattering albedo aerosol
50  REAL, DIMENSION(klon,klev,2,NSW), INTENT(OUT) :: cg_aero     ! asymmetry parameter aerosol
51  REAL, DIMENSION(klon,nwave,naero_tot), INTENT(OUT)       :: tausum_aero
52  REAL, DIMENSION(klon,klev,nwave,naero_tot), INTENT(OUT)  :: tau3d_aero
53
54  ! Local variables
55  !****************************************************************************************
56  REAL, DIMENSION(klon)        :: aerindex      ! POLDER aerosol index
57  REAL, DIMENSION(klon,klev)   :: sulfacc       ! SO4 accumulation concentration [ug/m3]
58  REAL, DIMENSION(klon,klev)   :: sulfcoarse    ! SO4 coarse concentration [ug/m3]
59  REAL, DIMENSION(klon,klev)   :: bcsol         ! BC soluble concentration [ug/m3]
60  REAL, DIMENSION(klon,klev)   :: bcins         ! BC insoluble concentration [ug/m3]
61  REAL, DIMENSION(klon,klev)   :: pomsol        ! POM soluble concentration [ug/m3]
62  REAL, DIMENSION(klon,klev)   :: pomins        ! POM insoluble concentration [ug/m3]
63  REAL, DIMENSION(klon,klev)   :: cidust        ! DUST aerosol concentration  [ug/m3]
64  REAL, DIMENSION(klon,klev)   :: sscoarse      ! SS Coarse concentration [ug/m3]
65  REAL, DIMENSION(klon,klev)   :: sssupco       ! SS Super Coarse concentration [ug/m3]
66  REAL, DIMENSION(klon,klev)   :: ssacu         ! SS Acumulation concentration [ug/m3]
67  REAL, DIMENSION(klon,klev)   :: nitracc       ! nitrate accumulation concentration [ug/m3]
68  REAL, DIMENSION(klon,klev)   :: nitrcoarse    ! nitrate coarse concentration [ug/m3]
69  REAL, DIMENSION(klon,klev)   :: nitrinscoarse ! nitrate insoluble coarse concentration [ug/m3]
70  REAL, DIMENSION(klon,klev)   :: sulfacc_pi
71  REAL, DIMENSION(klon,klev)   :: sulfcoarse_pi
72  REAL, DIMENSION(klon,klev)   :: bcsol_pi
73  REAL, DIMENSION(klon,klev)   :: bcins_pi
74  REAL, DIMENSION(klon,klev)   :: pomsol_pi
75  REAL, DIMENSION(klon,klev)   :: pomins_pi
76  REAL, DIMENSION(klon,klev)   :: cidust_pi
77  REAL, DIMENSION(klon,klev)   :: sscoarse_pi
78  REAL, DIMENSION(klon,klev)   :: sssupco_pi
79  REAL, DIMENSION(klon,klev)   :: ssacu_pi
80  REAL, DIMENSION(klon,klev)   :: nitracc_pi
81  REAL, DIMENSION(klon,klev)   :: nitrcoarse_pi
82  REAL, DIMENSION(klon,klev)   :: nitrinscoarse_pi
83  REAL, DIMENSION(klon,klev)   :: pdel, zrho
84  REAL, DIMENSION(klon,klev,naero_tot) :: m_allaer
85  REAL, DIMENSION(klon,klev,naero_tot) :: m_allaer_pi !RAF 
86  !  REAL, DIMENSION(klon,naero_tot)      :: fractnat_allaer !RAF delete??
87  character(len=8), dimension(nbtr) :: tracname
88  integer :: id_ASBCM, id_ASPOMM, id_ASSO4M, id_ASMSAM, id_CSSO4M, id_CSMSAM, id_SSSSM
89  integer :: id_CSSSM, id_ASSSM, id_CIDUSTM, id_AIBCM, id_AIPOMM, id_ASNO3M, id_CSNO3M, id_CINO3M
90  INTEGER :: k, i
91
92  !--air density
93  zrho(:,:)=pplay(:,:)/t_seri(:,:)/RD                     !--kg/m3
94
95  !****************************************************************************************
96  ! 1) Get aerosol mass
97  !   
98  !****************************************************************************************
99  !
100  !
101  IF (aerosol_couple) THEN   !--we get aerosols from tr_seri array from INCA
102     !
103     !--copy fields from INCA tr_seri
104     !--convert to ug m-3 unit for consistency with offline fields
105     !
106#ifdef INCA
107     call tracinca_name(tracname)
108#endif
109
110     do i=1,nbtr
111        select case(trim(tracname(i)))
112           case ("ASBCM")
113              id_ASBCM = i
114           case ("ASPOMM")
115              id_ASPOMM = i
116           case ("ASSO4M")
117              id_ASSO4M = i
118           case ("ASMSAM")
119              id_ASMSAM = i
120           case ("CSSO4M")
121              id_CSSO4M = i
122           case ("CSMSAM")
123              id_CSMSAM = i
124           case ("SSSSM")
125              id_SSSSM = i
126           case ("CSSSM")
127              id_CSSSM = i
128           case ("ASSSM")
129              id_ASSSM = i
130           case ("CIDUSTM")
131              id_CIDUSTM = i
132           case ("AIBCM")
133              id_AIBCM = i
134           case ("AIPOMM")
135              id_AIPOMM = i
136           case ("ASNO3M")
137              id_ASNO3M = i
138           case ("CSNO3M")
139              id_CSNO3M = i
140           case ("CINO3M")
141              id_CINO3M = i
142           end select
143     enddo
144
145
146     bcsol(:,:)        =   tr_seri(:,:,id_ASBCM)                         *zrho(:,:)*1.e9  ! ASBCM
147     pomsol(:,:)       =   tr_seri(:,:,id_ASPOMM)                        *zrho(:,:)*1.e9  ! ASPOMM
148     sulfacc(:,:)      =  (tr_seri(:,:,id_ASSO4M)+tr_seri(:,:,id_ASMSAM))*zrho(:,:)*1.e9  ! ASSO4M (=SO4) + ASMSAM (=MSA)
149     sulfcoarse(:,:)   =  (tr_seri(:,:,id_CSSO4M)+tr_seri(:,:,id_CSMSAM))*zrho(:,:)*1.e9  ! CSSO4M (=SO4) + CSMSAM (=MSA)
150     sssupco(:,:)      =   tr_seri(:,:,id_SSSSM)                         *zrho(:,:)*1.e9  ! SSSSM
151     sscoarse(:,:)     =   tr_seri(:,:,id_CSSSM)                         *zrho(:,:)*1.e9  ! CSSSM
152     ssacu(:,:)        =   tr_seri(:,:,id_ASSSM)                         *zrho(:,:)*1.e9  ! ASSSM
153     cidust(:,:)       =   tr_seri(:,:,id_CIDUSTM)                       *zrho(:,:)*1.e9  ! CIDUSTM
154     bcins(:,:)        =   tr_seri(:,:,id_AIBCM)                         *zrho(:,:)*1.e9  ! AIBCM
155     pomins(:,:)       =   tr_seri(:,:,id_AIPOMM)                        *zrho(:,:)*1.e9  ! AIPOMM
156     nitracc(:,:)      =   tr_seri(:,:,id_ASNO3M)                        *zrho(:,:)*1.e9  ! ASNO3M
157     nitrcoarse(:,:)   =   tr_seri(:,:,id_CSNO3M)                        *zrho(:,:)*1.e9  ! CSNO3M
158     nitrinscoarse(:,:)=   tr_seri(:,:,id_CINO3M)                        *zrho(:,:)*1.e9  ! CINO3M
159     !
160     bcsol_pi(:,:)        =   0.0 ! ASBCM pre-ind
161     pomsol_pi(:,:)       =   0.0 ! ASPOMM pre-ind
162     sulfacc_pi(:,:)      =   0.0 ! ASSO4M (=SO4) + ASMSAM (=MSA) pre-ind
163     sulfcoarse_pi(:,:)   =   0.0 ! CSSO4M (=SO4) + CSMSAM (=MSA) pre-ind
164     sssupco_pi(:,:)      =   0.0 ! SSSSM pre-ind
165     sscoarse_pi(:,:)     =   0.0 ! CSSSM pre-ind
166     ssacu_pi(:,:)        =   0.0 ! ASSSM pre-ind
167     cidust_pi(:,:)       =   0.0 ! CIDUSTM pre-ind
168     bcins_pi(:,:)        =   0.0 ! AIBCM pre-ind
169     pomins_pi(:,:)       =   0.0 ! AIPOMM pre-ind
170     nitracc_pi(:,:)      =   0.0 ! ASNO3M pre-ind
171     nitrcoarse_pi(:,:)   =   0.0 ! CSNO3M pre-ind
172     nitrinscoarse_pi(:,:)=   0.0 ! CINO3M
173     !
174  ELSE !--not aerosol_couple
175     !
176     ! Read and interpolate sulfate
177     IF ( flag_aerosol .EQ. 1 .OR. &
178          flag_aerosol .EQ. 6 ) THEN
179
180        CALL readaerosol_interp(id_ASSO4M_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, sulfacc, sulfacc_pi,loadso4)
181     ELSE
182        sulfacc(:,:) = 0. ; sulfacc_pi(:,:) = 0.
183        loadso4=0.
184     END IF
185
186     ! Read and interpolate bcsol and bcins
187     IF ( flag_aerosol .EQ. 2 .OR. &
188          flag_aerosol .EQ. 6 ) THEN
189
190        ! Get bc aerosol distribution
191        CALL readaerosol_interp(id_ASBCM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, bcsol, bcsol_pi, load_tmp1 )
192        CALL readaerosol_interp(id_AIBCM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, bcins, bcins_pi, load_tmp2 )
193        loadbc(:)=load_tmp1(:)+load_tmp2(:)
194     ELSE
195        bcsol(:,:) = 0. ; bcsol_pi(:,:) = 0.
196        bcins(:,:) = 0. ; bcins_pi(:,:) = 0.
197        loadbc=0.
198     END IF
199
200
201     ! Read and interpolate pomsol and pomins
202     IF ( flag_aerosol .EQ. 3 .OR. &
203          flag_aerosol .EQ. 6 ) THEN
204
205        CALL readaerosol_interp(id_ASPOMM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, pomsol, pomsol_pi, load_tmp3)
206        CALL readaerosol_interp(id_AIPOMM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, pomins, pomins_pi, load_tmp4)
207        loadoa(:)=load_tmp3(:)+load_tmp4(:)
208     ELSE
209        pomsol(:,:) = 0. ; pomsol_pi(:,:) = 0.
210        pomins(:,:) = 0. ; pomins_pi(:,:) = 0.
211        loadoa=0.
212     END IF
213
214
215     ! Read and interpolate csssm, ssssm, assssm
216     IF (flag_aerosol .EQ. 4 .OR. &
217          flag_aerosol .EQ. 6 ) THEN
218
219        CALL readaerosol_interp(id_SSSSM_phy ,itap, pdtphys,rjourvrai, &
220        debut, pplay, paprs, t_seri, sssupco, sssupco_pi, load_tmp5)
221        CALL readaerosol_interp(id_CSSSM_phy ,itap, pdtphys,rjourvrai, &
222        debut, pplay, paprs, t_seri, sscoarse,sscoarse_pi, load_tmp6)
223        CALL readaerosol_interp(id_ASSSM_phy ,itap, pdtphys, rjourvrai, &
224        debut, pplay, paprs, t_seri, ssacu, ssacu_pi, load_tmp7)
225        loadss(:)=load_tmp5(:)+load_tmp6(:)+load_tmp7(:)
226     ELSE
227        sscoarse(:,:) = 0. ; sscoarse_pi(:,:) = 0.
228        ssacu(:,:)    = 0. ; ssacu_pi(:,:) = 0.
229        sssupco(:,:)  = 0. ; sssupco_pi = 0.
230        loadss=0.
231     ENDIF
232
233     ! Read and interpolate cidustm
234     IF (flag_aerosol .EQ. 5 .OR.  &
235          flag_aerosol .EQ. 6 ) THEN
236
237        CALL readaerosol_interp(id_CIDUSTM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, cidust, cidust_pi, loaddust)
238
239     ELSE
240        cidust(:,:) = 0. ; cidust_pi(:,:) = 0.
241        loaddust=0.
242     ENDIF
243     !
244     sulfcoarse(:,:)      =   0.0 ! CSSO4M (=SO4) + CSMSAM (=MSA)
245     sulfcoarse_pi(:,:)   =   0.0 ! CSSO4M (=SO4) + CSMSAM (=MSA) pre-ind
246     !
247     !--placeholder for offline nitrate   
248     !
249     nitracc(:,:)         =   0.0
250     nitracc_pi(:,:)      =   0.0
251     nitrcoarse(:,:)      =   0.0
252     nitrcoarse_pi(:,:)   =   0.0
253     nitrinscoarse(:,:)   =   0.0
254     nitrinscoarse_pi(:,:)=   0.0
255
256  ENDIF !--not aerosol_couple
257
258  !
259  ! Store all aerosols in one variable
260  !
261  m_allaer(:,:,id_ASBCM_phy)  = bcsol(:,:)        ! ASBCM
262  m_allaer(:,:,id_ASPOMM_phy) = pomsol(:,:)       ! ASPOMM
263  m_allaer(:,:,id_ASSO4M_phy) = sulfacc(:,:)      ! ASSO4M (= SO4)
264  m_allaer(:,:,id_CSSO4M_phy) = sulfcoarse(:,:)   ! CSSO4M
265  m_allaer(:,:,id_SSSSM_phy)  = sssupco(:,:)      ! SSSSM
266  m_allaer(:,:,id_CSSSM_phy)  = sscoarse(:,:)     ! CSSSM
267  m_allaer(:,:,id_ASSSM_phy)  = ssacu(:,:)        ! ASSSM
268  m_allaer(:,:,id_CIDUSTM_phy)= cidust(:,:)       ! CIDUSTM
269  m_allaer(:,:,id_AIBCM_phy)  = bcins(:,:)        ! AIBCM
270  m_allaer(:,:,id_ASNO3M_phy) = nitracc(:,:)      ! ASNO3M
271  m_allaer(:,:,id_CSNO3M_phy) = nitrcoarse(:,:)   ! CSNO3M
272  m_allaer(:,:,id_CINO3M_phy) = nitrinscoarse(:,:)! CINO3M
273  m_allaer(:,:,id_AIPOMM_phy) = pomins(:,:)       ! AIPOMM
274  m_allaer(:,:,id_STRAT_phy)  = 0.0
275
276  !RAF
277  m_allaer_pi(:,:,id_ASBCM_phy)  = bcsol_pi(:,:)        ! ASBCM pre-ind
278  m_allaer_pi(:,:,id_ASPOMM_phy) = pomsol_pi(:,:)       ! ASPOMM pre-ind
279  m_allaer_pi(:,:,id_ASSO4M_phy) = sulfacc_pi(:,:)      ! ASSO4M (= SO4) pre-ind
280  m_allaer_pi(:,:,id_CSSO4M_phy) = sulfcoarse_pi(:,:)   ! CSSO4M pre-ind
281  m_allaer_pi(:,:,id_SSSSM_phy)  = sssupco_pi(:,:)      ! SSSSM pre-ind
282  m_allaer_pi(:,:,id_CSSSM_phy)  = sscoarse_pi(:,:)     ! CSSSM pre-ind
283  m_allaer_pi(:,:,id_ASSSM_phy)  = ssacu_pi(:,:)        ! ASSSM pre-ind
284  m_allaer_pi(:,:,id_CIDUSTM_phy)= cidust_pi(:,:)       ! CIDUSTM pre-ind
285  m_allaer_pi(:,:,id_AIBCM_phy)  = bcins_pi(:,:)        ! AIBCM pre-ind
286  m_allaer_pi(:,:,id_ASNO3M_phy) = nitracc_pi(:,:)      ! ASNO3M pre-ind
287  m_allaer_pi(:,:,id_CSNO3M_phy) = nitrcoarse_pi(:,:)   ! CSNO3M pre-ind
288  m_allaer_pi(:,:,id_CINO3M_phy) = nitrinscoarse_pi(:,:)! CINO3M pre-ind
289  m_allaer_pi(:,:,id_AIPOMM_phy) = pomins_pi(:,:)       ! AIPOMM pre-ind
290  m_allaer_pi(:,:,id_STRAT_phy)  = 0.0
291
292  !
293  ! Calculate the total mass of all soluble aersosols
294  ! to be revisited for AR6
295  mass_solu_aero(:,:)    = sulfacc(:,:)    + bcsol(:,:)    + pomsol(:,:)   + nitracc(:,:)   ! + &
296  !                           sscoarse(:,:)    + ssacu(:,:)    + sssupco(:,:)
297  mass_solu_aero_pi(:,:) = sulfacc_pi(:,:) + bcsol_pi(:,:) + pomsol_pi(:,:) + nitracc_pi(:,:) ! + &
298  !                           sscoarse_pi(:,:) + ssacu_pi(:,:) + sssupco_pi(:,:)
299
300  !****************************************************************************************
301  ! 2) Calculate optical properties for the aerosols
302  !
303  !****************************************************************************************
304  DO k = 1, klev
305     DO i = 1, klon
306        pdel(i,k) = paprs(i,k) - paprs (i,k+1)
307     END DO
308  END DO
309
310  ! aeropt_6bands for rrtm
311  CALL aeropt_6bands_rrtm( &
312       pdel, m_allaer, pdtphys, rhcl, &
313       tau_aero, piz_aero, cg_aero,   &
314       m_allaer_pi, flag_aerosol, &
315       zrho )
316
317  ! aeropt_5wv only for validation and diagnostics
318  CALL aeropt_5wv_rrtm(                    &
319       pdel, m_allaer,                &
320       pdtphys, rhcl, aerindex,       &
321       flag_aerosol, pplay, t_seri,   &
322       tausum_aero, tau3d_aero )
323
324  ! Diagnostics calculation for CMIP5 protocol
325  sconcso4(:)  =m_allaer(:,1,id_ASSO4M_phy)*1.e-9
326  sconcno3(:)  =(m_allaer(:,1,id_ASNO3M_phy)+m_allaer(:,1,id_CSNO3M_phy)+m_allaer(:,1,id_CINO3M_phy))*1.e-9
327  sconcoa(:)   =(m_allaer(:,1,id_ASPOMM_phy)+m_allaer(:,1,id_AIPOMM_phy))*1.e-9
328  sconcbc(:)   =(m_allaer(:,1,id_ASBCM_phy)+m_allaer(:,1,id_AIBCM_phy))*1.e-9
329  sconcss(:)   =(m_allaer(:,1,id_ASSSM_phy)+m_allaer(:,1,id_CSSSM_phy)+m_allaer(:,1,id_SSSSM_phy))*1.e-9
330  sconcdust(:) =m_allaer(:,1,id_CIDUSTM_phy)*1.e-9
331  concso4(:,:) =m_allaer(:,:,id_ASSO4M_phy)*1.e-9
332  concno3(:,:) =(m_allaer(:,:,id_ASNO3M_phy)+m_allaer(:,:,id_CSNO3M_phy)+m_allaer(:,:,id_CINO3M_phy))*1.e-9
333  concoa(:,:)  =(m_allaer(:,:,id_ASPOMM_phy)+m_allaer(:,:,id_AIPOMM_phy))*1.e-9
334  concbc(:,:)  =(m_allaer(:,:,id_ASBCM_phy)+m_allaer(:,:,id_AIBCM_phy))*1.e-9
335  concss(:,:)  =(m_allaer(:,:,id_ASSSM_phy)+m_allaer(:,:,id_CSSSM_phy)+m_allaer(:,:,id_SSSSM_phy))*1.e-9
336  concdust(:,:)=m_allaer(:,:,id_CIDUSTM_phy)*1.e-9
337
338END SUBROUTINE readaerosol_optic_rrtm
Note: See TracBrowser for help on using the repository browser.