GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/rrtm/recmwf_aero.F90 Lines: 166 349 47.6 %
Date: 2023-06-30 12:56:34 Branches: 227 818 27.8 %

Line Branch Exec Source
1
!
2
! $Id: recmwf_aero.F90 3989 2021-10-10 07:18:17Z oboucher $
3
!
4
!OPTIONS XOPT(NOEVAL)
5
72
SUBROUTINE RECMWF_AERO (KST, KEND, KPROMA, KTDIA , KLEV,&
6
 & KMODE,&
7
72
 & PALBD , PALBP , PAPRS , PAPRSF , PCCO2 , PCLFR,&
8
72
 & PQO3  , PAER  , PDP   , PEMIS  , PMU0,&
9
 & PQ    , PQS   , PQIWP , PQLWP , PSLM   , PT    , PTS,&
10
 & PREF_LIQ, PREF_ICE,&
11
!--OB
12
 & PREF_LIQ_PI, PREF_ICE_PI,&
13
!--fin
14
 & PEMTD , PEMTU , PTRSO,&
15
72
 & PTH   , PCTRSO, PCEMTR, PTRSOD,&
16
 & PLWFC, PLWFT, PSWFC, PSWFT, PSFSWDIR, PSFSWDIF,&
17
 & PFSDNN, PFSDNV,&
18
 & PPIZA_TOT,PCGA_TOT,PTAU_TOT, &
19
!--OB
20
72
 & PPIZA_NAT,PCGA_NAT,PTAU_NAT, &
21
!--fin OB
22
!--C.Kleinschmitt
23
72
 & PTAU_LW_TOT, PTAU_LW_NAT, &
24
!--end
25
72
 & PFLUX,PFLUC,&
26
 & PFSDN ,PFSUP , PFSCDN , PFSCUP, PFSCCDN, PFSCCUP, PFLCCDN, PFLCCUP,&
27
!--OB diagnostics
28
 & PTOPSWADAERO,PSOLSWADAERO,&
29
 & PTOPSWAD0AERO,PSOLSWAD0AERO,&
30
 & PTOPSWAIAERO,PSOLSWAIAERO,&
31
72
 & PTOPSWCFAERO,PSOLSWCFAERO,&
32
 & PSWADAERO,& !--NL
33
!--LW diagnostics CK
34
 & PTOPLWADAERO,PSOLLWADAERO,&
35
 & PTOPLWAD0AERO,PSOLLWAD0AERO,&
36
 & PTOPLWAIAERO,PSOLLWAIAERO,&
37
 & PLWADAERO,& !--NL
38
!--ajout volmip
39
 & volmip_solsw, flag_volc_surfstrat,&
40
!..end
41
 & ok_ade, ok_aie, ok_volcan, flag_aerosol,flag_aerosol_strat,&
42
 & flag_aer_feedback)
