SURFEX v8.1
General documentation of Surfex
soilgrid.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 soilgrid(PSOILGRID, PSOILDEPTH, PDG, KWG_LAYER )
7 
8 ! ##########################################################################
9 !
10 !!**** *SOILGRID*
11 !!
12 !! PURPOSE
13 !! -------
14 !
15 ! Calculates the soil grid configuration using a reference grid
16 ! Also compute the root fraction
17 !
18 !
19 !!** METHOD
20 !! ------
21 !
22 ! Direct calculation
23 !
24 !! EXTERNAL
25 !! --------
26 !
27 ! None
28 !!
29 !! IMPLICIT ARGUMENTS
30 !! ------------------
31 !!
32 !! REFERENCE
33 !! ---------
34 !!
35 !! Noilhan and Planton (1989)
36 !! Belair (1995)
37 !! Boone (2000)
38 !! Boone et al. (2000)
39 !! Habets et al. (2003)
40 !! Decharme et al. (2011)
41 !!
42 !! AUTHOR
43 !! ------
44 !! A. Boone * Meteo-France *
45 !! new version :
46 !! B. Decharme * Meteo-France *
47 !!
48 !! MODIFICATIONS
49 !! -------------
50 !! Original 12/04/03
51 !! new version :10/08/2011
52 !! modif : 09/2012 soildepth can reach 12m (permafrost)
53 !! bug coef algo
54 !-------------------------------------------------------------------------------
55 !
56 !* 0. DECLARATIONS
57 ! ------------
58 !
59 USE modd_surf_par, ONLY : xundef, nundef
60 USE modd_isba_par, ONLY : noptimlayer, xoptimgrid
61 !
62 USE modi_abor1_sfx
63 !
64 USE yomhook ,ONLY : lhook, dr_hook
65 USE parkind1 ,ONLY : jprb
66 !
67 IMPLICIT NONE
68 !
69 !* 0.1 declarations of arguments
70 !
71 REAL, DIMENSION(:), INTENT(IN) :: psoilgrid ! reference soil grid (m)
72 REAL, DIMENSION(:), INTENT(IN) :: psoildepth ! total soil depth (m)
73 REAL, DIMENSION(:,:), INTENT(OUT) :: pdg ! depth of base of soil layers (m)
74 INTEGER, DIMENSION(:), INTENT(OUT) :: kwg_layer ! last layers for soil moisture
75 !
76 !* 0.2 declarations of local variables
77 !
78 REAL,DIMENSION(SIZE(PDG,1)) :: zref
79 !
80 REAL :: zwork
81 !
82 INTEGER :: ini,inl
83 INTEGER :: jj,jl
84 !
85 LOGICAL :: loptimgrid
86 !
87 REAL(KIND=JPRB) :: zhook_handle
88 !-------------------------------------------------------------------------------
89 ! 0. Initialization
90 ! --------------
91 !
92 IF (lhook) CALL dr_hook('SOILGRID',0,zhook_handle)
93 !
94 ini = SIZE(pdg,1)
95 inl = SIZE(pdg,2)
96 !
97 kwg_layer(:) = 0
98 zref(:) = xundef
99 !
100 !-------------------------------------------------------------------------------
101 !
102 !* 1. Grid configuration
103 ! ------------------
104 !
105 !* 1.1 Check consistency
106 ! -----------------
107 !
108 loptimgrid=.false.
109 IF(inl==noptimlayer) THEN
110  IF( all(psoilgrid(1:inl)==xoptimgrid(1:noptimlayer)) ) loptimgrid=.true.
111 ENDIF
112 !
113 !* 1.2 Assign soil layer depths if ECOCLIMAP
114 ! -------------------------------------
115 !
116 IF(loptimgrid)THEN
117  !
118  !Optimized ECOCLIMAP soil grid
119  CALL optimsoilgrid
120  !
121 ELSE
122  !
123  WHERE(psoildepth(:)/=xundef)
124  pdg(:,1)=min(0.01,psoilgrid(1))
125  ELSEWHERE
126  pdg(:,1)=xundef
127  ENDWHERE
128  !
129  DO jj=1,ini
130  !
131  IF( psoildepth(jj)==xundef )THEN
132  !
133  pdg(jj,:) = xundef
134  kwg_layer(jj) = nundef
135  !
136  ELSE
137  !
138  DO jl=2,inl
139  !
140  pdg(jj,jl) = psoilgrid(jl)
141  !
142  IF ( psoilgrid(jl)-psoilgrid(jl-1)<=0.3 ) THEN
143  zwork = abs(psoilgrid(jl)-psoildepth(jj))
144  IF(zwork<=zref(jj))THEN
145  kwg_layer(jj) = jl
146  zref(jj) = zwork
147  ENDIF
148  ELSEIF(psoildepth(jj)>=(psoilgrid(jl)*0.3+psoilgrid(jl-1)*0.7))THEN
149  kwg_layer(jj) = jl
150  ENDIF
151  ENDDO
152  !
153  ENDIF
154  ENDDO
155  !
156 ENDIF
157 !
158 IF(any(kwg_layer(:)==0))THEN
159  CALL abor1_sfx('SOILGRID: WITH CISBA=DIF NWG_LAYER MUST BE DEFINED FOR EACH POINT')
160 ENDIF
161 !
162 IF (lhook) CALL dr_hook('SOILGRID',1,zhook_handle)
163 !
164 !-------------------------------------------------------------------------------
165 CONTAINS
166 !-------------------------------------------------------------------------------
167 !
168 SUBROUTINE optimsoilgrid
169 !
170 USE modd_reprod_oper, ONLY : cdgdif
171 !
172 IMPLICIT NONE
173 !
174 ! declarations of local variables
175 !
176 INTEGER, PARAMETER :: ndlim = 13
177 !
178 REAL, DIMENSION(NDLIM), PARAMETER :: zdlim = &
179  (/1.25,1.50,1.75,2.00,2.25,2.50,2.75,3.00,3.50,4.00,4.50,5.00,5.50/)
180 !
181 REAL,DIMENSION(SIZE(PDG,1)) :: zdg_water
182 !
183 LOGICAL :: lwork
184 REAL(KIND=JPRB) :: zhook_handle
185 !
186 !-------------------------------------------------------------------------------
187 ! init
188 !
189 IF (lhook) CALL dr_hook('SOILGRID:OPTIMSOILGRID',0,zhook_handle)
190 !
191 zdg_water(:) = xundef
192 !
193 !-------------------------------------------------------------------------------
194 !a. Arranged depth
195 !
196 IF(cdgdif=='ROOT')THEN
197 !
198  DO jj=1,ini
199  IF(psoildepth(jj)<=1.1)THEN
200  zdg_water(jj)=min(1.0,psoildepth(jj))
201  ELSEIF(psoildepth(jj)>1.1.AND.psoildepth(jj)<=1.25)THEN
202  zdg_water(jj)=1.25
203  ELSEIF(psoildepth(jj)>5.50.AND.psoildepth(jj)<=8.00)THEN
204  zdg_water(jj)=8.00
205  ELSEIF(psoildepth(jj)>8.00.AND.psoildepth(jj)<xundef)THEN
206  zdg_water(jj)=12.00 ! Permafrost case
207  ELSE
208  DO jl=1,ndlim-1
209  IF(psoildepth(jj)>zdlim(jl).AND.psoildepth(jj)<=zdlim(jl+1))THEN
210  zdg_water(jj)=merge(zdlim(jl),zdlim(jl+1),psoildepth(jj)<(0.8*zdlim(jl)+0.2*zdlim(jl+1)))
211  ENDIF
212  ENDDO
213  ENDIF
214  ENDDO
215 !
216 ELSE
217 !
218  DO jj=1,ini
219  IF(psoildepth(jj)<1.25)THEN
220  zdg_water(jj)=min(1.0,psoildepth(jj))
221  ELSEIF(psoildepth(jj)>=5.50.AND.psoildepth(jj)<6.50)THEN
222  zdg_water(jj)=5.50
223  ELSEIF(psoildepth(jj)>=6.50.AND.psoildepth(jj)<10.50)THEN
224  zdg_water(jj)=8.00
225  ELSEIF(psoildepth(jj)>=10.50.AND.psoildepth(jj)<xundef)THEN
226  zdg_water(jj)=12.00 ! Permafrost case
227  ELSE
228  DO jl=1,ndlim-1
229  IF(psoildepth(jj)>=zdlim(jl).AND.psoildepth(jj)<zdlim(jl+1))THEN
230  zdg_water(jj)=merge(zdlim(jl),zdlim(jl+1),psoildepth(jj)<(0.4*zdlim(jl)+0.6*zdlim(jl+1)))
231  ENDIF
232  ENDDO
233  ENDIF
234  ENDDO
235 !
236 ENDIF
237 !
238 !-------------------------------------------------------------------------------
239 !b. General cases
240 !
241  DO jj=1,ini
242  !
243  IF(psoildepth(jj)==xundef)THEN
244  !
245  pdg(jj,:) = xundef
246  kwg_layer(jj) = nundef
247  !
248  ELSE
249  !
250  pdg(jj,:) = psoilgrid(:)
251  !
252  lwork=(zdg_water(jj)<=1.0.OR.&
253  zdg_water(jj)==1.5.OR.&
254  zdg_water(jj)==2.0.OR.&
255  zdg_water(jj)==3.0.OR.&
256  zdg_water(jj)==5.0.OR.&
257  zdg_water(jj)==8.0.OR.&
258  zdg_water(jj)==12.0 )
259  !
260  IF (lwork) THEN
261  DO jl=2,inl
262  zwork = abs(psoilgrid(jl)-zdg_water(jj))
263  IF(zwork<=zref(jj))THEN
264  kwg_layer(jj)=jl
265  zref(jj)=zwork
266  ENDIF
267  ENDDO
268  ENDIF
269  !
270  ENDIF
271  !
272  ENDDO
273 !
274 !-------------------------------------------------------------------------------
275 !c. Particular cases
276 !
277 WHERE (zdg_water(:)==1.25)
278  kwg_layer(:) = 9
279  pdg(:,9) = zdg_water(:)
280 ELSEWHERE (zdg_water(:)==1.75 .OR. zdg_water(:)==2.25)
281  kwg_layer(:) = 10
282  pdg(:,10) = zdg_water(:)
283  WHERE (zdg_water(:)==1.75) pdg(:,9) = 1.25
284 ELSEWHERE (zdg_water(:)==2.50 .OR. zdg_water(:)==2.75 .OR. zdg_water(:)==3.50)
285  kwg_layer(:) = 11
286  pdg(:,11) = zdg_water(:)
287 ELSEWHERE (zdg_water(:)==4.00 .OR. zdg_water(:)==4.50 .OR. zdg_water(:)==5.50)
288  kwg_layer(:) = 12
289  pdg(:,12) = zdg_water(:)
290 ENDWHERE
291 !
292 IF (lhook) CALL dr_hook('SOILGRID:OPTIMSOILGRID',1,zhook_handle)
293 !
294 END SUBROUTINE optimsoilgrid
295 !
296 !-------------------------------------------------------------------------------
297 END SUBROUTINE soilgrid
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
character(len=4) cdgdif
integer, parameter nundef
logical lhook
Definition: yomhook.F90:15