SURFEX v8.1
General documentation of Surfex
ini_var_from_patch.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  SUBROUTINE ini_var_from_patch (DTCO, UG, U, NP, NPE, KPATCH,&
6  HPROGRAM,KLUOUT,HNAME,KPTS,KLAYER,KLAYER2,PDEF)
7 !!
8 !! PURPOSE
9 !! -------
10 !!
11 !! (1) KPTS=n interpol field with n pts
12 !! (2) KPTS=0 conserve cells mass
13 !! Case 2 : simple extrapolation based on the inside cell informations.
14 !! this is donne before conserving cell or global mass
15 !!
16 !! METHOD
17 !! ------
18 !!
19 !! EXTERNAL
20 !! --------
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !! AUTHOR
29 !! ------
30 !!
31 !! R. Alkama Meteo-France
32 !!
33 !! MODIFICATION
34 !! ------------
35 !! Original 12/2010
36 !!
37 !----------------------------------------------------------------------------
38 !!* 0. DECLARATION
39 ! -----------
40 !
43 USE modd_surf_atm_n, ONLY : surf_atm_t
44 !
46 !
47 USE modd_surf_par, ONLY : xundef
48 !
49 USE modi_get_surf_mask_n
50 USE modi_interpol_field
53 !
54 USE yomhook ,ONLY : lhook, dr_hook
55 USE parkind1 ,ONLY : jprb
56 !
57 IMPLICIT NONE
58 !
59 !* 0.1 Declaration of arguments
60 ! ------------------------
61 !
62 !
63 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
64 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
65 TYPE(surf_atm_t), INTENT(INOUT) :: U
66 !
67 TYPE(isba_np_t), INTENT(INOUT) :: NP
68 TYPE(isba_npe_t), INTENT(INOUT) :: NPE
69 !
70 INTEGER, INTENT(IN) :: KPATCH
71 !
72  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! host model
73 INTEGER, INTENT(IN) :: KLUOUT
74 INTEGER, INTENT(IN) :: KPTS
75  CHARACTER(LEN=*), INTENT(IN) :: HNAME
76 !
77 INTEGER, INTENT(IN), OPTIONAL :: KLAYER
78 INTEGER, INTENT(IN), OPTIONAL :: KLAYER2
79 !
80 REAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: PDEF
81 !
82 !* 0.2 Declaration of local variables
83 ! ------------------------------
84 !
85 TYPE(isba_p_t), POINTER :: PK
86 TYPE(isba_pe_t), POINTER :: PEK
87 LOGICAL, DIMENSION(U%NSIZE_NATURE,KPATCH) :: GVEG
88 REAL, DIMENSION(U%NSIZE_NATURE) :: ZFIELD1_TOT, ZFIELD2_TOT
89 INTEGER, DIMENSION(U%NSIZE_NATURE) :: IMASK ! mask for packing from complete field to nature field
90 INTEGER, DIMENSION(U%NSIZE_NATURE) :: NSIZE
91 INTEGER, DIMENSION(U%NSIZE_NATURE) :: NSIZE_NAT
92 INTEGER, DIMENSION(U%NSIZE_FULL) :: NSIZE_TOT
93 REAL, DIMENSION(U%NSIZE_FULL) :: ZFIELD_TOT
94 REAL, DIMENSION(U%NSIZE_NATURE) :: ZFIELD_NAT
95 REAL, DIMENSION(U%NSIZE_NATURE,KPATCH) :: ZFIELD
96 INTEGER :: INI, IPATCH, IFULL, INPTS, JI
97 INTEGER :: JP, IMASK0 ! loop counter on patch
98 REAL :: ZRATIO_TOT
99 !
100 REAL(KIND=JPRB) :: ZHOOK_HANDLE
101 !
102 !-------------------------------------------------------------------------------
103 ! (1) & (2) INTERPOL FILED
104 !-------------------------
105 !
106 IF (lhook) CALL dr_hook('INI_VAR_FROM_PATCH',0,zhook_handle)
107 !
108 ini=u%NSIZE_NATURE
109 !
110 IF (trim(hname)=='WR') THEN
111  DO jp = 1,kpatch
112  zfield(:,jp) = npe%AL(jp)%XWR(:)
113  ENDDO
114 ELSEIF (trim(hname)=='ICE_STO') THEN
115  DO jp = 1,kpatch
116  zfield(:,jp) = npe%AL(jp)%XICE_STO(:)
117  ENDDO
118 ELSEIF (trim(hname)=='TEMP GRO') THEN
119  DO jp = 1,kpatch
120  zfield(:,jp) = npe%AL(jp)%XTG(:,klayer)
121  ENDDO
122 ELSEIF (trim(hname)=='ALBSNOW') THEN
123  DO jp = 1,kpatch
124  zfield(:,jp) = npe%AL(jp)%TSNOW%ALB(:)
125  ENDDO
126 ELSEIF (trim(hname)=='EMISSNOW') THEN
127  DO jp = 1,kpatch
128  zfield(:,jp) = npe%AL(jp)%TSNOW%EMIS(:)
129  ENDDO
130 ELSEIF (trim(hname)=='TSSNOW') THEN
131  DO jp = 1,kpatch
132  zfield(:,jp) = npe%AL(jp)%TSNOW%TS(:)
133  ENDDO
134 ELSEIF (trim(hname)=='WSNOW') THEN
135  DO jp = 1,kpatch
136  zfield(:,jp) = npe%AL(jp)%TSNOW%WSNOW(:,klayer)
137  ENDDO
138 ELSEIF (trim(hname)=='TEMPSNOW') THEN
139  DO jp = 1,kpatch
140  zfield(:,jp) = npe%AL(jp)%TSNOW%TEMP(:,klayer)
141  ENDDO
142 ELSEIF (trim(hname)=='HEATSNOW') THEN
143  DO jp = 1,kpatch
144  zfield(:,jp) = npe%AL(jp)%TSNOW%HEAT(:,klayer)
145  ENDDO
146 ELSEIF (trim(hname)=='AGESNOW') THEN
147  DO jp = 1,kpatch
148  zfield(:,jp) = npe%AL(jp)%TSNOW%AGE(:,klayer)
149  ENDDO
150 ELSEIF (trim(hname)=='TSNOW') THEN
151  DO jp = 1,kpatch
152  zfield(:,jp) = npe%AL(jp)%TSNOW%T(:,klayer)
153  ENDDO
154 ELSEIF (trim(hname)=='GR1SNOW') THEN
155  DO jp = 1,kpatch
156  zfield(:,jp) = npe%AL(jp)%TSNOW%GRAN1(:,klayer)
157  ENDDO
158 ELSEIF (trim(hname)=='GR2SNOW') THEN
159  DO jp = 1,kpatch
160  zfield(:,jp) = npe%AL(jp)%TSNOW%GRAN2(:,klayer)
161  ENDDO
162 ELSEIF (trim(hname)=='HISTSNOW') THEN
163  DO jp = 1,kpatch
164  zfield(:,jp) = npe%AL(jp)%TSNOW%HIST(:,klayer)
165  ENDDO
166 ELSEIF (trim(hname)=='WG') THEN
167  DO jp = 1,kpatch
168  zfield(:,jp) = npe%AL(jp)%XWG(:,klayer)
169  ENDDO
170 ELSEIF (trim(hname)=='WGI') THEN
171  DO jp = 1,kpatch
172  zfield(:,jp) = npe%AL(jp)%XWGI(:,klayer)
173  ENDDO
174 ELSEIF (trim(hname)=='RESA') THEN
175  DO jp = 1,kpatch
176  zfield(:,jp) = npe%AL(jp)%XRESA(:)
177  ENDDO
178 ELSEIF (trim(hname)=='RHOSNOW') THEN
179  DO jp = 1,kpatch
180  zfield(:,jp) = npe%AL(jp)%TSNOW%RHO(:,klayer)
181  ENDDO
182 ELSEIF (trim(hname)=='AN') THEN
183  DO jp = 1,kpatch
184  zfield(:,jp) = npe%AL(jp)%XAN(:)
185  ENDDO
186 ELSEIF (trim(hname)=='ANDAY') THEN
187  DO jp = 1,kpatch
188  zfield(:,jp) = npe%AL(jp)%XANDAY(:)
189  ENDDO
190 ELSEIF (trim(hname)=='ANFM') THEN
191  DO jp = 1,kpatch
192  zfield(:,jp) = npe%AL(jp)%XANFM(:)
193  ENDDO
194 ELSEIF (trim(hname)=='LE') THEN
195  DO jp = 1,kpatch
196  zfield(:,jp) = npe%AL(jp)%XLE(:)
197  ENDDO
198 ELSEIF (trim(hname)=='RESPBIOM') THEN
199  DO jp = 1,kpatch
200  zfield(:,jp) = npe%AL(jp)%XRESP_BIOMASS(:,klayer)
201  ENDDO
202 ELSEIF (trim(hname)=='BIOMASS') THEN
203  DO jp = 1,kpatch
204  zfield(:,jp) = npe%AL(jp)%XBIOMASS(:,klayer)
205  ENDDO
206 ELSEIF (trim(hname)=='LIGNINST') THEN
207  DO jp = 1,kpatch
208  zfield(:,jp) = npe%AL(jp)%XLIGNIN_STRUC(:,klayer)
209  ENDDO
210 ELSEIF (trim(hname)=='LITTER') THEN
211  DO jp = 1,kpatch
212  zfield(:,jp) = npe%AL(jp)%XLITTER(:,klayer,klayer2)
213  ENDDO
214 ELSEIF (trim(hname)=='SOILCARB') THEN
215  DO jp = 1,kpatch
216  zfield(:,jp) = npe%AL(jp)%XSOILCARB(:,klayer)
217  ENDDO
218 ENDIF
219 
220 IF (kpts>0)THEN
221  !
222  CALL get_surf_mask_n(dtco, u, 'NATURE',ini,imask,u%NSIZE_FULL,kluout)
223  !
224  DO jp=1,kpatch
225  !
226  nsize(:)=0
227  WHERE (zfield(:,jp).NE.xundef) nsize(:)=1
228  WHERE (np%AL(jp)%XPATCH(:)==0.) nsize(:)=-1
229  !
230  CALL unpack_same_rank(np%AL(jp)%NR_P,nsize,nsize_nat,-1)
231  CALL unpack_same_rank(imask,nsize_nat,nsize_tot,-1)
232  !
233  CALL unpack_same_rank(np%AL(jp)%NR_P,zfield(:,jp),zfield_nat)
234  CALL unpack_same_rank(imask,zfield_nat,zfield_tot)
235  !
236  IF(PRESENT(pdef))THEN
237  CALL interpol_field(ug, u, &
238  hprogram,kluout,nsize_tot,zfield_tot,hname,pdef=pdef(jp),knpts=kpts)
239  ELSE
240  CALL interpol_field(ug, u, hprogram,kluout,nsize_tot,zfield_tot,hname,knpts=kpts)
241  ENDIF
242  !
243  CALL pack_same_rank(imask,zfield_tot,zfield_nat)
244  CALL pack_same_rank(np%AL(jp)%NR_P,zfield_nat,zfield(:,jp))
245  !
246  ENDDO
247  !
248 ELSE
249 !
250 !-------------------------------------------------------------------------------
251 ! (3) Cell mass conservative + simple interpolation based on global cell
252 ! informations
253 !----------------------------
254 !
255  !
256  zfield1_tot(:)=0.
257  zfield2_tot(:)=0.
258  !
259  gveg(:,:)=.true.
260  !
261  IF (trim(hname)=='WR')THEN
262  !no interception over soil(1), roc(2) and glaciers(3)
263  DO jp=1,kpatch
264  pk => np%AL(jp)
265  pek => npe%AL(jp)
266 
267  WHERE(pk%XPATCH(:) /=0. .AND. pk%XPATCH_OLD(:) ==0..AND.pek%XLAI(:)==0.)
268  zfield(:,jp) = 0.
269  gveg(:,jp) = .false.
270  ENDWHERE
271  END DO
272  END IF
273  !
274  !quantity of water before restart in each grid point
275  zfield1_tot(:) = 0.0
276  DO jp = 1,kpatch
277  pk => np%AL(jp)
278  DO ji = 1,pk%NSIZE_P
279  imask0 = pk%NR_P(ji)
280  zfield1_tot(imask0)=zfield1_tot(imask0)+ pk%XPATCH_OLD(ji) * zfield(ji,jp)
281  ENDDO
282  END DO
283  !
284  zfield2_tot(:) = 0.0
285  DO jp=1,kpatch
286  pk => np%AL(jp)
287  DO ji = 1,pk%NSIZE_P
288  imask0 = pk%NR_P(ji)
289  !if a patch appears in a grid point, it takes the quantity of water in the
290  !whole grid point before
291  IF(pk%XPATCH(ji) /=0. .AND. pk%XPATCH_OLD(ji)==0. .AND. gveg(ji,jp)) THEN
292  zfield(ji,jp)=zfield1_tot(imask0)
293  ENDIF
294  !quantity of water after restart and landuse in each grid point
295  zfield2_tot(imask0)=zfield2_tot(imask0)+ pk%XPATCH(ji)*zfield(ji,jp)
296  ENDDO
297  END DO
298  !
299  ! Conserve cell mass if not WG and WGI
300  ! If WG or WGI conserve global mass via CONSERV_GLOBAL_MASS routine
301  ! is recomanded
302  !
303  IF (trim(hname)/='WG' .AND. trim(hname)/='WGI') THEN
304  DO jp=1,kpatch
305  pk => np%AL(jp)
306  DO ji = 1,pk%NSIZE_P
307  imask0 = pk%NR_P(ji)
308  IF (zfield2_tot(imask0) > 1.e-12) THEN
309  zfield(ji,jp)=(zfield1_tot(imask0)/zfield2_tot(imask0))*zfield(ji,jp)
310  ENDIF
311  END DO
312  END DO
313  ENDIF
314  !
315  DO jp = 1,kpatch
316  WHERE(np%AL(jp)%XPATCH(:) ==0.)zfield(:,jp)=xundef
317  ENDDO
318  !
319 ENDIF
320 !
321 IF (trim(hname)=='WR') THEN
322  DO jp = 1,kpatch
323  npe%AL(jp)%XWR(:) = zfield(:,jp)
324  ENDDO
325 ELSEIF (trim(hname)=='ICE_STO') THEN
326  DO jp = 1,kpatch
327  npe%AL(jp)%XICE_STO(:) = zfield(:,jp)
328  ENDDO
329 ELSEIF (trim(hname)=='TEMP GRO') THEN
330  DO jp = 1,kpatch
331  npe%AL(jp)%XTG(:,klayer) = zfield(:,jp)
332  ENDDO
333 ELSEIF (trim(hname)=='ALBSNOW') THEN
334  DO jp = 1,kpatch
335  npe%AL(jp)%TSNOW%ALB(:) = zfield(:,jp)
336  ENDDO
337 ELSEIF (trim(hname)=='EMISSNOW') THEN
338  DO jp = 1,kpatch
339  npe%AL(jp)%TSNOW%EMIS(:) = zfield(:,jp)
340  ENDDO
341 ELSEIF (trim(hname)=='TSSNOW') THEN
342  DO jp = 1,kpatch
343  npe%AL(jp)%TSNOW%TS(:) = zfield(:,jp)
344  ENDDO
345 ELSEIF (trim(hname)=='WSNOW') THEN
346  DO jp = 1,kpatch
347  npe%AL(jp)%TSNOW%WSNOW(:,klayer) = zfield(:,jp)
348  ENDDO
349 ELSEIF (trim(hname)=='TEMPSNOW') THEN
350  DO jp = 1,kpatch
351  npe%AL(jp)%TSNOW%TEMP(:,klayer) = zfield(:,jp)
352  ENDDO
353 ELSEIF (trim(hname)=='HEATSNOW') THEN
354  DO jp = 1,kpatch
355  npe%AL(jp)%TSNOW%HEAT(:,klayer) = zfield(:,jp)
356  ENDDO
357 ELSEIF (trim(hname)=='AGESNOW') THEN
358  DO jp = 1,kpatch
359  npe%AL(jp)%TSNOW%AGE(:,klayer) = zfield(:,jp)
360  ENDDO
361 ELSEIF (trim(hname)=='TSNOW') THEN
362  DO jp = 1,kpatch
363  npe%AL(jp)%TSNOW%T(:,klayer) = zfield(:,jp)
364  ENDDO
365 ELSEIF (trim(hname)=='GR1SNOW') THEN
366  DO jp = 1,kpatch
367  npe%AL(jp)%TSNOW%GRAN1(:,klayer) = zfield(:,jp)
368  ENDDO
369 ELSEIF (trim(hname)=='GR2SNOW') THEN
370  DO jp = 1,kpatch
371  npe%AL(jp)%TSNOW%GRAN2(:,klayer) = zfield(:,jp)
372  ENDDO
373 ELSEIF (trim(hname)=='HISTSNOW') THEN
374  DO jp = 1,kpatch
375  npe%AL(jp)%TSNOW%HIST(:,klayer) = zfield(:,jp)
376  ENDDO
377 ELSEIF (trim(hname)=='WG') THEN
378  DO jp = 1,kpatch
379  npe%AL(jp)%XWG(:,klayer) = zfield(:,jp)
380  ENDDO
381 ELSEIF (trim(hname)=='WGI') THEN
382  DO jp = 1,kpatch
383  npe%AL(jp)%XWGI(:,klayer) = zfield(:,jp)
384  ENDDO
385 ELSEIF (trim(hname)=='RESA') THEN
386  DO jp = 1,kpatch
387  npe%AL(jp)%XRESA(:) = zfield(:,jp)
388  ENDDO
389 ELSEIF (trim(hname)=='RHOSNOW') THEN
390  DO jp = 1,kpatch
391  npe%AL(jp)%TSNOW%RHO(:,klayer) = zfield(:,jp)
392  ENDDO
393 ELSEIF (trim(hname)=='AN') THEN
394  DO jp = 1,kpatch
395  npe%AL(jp)%XAN(:) = zfield(:,jp)
396  ENDDO
397 ELSEIF (trim(hname)=='ANDAY') THEN
398  DO jp = 1,kpatch
399  npe%AL(jp)%XANDAY(:) = zfield(:,jp)
400  ENDDO
401 ELSEIF (trim(hname)=='ANFM') THEN
402  DO jp = 1,kpatch
403  npe%AL(jp)%XANFM(:) = zfield(:,jp)
404  ENDDO
405 ELSEIF (trim(hname)=='LE') THEN
406  DO jp = 1,kpatch
407  npe%AL(jp)%XLE(:) = zfield(:,jp)
408  ENDDO
409 ELSEIF (trim(hname)=='RESPBIOM') THEN
410  DO jp = 1,kpatch
411  npe%AL(jp)%XRESP_BIOMASS(:,klayer) = zfield(:,jp)
412  ENDDO
413 ELSEIF (trim(hname)=='BIOMASS') THEN
414  DO jp = 1,kpatch
415  npe%AL(jp)%XBIOMASS(:,klayer) = zfield(:,jp)
416  ENDDO
417 ELSEIF (trim(hname)=='LIGNINST') THEN
418  DO jp = 1,kpatch
419  npe%AL(jp)%XLIGNIN_STRUC(:,klayer) = zfield(:,jp)
420  ENDDO
421 ELSEIF (trim(hname)=='LITTER') THEN
422  DO jp = 1,kpatch
423  npe%AL(jp)%XLITTER(:,klayer,klayer2) = zfield(:,jp)
424  ENDDO
425 ELSEIF (trim(hname)=='SOILCARB') THEN
426  DO jp = 1,kpatch
427  npe%AL(jp)%XSOILCARB(:,klayer) = zfield(:,jp)
428  ENDDO
429 ENDIF
430 !-------------------------------------------------------------------------------
431 !
432 IF (lhook) CALL dr_hook('INI_VAR_FROM_PATCH',1,zhook_handle)
433 !
434 !-------------------------------------------------------------------------------
435 !
436 END SUBROUTINE ini_var_from_patch
real, parameter xundef
subroutine get_surf_mask_n(DTCO, U, HTYPE, KDIM, KMASK, KLU, KLUOUT)
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine ini_var_from_patch(DTCO, UG, U, NP, NPE, KPATCH, HPROGRAM, KLUOUT, HNAME, KPTS, KLAYER, KLAYER2, PDE
subroutine interpol_field(UG, U, HPROGRAM, KLUOUT, KCODE, PFIELD, HFIELD, PDE