43
!--fin
44
45
!**** *RECMWF* - METEO-FRANCE RADIATION INTERFACE TO ECMWF RADIATION SCHEME
46
47
!     PURPOSE.
48
!     --------
49
!           SIMPLE INTERFACE TO RADLSW (NO INTERPOLATION)
50
51
!**   INTERFACE.
52
!     ----------
53
54
!     EXPLICIT ARGUMENTS :
55
!        --------------------
56
! KST    : START INDEX OF DATA IN KPROMA-LONG VECTOR
57
! KEND   : END   INDEX OF DATA IN KPROMA-LONG VECTOR
58
! KPROMA : VECTOR LENGTH
59
! KTDIA  : INDEX OF TOP LEVEL FROM WHICH COMPUTATIONS ARE ACTIVE
60
! KLEV   : NUMBER OF LEVELS
61
! PAER   : (KPROMA,KLEV ,6)     ; OPTICAL THICKNESS OF THE AEROSOLS
62
! PALBD  : (KPROMA,NSW)         ; DIFFUSE ALBEDO IN THE 2 SW INTERVALS
63
! PALBP  : (KPROMA,NSW)         ; PARALLEL ALBEDO IN THE 2 SW INTERVALS
64
! PAPRS  : (KPROMA,KLEV+1)      ; HALF LEVEL PRESSURE
65
! PAPRSF : (KPROMA,KLEV )       ; FULL LEVEL PRESSURE
66
! PCCO2  :                      ; CONCENTRATION IN CO2 (PA/PA)
67
! PCLFR  : (KPROMA,KLEV )       ; CLOUD FRACTIONAL COVER
68
! PQO3   : (KPROMA,KLEV )       ; OZONE MIXING RATIO (MASS)
69
! PDP    : (KPROMA,KLEV)        ; LAYER PRESSURE THICKNESS
70
! PEMIS  : (KPROMA)             ; SURFACE EMISSIVITY
71
! PMU0   : (KPROMA)             ; SOLAR ANGLE
72
! PQ     : (KPROMA,KLEV )       ; SPECIFIC HUMIDITY PA/PA
73
! PQS    : (KPROMA,KLEV )       ; SATURATION SPECIFIC HUMIDITY PA/PA
74
! PQIWP  : (KPROMA,KLEV )       ; ICE    WATER KG/KG
75
! PQLWP  : (KPROMA,KLEV )       ; LIQUID WATER KG/KG
76
! PSLM   : (KPROMA)             ; LAND-SEA MASK
77
! PT     : (KPROMA,KLEV)        ; FULL LEVEL TEMPERATURE
78
! PTS    : (KPROMA)             ; SURFACE TEMPERATURE
79
! PPIZA_TOT  : (KPROMA,KLEV,NSW); Single scattering albedo of total aerosol
80
! PCGA_TOT   : (KPROMA,KLEV,NSW); Assymetry factor for total aerosol
81
! PTAU_TOT: (KPROMA,KLEV,NSW)   ; Optical depth of total aerosol
82
! PREF_LIQ (KPROMA,KLEV)        ; Liquid droplet radius (um) - present-day
83
! PREF_ICE (KPROMA,KLEV)        ; Ice crystal radius (um) - present-day
84
!--OB
85
! PREF_LIQ_PI (KPROMA,KLEV)     ; Liquid droplet radius (um) - pre-industrial
86
! PREF_ICE_PI (KPROMA,KLEV)     ; Ice crystal radius (um) - pre-industrial
87
! ok_ade---input-L- apply the Aerosol Direct Effect or not?
88
! ok_aie---input-L- apply the Aerosol Indirect Effect or not?
89
! ok_volcan-input-L- activate volcanic diags (SW heat & LW cool rate, SW & LW flux)
90
! flag_aerosol-input-I- aerosol flag from 0 to 7
91
! flag_aerosol_strat-input-I- use stratospheric aerosols flag (T/F)
92
! flag_aer_feedback-input-I- use aerosols radiative effect flag (T/F)
93
! PPIZA_NAT  : (KPROMA,KLEV,NSW); Single scattering albedo of natural aerosol
94
! PCGA_NAT   : (KPROMA,KLEV,NSW); Assymetry factor for natural aerosol
95
! PTAU_NAT: (KPROMA,KLEV,NSW)   ; Optical depth of natural aerosol
96
! PTAU_LW_TOT  (KPROMA,KLEV,NLW); LW Optical depth of total aerosols
97
! PTAU_LW_NAT  (KPROMA,KLEV,NLW); LW Optical depth of natural aerosols
98
!--fin OB
99
100
!     ==== OUTPUTS ===
101
! PEMTD (KPROMA,KLEV+1)         ; TOTAL DOWNWARD LONGWAVE EMISSIVITY
102
! PEMTU (KPROMA,KLEV+1)         ; TOTAL UPWARD   LONGWAVE EMISSIVITY
103
! PTRSO (KPROMA,KLEV+1)         ; TOTAL SHORTWAVE TRANSMISSIVITY
104
! PTH   (KPROMA,KLEV+1)         ; HALF LEVEL TEMPERATURE
105
! PCTRSO(KPROMA,2)              ; CLEAR-SKY SHORTWAVE TRANSMISSIVITY
106
! PCEMTR(KPROMA,2)              ; CLEAR-SKY NET LONGWAVE EMISSIVITY
107
! PTRSOD(KPROMA)                ; TOTAL-SKY SURFACE SW TRANSMISSITY
108
! PLWFC (KPROMA,2)              ; CLEAR-SKY LONGWAVE FLUXES
109
! PLWFT (KPROMA,KLEV+1)         ; TOTAL-SKY LONGWAVE FLUXES
110
! PSWFC (KPROMA,2)              ; CLEAR-SKY SHORTWAVE FLUXES
111
! PSWFT (KPROMA,KLEV+1)         ; TOTAL-SKY SHORTWAVE FLUXES
112
! Ajout flux LW et SW montants et descendants, et ciel clair (MPL 19.12.08)
113
! PFLUX (KPROMA,2,KLEV+1)       ; LW total sky flux (1=up, 2=down)
114
! PFLUC (KPROMA,2,KLEV+1)       ; LW clear sky flux (1=up, 2=down)
115
! PFSDN(KPROMA,KLEV+1)          ; SW total sky flux down
116
! PFSUP(KPROMA,KLEV+1)          ; SW total sky flux up
117
! PFSCDN(KPROMA,KLEV+1)         ; SW clear sky flux down
118
! PFSCUP(KPROMA,KLEV+1)         ; SW clear sky flux up
119
! PFSCCDN(KPROMA,KLEV+1)        ; SW clear sky clean (no aerosol) flux down
120
! PFSCCUP(KPROMA,KLEV+1)        ; SW clear sky clean (no aerosol) flux up
121
! PFLCCDN(KPROMA,KLEV+1)        ; LW clear sky clean (no aerosol) flux down
122
! PFLCCUP(KPROMA,KLEV+1)        ; LW clear sky clean (no aerosol) flux up
123
124
125
!        IMPLICIT ARGUMENTS :   NONE
126
!        --------------------
127
128
!     METHOD.
129
!     -------
130
!     SEE DOCUMENTATION
131
132
!     EXTERNALS.
133
!     ----------
134
135
!     REFERENCE.
136
!     ----------
137
!     ECMWF RESEARCH DEPARTMENT DOCUMENTATION OF THE IFS
138
139
!     AUTHORS.
140
!     --------
141
!     ORIGINAL BY  B. RITTER   *ECMWF*        83-10-13
142
!     REWRITING FOR IFS BY J.-J. MORCRETTE    94-11-15
143
!     96-11: Ph. Dandin. Meteo-France
144
!     REWRITING FOR DM  BY J.PH. PIEDELIEVRE   1998-07
145
!     Duplication of RFMR to use present (cy25) ECMWF radiation scheme : Y. Bouteloup 09-2003
146
!     Use of 6 aerosols & introduce NSW : F. Bouyssel 09-2004
147
!     04-11-18 : 4 New arguments for AROME : Y. Seity
148
!     2005-10-10 Y. Seity : 3 optional arguments for dust optical properties
149
!     JJMorcrette 20060721 PP of clear-sky PAR and TOA incident solar radiation (ECMWF)
150
!     Olivier Boucher: added LMD radiation diagnostics 2014-03
151
152
!-----------------------------------------------------------------------
153
154
USE PARKIND1  ,ONLY : JPIM     ,JPRB
155
USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
156
USE YOEAERD  , ONLY : RCAEROS
157
USE YOMCST   , ONLY :         RMD      ,RMO3
158
USE YOMPHY3  , ONLY : RII0
159
USE YOERAD   , ONLY : NLW, NAER, RCCNLND  ,RCCNSEA
160
USE YOERAD   , ONLY : NAER, RCCNLND  ,RCCNSEA
161
USE YOERDU   , ONLY : REPSCQ
162
USE YOMGEM   , ONLY : NGPTOT
163
USE YOERDI   , ONLY : RRAE   ,REPCLC    ,REPH2O
164
USE YOMARPHY , ONLY : LRDUST
165
USE phys_output_mod, ONLY : swaerofree_diag, swaero_diag
166
167
!-----------------------------------------------------------------------
168
169
!*       0.1   ARGUMENTS.
170
!              ----------
171
172
IMPLICIT NONE
173
INCLUDE "clesphys.h"
174
175
INTEGER(KIND=JPIM),INTENT(IN)    :: KPROMA
176
INTEGER(KIND=JPIM),INTENT(IN)    :: KLEV
177
INTEGER(KIND=JPIM),INTENT(IN)    :: KST
178
INTEGER(KIND=JPIM),INTENT(IN)    :: KEND
179
INTEGER(KIND=JPIM)               :: KTDIA ! Argument NOT used
180
INTEGER(KIND=JPIM),INTENT(IN)    :: KMODE
181
REAL(KIND=JPRB)   ,INTENT(IN)    :: PALBD(KPROMA,NSW)
182
REAL(KIND=JPRB)   ,INTENT(IN)    :: PALBP(KPROMA,NSW)
183
REAL(KIND=JPRB)   ,INTENT(IN)    :: PAPRS(KPROMA,KLEV+1)
184
REAL(KIND=JPRB)   ,INTENT(IN)    :: PAPRSF(KPROMA,KLEV)
185
REAL(KIND=JPRB)   ,INTENT(IN)    :: PCCO2
186
REAL(KIND=JPRB)   ,INTENT(IN)    :: PCLFR(KPROMA,KLEV)
187
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQO3(KPROMA,KLEV)
188
REAL(KIND=JPRB)   ,INTENT(IN)    :: PAER(KPROMA,KLEV,6)
189
REAL(KIND=JPRB)   ,INTENT(IN)    :: PDP(KPROMA,KLEV)
190
REAL(KIND=JPRB)   ,INTENT(IN)    :: PEMIS(KPROMA)
191
REAL(KIND=JPRB)   ,INTENT(IN)    :: PMU0(KPROMA)
192
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQ(KPROMA,KLEV)
193
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQS(KPROMA,KLEV)
194
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQIWP(KPROMA,KLEV)
195
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQLWP(KPROMA,KLEV)
196
REAL(KIND=JPRB)   ,INTENT(IN)    :: PSLM(KPROMA)
197
REAL(KIND=JPRB)   ,INTENT(IN)    :: PT(KPROMA,KLEV)
198
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTS(KPROMA)
199
REAL(KIND=JPRB)   ,INTENT(IN)    :: PPIZA_TOT(KPROMA,KLEV,NSW)
200
REAL(KIND=JPRB)   ,INTENT(IN)    :: PCGA_TOT(KPROMA,KLEV,NSW)
201
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTAU_TOT(KPROMA,KLEV,NSW)
202
!--OB
203
REAL(KIND=JPRB)   ,INTENT(IN)    :: PPIZA_NAT(KPROMA,KLEV,NSW)
204
REAL(KIND=JPRB)   ,INTENT(IN)    :: PCGA_NAT(KPROMA,KLEV,NSW)
205
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTAU_NAT(KPROMA,KLEV,NSW)
206
144
REAL(KIND=JPRB)                  :: PPIZA_ZERO(KPROMA,KLEV,NSW)
207
144
REAL(KIND=JPRB)                  :: PCGA_ZERO(KPROMA,KLEV,NSW)
208
144
REAL(KIND=JPRB)                  :: PTAU_ZERO(KPROMA,KLEV,NSW)
209
!--fin
210
!--C.Kleinschmitt
211
144
REAL(KIND=JPRB)                  :: PTAU_LW_ZERO(KPROMA,KLEV,NLW)
212
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTAU_LW_TOT(KPROMA,KLEV,NLW)
213
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTAU_LW_NAT(KPROMA,KLEV,NLW)
214
!--end
215
REAL(KIND=JPRB)   ,INTENT(IN)    :: PREF_LIQ(KPROMA,KLEV)
216
REAL(KIND=JPRB)   ,INTENT(IN)    :: PREF_ICE(KPROMA,KLEV)
217
!--OB
218
REAL(KIND=JPRB)   ,INTENT(IN)    :: PREF_LIQ_PI(KPROMA,KLEV)
219
REAL(KIND=JPRB)   ,INTENT(IN)    :: PREF_ICE_PI(KPROMA,KLEV)
220
LOGICAL, INTENT(in)  :: ok_ade, ok_aie         ! switches whether to use aerosol direct (indirect) effects or not
221
LOGICAL, INTENT(in)  :: ok_volcan              ! produce volcanic diags (SW/LW heat flux and rate)
222
INTEGER, INTENT(in)  :: flag_aerosol           ! takes value 0 (no aerosol) or 1 to 6 (aerosols)
223
LOGICAL, INTENT(in)  :: flag_aerosol_strat     ! use stratospheric aerosols
224
LOGICAL, INTENT(in)  :: flag_aer_feedback      ! use aerosols radiative feedback
225
REAL(KIND=JPRB)   ,INTENT(out)   :: PTOPSWADAERO(KPROMA), PSOLSWADAERO(KPROMA)       ! Aerosol direct forcing at TOA and surface
226
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PTOPSWAD0AERO(KPROMA), PSOLSWAD0AERO(KPROMA)     ! Aerosol direct forcing at TOA and surface
227
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PTOPSWAIAERO(KPROMA), PSOLSWAIAERO(KPROMA)       ! ditto, indirect
228
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PTOPSWCFAERO(KPROMA,3), PSOLSWCFAERO(KPROMA,3) !--do we keep this ?
229
!--fin
230
!--NL
231
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PSWADAERO(KPROMA, KLEV+1)                        ! SW Aerosol direct forcing
232
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PLWADAERO(KPROMA, KLEV+1)                        ! LW Aerosol direct forcing
233
!--CK
234
REAL(KIND=JPRB)   ,INTENT(out)   :: PTOPLWADAERO(KPROMA), PSOLLWADAERO(KPROMA)       ! LW Aerosol direct forcing at TOA + surface
235
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PTOPLWAD0AERO(KPROMA), PSOLLWAD0AERO(KPROMA)     ! LW Aerosol direct forcing at TOA + surface
236
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PTOPLWAIAERO(KPROMA), PSOLLWAIAERO(KPROMA)       ! LW Aer. indirect forcing at TOA + surface
237
!--end
238
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PEMTD(KPROMA,KLEV+1)
239
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PEMTU(KPROMA,KLEV+1)
240
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PTRSO(KPROMA,KLEV+1)
241
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PTH(KPROMA,KLEV+1)
242
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PCTRSO(KPROMA,2)
243
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PCEMTR(KPROMA,2)
244
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PTRSOD(KPROMA)
245
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PLWFC(KPROMA,2)
246
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PLWFT(KPROMA,KLEV+1)
247
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PSWFC(KPROMA,2)
248
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PSWFT(KPROMA,KLEV+1)
249
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PSFSWDIR(KPROMA,NSW)
250
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PSFSWDIF(KPROMA,NSW)
251
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFSDNN(KPROMA)
252
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFSDNV(KPROMA)
253
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFLUX(KPROMA,2,KLEV+1) ! LW total sky flux (1=up, 2=down)
254
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFLUC(KPROMA,2,KLEV+1) ! LW clear sky flux (1=up, 2=down)
255
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFSDN(KPROMA,KLEV+1)   ! SW total sky flux down
256
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFSUP(KPROMA,KLEV+1)   ! SW total sky flux up
257
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFSCDN(KPROMA,KLEV+1)  ! SW clear sky flux down
258
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFSCUP(KPROMA,KLEV+1)  ! SW clear sky flux up
259
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFSCCDN(KPROMA,KLEV+1) ! SW clear sky clean (no aerosol) flux down
260
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFSCCUP(KPROMA,KLEV+1) ! SW clear sky clean (no aerosol) flux up
261
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFLCCDN(KPROMA,KLEV+1) ! LW clear sky clean (no aerosol) flux down
262
REAL(KIND=JPRB)   ,INTENT(OUT)   :: PFLCCUP(KPROMA,KLEV+1) ! LW clear sky clean (no aerosol) flux up
263
!--ajout VOLMIP
264
REAL(KIND=JPRB)   ,INTENT(OUT)   :: volmip_solsw(KPROMA) ! SW clear sky in the case of VOLMIP
265
INTEGER, INTENT(IN)              :: flag_volc_surfstrat !--VOlMIP Modif
266
267
!     ==== COMPUTED IN RADITE ===
268
!     ------------------------------------------------------------------
269
!*       0.2   LOCAL ARRAYS.
270
!              -------------
271
144
REAL(KIND=JPRB) :: ZRAER  (KPROMA,6,KLEV)
272
144
REAL(KIND=JPRB) :: ZRCLC  (KPROMA,KLEV)
273
144
REAL(KIND=JPRB) :: ZRMU0  (KPROMA)
274
144
REAL(KIND=JPRB) :: ZRPR   (KPROMA,KLEV)
275
144
REAL(KIND=JPRB) :: ZRTI   (KPROMA,KLEV)
276
144
REAL(KIND=JPRB) :: ZQLWP (KPROMA,KLEV ) , ZQIWP (KPROMA,KLEV )
277
278
144
REAL(KIND=JPRB) :: ZPQO3 (KPROMA,KLEV)
279
REAL(KIND=JPRB) :: ZQOZ (NGPTOT,KLEV)
280
144
REAL(KIND=JPRB) :: ZQS    (KPROMA,KLEV)
281
144
REAL(KIND=JPRB) :: ZQ     (KPROMA,KLEV)
282
144
REAL(KIND=JPRB) :: ZEMTD  (KPROMA,KLEV+1)
283
144
REAL(KIND=JPRB) :: ZEMTU  (KPROMA,KLEV+1)
284
144
REAL(KIND=JPRB) :: ZTRSOC (KPROMA,2)
285
144
REAL(KIND=JPRB) :: ZEMTC  (KPROMA,2)
286
287
144
REAL(KIND=JPRB) :: ZNBAS  (KPROMA)
288
144
REAL(KIND=JPRB) :: ZNTOP  (KPROMA)
289
144
REAL(KIND=JPRB) :: ZQRAIN (KPROMA,KLEV)
290
144
REAL(KIND=JPRB) :: ZQRAINT(KPROMA,KLEV)
291
144
REAL(KIND=JPRB) :: ZCCNL  (KPROMA)
292
144
REAL(KIND=JPRB) :: ZCCNO  (KPROMA)
293
294
!  output of radlsw
295
296
144
REAL(KIND=JPRB) :: ZEMIT  (KPROMA)
297
144
REAL(KIND=JPRB) :: ZFCT   (KPROMA,KLEV+1)
298
144
REAL(KIND=JPRB) :: ZFLT   (KPROMA,KLEV+1)
299
144
REAL(KIND=JPRB) :: ZFCS   (KPROMA,KLEV+1)
300
144
REAL(KIND=JPRB) :: ZFLS   (KPROMA,KLEV+1)
301
144
REAL(KIND=JPRB) :: ZFRSOD (KPROMA),ZSUDU(KPROMA)
302
144
REAL(KIND=JPRB) :: ZPARF  (KPROMA),ZUVDF(KPROMA),ZPARCF(KPROMA),ZTINCF(KPROMA)
303
304
INTEGER(KIND=JPIM) :: IBEG, IEND, JK, JL
305
306
144
REAL(KIND=JPRB) :: ZCRAE, ZRII0, ZEMIW(KPROMA)
307
REAL(KIND=JPRB) :: ZHOOK_HANDLE
308
309
!---aerosol radiative diagnostics
310
! Key to define the aerosol effect acting on climate
311
! OB: AEROSOLFEEDBACK_ACTIVE is now a LOGICAL
312
! TRUE: fluxes use natural and/or anthropogenic aerosols according to ok_ade and ok_aie, DEFAULT
313
! FALSE: fluxes use no aerosols (case 1)
314
! to be used only for maintaining bit reproducibility with aerosol diagnostics activated
315
 LOGICAL :: AEROSOLFEEDBACK_ACTIVE ! now externalized from .def files
