Go to the documentation of this file.00001
00002 subroutine soilwater( sib, infil, hk, dhkdw, dw_liq, dzmm, zmm)
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 use sibtype
00061
00062 use physical_parameters, only: &
00063 grav, &
00064 tice, &
00065 hltm
00066
00067 use sib_const_module, only: &
00068 nsoil, &
00069 wimp, &
00070 phmin, &
00071 dti, &
00072 dtt
00073
00074 implicit none
00075
00076
00077
00078 type(sib_t), intent(inout) :: sib
00079
00080
00081
00082
00083 real(kind=dbl_kind),intent(in) :: infil
00084
00085 real(kind=dbl_kind),intent(in) ::dzmm(1:nsoil)
00086 real(kind=dbl_kind),intent(in) ::zmm(1:nsoil)
00087
00088
00089
00090 real(kind=dbl_kind),intent(out) :: hk(1:nsoil)
00091
00092
00093 real(kind=dbl_kind),intent(out) :: dhkdw(1:nsoil)
00094
00095 real(kind=dbl_kind),intent(out) :: dw_liq(1:nsoil)
00096
00097
00098
00099
00100
00101
00102 integer :: j
00103
00104 real(kind=dbl_kind) :: hltmi
00105 real(kind=dbl_kind) :: s_node
00106 real(kind=dbl_kind) :: s1
00107 real(kind=dbl_kind) :: s2
00108 real(kind=dbl_kind) :: smp(1:nsoil)
00109
00110 real(kind=dbl_kind) :: dsmpdw(1:nsoil)
00111
00112 real(kind=dbl_kind) :: qin
00113
00114 real(kind=dbl_kind) :: qout
00115
00116 real(kind=dbl_kind) :: den
00117 real(kind=dbl_kind) :: num
00118 real(kind=dbl_kind) :: dqidw0
00119 real(kind=dbl_kind) :: dqidw1
00120 real(kind=dbl_kind) :: dqodw1
00121 real(kind=dbl_kind) :: dqodw2
00122 real(kind=dbl_kind) :: rmx(1:nsoil)
00123
00124 real(kind=dbl_kind) :: amx(1:nsoil)
00125
00126 real(kind=dbl_kind) :: bmx(1:nsoil)
00127
00128 real(kind=dbl_kind) :: cmx(1:nsoil)
00129
00130
00131
00132
00133
00134
00135 hltmi = 1.0/hltm
00136
00137
00138
00139
00140
00141 do j=1,nsoil
00142 if( ((sib%diag%eff_poros(j) < wimp) .or. &
00143 (sib%diag%eff_poros(min(nsoil,j+1)) < wimp)) .or. &
00144 (sib%prog%vol_liq(j) <= 1.E-3)) then
00145 hk(j) = 0.0
00146 dhkdw(j) = 0.0
00147 else
00148 s1 = 0.5*(sib%prog%vol_liq(j)+sib%prog%vol_liq(min(nsoil,j+1)))/ &
00149 sib%param%poros
00150
00151 s2 = sib%param%satco*1000.0*s1**(2.0*sib%param%bee+2.0)
00152 hk(j) = s1*s2
00153
00154 dhkdw(j) = (2.0*sib%param%bee+3.0)*s2*0.5/sib%param%poros
00155
00156
00157
00158
00159 if(j==nsoil) dhkdw(j) = dhkdw(j)*2.0
00160 endif
00161
00162
00163
00164 if(sib%prog%td(j) > tice) then
00165
00166 s_node = max(sib%prog%vol_liq(j)/sib%param%poros,0.01_dbl_kind)
00167 s_node = min(1.0_dbl_kind,s_node)
00168
00169 smp(j) = sib%param%phsat*1000.0*s_node**(-sib%param%bee)
00170
00171 smp(j) = max(phmin,smp(j))
00172
00173 dsmpdw(j) = -sib%param%bee*smp(j)/(s_node*sib%param%poros)
00174
00175 else
00176
00177
00178
00179
00180
00181
00182 smp(j) = 1.e3_dbl_kind * 0.3336e6_dbl_kind/grav * &
00183 (sib%prog%td(j) - tice)/sib%prog%td(j)
00184 smp(j) = max(phmin,smp(j))
00185 dsmpdw(j) = 0.0
00186
00187 endif
00188 enddo
00189
00190
00191
00192
00193
00194 j = 1
00195 qin = infil
00196 den = zmm(j+1) - zmm(j)
00197 num = (smp(j+1)-smp(j)) - den
00198 qout = -hk(j)*num/den
00199 dqodw1 = -(-hk(j)*dsmpdw(j) + num*dhkdw(j))/den
00200 dqodw2 = -( hk(j)*dsmpdw(j+1) + num*dhkdw(j))/den
00201 rmx(j) = qin - qout - (((sib%diag%ect * sib%param%rootr(j)) + &
00202 sib%diag%egs) * dti * hltmi)
00203 amx(j) = 0.0
00204 bmx(j) = dzmm(j) * (dti) + dqodw1
00205 cmx(j) = dqodw2
00206
00207
00208 do j = 2,nsoil-1
00209 den = zmm(j) - zmm(j-1)
00210 num = (smp(j)-smp(j-1)) - den
00211 qin = -hk(j-1)*num/den
00212 dqidw0 = -(-hk(j-1)*dsmpdw(j-1) + num*dhkdw(j-1))/den
00213 dqidw1 = -( hk(j-1)*dsmpdw(j) + num*dhkdw(j-1))/den
00214 den = zmm(j+1)-zmm(j)
00215 num = smp(j+1)-smp(j) - den
00216 qout = -hk(j)*num/den
00217 dqodw1 = -(-hk(j)*dsmpdw(j) + num*dhkdw(j))/den
00218 dqodw2 = -( hk(j)*dsmpdw(j+1) + num*dhkdw(j))/den
00219 rmx(j) = qin - qout - (sib%diag%ect * dti * sib%param%rootr(j) * hltmi)
00220 amx(j) = -dqidw0
00221 bmx(j) = dzmm(j)*dti - dqidw1 + dqodw1
00222 cmx(j) = dqodw2
00223 enddo
00224
00225
00226 j = nsoil
00227 den = zmm(j) - zmm(j-1)
00228 num = smp(j) - smp(j-1) - den
00229 qin = -hk(j-1) * num/den
00230 dqidw0 = -(-hk(j-1)*dsmpdw(j-1) + num*dhkdw(j-1))/den
00231 dqidw1 = -( hk(j-1)*dsmpdw(j) + num*dhkdw(j-1))/den
00232 qout = hk(j)
00233 dqodw1 = dhkdw(j)
00234 rmx(j) = qin - qout - (sib%diag%ect * dti * sib%param%rootr(j) * hltmi)
00235 amx(j) = -dqidw0
00236 bmx(j) = dzmm(j)*dti - dqidw1 + dqodw1
00237 cmx(j) = 0.0
00238
00239
00240 sib%diag%roff = sib%diag%roff + qout*dtt
00241
00242
00243 call clm_tridia (nsoil, amx, bmx, cmx, rmx, dw_liq)
00244
00245 end subroutine soilwater