Juan 8/12/2016: add management of LEN_HREC in MNH & SURFEX
[MNH-git_open_source-lfs.git] / src / SURFEX / diag_watflux_initn.F90
1 !SURFEX_LIC Copyright 1994-2014 Meteo-France 
2 !SURFEX_LIC This is part of the SURFEX software governed by the CeCILL-C  licence
3 !SURFEX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SURFEX_LIC for details. version 1.
5 !     #########
6       SUBROUTINE DIAG_WATFLUX_INIT_n(HPROGRAM,KLU,KSW)
7 !     #####################
8 !
9 !!****  *DIAG_WATFLUX_INIT_n* - routine to initialize WATFLUX diagnostic variables
10 !!
11 !!    PURPOSE
12 !!    -------
13 !!
14 !!**  METHOD
15 !!    ------
16 !!
17 !!    EXTERNAL
18 !!    --------
19 !!
20 !!
21 !!    IMPLICIT ARGUMENTS
22 !!    ------------------
23 !!
24 !!    REFERENCE
25 !!    ---------
26 !!
27 !!
28 !!    AUTHOR
29 !!    ------
30 !!      V. Masson   *Meteo France*      
31 !!
32 !!    MODIFICATIONS
33 !!    -------------
34 !!      Original    01/2004 
35 !-------------------------------------------------------------------------------
36 !
37 !*       0.    DECLARATIONS
38 !              ------------
39 !
40 USE MODD_SURF_PAR,       ONLY : XUNDEF
41 USE MODD_SURF_ATM,       ONLY : LCPL_ESM
42 USE MODD_DIAG_SURF_ATM_n,ONLY : LREAD_BUDGETC
43 USE MODD_DIAG_WATFLUX_n, ONLY : N2M, LSURF_BUDGET, LCOEF, LSURF_VARS, &
44                                   LSURF_BUDGETC, LRESET_BUDGETC,        &
45                                   XRN, XH, XLE, XLEI, XGFLUX, XRI,      &
46                                   XCD, XCH, XCE, XZ0, XZ0H,             &
47                                   XT2M, XQ2M, XHU2M, XT2M_MIN, XT2M_MAX,&
48                                   XZON10M, XMER10M, XQS,                &
49                                   XSWD, XSWU, XLWD, XLWU,               &
50                                   XSWBD, XSWBU, XFMU, XFMV,             &
51                                   XRNC, XHC, XLEC, XLEIC, XGFLUXC,      &
52                                   XSWDC, XSWUC, XLWDC, XLWUC, XFMUC,    &
53                                   XFMVC, XDIAG_TS, XHU2M_MIN, XHU2M_MAX,&
54                                   XWIND10M, XWIND10M_MAX  
55 !
56 USE MODD_WATFLUX_n,      ONLY : XCPL_WATER_WIND,XCPL_WATER_EVAP,      &
57                                   XCPL_WATER_HEAT,XCPL_WATER_SNET,      &
58                                   XCPL_WATER_FWSU,XCPL_WATER_FWSV,      &
59                                   XCPL_WATER_RAIN,XCPL_WATER_SNOW,      &
60                                   XCPL_WATER_FWSM,                      &
61                                   XCPL_WATERICE_HEAT,XCPL_WATERICE_EVAP,&
62                                   XCPL_WATERICE_SNET  
63 !
64 USE MODI_READ_SURF
65 !
66 !
67 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
68 USE PARKIND1  ,ONLY : JPRB
69 !
70 IMPLICIT NONE
71 !
72 !*       0.1   Declarations of arguments
73 !              -------------------------
74 !
75 INTEGER, INTENT(IN) :: KLU   ! size of arrays
76 INTEGER, INTENT(IN) :: KSW   ! number of SW spectral bands
77  CHARACTER(LEN=6), INTENT(IN):: HPROGRAM  ! program calling
78 !
79 !*       0.2   Declarations of local variables
80 !              -------------------------------
81 !
82 INTEGER           :: IRESP          ! IRESP  : return-code if a problem appears
83  CHARACTER(LEN=LEN_HREC) :: YREC           ! Name of the article to be read
84 REAL(KIND=JPRB) :: ZHOOK_HANDLE
85 !
86 !-------------------------------------------------------------------------------
87 !
88 !* surface energy budget
89 !
90 IF (LHOOK) CALL DR_HOOK('DIAG_WATFLUX_INIT_N',0,ZHOOK_HANDLE)
91 ALLOCATE(XDIAG_TS(KLU))
92 XDIAG_TS = XUNDEF
93 !
94 IF (LSURF_BUDGET.OR.LSURF_BUDGETC) THEN
95   ALLOCATE(XRN     (KLU))
96   ALLOCATE(XH      (KLU))
97   ALLOCATE(XLE     (KLU))
98   ALLOCATE(XLEI    (KLU))
99   ALLOCATE(XGFLUX  (KLU))
100   ALLOCATE(XSWD    (KLU))
101   ALLOCATE(XSWU    (KLU))
102   ALLOCATE(XLWD    (KLU))
103   ALLOCATE(XLWU    (KLU))
104   ALLOCATE(XSWBD   (KLU,KSW))
105   ALLOCATE(XSWBU   (KLU,KSW))
106   ALLOCATE(XFMU    (KLU))
107   ALLOCATE(XFMV    (KLU))
108   !
109   XRN      = XUNDEF
110   XH       = XUNDEF
111   XLE      = XUNDEF
112   XLEI     = XUNDEF
113   XGFLUX   = XUNDEF
114   XSWD     = XUNDEF
115   XSWU     = XUNDEF
116   XLWD     = XUNDEF
117   XLWU     = XUNDEF
118   XSWBD    = XUNDEF
119   XSWBU    = XUNDEF
120   XFMU     = XUNDEF
121   XFMV     = XUNDEF
122 ELSE
123   ALLOCATE(XRN     (0))
124   ALLOCATE(XH      (0))
125   ALLOCATE(XLE     (0))
126   ALLOCATE(XLEI    (0))
127   ALLOCATE(XGFLUX  (0))
128   ALLOCATE(XSWD    (0))
129   ALLOCATE(XSWU    (0))
130   ALLOCATE(XLWD    (0))
131   ALLOCATE(XLWU    (0))
132   ALLOCATE(XSWBD   (0,0))
133   ALLOCATE(XSWBU   (0,0))
134   ALLOCATE(XFMU    (0))
135   ALLOCATE(XFMV    (0))
136 END IF
137 !
138 !* cumulative surface energy budget
139 !
140 IF (LSURF_BUDGETC) THEN
141 !        
142   ALLOCATE(XRNC    (KLU))
143   ALLOCATE(XHC     (KLU))
144   ALLOCATE(XLEC    (KLU))
145   ALLOCATE(XLEIC   (KLU))
146   ALLOCATE(XGFLUXC (KLU))
147   ALLOCATE(XSWDC   (KLU))
148   ALLOCATE(XSWUC   (KLU))
149   ALLOCATE(XLWDC   (KLU))
150   ALLOCATE(XLWUC   (KLU))
151   ALLOCATE(XFMUC   (KLU))
152   ALLOCATE(XFMVC   (KLU))
153 !
154   IF (.NOT. LREAD_BUDGETC) THEN        
155      XRNC    = 0.0
156      XHC     = 0.0
157      XLEC    = 0.0
158      XLEIC   = 0.0
159      XGFLUXC = 0.0
160      XSWDC   = 0.0
161      XSWUC   = 0.0
162      XLWDC   = 0.0
163      XLWUC   = 0.0
164      XFMUC   = 0.0
165      XFMVC   = 0.0
166   ELSEIF (LREAD_BUDGETC.AND.LRESET_BUDGETC) THEN
167      XRNC    = 0.0
168      XHC     = 0.0
169      XLEC    = 0.0
170      XLEIC   = 0.0
171      XGFLUXC = 0.0
172      XSWDC   = 0.0
173      XSWUC   = 0.0
174      XLWDC   = 0.0
175      XLWUC   = 0.0
176      XFMUC   = 0.0
177      XFMVC   = 0.0
178   ELSE
179      YREC='RNC_WAT'
180      CALL READ_SURF(HPROGRAM,YREC,XRNC,IRESP)
181      YREC='HC_WAT'
182      CALL READ_SURF(HPROGRAM,YREC,XHC ,IRESP)
183      YREC='LEC_WAT'
184      CALL READ_SURF(HPROGRAM,YREC,XLEC,IRESP)
185      YREC='LEIC_WAT'
186      CALL READ_SURF(HPROGRAM,YREC,XLEIC,IRESP)     
187      YREC='GFLUXC_WAT'
188      CALL READ_SURF(HPROGRAM,YREC,XGFLUXC,IRESP)
189      YREC='SWDC_WAT'
190      CALL READ_SURF(HPROGRAM,YREC,XSWDC,IRESP)
191      YREC='SWUC_WAT'
192      CALL READ_SURF(HPROGRAM,YREC,XSWUC,IRESP)
193      YREC='LWDC_WAT'
194      CALL READ_SURF(HPROGRAM,YREC,XLWDC,IRESP)
195      YREC='LWUC_WAT'
196      CALL READ_SURF(HPROGRAM,YREC,XLWUC,IRESP)
197      YREC='FMUC_WAT'
198      CALL READ_SURF(HPROGRAM,YREC,XFMUC,IRESP)
199      YREC='FMVC_WAT'
200      CALL READ_SURF(HPROGRAM,YREC,XFMVC,IRESP)
201   ENDIF   
202 ELSE
203   ALLOCATE(XRNC    (0))
204   ALLOCATE(XHC     (0))
205   ALLOCATE(XLEC    (0))
206   ALLOCATE(XLEIC   (0))
207   ALLOCATE(XGFLUXC (0))
208   ALLOCATE(XSWDC   (0))
209   ALLOCATE(XSWUC   (0))
210   ALLOCATE(XLWDC   (0))
211   ALLOCATE(XLWUC   (0))
212   ALLOCATE(XFMUC   (0))
213   ALLOCATE(XFMVC   (0))  
214 ENDIF
215 !
216 !* parameters at 2m
217 !
218 IF (N2M>=1) THEN
219   ALLOCATE(XRI     (KLU))
220   ALLOCATE(XT2M    (KLU))
221   ALLOCATE(XT2M_MIN(KLU))
222   ALLOCATE(XT2M_MAX(KLU))
223   ALLOCATE(XQ2M    (KLU))
224   ALLOCATE(XHU2M   (KLU))
225   ALLOCATE(XHU2M_MIN(KLU))
226   ALLOCATE(XHU2M_MAX(KLU))  
227   ALLOCATE(XZON10M (KLU))
228   ALLOCATE(XMER10M (KLU))
229   ALLOCATE(XWIND10M (KLU))
230   ALLOCATE(XWIND10M_MAX(KLU))  
231   !
232   XRI      = XUNDEF
233   XT2M     = XUNDEF
234   XT2M_MIN = XUNDEF
235   XT2M_MAX = 0.0
236   XQ2M     = XUNDEF
237   XHU2M    = XUNDEF
238   XHU2M_MIN= XUNDEF
239   XHU2M_MAX=-XUNDEF  
240   XZON10M  = XUNDEF
241   XMER10M  = XUNDEF
242   XWIND10M = XUNDEF
243   XWIND10M_MAX = 0.0  
244 ELSE
245   ALLOCATE(XRI      (0))
246   ALLOCATE(XT2M     (0))
247   ALLOCATE(XT2M_MIN (0))
248   ALLOCATE(XT2M_MAX (0))
249   ALLOCATE(XQ2M     (0))
250   ALLOCATE(XHU2M    (0))
251   ALLOCATE(XHU2M_MIN(0))
252   ALLOCATE(XHU2M_MAX(0))
253   ALLOCATE(XZON10M  (0))
254   ALLOCATE(XMER10M  (0))
255   ALLOCATE(XWIND10M (0))
256   ALLOCATE(XWIND10M_MAX(0))
257 END IF
258 !
259 !* transfer coefficients
260 !
261 IF (LCOEF) THEN
262   ALLOCATE(XCD     (KLU))
263   ALLOCATE(XCH     (KLU))
264   ALLOCATE(XCE     (KLU))
265   ALLOCATE(XZ0     (KLU))
266   ALLOCATE(XZ0H    (KLU))
267   !
268   XCD      = XUNDEF
269   XCH      = XUNDEF
270   XCE      = XUNDEF
271   XZ0      = XUNDEF
272   XZ0H     = XUNDEF
273 ELSE
274   ALLOCATE(XCD     (0))
275   ALLOCATE(XCH     (0))
276   ALLOCATE(XCE     (0))
277   ALLOCATE(XZ0     (0))
278   ALLOCATE(XZ0H    (0))
279 END IF
280 !
281 !
282 !* surface humidity
283 !
284 IF (LSURF_VARS) THEN
285   ALLOCATE(XQS     (KLU))
286   !
287   XQS      = XUNDEF
288 ELSE
289   ALLOCATE(XQS     (0))
290 END IF
291 !
292 IF(LCPL_ESM)THEN
293 !        
294   ALLOCATE(XCPL_WATER_WIND(KLU))
295   ALLOCATE(XCPL_WATER_FWSU(KLU))
296   ALLOCATE(XCPL_WATER_FWSV(KLU))
297   ALLOCATE(XCPL_WATER_SNET(KLU))
298   ALLOCATE(XCPL_WATER_HEAT(KLU))
299   ALLOCATE(XCPL_WATER_EVAP(KLU))
300   ALLOCATE(XCPL_WATER_RAIN(KLU))
301   ALLOCATE(XCPL_WATER_SNOW(KLU))
302   ALLOCATE(XCPL_WATER_FWSM(KLU))
303   XCPL_WATER_WIND(:) = 0.0
304   XCPL_WATER_FWSU(:) = 0.0
305   XCPL_WATER_FWSV(:) = 0.0
306   XCPL_WATER_SNET(:) = 0.0
307   XCPL_WATER_HEAT(:) = 0.0
308   XCPL_WATER_EVAP(:) = 0.0
309   XCPL_WATER_RAIN(:) = 0.0
310   XCPL_WATER_SNOW(:) = 0.0        
311   XCPL_WATER_FWSM(:) = 0.0
312 !
313   ALLOCATE(XCPL_WATERICE_SNET(KLU))
314   ALLOCATE(XCPL_WATERICE_HEAT(KLU))
315   ALLOCATE(XCPL_WATERICE_EVAP(KLU))
316   XCPL_WATERICE_SNET(:) = 0.0
317   XCPL_WATERICE_HEAT(:) = 0.0
318   XCPL_WATERICE_EVAP(:) = 0.0
319 !
320 ELSE
321   ALLOCATE(XCPL_WATER_WIND(0))
322   ALLOCATE(XCPL_WATER_FWSU(0))
323   ALLOCATE(XCPL_WATER_FWSV(0))
324   ALLOCATE(XCPL_WATER_SNET(0))
325   ALLOCATE(XCPL_WATER_HEAT(0))
326   ALLOCATE(XCPL_WATER_EVAP(0))
327   ALLOCATE(XCPL_WATER_RAIN(0))
328   ALLOCATE(XCPL_WATER_SNOW(0))
329   ALLOCATE(XCPL_WATER_FWSM(0))
330   ALLOCATE(XCPL_WATERICE_SNET(0))
331   ALLOCATE(XCPL_WATERICE_HEAT(0))
332   ALLOCATE(XCPL_WATERICE_EVAP(0))
333 ENDIF
334 IF (LHOOK) CALL DR_HOOK('DIAG_WATFLUX_INIT_N',1,ZHOOK_HANDLE)
335 !
336 !-------------------------------------------------------------------------------
337 !
338 END SUBROUTINE DIAG_WATFLUX_INIT_n