316
317
!OB - Fluxes including aerosol effects
318
!              |        direct effect
319
!ind effect    | no aerosol  NATural  TOTal
320
!standard      |   5
321
!natural (PI)  |               1       3
322
!total   (PD)  |               2       4
323
! so we need which case when ?
324
! if flag_aerosol is on
325
! ok_ade and ok_aie         = 4-2, 4-3 and 4 to proceed
326
! ok_ade and not ok_aie     = 3-1 and 3 to proceed
327
! not ok_ade and ok_aie     = 2-1 and 2 to proceed
328
! not ok_ade and not ok_aie = 1 to proceed
329
! therefore the cases have the following corresponding switches
330
! 1 = not ok_ade and not ok_aie OR not ok_ade and ok_aie and swaero_diag OR ok_ade and not ok_aie and swaero_diag
331
! 2 = not ok_ade and ok_aie OR ok_aie and ok_ade and swaero_diag
332
! 3 = ok_ade and not ok_aie OR ok_aie and ok_ade and swaero_diag
333
! 4 = ok_ade and ok_aie
334
! 5 = no aerosol feedback wanted or no aerosol at all
335
! if they are called in this order then the correct call is used to proceed
336
337
144
REAL(KIND=JPRB) ::  ZFSUP_AERO(KPROMA,KLEV+1,5)
338
144
REAL(KIND=JPRB) ::  ZFSDN_AERO(KPROMA,KLEV+1,5)
339
144
REAL(KIND=JPRB) ::  ZFSUP0_AERO(KPROMA,KLEV+1,5)
340
144
REAL(KIND=JPRB) ::  ZFSDN0_AERO(KPROMA,KLEV+1,5)
341
!--LW (CK):
342
144
REAL(KIND=JPRB) ::  LWUP_AERO(KPROMA,KLEV+1,5)
343
144
REAL(KIND=JPRB) ::  LWDN_AERO(KPROMA,KLEV+1,5)
344
144
REAL(KIND=JPRB) ::  LWUP0_AERO(KPROMA,KLEV+1,5)
345
144
REAL(KIND=JPRB) ::  LWDN0_AERO(KPROMA,KLEV+1,5)
346
347
#include "radlsw.intfb.h"
348
349
72
IF (LHOOK) CALL DR_HOOK('RECMWF_AERO',0,ZHOOK_HANDLE)
350
72
IBEG=KST
351
72
IEND=KEND
352
353
72
AEROSOLFEEDBACK_ACTIVE = flag_aer_feedback !NL: externalize aer feedback
354
355
356
!*       1.    PREPARATORY WORK
357
!              ----------------
358
!--OB
359
!        1.0    INITIALIZATIONS
360
!               --------------
361
362

14328432
ZFSUP_AERO (:,:,:)=0.
363

14328432
ZFSDN_AERO (:,:,:)=0.
364

14328432
ZFSUP0_AERO(:,:,:)=0.
365

14328432
ZFSDN0_AERO(:,:,:)=0.
366
367

14328432
LWUP_AERO (:,:,:)=0.
368

14328432
LWDN_AERO (:,:,:)=0.
369

14328432
LWUP0_AERO(:,:,:)=0.
370

