SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
average1_mesh.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 average1_mesh(KLUOUT,KNBLINES,PLAT,PLON,PVALUE,PNODATA)
7 ! #######################################################
8 !
9 !!**** *AVERAGE1_MESH* computes the sum of orography, squared orography
10 !! and subgrid orography characteristics
11 !!
12 !! PURPOSE
13 !! -------
14 !!
15 !! METHOD
16 !! ------
17 !!
18 !! EXTERNAL
19 !! --------
20 !!
21 !! IMPLICIT ARGUMENTS
22 !! ------------------
23 !!
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !! AUTHOR
29 !! ------
30 !!
31 !! V. Masson Meteo-France
32 !!
33 !! MODIFICATION
34 !! ------------
35 !!
36 !! Original 12/09/95
37 !!
38 !----------------------------------------------------------------------------
39 !
40 !* 0. DECLARATION
41 ! -----------
42 !
43 USE modd_pgdwork, ONLY : xsumval, nsize, catype, &
44  nvalnbr, nvalcount, xvallist, jpvalmax
45 USE modd_data_cover_par,ONLY : xcdref
46 !
47 USE modi_get_mesh_index
49 USE modi_abor1_sfx
50 !
51 !
52 !
53 USE yomhook ,ONLY : lhook, dr_hook
54 USE parkind1 ,ONLY : jprb
55 !
56 IMPLICIT NONE
57 !
58 !* 0.1 Declaration of arguments
59 ! ------------------------
60 !
61 INTEGER, INTENT(IN) :: kluout
62 INTEGER, INTENT(IN) :: knblines
63 REAL, DIMENSION(:), INTENT(IN) :: plat ! latitude of the point to add
64 REAL, DIMENSION(:), INTENT(IN) :: plon ! longitude of the point to add
65 REAL, DIMENSION(:), INTENT(IN) :: pvalue ! value of the point to add
66 REAL, OPTIONAL, INTENT(IN) :: pnodata
67 !
68 !* 0.2 Declaration of other local variables
69 ! ------------------------------------
70 !
71 INTEGER, DIMENSION(NOVMX,SIZE(PLAT)) :: iindex ! mesh index of all input points
72  ! 0 indicates the point is out of the domain
73 INTEGER :: jval ! loop counter on encoutered values
74 INTEGER :: jloop, jover ! loop index on input arrays
75 REAL :: zeps=1.e-10 ! a small value
76 LOGICAL :: gfound ! T : Value already found in this grid point
77 !
78 REAL, DIMENSION(SIZE(PLAT)) :: zvalue
79 REAL :: znodata
80 !
81 REAL(KIND=JPRB) :: zhook_handle
82 !----------------------------------------------------------------------------
83 !
84 !* 1. Get position
85 ! ------------
86 !
87 IF (lhook) CALL dr_hook('AVERAGE1_MESH',0,zhook_handle)
88 !
89 IF (present(pnodata)) THEN
90  zvalue(:) = pvalue(:)
91  znodata = pnodata
92  CALL get_mesh_index(kluout,knblines,plat,plon,iindex,zvalue,znodata)
93 ELSE
94  zvalue(:) = 1.
95  znodata = 0.
96  CALL get_mesh_index(kluout,knblines,plat,plon,iindex)
97 ENDIF
98 !
99 !* 2. Loop on all input data points
100 ! -----------------------------
101 !
102 bloop: &
103 DO jloop = 1 , SIZE(plat)
104 !
105  DO jover = 1, novmx
106 !
107 !* 3. Tests on position
108 ! -----------------
109 !
110  IF (iindex(jover,jloop)==0) cycle bloop
111 !
112 !* 4. Summation
113 ! ---------
114 !
115  nsize(iindex(jover,jloop))=nsize(iindex(jover,jloop))+1
116 !
117 !* 5. Choice of type of summation
118 ! ---------------------------
119 !
120  SELECT CASE (catype)
121  CASE ('ARI')
122  xsumval(iindex(jover,jloop))=xsumval(iindex(jover,jloop))+ pvalue(jloop)
123  CASE ('INV')
124  xsumval(iindex(jover,jloop))=xsumval(iindex(jover,jloop))+1./pvalue(jloop)
125  CASE ('CDN')
126  xsumval(iindex(jover,jloop))=xsumval(iindex(jover,jloop))+1./(log(xcdref/pvalue(jloop)))**2
127  CASE ('MAJ')
128  gfound=.false.
129  DO jval=1,nvalnbr(iindex(jover,jloop))
130  IF (abs( xvallist(iindex(jover,jloop),jval) - pvalue(jloop)) < zeps) THEN
131  nvalcount(iindex(jover,jloop),jval) = nvalcount(iindex(jover,jloop),jval) + 1
132  gfound=.true.
133  EXIT
134  END IF
135  END DO
136  IF (.NOT. gfound) THEN
137  IF (nvalnbr(iindex(jover,jloop))==jpvalmax) &
138  CALL abor1_sfx('TOO MANY DIFFERENT VALUES TO AGGREGATE WITH THE MAJORITY RULE')
139  nvalnbr(iindex(jover,jloop)) = nvalnbr(iindex(jover,jloop)) +1
140  jval = nvalnbr(iindex(jover,jloop))
141  nvalcount(iindex(jover,jloop),jval) = 1
142  xvallist(iindex(jover,jloop),jval) = pvalue(jloop)
143  END IF
144  END SELECT
145 !
146  ENDDO
147 END DO bloop
148 IF (lhook) CALL dr_hook('AVERAGE1_MESH',1,zhook_handle)
149 !
150 !-------------------------------------------------------------------------------
151 !
152 END SUBROUTINE average1_mesh
subroutine get_mesh_index(KLUOUT, KNBLINES, PLAT, PLON, KINDEX, PVALUE, PNODATA, KSSO, KISSOX, KISSOY)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine average1_mesh(KLUOUT, KNBLINES, PLAT, PLON, PVALUE, PNODATA)