4 SUBROUTINE soil(ptimestep, indice, knon, snow, ptsrf, &
5 ptsoil, pcapcal, pfluxgrd)
60 REAL,
INTENT(IN) :: ptimestep
61 INTEGER,
INTENT(IN) :: indice, knon
62 REAL,
DIMENSION(klon),
INTENT(IN) :: snow
63 REAL,
DIMENSION(klon),
INTENT(IN) :: ptsrf
65 REAL,
DIMENSION(klon,nsoilmx),
INTENT(INOUT) :: ptsoil
66 REAL,
DIMENSION(klon),
INTENT(OUT) :: pcapcal
67 REAL,
DIMENSION(klon),
INTENT(OUT) :: pfluxgrd
72 INTEGER :: ig, jk, ierr
73 REAL :: min_period,dalph_soil
74 REAL,
DIMENSION(nsoilmx) :: zdz2
76 REAL,
DIMENSION(klon) :: ztherm_i
77 REAL,
DIMENSION(klon,nsoilmx,nbsrf) :: c_coef, d_coef
83 REAL,
DIMENSION(nsoilmx),
SAVE :: dz1, dz2
85 LOGICAL,
SAVE :: firstcall=.true.
91 REAL fz,rk,fz1,rk1,rk2
92 fz(rk)=fz1*(dalph_soil**rk-1.)/(dalph_soil-1.)
109 IF (is_mpi_root)
THEN
110 OPEN(99,file=
'soil.def',status=
'old',form=
'formatted',iostat=ierr)
112 READ(99,*) min_period
113 READ(99,*) dalph_soil
114 WRITE(
lunout,*)
'Discretization for the soil model'
115 WRITE(
lunout,*)
'First level e-folding depth',min_period, &
121 CALL
bcast(min_period)
122 CALL
bcast(dalph_soil)
125 fz1=sqrt(min_period/3.14)
130 dz2(jk)=fz(rk1)-fz(rk2)
135 dz1(jk)=1./(fz(rk1)-fz(rk2))
138 WRITE(
lunout,*)
'full layers, intermediate layers (seconds)'
144 fz(rk1)*fz(rk2)*3.14,fz(rk)*fz(rk)*3.14
158 IF (indice == is_sic)
THEN
160 ztherm_i(ig) = inertie_ice
163 ELSE IF (indice == is_lic)
THEN
165 ztherm_i(ig) = inertie_ice
168 ELSE IF (indice == is_ter)
THEN
173 ELSE IF (indice == is_oce)
THEN
175 ztherm_i(ig) = inertie_ice
178 WRITE(
lunout,*)
"valeur d indice non prevue", indice
192 zdz2(jk)=dz2(jk)/ptimestep
196 z1s = zdz2(nsoilmx)+dz1(nsoilmx-1)
197 c_coef(ig,nsoilmx-1,indice)= &
198 zdz2(nsoilmx)*ptsoil(ig,nsoilmx)/z1s
199 d_coef(ig,nsoilmx-1,indice)=dz1(nsoilmx-1)/z1s
204 z1s = 1./(zdz2(jk)+dz1(jk-1)+dz1(jk) &
205 *(1.-d_coef(ig,jk,indice)))
206 c_coef(ig,jk-1,indice)= &
207 (ptsoil(ig,jk)*zdz2(jk)+dz1(jk)*c_coef(ig,jk,indice)) * z1s
208 d_coef(ig,jk-1,indice)=dz1(jk-1)*z1s
221 ptsoil(ig,1)=(lambda*c_coef(ig,1,indice)+ptsrf(ig))/ &
222 (lambda*(1.-d_coef(ig,1,indice))+1.)
228 ptsoil(ig,jk+1)=c_coef(ig,jk,indice)+d_coef(ig,jk,indice) &
233 IF (indice == is_sic)
THEN
235 ptsoil(ig,nsoilmx) = rtt - 1.8
245 z1s = zdz2(nsoilmx)+dz1(nsoilmx-1)
246 c_coef(ig,nsoilmx-1,indice) = zdz2(nsoilmx)*ptsoil(ig,nsoilmx)/z1s
247 d_coef(ig,nsoilmx-1,indice) = dz1(nsoilmx-1)/z1s
252 z1s = 1./(zdz2(jk)+dz1(jk-1)+dz1(jk) &
253 *(1.-d_coef(ig,jk,indice)))
254 c_coef(ig,jk-1,indice) = &
255 (ptsoil(ig,jk)*zdz2(jk)+dz1(jk)*c_coef(ig,jk,indice)) * z1s
256 d_coef(ig,jk-1,indice) = dz1(jk-1)*z1s
266 pfluxgrd(ig) = ztherm_i(ig)*dz1(1)* &
267 (c_coef(ig,1,indice)+(d_coef(ig,1,indice)-1.)*ptsoil(ig,1))
268 pcapcal(ig) = ztherm_i(ig)* &
269 (dz2(1)+ptimestep*(1.-d_coef(ig,1,indice))*dz1(1))
270 z1s = lambda*(1.-d_coef(ig,1,indice))+1.
271 pcapcal(ig) = pcapcal(ig)/z1s
272 pfluxgrd(ig) = pfluxgrd(ig) &
273 + pcapcal(ig) * (ptsoil(ig,1) * z1s &
274 - lambda * c_coef(ig,1,indice) &