SURFEX v8.1
General documentation of Surfex
pgd_flake.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 pgd_flake (DTCO, FG, F, UG, U, USS, HPROGRAM,ORM_RIVER)
7 ! ##############################################################
8 !
9 !!**** *PGD_FLAKE* monitor for averaging and interpolations of FLAKE physiographic fields
10 !!
11 !! PURPOSE
12 !! -------
13 !!
14 !! METHOD
15 !! ------
16 !!
17 !
18 !! EXTERNAL
19 !! --------
20 !!
21 !! IMPLICIT ARGUMENTS
22 !! ------------------
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !! AUTHOR
28 !! ------
29 !!
30 !! V. Masson Meteo-France
31 !!
32 !! MODIFICATION
33 !! ------------
34 !!
35 !! Original 03/2004
36 !! 04/2013, P. Le Moigne : allow limitation of lake depth
37 !!
38 !----------------------------------------------------------------------------
39 !
40 !* 0. DECLARATION
41 ! -----------
42 !
43 !
44 USE modd_surfex_mpi, ONLY : nrank, npio
45 !
47 USE modd_sfx_grid_n, ONLY : grid_t
48 USE modd_flake_n, ONLY : flake_t
50 USE modd_surf_atm_n, ONLY : surf_atm_t
51 USE modd_sso_n, ONLY : sso_t
52 !
54 USE modd_data_cover_par, ONLY : jpcover
55 USE modd_surf_par, ONLY : xundef
56 !
57 USE modd_pgdwork, ONLY : catype
58 !
59 !
60 USE modi_abor1_sfx
61 USE modi_get_luout
63 
64 USE modi_get_surf_size_n
65 USE modi_pack_pgd
66 !
67 USE modi_open_namelist
68 USE modi_close_namelist
69 !
70 USE modi_treat_global_lake_depth
71 !
72 USE mode_pos_surf
73 !
74 !
75 USE yomhook ,ONLY : lhook, dr_hook
76 USE parkind1 ,ONLY : jprb
77 !
78 USE modi_write_cover_tex_water
79 !
80 IMPLICIT NONE
81 !
82 !* 0.1 Declaration of arguments
83 ! ------------------------
84 !
85 !
86 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
87 TYPE(grid_t), INTENT(INOUT) :: FG
88 TYPE(flake_t), INTENT(INOUT) :: F
89 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
90 TYPE(surf_atm_t), INTENT(INOUT) :: U
91 TYPE(sso_t), INTENT(INOUT) :: USS
92 !
93  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! Type of program
94 LOGICAL, INTENT(IN) :: ORM_RIVER ! delete river coverage (default = false)
95 !
96 !
97 !* 0.2 Declaration of local variables
98 ! ------------------------------
99 !
100 INTEGER :: ILUOUT ! output listing logical unit
101 INTEGER :: ILUNAM ! namelist file logical unit
102 LOGICAL :: GFOUND ! flag when namelist is present
103 INTEGER,DIMENSION(:),ALLOCATABLE :: IWATER_STATUS
104 !
105 !* 0.3 Declaration of namelists
106 ! ------------------------
107 !
108  CHARACTER(LEN=28) :: YWATER_DEPTH ! file name for water depth
109  CHARACTER(LEN=28) :: YWATER_DEPTH_STATUS ! file name for water depth status
110  CHARACTER(LEN=28) :: YWATER_FETCH
111  CHARACTER(LEN=28) :: YT_BS
112  CHARACTER(LEN=28) :: YDEPTH_BS
113  CHARACTER(LEN=28) :: YEXTCOEF_WATER
114 
115  CHARACTER(LEN=6) :: YWATER_DEPTHFILETYPE ! water depth file type
116  CHARACTER(LEN=6) :: YWATER_FETCHFILETYPE
117  CHARACTER(LEN=6) :: YT_BSFILETYPE
118  CHARACTER(LEN=6) :: YDEPTH_BSFILETYPE
119  CHARACTER(LEN=6) :: YEXTCOEF_WATERFILETYPE
120 
121 REAL :: XUNIF_WATER_DEPTH ! uniform value of water depth
122 REAL :: XUNIF_WATER_FETCH
123 REAL :: XUNIF_T_BS
124 REAL :: XUNIF_DEPTH_BS
125 REAL :: XUNIF_EXTCOEF_WATER
126 REAL :: XMAX_DEPTH
127 REAL(KIND=JPRB) :: ZHOOK_HANDLE
128 !
129 NAMELIST/nam_data_flake/ ywater_depth, ywater_depth_status, ywater_depthfiletype, &
130  xunif_water_depth, ywater_fetch, ywater_fetchfiletype, &
131  xunif_water_fetch, yt_bs, yt_bsfiletype, xunif_t_bs, &
132  ydepth_bs, ydepth_bsfiletype, xunif_depth_bs, &
133  yextcoef_water, yextcoef_waterfiletype, xunif_extcoef_water, &
134  xmax_depth
135 !-------------------------------------------------------------------------------
136 !
137 IF (lhook) CALL dr_hook('PGD_FLAKE',0,zhook_handle)
138  CALL get_luout(hprogram,iluout)
139 !
140 !-------------------------------------------------------------------------------
141 !
142 !* 1. Initializations of defaults
143 ! ---------------------------
144 !
145 xunif_water_depth = 10.
146 xunif_water_fetch = 1000.
147 xunif_t_bs = 286.
148 xunif_depth_bs = 1.
149 xunif_extcoef_water= 3.
150 !
151 ywater_depth = ' '
152 ywater_depth_status = ' '
153 ywater_fetch = ' '
154 yt_bs = ' '
155 ydepth_bs = ' '
156 yextcoef_water = ' '
157 !
158 ywater_depthfiletype = ' '
159 ywater_fetchfiletype = ' '
160 yt_bsfiletype = ' '
161 ydepth_bsfiletype = ' '
162 yextcoef_waterfiletype = ' '
163 !
164 xmax_depth = 1.e+20
165 !
166 !-------------------------------------------------------------------------------
167 !
168 !* 2. Reading of namelist
169 ! -------------------
170 !
171  CALL open_namelist(hprogram,ilunam)
172 !
173  CALL posnam(ilunam,'NAM_DATA_FLAKE',gfound,iluout)
174 IF (gfound) READ(unit=ilunam,nml=nam_data_flake)
175 !
176  CALL close_namelist(hprogram,ilunam)
177 !
178 !-------------------------------------------------------------------------------
179 !
180 !* 3. Coherence of options
181 ! --------------------
182 !
183 !-------------------------------------------------------------------------------
184 !
185 !* 4. Number of points and packing
186 ! ----------------------------
187 !
188  CALL get_surf_size_n(dtco, u, 'WATER ',fg%NDIM)
189 !
190 ALLOCATE(f%LCOVER (jpcover))
191 ALLOCATE(f%XZS (fg%NDIM))
192 ALLOCATE(fg%XLAT (fg%NDIM))
193 ALLOCATE(fg%XLON (fg%NDIM))
194 ALLOCATE(fg%XMESH_SIZE (fg%NDIM))
195 !
196  CALL pack_pgd(dtco, u, hprogram, 'WATER ', fg, f%LCOVER, f%XCOVER, f%XZS )
197 !
198 !-------------------------------------------------------------------------------
199 !
200 !* 5. Water depth
201 ! -----------
202 !
203 ALLOCATE(f%XWATER_DEPTH (fg%NDIM))
204 !
205 IF (trim(ywater_depth)==trim(clakeldb) .AND. trim(ywater_depthfiletype)=='DIRECT') THEN
206  !
207  IF (trim(ywater_depth_status)=='') THEN
208  WRITE(iluout,*)'Depth Status file name not initialized'
209  WRITE(iluout,*)'add YWATER_DEPTH_STATUS="GlobalLakeStatus" in NAM_DATA_FLAKE'
210  CALL abor1_sfx('PGD_FLAKE: STATUS INPUT FILE NAME NOT SET')
211  ELSEIF (trim(ywater_depth_status)==trim(cstatusldb)) THEN
212  ALLOCATE(iwater_status(fg%NDIM))
213  CALL treat_global_lake_depth(dtco, ug, u, uss, &
214  hprogram,f%XWATER_DEPTH(:),iwater_status(:))
215  ELSE
216  WRITE(iluout,*)'Wrong name for Depth Status file :',' expected: ',trim(cstatusldb),' input: ',trim(ywater_depth_status)
217  CALL abor1_sfx('PGD_FLAKE: WRONG STATUS INPUT FILE NAME')
218  ENDIF
219  !
220 ELSE
221  !
222  IF(u%LECOCLIMAP.AND.(.NOT.orm_river))THEN
223  WRITE(iluout,*)'With this version of Flake, river must be removed'
224  WRITE(iluout,*)'Indeed, river energy budget can not be computed '
225  WRITE(iluout,*)'using static lake scheme without 2D informations.'
226  WRITE(iluout,*)'Please add LRM_RIVER = T in NAM_COVER '
227  WRITE(iluout,*)' '
228  WRITE(iluout,*)'If you still want to use Flake to comput river '
229  WRITE(iluout,*)'energy budget, please use the two files for the '
230  WRITE(iluout,*)'Kourzeneva 2009 method: ',clakeldb(1:len_trim(clakeldb)),' ',&
231  cstatusldb(1:len_trim(cstatusldb))
232  CALL abor1_sfx('PGD_FLAKE: WITH THIS VERSION OF FLAKE, LRM_RIVER MUST BE TRUE')
233  ENDIF
234  !
235  catype='INV'
236  CALL pgd_field(dtco, ug, u, uss, &
237  hprogram,'water depth','WAT',ywater_depth,ywater_depthfiletype,xunif_water_depth,f%XWATER_DEPTH(:))
238  !
239 ENDIF
240 !
241 f%XWATER_DEPTH(:) = min(f%XWATER_DEPTH(:),xmax_depth)
242 WRITE(iluout,*)'MAXIMUM LAKE DEPTH = ',xmax_depth
243 !
244 !-------------------------------------------------------------------------------
245 !
246 !* 6. Wind fetch
247 ! ----------
248 !
249 ALLOCATE(f%XWATER_FETCH (fg%NDIM))
250 !
251 CATYPE='ARI'
252  CALL pgd_field(dtco, ug, u, uss, &
253  hprogram,'wind fetch','WAT',ywater_fetch,ywater_fetchfiletype,xunif_water_fetch,f%XWATER_FETCH(:))
254 !
255 !-------------------------------------------------------------------------------
256 !
257 !* 7. Sediments bottom temperature
258 ! ----------------------------
259 !
260 ALLOCATE(f%XT_BS (fg%NDIM))
261 !
262 CATYPE='ARI'
263  CALL pgd_field(dtco, ug, u, uss, &
264  hprogram,'sediments bottom temperature ','WAT',yt_bs,yt_bsfiletype,xunif_t_bs,f%XT_BS(:))
265 !
266 !-------------------------------------------------------------------------------
267 !
268 !* 8. Depth of sediments layer
269 ! ------------------------
270 !
271 ALLOCATE(f%XDEPTH_BS (fg%NDIM))
272 !
273 CATYPE='INV'
274  CALL pgd_field(dtco, ug, u, uss, &
275  hprogram,'depth of sediments layer','WAT',ydepth_bs,ydepth_bsfiletype,xunif_depth_bs,f%XDEPTH_BS(:))
276 !
277 !-------------------------------------------------------------------------------
278 !
279 !* 9. Water extinction coefficient
280 ! ----------------------------
281 
282 ALLOCATE(f%XEXTCOEF_WATER(fg%NDIM))
283 !
284 CATYPE='ARI'
285  CALL pgd_field(dtco, ug, u, uss, &
286  hprogram,'water extinction coefficient','WAT', &
287  yextcoef_water,yextcoef_waterfiletype,xunif_extcoef_water, &
288  f%XEXTCOEF_WATER(:))
289 !
290 !-------------------------------------------------------------------------------
291 !
292 !* 10. Prints of flake parameters in a tex file
293 ! ----------------------------------------
294 !
295 IF (nrank==npio) CALL write_cover_tex_water
296 !
297 IF (lhook) CALL dr_hook('PGD_FLAKE',1,zhook_handle)
298 !-------------------------------------------------------------------------------
299 !
300 END SUBROUTINE pgd_flake
subroutine get_surf_size_n(DTCO, U, HTYPE, KL)
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
character(len=3) catype
subroutine pgd_flake(DTCO, FG, F, UG, U, USS, HPROGRAM, ORM_RIVER)
Definition: pgd_flake.F90:7
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
subroutine pack_pgd(DTCO, U, HPROGRAM, HSURF, G, OCOVER, PCOVER,
Definition: pack_pgd.F90:7
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
subroutine close_namelist(HPROGRAM, KLUNAM)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
subroutine treat_global_lake_depth(DTCO, UG, U, USS, HPROGRAM, PDEPTH, KSTATUS)
logical lhook
Definition: yomhook.F90:15
character(len=80), parameter clakeldb
character(len=80), parameter cstatusldb
subroutine open_namelist(HPROGRAM, KLUNAM, HFILE)