SURFEX v8.1
General documentation of Surfex
dif_layer.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 dif_layer(KLU, IO, PK, OMEB_3L )
7 !#############################################################
8 !
9 !!**** *DIF_LAYER_n* - routine to initialize dif numbers of layers
10 !!
11 !! PURPOSE
12 !! -------
13 !!
14 !!** METHOD
15 !! ------
16 !!
17 !! EXTERNAL
18 !! --------
19 !!
20 !!
21 !! IMPLICIT ARGUMENTS
22 !! ------------------
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !!
28 !! AUTHOR
29 !! ------
30 !! S. Faroux
31 !!
32 !! MODIFICATIONS
33 !! -------------
34 !! Original 02/2012!!
35 !-------------------------------------------------------------------------------
36 !
37 !* 0. DECLARATIONS
38 ! ------------
39 !
41 USE modd_isba_n, ONLY : isba_p_t
42 !
43 USE modd_surf_par, ONLY : xundef, nundef
44 USE modd_sgh_par, ONLY : xhort_depth
45 !
46 USE modi_abor1_sfx
47 !
48 USE yomhook ,ONLY : lhook, dr_hook
49 USE parkind1 ,ONLY : jprb
50 !
51 IMPLICIT NONE
52 !
53 !* 0.1 Declarations of arguments
54 ! -------------------------
55 !
56 INTEGER, INTENT(IN) :: KLU
57 !
58 TYPE(isba_options_t), INTENT(INOUT) :: IO
59 TYPE(isba_p_t), INTENT(INOUT) :: PK
60 LOGICAL, INTENT(IN), OPTIONAL :: OMEB_3L
61 !
62 !* 0.2 Declarations of local variables
63 ! -------------------------------
64 !
65 REAL, DIMENSION(KLU) :: ZWORK
66 INTEGER, DIMENSION(KLU) :: IWORK
67 INTEGER :: JL, JI, IDEPTH
68 LOGICAL :: GMEB_3L
69 !
70 REAL(KIND=JPRB) :: ZHOOK_HANDLE
71 !
72 !-------------------------------------------------------------------------------
73 !
74 ! Initialisation for IO
75 !
76 IF (lhook) CALL dr_hook('DIF_LAYER',0,zhook_handle)
77 !
78 gmeb_3l = .false.
79 IF (PRESENT(omeb_3l)) gmeb_3l = omeb_3l
80 !
81 pk%XDZG (:,:) = xundef
82 !
83 !* soil layers thicknesses
84 pk%XDZG(:,1) = pk%XDG(:,1)
85 DO jl=2,io%NGROUND_LAYER
86  DO ji=1,klu
87  pk%XDZG(ji,jl) = pk%XDG(ji,jl) - pk%XDG(ji,jl-1)
88  ENDDO
89 ENDDO
90 !
91 IF (gmeb_3l) THEN
92  IF (lhook) CALL dr_hook('DIF_LAYER',1,zhook_handle)
93  RETURN
94 ENDIF
95 !
96 DO jl = 1, io%NGROUND_LAYER
97  IF (any((pk%XROOTFRAC(:,jl)<0. .OR. pk%XROOTFRAC(:,jl)>1.) .AND. pk%XPATCH(:).NE.0.)) &
98  CALL abor1_sfx('DIF_LAYER: WITH CISBA=DIF ROOTFRAC MUST BE DEFINED')
99 ENDDO
100 !
101 pk%XDZDIF (:,:) = xundef
102 pk%XSOILWGHT(:,:) = 0.0
103 !
104 !* distance between consecuative layer mid-points
105 DO jl=1,io%NGROUND_LAYER
106  DO ji=1,klu
107  IF(jl<io%NGROUND_LAYER)THEN
108  pk%XDZDIF(ji,jl)=0.5*(pk%XDZG(ji,jl)+pk%XDZG(ji,jl+1))
109  ELSE
110  pk%XDZDIF(ji,jl)=0.5*pk%XDZG(ji,jl)
111  ENDIF
112  ENDDO
113 ENDDO
114 !
115 !
116 ! Horton runoff parameter
117 !
118 iwork(:) = pk%NWG_LAYER(:)
119 !
120 DO ji=1,klu
121  idepth = pk%NWG_LAYER(ji)
122  IF (idepth==nundef) idepth = io%NGROUND_LAYER
123  DO jl=1,idepth-1
124  IF(pk%XDG(ji,jl)<xhort_depth) iwork(ji)=jl+1
125  ENDDO
126 ENDDO
127 !
128 !
129 IF (SIZE(iwork)>0.AND.maxval(iwork(:),iwork(:)/=nundef)>io%NLAYER_HORT) THEN
130  io%NLAYER_HORT=maxval(iwork(:),iwork(:)/=nundef)
131 ENDIF
132 !
133 ! Dunne runoff parameter
134 !
135 iwork(:)=pk%NWG_LAYER(:)
136 !
137 !
138 DO ji=1,klu
139  IF(pk%XPATCH(ji)>0.0)THEN
140  idepth = pk%NWG_LAYER(ji)
141  IF(pk%XDROOT(ji)>0.0.AND.pk%XDROOT(ji)/=xundef)THEN
142  pk%XRUNOFFD(ji) = pk%XDG(ji,1)
143  DO jl=1,idepth-1
144  IF(pk%XROOTFRAC(ji,jl)<0.90)THEN
145  pk%XRUNOFFD(ji) = pk%XDG(ji,jl+1)
146  ENDIF
147  ENDDO
148  ELSE
149  pk%XRUNOFFD(ji) = min(0.6,pk%XDG2(ji))
150  ENDIF
151  ENDIF
152 ENDDO
153 !
154 zwork(:) = 0.0
155 DO jl=1,io%NGROUND_LAYER
156  DO ji=1,klu
157  IF(pk%XPATCH(ji)>0.0)THEN
158  idepth=pk%NWG_LAYER(ji)
159  IF(jl<=idepth)THEN
160  zwork(ji ) = zwork(ji) + pk%XDZG(ji,jl)
161  pk%XSOILWGHT(ji,jl) = min(pk%XDZG(ji,jl), &
162  max(0.0,pk%XRUNOFFD(ji)-zwork(ji)+pk%XDZG(ji,jl)))
163  ENDIF
164  IF(pk%XDG(ji,jl)<pk%XRUNOFFD(ji))THEN
165  iwork(ji)=jl+1
166  ENDIF
167  ENDIF
168  ENDDO
169 ENDDO
170 !
171 !
172 IF (SIZE(iwork)>0.AND.maxval(iwork(:),iwork(:)/=nundef)>io%NLAYER_DUN) THEN
173  io%NLAYER_DUN=maxval(iwork(:),iwork(:)/=nundef)
174 ENDIF
175 !
176 IF (lhook) CALL dr_hook('DIF_LAYER',1,zhook_handle)
177 !
178 END SUBROUTINE dif_layer
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
integer, parameter nundef
logical lhook
Definition: yomhook.F90:15
real, parameter xhort_depth
subroutine dif_layer(KLU, IO, PK, OMEB_3L)
Definition: dif_layer.F90:7