14328432
LWDN0_AERO(:,:,:)=0.
371
372

16764264
PTAU_ZERO(:,:,:) =1.e-15
373

16764264
PPIZA_ZERO(:,:,:)=1.0
374

16764264
PCGA_ZERO(:,:,:) =0.0
375
376

44704584
PTAU_LW_ZERO(:,:,:) =1.e-15
377
378
379
!*       1.1    LOCAL CONSTANTS
380
!                ---------------
381
382
72
ZRII0=RII0
383
72
ZCRAE=RRAE*(RRAE+2.0_JPRB)
384
385
!*       2.1    FULL-LEVEL QUANTITIES
386
387

2794032
ZRPR =PAPRSF
388
389
2880
DO JK=1,KLEV
390
2794032
  DO JL=IBEG,IEND
391
!   ZPQO3(JL,JK)=PQO3(JL,JK)*PDP(JL,JK)*RMD/RMO3
392
2791152
    ZPQO3(JL,JK)=PQO3(JL,JK)*PDP(JL,JK)
393
2791152
    ZRCLC(JL,JK)=MAX( 0.0_JPRB ,MIN( 1.0_JPRB ,PCLFR(JL,JK)))
394
2791152
    IF (ZRCLC(JL,JK) > REPCLC) THEN
395
620301
      ZQLWP(JL,JK)=PQLWP(JL,JK)
396
620301
      ZQIWP(JL,JK)=PQIWP(JL,JK)
397
    ELSE
398
2170851
      ZQLWP(JL,JK)=REPH2O*ZRCLC(JL,JK)
399
2170851
      ZQIWP(JL,JK)=REPH2O*ZRCLC(JL,JK)
400
    ENDIF
401
2791152
    ZQRAIN(JL,JK)=0.
402
2791152
    ZQRAINT(JL,JK)=0.
403
2791152
    ZRTI(JL,JK) =PT(JL,JK)
404
2791152
    ZQS (JL,JK)=MAX(2.0_JPRB*REPH2O,PQS(JL,JK))
405
2791152
    ZQ  (JL,JK)=MAX(REPH2O,MIN(PQ(JL,JK),ZQS(JL,JK)*(1.0_JPRB-REPH2O)))
406
2793960
    ZEMIW(JL)=PEMIS(JL)
407
  ENDDO
408
ENDDO
409
410
72
IF (NAER == 0) THEN
411
  ZRAER=RCAEROS
412
ELSE
413
2880
  DO JK=1,KLEV
414
2794032
    DO JL=IBEG,IEND
415
2791152
      ZRAER(JL,1,JK)=PAER(JL,JK,1)
416
2791152
      ZRAER(JL,2,JK)=PAER(JL,JK,2)
417
2791152
      ZRAER(JL,3,JK)=PAER(JL,JK,3)
418
2791152
      ZRAER(JL,4,JK)=PAER(JL,JK,4)
419
2791152
      ZRAER(JL,5,JK)=RCAEROS
420
2793960
      ZRAER(JL,6,JK)=PAER(JL,JK,6)
421
    ENDDO
422
  ENDDO
423
ENDIF
424
425
!*       2.2    HALF-LEVEL QUANTITIES
426
427
2808
DO JK=2,KLEV
428
2722392
  DO JL=IBEG,IEND
429
    PTH(JL,JK)=&
430
     & (PT(JL,JK-1)*PAPRSF(JL,JK-1)*(PAPRSF(JL,JK)-PAPRS(JL,JK))&
431
     & +PT(JL,JK)*PAPRSF(JL,JK)*(PAPRS(JL,JK)-PAPRSF(JL,JK-1)))&
432
2722320
     & *(1.0_JPRB/(PAPRS(JL,JK)*(PAPRSF(JL,JK)-PAPRSF(JL,JK-1))))
433
  ENDDO
434
ENDDO
435
436
!*       2.3     QUANTITIES AT BOUNDARIES
437
438
71640
DO JL=IBEG,IEND
439
71568
  PTH(JL,KLEV+1)=PTS(JL)
440
  PTH(JL,1)=PT(JL,1)-PAPRSF(JL,1)*(PT(JL,1)-PTH(JL,2))&
441
71568
   & /(PAPRSF(JL,1)-PAPRS(JL,2))
442
71568
  ZNBAS(JL)=1.
443
71568
  ZNTOP(JL)=1.
444
71568
  ZCCNL(JL)=RCCNLND
445
71640
  ZCCNO(JL)=RCCNSEA
446
ENDDO
447
448
!*       3.1     SOLAR ZENITH ANGLE IS EARTH'S CURVATURE
449
!                CORRECTED
450
451
! CCMVAL: on impose ZRMU0=PMU0 MPL 25032010
452
! 2eme essai en 3D MPL 20052010
453
!DO JL=IBEG,IEND
454
! ZRMU0(JL)=PMU0(JL)
455
!ENDDO
456
!!!!! A REVOIR MPL 20091201: enleve cette correction pour comparer a AR4
457
71640
 DO JL=IBEG,IEND
458
71640
   IF (PMU0(JL) > 1.E-10_JPRB) THEN
459
37967
     ZRMU0(JL)=RRAE/(SQRT(PMU0(JL)**2+ZCRAE)-PMU0(JL))
460
   ELSE
461
33601
     ZRMU0(JL)= RRAE/SQRT(ZCRAE)
462
   ENDIF
463
 ENDDO
464
465
!*         4.1     CALL TO ACTUAL RADIATION SCHEME
466
!
467
!----now we make multiple calls to the radiation according to which
468
!----aerosol flags are on
469
470

72
IF (flag_aerosol .GT. 0 .OR. flag_aerosol_strat) THEN
471
472
!--Case 1
473
IF ( ( .not. ok_ade .AND. .not. ok_aie ) .OR.             &
474
   & ( .not. ok_ade .AND. ok_aie .AND. swaero_diag ) .OR. &
475
   & ( ok_ade .AND. .not. ok_aie .AND. swaero_diag ) ) THEN
476
477
! natural aerosols for direct and indirect effect
478
! PI cloud optical properties
479
! use PREF_LIQ_PI and PREF_ICE_PI
480
! use NAT aerosol optical properties
481
! store fluxes in index 1
482
483
CALL RADLSW (&
484
 & IBEG  , IEND   , KPROMA  , KLEV  , KMODE , NAER,&
485
 & ZRII0 ,&
486
 & ZRAER , PALBD  , PALBP   , PAPRS , ZRPR  ,&
487
 & ZCCNL , ZCCNO  ,&
488
 & PCCO2 , ZRCLC  , PDP     , PEMIS , ZEMIW ,PSLM    , ZRMU0 , ZPQO3,&
489
 & ZQ    , ZQIWP  , ZQLWP   , ZQS   , ZQRAIN,ZQRAINT ,&
490
 & PTH   , ZRTI   , PTS     , ZNBAS , ZNTOP ,&
491
 & PREF_LIQ_PI, PREF_ICE_PI,&
492
 & ZEMIT , ZFCT   , ZFLT    , ZFCS    , ZFLS  ,&
493
 & ZFRSOD, ZSUDU  , ZUVDF   , ZPARF   , ZPARCF, ZTINCF, PSFSWDIR,&
494
 & PSFSWDIF,PFSDNN, PFSDNV  ,&
495
 & LRDUST,PPIZA_NAT,PCGA_NAT,PTAU_NAT,PTAU_LW_NAT,PFLUX,PFLUC,&
496
 & PFSDN , PFSUP  , PFSCDN  , PFSCUP )
497
498
!* SAVE VARIABLES IN INTERIM VARIABLES A LA SW_AEROAR4
499
ZFSUP0_AERO(:,:,1) = PFSCUP(:,:)
500
ZFSDN0_AERO(:,:,1) = PFSCDN(:,:)
501
502
ZFSUP_AERO(:,:,1) =  PFSUP(:,:)
503
ZFSDN_AERO(:,:,1) =  PFSDN(:,:)
504
505
LWUP0_AERO(:,:,1) = PFLUC(:,1,:)
506
LWDN0_AERO(:,:,1) = PFLUC(:,2,:)
507
508
LWUP_AERO(:,:,1) = PFLUX(:,1,:)
509
LWDN_AERO(:,:,1) = PFLUX(:,2,:)
510
511
ENDIF
512
513
!--Case 2
514
IF ( ( .not. ok_ade .AND. ok_aie ) .OR. &
515
   & ( ok_ade .AND. ok_aie .AND. swaero_diag ) ) THEN
