LMDZ
readaerosol_optic.F90
Go to the documentation of this file.
1 ! $Id: readaerosol_optic.F90 2324 2015-07-08 15:20:22Z oboucher $
2 !
3 SUBROUTINE readaerosol_optic(debut, new_aod, 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
19  IMPLICIT NONE
20 
21 ! Input arguments
22 !****************************************************************************************
23  LOGICAL, INTENT(IN) :: debut
24  LOGICAL, INTENT(IN) :: new_aod
25  INTEGER, INTENT(IN) :: flag_aerosol
26  INTEGER, INTENT(IN) :: itap
27  REAL, INTENT(IN) :: rjourvrai
28  REAL, INTENT(IN) :: pdtphys
29  REAL, DIMENSION(klon,klev), INTENT(IN) :: pplay
30  REAL, DIMENSION(klon,klev+1), INTENT(IN) :: paprs
31  REAL, DIMENSION(klon,klev), INTENT(IN) :: t_seri
32  REAL, DIMENSION(klon,klev), INTENT(IN) :: rhcl ! humidite relative ciel clair
33  REAL, DIMENSION(klev), INTENT(IN) :: presnivs
34 
35 ! Output arguments
36 !****************************************************************************************
37  REAL, DIMENSION(klon,klev), INTENT(OUT) :: mass_solu_aero ! Total mass for all soluble aerosols
38  REAL, DIMENSION(klon,klev), INTENT(OUT) :: mass_solu_aero_pi ! -"- preindustrial values
39  REAL, DIMENSION(klon,klev,naero_grp,nbands), INTENT(OUT) :: tau_aero ! Aerosol optical thickness
40  REAL, DIMENSION(klon,klev,naero_grp,nbands), INTENT(OUT) :: piz_aero ! Single scattering albedo aerosol
41  REAL, DIMENSION(klon,klev,naero_grp,nbands), INTENT(OUT) :: cg_aero ! asymmetry parameter aerosol
42 ! REAL, DIMENSION(klon,nwave,naero_spc), INTENT(OUT) :: tausum_aero
43 ! REAL, DIMENSION(klon,klev,nwave,naero_spc), INTENT(OUT) :: tau3d_aero
44 !--correction mini bug OB
45  REAL, DIMENSION(klon,nwave,naero_tot), INTENT(OUT) :: tausum_aero
46  REAL, DIMENSION(klon,klev,nwave,naero_tot), INTENT(OUT) :: tau3d_aero
47 
48 ! Local variables
49 !****************************************************************************************
50  REAL, DIMENSION(klon) :: aerindex ! POLDER aerosol index
51  REAL, DIMENSION(klon,klev) :: sulfate ! SO4 aerosol concentration [ug/m3]
52  REAL, DIMENSION(klon,klev) :: bcsol ! BC soluble concentration [ug/m3]
53  REAL, DIMENSION(klon,klev) :: bcins ! BC insoluble concentration [ug/m3]
54  REAL, DIMENSION(klon,klev) :: pomsol ! POM soluble concentration [ug/m3]
55  REAL, DIMENSION(klon,klev) :: pomins ! POM insoluble concentration [ug/m3]
56  REAL, DIMENSION(klon,klev) :: cidust ! DUST aerosol concentration [ug/m3]
57  REAL, DIMENSION(klon,klev) :: sscoarse ! SS Coarse concentration [ug/m3]
58  REAL, DIMENSION(klon,klev) :: sssupco ! SS Super Coarse concentration [ug/m3]
59  REAL, DIMENSION(klon,klev) :: ssacu ! SS Acumulation concentration [ug/m3]
60  REAL, DIMENSION(klon,klev) :: sulfate_pi
61  REAL, DIMENSION(klon,klev) :: bcsol_pi
62  REAL, DIMENSION(klon,klev) :: bcins_pi
63  REAL, DIMENSION(klon,klev) :: pomsol_pi
64  REAL, DIMENSION(klon,klev) :: pomins_pi
65  REAL, DIMENSION(klon,klev) :: cidust_pi
66  REAL, DIMENSION(klon,klev) :: sscoarse_pi
67  REAL, DIMENSION(klon,klev) :: sssupco_pi
68  REAL, DIMENSION(klon,klev) :: ssacu_pi
69  REAL, DIMENSION(klon,klev) :: pdel
70  REAL, DIMENSION(klon,klev,naero_tot) :: m_allaer
71  REAL, DIMENSION(klon,klev,naero_tot) :: m_allaer_pi !RAF
72 ! REAL, DIMENSION(klon,naero_tot) :: fractnat_allaer !RAF delete??
73 
74  INTEGER :: k, i
75 
76 !****************************************************************************************
77 ! 1) Get aerosol mass
78 !
79 !****************************************************************************************
80 ! Read and interpolate sulfate
81  IF ( flag_aerosol .EQ. 1 .OR. &
82  flag_aerosol .EQ. 6 ) THEN
83 
84  CALL readaerosol_interp(id_asso4m_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, sulfate, sulfate_pi,loadso4)
85  ELSE
86  sulfate(:,:) = 0. ; sulfate_pi(:,:) = 0.
87  loadso4=0.
88  END IF
89 
90 ! Read and interpolate bcsol and bcins
91  IF ( flag_aerosol .EQ. 2 .OR. &
92  flag_aerosol .EQ. 6 ) THEN
93 
94  ! Get bc aerosol distribution
95  CALL readaerosol_interp(id_asbcm_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, bcsol, bcsol_pi, load_tmp1 )
96  CALL readaerosol_interp(id_aibcm_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, bcins, bcins_pi, load_tmp2 )
97  loadbc(:)=load_tmp1(:)+load_tmp2(:)
98  ELSE
99  bcsol(:,:) = 0. ; bcsol_pi(:,:) = 0.
100  bcins(:,:) = 0. ; bcins_pi(:,:) = 0.
101  loadbc=0.
102  END IF
103 
104 
105 ! Read and interpolate pomsol and pomins
106  IF ( flag_aerosol .EQ. 3 .OR. &
107  flag_aerosol .EQ. 6 ) THEN
108 
109  CALL readaerosol_interp(id_aspomm_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, pomsol, pomsol_pi, load_tmp3)
110  CALL readaerosol_interp(id_aipomm_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, pomins, pomins_pi, load_tmp4)
111  loadoa(:)=load_tmp3(:)+load_tmp4(:)
112  ELSE
113  pomsol(:,:) = 0. ; pomsol_pi(:,:) = 0.
114  pomins(:,:) = 0. ; pomins_pi(:,:) = 0.
115  loadoa=0.
116  END IF
117 
118 
119 ! Read and interpolate csssm, ssssm, assssm
120  IF (flag_aerosol .EQ. 4 .OR. &
121  flag_aerosol .EQ. 6 ) THEN
122 
123  CALL readaerosol_interp(id_ssssm_phy ,itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, sssupco, sssupco_pi, load_tmp5)
124  CALL readaerosol_interp(id_csssm_phy ,itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, sscoarse,sscoarse_pi, load_tmp6)
125  CALL readaerosol_interp(id_asssm_phy ,itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, ssacu, ssacu_pi, load_tmp7)
126  loadss(:)=load_tmp5(:)+load_tmp6(:)+load_tmp7(:)
127  ELSE
128  sscoarse(:,:) = 0. ; sscoarse_pi(:,:) = 0.
129  ssacu(:,:) = 0. ; ssacu_pi(:,:) = 0.
130  sssupco(:,:) = 0. ; sssupco_pi = 0.
131  loadss=0.
132  ENDIF
133 
134 ! Read and interpolate cidustm
135  IF (flag_aerosol .EQ. 5 .OR. &
136  flag_aerosol .EQ. 6 ) THEN
137 
138  CALL readaerosol_interp(id_cidustm_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, cidust, cidust_pi, loaddust)
139 
140  ELSE
141  cidust(:,:) = 0. ; cidust_pi(:,:) = 0.
142  loaddust=0.
143  ENDIF
144 
145 !
146 ! Store all aerosols in one variable
147 !
148  m_allaer(:,:,id_asbcm_phy) = bcsol(:,:) ! ASBCM
149  m_allaer(:,:,id_aspomm_phy) = pomsol(:,:) ! ASPOMM
150  m_allaer(:,:,id_asso4m_phy) = sulfate(:,:) ! ASSO4M (= SO4)
151  m_allaer(:,:,id_csso4m_phy) = 0. ! CSSO4M
152  m_allaer(:,:,id_ssssm_phy) = sssupco(:,:) ! SSSSM
153  m_allaer(:,:,id_csssm_phy) = sscoarse(:,:) ! CSSSM
154  m_allaer(:,:,id_asssm_phy) = ssacu(:,:) ! ASSSM
155  m_allaer(:,:,id_cidustm_phy)= cidust(:,:) ! CIDUSTM
156  m_allaer(:,:,id_aibcm_phy) = bcins(:,:) ! AIBCM
157  m_allaer(:,:,id_aipomm_phy) = pomins(:,:) ! AIPOMM
158  m_allaer(:,:,id_asno3m_phy) = 0.0
159  m_allaer(:,:,id_csno3m_phy) = 0.0
160  m_allaer(:,:,id_cino3m_phy) = 0.0
161 
162 !RAF
163  m_allaer_pi(:,:,id_asbcm_phy) = bcsol_pi(:,:) ! ASBCM pre-ind
164  m_allaer_pi(:,:,id_aspomm_phy) = pomsol_pi(:,:) ! ASPOMM pre-ind
165  m_allaer_pi(:,:,id_asso4m_phy) = sulfate_pi(:,:) ! ASSO4M (= SO4) pre-ind
166  m_allaer_pi(:,:,id_csso4m_phy) = 0. ! CSSO4M pre-ind
167  m_allaer_pi(:,:,id_ssssm_phy) = sssupco_pi(:,:) ! SSSSM pre-ind
168  m_allaer_pi(:,:,id_asssm_phy) = sscoarse_pi(:,:) ! CSSSM pre-ind
169  m_allaer_pi(:,:,id_cidustm_phy) = ssacu_pi(:,:) ! ASSSM pre-ind
170  m_allaer_pi(:,:,id_aibcm_phy) = cidust_pi(:,:) ! CIDUSTM pre-ind
171  m_allaer_pi(:,:,id_aibcm_phy) = bcins_pi(:,:) ! AIBCM pre-ind
172  m_allaer_pi(:,:,id_aipomm_phy) = pomins_pi(:,:) ! AIPOMM pre-ind
173  m_allaer_pi(:,:,id_asno3m_phy) = 0.0
174  m_allaer_pi(:,:,id_csno3m_phy) = 0.0
175  m_allaer_pi(:,:,id_cino3m_phy) = 0.0
176 
177 !
178 ! Calculate the total mass of all soluble aersosols
179 !
180  mass_solu_aero(:,:) = sulfate(:,:) + bcsol(:,:) + pomsol(:,:) + ssacu(:,:)
181  mass_solu_aero_pi(:,:) = sulfate_pi(:,:) + bcsol_pi(:,:) + pomsol_pi(:,:) + ssacu_pi(:,:)
182 
183 !****************************************************************************************
184 ! 2) Calculate optical properties for the aerosols
185 !
186 !****************************************************************************************
187  DO k = 1, klev
188  DO i = 1, klon
189  pdel(i,k) = paprs(i,k) - paprs(i,k+1)
190  END DO
191  END DO
192 
193  IF (new_aod) THEN
194 
195 ! RAF delete?? fractnat_allaer(:,:) = 0.
196 ! RAF fractnat_allaer -> m_allaer_pi
197 
198  CALL aeropt_2bands( &
199  pdel, m_allaer, pdtphys, rhcl, &
200  tau_aero, piz_aero, cg_aero, &
201  m_allaer_pi, flag_aerosol, &
202  pplay, t_seri, presnivs)
203 
204  ! aeropt_5wv only for validation and diagnostics.
205  CALL aeropt_5wv( &
206  pdel, m_allaer, &
207  pdtphys, rhcl, aerindex, &
208  flag_aerosol, pplay, t_seri, &
209  tausum_aero, tau3d_aero, presnivs)
210  ELSE
211 
212  CALL aeropt(pplay, paprs, t_seri, sulfate, rhcl, &
213  tau_aero(:,:,id_asso4m_phy,:), piz_aero(:,:,id_asso4m_phy,:), cg_aero(:,:,id_asso4m_phy,:), aerindex)
214 
215  END IF
216 
217 
218 ! Diagnostics calculation for CMIP5 protocol
219  sconcso4(:)=m_allaer(:,1,id_asso4m_phy)*1.e-9
220  sconcno3(:)=m_allaer(:,1,id_asno3m_phy)*1.e-9
221  sconcoa(:)=(m_allaer(:,1,id_aspomm_phy)+m_allaer(:,1,id_aipomm_phy))*1.e-9
222  sconcbc(:)=(m_allaer(:,1,id_asbcm_phy)+m_allaer(:,1,id_aibcm_phy))*1.e-9
223  sconcss(:)=(m_allaer(:,1,id_asssm_phy)+m_allaer(:,1,id_csssm_phy)+m_allaer(:,1,id_ssssm_phy))*1.e-9
224  sconcdust(:)=m_allaer(:,1,id_cidustm_phy)*1.e-9
225  concso4(:,:)=m_allaer(:,:,id_asso4m_phy)*1.e-9
226  concno3(:,:)=m_allaer(:,:,id_asno3m_phy)*1.e-9
227  concoa(:,:)=(m_allaer(:,:,id_aspomm_phy)+m_allaer(:,:,id_aipomm_phy))*1.e-9
228  concbc(:,:)=(m_allaer(:,:,id_asbcm_phy)+m_allaer(:,:,id_aibcm_phy))*1.e-9
229  concss(:,:)=(m_allaer(:,:,id_asssm_phy)+m_allaer(:,:,id_csssm_phy)+m_allaer(:,:,id_ssssm_phy))*1.e-9
230  concdust(:,:)=m_allaer(:,:,id_cidustm_phy)*1.e-9
231 
232 
233 END SUBROUTINE readaerosol_optic
integer, parameter id_asssm_phy
Definition: aero_mod.F90:20
integer, parameter id_aipomm_phy
Definition: aero_mod.F90:23
real, dimension(:), allocatable, save load_tmp3
integer, parameter id_aspomm_phy
Definition: aero_mod.F90:15
real, dimension(:), allocatable, save sconcdust
real, dimension(:,:), allocatable, save concno3
real, dimension(:), allocatable, save load_tmp2
real, dimension(:), allocatable, save sconcso4
integer, save klon
Definition: dimphy.F90:3
integer, parameter id_csssm_phy
Definition: aero_mod.F90:19
real, dimension(:), allocatable, save loaddust
integer, save klev
Definition: dimphy.F90:7
subroutine aeropt_2bands(pdel, m_allaer, delt, RHcl, tau_allaer, piz_allaer, cg_allaer, m_allaer_pi, flag_aerosol, pplay, t_seri, presnivs)
integer, parameter id_cino3m_phy
Definition: aero_mod.F90:26
!$Id presnivs(llm)
real, dimension(:), allocatable, save sconcbc
real, dimension(:,:), allocatable, save concoa
real, dimension(:), allocatable, save load_tmp4
real, dimension(:), allocatable, save load_tmp5
integer, parameter id_asbcm_phy
Definition: aero_mod.F90:14
subroutine aeropt_5wv(pdel, m_allaer, delt, RHcl, ai, flag_aerosol, pplay, t_seri, tausum, tau, presnivs)
Definition: aeropt_5wv.F90:10
real, dimension(:), allocatable, save load_tmp7
real, dimension(:), allocatable, save loadbc
real, dimension(:), allocatable, save sconcss
integer, parameter id_aibcm_phy
Definition: aero_mod.F90:22
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL pplay
Definition: calcul_STDlev.h:26
subroutine readaerosol_interp(id_aero, itap, pdtphys, r_day, first, pplay, paprs, t_seri, mass_out, pi_mass_out, load_src)
integer, parameter id_asno3m_phy
Definition: aero_mod.F90:24
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL &zphi geo500!IM on interpole a chaque pas de temps le paprs
real, dimension(:,:), allocatable, save concss
integer, parameter id_csno3m_phy
Definition: aero_mod.F90:25
integer, parameter id_asso4m_phy
Definition: aero_mod.F90:16
real, dimension(:), allocatable, save load_tmp6
real, dimension(:), allocatable, save sconcno3
real, dimension(:), allocatable, save loadso4
!$Id zjulian!correction pour l heure initiale!jyg!jyg CALL pdtphys
Definition: ini_histrac.h:11
real, dimension(:), allocatable, save load_tmp1
subroutine aeropt(pplay, paprs, t_seri, msulfate, rhcl, tau_ae, piz_ae, cg_ae, ai)
Definition: aeropt.F90:6
real, dimension(:,:), allocatable, save concbc
integer, parameter id_ssssm_phy
Definition: aero_mod.F90:18
real, dimension(:), allocatable, save loadss
real, dimension(:,:), allocatable, save concso4
subroutine readaerosol_optic(debut, new_aod, flag_aerosol, itap, rjourvrai, pdtphys, pplay, paprs, t_seri, rhcl, presnivs, mass_solu_aero, mass_solu_aero_pi, tau_aero, piz_aero, cg_aero, tausum_aero, tau3d_aero)
real, dimension(:,:), allocatable, save concdust
integer, parameter id_csso4m_phy
Definition: aero_mod.F90:17
Definition: dimphy.F90:1
real, dimension(:), allocatable, save sconcoa
real, dimension(:), allocatable, save loadoa
integer, parameter id_cidustm_phy
Definition: aero_mod.F90:21