942c399b54ab32692122a14f1b608eb2d328589a
[MNH-git_open_source-lfs.git] / src / SURFEX / diag_seaflux_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_SEAFLUX_INIT_n(HPROGRAM,KLU,KSW)
7 !     #####################
8 !
9 !!****  *DIAG_SEAFLUX_INIT_n* - routine to initialize SEAFLUX 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 !!      Modified    01/2006 : sea flux parameterization.
36 !!      Modified    08/2009 : cumulative sea flux 
37 !-------------------------------------------------------------------------------
38 !
39 !*       0.    DECLARATIONS
40 !              ------------
41 !
42 USE MODD_SURF_PAR,       ONLY : XUNDEF
43 USE MODD_SURF_ATM,       ONLY : LCPL_ESM
44 USE MODD_DIAG_SURF_ATM_n,ONLY : LREAD_BUDGETC
45 USE MODD_DIAG_SEAFLUX_n, ONLY : N2M, LSURF_BUDGET, LCOEF, LSURF_VARS,     &
46                                   LSURF_BUDGETC, LRESET_BUDGETC,            &
47                                   XRN, XH, XLE, XLEI, XGFLUX,               &
48                                   XRI, XCD, XCH, XCE, XZ0, XZ0H, XT2M,      &
49                                   XQ2M, XHU2M, XZON10M, XMER10M, XQS, XSWD, &
50                                   XSWU, XLWD, XLWU, XT2M_MIN, XT2M_MAX,     &
51                                   XSWBD, XSWBU, XFMU, XFMV, XDIAG_SST,      &
52                                   XRNC, XHC, XLEC, XLEIC, XGFLUXC,          &
53                                   XSWDC, XSWUC, XLWDC, XLWUC, XFMUC, XFMVC, &
54                                   XHU2M_MIN, XHU2M_MAX, XWIND10M, XWIND10M_MAX  
55 !                                
56 USE MODD_DIAG_OCEAN_n,   ONLY : LDIAG_OCEAN, XTOCMOY, XSOCMOY, XUOCMOY,   &
57                                   XVOCMOY, XDOCMOY  
58 !
59 USE MODD_SEAFLUX_n,      ONLY : XCPL_SEA_WIND,                 &
60                                   XCPL_SEA_EVAP,XCPL_SEA_HEAT,   &
61                                   XCPL_SEA_SNET,XCPL_SEA_FWSU,   &
62                                   XCPL_SEA_FWSV,XCPL_SEA_RAIN,   &
63                                   XCPL_SEA_SNOW,XCPL_SEA_FWSM,   &
64                                   XCPL_SEAICE_EVAP,              &
65                                   XCPL_SEAICE_HEAT,              &
66                                   XCPL_SEAICE_SNET  
67 !
68 USE MODI_READ_SURF
69 !
70 !
71 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
72 USE PARKIND1  ,ONLY : JPRB
73 !
74 IMPLICIT NONE
75 !
76 !*       0.1   Declarations of arguments
77 !              -------------------------
78 !
79 INTEGER, INTENT(IN) :: KLU   ! size of arrays
80 INTEGER, INTENT(IN) :: KSW   ! number of SW spectral bands
81  CHARACTER(LEN=6), INTENT(IN):: HPROGRAM  ! program calling
82 !
83 !*       0.2   Declarations of local variables
84 !              -------------------------------
85 !
86 INTEGER           :: IRESP          ! IRESP  : return-code if a problem appears
87  CHARACTER(LEN=12) :: YREC           ! Name of the article to be read
88 REAL(KIND=JPRB) :: ZHOOK_HANDLE
89 !
90 !-------------------------------------------------------------------------------
91 !
92 !* surface energy budget
93 !
94 IF (LHOOK) CALL DR_HOOK('DIAG_SEAFLUX_INIT_N',0,ZHOOK_HANDLE)
95 ALLOCATE(XDIAG_SST(KLU))
96 XDIAG_SST = XUNDEF
97 !
98 IF (LSURF_BUDGET.OR.LSURF_BUDGETC) THEN
99   ALLOCATE(XRN     (KLU))
100   ALLOCATE(XH      (KLU))
101   ALLOCATE(XLE     (KLU))
102   ALLOCATE(XLEI    (KLU))
103   ALLOCATE(XGFLUX  (KLU))
104   ALLOCATE(XSWD    (KLU))
105   ALLOCATE(XSWU    (KLU))
106   ALLOCATE(XLWD    (KLU))
107   ALLOCATE(XLWU    (KLU))
108   ALLOCATE(XSWBD   (KLU,KSW))
109   ALLOCATE(XSWBU   (KLU,KSW))
110   ALLOCATE(XFMU    (KLU))
111   ALLOCATE(XFMV    (KLU))
112   !
113   XRN      = XUNDEF
114   XH       = XUNDEF
115   XLE      = XUNDEF
116   XLEI     = XUNDEF
117   XGFLUX   = XUNDEF
118   XSWD     = XUNDEF
119   XSWU     = XUNDEF
120   XLWD     = XUNDEF
121   XLWU     = XUNDEF
122   XSWBD    = XUNDEF
123   XSWBU    = XUNDEF
124   XFMU     = XUNDEF
125   XFMV     = XUNDEF
126   !
127 ELSE
128   ALLOCATE(XRN     (0))
129   ALLOCATE(XH      (0))
130   ALLOCATE(XLE     (0))
131   ALLOCATE(XLEI    (0))
132   ALLOCATE(XGFLUX  (0))
133   ALLOCATE(XSWD    (0))
134   ALLOCATE(XSWU    (0))
135   ALLOCATE(XLWD    (0))
136   ALLOCATE(XLWU    (0))
137   ALLOCATE(XSWBD   (0,0))
138   ALLOCATE(XSWBU   (0,0))
139   ALLOCATE(XFMU    (0))
140   ALLOCATE(XFMV    (0))
141 ENDIF
142 !
143 !* cumulative surface energy budget
144 !
145 IF (LSURF_BUDGETC) THEN
146 !        
147   ALLOCATE(XRNC    (KLU))
148   ALLOCATE(XHC     (KLU))
149   ALLOCATE(XLEC    (KLU))
150   ALLOCATE(XLEIC   (KLU))
151   ALLOCATE(XGFLUXC (KLU))
152   ALLOCATE(XSWDC   (KLU))
153   ALLOCATE(XSWUC   (KLU))
154   ALLOCATE(XLWDC   (KLU))
155   ALLOCATE(XLWUC   (KLU))
156   ALLOCATE(XFMUC   (KLU))
157   ALLOCATE(XFMVC   (KLU))
158 !
159   IF (.NOT. LREAD_BUDGETC) THEN        
160      XRNC    = 0.0
161      XHC     = 0.0
162      XLEC    = 0.0
163      XLEIC   = 0.0
164      XGFLUXC = 0.0
165      XSWDC   = 0.0
166      XSWUC   = 0.0
167      XLWDC   = 0.0
168      XLWUC   = 0.0
169      XFMUC   = 0.0
170      XFMVC   = 0.0
171   ELSEIF (LREAD_BUDGETC.AND.LRESET_BUDGETC) THEN
172      XRNC    = 0.0
173      XHC     = 0.0
174      XLEC    = 0.0
175      XLEIC   = 0.0
176      XGFLUXC = 0.0
177      XSWDC   = 0.0
178      XSWUC   = 0.0
179      XLWDC   = 0.0
180      XLWUC   = 0.0
181      XFMUC   = 0.0
182      XFMVC   = 0.0
183   ELSE
184      YREC='RNC_SEA'
185      CALL READ_SURF(HPROGRAM,YREC,XRNC,IRESP)
186      YREC='HC_SEA'
187      CALL READ_SURF(HPROGRAM,YREC,XHC ,IRESP)
188      YREC='LEC_SEA'
189      CALL READ_SURF(HPROGRAM,YREC,XLEC,IRESP)
190      YREC='LEIC_SEA'
191      CALL READ_SURF(HPROGRAM,YREC,XLEIC,IRESP)     
192      YREC='GFLUXC_SEA'
193      CALL READ_SURF(HPROGRAM,YREC,XGFLUXC ,IRESP)
194      YREC='SWDC_SEA'
195      CALL READ_SURF(HPROGRAM,YREC,XSWDC,IRESP)
196      YREC='SWUC_SEA'
197      CALL READ_SURF(HPROGRAM,YREC,XSWUC,IRESP)
198      YREC='LWDC_SEA'
199      CALL READ_SURF(HPROGRAM,YREC,XLWDC,IRESP)
200      YREC='LWUC_SEA'
201      CALL READ_SURF(HPROGRAM,YREC,XLWUC,IRESP)
202      YREC='FMUC_SEA'
203      CALL READ_SURF(HPROGRAM,YREC,XFMUC,IRESP)
204      YREC='FMVC_SEA'
205      CALL READ_SURF(HPROGRAM,YREC,XFMVC,IRESP)
206   ENDIF   
207 ELSE
208   ALLOCATE(XRNC    (0))
209   ALLOCATE(XHC     (0))
210   ALLOCATE(XLEC    (0))
211   ALLOCATE(XLEIC   (0))
212   ALLOCATE(XGFLUXC (0))
213   ALLOCATE(XSWDC   (0))
214   ALLOCATE(XSWUC   (0))
215   ALLOCATE(XLWDC   (0))
216   ALLOCATE(XLWUC   (0))
217   ALLOCATE(XFMUC   (0))
218   ALLOCATE(XFMVC   (0))
219 ENDIF
220 !
221 !* parameters at 2m
222 !
223 IF (N2M>=1) THEN
224   ALLOCATE(XRI      (KLU))
225   ALLOCATE(XT2M     (KLU))
226   ALLOCATE(XT2M_MIN (KLU))
227   ALLOCATE(XT2M_MAX (KLU))
228   ALLOCATE(XQ2M     (KLU))
229   ALLOCATE(XHU2M    (KLU))
230   ALLOCATE(XHU2M_MIN(KLU))
231   ALLOCATE(XHU2M_MAX(KLU))
232   ALLOCATE(XZON10M  (KLU))
233   ALLOCATE(XMER10M  (KLU))
234   ALLOCATE(XWIND10M (KLU))
235   ALLOCATE(XWIND10M_MAX(KLU))
236   !
237   XRI      = XUNDEF
238   XT2M     = XUNDEF
239   XT2M_MIN = XUNDEF
240   XT2M_MAX = 0.0
241   XQ2M     = XUNDEF
242   XHU2M    = XUNDEF
243   XHU2M_MIN= XUNDEF
244   XHU2M_MAX=-XUNDEF
245   XZON10M  = XUNDEF
246   XMER10M  = XUNDEF
247   XWIND10M = XUNDEF
248   XWIND10M_MAX = 0.0
249 ELSE
250   ALLOCATE(XRI      (0))
251   ALLOCATE(XT2M     (0))
252   ALLOCATE(XT2M_MIN (0))
253   ALLOCATE(XT2M_MAX (0))
254   ALLOCATE(XQ2M     (0))
255   ALLOCATE(XHU2M    (0))
256   ALLOCATE(XHU2M_MIN(0))
257   ALLOCATE(XHU2M_MAX(0))
258   ALLOCATE(XZON10M  (0))
259   ALLOCATE(XMER10M  (0))
260   ALLOCATE(XWIND10M (0))
261   ALLOCATE(XWIND10M_MAX(0))
262 END IF
263 !
264 !* transfer coefficients
265 !
266 IF (LCOEF) THEN
267   ALLOCATE(XCD     (KLU))
268   ALLOCATE(XCH     (KLU))
269   ALLOCATE(XCE     (KLU))
270   ALLOCATE(XZ0     (KLU))
271   ALLOCATE(XZ0H    (KLU))
272   !
273   XCD      = XUNDEF
274   XCH      = XUNDEF
275   XCE      = XUNDEF
276   XZ0      = XUNDEF
277   XZ0H     = XUNDEF
278 ELSE
279   ALLOCATE(XCD     (0))
280   ALLOCATE(XCH     (0))
281   ALLOCATE(XCE     (0))
282   ALLOCATE(XZ0     (0))
283   ALLOCATE(XZ0H    (0))
284 END IF
285 !
286 !
287 !* surface humidity
288 !
289 IF (LSURF_VARS) THEN
290   ALLOCATE(XQS     (KLU))
291   !
292   XQS      = XUNDEF
293 ELSE
294   ALLOCATE(XQS     (0))
295 END IF
296 !
297 !* ocean diag
298 !
299 IF (LDIAG_OCEAN) THEN
300   ALLOCATE(XTOCMOY  (KLU))
301   ALLOCATE(XSOCMOY  (KLU))
302   ALLOCATE(XUOCMOY  (KLU))
303   ALLOCATE(XVOCMOY  (KLU))
304   ALLOCATE(XDOCMOY  (KLU))
305   !
306   XTOCMOY(:)=XUNDEF
307   XSOCMOY(:)=XUNDEF
308   XUOCMOY(:)=XUNDEF
309   XVOCMOY(:)=XUNDEF
310   XDOCMOY(:)=XUNDEF
311 ELSE
312   ALLOCATE(XTOCMOY  (0))
313   ALLOCATE(XSOCMOY  (0))
314   ALLOCATE(XUOCMOY  (0))
315   ALLOCATE(XVOCMOY  (0))
316   ALLOCATE(XDOCMOY  (0))
317 ENDIF
318 !
319 !* Earth system model coupling variables
320 !
321 IF(LCPL_ESM)THEN
322 !        
323   ALLOCATE(XCPL_SEA_WIND(KLU))
324   ALLOCATE(XCPL_SEA_FWSU(KLU))
325   ALLOCATE(XCPL_SEA_FWSV(KLU))
326   ALLOCATE(XCPL_SEA_SNET(KLU))
327   ALLOCATE(XCPL_SEA_HEAT(KLU))
328   ALLOCATE(XCPL_SEA_EVAP(KLU))
329   ALLOCATE(XCPL_SEA_RAIN(KLU))
330   ALLOCATE(XCPL_SEA_SNOW(KLU))
331   ALLOCATE(XCPL_SEA_FWSM(KLU))
332   XCPL_SEA_WIND(:) = 0.0
333   XCPL_SEA_FWSU(:) = 0.0
334   XCPL_SEA_FWSV(:) = 0.0
335   XCPL_SEA_SNET(:) = 0.0
336   XCPL_SEA_HEAT(:) = 0.0
337   XCPL_SEA_EVAP(:) = 0.0
338   XCPL_SEA_RAIN(:) = 0.0
339   XCPL_SEA_SNOW(:) = 0.0
340   XCPL_SEA_FWSM(:) = 0.0
341 !  
342   ALLOCATE(XCPL_SEAICE_SNET(KLU))
343   ALLOCATE(XCPL_SEAICE_HEAT(KLU))
344   ALLOCATE(XCPL_SEAICE_EVAP(KLU))
345   XCPL_SEAICE_SNET(:) = 0.0
346   XCPL_SEAICE_HEAT(:) = 0.0
347   XCPL_SEAICE_EVAP(:) = 0.0
348 !
349 ELSE
350   ALLOCATE(XCPL_SEA_WIND(0))
351   ALLOCATE(XCPL_SEA_FWSU(0))
352   ALLOCATE(XCPL_SEA_FWSV(0))
353   ALLOCATE(XCPL_SEA_SNET(0))
354   ALLOCATE(XCPL_SEA_HEAT(0))
355   ALLOCATE(XCPL_SEA_EVAP(0))
356   ALLOCATE(XCPL_SEA_RAIN(0))
357   ALLOCATE(XCPL_SEA_SNOW(0))
358   ALLOCATE(XCPL_SEA_FWSM(0))
359 !
360   ALLOCATE(XCPL_SEAICE_SNET(0))
361   ALLOCATE(XCPL_SEAICE_HEAT(0))
362   ALLOCATE(XCPL_SEAICE_EVAP(0))
363 ENDIF
364 IF (LHOOK) CALL DR_HOOK('DIAG_SEAFLUX_INIT_N',1,ZHOOK_HANDLE)
365 !
366 !-------------------------------------------------------------------------------
367 !
368 END SUBROUTINE DIAG_SEAFLUX_INIT_n