SURFEX v8.1
General documentation of Surfex
read_sbln.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 read_sbl_n (DTCO, U, SB, OSBL, HPROGRAM, HSURF)
7 ! #########################################
8 !
9 !!**** *READ_SBL_n* - reads TEB fields
10 !!
11 !!
12 !! PURPOSE
13 !! -------
14 !!
15 !!** METHOD
16 !! ------
17 !!
18 !! EXTERNAL
19 !! --------
20 !!
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !!
29 !! AUTHOR
30 !! ------
31 !! V. Masson *Meteo France*
32 !!
33 !! MODIFICATIONS
34 !! -------------
35 !! Original 01/2003
36 !! E. Martin 01/2012 Add LSBL_COLD_START
37 !-------------------------------------------------------------------------------
38 !
39 !* 0. DECLARATIONS
40 ! ------------
41 !
42 !
43 !
44 !
46 USE modd_surf_atm_n, ONLY : surf_atm_t
47 USE modd_canopy_n, ONLY : canopy_t
48 !
49 USE modd_surf_par, ONLY : xundef
50 !
52 USE modi_canopy_grid
53 USE modi_get_type_dim_n
54 !
55 USE yomhook ,ONLY : lhook, dr_hook
56 USE parkind1 ,ONLY : jprb
57 !
58 IMPLICIT NONE
59 !
60 !* 0.1 Declarations of arguments
61 ! -------------------------
62 !
63 !
64 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
65 TYPE(surf_atm_t), INTENT(INOUT) :: U
66 TYPE(canopy_t), INTENT(INOUT) :: SB
67 LOGICAL, INTENT(INOUT) :: OSBL
68 !
69  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! calling program
70  CHARACTER(LEN=6), INTENT(IN) :: HSURF
71 !
72 !
73 !* 0.2 Declarations of local variables
74 ! -------------------------------
75 !
76 !
77  CHARACTER(LEN=8) :: YBASE
78  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
79  CHARACTER(LEN=13) :: YFORMAT
80  CHARACTER(LEN=3) :: YREAD
81 INTEGER :: JLAYER ! loop counter on layers
82 INTEGER :: ILU ! 1D physical dimension
83 INTEGER :: IRESP ! Error code after redding
84 INTEGER :: IVERSION, IBUGFIX ! surface version
85 REAL(KIND=JPRB) :: ZHOOK_HANDLE
86 !-------------------------------------------------------------------------------
87 !
88 !* 1D physical dimension
89 !
90 IF (lhook) CALL dr_hook('READ_SBL_N',0,zhook_handle)
91 !
92  CALL get_type_dim_n(dtco, u, hsurf, ilu)
93 !
94 !* flag to use or not canopy levels
95 !
96 yrecfm='VERSION'
97  CALL read_surf(hprogram,yrecfm,iversion,iresp)
98 !
99 yrecfm='BUG'
100  CALL read_surf(hprogram,yrecfm,ibugfix,iresp)
101 !
102 IF (iversion<3) THEN
103  osbl = .false.
104 ELSE
105  IF (hsurf=="TOWN ") THEN
106  yrecfm='TEB_CANOPY'
107  ELSEIF (hsurf=="WATER ") THEN
108  yrecfm='WAT_SBL'
109  ELSEIF (hsurf=="NATURE") THEN
110  yrecfm='ISBA_CANOPY'
111  ELSEIF (hsurf=="SEA ") THEN
112  yrecfm='SEA_SBL'
113  ENDIF
114  CALL read_surf(hprogram,yrecfm,osbl,iresp)
115 END IF
116 !
117 IF (.NOT.osbl) THEN
118  ALLOCATE(sb%XZ (0,0))
119  ALLOCATE(sb%XU (0,0))
120  ALLOCATE(sb%XT (0,0))
121  ALLOCATE(sb%XQ (0,0))
122  ALLOCATE(sb%XTKE(0,0))
123  ALLOCATE(sb%XLMO(0,0))
124  ALLOCATE(sb%XP (0,0))
125  IF (hsurf=="TOWN ") THEN
126  ALLOCATE(sb%XLM (0,0))
127  ALLOCATE(sb%XLEPS(0,0))
128  ENDIF
129  ALLOCATE(sb%XDZ (0,0))
130  ALLOCATE(sb%XZF (0,0))
131  ALLOCATE(sb%XDZF(0,0))
132  IF (lhook) CALL dr_hook('READ_SBL_N',1,zhook_handle)
133  RETURN
134 ENDIF
135 !
136 !* number of vertical levels
137 !
138 IF (hsurf=="TOWN ") THEN
139  ybase = "TEB_CAN "
140 ELSEIF (hsurf=="WATER ") THEN
141  ybase = "WAT_SBL "
142 ELSEIF (hsurf=="NATURE") THEN
143  ybase = "ISBA_CAN"
144 ELSEIF (hsurf=="SEA ") THEN
145  ybase = "SEA_SBL "
146 ENDIF
147 !
148 IF (hsurf=="NATURE") THEN
149  yformat='(A10,I2.2)'
150 ELSE
151  yformat='(A9,I2.2) '
152 ENDIF
153 !
154 yrecfm=trim(ybase)//'_LVL'
155  CALL read_surf(hprogram,yrecfm,sb%NLVL,iresp)
156 !
157 !* 2. Prognostic fields:
158 ! -----------------
159 !
160 !* altitudes
161 !
162 ALLOCATE(sb%XZ(ilu,sb%NLVL))
163 !
164 DO jlayer=1,sb%NLVL
165  WRITE(yrecfm,yformat) trim(ybase)//'_Z',jlayer
166  CALL read_surf(hprogram,yrecfm,sb%XZ(:,jlayer),iresp)
167 END DO
168 !
169 ALLOCATE(sb%XU (ilu,sb%NLVL))
170 ALLOCATE(sb%XT (ilu,sb%NLVL))
171 ALLOCATE(sb%XQ (ilu,sb%NLVL))
172 ALLOCATE(sb%XTKE(ilu,sb%NLVL))
173 ALLOCATE(sb%XLMO(ilu,sb%NLVL))
174 ALLOCATE(sb%XP (ilu,sb%NLVL))
175 !
176 IF (iversion>7 .OR. iversion==7 .AND.ibugfix>=2) THEN
177  yrecfm='STORAGETYPE'
178  CALL read_surf(hprogram,yrecfm,yread,iresp)
179 ELSE
180  yread = 'ALL'
181 ENDIF
182 !
183 IF(yread=='ALL') THEN
184  !
185  !* wind in SBL
186  DO jlayer=1,sb%NLVL
187  WRITE(yrecfm,yformat) trim(ybase)//'_U',jlayer
188  CALL read_surf(hprogram,yrecfm,sb%XU(:,jlayer),iresp)
189  END DO
190  !
191  !* theta in SBL
192  DO jlayer=1,sb%NLVL
193  WRITE(yrecfm,yformat) trim(ybase)//'_T',jlayer
194  CALL read_surf(hprogram,yrecfm,sb%XT(:,jlayer),iresp)
195  END DO
196  !
197  !* humidity in SBL
198  DO jlayer=1,sb%NLVL
199  WRITE(yrecfm,yformat) trim(ybase)//'_Q',jlayer
200  CALL read_surf( hprogram,yrecfm,sb%XQ(:,jlayer),iresp)
201  END DO
202  !
203  !* Tke in SBL
204  DO jlayer=1,sb%NLVL
205  WRITE(yrecfm,yformat) trim(ybase)//'_E',jlayer
206  CALL read_surf(hprogram,yrecfm,sb%XTKE(:,jlayer),iresp)
207  END DO
208  !
209  !* Monin-Obhukov length
210  IF (iversion<7 .OR. hsurf/="TOWN ") THEN
211  yrecfm=trim(ybase)//'_LMO '
212  CALL read_surf(hprogram,yrecfm,sb%XLMO(:,1),iresp)
213  DO jlayer = 2,sb%NLVL
214  sb%XLMO(:,jlayer) = sb%XLMO(:,1)
215  ENDDO
216  ELSE
217  DO jlayer=1,sb%NLVL
218  WRITE(yrecfm,'(A10,I2.2)') trim(ybase)//'_MO',jlayer
219  CALL read_surf(hprogram,yrecfm,sb%XLMO(:,jlayer),iresp)
220  ENDDO
221  ENDIF
222  !
223  !* Pressure
224  DO jlayer=1,sb%NLVL
225  WRITE(yrecfm,yformat) trim(ybase)//'_P',jlayer
226  CALL read_surf(hprogram,yrecfm,sb%XP(:,jlayer),iresp)
227  END DO
228  !
229 ELSE
230  sb%XU (:,:) = xundef
231  sb%XT (:,:) = xundef
232  sb%XQ (:,:) = xundef
233  sb%XTKE(:,:) = xundef
234  sb%XLMO(:,:) = xundef
235  sb%XP (:,:) = xundef
236 ENDIF
237 !
238 IF (hsurf=="TOWN ") THEN
239  !
240  !* mixing length
241  !
242  ALLOCATE(sb%XLM(ilu,sb%NLVL))
243  !
244  !* dissipative length
245  !
246  ALLOCATE(sb%XLEPS(ilu,sb%NLVL))
247  !
248 ENDIF
249 !
250 !
251 !* Grid characteristics
252 !
253 !
254 ! --------------------------------- XZ(k+1) XDZ(k+1)
255 ! ^
256 ! |
257 ! |
258 ! - - - - - - - - - - - - - - - - - XZf(k+1) | XDZf(k+1)
259 ! ^ |
260 ! | |
261 ! --------------------------------- XZ(k), XU, XT, XQ, XTKE | XDZ(k) V
262 ! | ^
263 ! - - - - - - - - - - - - - - - - - XZf(k) V | XDZf(k)
264 ! --------------------------------- XZ(k-1) XDZ(k-1) V
265 ! - - - - - - - - - - - - - - - - - XZf(k-1)
266 !
267 ALLOCATE(sb%XDZ (ilu,sb%NLVL))
268 ALLOCATE(sb%XZF (ilu,sb%NLVL))
269 ALLOCATE(sb%XDZF(ilu,sb%NLVL))
270 !
271  CALL canopy_grid(ilu,sb)
272 !
273 IF (lhook) CALL dr_hook('READ_SBL_N',1,zhook_handle)
274 !-------------------------------------------------------------------------------
275 !
276 END SUBROUTINE read_sbl_n
subroutine get_type_dim_n(DTCO, U, HTYPE, KDIM)
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine read_sbl_n(DTCO, U, SB, OSBL, HPROGRAM, HSURF)
Definition: read_sbln.F90:7
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine canopy_grid(KI, SB)
Definition: canopy_grid.F90:7