SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
average2_ldb.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 average2_ldb(PPGDARRAY,HTYPE,KSTAT)
7 ! #########################
8 !
9 !!**** *AVERAGE2_LDB*
10 !!
11 !! PURPOSE
12 !! -------
13 !!
14 !! METHOD
15 !! ------
16 !!
17 !! EXTERNAL
18 !! --------
19 !!
20 !! IMPLICIT ARGUMENTS
21 !! ------------------
22 !!
23 !! REFERENCE
24 !! ---------
25 !!
26 !! AUTHOR
27 !! ------
28 !!
29 !! S. Faroux Meteo-France
30 !!
31 !! MODIFICATION
32 !! ------------
33 !!
34 !! Original 17/02/11
35 !!
36 !----------------------------------------------------------------------------
37 !
38 !* 0. DECLARATION
39 ! -----------
40 !
41 USE modd_pgdwork, ONLY : nsize, xtng
42 USE modd_data_lake, ONLY : xboundgraddepth_ldb, xboundgradstatus_ldb, &
43  xcentrgraddepth_ldb, ncentrgradstatus_ldb, &
44  xsmall_dummy
45 !
46 USE modi_abor1_sfx
47 !
48 USE yomhook ,ONLY : lhook, dr_hook
49 USE parkind1 ,ONLY : jprb
50 !
51 IMPLICIT NONE
52 !
53 !* 0.1 Declaration of arguments
54 ! ------------------------
55 !
56 REAL, DIMENSION(:), INTENT(OUT) :: ppgdarray
57  CHARACTER(LEN=1), INTENT(IN) :: htype
58 INTEGER, INTENT(IN) :: kstat
59 !
60 !* 0.2 Declaration of other local variables
61 ! ------------------------------------
62 !
63 REAL, DIMENSION(:), ALLOCATABLE :: zbound, zcentr
64 REAL :: zfrac, zmax, zpdf, zave
65 !
66 INTEGER :: igrad_mode
67 INTEGER :: jgrad, ji
68 REAL(KIND=JPRB) :: zhook_handle
69 !----------------------------------------------------------------------------
70 !
71 !* 1. Average values
72 ! --------------
73 !
74 IF (lhook) CALL dr_hook('AVERAGE2_LDB',0,zhook_handle)
75 !
76 SELECT CASE (htype)
77 !
78  CASE('D')
79  ALLOCATE(zbound(SIZE(xboundgraddepth_ldb)))
80  zbound(:) = xboundgraddepth_ldb(:)
81  ALLOCATE(zcentr(SIZE(xcentrgraddepth_ldb)))
82  zcentr(:) = xcentrgraddepth_ldb(:)
83 !
84  CASE('S')
85  ALLOCATE(zbound(SIZE(xboundgradstatus_ldb)))
86  zbound(:) = xboundgradstatus_ldb(:)
87  ALLOCATE(zcentr(SIZE(ncentrgradstatus_ldb)))
88  zcentr(:) = ncentrgradstatus_ldb(:)
89 !
90  CASE default
91  CALL abor1_sfx("AVERAGE1_LDB: HTYPE NOT SUPPORTED")
92 !
93 END SELECT
94 !
95 !
96 DO ji = 1,SIZE(xtng,1)
97  !
98  DO jgrad = 1,SIZE(xtng,2)
99  IF (nsize(ji).NE.0) xtng(ji,jgrad) = xtng(ji,jgrad)/nsize(ji)
100  ENDDO
101  !
102  !2 because first centre is for values lower than 0
103  zfrac = sum(xtng(ji,2:SIZE(xtng,2)))
104  !
105  zmax = xsmall_dummy
106  igrad_mode = 2
107  !
108  IF (kstat.EQ.1) THEN
109  !
110  DO jgrad = 2, SIZE(xtng,2)
111  zpdf = xtng(ji,jgrad) / (zbound(jgrad)-zbound(jgrad-1))
112  IF (zpdf.GT.zmax) THEN
113  zmax = zpdf
114  igrad_mode = jgrad
115  ENDIF
116  ENDDO
117  !
118  IF (zfrac.GT.0.) THEN
119  ppgdarray(ji) = zcentr(igrad_mode)
120  ELSE
121  ppgdarray(ji) = 0.
122  ENDIF
123  !
124  ELSEIF (kstat.EQ.2) THEN
125  !
126  zave = 0.
127  DO jgrad = 2, SIZE(xtng,2)
128  zave = zave + zcentr(jgrad) * xtng(ji,jgrad)
129  ENDDO
130  !
131  IF (zfrac.LT.0.00001) THEN
132  ppgdarray(ji) = 0.
133  ELSE
134  ppgdarray(ji) = zave / zfrac
135  ENDIF
136  !
137  ENDIF
138  !
139 ENDDO
140 !
141 DEALLOCATE(zbound)
142 DEALLOCATE(zcentr)
143 !
144 IF (lhook) CALL dr_hook('AVERAGE2_LDB',1,zhook_handle)
145 !
146 !-------------------------------------------------------------------------------
147 !
148 END SUBROUTINE average2_ldb
subroutine average2_ldb(PPGDARRAY, HTYPE, KSTAT)
Definition: average2_ldb.F90:6
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6