SURFEX v8.1
General documentation of Surfex
av_pgd_1p.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 ! ##################
7 ! ##################
8 INTERFACE av_pgd_1p
9 !
10  SUBROUTINE av_pgd_1d_1p (DTCO, &
11  PFIELD,PCOVER,PDATA,HSFTYPE,HATYPE,OCOVER,KMASK,KPATCH,KNPATCH,PDZ,KDECADE)
12 !
14 !
15 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
16 !
17 REAL, DIMENSION(:), INTENT(OUT) :: PFIELD ! secondary field to construct
18 REAL, DIMENSION(:,:), INTENT(IN) :: PCOVER ! fraction of each cover class
19 REAL, DIMENSION(:), INTENT(IN) :: PDATA ! secondary field value for each class
20  CHARACTER(LEN=3), INTENT(IN) :: HSFTYPE ! Type of surface where the field
21  ! is defined
22  CHARACTER(LEN=3), INTENT(IN) :: HATYPE ! Type of averaging
23 LOGICAL, DIMENSION(:), INTENT(IN) :: OCOVER
24 INTEGER, DIMENSION(:), INTENT(IN) :: KMASK
25 INTEGER, INTENT(IN) :: KNPATCH
26 INTEGER, INTENT(IN) :: KPATCH
27 REAL, DIMENSION(:), INTENT(IN), OPTIONAL :: PDZ ! first model half level
28 INTEGER, INTENT(IN), OPTIONAL :: KDECADE ! current month
29 !
30 END SUBROUTINE av_pgd_1d_1p
31 ! ################################################################
32  SUBROUTINE av_patch_pgd_1d_1p (DTCO, &
33  PFIELD,PCOVER,PDATA,HSFTYPE,HATYPE,OCOVER,KMASK,KNPATCH,KPATCH,PDZ,KDECADE)
34 ! ################################################################
35 !
36 !
38 !
39 !* 0.1 Declaration of arguments
40 ! ------------------------
41 !
42 !
43 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
44 !
45 REAL, DIMENSION(:), INTENT(OUT) :: PFIELD ! secondary field to construct
46 REAL, DIMENSION(:,:), INTENT(IN) :: PCOVER ! fraction of each cover class
47 REAL, DIMENSION(:,:), INTENT(IN) :: PDATA ! secondary field value for each class
48  CHARACTER(LEN=3), INTENT(IN) :: HSFTYPE ! Type of surface where the field
49  ! is defined
50  CHARACTER(LEN=3), INTENT(IN) :: HATYPE ! Type of averaging
51 LOGICAL, DIMENSION(:), INTENT(IN) :: OCOVER
52 INTEGER, DIMENSION(:), INTENT(IN) :: KMASK
53 INTEGER, INTENT(IN) :: KNPATCH
54 INTEGER, INTENT(IN) :: KPATCH
55 REAL, DIMENSION(:), INTENT(IN), OPTIONAL :: PDZ ! first model half level
56 INTEGER, INTENT(IN), OPTIONAL :: KDECADE ! current month
57 !
58 END SUBROUTINE av_patch_pgd_1d_1p
59 !
60 ! ################################################################
61  SUBROUTINE major_patch_pgd_1d_1p(TFIELD,PCOVER,TDATA,HSFTYPE,HATYPE,&
62  OCOVER,KMASK,KNPATCH,KPATCH,KDECADE)
63 ! ################################################################
64 !
65 !* 0. DECLARATION
66 ! -----------
67 !
69 !
70 IMPLICIT NONE
71 !
72 !* 0.1 Declaration of arguments
73 ! ------------------------
74 !
75 type(date_time), DIMENSION(:), INTENT(OUT) :: tfield ! secondary field to construct
76 REAL, DIMENSION(:,:), INTENT(IN) :: PCOVER ! fraction of each cover class
77 type(date_time), DIMENSION(:,:), INTENT(IN) :: tdata ! secondary field value for each class
78  CHARACTER(LEN=3), INTENT(IN) :: HSFTYPE ! Type of surface where the field
79  ! is defined
80  CHARACTER(LEN=3), INTENT(IN) :: HATYPE ! Type of averaging
81 LOGICAL, DIMENSION(:), INTENT(IN) :: OCOVER
82 INTEGER, DIMENSION(:), INTENT(IN) :: KMASK
83 INTEGER, INTENT(IN) :: KNPATCH
84 INTEGER, INTENT(IN) :: KPATCH
85 INTEGER, INTENT(IN), OPTIONAL :: KDECADE ! current month
86 !
87 END SUBROUTINE major_patch_pgd_1d_1p
88 !
89 END INTERFACE
90 END MODULE modi_av_pgd_1p
91 !
92 ! ################################################################
93  SUBROUTINE av_pgd_1d_1p (DTCO, PFIELD,PCOVER,PDATA,HSFTYPE,HATYPE,OCOVER,&
94  KMASK, KPATCH, KNPATCH, PDZ, KDECADE)
95 ! ################################################################
96 !
97 !!**** *AV_PGD* average a secondary physiographic variable from the
98 !! fractions of coverage class.
99 !!
100 !! PURPOSE
101 !! -------
102 !!
103 !! METHOD
104 !! ------
105 !!
106 !! The averaging is performed with one way into three:
107 !!
108 !! - arithmetic averaging (HATYPE='ARI')
109 !!
110 !! - inverse averaging (HATYPE='INV')
111 !!
112 !! - inverse of square logarithm averaging (HATYPE='CDN') :
113 !!
114 !! 1 / ( ln (dz/data) )**2
115 !!
116 !! This latest uses (if available) the height of the first model mass
117 !! level. In the other case, 20m is chosen. It works for roughness lengths.
118 !!
119 !! EXTERNAL
120 !! --------
121 !!
122 !! IMPLICIT ARGUMENTS
123 !! ------------------
124 !!
125 !! REFERENCE
126 !! ---------
127 !!
128 !! AUTHOR
129 !! ------
130 !!
131 !! V. Masson Meteo-France
132 !!
133 !! MODIFICATION
134 !! ------------
135 !
136 ! F.Solmon patch modif: remove the case 'veg' as veg is defined for patches
137 !
138 !! Original 15/12/97
139 !! V. Masson 01/2004 Externalization
140 !! R. Alkama 05/2012 Add 6 tree vegtypes (9 rather than 3)
141 !!
142 !----------------------------------------------------------------------------
143 !
144 !* 0. DECLARATION
145 ! -----------
146 !
147 USE modd_data_cover_par, ONLY : xcdref
148 !
150 !
151 USE modd_surf_par, ONLY : xundef
152 !
153 USE mode_av_pgd
154 !
155 USE yomhook ,ONLY : lhook, dr_hook
156 USE parkind1 ,ONLY : jprb
157 !
158 USE modi_abor1_sfx
159 !
160 IMPLICIT NONE
161 !
162 !* 0.1 Declaration of arguments
163 ! ------------------------
164 !
165 !
166 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
167 !
168 REAL, DIMENSION(:), INTENT(OUT) :: PFIELD ! secondary field to construct
169 REAL, DIMENSION(:,:), INTENT(IN) :: PCOVER ! fraction of each cover class
170 REAL, DIMENSION(:), INTENT(IN) :: PDATA ! secondary field value for each class
171  CHARACTER(LEN=3), INTENT(IN) :: HSFTYPE ! Type of surface where the field
172  ! is defined
173  CHARACTER(LEN=3), INTENT(IN) :: HATYPE ! Type of averaging
174 LOGICAL, DIMENSION(:), INTENT(IN) :: OCOVER
175 INTEGER, DIMENSION(:), INTENT(IN) :: KMASK
176 INTEGER, INTENT(IN) :: KNPATCH
177 INTEGER, INTENT(IN) :: KPATCH
178 REAL, DIMENSION(:), INTENT(IN), OPTIONAL :: PDZ ! first model half level
179 INTEGER, INTENT(IN), OPTIONAL :: KDECADE ! current month
180 !
181 !* 0.2 Declaration of local variables
182 ! ------------------------------
183 !
184 INTEGER :: JJ, JI, ID0, IMASK0
185 INTEGER :: ICOVER ! number of cover classes
186 INTEGER :: JCOVER ! loop on cover classes
187 !
188 INTEGER, DIMENSION(SIZE(PCOVER,2)) :: IMASK
189 REAL, DIMENSION(SIZE(PFIELD)) :: ZWORK, ZDZ, ZVAL
190 REAL, DIMENSION(SIZE(PCOVER,2)) :: ZWEIGHT
191 REAL :: ZCOVER_WEIGHT
192 REAL, DIMENSION(SIZE(PFIELD)) :: ZSUM_COVER_WEIGHT
193 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
194 !-------------------------------------------------------------------------------
195 !
196 !* 1.1 field does not exist
197 ! --------------------
198 !
199 IF (lhook) CALL dr_hook('MODI_AV_PGD_1P:AV_PGD_1D_1P',0,zhook_handle)
200 IF (SIZE(pfield)==0 .AND. lhook) CALL dr_hook('MODI_AV_PGD_1P:AV_PGD_1D_1P',1,zhook_handle)
201 IF (SIZE(pfield)==0) RETURN
202 !
203 !-------------------------------------------------------------------------------
204 !
205 !* 1.2 Initializations
206 ! ---------------
207 !
208 icover=SIZE(pcover,2)
209 !
210 IF (PRESENT(pdz)) THEN
211  zdz(:)=pdz(:)
212 ELSE
213  zdz(:)=xcdref
214 END IF
215 !
216 pfield(:)=xundef
217 IF (hsftype=='TRE' .OR. hsftype=='GRT') pfield(:) = 0.
218 !
219 zwork(:)=0.
220 zsum_cover_weight(:)=0.
221 !
222 jcover = 0
223 DO jj = 1,SIZE(ocover)
224  IF (ocover(jj)) THEN
225  jcover=jcover+1
226  imask(jcover) = jj
227  ENDIF
228 ENDDO
229 !
230  CALL get_weight(dtco,icover,imask,hsftype,zweight)
231 !
232 !-------------------------------------------------------------------------------
233 !
234 !* 3. Averaging
235 ! ---------
236 !
237 !* 3.1 Work arrays
238 ! -----------
239 !
240 IF (hatype=='ARI' .OR. hatype=='INV' .OR. hatype=='CDN') THEN
241  !
242  DO jcover=1,icover
243  IF (zweight(jcover)/=0.) THEN
244  !
245  jj = imask(jcover)
246  !
247  IF (hatype=='ARI') THEN
248  zval(:) = pdata(jj)
249  ELSEIF (hatype=='INV') THEN
250  zval(:) = 1./pdata(jj)
251  ELSEIF (hatype=='CDN') THEN
252  zval(:) = 1./(log(zdz(:)/pdata(jj)))**2
253  ENDIF
254  !
255  DO ji = 1,SIZE(kmask)
256  !
257  imask0 = kmask(ji)
258  !
259  IF (pcover(imask0,jcover)/=0.) THEN
260  zcover_weight = pcover(imask0,jcover) * zweight(jcover)
261  zsum_cover_weight(ji) = zsum_cover_weight(ji) + zcover_weight
262  zwork(ji) = zwork(ji) + zval(ji) * zcover_weight
263  ENDIF
264  !
265  ENDDO
266  !
267  ENDIF
268  ENDDO
269 ELSEIF (hatype=='MAJ') THEN
270  !
271  DO ji = 1,SIZE(kmask)
272  !
273  imask0 = kmask(ji)
274  !
275  id0 = maxval(maxloc(pcover(imask0,:)*zweight(:)))
276  zwork(ji) = pdata(imask(id0))
277  zsum_cover_weight(ji) = zsum_cover_weight(ji) + sum(pcover(imask0,:)*zweight(:))
278  !
279  ENDDO
280  !
281 ELSE
282  CALL abor1_sfx('AV_PGD_1D_1P: (1) AVERAGING TYPE NOT ALLOWED : "'//hatype//'"')
283 ENDIF
284 !
285 IF (lhook) CALL dr_hook('MODI_AV_PGD_1P:AV_PGD_1D_1P',0,zhook_handle)
286 !-------------------------------------------------------------------------------
287 !
288 !* 4. End of Averaging
289 ! ----------------
290 !
291 !* 4.1 Selection of averaging type
292 ! ---------------------------
293 !
294  SELECT CASE (hatype)
295 !
296 !-------------------------------------------------------------------------------
297 !
298 !* 4.2 Arithmetic averaging
299 ! --------------------
300 !
301  CASE ('ARI')
302 !
303  WHERE ( zsum_cover_weight(:) >0. )
304  pfield(:) = zwork(:) / zsum_cover_weight(:)
305  END WHERE
306 !
307 !-------------------------------------------------------------------------------
308 !
309 !* 4.3 Inverse averaging
310 ! -----------------
311 !
312  CASE('INV' )
313 !
314  WHERE ( zsum_cover_weight(:) >0. )
315  pfield(:) = zsum_cover_weight(:) / zwork(:)
316  END WHERE
317 !
318 !-------------------------------------------------------------------------------!
319 !
320 !* 4.4 Roughness length averaging
321 ! --------------------------
322 
323 !
324  CASE('CDN')
325 !
326  WHERE ( zsum_cover_weight(:) >0. )
327  pfield(:) = zdz(:) * exp( - sqrt(zsum_cover_weight(:)/zwork(:)) )
328  END WHERE
329 !
330 !-------------------------------------------------------------------------------
331 !
332 !* 4.4 Majoritary averaging
333 ! --------------------
334 !
335  CASE('MAJ' )
336 !
337  WHERE ( zsum_cover_weight(:) >0. )
338  pfield(:) = zwork(:)
339  END WHERE
340 !
341 !-------------------------------------------------------------------------------
342 !
343  CASE DEFAULT
344  CALL abor1_sfx('AV_PGD_1D_1P: (2) AVERAGING TYPE NOT ALLOWED')
345 !
346 END SELECT
347 IF (lhook) CALL dr_hook('MODI_AV_PGD_1P:AV_PGD_1D_1P_4',1,zhook_handle)
348 !
349 !
350 !-------------------------------------------------------------------------------
351 !
352 END SUBROUTINE av_pgd_1d_1p
353 !
354 ! ################################################################
355  SUBROUTINE av_patch_pgd_1d_1p (DTCO, PFIELD,PCOVER,PDATA,HSFTYPE,HATYPE,OCOVER,KMASK,&
356  KNPATCH,KPATCH,PDZ,KDECADE)
357 ! ################################################################
358 !
359 !!**** *AV_PATCH_PGD* average for each surface patch a secondary physiographic
360 !! variable from the
361 !! fractions of coverage class.
362 !!
363 !! PURPOSE
364 !! -------
365 !!
366 !! METHOD
367 !! ------
368 !!
369 !! The averaging is performed with one way into three:
370 !!
371 !! - arithmetic averaging (HATYPE='ARI')
372 !!
373 !! - inverse averaging (HATYPE='INV')
374 !!
375 !! - inverse of square logarithm averaging (HATYPE='CDN') :
376 !!
377 !! 1 / ( ln (dz/data) )**2
378 !!
379 !! This latest uses (if available) the height of the first model mass
380 !! level. In the other case, 20m is chosen. It works for roughness lengths.
381 !!
382 !! EXTERNAL
383 !! --------
384 !!
385 !! IMPLICIT ARGUMENTS
386 !! ------------------
387 !!
388 !! REFERENCE
389 !! ---------
390 !!
391 !! AUTHOR
392 !! ------
393 !!
394 !! F.Solmon /V. Masson
395 !!
396 !! MODIFICATION
397 !! ------------
398 
399 !!
400 !! Original 15/12/97
401 !! V. Masson 01/2004 Externalization
402 !! R. Alkama 05/2012 Add 6 tree vegtypes (9 rather than 3)
403 !!
404 !----------------------------------------------------------------------------
405 !
406 !* 0. DECLARATION
407 ! -----------
408 !
409 !
411 !
412 USE modd_data_cover_par, ONLY : nvegtype, xcdref
413 USE modd_surf_par, ONLY : xundef
414 !
415 USE mode_av_pgd
416 !
417 USE modi_vegtype_to_patch
418 !
419 USE yomhook ,ONLY : lhook, dr_hook
420 USE parkind1 ,ONLY : jprb
421 !
422 USE modi_abor1_sfx
423 !
424 IMPLICIT NONE
425 !
426 !* 0.1 Declaration of arguments
427 ! ------------------------
428 !
429 !
430 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
431 !
432 REAL, DIMENSION(:), INTENT(OUT) :: PFIELD ! secondary field to construct
433 REAL, DIMENSION(:,:), INTENT(IN) :: PCOVER ! fraction of each cover class
434 REAL, DIMENSION(:,:), INTENT(IN) :: PDATA ! secondary field value for each class
435  CHARACTER(LEN=3), INTENT(IN) :: HSFTYPE ! Type of surface where the field
436  ! is defined
437  CHARACTER(LEN=3), INTENT(IN) :: HATYPE ! Type of averaging
438 LOGICAL, DIMENSION(:), INTENT(IN) :: OCOVER
439 INTEGER, DIMENSION(:), INTENT(IN) :: KMASK
440 INTEGER, INTENT(IN) :: KNPATCH
441 INTEGER, INTENT(IN) :: KPATCH
442 REAL, DIMENSION(:), INTENT(IN), OPTIONAL :: PDZ ! first model half level
443 INTEGER, INTENT(IN), OPTIONAL :: KDECADE ! current month
444 !
445 !* 0.2 Declaration of local variables
446 ! ------------------------------
447 !
448 INTEGER :: ICOVER ! number of cover classes
449 INTEGER :: JCOVER ! loop on cover classes
450 !
451 ! nbe of vegtype
452 ! nbre of patches
453 INTEGER :: JVEG! loop on vegtype
454 INTEGER :: JJ, JI, JK
455 !
456 REAL :: ZCOVER_WEIGHT
457 !
458 REAL, DIMENSION(SIZE(PFIELD)) :: ZVAL
459 !
460 REAL, DIMENSION(SIZE(PCOVER,2),NVEGTYPE) :: ZWEIGHT
461 !
462 REAL, DIMENSION(SIZE(PFIELD)) :: ZSUM_COVER_WEIGHT_PATCH
463 !
464 REAL, DIMENSION(SIZE(PFIELD)) :: ZWORK
465 REAL, DIMENSION(SIZE(PFIELD)) :: ZDZ
466 !
467 INTEGER :: IMASK, JP
468 INTEGER, DIMENSION(SIZE(PCOVER,2)) :: IMASK0
469 INTEGER :: PATCH_LIST(nvegtype)
470 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
471 
472 !-------------------------------------------------------------------------------
473 !
474 !* 1.1 field does not exist
475 ! --------------------
476 !
477 IF (lhook) CALL dr_hook('MODI_AV_PGD_1P:AV_PATCH_PGD_1D_1P',0,zhook_handle)
478 IF (SIZE(pfield)==0 .AND. lhook) CALL dr_hook('MODI_AV_PGD_1P:AV_PATCH_PGD_1D_1P',1,zhook_handle)
479 IF (SIZE(pfield)==0) RETURN
480 !
481 !-------------------------------------------------------------------------------
482 !
483 !* 1.2 Initializations
484 ! ---------------
485 !
486 icover=SIZE(pcover,2)
487 !
488 IF (PRESENT(pdz)) THEN
489  zdz(:)=pdz(:)
490 ELSE
491  zdz(:)=xcdref
492 END IF
493 !
494 pfield(:)=xundef
495 !
496 zwork(:) = 0.
497 zweight(:,:) = 0.0
498 zsum_cover_weight_patch(:) = 0.
499 !
500 DO jveg=1,nvegtype
501  patch_list(jveg) = vegtype_to_patch(jveg, knpatch)
502 ENDDO
503 !
504 jcover = 0
505 DO jj = 1,SIZE(ocover)
506  IF (ocover(jj)) THEN
507  jcover=jcover+1
508  imask0(jcover) = jj
509  ENDIF
510 ENDDO
511 !
512  CALL get_weight_patch(dtco,icover,imask0,kdecade,hsftype,zweight)
513 !
514 !-------------------------------------------------------------------------------
515  !
516  !
517  !* 2. Selection of the weighting function for vegtype
518  ! -----------------------------------
519  !
520 jcover=0
521 !
522 DO jcover=1,icover
523  !
524  jj = imask0(jcover)
525  !
526  DO jveg=1,nvegtype
527  !
528  jp= patch_list(jveg)
529  IF (jp/=kpatch) cycle
530  !
531  IF (zweight(jcover,jveg)/=0.) THEN
532  !
533  IF (hatype=='ARI') THEN
534  zval(:) = pdata(jj,jveg)
535  ELSEIF (hatype=='INV') THEN
536  zval(:) = 1. / pdata(jj,jveg)
537  ELSEIF (hatype=='CDN') THEN
538  DO ji=1,SIZE(zval)
539  zval(ji) = 1./(log(zdz(ji)/pdata(jj,jveg)))**2
540  ENDDO
541  ELSE
542  CALL abor1_sfx('AV_1PATCH_PGD_1D: (1) AVERAGING TYPE NOT ALLOWED')
543  ENDIF
544  !
545  DO ji=1,SIZE(pfield)
546 
547  imask = kmask(ji)
548 
549  IF (pcover(imask,jcover)/=0.) THEN
550  zcover_weight = pcover(imask,jcover) * zweight(jcover,jveg)
551  zsum_cover_weight_patch(ji) = zsum_cover_weight_patch(ji) + zcover_weight
552  zwork(ji) = zwork(ji) + zval(ji) * zcover_weight
553  ENDIF
554  ENDDO
555  !
556  ENDIF
557  !
558  ENDDO
559  !
560 ENDDO
561 !
562 !-------------------------------------------------------------------------------
563 
564 !
565 !* 4.1 Selection of averaging type
566 ! ---------------------------
567 !
568  SELECT CASE (hatype)
569 !
570 !-------------------------------------------------------------------------------
571 !
572 !* 4.2 Arithmetic averaging
573 ! --------------------
574 !
575  CASE ('ARI')
576 !
577  DO ji=1,SIZE(pfield)
578  IF (zsum_cover_weight_patch(ji)>0.) pfield(ji) = zwork(ji) / zsum_cover_weight_patch(ji)
579  ENDDO
580 !
581 !-------------------------------------------------------------------------------
582 !
583 !* 4.3 Inverse averaging
584 ! -----------------
585 !
586  CASE('INV' )
587 !
588  DO ji=1,SIZE(pfield)
589  IF (zsum_cover_weight_patch(ji)>0.) pfield(ji) = zsum_cover_weight_patch(ji) / zwork(ji)
590  ENDDO
591 !-------------------------------------------------------------------------------!
592 !
593 !* 4.4 Roughness length averaging
594 ! --------------------------
595 
596 !
597  CASE('CDN')
598 !
599  DO ji=1,SIZE(pfield)
600  IF (zsum_cover_weight_patch(ji)>0.) pfield(ji) = zdz(ji) * exp( - sqrt(zsum_cover_weight_patch(ji)/zwork(ji)) )
601  ENDDO
602 !
603 !-------------------------------------------------------------------------------
604 !
605  CASE DEFAULT
606  CALL abor1_sfx('AV_1PATCH_PGD_1D_1P: (2) AVERAGING TYPE NOT ALLOWED')
607 !
608 END SELECT
609 !
610 IF (lhook) CALL dr_hook('MODI_AV_PGD_1P:AV_1PATCH_PGD_1D_1P',1,zhook_handle)
611 !
612 !-------------------------------------------------------------------------------
613 !
614 END SUBROUTINE av_patch_pgd_1d_1p
615 !
616 ! ################################################################
617  SUBROUTINE major_patch_pgd_1d_1p(TFIELD,PCOVER,TDATA,HSFTYPE,HATYPE,&
618  OCOVER,KMASK,KNPATCH,KPATCH,KDECADE)
619 ! ################################################################
620 !
621 !!**** *MAJOR_PATCH_PGD* find the dominant date for each vegetation type
622 !!
623 !! PURPOSE
624 !! -------
625 !!
626 !! METHOD
627 !! ------
628 !!
629 !! EXTERNAL
630 !! --------
631 !!
632 !! IMPLICIT ARGUMENTS
633 !! ------------------
634 !!
635 !! REFERENCE
636 !! ---------
637 !!
638 !! AUTHOR
639 !! ------
640 !!
641 !! P. LE MOIGNE
642 !!
643 !! MODIFICATION
644 !! ------------
645 !!
646 !! Original 06/2006
647 !!
648 !----------------------------------------------------------------------------
649 !
650 !* 0. DECLARATION
651 ! -----------
652 !
654 USE modd_surf_par, ONLY : xundef, nundef
655 USE modd_data_cover_par, ONLY : nvegtype
656 !
657 USE modi_vegtype_to_patch
658 USE mode_av_pgd
659 !
660 USE yomhook ,ONLY : lhook, dr_hook
661 USE parkind1 ,ONLY : jprb
662 !
663 IMPLICIT NONE
664 !
665 !* 0.1 Declaration of arguments
666 ! ------------------------
667 !
668 type(date_time), DIMENSION(:), INTENT(OUT) :: tfield ! secondary field to construct
669 REAL, DIMENSION(:,:), INTENT(IN) :: PCOVER ! fraction of each cover class
670 type(date_time), DIMENSION(:,:), INTENT(IN) :: tdata ! secondary field value for each class
671  CHARACTER(LEN=3), INTENT(IN) :: HSFTYPE ! Type of surface where the field
672  ! is defined
673  CHARACTER(LEN=3), INTENT(IN) :: HATYPE ! Type of averaging
674 LOGICAL, DIMENSION(:), INTENT(IN) :: OCOVER
675 INTEGER, DIMENSION(:), INTENT(IN) :: KMASK
676 INTEGER, INTENT(IN) :: KNPATCH
677 INTEGER, INTENT(IN) :: KPATCH
678 INTEGER, INTENT(IN), OPTIONAL :: KDECADE ! current month
679 !
680 !* 0.2 Declaration of local variables
681 ! ------------------------------
682 !
683 INTEGER :: JJ, IMASK
684 INTEGER :: ICOVER ! number of cover classes
685 INTEGER :: JCOVER ! loop on cover classes
686 !
687 INTEGER :: JVEG! loop on vegtype
688 !
689 INTEGER, DIMENSION(SIZE(PCOVER,2),NVEGTYPE) :: IDATA_DOY
690 INTEGER, DIMENSION(SIZE(PCOVER,1)) :: IDOY
691 REAL, DIMENSION(365) :: ZCOUNT
692 INTEGER :: JP, IMONTH, IDAY
693 REAL(KIND=JPRB) :: ZHOOK_HANDLE
694 !-------------------------------------------------------------------------------
695 !
696 !* 1.1 field does not exist
697 ! --------------------
698 !
699 IF (lhook) CALL dr_hook('MODI_AV_PGD_1P:MAJOR_PATCH_PGD_1D_1P',0,zhook_handle)
700 IF (SIZE(tfield)==0 .AND. lhook) CALL dr_hook('MODI_AV_PGD_1P:MAJOR_PATCH_PGD_1D_1P',1,zhook_handle)
701 IF (SIZE(tfield)==0) RETURN
702 !
703 !-------------------------------------------------------------------------------
704 !
705 !* 1.2 Initializations
706 ! ---------------
707 !
708 tfield(:)%TDATE%YEAR = nundef
709 tfield(:)%TDATE%MONTH = nundef
710 tfield(:)%TDATE%DAY = nundef
711 tfield(:)%TIME = xundef
712 !
713 idoy(:) = 0
714 !
715  CALL date2doy(tdata,ocover,idata_doy)
716 !-------------------------------------------------------------------------------
717 DO jp = 1,SIZE(tfield)
718  !
719  imask = kmask(jp)
720  !
721  zcount(:) = 0.
722  !
723  DO jveg=1,nvegtype
724  !
725  IF(kpatch==vegtype_to_patch(jveg,knpatch)) THEN
726  !
727  DO jcover = 1,SIZE(pcover,2)
728  !
729  IF (idata_doy(jcover,jveg) /= nundef .AND. pcover(imask,jcover)/=0.) THEN
730  !
731  zcount(idata_doy(jcover,jveg)) = zcount(idata_doy(jcover,jveg)) + pcover(imask,jcover)
732  !
733  END IF
734  !
735  END DO
736  !
737  ENDIF
738  !
739  ENDDO
740  !
741  idoy(jp) = 0
742  IF (any(zcount(:)/=0.)) idoy(jp) = maxloc(zcount,1)
743  !
744  CALL doy2date(idoy(jp),imonth,iday)
745  !
746  tfield(jp)%TDATE%MONTH = imonth
747  tfield(jp)%TDATE%DAY = iday
748  IF (imonth/=nundef) tfield(jp)%TIME = 0.
749  !
750 END DO
751 !
752 !-------------------------------------------------------------------------------
753 !
754 IF (lhook) CALL dr_hook('MODI_AV_PGD_1P:MAJOR_PATCH_PGD_1D_1P',1,zhook_handle)
755 !
756 END SUBROUTINE major_patch_pgd_1d_1p
757 !
758 !-------------------------------------------------------------------------------
759 !
subroutine get_weight_patch(DTCO, KCOVER, KMASK, KDECADE, HSFTYPE, PWEIGHT)
integer function vegtype_to_patch(IVEGTYPE, INPATCH)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
subroutine av_patch_pgd_1d_1p(DTCO, PFIELD, PCOVER, PDATA, HSFTYPE, H
Definition: av_pgd_1p.F90:356
integer, parameter jprb
Definition: parkind1.F90:32
subroutine av_pgd_1d_1p(DTCO, PFIELD, PCOVER, PDATA, HSFTYPE, HATYPE,
Definition: av_pgd_1p.F90:94
integer, parameter nundef
subroutine major_patch_pgd_1d_1p(TFIELD, PCOVER, TDATA, HSFTYPE, HATYP
Definition: av_pgd_1p.F90:618
subroutine get_weight(DTCO, KCOVER, KMASK, HSFTYPE, PWEIGHT)
Definition: mode_av_pgd.F90:81
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
subroutine date2doy(TPDATA, OCOVER, KDOY)
Definition: mode_av_pgd.F90:17
logical lhook
Definition: yomhook.F90:15
static ll_t maxloc
Definition: getcurheap.c:48
subroutine doy2date(KDOY, KMONTH, KDAY)
Definition: mode_av_pgd.F90:50