516
517
! natural aerosols for direct indirect effect
518
! use NAT aerosol optical properties
519
! PD cloud optical properties
520
! use PREF_LIQ and PREF_ICE
521
! store fluxes in index 2
522
523
CALL RADLSW (&
524
 & IBEG  , IEND   , KPROMA  , KLEV  , KMODE , NAER,&
525
 & ZRII0 ,&
526
 & ZRAER , PALBD  , PALBP   , PAPRS , ZRPR  ,&
527
 & ZCCNL , ZCCNO  ,&
528
 & PCCO2 , ZRCLC  , PDP     , PEMIS , ZEMIW ,PSLM    , ZRMU0 , ZPQO3,&
529
 & ZQ    , ZQIWP  , ZQLWP   , ZQS   , ZQRAIN,ZQRAINT ,&
530
 & PTH   , ZRTI   , PTS     , ZNBAS , ZNTOP ,&
531
 & PREF_LIQ, PREF_ICE,&
532
 & ZEMIT , ZFCT   , ZFLT    , ZFCS    , ZFLS  ,&
533
 & ZFRSOD, ZSUDU  , ZUVDF   , ZPARF   , ZPARCF, ZTINCF, PSFSWDIR,&
534
 & PSFSWDIF,PFSDNN, PFSDNV  ,&
535
 & LRDUST,PPIZA_NAT,PCGA_NAT,PTAU_NAT,PTAU_LW_NAT,PFLUX,PFLUC,&
536
 & PFSDN , PFSUP  , PFSCDN  , PFSCUP )
537
538
!* SAVE VARIABLES IN INTERIM VARIABLES A LA SW_AEROAR4
539
ZFSUP0_AERO(:,:,2) = PFSCUP(:,:)
540
ZFSDN0_AERO(:,:,2) = PFSCDN(:,:)
541
542
ZFSUP_AERO(:,:,2) =  PFSUP(:,:)
543
ZFSDN_AERO(:,:,2) =  PFSDN(:,:)
544
545
LWUP0_AERO(:,:,2) = PFLUC(:,1,:)
546
LWDN0_AERO(:,:,2) = PFLUC(:,2,:)
547
548
LWUP_AERO(:,:,2) = PFLUX(:,1,:)
549
LWDN_AERO(:,:,2) = PFLUX(:,2,:)
550
551
ENDIF ! ok_aie
552
553
!--Case 3
554
IF ( ( ok_ade .AND. .not. ok_aie ) .OR. &
555
   & ( ok_ade .AND. ok_aie .AND. swaero_diag ) ) THEN
556
557
! direct effect of total aerosol activated
558
! TOT aerosols for direct effect
559
! PI cloud optical properties
560
! use PREF_LIQ_PI and PREF_ICE_PI
561
! STORE fluxes in index 3
562
563
CALL RADLSW (&
564
 & IBEG  , IEND   , KPROMA  , KLEV  , KMODE , NAER,&
565
 & ZRII0 ,&
566
 & ZRAER , PALBD  , PALBP   , PAPRS , ZRPR  ,&
567
 & ZCCNL , ZCCNO  ,&
568
 & PCCO2 , ZRCLC  , PDP     , PEMIS , ZEMIW ,PSLM    , ZRMU0 , ZPQO3,&
569
 & ZQ    , ZQIWP  , ZQLWP   , ZQS   , ZQRAIN,ZQRAINT ,&
570
 & PTH   , ZRTI   , PTS     , ZNBAS , ZNTOP ,&
571
 & PREF_LIQ_PI, PREF_ICE_PI,&
572
 & ZEMIT , ZFCT   , ZFLT    , ZFCS    , ZFLS  ,&
573
 & ZFRSOD, ZSUDU  , ZUVDF   , ZPARF   , ZPARCF, ZTINCF, PSFSWDIR,&
574
 & PSFSWDIF,PFSDNN, PFSDNV  ,&
575
 & LRDUST,PPIZA_TOT,PCGA_TOT,PTAU_TOT,PTAU_LW_TOT,PFLUX,PFLUC,&
576
 & PFSDN , PFSUP  , PFSCDN  , PFSCUP )
577
578
!* SAVE VARIABLES IN INTERIM VARIABLES A LA SW_AEROAR4
579
ZFSUP0_AERO(:,:,3) = PFSCUP(:,:)
580
ZFSDN0_AERO(:,:,3) = PFSCDN(:,:)
581
582
ZFSUP_AERO(:,:,3) =  PFSUP(:,:)
583
ZFSDN_AERO(:,:,3) =  PFSDN(:,:)
584
585
LWUP0_AERO(:,:,3) = PFLUC(:,1,:)
586
LWDN0_AERO(:,:,3) = PFLUC(:,2,:)
587
588
LWUP_AERO(:,:,3) = PFLUX(:,1,:)
589
LWDN_AERO(:,:,3) = PFLUX(:,2,:)
590
591
ENDIF !-end ok_ade
592
593
!--Case 4
594
IF (ok_ade .and. ok_aie) THEN
595
596
! total aerosols for direct indirect effect
597
! use TOT aerosol optical properties
598
! PD cloud optical properties
599
! use PREF_LIQ and PREF_ICE
600
! store fluxes in index 4
601
602
CALL RADLSW (&
603
 & IBEG  , IEND   , KPROMA  , KLEV  , KMODE , NAER,&
604
 & ZRII0 ,&
605
 & ZRAER , PALBD  , PALBP   , PAPRS , ZRPR  ,&
606
 & ZCCNL , ZCCNO  ,&
607
 & PCCO2 , ZRCLC  , PDP     , PEMIS , ZEMIW ,PSLM    , ZRMU0 , ZPQO3,&
608
 & ZQ    , ZQIWP  , ZQLWP   , ZQS   , ZQRAIN,ZQRAINT ,&
609
 & PTH   , ZRTI   , PTS     , ZNBAS , ZNTOP ,&
610
 & PREF_LIQ, PREF_ICE,&
611
 & ZEMIT , ZFCT   , ZFLT    , ZFCS    , ZFLS  ,&
612
 & ZFRSOD, ZSUDU  , ZUVDF   , ZPARF   , ZPARCF, ZTINCF, PSFSWDIR,&
613
 & PSFSWDIF,PFSDNN, PFSDNV  ,&
614
 & LRDUST,PPIZA_TOT,PCGA_TOT,PTAU_TOT,PTAU_LW_TOT,PFLUX,PFLUC,&
615
 & PFSDN , PFSUP  , PFSCDN  , PFSCUP )
616
617
!* SAVE VARIABLES IN INTERIM VARIABLES A LA SW_AEROAR4
618
ZFSUP0_AERO(:,:,4) = PFSCUP(:,:)
619
ZFSDN0_AERO(:,:,4) = PFSCDN(:,:)
620
621
ZFSUP_AERO(:,:,4) =  PFSUP(:,:)
622
ZFSDN_AERO(:,:,4) =  PFSDN(:,:)
623
624
LWUP0_AERO(:,:,4) = PFLUC(:,1,:)
625
LWDN0_AERO(:,:,4) = PFLUC(:,2,:)
626
627
LWUP_AERO(:,:,4) = PFLUX(:,1,:)
628
LWDN_AERO(:,:,4) = PFLUX(:,2,:)
629
630
ENDIF ! ok_ade .and. ok_aie
631
632
ENDIF !--if flag_aerosol GT 0 OR flag_aerosol_strat
633
634
! case with no aerosols at all is also computed IF ACTIVEFEEDBACK_ACTIVE is false
635

72
IF (.not. AEROSOLFEEDBACK_ACTIVE .OR. flag_aerosol .EQ. 0 .OR. swaerofree_diag) THEN
636
637
! ZERO aerosol effect
638
! ZERO aerosol optical depth
639
! STANDARD cloud optical properties
640
! STORE fluxes in index 5
641
642
CALL RADLSW (&
643
 & IBEG  , IEND   , KPROMA  , KLEV  , KMODE , NAER,&
644
 & ZRII0 ,&
645
 & ZRAER , PALBD  , PALBP   , PAPRS , ZRPR  ,&
646
 & ZCCNL , ZCCNO  ,&
647
 & PCCO2 , ZRCLC  , PDP     , PEMIS , ZEMIW ,PSLM    , ZRMU0 , ZPQO3,&
648
 & ZQ    , ZQIWP  , ZQLWP   , ZQS   , ZQRAIN,ZQRAINT ,&
649
 & PTH   , ZRTI   , PTS     , ZNBAS , ZNTOP ,&
650
!--this needs to be changed to fixed cloud optical properties
651
 & PREF_LIQ_PI, PREF_ICE_PI,&
652
 & ZEMIT , ZFCT   , ZFLT    , ZFCS    , ZFLS  ,&
653
 & ZFRSOD, ZSUDU  , ZUVDF   , ZPARF   , ZPARCF, ZTINCF, PSFSWDIR,&
654
 & PSFSWDIF,PFSDNN, PFSDNV  ,&
655
 & LRDUST,PPIZA_ZERO,PCGA_ZERO,PTAU_ZERO, PTAU_LW_ZERO,PFLUX,PFLUC,&
656
72
 & PFSDN , PFSUP  , PFSCDN  , PFSCUP )
657
658
!* SAVE VARIABLES IN INTERIM VARIABLES A LA SW_AEROAR4
659

2865672
ZFSUP0_AERO(:,:,5) = PFSCUP(:,:)
660

2865672
ZFSDN0_AERO(:,:,5) = PFSCDN(:,:)
661
662

2865672
ZFSUP_AERO(:,:,5) =  PFSUP(:,:)
663

