LMDZ
surface_fields.F90
Go to the documentation of this file.
2 
3 ! Purpose.
4 ! --------
5 
6 ! SURFACE_FIELDS contains data structures and manipulation routines
7 ! for the surface (physics) fields in the IFS
8 
9 ! This module is a mix of declarations, type definitions and
10 ! subroutines linked with surface fields. There are four parts:
11 ! 1/ Declaration of dimensions (including some parameter variables).
12 ! 2/ Definition of types.
13 ! 3/ Declarations:
14 ! Declaration of variables SP_[group], YSP_[group]D, YSP_[group]
15 ! (prognostic surface fields).
16 ! Declaration of variables SD_[group], YSD_[group]D, YSD_[group]
17 ! (diagnostic surface fields).
18 ! 4/ Some routines linked to the surface data flow:
19 ! * INI_SFLP3: Initialize 3-D surface field group
20 ! * SETUP_SFLP3: Setup 3-D surface field
21 ! * INI_SFLP2: Initialize 2-D surface field group
22 ! * SETUP_SFLP2: Setup 2-D surface field
23 ! * GPPOPER: Operations on prognostic surface fields
24 ! * GPOPER: Operations on ALL surface groups
25 ! * GPOPER_2: Operations on 2-D surface groups
26 ! * GPOPER_3: Operations on 3-D surface groups
27 ! * SURF_STORE: Store all surface fields
28 ! * SURF_RESTORE: Restore all surface fields
29 ! * ALLO_SURF: Allocate surface field arrays
30 ! * DEALLO_SURF: Deallocate surface field arrays
31 
32 ! Author.
33 ! -------
34 ! Mats Hamrud(ECMWF)
35 
36 ! Modifications.
37 ! --------------
38 ! Original : 2006-07-01
39 ! Modifications:
40 ! K. Yessad (25 Oct 2006): rephase ALARO0 contribution.
41 ! K. Yessad (26 Oct 2006): add missing comments.
42 
43 !-------------------------------------------------------------------------
44 
45 USE parkind1 ,ONLY : jpim ,jprb
46 USE yomdim ,ONLY : nproma, ngpblks, nundefld
47 USE yomlun ,ONLY : nulout, nulerr
48 USE yomct0 ,ONLY : ltwotl
49 USE yomdyn , ONLY : repsp1
50 USE yomhook ,ONLY : lhook, dr_hook
51 IMPLICIT NONE
52 SAVE
53 
54 !#include "abor1.intfb.h"
55 ! -------------------------------------------------------------------------
56 
57 INTEGER(KIND=JPIM), PARAMETER :: jpmaxsflds=100 ! Max number of fields in individual group
58 INTEGER(KIND=JPIM), PARAMETER :: jpmaxstraj=100 ! Dimension of NSTRAJGRIB
59 INTEGER(KIND=JPIM) :: nsurf=0 ! Number of surf var.
60 INTEGER(KIND=JPIM) :: nsurfl=0 ! Number of surf flds (fields*levels)
61 INTEGER(KIND=JPIM) :: ndimsurf=0 ! Total of surf var (includes timelevels etc)
62 INTEGER(KIND=JPIM) :: ndimsurfl=0 ! Total dimension of all surface variables
63 INTEGER(KIND=JPIM) :: nprogsurf=0 ! Number of prognostic surf var.
64 INTEGER(KIND=JPIM) :: nprogsurfl=0 ! Number of prognostic surf flds (fields*levels)
65 INTEGER(KIND=JPIM) :: nofftraj ! Offset in surf trajectory
66 INTEGER(KIND=JPIM) :: nofftraj_cst ! Offset in "constant" surf trajectory
67 INTEGER(KIND=JPIM) :: nptrsurf ! Used by routine GPOPER
68 INTEGER(KIND=JPIM) :: nstrajgrib(jpmaxstraj) ! Used in trajectory setup
69 
70 REAL(KIND=JPRB),ALLOCATABLE :: surf_store_array(:,:,:) ! Backup array for surf (see routineSURF_STORE )
71 ! General type defintions
72 
73 ! 2D surface field structure
75 INTEGER(KIND=JPIM) :: mp ! Basic field pointer
76 INTEGER(KIND=JPIM) :: mp0 ! Field pointer timelevel 0 (prognostic fields)
77 INTEGER(KIND=JPIM) :: mp9 ! Field pointer timelevel -1 (prognostic fields)
78 INTEGER(KIND=JPIM) :: mp1 ! Field pointer timelevel +1 (prognostic fields)
79 INTEGER(KIND=JPIM) :: mp5 ! Field pointer trajectory
80 INTEGER(KIND=JPIM) :: igrbcode ! GRIB parameter code (default: -999)
81 CHARACTER(LEN=16) :: cname ! ARPEGE field name (default: all spaces)
82 REAL(KIND=JPRB) :: refvali ! Default value (default: 0.0)
83 INTEGER(KIND=JPIM) :: nreqin ! -1 - initial value from default (default)
84  ! +1 - initial value from reading file
85  ! 0 - no initial value
86 INTEGER(KIND=JPIM) :: itraj ! 0 not in trajectory (default)
87  ! 1 in trajectory
88  ! 2 in "constant" trajectory
89 END TYPE type_surf_mtl_2d
90 
91 ! 3D surface field structure
93 INTEGER(KIND=JPIM) :: mp ! Basic field pointer
94 INTEGER(KIND=JPIM) :: mp0 ! Field pointer timelevel 0 (prognostic fields)
95 INTEGER(KIND=JPIM) :: mp9 ! Field pointer timelevel -1 (prognostic fields)
96 INTEGER(KIND=JPIM) :: mp1 ! Field pointer timelevel +1 (prognostic fields)
97 INTEGER(KIND=JPIM) :: mp5 ! Field pointer trajectory
98 INTEGER(KIND=JPIM),POINTER :: igrbcode(:) ! GRIB parameter code (default: -999)
99 CHARACTER(LEN=16) ,POINTER :: cname(:) ! ARPEGE field name (default: all spaces)
100 REAL(KIND=JPRB) ,POINTER :: refvali(:) ! Default value (default: 0.0)
101 INTEGER(KIND=JPIM),POINTER :: nreqin(:) ! -1 - initial value from default (default)
102  ! +1 - initial value from reading file
103  ! 0 - no initial value
104 INTEGER(KIND=JPIM) :: itraj ! 0 not in trajectory (default)
105  ! 1 in trajectory
106  ! 2 in "constant" trajectory
107 END TYPE type_surf_mtl_3d
108 
109 ! Descriptor pertaining to group
111 INTEGER(KIND=JPIM) :: numflds ! Number of field in group
112 INTEGER(KIND=JPIM) :: ndim ! Field dimenion
113 INTEGER(KIND=JPIM) :: nlevs ! Number of levels (for multi level groups)
114 INTEGER(KIND=JPIM) :: iptr ! Internal use
115 INTEGER(KIND=JPIM) :: iptr5 ! Internal use
116 INTEGER(KIND=JPIM) :: ndim5 ! Dimension of trajectory array
117 INTEGER(KIND=JPIM) :: nofftraj ! Internal use
118 INTEGER(KIND=JPIM) :: nofftraj_cst ! Internal use
119 CHARACTER(LEN=16) :: cgrpname ! Name of group (for prints)
120 LOGICAL :: l3d ! TRUE if multi-level field (3-D)
121 LOGICAL :: lmtl ! TRUE if prognostic field (multi time level)
122 END TYPE type_surf_gen
123 
124 ! Type descriptor for derived type for communicating with GPOPER (see below)
126 INTEGER(KIND=JPIM) :: igrbcode
127 LOGICAL :: l_ok
128 CHARACTER(LEN=16) :: cname
129 INTEGER(KIND=JPIM) :: ifldnum
130 REAL(KIND=JPRB) :: value
131 INTEGER(KIND=JPIM) :: iptrsurf
132 INTEGER(KIND=JPIM) :: icodes(jpmaxsflds)
133 INTEGER(KIND=JPIM) :: icount
134 END TYPE type_sfl_comm
135 
136 ! Group specific type definitions
137 
138 ! * Group SB=SOILB: soil prognostic quantities for the different reservoirs
139 ! (four reservoirs at ECMWF, deep reservoir at METEO-FRANCE):
141 TYPE(type_surf_mtl_3d),POINTER :: yt ! temperature
142 TYPE(type_surf_mtl_3d),POINTER :: yq ! liquid water content
143 TYPE(type_surf_mtl_3d),POINTER :: ytl ! ice water content (for MF)
144 TYPE(type_surf_mtl_3d),POINTER :: ysb(:)
145 END TYPE type_sfl_soilb
146 
147 ! * Group SG=SNOWG: surface snow prognostic quantities:
149 TYPE(type_surf_mtl_2d),POINTER :: yf ! content of surface snow
150 TYPE(type_surf_mtl_2d),POINTER :: ya ! snow albedo
151 TYPE(type_surf_mtl_2d),POINTER :: yr ! snow density
152 TYPE(type_surf_mtl_2d),POINTER :: yt ! total albedo (diagnostic for MF for LVGSN)
153 TYPE(type_surf_mtl_2d),POINTER :: ysg(:)
154 END TYPE type_sfl_snowg
155 
156 ! * Group RR=RESVR: surface prognostic quantities (ECMWF) or
157 ! surface + superficial reservoir prognostic quantities (MF):
158 ! Remark:
159 ! at ECMWF there are 4 soil reservoirs and there is a
160 ! clear distinction between the soil reservoirs (group SOILB)
161 ! and the surface (group RESVR);
162 ! at METEO-FRANCE there is a deep reservoir (group SOILB) and a
163 ! superficial reservoir (group RESVR):
164 ! - there is a skin surface temperature (Ts) which is the temperature at the
165 ! interface surface/superficial reservoir (and not two separate quantities
166 ! for superficial reservoir and surface)
167 ! - there is a skin surface water content (denoted by Wl) and a superficial
168 ! reservoir water content (denoted by Ws).
169 ! - there is a superficial reservoir ice content but no surface ice content.
170 ! (remark k.y.: it would have been more logical to use group name
171 ! RESVR for internal reservoirs and group name SOILB for surface!).
173 TYPE(type_surf_mtl_2d),POINTER :: yt ! skin temperature (Ts)
174 TYPE(type_surf_mtl_2d),POINTER :: yw ! skin water content (Wskin) at ECMWF
175  ! superficial reservoir water content (Ws) at MF
176 TYPE(type_surf_mtl_2d),POINTER :: yfc ! skin water content (Wl) at MF
177 TYPE(type_surf_mtl_2d),POINTER :: yic ! superficial reservoir ice
178 TYPE(type_surf_mtl_2d),POINTER :: yfp1 ! interpolated Ts for 2nd part of 927-FULLPOS
179 TYPE(type_surf_mtl_2d),POINTER :: yrr(:)
180 END TYPE type_sfl_resvr
181 
182 ! * Group WS=WAVES: surface prognostic quantities over sea:
184 TYPE(type_surf_mtl_2d),POINTER :: yws(:)
185 TYPE(type_surf_mtl_2d),POINTER :: ychar ! Charnock constant
186 END TYPE type_sfl_waves
187 
188 ! * Group EP=EXTRP: extra 3-d prognostic fields:
190 TYPE(type_surf_mtl_3d),POINTER :: yep(:)
191 END TYPE type_sfl_extrp
192 
193 ! * Group X2=XTRP2: extra 2-d prognostic fields:
194 ! (is used for precipitation fields in CANARI)
196 TYPE(type_surf_mtl_2d),POINTER :: yx2(:)
197 END TYPE type_sfl_xtrp2
198 
199 ! * Group CI=CANRI: 2-d prognostic fields for CANARI:
201 TYPE(type_surf_mtl_2d),POINTER :: yci(:)
202 END TYPE type_sfl_canri
203 
204 ! * Group VF=VARSF: climatological/geographical diagnostic fields:
206 TYPE(type_surf_mtl_2d),POINTER :: yz0f ! gravity * surface roughness length
207 TYPE(type_surf_mtl_2d),POINTER :: yalbf ! surface shortwave albedo
208 TYPE(type_surf_mtl_2d),POINTER :: yemisf ! surface longwave emissivity
209 TYPE(type_surf_mtl_2d),POINTER :: ygetrl ! standard deviation of orography
210 TYPE(type_surf_mtl_2d),POINTER :: yitm ! land-sea mask
211 TYPE(type_surf_mtl_2d),POINTER :: yveg ! vegetation cover
212 TYPE(type_surf_mtl_2d),POINTER :: yvrlan ! anisotropy of the sub-grid scale orography
213 TYPE(type_surf_mtl_2d),POINTER :: yvrldi ! angle of the direction of orography with the x axis
214 TYPE(type_surf_mtl_2d),POINTER :: ysig ! characteristic orographic slope
215 TYPE(type_surf_mtl_2d),POINTER :: yalbsf ! soil shortwave albedo
216 TYPE(type_surf_mtl_2d),POINTER :: ycont ! fraction of land
217 TYPE(type_surf_mtl_2d),POINTER :: ysst ! (open) sea surface temperature
218 TYPE(type_surf_mtl_2d),POINTER :: ylz0h ! logarithm of roughness length for heat
219 TYPE(type_surf_mtl_2d),POINTER :: ycvl ! low vegetation cover
220 TYPE(type_surf_mtl_2d),POINTER :: ycvh ! high vegetation cover
221 TYPE(type_surf_mtl_2d),POINTER :: ytvl ! low vegetation type
222 TYPE(type_surf_mtl_2d),POINTER :: ytvh ! high vegetation type
223 TYPE(type_surf_mtl_2d),POINTER :: yci ! sea ice fraction
224 TYPE(type_surf_mtl_2d),POINTER :: yucur ! U-component of the ocean current
225 TYPE(type_surf_mtl_2d),POINTER :: yvcur ! V-component of the ocean current
226 TYPE(type_surf_mtl_2d),POINTER :: yz0rlf ! gravity * vegetation roughness length
227 TYPE(type_surf_mtl_2d),POINTER :: yco2o ! oceanic CO2 flux
228 TYPE(type_surf_mtl_2d),POINTER :: yco2b ! biosphere CO2 flux
229 TYPE(type_surf_mtl_2d),POINTER :: yco2a ! anthropogenic CO2 flux
230 TYPE(type_surf_mtl_2d),POINTER :: ysdfor ! SD filtered orography
231 TYPE(type_surf_mtl_2d),POINTER :: yaluvp ! MODIS-derived parallel albedo for shortwave radiation
232 TYPE(type_surf_mtl_2d),POINTER :: yaluvd ! MODIS-derived diffuse albedo for shortwave radiation
233 TYPE(type_surf_mtl_2d),POINTER :: yalnip ! MODIS-derived parallel albedo for longwave radiation
234 TYPE(type_surf_mtl_2d),POINTER :: yalnid ! MODIS-derived diffuse albedo for longwave radiation
235 TYPE(type_surf_mtl_2d),POINTER :: ysf6 ! anthropogenic SF6 flux
236 TYPE(type_surf_mtl_2d),POINTER :: yfp1 ! surface orography in the 2nd part of FULLPOS-927
237 TYPE(type_surf_mtl_2d),POINTER :: yvf(:)
238 END TYPE type_sfl_varsf
239 
240 ! * Group VP=VCLIP: deep soil diagnostic fields:
242 TYPE(type_surf_mtl_2d),POINTER :: ytpc ! climatological deep layer temperature
243 TYPE(type_surf_mtl_2d),POINTER :: ywpc ! climatological deep layer moisture
244 TYPE(type_surf_mtl_2d),POINTER :: yvp(:)
245 END TYPE type_sfl_vclip
246 
247 ! * Group VV=VCLIV: vegetation diagnostic fields:
249 TYPE(type_surf_mtl_2d),POINTER :: yarg ! silt percentage within soil
250 TYPE(type_surf_mtl_2d),POINTER :: ysab ! percentage of sand within the soil
251 TYPE(type_surf_mtl_2d),POINTER :: yd2 ! soil depth
252 TYPE(type_surf_mtl_2d),POINTER :: yiveg ! type of vegetation
253 TYPE(type_surf_mtl_2d),POINTER :: yrsmin ! stomatal minimum resistance
254 TYPE(type_surf_mtl_2d),POINTER :: ylai ! leaf area index
255 TYPE(type_surf_mtl_2d),POINTER :: yhv ! resistance to evapotranspiration
256 TYPE(type_surf_mtl_2d),POINTER :: yz0h ! gravity * roughness length for heat
257 TYPE(type_surf_mtl_2d),POINTER :: yals ! albedo of bare ground
258 TYPE(type_surf_mtl_2d),POINTER :: yalv ! albedo of vegetation
259 TYPE(type_surf_mtl_2d),POINTER :: yvv(:)
260 END TYPE type_sfl_vcliv
261 
262 ! * Group VN=VCLIN: cloudiness diagnostic predictors:
264 TYPE(type_surf_mtl_2d),POINTER :: ytop ! index of convective cloud top
265 TYPE(type_surf_mtl_2d),POINTER :: ybas ! index of convective cloud base
266 TYPE(type_surf_mtl_2d),POINTER :: yacpr ! averaged convective precipitaion rate
267 TYPE(type_surf_mtl_2d),POINTER :: yvn(:)
268 END TYPE type_sfl_vclin
269 
270 ! * Group VH=VCLIH: convective cloud diagnostic fields:
272 TYPE(type_surf_mtl_2d),POINTER :: ytcch ! total convective cloudiness
273 TYPE(type_surf_mtl_2d),POINTER :: yscch ! convective cloud summit
274 TYPE(type_surf_mtl_2d),POINTER :: ybcch ! convective cloud base
275 TYPE(type_surf_mtl_2d),POINTER :: ypblh ! PBL height
276 TYPE(type_surf_mtl_2d),POINTER :: yspsh ! variable for prognostic convection scheme (ALARO)
277 TYPE(type_surf_mtl_2d),POINTER :: yvh(:)
278 END TYPE type_sfl_vclih
279 
280 ! * Group VA=VCLIA: aerosol diagnostic fields:
282 TYPE(type_surf_mtl_2d),POINTER :: ysea ! aerosol: sea
283 TYPE(type_surf_mtl_2d),POINTER :: ylan ! aerosol: land
284 TYPE(type_surf_mtl_2d),POINTER :: ysoo ! aerosol: soot
285 TYPE(type_surf_mtl_2d),POINTER :: ydes ! aerosol: desert
286 TYPE(type_surf_mtl_2d),POINTER :: ysul ! aerosol: sulfate
287 TYPE(type_surf_mtl_2d),POINTER :: yvol ! aerosol: volcano
288 TYPE(type_surf_mtl_2d),POINTER :: ynud ! aerosol: nudging
289 TYPE(type_surf_mtl_2d),POINTER :: yva(:)
290 END TYPE type_sfl_vclia
291 
292 ! * Group VG=VCLIG: ice-coupler diagnostic fields:
294 TYPE(type_surf_mtl_2d),POINTER :: yicfr ! sea-ice fraction
295 TYPE(type_surf_mtl_2d),POINTER :: ysoup ! upward solar flux over sea-ice
296 TYPE(type_surf_mtl_2d),POINTER :: yirup ! upward IR flux over sea-ice
297 TYPE(type_surf_mtl_2d),POINTER :: ychss ! sensible heat over sea-ice
298 TYPE(type_surf_mtl_2d),POINTER :: yevap ! evaporation over sea-ice
299 TYPE(type_surf_mtl_2d),POINTER :: ytaux ! U-component of stress over sea-ice
300 TYPE(type_surf_mtl_2d),POINTER :: ytauy ! V-component of stress over sea-ice
301 TYPE(type_surf_mtl_2d),POINTER :: yvg(:)
302 END TYPE type_sfl_vclig
303 
304 ! * Group VC=VO3ABC: A,B and C (Climatological ozone profiles) diagnostic fields:
306 TYPE(type_surf_mtl_2d),POINTER :: ya ! A climatological ozone profile
307 TYPE(type_surf_mtl_2d),POINTER :: yb ! B climatological ozone profile
308 TYPE(type_surf_mtl_2d),POINTER :: yc ! C climatological ozone profile
309 TYPE(type_surf_mtl_2d),POINTER :: yvc(:)
310 END TYPE type_sfl_vo3abc
311 
312 ! * Group VD=VDIAG: (ECMWF) diagnostic fields:
314 TYPE(type_surf_mtl_2d),POINTER :: ylsp !Large scale precipitation
315 TYPE(type_surf_mtl_2d),POINTER :: ycp !Convective precipitation
316 TYPE(type_surf_mtl_2d),POINTER :: ysf !Snowfall
317 TYPE(type_surf_mtl_2d),POINTER :: ybld !Boundary layer dissipation
318 TYPE(type_surf_mtl_2d),POINTER :: ysshf !Surface sensible heat flux
319 TYPE(type_surf_mtl_2d),POINTER :: yslhf !Surface latent heat flux
320 TYPE(type_surf_mtl_2d),POINTER :: ymsl !Mean sea level pressure
321 TYPE(type_surf_mtl_2d),POINTER :: ytcc !Total cloud cover
322 TYPE(type_surf_mtl_2d),POINTER :: y10u !U-wind at 10 m
323 TYPE(type_surf_mtl_2d),POINTER :: y10v !V-wind at 10 m
324 TYPE(type_surf_mtl_2d),POINTER :: y2t !Temperature at 2 m
325 TYPE(type_surf_mtl_2d),POINTER :: y2d !Dewpoint temperature at 2 m
326 TYPE(type_surf_mtl_2d),POINTER :: yssr !Surface solar radiation
327 TYPE(type_surf_mtl_2d),POINTER :: ystr !Surface thermal radiation
328 TYPE(type_surf_mtl_2d),POINTER :: ytsr !Top solar radiation
329 TYPE(type_surf_mtl_2d),POINTER :: yttr !Top thermal radiation
330 TYPE(type_surf_mtl_2d),POINTER :: yewss !Instantaneous surface U-wind stress
331 TYPE(type_surf_mtl_2d),POINTER :: ynsss !Instantaneous surface V-wind stress
332 TYPE(type_surf_mtl_2d),POINTER :: ye !Water evaporation
333 TYPE(type_surf_mtl_2d),POINTER :: yccc !Convective cloud cover
334 TYPE(type_surf_mtl_2d),POINTER :: ylcc !Low cloud cover
335 TYPE(type_surf_mtl_2d),POINTER :: ymcc !Medium cloud cover
336 TYPE(type_surf_mtl_2d),POINTER :: yhcc !High cloud cover
337 TYPE(type_surf_mtl_2d),POINTER :: ylgws !Zonal gravity wave stress
338 TYPE(type_surf_mtl_2d),POINTER :: ymgws !Meridian gravity wave stress
339 TYPE(type_surf_mtl_2d),POINTER :: ygwd !Gravity wave dissipation
340 TYPE(type_surf_mtl_2d),POINTER :: ymx2t !Maximum temperature at 2 m
341 TYPE(type_surf_mtl_2d),POINTER :: ymn2t !Minimum temperature at 2 m
342 TYPE(type_surf_mtl_2d),POINTER :: yro !Runoff
343 TYPE(type_surf_mtl_2d),POINTER :: yalb !(surface shortwave) albedo
344 TYPE(type_surf_mtl_2d),POINTER :: yiewss !Instantaneous surface zonal component of stress
345 TYPE(type_surf_mtl_2d),POINTER :: yinsss !Instantaneous surface meridian component of stress
346 TYPE(type_surf_mtl_2d),POINTER :: yisshf !Instantaneous surface heat flux
347 TYPE(type_surf_mtl_2d),POINTER :: yie !Instantaneous surface moisture flux
348 TYPE(type_surf_mtl_2d),POINTER :: ycsf !Convective snow fall
349 TYPE(type_surf_mtl_2d),POINTER :: ylssf !Large scale snowfall
350 TYPE(type_surf_mtl_2d),POINTER :: yz0f !Gravity * surface roughness length
351 TYPE(type_surf_mtl_2d),POINTER :: ylz0h !Logarithm of z0 times heat flux
352 TYPE(type_surf_mtl_2d),POINTER :: ytcw !Total water content in a vertical column
353 TYPE(type_surf_mtl_2d),POINTER :: ytcwv !Total water vapor content in a vertical column
354 TYPE(type_surf_mtl_2d),POINTER :: ytclw !Total liquid water content in a vertical column
355 TYPE(type_surf_mtl_2d),POINTER :: ytciw !Total ice water content in a vertical column
356 TYPE(type_surf_mtl_2d),POINTER :: yssrd !Downward surface solar radiation
357 TYPE(type_surf_mtl_2d),POINTER :: ystrd !Downward surface thermic radiation
358 TYPE(type_surf_mtl_2d),POINTER :: yblh !Height of boundary layer
359 TYPE(type_surf_mtl_2d),POINTER :: ysund !Sunshine duration
360 TYPE(type_surf_mtl_2d),POINTER :: yspar !Surface downward PARadiation
361 TYPE(type_surf_mtl_2d),POINTER :: ysuvb !Surface downward UV-B radiation
362 TYPE(type_surf_mtl_2d),POINTER :: ycape !Conv.avail.potential energy (CAPE)
363 TYPE(type_surf_mtl_2d),POINTER :: ytsrc !Top solar radiation clear sky
364 TYPE(type_surf_mtl_2d),POINTER :: yttrc !Top thermal radiation clear sky
365 TYPE(type_surf_mtl_2d),POINTER :: yssrc !Surface solar radiation clear sky
366 TYPE(type_surf_mtl_2d),POINTER :: ystrc !Surface thermal radiation clear sky
367 TYPE(type_surf_mtl_2d),POINTER :: yes !Evaporation of snow
368 TYPE(type_surf_mtl_2d),POINTER :: ysmlt !Snow melt
369 TYPE(type_surf_mtl_2d),POINTER :: y10fg !Wind gust at 10 m (max since previous pp)
370 TYPE(type_surf_mtl_2d),POINTER :: ylspf !Large scale precipitation fraction
371 TYPE(type_surf_mtl_2d),POINTER :: ytco3 !Total ozone content in a vertical column
372 TYPE(type_surf_mtl_2d),POINTER :: yvimd !Vertically integrated mass divergence
373 TYPE(type_surf_mtl_2d),POINTER :: ysparc !Surface clear-sky parallel radiation
374 TYPE(type_surf_mtl_2d),POINTER :: ystinc !TOA (top of atmosph?) incident solar radiation
375 TYPE(type_surf_mtl_2d),POINTER :: ytcghg(:) !Total column greenhouse gases
376 TYPE(type_surf_mtl_2d),POINTER :: ytcgrg(:) !Total column reactive gases
377 TYPE(type_surf_mtl_2d),POINTER :: ytctrac(:) !Total column tracers
378 TYPE(type_surf_mtl_2d),POINTER :: yvd(:)
379 END TYPE type_sfl_vdiag
380 
381 ! * Group VX=VCLIX: auxilary climatological diagnostic fields:
383 TYPE(type_surf_mtl_2d),POINTER :: yoro ! climatological surface geopotential
384 TYPE(type_surf_mtl_2d),POINTER :: ytsc ! climatological surface temperature
385 TYPE(type_surf_mtl_2d),POINTER :: ypws ! climatological surface max. prop. moisture
386 TYPE(type_surf_mtl_2d),POINTER :: ypwp ! climatological deep soil max. prop. moisture
387 TYPE(type_surf_mtl_2d),POINTER :: ysno ! climatological snow cover
388 TYPE(type_surf_mtl_2d),POINTER :: ytpc ! climatological deep soil temperature
389 TYPE(type_surf_mtl_2d),POINTER :: ysab ! climatologic percentage of sand within the soil
390 TYPE(type_surf_mtl_2d),POINTER :: yxd2 ! climatologic soil depth
391 TYPE(type_surf_mtl_2d),POINTER :: ylsm ! climatologic land sea mask
392 TYPE(type_surf_mtl_2d),POINTER :: yiveg ! climatologic type of vegetation
393 TYPE(type_surf_mtl_2d),POINTER :: yvx(:)
394 END TYPE type_sfl_vclix
395 
396 ! * Group XA=VEXTRA: extra 3-d diagnostic fields:
398 TYPE(type_surf_mtl_3d),POINTER :: yxa(:)
399 END TYPE type_sfl_vextra
400 
401 ! * Group X2=VEXTR2: extra 2-d diagnostic fields:
403 TYPE(type_surf_mtl_2d),POINTER :: yx2(:)
404 END TYPE type_sfl_vextr2
405 
406 ! End of type definitions
407 
408 ! Data structures
409 
410 ! Prognostic (multi time level) fields
411 
412 ! Soilb
413 REAL(KIND=JPRB),ALLOCATABLE :: sp_sb (:,:,:,:)
416 
417 ! Snowg
418 REAL(KIND=JPRB),ALLOCATABLE :: sp_sg (:,:,:)
421 
422 ! Resvr
423 REAL(KIND=JPRB),ALLOCATABLE :: sp_rr (:,:,:)
426 
427 
428 ! Extrp
429 REAL(KIND=JPRB),ALLOCATABLE :: sp_ep (:,:,:,:)
432 
433 ! Xtrp2
434 REAL(KIND=JPRB),ALLOCATABLE :: sp_x2 (:,:,:)
437 
438 ! Canri
439 REAL(KIND=JPRB),ALLOCATABLE :: sp_ci (:,:,:)
442 
443 ! One time level fields
444 
445 ! Varsf
446 REAL(KIND=JPRB),ALLOCATABLE :: sd_vf (:,:,:)
449 
450 ! Vclip
451 REAL(KIND=JPRB),ALLOCATABLE :: sd_vp (:,:,:)
454 
455 ! Vcliv
456 REAL(KIND=JPRB),ALLOCATABLE :: sd_vv (:,:,:)
459 
460 ! Vclin
461 REAL(KIND=JPRB),ALLOCATABLE :: sd_vn (:,:,:)
464 
465 ! Vclih
466 REAL(KIND=JPRB),ALLOCATABLE :: sd_vh (:,:,:)
469 
470 ! Vclia
471 REAL(KIND=JPRB),ALLOCATABLE :: sd_va (:,:,:)
474 
475 ! Vo3abc
476 REAL(KIND=JPRB),ALLOCATABLE :: sd_vc (:,:,:)
479 
480 ! Vdiag
481 REAL(KIND=JPRB),ALLOCATABLE :: sd_vd (:,:,:)
484 
485 ! Waves
486 REAL(KIND=JPRB),ALLOCATABLE :: sd_ws (:,:,:)
489 
490 ! Vclix
491 REAL(KIND=JPRB),ALLOCATABLE :: sd_vx (:,:,:)
494 
495 ! Vextra
496 
497 REAL(KIND=JPRB),ALLOCATABLE :: sd_xa (:,:,:,:)
500 
501 ! Vextr2
502 
503 REAL(KIND=JPRB),ALLOCATABLE :: sd_x2 (:,:,:)
506 
507 !$OMP THREADPRIVATE(ndimsurf,ndimsurfl,nofftraj,nofftraj_cst,nprogsurf)
508 !$OMP THREADPRIVATE(nprogsurfl,nptrsurf,nstrajgrib,nsurf,nsurfl,ysd_va,ysd_vad)
509 !$OMP THREADPRIVATE(ysd_vc,ysd_vcd,ysd_vd,ysd_vdd,ysd_vf,ysd_vfd,ysd_vh,ysd_vhd)
510 !$OMP THREADPRIVATE(ysd_vn,ysd_vnd,ysd_vp,ysd_vpd,ysd_vv,ysd_vvd,ysd_vx,ysd_vxd)
511 !$OMP THREADPRIVATE(ysd_ws,ysd_wsd,ysd_x2,ysd_x2d,ysd_xa,ysd_xad,ysp_ci,ysp_cid)
512 !$OMP THREADPRIVATE(ysp_ep,ysp_epd,ysp_rr,ysp_rrd,ysp_sb,ysp_sbd,ysp_sg,ysp_sgd)
513 !$OMP THREADPRIVATE(ysp_x2,ysp_x2d)
514 
515 !$OMP THREADPRIVATE(sd_va,sd_vc,sd_vd,sd_vf,sd_vh,sd_vn,sd_vp,sd_vv,sd_vx,sd_ws)
516 !$OMP THREADPRIVATE(sd_x2,sd_xa,sp_ci,sp_ep,sp_rr,sp_sb,sp_sg,sp_x2,surf_store_array)
517 
518 
519 !-------------------------------------------------------------------------
520 
521 CONTAINS
522 
523 !=========================================================================
524 
525 SUBROUTINE ini_sflp3(YDSC,YD,KFLDS,KLEVS,LDMTL,CDGRPNAME)
526 ! Initialize 3-D surface field group
527 TYPE(type_surf_gen),INTENT(INOUT) :: YDSC
528 TYPE(type_surf_mtl_3d),INTENT(INOUT) :: YD(:)
529 INTEGER(KIND=JPIM),INTENT(IN) :: KFLDS
530 INTEGER(KIND=JPIM),INTENT(IN) :: KLEVS
531 LOGICAL,INTENT(IN) :: LDMTL
532 CHARACTER(LEN=*),INTENT(IN) :: CDGRPNAME
533 
534 INTEGER(KIND=JPIM) :: JFLD, IMAXF
535 REAL(KIND=JPRB) :: ZHOOK_HANDLE
536 
537 !-------------------------------------------------------------------------
538 
539 IF (lhook) CALL dr_hook('SURFACE_FIELDS:INI_SFLP3',0,zhook_handle)
540 
541 imaxf = SIZE(yd)
542 ydsc%NUMFLDS = kflds
543 ydsc%NLEVS = klevs
544 ydsc%IPTR = 1
545 ydsc%LMTL = ldmtl
546 ydsc%CGRPNAME = cdgrpname
547 ydsc%NDIM5 = 0
548 ydsc%NOFFTRAJ = nofftraj
549 ydsc%NOFFTRAJ_CST = nofftraj_cst
550 
551 nsurf = nsurf+ydsc%NUMFLDS
552 nsurfl = nsurfl+ydsc%NUMFLDS*ydsc%NLEVS
553 IF(ldmtl) THEN
554  nprogsurf = nprogsurf+ydsc%NUMFLDS
555  nprogsurfl = nprogsurfl+ydsc%NUMFLDS*ydsc%NLEVS
556 ENDIF
557 
558 IF(ldmtl) THEN
559  IF (ltwotl) THEN
560  ydsc%NDIM = 2*ydsc%NUMFLDS
561  ELSE
562  ydsc%NDIM = 3*ydsc%NUMFLDS
563  ENDIF
564 ELSE
565  ydsc%NDIM = ydsc%NUMFLDS
566 ENDIF
567 ndimsurf = ndimsurf + ydsc%NDIM
568 ndimsurfl = ndimsurfl + ydsc%NDIM*ydsc%NLEVS
569 
570 DO jfld=1,kflds
571  ALLOCATE(yd(jfld)%IGRBCODE(klevs))
572  ALLOCATE(yd(jfld)%CNAME(klevs))
573  ALLOCATE(yd(jfld)%REFVALI(klevs))
574  ALLOCATE(yd(jfld)%NREQIN(klevs))
575  yd(jfld)%IGRBCODE(:) = -999
576  yd(jfld)%CNAME(:) = ''
577  yd(jfld)%REFVALI(:) = 0.0_jprb
578  yd(jfld)%NREQIN(:) = -1
579  yd(jfld)%MP = jfld
580  IF (ydsc%LMTL) THEN
581  yd(jfld)%MP0 = yd(jfld)%MP
582  IF(ltwotl) THEN
583  yd(jfld)%MP9 = yd(jfld)%MP0
584  yd(jfld)%MP1 = yd(jfld)%MP0+ydsc%NUMFLDS
585  ELSE
586  yd(jfld)%MP9 = yd(jfld)%MP0+ydsc%NUMFLDS
587  yd(jfld)%MP1 = yd(jfld)%MP0+2*ydsc%NUMFLDS
588  ENDIF
589  ELSE
590  yd(jfld)%MP0 = nundefld
591  yd(jfld)%MP9 = nundefld
592  yd(jfld)%MP1 = nundefld
593  ENDIF
594  yd(jfld)%MP5 = nundefld
595  yd(jfld)%ITRAJ = 0
596 ENDDO
597 
598 DO jfld=kflds+1,imaxf
599  yd(jfld)%MP = nundefld
600  yd(jfld)%MP0 = nundefld
601  yd(jfld)%MP9 = nundefld
602  yd(jfld)%MP1 = nundefld
603  yd(jfld)%MP5 = nundefld
604  yd(jfld)%ITRAJ = 0
605 ENDDO
606 
607 WRITE(nulout,*) 'INITIALIZING 3-D SURFACE FIELD GROUP ', ydsc%CGRPNAME
608 WRITE(nulout,*) 'NUMFLDS=',ydsc%NUMFLDS,' NLEVS=',ydsc%NLEVS,' LMTL=',ydsc%LMTL
609 
610 IF (lhook) CALL dr_hook('SURFACE_FIELDS:INI_SFLP3',1,zhook_handle)
611 END SUBROUTINE ini_sflp3
612 
613 !=========================================================================
614 
615 SUBROUTINE setup_sflp3(YDSC,YD,KGRIB,CDNAME,PDEFAULT,KTRAJ,KREQIN)
616 ! Setup 3-D surface field
617 TYPE(type_surf_gen),INTENT(INOUT) :: YDSC
618 TYPE(type_surf_mtl_3d),INTENT(INOUT) :: YD
619 INTEGER(KIND=JPIM),OPTIONAL,INTENT(IN) :: KGRIB(:)
620 CHARACTER(LEN=16) ,OPTIONAL,INTENT(IN) :: CDNAME(:)
621 REAL(KIND=JPRB) ,OPTIONAL,INTENT(IN) :: PDEFAULT(:)
622 INTEGER(KIND=JPIM),OPTIONAL,INTENT(IN) :: KTRAJ
623 INTEGER(KIND=JPIM),OPTIONAL,INTENT(IN) :: KREQIN(:)
624 
625 INTEGER(KIND=JPIM) :: IPTR,JLEV
626 REAL(KIND=JPRB) :: ZHOOK_HANDLE
627 
628 !-------------------------------------------------------------------------
629 
630 IF (lhook) CALL dr_hook('SURFACE_FIELDS:SETUP_SFLP3',0,zhook_handle)
631 iptr = ydsc%IPTR
632 IF(iptr > ydsc%NUMFLDS) THEN
633  WRITE(nulerr,*) 'SURFACE FIELDS UNDER-DIMENSINED - GROUP ',&
634  & ydsc%CGRPNAME,ydsc%NUMFLDS,kgrib(1),cdname(1)
635  CALL abor1('IPTR > YDSC%NUMFLDS')
636 ENDIF
637 IF(PRESENT(kgrib)) THEN
638  yd%IGRBCODE(:) = kgrib(:)
639 ENDIF
640 IF(PRESENT(kreqin)) THEN
641  yd%NREQIN(:) = kreqin(:)
642 ENDIF
643 IF(PRESENT(cdname)) THEN
644  yd%CNAME(:) = cdname(:)
645 ENDIF
646 IF(PRESENT(pdefault)) THEN
647  yd%REFVALI(:) = pdefault
648 ENDIF
649 IF(PRESENT(ktraj)) THEN
650  IF(ktraj == 1) THEN
651  DO jlev=1,ydsc%NLEVS
652  nstrajgrib(nofftraj+jlev) = yd%IGRBCODE(jlev)
653  ENDDO
654  nofftraj = nofftraj+ydsc%NLEVS
655  ELSEIF(ktraj == 2) THEN
656  nofftraj_cst = nofftraj_cst+ydsc%NLEVS
657  ELSEIF(ktraj /= 0) THEN
658  CALL abor1('SURFACE_FIELDS:SETUP_SFLP3 - UNKNOWN KTRAJ')
659  ENDIF
660  yd%ITRAJ = ktraj
661  ydsc%NDIM5 = ydsc%NDIM5+1
662  yd%MP5 = ydsc%NDIM5
663 ENDIF
664 DO jlev=1,ydsc%NLEVS
665  IF(ydsc%LMTL) THEN
666  WRITE(nulout,'(1X,A,2I4,1X,A,6I4)') &
667  & ydsc%CGRPNAME(1:6),ydsc%IPTR,jlev,yd%CNAME(jlev),yd%IGRBCODE(jlev),&
668  & yd%MP0,yd%MP9,yd%MP1,yd%ITRAJ,yd%NREQIN(jlev)
669  ELSE
670  WRITE(nulout,'(1X,A,2I4,1X,A,4I4)') &
671  & ydsc%CGRPNAME(1:6),ydsc%IPTR,jlev,yd%CNAME(jlev),yd%IGRBCODE(jlev),&
672  & yd%MP,yd%ITRAJ,yd%NREQIN(jlev)
673  ENDIF
674 ENDDO
675 ydsc%IPTR = ydsc%IPTR+1
676 
677 IF (lhook) CALL dr_hook('SURFACE_FIELDS:SETUP_SFLP3',1,zhook_handle)
678 END SUBROUTINE setup_sflp3
679 
680 !=========================================================================
681 
682 SUBROUTINE ini_sflp2(YDSC,YD,KFLDS,LDMTL,CDGRPNAME)
683 ! Initialize 2-D surface field group
684 TYPE(type_surf_gen),INTENT(INOUT) :: YDSC
685 TYPE(type_surf_mtl_2d),INTENT(INOUT) :: YD(:)
686 INTEGER(KIND=JPIM),INTENT(IN) :: KFLDS
687 LOGICAL,INTENT(IN) :: LDMTL
688 CHARACTER(LEN=*),INTENT(IN) :: CDGRPNAME
689 
690 INTEGER(KIND=JPIM) :: JFLD, IMAXF
691 REAL(KIND=JPRB) :: ZHOOK_HANDLE
692 
693 !-------------------------------------------------------------------------
694 
695 IF (lhook) CALL dr_hook('SURFACE_FIELDS:INI_SFLP2',0,zhook_handle)
696 
697 imaxf = SIZE(yd)
698 ydsc%NUMFLDS = kflds
699 ydsc%NLEVS = -1
700 ydsc%IPTR = 1
701 ydsc%LMTL = ldmtl
702 ydsc%CGRPNAME = cdgrpname
703 ydsc%NDIM5 = 0
704 ydsc%NOFFTRAJ = nofftraj
705 ydsc%NOFFTRAJ_CST = nofftraj_cst
706 
707 nsurf = nsurf+ydsc%NUMFLDS
708 nsurfl = nsurfl+ydsc%NUMFLDS
709 IF(ldmtl) THEN
710  nprogsurf = nprogsurf+ydsc%NUMFLDS
711  nprogsurfl = nprogsurfl+ydsc%NUMFLDS
712 ENDIF
713 
714 IF(ldmtl) THEN
715  IF (ltwotl) THEN
716  ydsc%NDIM = 2*ydsc%NUMFLDS
717  ELSE
718  ydsc%NDIM = 3*ydsc%NUMFLDS
719  ENDIF
720 ELSE
721  ydsc%NDIM = ydsc%NUMFLDS
722 ENDIF
723 ndimsurf = ndimsurf + ydsc%NDIM
724 ndimsurfl = ndimsurfl + ydsc%NDIM
725 DO jfld=1,kflds
726  yd(jfld)%IGRBCODE = -999
727  yd(jfld)%CNAME = ''
728  yd(jfld)%REFVALI = 0.0_jprb
729  yd(jfld)%NREQIN = -1
730  yd(jfld)%MP = jfld
731  IF (ydsc%LMTL) THEN
732  yd(jfld)%MP0 = yd(jfld)%MP
733  IF(ltwotl) THEN
734  yd(jfld)%MP9 = yd(jfld)%MP0
735  yd(jfld)%MP1 = yd(jfld)%MP0+ydsc%NUMFLDS
736  ELSE
737  yd(jfld)%MP9 = yd(jfld)%MP0+ydsc%NUMFLDS
738  yd(jfld)%MP1 = yd(jfld)%MP0+2*ydsc%NUMFLDS
739  ENDIF
740  ELSE
741  yd(jfld)%MP0 = nundefld
742  yd(jfld)%MP9 = nundefld
743  yd(jfld)%MP1 = nundefld
744  ENDIF
745  yd(jfld)%MP5 = nundefld
746  yd(jfld)%ITRAJ = 0
747 ENDDO
748 
749 DO jfld=kflds+1,imaxf
750  yd(jfld)%MP = nundefld
751  yd(jfld)%MP0 = nundefld
752  yd(jfld)%MP9 = nundefld
753  yd(jfld)%MP1 = nundefld
754  yd(jfld)%MP5 = nundefld
755  yd(jfld)%ITRAJ = 0
756 ENDDO
757 
758 WRITE(nulout,*) 'INITIALIZING 2-D SURFACE FIELD GROUP ', ydsc%CGRPNAME
759 WRITE(nulout,*) 'NUMFLDS=',ydsc%NUMFLDS,' LMTL=',ydsc%LMTL
760 
761 IF (lhook) CALL dr_hook('SURFACE_FIELDS:INI_SFLP2',1,zhook_handle)
762 END SUBROUTINE ini_sflp2
763 
764 !=========================================================================
765 
766 SUBROUTINE setup_sflp2(YDSC,YD,KGRIB,CDNAME,PDEFAULT,KTRAJ,KREQIN)
767 ! Setup 2-D surface field
768 TYPE(type_surf_gen),INTENT(INOUT) :: YDSC
769 TYPE(type_surf_mtl_2d),INTENT(INOUT) :: YD
770 INTEGER(KIND=JPIM),OPTIONAL,INTENT(IN) :: KGRIB
771 CHARACTER(LEN=16) ,OPTIONAL,INTENT(IN) :: CDNAME
772 REAL(KIND=JPRB) ,OPTIONAL,INTENT(IN) :: PDEFAULT
773 INTEGER(KIND=JPIM),OPTIONAL,INTENT(IN) :: KTRAJ
774 INTEGER(KIND=JPIM),OPTIONAL,INTENT(IN) :: KREQIN
775 
776 INTEGER(KIND=JPIM) :: IPTR
777 REAL(KIND=JPRB) :: ZHOOK_HANDLE
778 
779 !-------------------------------------------------------------------------
780 
781 IF (lhook) CALL dr_hook('SURFACE_FIELDS:SETUP_SFLP2',0,zhook_handle)
782 iptr = ydsc%IPTR
783 IF(iptr > ydsc%NUMFLDS) THEN
784  WRITE(nulerr,*) 'SURFACE FIELDS UNDER-DIMENSINED - GROUP ',ydsc%CGRPNAME,ydsc%NUMFLDS,kgrib,cdname
785  CALL abor1('IPTR > YDSC%NUMFLDS')
786 ENDIF
787 IF(PRESENT(kgrib)) THEN
788  yd%IGRBCODE = kgrib
789 ENDIF
790 IF(PRESENT(kreqin)) THEN
791  yd%NREQIN = kreqin
792 ENDIF
793 IF(PRESENT(cdname)) THEN
794  yd%CNAME = cdname
795 ENDIF
796 IF(PRESENT(pdefault)) THEN
797  yd%REFVALI = pdefault
798 ENDIF
799 IF(PRESENT(ktraj)) THEN
800  IF(ktraj == 1) THEN
801  nstrajgrib(nofftraj+1) = yd%IGRBCODE
802  nofftraj = nofftraj+1
803  ELSEIF(ktraj == 2) THEN
805  ELSEIF(ktraj /= 0) THEN
806  CALL abor1('SURFACE_FIELDS:SETUP_SFLP2 - UNKNOWN KTRAJ')
807  ENDIF
808  yd%ITRAJ = ktraj
809  ydsc%NDIM5 = ydsc%NDIM5+1
810  yd%MP5 = ydsc%NDIM5
811 ENDIF
812 IF(ydsc%LMTL) THEN
813  WRITE(nulout,'(1X,A,I4,1X,A,6I4)') &
814  & ydsc%CGRPNAME(1:6),ydsc%IPTR,yd%CNAME,yd%IGRBCODE,&
815  & yd%MP0,yd%MP9,yd%MP1,yd%ITRAJ,yd%NREQIN
816 ELSE
817  WRITE(nulout,'(1X,A,I4,1X,A,4I4)') &
818  & ydsc%CGRPNAME(1:6),ydsc%IPTR,yd%CNAME,yd%IGRBCODE,yd%MP,yd%ITRAJ,yd%NREQIN
819 ENDIF
820 
821 ydsc%IPTR = ydsc%IPTR+1
822 IF (lhook) CALL dr_hook('SURFACE_FIELDS:SETUP_SFLP2',1,zhook_handle)
823 END SUBROUTINE setup_sflp2
824 
825 !=========================================================================
826 
827 SUBROUTINE gppoper(CDACT,KBL,PSP_SB,PSP_SG,PSP_RR,PSP_EP,PSP_X2,YDCOM)
828 ! Operations on prognostic surface fields
829 CHARACTER(LEN=*),INTENT(IN) :: CDACT
830 INTEGER(KIND=JPIM),OPTIONAL,INTENT(IN) :: KBL
831 REAL(KIND=JPRB),OPTIONAL,INTENT(INOUT) :: PSP_SB(:,:,:)
832 REAL(KIND=JPRB),OPTIONAL,INTENT(INOUT) :: PSP_SG(:,:)
833 REAL(KIND=JPRB),OPTIONAL,INTENT(INOUT) :: PSP_RR(:,:)
834 REAL(KIND=JPRB),OPTIONAL,INTENT(INOUT) :: PSP_EP(:,:,:)
835 REAL(KIND=JPRB),OPTIONAL,INTENT(INOUT) :: PSP_X2(:,:)
836 TYPE(type_sfl_comm),OPTIONAL,INTENT(INOUT) :: YDCOM
837 
838 
839 REAL(KIND=JPRB) :: ZHOOK_HANDLE
840 
841 !-------------------------------------------------------------------------
842 
843 IF (lhook) CALL dr_hook('SURFACE_FIELDS:GPPOPER',0,zhook_handle)
844 IF(PRESENT(kbl)) THEN
845  CALL gpoper_3(cdact,sp_sb(:,:,:,kbl),ysp_sbd,ysp_sb%YSB,ydcom)
846  CALL gpoper_2(cdact,sp_sg(:,:,kbl) ,ysp_sgd,ysp_sg%YSG,ydcom)
847  CALL gpoper_2(cdact,sp_rr(:,:,kbl) ,ysp_rrd,ysp_rr%YRR,ydcom)
848  CALL gpoper_3(cdact,sp_ep(:,:,:,kbl),ysp_epd,ysp_ep%YEP,ydcom)
849  CALL gpoper_2(cdact,sp_x2(:,:,kbl) ,ysp_x2d,ysp_x2%YX2,ydcom)
850 ELSE
851  IF(PRESENT(psp_sb)) CALL gpoper_3(cdact,psp_sb(:,:,:),ysp_sbd,ysp_sb%YSB,ydcom)
852  IF(PRESENT(psp_sg)) CALL gpoper_2(cdact,psp_sg(:,:) ,ysp_sgd,ysp_sg%YSG,ydcom)
853  IF(PRESENT(psp_rr)) CALL gpoper_2(cdact,psp_rr(:,:) ,ysp_rrd,ysp_rr%YRR,ydcom)
854  IF(PRESENT(psp_ep)) CALL gpoper_3(cdact,psp_ep(:,:,:),ysp_epd,ysp_ep%YEP,ydcom)
855  IF(PRESENT(psp_x2)) CALL gpoper_2(cdact,psp_x2(:,:) ,ysp_x2d,ysp_x2%YX2,ydcom)
856 ENDIF
857 IF (lhook) CALL dr_hook('SURFACE_FIELDS:GPPOPER',1,zhook_handle)
858 END SUBROUTINE gppoper
859 
860 !=========================================================================
861 
862 SUBROUTINE gpoper(CDACT,KBL,PSP_SB,PSP_SG,PSP_RR,PSD_VF,PSD_VV,YDCOM,PFIELD,PFIELD2)
863 !Operations on ALL surface groups
864 CHARACTER(LEN=*),INTENT(IN) :: CDACT
865 INTEGER(KIND=JPIM),OPTIONAL,INTENT(IN) :: KBL
866 REAL(KIND=JPRB),OPTIONAL,INTENT(INOUT) :: PSP_SB(:,:,:)
867 REAL(KIND=JPRB),OPTIONAL,INTENT(INOUT) :: PSP_SG(:,:)
868 REAL(KIND=JPRB),OPTIONAL,INTENT(INOUT) :: PSP_RR(:,:)
869 REAL(KIND=JPRB),OPTIONAL,INTENT(INOUT) :: PSD_VF(:,:)
870 REAL(KIND=JPRB),OPTIONAL,INTENT(INOUT) :: PSD_VV(:,:)
871 TYPE(type_sfl_comm),OPTIONAL,INTENT(INOUT) :: YDCOM
872 REAL(KIND=JPRB),OPTIONAL,INTENT(INOUT) :: PFIELD(:,:)
873 REAL(KIND=JPRB),OPTIONAL,INTENT(INOUT) :: PFIELD2(:,:)
874 REAL(KIND=JPRB) :: ZHOOK_HANDLE
875 
876 !-------------------------------------------------------------------------
877 
878 IF (lhook) CALL dr_hook('SURFACE_FIELDS:GPOPER',0,zhook_handle)
879 IF(cdact == 'PUTALLFLDS' .OR. cdact == 'GETALLFLDS' .OR.&
880  & cdact == 'TRAJSTORE' .OR. cdact == 'TRAJSTORECST' .OR. &
881  & cdact == 'SET0TOTRAJ' .OR. cdact == 'GETTRAJ' ) THEN
882  IF(.NOT.PRESENT(pfield)) CALL abor1('SURFACE_FIELDS:GPOPER - PFIELD MISSING')
883  IF(SIZE(pfield,1) < nproma) CALL abor1('SURFACE_FIELDS:GPOPER - SIZE(PFIELD,1) < NPROMA)')
884 ENDIF
885 IF(cdact == 'PUTALLFLDS' .OR. cdact == 'GETALLFLDS') THEN
886  IF(SIZE(pfield,2) < nprogsurfl) CALL abor1('SURFACE_FIELDS:GPOPER - SIZE(PFIELD,2) < NPROGSURFL)')
887 ENDIF
888 IF(cdact == 'GETTRAJ') THEN
889  IF(.NOT.PRESENT(pfield2)) CALL abor1('SURFACE_FIELDS:GPOPER - PFIELD2 MISSING')
890  IF(SIZE(pfield2,1) < nproma) CALL abor1('SURFACE_FIELDS:GPOPER - SIZE(PFIELD2,1) < NPROMA)')
891 ENDIF
892 IF(PRESENT(ydcom)) THEN
893  ydcom%L_OK = .false.
894  ydcom%IPTRSURF = 0
895  ydcom%ICOUNT = 0
896 ENDIF
897 
898 nptrsurf = 0
899 IF(PRESENT(kbl)) THEN
900  IF(ysp_sbd%NDIM > 0) THEN
901  CALL gpoper_3(cdact,sp_sb(:,:,:,kbl),ysp_sbd,ysp_sb%YSB,ydcom,pfield,pfield2)
902  ENDIF
903  IF(ysp_sgd%NDIM > 0) THEN
904  CALL gpoper_2(cdact,sp_sg(:,:,kbl) ,ysp_sgd,ysp_sg%YSG,ydcom,pfield,pfield2)
905  ENDIF
906  IF(ysp_rrd%NDIM > 0) THEN
907  CALL gpoper_2(cdact,sp_rr(:,:,kbl) ,ysp_rrd,ysp_rr%YRR,ydcom,pfield,pfield2)
908  ENDIF
909  IF(ysp_epd%NDIM > 0) THEN
910  CALL gpoper_3(cdact,sp_ep(:,:,:,kbl),ysp_epd,ysp_ep%YEP,ydcom,pfield,pfield2)
911  ENDIF
912  IF(ysp_x2d%NDIM > 0) THEN
913  CALL gpoper_2(cdact,sp_x2(:,:,kbl) ,ysp_x2d,ysp_x2%YX2,ydcom,pfield,pfield2)
914  ENDIF
915  IF(ysd_vfd%NDIM > 0) THEN
916  CALL gpoper_2(cdact,sd_vf(:,:,kbl) ,ysd_vfd,ysd_vf%YVF,ydcom,pfield,pfield2)
917  ENDIF
918  IF(ysd_vpd%NDIM > 0) THEN
919  CALL gpoper_2(cdact,sd_vp(:,:,kbl) ,ysd_vpd,ysd_vp%YVP,ydcom,pfield,pfield2)
920  ENDIF
921  IF(ysd_vvd%NDIM > 0) THEN
922  CALL gpoper_2(cdact,sd_vv(:,:,kbl) ,ysd_vvd,ysd_vv%YVV,ydcom,pfield,pfield2)
923  ENDIF
924  IF(ysd_vnd%NDIM > 0) THEN
925  CALL gpoper_2(cdact,sd_vn(:,:,kbl) ,ysd_vnd,ysd_vn%YVN,ydcom,pfield,pfield2)
926  ENDIF
927  IF(ysd_vhd%NDIM > 0) THEN
928  CALL gpoper_2(cdact,sd_vh(:,:,kbl) ,ysd_vhd,ysd_vh%YVH,ydcom,pfield,pfield2)
929  ENDIF
930  IF(ysd_vad%NDIM > 0) THEN
931  CALL gpoper_2(cdact,sd_va(:,:,kbl) ,ysd_vad,ysd_va%YVA,ydcom,pfield,pfield2)
932  ENDIF
933  IF(ysd_vcd%NDIM > 0) THEN
934  CALL gpoper_2(cdact,sd_vc(:,:,kbl) ,ysd_vcd,ysd_vc%YVC,ydcom,pfield,pfield2)
935  ENDIF
936  IF(ysd_vdd%NDIM > 0) THEN
937  CALL gpoper_2(cdact,sd_vd(:,:,kbl) ,ysd_vdd,ysd_vd%YVD,ydcom,pfield,pfield2)
938  ENDIF
939  IF(ysd_wsd%NDIM > 0) THEN
940  CALL gpoper_2(cdact,sd_ws(:,:,kbl) ,ysd_wsd,ysd_ws%YWS,ydcom,pfield,pfield2)
941  ENDIF
942  IF(ysd_xad%NDIM > 0) THEN
943  CALL gpoper_3(cdact,sd_xa(:,:,:,kbl),ysd_xad,ysd_xa%YXA,ydcom,pfield,pfield2)
944  ENDIF
945  IF(ysd_x2d%NDIM > 0) THEN
946  CALL gpoper_2(cdact,sd_x2(:,:,kbl) ,ysd_x2d,ysd_x2%YX2,ydcom,pfield,pfield2)
947  ENDIF
948  IF(ysd_vxd%NDIM > 0) THEN
949  CALL gpoper_2(cdact,sd_vx(:,:,kbl) ,ysd_vxd,ysd_vx%YVX,ydcom,pfield,pfield2)
950  ENDIF
951 ELSE
952  IF(ysp_sbd%NDIM > 0) THEN
953  IF(PRESENT(psp_sb)) &
954  & CALL gpoper_3(cdact,psp_sb,ysp_sbd,ysp_sb%YSB,ydcom,pfield,pfield2)
955  ENDIF
956  IF(ysp_sgd%NDIM > 0) THEN
957  IF(PRESENT(psp_sg)) &
958  & CALL gpoper_2(cdact,psp_sg,ysp_sgd,ysp_sg%YSG,ydcom,pfield,pfield2)
959  ENDIF
960  IF(ysp_rrd%NDIM > 0) THEN
961  IF(PRESENT(psp_rr)) &
962  & CALL gpoper_2(cdact,psp_rr,ysp_rrd,ysp_rr%YRR,ydcom,pfield,pfield2)
963  ENDIF
964  IF(ysd_vfd%NDIM > 0) THEN
965  IF(PRESENT(psd_vf)) &
966  & CALL gpoper_2(cdact,psd_vf,ysd_vfd,ysd_vf%YVF,ydcom,pfield,pfield2)
967  ENDIF
968  IF(ysd_vvd%NDIM > 0) THEN
969  IF(PRESENT(psd_vv)) &
970  & CALL gpoper_2(cdact,psd_vv,ysd_vvd,ysd_vv%YVV,ydcom,pfield,pfield2)
971  ENDIF
972 ENDIF
973 IF (lhook) CALL dr_hook('SURFACE_FIELDS:GPOPER',1,zhook_handle)
974 END SUBROUTINE gpoper
975 
976 !=========================================================================
977 
978 SUBROUTINE gpoper_2(CDACT,PFLD,YDSC,YD,YDCOM,PFIELD,PFIELD2)
979 ! Operations on 2-D surface groups
980 CHARACTER(LEN=*),INTENT(IN) :: CDACT
981 REAL(KIND=JPRB),INTENT(INOUT) :: PFLD(:,:)
982 TYPE(type_surf_gen),INTENT(IN) :: YDSC
983 TYPE(type_surf_mtl_2d),INTENT(IN) :: YD(:)
984 TYPE(type_sfl_comm),OPTIONAL,INTENT(INOUT) :: YDCOM
985 REAL(KIND=JPRB),OPTIONAL,INTENT(INOUT) :: PFIELD(:,:)
986 REAL(KIND=JPRB),OPTIONAL,INTENT(INOUT) :: PFIELD2(:,:)
987 
988 INTEGER(KIND=JPIM) :: J,IPTR,IPTR2
989 REAL(KIND=JPRB) :: ZZPHY
990 REAL(KIND=JPRB) :: ZHOOK_HANDLE
991 
992 !-------------------------------------------------------------------------
993 
994 IF (lhook) CALL dr_hook('SURFACE_FIELDS:GPOPER_2',0,zhook_handle)
995 IF(cdact == 'SET9TO0') THEN
996  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
997  DO j=1,ydsc%NUMFLDS
998  pfld(:,yd(j)%MP9) = pfld(:,yd(j)%MP0)
999  ENDDO
1000 ELSEIF(cdact == 'SET1TO0') THEN
1001  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1002  DO j=1,ydsc%NUMFLDS
1003  pfld(:,yd(j)%MP1) = pfld(:,yd(j)%MP0)
1004  ENDDO
1005 ELSEIF(cdact == 'SET1TO9') THEN
1006  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1007  DO j=1,ydsc%NUMFLDS
1008  pfld(:,yd(j)%MP1) = pfld(:,yd(j)%MP9)
1009  ENDDO
1010 ELSEIF(cdact == 'SET1TO9AD') THEN
1011  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1012  DO j=1,ydsc%NUMFLDS
1013  pfld(:,yd(j)%MP0) = pfld(:,yd(j)%MP9)+pfld(:,yd(j)%MP1)
1014  pfld(:,yd(j)%MP1) = 0.0_jprb
1015  ENDDO
1016 ELSEIF(cdact == 'SET0TO1') THEN
1017  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1018  DO j=1,ydsc%NUMFLDS
1019  pfld(:,yd(j)%MP0) = pfld(:,yd(j)%MP1)
1020  ENDDO
1021 ELSEIF(cdact == 'SET0TO1AD') THEN
1022  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1023  DO j=1,ydsc%NUMFLDS
1024  pfld(:,yd(j)%MP1) = pfld(:,yd(j)%MP1)+pfld(:,yd(j)%MP0)
1025  pfld(:,yd(j)%MP0) = 0.0_jprb
1026  ENDDO
1027 ELSEIF(cdact == 'SET9TO1') THEN
1028  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1029  DO j=1,ydsc%NUMFLDS
1030  pfld(:,yd(j)%MP9) = pfld(:,yd(j)%MP1)
1031  ENDDO
1032 ELSEIF(cdact == 'PHTFILT') THEN
1033  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1034  zzphy=1.0_jprb-repsp1
1035  DO j=1,ydsc%NUMFLDS
1036  pfld(:,yd(j)%MP9) = repsp1*pfld(:,yd(j)%MP1)+zzphy*pfld(:,yd(j)%MP0)
1037  pfld(:,yd(j)%MP0) = pfld(:,yd(j)%MP1)
1038  ENDDO
1039 ELSEIF(cdact == 'PHTFILTAD') THEN
1040  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1041  zzphy=1.0_jprb-repsp1
1042  DO j=1,ydsc%NUMFLDS
1043  pfld(:,yd(j)%MP1) = pfld(:,yd(j)%MP1)+pfld(:,yd(j)%MP0)
1044  pfld(:,yd(j)%MP0) = 0.0_jprb
1045  pfld(:,yd(j)%MP1) = pfld(:,yd(j)%MP1)+repsp1*pfld(:,yd(j)%MP9)
1046  pfld(:,yd(j)%MP0) = pfld(:,yd(j)%MP0)+zzphy *pfld(:,yd(j)%MP9)
1047  pfld(:,yd(j)%MP9) = 0.0_jprb
1048  ENDDO
1049 ELSEIF(cdact == 'SET0TOVAL') THEN
1050  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1051  DO j=1,ydsc%NUMFLDS
1052  pfld(:,yd(j)%MP0) = ydcom%VALUE
1053  ENDDO
1054 ELSEIF(cdact == 'SET9TOVAL') THEN
1055  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1056  DO j=1,ydsc%NUMFLDS
1057  pfld(:,yd(j)%MP9) = ydcom%VALUE
1058  ENDDO
1059 ELSEIF(cdact == 'SET1TOVAL') THEN
1060  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1061  DO j=1,ydsc%NUMFLDS
1062  pfld(:,yd(j)%MP1) = ydcom%VALUE
1063  ENDDO
1064 ELSEIF(cdact == 'SETALLTOVAL') THEN
1065  DO j=1,ydsc%NDIM
1066  pfld(:,j) = ydcom%VALUE
1067  ENDDO
1068 ELSEIF(cdact == 'SETDEFAULT') THEN
1069  DO j=1,ydsc%NUMFLDS
1070  IF(yd(j)%NREQIN == -1) THEN
1071  pfld(:,yd(j)%MP) = yd(j)%REFVALI
1072  ENDIF
1073  ENDDO
1074 ELSEIF(cdact == 'TRAJSTORE') THEN
1075  IF(ydsc%NDIM5 > 0 ) THEN
1076  iptr = ydsc%NOFFTRAJ
1077  DO j=1,ydsc%NUMFLDS
1078  IF(yd(j)%ITRAJ == 1) THEN
1079  iptr = iptr+1
1080  pfield(:,iptr) = pfld(:,yd(j)%MP)
1081  ENDIF
1082  ENDDO
1083  ENDIF
1084 ELSEIF(cdact == 'TRAJSTORECST') THEN
1085  IF(ydsc%NDIM5 > 0 ) THEN
1086  iptr2 = ydsc%NOFFTRAJ_CST
1087  DO j=1,ydsc%NUMFLDS
1088  IF(yd(j)%ITRAJ == 2) THEN
1089  iptr2 = iptr2+1
1090  pfield(:,iptr2) = pfld(:,yd(j)%MP)
1091  ENDIF
1092  ENDDO
1093  ENDIF
1094 ELSEIF(cdact == 'SET0TOTRAJ') THEN
1095  IF(ydsc%NDIM5 > 0 ) THEN
1096  iptr = ydsc%NOFFTRAJ
1097  DO j=1,ydsc%NUMFLDS
1098  IF(yd(j)%ITRAJ == 1) THEN
1099  iptr = iptr+1
1100  pfld(:,yd(j)%MP) = pfield(:,iptr)
1101  ENDIF
1102  ENDDO
1103  ENDIF
1104 ELSEIF(cdact == 'GETTRAJ') THEN
1105  IF(ydsc%NDIM5 > 0 ) THEN
1106  iptr = ydsc%NOFFTRAJ
1107  iptr2 = ydsc%NOFFTRAJ_CST
1108  DO j=1,ydsc%NUMFLDS
1109  IF(yd(j)%ITRAJ == 1) THEN
1110  iptr = iptr+1
1111  pfld(:,yd(j)%MP5) = pfield(:,iptr)
1112  ELSEIF(yd(j)%ITRAJ == 2) THEN
1113  iptr2 = iptr2+1
1114  pfld(:,yd(j)%MP5) = pfield2(:,iptr2)
1115  ENDIF
1116  ENDDO
1117  ENDIF
1118 ELSEIF(cdact == 'GETALLFLDS') THEN
1119  DO j=1,ydsc%NDIM
1120  nptrsurf = nptrsurf+1
1121  pfield(:,nptrsurf) = pfld(:,j)
1122  ENDDO
1123 ELSEIF(cdact == 'PUTALLFLDS') THEN
1124  DO j=1,ydsc%NDIM
1125  nptrsurf = nptrsurf+1
1126  pfld(:,j) = pfield(:,nptrsurf)
1127  ENDDO
1128 ELSEIF(cdact == 'GETGRIBPOS') THEN
1129  DO j=1,ydsc%NUMFLDS
1130  ydcom%IPTRSURF = ydcom%IPTRSURF+1
1131  IF(yd(j)%IGRBCODE == ydcom%IGRBCODE) THEN
1132  ydcom%IFLDNUM = ydcom%IPTRSURF
1133  ydcom%L_OK = .true.
1134  ENDIF
1135  ENDDO
1136 ELSEIF(cdact == 'GETFIELD') THEN
1137  DO j=1,ydsc%NUMFLDS
1138  ydcom%IPTRSURF = ydcom%IPTRSURF+1
1139  IF(ydcom%IPTRSURF == ydcom%IFLDNUM) THEN
1140  pfield(:,1) = pfld(:,j)
1141  ydcom%L_OK = .true.
1142  ENDIF
1143  ENDDO
1144 ELSEIF(cdact == 'GRIBIN') THEN
1145  DO j=1,ydsc%NUMFLDS
1146  ydcom%IPTRSURF = ydcom%IPTRSURF+1
1147  IF(yd(j)%NREQIN == 1) THEN
1148  ydcom%ICOUNT = ydcom%ICOUNT+1
1149  ydcom%ICODES(ydcom%ICOUNT) = yd(j)%IGRBCODE
1150  ENDIF
1151  ENDDO
1152 ELSE
1153  WRITE(nulout,*) 'SURFACE_FIELD:GPPOPER UNKNOWN ACTION - ',cdact
1154  CALL abor1('SURFACE_FIELD:GPPOPER - UNKNOWN ACTION')
1155 ENDIF
1156 IF (lhook) CALL dr_hook('SURFACE_FIELDS:GPOPER_2',1,zhook_handle)
1157 END SUBROUTINE gpoper_2
1158 
1159 !=========================================================================
1160 
1161 SUBROUTINE gpoper_3(CDACT,PFLD,YDSC,YD,YDCOM,PFIELD,PFIELD2)
1162 ! Operations on 3-D surface groups
1163 CHARACTER(LEN=*),INTENT(IN) :: CDACT
1164 REAL(KIND=JPRB),INTENT(INOUT) :: PFLD(:,:,:)
1165 TYPE(type_surf_gen),INTENT(IN) :: YDSC
1166 TYPE(type_surf_mtl_3d),INTENT(IN) :: YD(:)
1167 TYPE(type_sfl_comm),OPTIONAL,INTENT(INOUT) :: YDCOM
1168 REAL(KIND=JPRB),OPTIONAL,INTENT(INOUT) :: PFIELD(:,:)
1169 REAL(KIND=JPRB),OPTIONAL,INTENT(INOUT) :: PFIELD2(:,:)
1170 
1171 INTEGER(KIND=JPIM) :: J,JLEV,IPTR,IPTR2
1172 REAL(KIND=JPRB) :: ZZPHY
1173 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1174 
1175 !-------------------------------------------------------------------------
1176 
1177 IF (lhook) CALL dr_hook('SURFACE_FIELDS:GPOPER_3',0,zhook_handle)
1178 IF(cdact == 'SET9TO0') THEN
1179  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1180  DO j=1,ydsc%NUMFLDS
1181  pfld(:,:,yd(j)%MP9) = pfld(:,:,yd(j)%MP0)
1182  ENDDO
1183 ELSEIF(cdact == 'SET1TO0') THEN
1184  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1185  DO j=1,ydsc%NUMFLDS
1186  pfld(:,:,yd(j)%MP1) = pfld(:,:,yd(j)%MP0)
1187  ENDDO
1188 ELSEIF(cdact == 'SET1TO9') THEN
1189  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1190  DO j=1,ydsc%NUMFLDS
1191  pfld(:,:,yd(j)%MP1) = pfld(:,:,yd(j)%MP9)
1192  ENDDO
1193 ELSEIF(cdact == 'SET1TO9AD') THEN
1194  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1195  DO j=1,ydsc%NUMFLDS
1196  pfld(:,:,yd(j)%MP9) = pfld(:,:,yd(j)%MP9)+pfld(:,:,yd(j)%MP1)
1197  pfld(:,:,yd(j)%MP1) = 0.0_jprb
1198  ENDDO
1199 ELSEIF(cdact == 'SET0TO1') THEN
1200  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1201  DO j=1,ydsc%NUMFLDS
1202  pfld(:,:,yd(j)%MP0) = pfld(:,:,yd(j)%MP1)
1203  ENDDO
1204 ELSEIF(cdact == 'SET0TO1AD') THEN
1205  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1206  DO j=1,ydsc%NUMFLDS
1207  pfld(:,:,yd(j)%MP1) = pfld(:,:,yd(j)%MP1)+pfld(:,:,yd(j)%MP0)
1208  pfld(:,:,yd(j)%MP0) = 0.0_jprb
1209  ENDDO
1210 ELSEIF(cdact == 'SET9TO1') THEN
1211  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1212  DO j=1,ydsc%NUMFLDS
1213  pfld(:,:,yd(j)%MP9) = pfld(:,:,yd(j)%MP1)
1214  ENDDO
1215 ELSEIF(cdact == 'PHTFILT') THEN
1216  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1217  zzphy=1.0_jprb-repsp1
1218  DO j=1,ydsc%NUMFLDS
1219  pfld(:,:,yd(j)%MP9) = repsp1*pfld(:,:,yd(j)%MP1)+zzphy*pfld(:,:,yd(j)%MP0)
1220  pfld(:,:,yd(j)%MP0) = pfld(:,:,yd(j)%MP1)
1221  ENDDO
1222 ELSEIF(cdact == 'PHTFILTAD') THEN
1223  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1224  zzphy=1.0_jprb-repsp1
1225  DO j=1,ydsc%NUMFLDS
1226  pfld(:,:,yd(j)%MP1) = pfld(:,:,yd(j)%MP1)+pfld(:,:,yd(j)%MP0)
1227  pfld(:,:,yd(j)%MP0) = 0.0_jprb
1228  pfld(:,:,yd(j)%MP1) = pfld(:,:,yd(j)%MP1)+repsp1*pfld(:,:,yd(j)%MP9)
1229  pfld(:,:,yd(j)%MP0) = pfld(:,:,yd(j)%MP0)+zzphy *pfld(:,:,yd(j)%MP9)
1230  pfld(:,:,yd(j)%MP9) = 0.0_jprb
1231  ENDDO
1232 ELSEIF(cdact == 'SET0TOVAL') THEN
1233  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1234  DO j=1,ydsc%NUMFLDS
1235  pfld(:,:,yd(j)%MP0) = ydcom%VALUE
1236  ENDDO
1237 ELSEIF(cdact == 'SET9TOVAL') THEN
1238  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1239  DO j=1,ydsc%NUMFLDS
1240  pfld(:,:,yd(j)%MP9) = ydcom%VALUE
1241  ENDDO
1242 ELSEIF(cdact == 'SET1TOVAL') THEN
1243  IF( .NOT. ydsc%LMTL) CALL abor1('SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1244  DO j=1,ydsc%NUMFLDS
1245  pfld(:,:,yd(j)%MP1) = ydcom%VALUE
1246  ENDDO
1247 ELSEIF(cdact == 'SETALLTOVAL') THEN
1248  DO j=1,ydsc%NDIM
1249  pfld(:,:,j) = ydcom%VALUE
1250  ENDDO
1251 ELSEIF(cdact == 'SETDEFAULT') THEN
1252  DO j=1,ydsc%NUMFLDS
1253  DO jlev=1,ydsc%NLEVS
1254  IF(yd(j)%NREQIN(jlev) == -1) THEN
1255  pfld(:,jlev,yd(j)%MP) = yd(j)%REFVALI(jlev)
1256  ENDIF
1257  ENDDO
1258  ENDDO
1259 ELSEIF(cdact == 'TRAJSTORE') THEN
1260  IF(ydsc%NDIM5 > 0 ) THEN
1261  iptr = ydsc%NOFFTRAJ
1262  DO j=1,ydsc%NUMFLDS
1263  IF(yd(j)%ITRAJ == 1) THEN
1264  DO jlev=1,ydsc%NLEVS
1265  iptr = iptr+1
1266  pfield(:,iptr) = pfld(:,jlev,yd(j)%MP)
1267  ENDDO
1268  ENDIF
1269  ENDDO
1270  ENDIF
1271 ELSEIF(cdact == 'TRAJSTORECST') THEN
1272  IF(ydsc%NDIM5 > 0 ) THEN
1273  iptr2 = ydsc%NOFFTRAJ_CST
1274  DO j=1,ydsc%NUMFLDS
1275  IF(yd(j)%ITRAJ == 2) THEN
1276  DO jlev=1,ydsc%NLEVS
1277  iptr2 = iptr2+1
1278  pfield(:,iptr2) = pfld(:,jlev,yd(j)%MP)
1279  ENDDO
1280  ENDIF
1281  ENDDO
1282  ENDIF
1283 ELSEIF(cdact == 'SET0TOTRAJ') THEN
1284  IF(ydsc%NDIM5 > 0 ) THEN
1285  iptr = ydsc%NOFFTRAJ
1286  DO j=1,ydsc%NUMFLDS
1287  IF(yd(j)%ITRAJ == 1) THEN
1288  DO jlev=1,ydsc%NLEVS
1289  iptr = iptr+1
1290  pfld(:,jlev,yd(j)%MP) = pfield(:,iptr)
1291  ENDDO
1292  ENDIF
1293  ENDDO
1294  ENDIF
1295 ELSEIF(cdact == 'GETTRAJ') THEN
1296  IF(ydsc%NDIM5 > 0 ) THEN
1297  iptr = ydsc%NOFFTRAJ
1298  iptr2 = ydsc%NOFFTRAJ_CST
1299  DO j=1,ydsc%NUMFLDS
1300  IF(yd(j)%ITRAJ == 1) THEN
1301  DO jlev=1,ydsc%NLEVS
1302  iptr = iptr+1
1303  pfld(:,jlev,yd(j)%MP5) = pfield(:,iptr)
1304  ENDDO
1305  ELSEIF(yd(j)%ITRAJ == 2) THEN
1306  DO jlev=1,ydsc%NLEVS
1307  iptr2 = iptr2+1
1308  pfld(:,jlev,yd(j)%MP5) = pfield2(:,iptr2)
1309  ENDDO
1310  ENDIF
1311  ENDDO
1312  ENDIF
1313 ELSEIF(cdact == 'GETALLFLDS') THEN
1314  DO j=1,ydsc%NDIM
1315  DO jlev=1,ydsc%NLEVS
1316  nptrsurf = nptrsurf+1
1317  pfield(:,nptrsurf) = pfld(:,jlev,j)
1318  ENDDO
1319  ENDDO
1320 ELSEIF(cdact == 'PUTALLFLDS') THEN
1321  DO j=1,ydsc%NDIM
1322  DO jlev=1,ydsc%NLEVS
1323  nptrsurf = nptrsurf+1
1324  pfld(:,jlev,j) = pfield(:,nptrsurf)
1325  ENDDO
1326  ENDDO
1327 ELSEIF(cdact == 'GETGRIBPOS') THEN
1328  DO j=1,ydsc%NUMFLDS
1329  DO jlev=1,ydsc%NLEVS
1330  ydcom%IPTRSURF = ydcom%IPTRSURF+1
1331  IF(yd(j)%IGRBCODE(jlev) == ydcom%IGRBCODE) THEN
1332  ydcom%IFLDNUM = ydcom%IPTRSURF
1333  ydcom%L_OK = .true.
1334  ENDIF
1335  ENDDO
1336  ENDDO
1337 ELSEIF(cdact == 'GETFIELD') THEN
1338  DO j=1,ydsc%NUMFLDS
1339  DO jlev=1,ydsc%NLEVS
1340  ydcom%IPTRSURF = ydcom%IPTRSURF+1
1341  IF(ydcom%IPTRSURF == ydcom%IFLDNUM) THEN
1342  pfield(:,1) = pfld(:,jlev,j)
1343  ydcom%L_OK = .true.
1344  ENDIF
1345  ENDDO
1346  ENDDO
1347 ELSEIF(cdact == 'GRIBIN') THEN
1348  DO j=1,ydsc%NUMFLDS
1349  DO jlev=1,ydsc%NLEVS
1350  ydcom%IPTRSURF = ydcom%IPTRSURF+1
1351  IF(yd(j)%NREQIN(jlev) == 1) THEN
1352  ydcom%ICOUNT = ydcom%ICOUNT+1
1353  ydcom%ICODES(ydcom%ICOUNT) = yd(j)%IGRBCODE(jlev)
1354  ENDIF
1355  ENDDO
1356  ENDDO
1357 ELSE
1358  WRITE(nulout,*) 'SURFACE_FIELD:GPPOPER UNKNOWN ACTION - ',cdact
1359  CALL abor1('SURFACE_FIELD:GPPOPER - UNKNOWN ACTION')
1360 ENDIF
1361 IF (lhook) CALL dr_hook('SURFACE_FIELDS:GPOPER_3',1,zhook_handle)
1362 END SUBROUTINE gpoper_3
1363 
1364 !=========================================================================
1365 
1366 SUBROUTINE surf_store
1367 ! Store all surface fields
1368 INTEGER(KIND=JPIM) :: JBL
1369 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1370 
1371 IF (lhook) CALL dr_hook('SURFACE_FIELDS:SURF_STORE',0,zhook_handle)
1373 DO jbl=1,ngpblks
1374  CALL gpoper('GETALLFLDS',kbl=jbl,pfield=surf_store_array(:,:,jbl))
1375 ENDDO
1376 IF (lhook) CALL dr_hook('SURFACE_FIELDS:SURF_STORE',1,zhook_handle)
1377 END SUBROUTINE surf_store
1378 
1379 !=========================================================================
1380 
1381 SUBROUTINE surf_restore
1382 ! Restore all surface fields
1383 INTEGER(KIND=JPIM) :: JBL
1384 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1385 
1386 IF (lhook) CALL dr_hook('SURFACE_FIELDS:SURF_RESTORE',0,zhook_handle)
1387 IF(.NOT. ALLOCATED(surf_store_array)) &
1388  & CALL abor1('SURFACE_FIELDS:SURF_RESTORE - SURF_STORE NOT ALLOCATED')
1389 DO jbl=1,ngpblks
1390  CALL gpoper('PUTALLFLDS',kbl=jbl,pfield=surf_store_array(:,:,jbl))
1391 ENDDO
1392 DEALLOCATE(surf_store_array)
1393 IF (lhook) CALL dr_hook('SURFACE_FIELDS:SURF_RESTORE',1,zhook_handle)
1394 
1395 END SUBROUTINE surf_restore
1396 
1397 !=========================================================================
1398 
1399 SUBROUTINE allo_surf
1400 ! Allocate surface field arrays
1401 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1402 
1403 IF (lhook) CALL dr_hook('SURFACE_FIELDS:ALLO_SURF',0,zhook_handle)
1404 ALLOCATE(sp_sb(nproma,ysp_sbd%NLEVS,ysp_sbd%NDIM,ngpblks))
1405 ALLOCATE(sp_sg(nproma,ysp_sgd%NDIM,ngpblks))
1406 ALLOCATE(sp_rr(nproma,ysp_rrd%NDIM,ngpblks))
1407 ALLOCATE(sp_ep(nproma,ysp_epd%NLEVS,ysp_epd%NDIM,ngpblks))
1408 ALLOCATE(sp_x2(nproma,ysp_x2d%NDIM,ngpblks))
1409 ALLOCATE(sp_ci(nproma,ysp_cid%NDIM,ngpblks))
1410 ALLOCATE(sd_vf(nproma,ysd_vfd%NDIM,ngpblks))
1411 ALLOCATE(sd_vp(nproma,ysd_vpd%NDIM,ngpblks))
1412 ALLOCATE(sd_vv(nproma,ysd_vvd%NDIM,ngpblks))
1413 ALLOCATE(sd_vn(nproma,ysd_vnd%NDIM,ngpblks))
1414 ALLOCATE(sd_vh(nproma,ysd_vhd%NDIM,ngpblks))
1415 ALLOCATE(sd_va(nproma,ysd_vad%NDIM,ngpblks))
1416 ALLOCATE(sd_vc(nproma,ysd_vcd%NDIM,ngpblks))
1417 ALLOCATE(sd_vd(nproma,ysd_vdd%NDIM,ngpblks))
1418 ALLOCATE(sd_ws(nproma,ysd_wsd%NDIM,ngpblks))
1419 ALLOCATE(sd_xa(nproma,ysd_xad%NLEVS,ysd_xad%NDIM,ngpblks))
1420 ALLOCATE(sd_x2(nproma,ysd_x2d%NDIM,ngpblks))
1421 ALLOCATE(sd_vx(nproma,ysd_vxd%NDIM,ngpblks))
1422 
1423 IF (lhook) CALL dr_hook('SURFACE_FIELDS:ALLO_SURF',1,zhook_handle)
1424 END SUBROUTINE allo_surf
1425 
1426 !=========================================================================
1427 
1428 SUBROUTINE deallo_surf
1429 ! Deallocate surface field arrays
1430 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1431 
1432 IF (lhook) CALL dr_hook('SURFACE_FIELDS:DEALLO_SURF',0,zhook_handle)
1433 IF(ALLOCATED(sp_sb)) DEALLOCATE(sp_sb)
1434 IF(ALLOCATED(sp_sg)) DEALLOCATE(sp_sg)
1435 IF(ALLOCATED(sp_rr)) DEALLOCATE(sp_rr)
1436 IF(ALLOCATED(sp_ep)) DEALLOCATE(sp_ep)
1437 IF(ALLOCATED(sp_x2)) DEALLOCATE(sp_x2)
1438 IF(ALLOCATED(sp_ci)) DEALLOCATE(sp_ci)
1439 IF(ALLOCATED(sd_vf)) DEALLOCATE(sd_vf)
1440 IF(ALLOCATED(sd_vp)) DEALLOCATE(sd_vp)
1441 IF(ALLOCATED(sd_vv)) DEALLOCATE(sd_vv)
1442 IF(ALLOCATED(sd_vn)) DEALLOCATE(sd_vn)
1443 IF(ALLOCATED(sd_vh)) DEALLOCATE(sd_vh)
1444 IF(ALLOCATED(sd_va)) DEALLOCATE(sd_va)
1445 IF(ALLOCATED(sd_vc)) DEALLOCATE(sd_vc)
1446 IF(ALLOCATED(sd_vd)) DEALLOCATE(sd_vd)
1447 IF(ALLOCATED(sd_ws)) DEALLOCATE(sd_ws)
1448 IF(ALLOCATED(sd_xa)) DEALLOCATE(sd_xa)
1449 IF(ALLOCATED(sd_x2)) DEALLOCATE(sd_x2)
1450 IF(ALLOCATED(sd_vx)) DEALLOCATE(sd_vx)
1451 IF (lhook) CALL dr_hook('SURFACE_FIELDS:DEALLO_SURF',1,zhook_handle)
1452 END SUBROUTINE deallo_surf
1453 
1454 !=========================================================================
1455 
1456 END MODULE surface_fields
subroutine ini_sflp2(YDSC, YD, KFLDS, LDMTL, CDGRPNAME)
integer(kind=jpim) nofftraj_cst
real(kind=jprb), dimension(:,:,:), allocatable sd_vh
integer(kind=jpim) nundefld
Definition: yomdim.F90:227
type(type_sfl_vextr2) ysd_x2
type(type_sfl_vclix) ysd_vx
real(kind=jprb), dimension(:,:,:,:), allocatable sp_sb
type(type_sfl_vclia) ysd_va
type(type_surf_gen) ysp_x2d
type(type_surf_gen) ysd_xad
subroutine gpoper(CDACT, KBL, PSP_SB, PSP_SG, PSP_RR, PSD_VF, PSD_VV, YDCOM, PFIELD, PFIELD2)
type(type_sfl_vclin) ysd_vn
integer(kind=jpim) nsurf
type(type_surf_gen) ysd_vvd
type(type_surf_gen) ysd_vfd
type(type_surf_gen) ysd_vxd
integer(kind=jpim) nsurfl
real(kind=jprb), dimension(:,:,:), allocatable sd_vd
type(type_sfl_waves) ysd_ws
real(kind=jprb), dimension(:,:,:), allocatable sp_rr
real(kind=jprb), dimension(:,:,:), allocatable sd_ws
real(kind=jprb), dimension(:,:,:), allocatable sd_vn
real(kind=jprb), dimension(:,:,:), allocatable sp_x2
logical ltwotl
Definition: yomct0.F90:360
integer(kind=jpim) nproma
Definition: yomdim.F90:87
real(kind=jprb), dimension(:,:,:), allocatable sd_vx
subroutine abor1(CDTEXT)
Definition: abor1.F90:2
type(type_surf_gen) ysd_vcd
Definition: yomct0.F90:1
type(type_sfl_canri) ysp_ci
subroutine deallo_surf
type(type_sfl_vclih) ysd_vh
type(type_sfl_resvr) ysp_rr
real(kind=jprb), dimension(:,:,:), allocatable sp_sg
real(kind=jprb), dimension(:,:,:,:), allocatable sp_ep
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
Definition: calcul_STDlev.h:26
subroutine ini_sflp3(YDSC, YD, KFLDS, KLEVS, LDMTL, CDGRPNAME)
type(type_surf_gen) ysd_vhd
real(kind=jprb), dimension(:,:,:), allocatable sp_ci
type(type_sfl_vdiag) ysd_vd
integer, parameter jprb
Definition: parkind1.F90:31
real(kind=jprb), dimension(:,:,:), allocatable sd_vp
type(type_sfl_extrp) ysp_ep
real(kind=jprb), dimension(:,:,:,:), allocatable sd_xa
integer(kind=jpim), parameter jpmaxsflds
integer(kind=jpim) nprogsurfl
type(type_surf_gen) ysd_vdd
subroutine setup_sflp2(YDSC, YD, KGRIB, CDNAME, PDEFAULT, KTRAJ, KREQIN)
subroutine gppoper(CDACT, KBL, PSP_SB, PSP_SG, PSP_RR, PSP_EP, PSP_X2, YDCOM)
type(type_sfl_varsf) ysd_vf
real(kind=jprb), dimension(:,:,:), allocatable surf_store_array
Definition: yomdim.F90:1
Definition: yomlun.F90:1
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
integer(kind=jpim), dimension(jpmaxstraj) nstrajgrib
type(type_surf_gen) ysp_rrd
subroutine setup_sflp3(YDSC, YD, KGRIB, CDNAME, PDEFAULT, KTRAJ, KREQIN)
integer(kind=jpim) ndimsurf
logical lhook
Definition: yomhook.F90:12
type(type_surf_gen) ysp_sgd
type(type_sfl_xtrp2) ysp_x2
type(type_sfl_vo3abc) ysd_vc
subroutine gpoper_2(CDACT, PFLD, YDSC, YD, YDCOM, PFIELD, PFIELD2)
subroutine surf_store
type(type_sfl_soilb) ysp_sb
type(type_sfl_vextra) ysd_xa
type(type_sfl_snowg) ysp_sg
real(kind=jprb), dimension(:,:,:), allocatable sd_va
integer(kind=jpim) nprogsurf
subroutine dr_hook(CDNAME, KSWITCH, PKEY)
Definition: yomhook.F90:17
type(type_surf_gen) ysd_vad
Definition: yomdyn.F90:1
type(type_surf_gen) ysp_sbd
type(type_sfl_vclip) ysd_vp
subroutine gpoper_3(CDACT, PFLD, YDSC, YD, YDCOM, PFIELD, PFIELD2)
integer, parameter jpim
Definition: parkind1.F90:13
integer(kind=jpim), parameter jpmaxstraj
type(type_surf_gen) ysp_epd
integer(kind=jpim) ngpblks
Definition: yomdim.F90:97
type(type_surf_gen) ysd_x2d
real(kind=jprb), dimension(:,:,:), allocatable sd_vv
real(kind=jprb), dimension(:,:,:), allocatable sd_vf
subroutine allo_surf
type(type_sfl_vcliv) ysd_vv
real(kind=jprb), dimension(:,:,:), allocatable sd_x2
real(kind=jprb), dimension(:,:,:), allocatable sd_vc
subroutine surf_restore
type(type_surf_gen) ysd_vpd
integer(kind=jpim) ndimsurfl
type(type_surf_gen) ysd_wsd
integer(kind=jpim) nofftraj
type(type_surf_gen) ysp_cid
integer(kind=jpim) nptrsurf
type(type_surf_gen) ysd_vnd
real(kind=jprb) repsp1
Definition: yomdyn.F90:31