SURFEX v8.1
General documentation of Surfex
av_pgd_param.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 av_pgd_param (PLAI_IN, PVEG_IN, &
7  PFIELD,PVEGTYPE,PDATA,HSFTYPE,HATYPE,KMASK,KNPATCH,KPATCH,PDZ,KDECADE)
8 ! ################################################################
9 !
10 !!**** *AV_PATCH_PGD* average for each surface patch a secondary physiographic
11 !! variable from the
12 !! fractions of coverage class.
13 !!
14 !! PURPOSE
15 !! -------
16 !!
17 !! METHOD
18 !! ------
19 !!
20 !! The averaging is performed with one way into three:
21 !!
22 !! - arithmetic averaging (HATYPE='ARI')
23 !!
24 !! - inverse averaging (HATYPE='INV')
25 !!
26 !! - inverse of square logarithm averaging (HATYPE='CDN') :
27 !!
28 !! 1 / ( ln (dz/data) )**2
29 !!
30 !! This latest uses (if available) the height of the first model mass
31 !! level. In the other case, 20m is chosen. It works for roughness lengths.
32 !!
33 !! EXTERNAL
34 !! --------
35 !!
36 !! IMPLICIT ARGUMENTS
37 !! ------------------
38 !!
39 !! REFERENCE
40 !! ---------
41 !!
42 !! AUTHOR
43 !! ------
44 !!
45 !! F.Solmon /V. Masson
46 !!
47 !! MODIFICATION
48 !! ------------
49 !!
50 !! Original 15/12/97
51 !! V. Masson 01/2004 Externalization
52 !! R. Alkama 04/2012 add 6 new tree vegtype (9 instead 3)
53 !
54 !----------------------------------------------------------------------------
55 !
56 !* 0. DECLARATION
57 ! -----------
58 !
59 USE modd_surf_par, ONLY : xundef, nundef
60 USE modd_data_cover_par, ONLY : nvt_tebd, nvt_bone, nvt_trbe, nvt_trbd, nvt_tebe, &
61  nvt_tene, nvt_bobd, nvt_bond, nvt_shrb, nvegtype, &
62  xcdref
63 !
64 USE modi_vegtype_to_patch
65 !
66 USE yomhook ,ONLY : lhook, dr_hook
67 USE parkind1 ,ONLY : jprb
68 !
69 USE modi_abor1_sfx
70 !
71 IMPLICIT NONE
72 !
73 !* 0.1 Declaration of arguments
74 ! ------------------------
75 !
76 !
77 REAL, DIMENSION(:,:,:), INTENT(IN) :: PLAI_IN
78 REAL, DIMENSION(:,:,:), INTENT(IN) :: PVEG_IN
79 !
80 REAL, DIMENSION(:), INTENT(OUT) :: PFIELD ! secondary field to construct
81 REAL, DIMENSION(:,:), INTENT(IN) :: PVEGTYPE ! fraction of each cover class
82 REAL, DIMENSION(:,:), INTENT(IN) :: PDATA ! secondary field value for each class
83  CHARACTER(LEN=3), INTENT(IN) :: HSFTYPE ! Type of surface where the field
84  ! is defined
85  CHARACTER(LEN=3), INTENT(IN) :: HATYPE ! Type of averaging
86 INTEGER, DIMENSION(:), INTENT(IN) :: KMASK
87 INTEGER, INTENT(IN) :: KNPATCH
88 INTEGER, INTENT(IN) :: KPATCH
89 REAL, DIMENSION(:), INTENT(IN), OPTIONAL :: PDZ ! first model half level
90 INTEGER, INTENT(IN), OPTIONAL :: KDECADE ! current month
91 !
92 !* 0.2 Declaration of local variables
93 ! ------------------------------
94 !
95 !
96 INTEGER :: ICOVER ! number of cover classes
97 INTEGER :: JCOVER ! loop on cover classes
98 !
99 ! nbe of vegtype
100 ! nbre of patches
101 INTEGER :: JV! loop on vegtype
102 INTEGER :: JJ, JI, JP, IMASK
103 !
104 REAL, DIMENSION(SIZE(PFIELD,1),NVEGTYPE) :: ZWEIGHT
105 !
106 REAL, DIMENSION(SIZE(PFIELD,1)) :: ZSUM_WEIGHT_PATCH
107 !
108 REAL, DIMENSION(SIZE(PFIELD,1)) :: ZWORK
109 REAL, DIMENSION(SIZE(PFIELD,1)) :: ZDZ
110 !
111 REAL, DIMENSION(31) :: ZCOUNT
112 INTEGER, DIMENSION(SIZE(PFIELD,1)) :: NMASK
113 INTEGER :: PATCH_LIST(nvegtype)
114 REAL(KIND=JPRB) :: ZHOOK_HANDLE
115 
116 !-------------------------------------------------------------------------------
117 !
118 !* 1.1 field does not exist
119 ! --------------------
120 !
121 IF (lhook) CALL dr_hook('AV_PGD_PARAM',0,zhook_handle)
122 IF (SIZE(pfield)==0 .AND. lhook) CALL dr_hook('AV_PGD_PARAM',1,zhook_handle)
123 IF (SIZE(pfield)==0) RETURN
124 !
125 !-------------------------------------------------------------------------------
126 !
127 !* 1.2 Initializations
128 ! ---------------
129 !
130 !
131 IF (PRESENT(pdz)) THEN
132  zdz(:)=pdz(:)
133 ELSE
134  zdz(:)=xcdref
135 END IF
136 !
137 pfield(:)=xundef
138 !
139 zwork(:)=0.
140 zweight(:,:)=0.
141 zsum_weight_patch(:)=0.
142 !
143 DO jv=1,nvegtype
144  patch_list(jv) = vegtype_to_patch(jv, knpatch)
145 ENDDO
146 
147 !-------------------------------------------------------------------------------
148 !-------------------------------------------------------------------------------
149 !
150 !* 2. Selection of the weighting function for vegtype
151 ! -----------------------------------
152 !
153 DO jv=1,nvegtype
154  jp= patch_list(jv)
155  IF (jp/=kpatch) cycle
156  DO ji=1,SIZE(pfield)
157  imask = kmask(ji)
158 
159  IF (hsftype=='NAT'.OR.hsftype=='GRD') THEN
160  zweight(ji,jv) = pvegtype(imask,jv)
161  ELSEIF (hsftype=='VEG'.OR.hsftype=='GRV') THEN
162  zweight(ji,jv) = pvegtype(imask,jv)*pveg_in(imask,kdecade,jv)
163  ELSEIF (hsftype=='BAR'.OR.hsftype=='GRB') THEN
164  zweight(ji,jv)=pvegtype(imask,jv)*(1.-pveg_in(imask,kdecade,jv))
165  ELSEIF (hsftype=='DVG'.OR.hsftype=='GDV') THEN
166  IF (sum(plai_in(ji,:,jv)).GT.0.) zweight(ji,jv) = pvegtype(imask,jv)
167  ELSEIF (hsftype=='LAI'.OR.hsftype=='GRL') THEN
168  IF (jv>=4) zweight(ji,jv)=pvegtype(imask,jv)*plai_in(imask,kdecade,jv)
169  ELSEIF (hsftype=='TRE'.OR.hsftype=='GRT') THEN
170  IF (jv==nvt_tebd.OR.jv==nvt_bone.OR.jv==nvt_trbe.OR.jv==nvt_trbd.OR.&
171  jv==nvt_tebe.OR.jv==nvt_tene.OR.jv==nvt_bobd.OR.jv==nvt_bond.OR.&
172  jv==nvt_shrb) zweight(ji,jv) = pvegtype(ji,jv)
173  ELSE
174  CALL abor1_sfx('AV_PGD_PARAM_1D: WEIGHTING FUNCTION FOR VEGTYPE NOT ALLOWED')
175  ENDIF
176 
177  ENDDO
178 ENDDO
179 !
180 !-------------------------------------------------------------------------------
181 !
182 !* 3. Averaging
183 ! ---------
184 !
185 !* 3.1 Work arrays given for each patch
186 ! -----------
187 !
188 !* 3.2 Selection of averaging type
189 ! ---------------------------
190 !
191 SELECT CASE (hatype)
192 !
193 !-------------------------------------------------------------------------------
194 !
195 !* 3.3 Arithmetic averaging
196 ! --------------------
197 !
198  CASE ('ARI')
199 !
200  DO jv=1,nvegtype
201  jp= patch_list(jv)
202  IF (jp/=kpatch) cycle
203  DO jj=1,SIZE(pfield)
204  imask = kmask(jj)
205  zsum_weight_patch(jj) = zsum_weight_patch(jj) + zweight(jj,jv)
206  zwork(jj) = zwork(jj) + pdata(imask,jv) * zweight(jj,jv)
207  ENDDO
208  END DO
209 !
210 !-------------------------------------------------------------------------------
211 !
212 !* 3.4 Inverse averaging
213 ! -----------------
214 !
215  CASE('INV' )
216 !
217  DO jv=1,nvegtype
218  jp=patch_list(jv)
219  IF (jp/=kpatch) cycle
220  DO jj=1,SIZE(pfield)
221  imask = kmask(jj)
222  zsum_weight_patch(jj) = zsum_weight_patch(jj)+zweight(jj,jv)
223  IF (pdata(imask,jv).NE.0.) THEN
224  zwork(jj)= zwork(jj) + 1./ pdata(imask,jv) * zweight(jj,jv)
225  ENDIF
226  ENDDO
227  END DO
228 !
229 !-------------------------------------------------------------------------------!
230 !
231 !* 3.5 Roughness length averaging
232 ! --------------------------
233 
234 !
235  CASE('CDN')
236 !
237  DO jv=1,nvegtype
238  jp=patch_list(jv)
239  IF (jp/=kpatch) cycle
240  DO jj=1,SIZE(pfield)
241  imask = kmask(jj)
242  zsum_weight_patch(jj) = zsum_weight_patch(jj)+ zweight(jj,jv)
243  IF (pdata(jj,jv).NE.0.) THEN
244  zwork(jj)= zwork(jj) + 1./(log(zdz(jj)/ pdata(imask,jv)))**2 &
245  * zweight(jj,jv)
246  ENDIF
247  ENDDO
248  END DO
249 !
250  CASE ('MAJ')
251 !
252  zwork(:) = 0.
253  DO jj=1,SIZE(pfield)
254  zcount(:) = 0.
255  DO jv=1,nvegtype
256  jp= patch_list(jv)
257  IF (jp/=kpatch) cycle
258  imask = kmask(jj)
259  IF (nint(pdata(imask,jv))/=nundef) &
260  zcount(nint(pdata(imask,jv))) = zcount(nint(pdata(imask,jv))) + zweight(jj,jv)
261  ENDDO
262  IF (all(zcount(:)==0.)) THEN
263  zwork(jj) = nundef
264  ELSE
265  zwork(jj) = float(maxloc(zcount,1))
266  ENDIF
267  END DO
268 !
269 !-------------------------------------------------------------------------------
270 !
271  CASE DEFAULT
272  CALL abor1_sfx('AV_PGD_PARAM_1D: (1) AVERAGING TYPE NOT ALLOWED')
273 !
274 END SELECT
275 !
276 !* 4.1 Selection of averaging type
277 ! ---------------------------
278 !
279 SELECT CASE (hatype)
280 !
281 !-------------------------------------------------------------------------------
282 !
283 !* 4.2 Arithmetic averaging
284 ! --------------------
285 !
286  CASE ('ARI')
287 !
288  DO ji=1,SIZE(pfield)
289  IF (zsum_weight_patch(ji)>0.) pfield(ji) = zwork(ji) / zsum_weight_patch(ji)
290  ENDDO
291 !
292 !-------------------------------------------------------------------------------
293 !
294 !* 4.3 Inverse averaging
295 ! -----------------
296 !
297  CASE('INV' )
298 !
299  DO ji=1,SIZE(pfield)
300  IF (zsum_weight_patch(ji)>0.) pfield(ji) = zsum_weight_patch(ji) / zwork(ji)
301  ENDDO
302 !-------------------------------------------------------------------------------!
303 !
304 !* 4.4 Roughness length averaging
305 ! --------------------------
306 
307 !
308  CASE('CDN')
309 !
310  DO ji=1,SIZE(pfield)
311  IF (zsum_weight_patch(ji)>0.) THEN
312  pfield(ji) = zdz(ji) * exp( - sqrt(zsum_weight_patch(ji)/zwork(ji)) )
313  ENDIF
314  ENDDO
315 !
316  CASE ('MAJ')
317 !
318  DO ji=1,SIZE(pfield)
319  pfield(ji) = zwork(ji)
320  ENDDO
321 !-------------------------------------------------------------------------------
322 !
323  CASE DEFAULT
324  CALL abor1_sfx('AV_PGD_PARAM: (2) AVERAGING TYPE NOT ALLOWED')
325 !
326 END SELECT
327 IF (lhook) CALL dr_hook('AV_PGD_PARAM',1,zhook_handle)
328 !-------------------------------------------------------------------------------
329 !
330 END SUBROUTINE av_pgd_param
integer function vegtype_to_patch(IVEGTYPE, INPATCH)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
integer, parameter nundef
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
logical lhook
Definition: yomhook.F90:15
static ll_t maxloc
Definition: getcurheap.c:48
subroutine av_pgd_param(PLAI_IN, PVEG_IN, PFIELD, PVEGTYPE, PDATA, HSFTYPE, HATYPE, KMAS
Definition: av_pgd_param.F90:8