2865672
ZFSDN_AERO(:,:,5) =  PFSDN(:,:)
664
665

2865672
LWUP0_AERO(:,:,5) = PFLUC(:,1,:)
666

2865672
LWDN0_AERO(:,:,5) = PFLUC(:,2,:)
667
668

2865672
LWUP_AERO(:,:,5) = PFLUX(:,1,:)
669

2865672
LWDN_AERO(:,:,5) = PFLUX(:,2,:)
670
671
ENDIF ! .not. AEROSOLFEEDBACK_ACTIVE
672
673
!*         4.2     TRANSFORM FLUXES TO MODEL HISTORICAL VARIABLES
674
675
2952
DO JK=1,KLEV+1
676
2865672
  DO JL=IBEG,IEND
677
2862720
    PSWFT(JL,JK)=ZFLS(JL,JK)/(ZRII0*ZRMU0(JL))
678
2865600
    PLWFT(JL,JK)=ZFLT(JL,JK)
679
  ENDDO
680
ENDDO
681
682

2865672
ZEMTD=PLWFT
683

2865672
ZEMTU=PLWFT
684
685
71640
DO JL=IBEG,IEND
686
71568
  ZTRSOC(JL, 1)=ZFCS(JL,     1)/(ZRII0*ZRMU0(JL))
687
71568
  ZTRSOC(JL, 2)=ZFCS(JL,KLEV+1)/(ZRII0*ZRMU0(JL))
688
71568
  ZEMTC (JL, 1)=ZFCT(JL,     1)
689
71640
  ZEMTC (JL, 2)=ZFCT(JL,KLEV+1)
690
ENDDO
691
692
!                 ------------ -- ------- -- ---- -----
693
!*         5.1    STORAGE OF TRANSMISSIVITY AND EMISSIVITIES
694
!*                IN KPROMA-LONG ARRAYS
695
696
2952
DO JK=1,KLEV+1
697
2865672
  DO JL=IBEG,IEND
698
2862720
    PEMTD(JL,JK)=ZEMTD(JL,JK)
699
2862720
    PEMTU(JL,JK)=ZEMTU(JL,JK)
700
2865600
    PTRSO(JL,JK)=MAX(0.0_JPRB,MIN(1.0_JPRB,PSWFT(JL,JK)))
701
  ENDDO
702
ENDDO
703
216
DO JK=1,2
704
143352
  DO JL=IBEG,IEND
705
143136
    PCEMTR(JL,JK)=ZEMTC (JL,JK)
706
143280
    PCTRSO(JL,JK)=MAX( 0.0_JPRB,MIN(1.0_JPRB,ZTRSOC(JL,JK)))
707
  ENDDO
708
ENDDO
709
71640
DO JL=IBEG,IEND
710
71640
  PTRSOD(JL)=MAX(0.0_JPRB,MIN(1.0_JPRB,ZFRSOD(JL)/(ZRII0*ZRMU0(JL))))
711
ENDDO
712
713
!*         7.3   RECONSTRUCT FLUXES FOR DIAGNOSTICS
714
715
71640
DO JL=IBEG,IEND
716
71640
  IF (PMU0(JL) < 1.E-10_JPRB) ZRMU0(JL)=0.0_JPRB
717
ENDDO
718
2952
DO JK=1,KLEV+1
719
2865672
  DO JL=IBEG,IEND
720
2862720
    PLWFT(JL,JK)=PEMTD(JL,JK)
721
2865600
    PSWFT(JL,JK)=ZRMU0(JL)*ZRII0*PTRSO(JL,JK)
722
  ENDDO
723
ENDDO
724
216
DO JK=1,2
725
143352
  DO JL=IBEG,IEND
726
143136
    PSWFC(JL,JK)=ZRMU0(JL)*ZRII0*PCTRSO(JL,JK)
727
143280
    PLWFC(JL,JK)=PCEMTR(JL,JK)
728
  ENDDO
729
ENDDO
730
731
!*  8.0 DIAGNOSTICS
732
!---Now we copy back the correct fields to proceed to the next timestep
733
734

72
IF  ( AEROSOLFEEDBACK_ACTIVE .AND. (flag_aerosol .GT. 0 .OR. flag_aerosol_strat) ) THEN
735
736
  IF ( ok_ade .and. ok_aie  ) THEN
737
    PFSUP(:,:) =    ZFSUP_AERO(:,:,4)
738
    PFSDN(:,:) =    ZFSDN_AERO(:,:,4)
739
    PFSCUP(:,:) =   ZFSUP0_AERO(:,:,4)
740
    PFSCDN(:,:) =   ZFSDN0_AERO(:,:,4)
741
742
    PFLUX(:,1,:) =  LWUP_AERO(:,:,4)
743
    PFLUX(:,2,:) =  LWDN_AERO(:,:,4)
744
    PFLUC(:,1,:) =  LWUP0_AERO(:,:,4)
745
    PFLUC(:,2,:) =  LWDN0_AERO(:,:,4)
746
  ENDIF
747
748
  IF ( ok_ade .and. (.not. ok_aie) )  THEN
749
    PFSUP(:,:) =    ZFSUP_AERO(:,:,3)
750
    PFSDN(:,:) =    ZFSDN_AERO(:,:,3)
751
    PFSCUP(:,:) =   ZFSUP0_AERO(:,:,3)
752
    PFSCDN(:,:) =   ZFSDN0_AERO(:,:,3)
753
754
    PFLUX(:,1,:) =  LWUP_AERO(:,:,3)
755
    PFLUX(:,2,:) =  LWDN_AERO(:,:,3)
756
    PFLUC(:,1,:) =  LWUP0_AERO(:,:,3)
757
    PFLUC(:,2,:) =  LWDN0_AERO(:,:,3)
758
  ENDIF
759
760
  IF ( (.not. ok_ade) .and. ok_aie  )  THEN
761
    PFSUP(:,:) =    ZFSUP_AERO(:,:,2)
762
    PFSDN(:,:) =    ZFSDN_AERO(:,:,2)
763
    PFSCUP(:,:) =   ZFSUP0_AERO(:,:,2)
764
    PFSCDN(:,:) =   ZFSDN0_AERO(:,:,2)
765
766
    PFLUX(:,1,:) =  LWUP_AERO(:,:,2)
767
    PFLUX(:,2,:) =  LWDN_AERO(:,:,2)
768
    PFLUC(:,1,:) =  LWUP0_AERO(:,:,2)
769
    PFLUC(:,2,:) =  LWDN0_AERO(:,:,2)
770
  ENDiF
771
772
  IF ((.not. ok_ade) .and. (.not. ok_aie)) THEN
773
    PFSUP(:,:) =    ZFSUP_AERO(:,:,1)
774
    PFSDN(:,:) =    ZFSDN_AERO(:,:,1)
775
    PFSCUP(:,:) =   ZFSUP0_AERO(:,:,1)
776
    PFSCDN(:,:) =   ZFSDN0_AERO(:,:,1)
777
778
    PFLUX(:,1,:) =  LWUP_AERO(:,:,1)
779
    PFLUX(:,2,:) =  LWDN_AERO(:,:,1)
780
    PFLUC(:,1,:) =  LWUP0_AERO(:,:,1)
781
    PFLUC(:,2,:) =  LWDN0_AERO(:,:,1)
782
  ENDIF
783
784
! The following allows to compute the forcing diagostics without
785
! letting the aerosol forcing act on the meteorology
786
! SEE logic above
787
788
ELSE  !--not AEROSOLFEEDBACK_ACTIVE
789
790

2865672
    PFSUP(:,:) =    ZFSUP_AERO(:,:,5)
791

2865672
    PFSDN(:,:) =    ZFSDN_AERO(:,:,5)
792

2865672
    PFSCUP(:,:) =   ZFSUP0_AERO(:,:,5)
793

2865672
    PFSCDN(:,:) =   ZFSDN0_AERO(:,:,5)
794
795

2865672
    PFLUX(:,1,:) =  LWUP_AERO(:,:,5)
796

2865672
    PFLUX(:,2,:) =  LWDN_AERO(:,:,5)
797

2865672
    PFLUC(:,1,:) =  LWUP0_AERO(:,:,5)
798

2865672
    PFLUC(:,2,:) =  LWDN0_AERO(:,:,5)
799
800
ENDIF
801
802
!--VolMIP Strat/Surf
803
!--only ok_ade + ok_aie case treated
804

72
IF (ok_ade.AND.ok_aie.AND.ok_volcan) THEN
805
   !--in this case the fluxes used for the heating rates come from case 4 but SW surface radiation is kept from case 2
806
   IF (flag_volc_surfstrat.EQ.2) THEN ! STRAT HEATING
807
      volmip_solsw(:)= ZFSDN_AERO(:,1,2)-ZFSUP_AERO(:,1,2)
808
   ELSEIF (flag_volc_surfstrat.EQ.1) THEN ! SURF COOLING
809
      !--in this case the fluxes used for the heating rates come from case 2 but SW surface radiation is kept from case 4
