SURFEX v8.1
General documentation of Surfex
alloc_diag_surf_atmn.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #############################################################
6  SUBROUTINE alloc_diag_surf_atm_n (DGO, D, DC, ND, NDC, &
7  KSIZE_FULL, TPTIME, HPROGRAM,KSW)
8 ! #############################################################
9 !
10 !! AUTHOR
11 !! ------
12 !! V. Masson *Meteo France*
13 !!
14 !! MODIFICATIONS
15 !! -------------
16 !! Original 01/2004
17 !! Modified 01/2006 : sea flux parameterization.
18 !! 08/2009 : TIME_BUDGETC for all Tile
19 ! B. decharme 09/2012 : XQS_TILE not initialize
20 ! B. decharme 04/2013 : Add EVAP and SUBL diag
21 !-------------------------------------------------------------------------------
22 !
23 !* 0. DECLARATIONS
24 ! ------------
25 !
27 !
28 USE modd_data_cover_par, ONLY : ntilesfc
29 USE modd_surf_par, ONLY : xundef
30 !
32 !
34 !
35 USE yomhook ,ONLY : lhook, dr_hook
36 USE parkind1 ,ONLY : jprb
37 !
38 IMPLICIT NONE
39 !
40 !* 0.1 Declarations of arguments
41 ! -------------------------
42 !
43 TYPE(diag_options_t), INTENT(INOUT) :: DGO
44 TYPE(diag_t), INTENT(INOUT) :: D
45 TYPE(diag_t), INTENT(INOUT) :: DC
46 TYPE(diag_np_t), INTENT(INOUT) :: ND
47 TYPE(diag_np_t), INTENT(INOUT) :: NDC
48 !
49 INTEGER, INTENT(IN) :: KSIZE_FULL
50 TYPE(date_time), INTENT(IN) :: TPTIME
51 !
52  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
53 INTEGER, INTENT(IN) :: KSW ! number of short-wave spectral bands
54 !
55 !* 0.2 Declarations of local variables
56 ! -------------------------------
57 !
58 INTEGER :: JTILE
59 INTEGER :: IVERSION
60 INTEGER :: IRESP ! IRESP : return-code if a problem appears
61  CHARACTER(LEN=12) :: YREC ! Name of the article to be read
62 REAL(KIND=JPRB) :: ZHOOK_HANDLE
63 !
64 !-------------------------------------------------------------------------------
65 !
66 IF (lhook) CALL dr_hook('ALLOC_DIAG_SURF_ATM_N',0,zhook_handle)
67 !
68 ! Initialization: Outputs to atmosphere over each tile:
69 !
70 DO jtile = 1,ntilesfc
71  !
72  CALL alloc_diag(nd%AL(jtile),.false.,ksize_full,ksw)
73  CALL init_diag(nd%AL(jtile),.false.,xundef)
74  !
75 ENDDO
76 !
77 ! Initialization: aggregated fields
78 !
79  CALL alloc_diag(d,.false.,ksize_full,ksw)
80  CALL init_diag(d,.false.,xundef)
81 !
82 ALLOCATE(d%XSFCO2 (ksize_full))
83 !
84 ALLOCATE(d%XT2M_MIN_ZS (ksize_full))
85 ALLOCATE(d%XQ2M_MIN_ZS (ksize_full))
86 ALLOCATE(d%XHU2M_MIN_ZS (ksize_full))
87 !
88 ALLOCATE(d%XPS (ksize_full))
89 ALLOCATE(d%XRHOA (ksize_full))
90 !
91 ALLOCATE(d%XSSO_FMU (ksize_full))
92 ALLOCATE(d%XSSO_FMV (ksize_full))
93 !
94 ALLOCATE(d%XUREF (ksize_full))
95 ALLOCATE(d%XZREF (ksize_full))
96 ALLOCATE(d%XTRAD (ksize_full))
97 ALLOCATE(d%XEMIS (ksize_full))
98 !
99 d%XSFCO2 = xundef
100 !
101 d%XT2M_MIN_ZS = xundef
102 d%XQ2M_MIN_ZS = xundef
103 d%XHU2M_MIN_ZS = xundef
104 !
105 d%XPS = xundef
106 d%XRHOA = xundef
107 !
108 d%XSSO_FMU = xundef
109 d%XSSO_FMV = xundef
110 !
111 d%XUREF = xundef
112 d%XZREF = xundef
113 d%XTRAD = xundef
114 d%XEMIS = xundef
115 !
116 IF (dgo%LSURF_BUDGETC) THEN
117  !
118  DO jtile = 1,ntilesfc
119  !
120  CALL alloc_diag(ndc%AL(jtile),.true.,ksize_full,0)
121  CALL init_diag(ndc%AL(jtile),.true.,xundef)
122  !
123  ENDDO
124  !
125  CALL alloc_diag(dc,.true.,ksize_full,0)
126  !
127  yrec='BUDC'
128  CALL read_surf(hprogram,yrec,dgo%LREAD_BUDGETC,iresp)
129  !
130  IF (.NOT. dgo%LREAD_BUDGETC .OR. (dgo%LREAD_BUDGETC.AND.dgo%LRESET_BUDGETC)) THEN
131  !
132  dgo%TIME_BUDGETC = tptime
133  CALL init_diag(dc,.true.,0.0)
134  !
135  ELSE
136  !
137  yrec='TBUDC'
138  CALL read_surf(hprogram,yrec,dgo%TIME_BUDGETC,iresp)
139  !
140  yrec='RNC'
141  CALL read_surf(hprogram,yrec,dc%XRN,iresp)
142  yrec='HC'
143  CALL read_surf(hprogram,yrec,dc%XH ,iresp)
144  yrec='LEC'
145  CALL read_surf(hprogram,yrec,dc%XLE,iresp)
146  yrec='LEIC'
147  CALL read_surf(hprogram,yrec,dc%XLEI,iresp)
148  yrec='GFLUXC'
149  CALL read_surf(hprogram,yrec,dc%XGFLUX ,iresp)
150  !
151  yrec='SWDC'
152  CALL read_surf(hprogram,yrec,dc%XSWD,iresp)
153  yrec='SWUC'
154  CALL read_surf(hprogram,yrec,dc%XSWU,iresp)
155  yrec='LWDC'
156  CALL read_surf(hprogram,yrec,dc%XLWD,iresp)
157  yrec='LWUC'
158  CALL read_surf(hprogram,yrec,dc%XLWU,iresp)
159  !
160  yrec='FMUC'
161  CALL read_surf(hprogram,yrec,dc%XFMU,iresp)
162  yrec='FMVC'
163  CALL read_surf(hprogram,yrec,dc%XFMV,iresp)
164  !
165  CALL read_surf(hprogram,'VERSION',iversion,iresp)
166  IF (iversion<8)THEN
167  dc%XEVAP = 0.0
168  dc%XSUBL = 0.0
169  ELSE
170  yrec='EVAPC'
171  CALL read_surf(hprogram,yrec,dc%XEVAP,iresp)
172  yrec='SUBLC'
173  CALL read_surf(hprogram,yrec,dc%XSUBL,iresp)
174  ENDIF
175  !
176  ENDIF
177  !
178 ELSE
179  !
180  DO jtile=1,ntilesfc
181  CALL alloc_diag(ndc%AL(jtile),.true.,0,0)
182  ENDDO
183  !
184  CALL alloc_diag(dc,.true.,0,0)
185  !
186 ENDIF
187 IF (lhook) CALL dr_hook('ALLOC_DIAG_SURF_ATM_N',1,zhook_handle)
188 !
189 CONTAINS
190 !
191 SUBROUTINE alloc_diag(DA,OCUM,KSIZE1,KSIZE2)
192 !
193 TYPE(diag_t), INTENT(INOUT) :: DA
194 LOGICAL, INTENT(IN) :: OCUM
195 INTEGER, INTENT(IN) :: KSIZE1
196 INTEGER, INTENT(IN) :: KSIZE2
197 REAL(KIND=JPRB) :: ZHOOK_HANDLE
198 !
199 IF (lhook) CALL dr_hook('ALLOC_DIAG_SURF_ATM_N:ALLOC_DIAG',0,zhook_handle)
200 !
201 IF (.NOT.ocum) THEN
202  !
203  ALLOCATE(da%XRI (ksize1))
204  ALLOCATE(da%XCD (ksize1))
205  ALLOCATE(da%XCH (ksize1))
206  ALLOCATE(da%XCE (ksize1))
207  !
208  ALLOCATE(da%XT2M (ksize1))
209  ALLOCATE(da%XTS (ksize1))
210  ALLOCATE(da%XT2M_MIN(ksize1))
211  ALLOCATE(da%XT2M_MAX(ksize1))
212  ALLOCATE(da%XQ2M (ksize1))
213  ALLOCATE(da%XHU2M (ksize1))
214  ALLOCATE(da%XHU2M_MIN(ksize1))
215  ALLOCATE(da%XHU2M_MAX(ksize1))
216  ALLOCATE(da%XZON10M (ksize1))
217  ALLOCATE(da%XMER10M (ksize1))
218  !
219  ALLOCATE(da%XSWBD (ksize1,ksize2))
220  ALLOCATE(da%XSWBU (ksize1,ksize2))
221  !
222  ALLOCATE(da%XQS (ksize1))
223  ALLOCATE(da%XZ0 (ksize1))
224  ALLOCATE(da%XZ0H (ksize1))
225  !
226  ALLOCATE(da%XWIND10M(ksize1))
227  ALLOCATE(da%XWIND10M_MAX(ksize1))
228  !
229 ELSE
230  !
231  ALLOCATE(da%XSWBD (0,0))
232  ALLOCATE(da%XSWBU (0,0))
233  !
234 ENDIF
235 !
236 ALLOCATE(da%XRN (ksize1))
237 ALLOCATE(da%XH (ksize1))
238 ALLOCATE(da%XLE (ksize1))
239 ALLOCATE(da%XLEI (ksize1))
240 ALLOCATE(da%XGFLUX (ksize1))
241 ALLOCATE(da%XEVAP (ksize1))
242 ALLOCATE(da%XSUBL (ksize1))
243 !
244 ALLOCATE(da%XSWD (ksize1))
245 ALLOCATE(da%XSWU (ksize1))
246 !
247 ALLOCATE(da%XLWD (ksize1))
248 ALLOCATE(da%XLWU (ksize1))
249 ALLOCATE(da%XFMU (ksize1))
250 ALLOCATE(da%XFMV (ksize1))
251 !
252 IF (lhook) CALL dr_hook('ALLOC_DIAG_SURF_ATM_N:ALLOC_DIAG',1,zhook_handle)
253 !
254 END SUBROUTINE alloc_diag
255 !
256 SUBROUTINE init_diag(DA,OCUM,PVAL)
257 !
258 TYPE(diag_t), INTENT(INOUT) :: DA
259 LOGICAL, INTENT(IN) :: OCUM
260 REAL, INTENT(IN) :: PVAL
261 REAL(KIND=JPRB) :: ZHOOK_HANDLE
262 !
263 IF (lhook) CALL dr_hook('ALLOC_DIAG_SURF_ATM_N:INIT_DIAG',0,zhook_handle)
264 !
265 IF (.NOT.ocum) THEN
266  !
267  da%XRI = pval
268  da%XCD = pval
269  da%XCH = pval
270  da%XCE = pval
271  !
272  da%XT2M = pval
273  da%XTS = pval
274  da%XT2M_MIN = pval
275  da%XT2M_MAX = pval
276  da%XQ2M = pval
277  da%XHU2M = pval
278  da%XHU2M_MIN= pval
279  da%XHU2M_MAX= pval
280  da%XZON10M = pval
281  da%XMER10M = pval
282  !
283  da%XSWBD = pval
284  da%XSWBU = pval
285  !
286  da%XQS = pval
287  da%XZ0 = pval
288  da%XZ0H = pval
289  !
290  da%XWIND10M = pval
291  da%XWIND10M_MAX = pval
292  !
293 ENDIF
294 !
295 da%XRN = pval
296 da%XH = pval
297 da%XLE = pval
298 da%XLEI = pval
299 da%XGFLUX = pval
300 da%XEVAP = pval
301 da%XSUBL = pval
302 !
303 da%XSWD = pval
304 da%XSWU = pval
305 da%XLWD = pval
306 da%XLWU = pval
307 da%XFMU = pval
308 da%XFMV = pval
309 !
310 IF (lhook) CALL dr_hook('ALLOC_DIAG_SURF_ATM_N:INIT_DIAG',1,zhook_handle)
311 !
312 END SUBROUTINE init_diag
313 !
314 !-------------------------------------------------------------------------------
315 !
316 END SUBROUTINE alloc_diag_surf_atm_n
subroutine alloc_diag_surf_atm_n(DGO, D, DC, ND, NDC, KSIZE_FULL, TPTIME, HPROGRAM, KSW)
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine alloc_diag(DA, OCUM, KSIZE1, KSIZE2)
subroutine init_diag(DA, OCUM, PVAL)