810
      PFSUP(:,:) =    ZFSUP_AERO(:,:,2)
811
      PFSDN(:,:) =    ZFSDN_AERO(:,:,2)
812
      PFSCUP(:,:) =   ZFSUP0_AERO(:,:,2)
813
      PFSCDN(:,:) =   ZFSDN0_AERO(:,:,2)
814
      PFLUX(:,1,:) =  LWUP_AERO(:,:,2)
815
      PFLUX(:,2,:) =  LWDN_AERO(:,:,2)
816
      PFLUC(:,1,:) =  LWDN0_AERO(:,:,2)
817
      PFLUC(:,2,:) =  LWDN0_AERO(:,:,2)
818
      volmip_solsw(:)= ZFSDN_AERO(:,1,4)-ZFSUP_AERO(:,1,4)
819
   ENDIF
820
ENDIF
821
!--End VolMIP Strat/Surf
822
823
72
IF (swaerofree_diag) THEN
824
! copy shortwave clear-sky clean (no aerosol) case
825

2865672
  PFSCCUP(:,:) =   ZFSUP0_AERO(:,:,5)
826

2865672
  PFSCCDN(:,:) =   ZFSDN0_AERO(:,:,5)
827
! copy longwave clear-sky clean (no aerosol) case
828

2865672
  PFLCCUP(:,:) =   LWUP0_AERO(:,:,5)
829

2865672
  PFLCCDN(:,:) =   LWDN0_AERO(:,:,5)
830
ENDIF
831
832
!OB- HERE CHECK WITH MP IF BOTTOM AND TOP INDICES ARE OK !!!!!!!!!!!!!!!!!!
833
! net anthropogenic forcing direct and 1st indirect effect diagnostics
834
! requires a natural aerosol field read and used
835
! Difference of net fluxes from double call to radiation
836
! Will need to be extended to LW radiation -> done by CK (2014-05-23)
837
838

72
IF (flag_aerosol .GT. 0 .OR. flag_aerosol_strat) THEN
839
840
IF (ok_ade.AND.ok_aie) THEN
841
842
! direct anthropogenic forcing
843
     PSOLSWADAERO(:)  = (ZFSDN_AERO(:,1,4)      -ZFSUP_AERO(:,1,4))      -(ZFSDN_AERO(:,1,2)      -ZFSUP_AERO(:,1,2))
844
     PTOPSWADAERO(:)  = (ZFSDN_AERO(:,KLEV+1,4) -ZFSUP_AERO(:,KLEV+1,4)) -(ZFSDN_AERO(:,KLEV+1,2) -ZFSUP_AERO(:,KLEV+1,2))
845
     PSOLSWAD0AERO(:) = (ZFSDN0_AERO(:,1,4)     -ZFSUP0_AERO(:,1,4))     -(ZFSDN0_AERO(:,1,2)     -ZFSUP0_AERO(:,1,2))
846
     PTOPSWAD0AERO(:) = (ZFSDN0_AERO(:,KLEV+1,4)-ZFSUP0_AERO(:,KLEV+1,4))-(ZFSDN0_AERO(:,KLEV+1,2)-ZFSUP0_AERO(:,KLEV+1,2))
847
     IF(ok_volcan) THEN
848
        PSWADAERO(:,:)  = (ZFSDN_AERO(:,:,4) -ZFSUP_AERO(:,:,4)) -(ZFSDN_AERO(:,:,2) -ZFSUP_AERO(:,:,2)) !--NL
849
     ENDIF
850
851
! indirect anthropogenic forcing
852
     PSOLSWAIAERO(:) = (ZFSDN_AERO(:,1,4)     -ZFSUP_AERO(:,1,4))     -(ZFSDN_AERO(:,1,3)     -ZFSUP_AERO(:,1,3))
853
     PTOPSWAIAERO(:) = (ZFSDN_AERO(:,KLEV+1,4)-ZFSUP_AERO(:,KLEV+1,4))-(ZFSDN_AERO(:,KLEV+1,3)-ZFSUP_AERO(:,KLEV+1,3))
854
855
! Cloud radiative forcing with natural aerosol for direct effect
856
     PSOLSWCFAERO(:,1) = (ZFSDN_AERO(:,1,2)     -ZFSUP_AERO(:,1,2))     -(ZFSDN0_AERO(:,1,2)     -ZFSUP0_AERO(:,1,2))
857
     PTOPSWCFAERO(:,1) = (ZFSDN_AERO(:,KLEV+1,2)-ZFSUP_AERO(:,KLEV+1,2))-(ZFSDN0_AERO(:,KLEV+1,2)-ZFSUP0_AERO(:,KLEV+1,2))
858
! Cloud radiative forcing with anthropogenic aerosol for direct effect
859
     PSOLSWCFAERO(:,2) = (ZFSDN_AERO(:,1,4)     -ZFSUP_AERO(:,1,4))     -(ZFSDN0_AERO(:,1,4)     -ZFSUP0_AERO(:,1,4))
860
     PTOPSWCFAERO(:,2) = (ZFSDN_AERO(:,KLEV+1,4)-ZFSUP_AERO(:,KLEV+1,4))-(ZFSDN0_AERO(:,KLEV+1,4)-ZFSUP0_AERO(:,KLEV+1,4))
861
! Cloud radiative forcing with no direct effect at all
862
     PSOLSWCFAERO(:,3) = 0.0
863
     PTOPSWCFAERO(:,3) = 0.0
864
865
! LW direct anthropogenic forcing
866
     PSOLLWADAERO(:)  = (-LWDN_AERO(:,1,4)      -LWUP_AERO(:,1,4))      -(-LWDN_AERO(:,1,2)      -LWUP_AERO(:,1,2))
867
     PTOPLWADAERO(:)  = (-LWDN_AERO(:,KLEV+1,4) -LWUP_AERO(:,KLEV+1,4)) -(-LWDN_AERO(:,KLEV+1,2) -LWUP_AERO(:,KLEV+1,2))
868
     PSOLLWAD0AERO(:) = (-LWDN0_AERO(:,1,4)     -LWUP0_AERO(:,1,4))     -(-LWDN0_AERO(:,1,2)     -LWUP0_AERO(:,1,2))
869
     PTOPLWAD0AERO(:) = (-LWDN0_AERO(:,KLEV+1,4)-LWUP0_AERO(:,KLEV+1,4))-(-LWDN0_AERO(:,KLEV+1,2)-LWUP0_AERO(:,KLEV+1,2))
870
     IF(ok_volcan) THEN
871
        PLWADAERO(:,:)  = (-LWDN_AERO(:,:,4) -LWUP_AERO(:,:,4)) -(-LWDN_AERO(:,:,2) -LWUP_AERO(:,:,2)) !--NL
872
     ENDIF
873
874
! LW indirect anthropogenic forcing
875
     PSOLLWAIAERO(:) = (-LWDN_AERO(:,1,4)     -LWUP_AERO(:,1,4))     -(-LWDN_AERO(:,1,3)     -LWUP_AERO(:,1,3))
876
     PTOPLWAIAERO(:) = (-LWDN_AERO(:,KLEV+1,4)-LWUP_AERO(:,KLEV+1,4))-(-LWDN_AERO(:,KLEV+1,3)-LWUP_AERO(:,KLEV+1,3))
877
878
ENDIF
879
880
IF (ok_ade.AND..NOT.ok_aie) THEN
881
882
! direct anthropogenic forcing
883
     PSOLSWADAERO(:)  = (ZFSDN_AERO(:,1,3)      -ZFSUP_AERO(:,1,3))      -(ZFSDN_AERO(:,1,1)      -ZFSUP_AERO(:,1,1))
884
     PTOPSWADAERO(:)  = (ZFSDN_AERO(:,KLEV+1,3) -ZFSUP_AERO(:,KLEV+1,3)) -(ZFSDN_AERO(:,KLEV+1,1) -ZFSUP_AERO(:,KLEV+1,1))
885
     PSOLSWAD0AERO(:) = (ZFSDN0_AERO(:,1,3)     -ZFSUP0_AERO(:,1,3))     -(ZFSDN0_AERO(:,1,1)     -ZFSUP0_AERO(:,1,1))
886
     PTOPSWAD0AERO(:) = (ZFSDN0_AERO(:,KLEV+1,3)-ZFSUP0_AERO(:,KLEV+1,3))-(ZFSDN0_AERO(:,KLEV+1,1)-ZFSUP0_AERO(:,KLEV+1,1))
887
     IF(ok_volcan) THEN
888
        PSWADAERO(:,:)  = (ZFSDN_AERO(:,:,3) -ZFSUP_AERO(:,:,3)) -(ZFSDN_AERO(:,:,1) -ZFSUP_AERO(:,:,1)) !--NL
889
     ENDIF
890
891
! indirect anthropogenic forcing
892
     PSOLSWAIAERO(:) = 0.0
893
     PTOPSWAIAERO(:) = 0.0
894
895
! Cloud radiative forcing with natural aerosol for direct effect
896
     PSOLSWCFAERO(:,1) = (ZFSDN_AERO(:,1,1)     -ZFSUP_AERO(:,1,1))     -(ZFSDN0_AERO(:,1,1)     -ZFSUP0_AERO(:,1,1))
897
     PTOPSWCFAERO(:,1) = (ZFSDN_AERO(:,KLEV+1,1)-ZFSUP_AERO(:,KLEV+1,1))-(ZFSDN0_AERO(:,KLEV+1,1)-ZFSUP0_AERO(:,KLEV+1,1))
898
! Cloud radiative forcing with anthropogenic aerosol for direct effect
899
     PSOLSWCFAERO(:,2) = (ZFSDN_AERO(:,1,3)     -ZFSUP_AERO(:,1,3))     -(ZFSDN0_AERO(:,1,3)     -ZFSUP0_AERO(:,1,3))
900
     PTOPSWCFAERO(:,2) = (ZFSDN_AERO(:,KLEV+1,3)-ZFSUP_AERO(:,KLEV+1,3))-(ZFSDN0_AERO(:,KLEV+1,3)-ZFSUP0_AERO(:,KLEV+1,3))
901
! Cloud radiative forcing with no direct effect at all
902
     PSOLSWCFAERO(:,3) = 0.0
903
     PTOPSWCFAERO(:,3) = 0.0
904
905
! LW direct anthropogenic forcing
906
     PSOLLWADAERO(:)  = (-LWDN_AERO(:,1,3)      -LWUP_AERO(:,1,3))      -(-LWDN_AERO(:,1,1)      -LWUP_AERO(:,1,1))
907
     PTOPLWADAERO(:)  = (-LWDN_AERO(:,KLEV+1,3) -LWUP_AERO(:,KLEV+1,3)) -(-LWDN_AERO(:,KLEV+1,1) -LWUP_AERO(:,KLEV+1,1))
908
     PSOLLWAD0AERO(:) = (-LWDN0_AERO(:,1,3)     -LWUP0_AERO(:,1,3))     -(-LWDN0_AERO(:,1,1)     -LWUP0_AERO(:,1,1))
909
     PTOPLWAD0AERO(:) = (-LWDN0_AERO(:,KLEV+1,3)-LWUP0_AERO(:,KLEV+1,3))-(-LWDN0_AERO(:,KLEV+1,1)-LWUP0_AERO(:,KLEV+1,1))
910
     IF(ok_volcan) THEN
911
        PLWADAERO(:,:)  = (-LWDN_AERO(:,:,3) -LWUP_AERO(:,:,3)) -(-LWDN_AERO(:,:,1) -LWUP_AERO(:,:,1)) !--NL
912
     ENDIF
913
914
! LW indirect anthropogenic forcing
915
     PSOLLWAIAERO(:) = 0.0
916
     PTOPLWAIAERO(:) = 0.0
917
918
ENDIF
919
920
IF (.NOT.ok_ade.AND.ok_aie) THEN
921
922
! direct anthropogenic forcing
923
     PSOLSWADAERO(:)  = 0.0
924
     PTOPSWADAERO(:)  = 0.0
925
     PSOLSWAD0AERO(:) = 0.0
926
     PTOPSWAD0AERO(:) = 0.0
927
     IF(ok_volcan) THEN
928
        PSWADAERO(:,:)  = 0.0 !--NL
929
     ENDIF
930
931
! indirect anthropogenic forcing
932
     PSOLSWAIAERO(:) = (ZFSDN_AERO(:,1,2)     -ZFSUP_AERO(:,1,2))     -(ZFSDN_AERO(:,1,1)     -ZFSUP_AERO(:,1,1))
933
     PTOPSWAIAERO(:) = (ZFSDN_AERO(:,KLEV+1,2)-ZFSUP_AERO(:,KLEV+1,2))-(ZFSDN_AERO(:,KLEV+1,1)-ZFSUP_AERO(:,KLEV+1,1))
934
935
! Cloud radiative forcing with natural aerosol for direct effect
936
     PSOLSWCFAERO(:,1) = (ZFSDN_AERO(:,1,2)     -ZFSUP_AERO(:,1,2))     -(ZFSDN0_AERO(:,1,2)     -ZFSUP0_AERO(:,1,2))
937
     PTOPSWCFAERO(:,1) = (ZFSDN_AERO(:,KLEV+1,2)-ZFSUP_AERO(:,KLEV+1,2))-(ZFSDN0_AERO(:,KLEV+1,2)-ZFSUP0_AERO(:,KLEV+1,2))
938
! Cloud radiative forcing with anthropogenic aerosol for direct effect
939
     PSOLSWCFAERO(:,2) = 0.0
940
     PTOPSWCFAERO(:,2) = 0.0
941
! Cloud radiative forcing with no direct effect at all
942
     PSOLSWCFAERO(:,3) = 0.0
943
     PTOPSWCFAERO(:,3) = 0.0
944
945
! LW direct anthropogenic forcing
946
     PSOLLWADAERO(:)  = 0.0
947
     PTOPLWADAERO(:)  = 0.0
948
     PSOLLWAD0AERO(:) = 0.0
949
     PTOPLWAD0AERO(:) = 0.0
950
     IF(ok_volcan) THEN
951
        PLWADAERO(:,:)  = 0.0 !--NL
952
     ENDIF
953
954
! LW indirect anthropogenic forcing
955
     PSOLLWAIAERO(:) = (-LWDN_AERO(:,1,2)     -LWUP_AERO(:,1,2))     -(-LWDN_AERO(:,1,1)     -LWUP_AERO(:,1,1))
956
     PTOPLWAIAERO(:) = (-LWDN_AERO(:,KLEV+1,2)-LWUP_AERO(:,KLEV+1,2))-(-LWDN_AERO(:,KLEV+1,1)-LWUP_AERO(:,KLEV+1,1))
957
958
ENDIF
959
960
IF (.NOT.ok_ade.AND..NOT.ok_aie) THEN
961
962
! direct anthropogenic forcing
963
     PSOLSWADAERO(:)  = 0.0
964
     PTOPSWADAERO(:)  = 0.0
965
     PSOLSWAD0AERO(:) = 0.0
966
     PTOPSWAD0AERO(:) = 0.0
967
     IF(ok_volcan) THEN
968
        PSWADAERO(:,:)  = 0.0 !--NL
969
     ENDIF
970
971
! indirect anthropogenic forcing
972
     PSOLSWAIAERO(:) = 0.0
973
     PTOPSWAIAERO(:) = 0.0
974
975
! Cloud radiative forcing with natural aerosol for direct effect
976
     PSOLSWCFAERO(:,1) = (ZFSDN_AERO(:,1,1)     -ZFSUP_AERO(:,1,1))     -(ZFSDN0_AERO(:,1,1)     -ZFSUP0_AERO(:,1,1))
977
     PTOPSWCFAERO(:,1) = (ZFSDN_AERO(:,KLEV+1,1)-ZFSUP_AERO(:,KLEV+1,1))-(ZFSDN0_AERO(:,KLEV+1,1)-ZFSUP0_AERO(:,KLEV+1,1))
978
! Cloud radiative forcing with anthropogenic aerosol for direct effect
979
     PSOLSWCFAERO(:,2) = 0.0
980
     PTOPSWCFAERO(:,2) = 0.0
981
! Cloud radiative forcing with no direct effect at all
982
     PSOLSWCFAERO(:,3) = 0.0
983
     PTOPSWCFAERO(:,3) = 0.0
984
985
! LW direct anthropogenic forcing
986
     PSOLLWADAERO(:)  = 0.0
987
     PTOPLWADAERO(:)  = 0.0
988
     PSOLLWAD0AERO(:) = 0.0
989
     PTOPLWAD0AERO(:) = 0.0
990
     IF(ok_volcan) THEN
991
        PLWADAERO(:,:)  = 0.0 !--NL
992
     ENDIF
993
994
! LW indirect anthropogenic forcing
995
     PSOLLWAIAERO(:) = 0.0
996
     PTOPLWAIAERO(:) = 0.0
997
998
ENDIF
999
1000
ENDIF
1001
1002
!IF (swaero_diag .OR. .NOT. AEROSOLFEEDBACK_ACTIVE) THEN
1003
72
IF (.NOT. AEROSOLFEEDBACK_ACTIVE) THEN
1004
! Cloudforcing without aerosol at all
1005
     PSOLSWCFAERO(:,3) = (ZFSDN_AERO(:,1,5)     -ZFSUP_AERO(:,1,5))     -(ZFSDN0_AERO(:,1,5)     -ZFSUP0_AERO(:,1,5))
1006
     PTOPSWCFAERO(:,3) = (ZFSDN_AERO(:,KLEV+1,5)-ZFSUP_AERO(:,KLEV+1,5))-(ZFSDN0_AERO(:,KLEV+1,5)-ZFSUP0_AERO(:,KLEV+1,5))
1007
1008
ENDIF
1009
1010
72
IF (LHOOK) CALL DR_HOOK('RECMWF_AERO',1,ZHOOK_HANDLE)
1011
72
END SUBROUTINE RECMWF_AERO