44 logical,
private :: land_dyn_bucket_update_bottom_temp = .false.
45 logical,
private :: land_dyn_bucket_update_bottom_water = .false.
47 logical,
private :: land_dyn_bucket_nudging = .false.
48 real(DP),
private :: land_dyn_bucket_nudging_tau = 0.0_dp
49 character(len=H_SHORT),
private :: land_dyn_bucket_nudging_tau_unit =
"SEC" 51 logical,
private :: land_dyn_bucket_nudging_enable_periodic_year = .false.
52 logical,
private :: land_dyn_bucket_nudging_enable_periodic_month = .false.
53 logical,
private :: land_dyn_bucket_nudging_enable_periodic_day = .false.
54 integer,
private :: land_dyn_bucket_nudging_step_fixed = 0
55 real(RP),
private :: land_dyn_bucket_nudging_offset = 0.0_rp
56 real(RP),
private :: land_dyn_bucket_nudging_defval
57 logical,
private :: land_dyn_bucket_nudging_check_coordinates = .true.
58 integer,
private :: land_dyn_bucket_nudging_step_limit = 0
60 real(RP),
private :: water_denscs
61 real(DP),
private :: land_dyn_bucket_nudging_tausec
80 namelist / param_land_dyn_bucket / &
81 land_dyn_bucket_nudging, &
82 land_dyn_bucket_nudging_tau, &
83 land_dyn_bucket_nudging_tau_unit, &
84 land_dyn_bucket_nudging_basename, &
85 land_dyn_bucket_nudging_enable_periodic_year, &
86 land_dyn_bucket_nudging_enable_periodic_month, &
87 land_dyn_bucket_nudging_enable_periodic_day, &
88 land_dyn_bucket_nudging_step_fixed, &
89 land_dyn_bucket_nudging_offset, &
90 land_dyn_bucket_nudging_defval, &
91 land_dyn_bucket_nudging_check_coordinates, &
92 land_dyn_bucket_nudging_step_limit, &
93 land_dyn_bucket_update_bottom_temp, &
94 land_dyn_bucket_update_bottom_water
100 log_info(
"LAND_DYN_BUCKET_setup",*)
'Setup' 102 land_dyn_bucket_nudging_defval = undef
106 read(
io_fid_conf,nml=param_land_dyn_bucket,iostat=ierr)
108 log_info(
"LAND_DYN_BUCKET_setup",*)
'Not found namelist. Default used.' 109 elseif( ierr > 0 )
then 110 log_error(
"LAND_DYN_BUCKET_setup",*)
'Not appropriate names in namelist PARAM_LAND_DYN_BUCKET. Check!' 113 log_nml(param_land_dyn_bucket)
115 if ( land_dyn_bucket_nudging )
then 116 call calendar_unit2sec( land_dyn_bucket_nudging_tausec, land_dyn_bucket_nudging_tau, land_dyn_bucket_nudging_tau_unit )
118 log_info(
"LAND_DYN_BUCKET_setup",*)
'Use nudging for LAND physics : ON' 119 log_info(
"LAND_DYN_BUCKET_setup",*)
'Relaxation time Tau [sec] : ', land_dyn_bucket_nudging_tausec
121 if ( land_dyn_bucket_nudging_tausec == 0.0_rp )
then 122 log_info(
"LAND_DYN_BUCKET_setup",*)
'Tau=0 means that LST is completely replaced by the external data.' 125 if ( land_dyn_bucket_nudging_basename(1) ==
'' )
then 126 log_error(
"LAND_DYN_BUCKET_setup",*)
'LAND_DYN_BUCKET_nudging_basename is necessary !!' 133 land_dyn_bucket_nudging_enable_periodic_year, &
134 land_dyn_bucket_nudging_enable_periodic_month, &
135 land_dyn_bucket_nudging_enable_periodic_day, &
136 land_dyn_bucket_nudging_step_fixed, &
137 land_dyn_bucket_nudging_offset, &
138 land_dyn_bucket_nudging_defval, &
139 land_dyn_bucket_nudging_check_coordinates, &
140 land_dyn_bucket_nudging_step_limit )
145 land_dyn_bucket_nudging_enable_periodic_year, &
146 land_dyn_bucket_nudging_enable_periodic_month, &
147 land_dyn_bucket_nudging_enable_periodic_day, &
148 land_dyn_bucket_nudging_step_fixed, &
149 land_dyn_bucket_nudging_offset, &
150 land_dyn_bucket_nudging_defval, &
151 land_dyn_bucket_nudging_check_coordinates, &
152 land_dyn_bucket_nudging_step_limit )
154 log_info(
"LAND_DYN_BUCKET_setup",*)
'Use nudging for Land physics: ON' 156 log_info(
"LAND_DYN_BUCKET_setup",*)
'Use nudging for Land physics: OFF' 159 water_denscs = dwatr * cl
162 log_info(
"LAND_DYN_BUCKET_setup",*)
'Update soil temperature of bottom layer? : ', land_dyn_bucket_update_bottom_temp
163 log_info(
"LAND_DYN_BUCKET_setup",*)
'Update soil moisture of bottom layer? : ', land_dyn_bucket_update_bottom_water
171 LKMAX, LKS, LKE, LIA, LIS, LIE, LJA, LJS, LJE, &
177 SFLX_GH, SFLX_water, SFLX_ice, &
189 file_external_input_update
191 matrix_solver_tridiagonal
193 integer,
intent(in) :: LKMAX, LKS, LKE
194 integer,
intent(in) :: LIA, LIS, LIE
195 integer,
intent(in) :: LJA, LJS, LJE
197 real(RP),
intent(in) :: TEMP_t (lkmax,lia,lja)
198 real(RP),
intent(in) :: WATER_t (lkmax,lia,lja)
199 real(RP),
intent(in) :: WaterLimit (lia,lja)
200 real(RP),
intent(in) :: ThermalCond (lia,lja)
201 real(RP),
intent(in) :: HeatCapacity(lia,lja)
202 real(RP),
intent(in) :: WaterDiff (lia,lja)
203 real(RP),
intent(in) :: SFLX_GH (lia,lja)
204 real(RP),
intent(in) :: SFLX_water (lia,lja)
205 real(RP),
intent(in) :: SFLX_ice (lia,lja)
206 real(RP),
intent(in) :: fact_land (lia,lja)
207 real(RP),
intent(in) :: CDZ (lkmax)
208 real(DP),
intent(in) :: dt
209 real(DP),
intent(in) :: NOWDAYSEC
211 real(RP),
intent(inout) :: TEMP (lkmax,lia,lja)
212 real(RP),
intent(inout) :: WATER(lkmax,lia,lja)
214 real(RP),
intent(out) :: RUNOFF(lia,lja)
216 logical :: solve_matrix
219 real(RP) :: TEMP1 (lkmax,lia,lja)
220 real(RP) :: WATER1(lkmax,lia,lja)
222 real(RP) :: LAND_DENSCS(lkmax,lia,lja)
223 real(RP) :: ThermalDiff(lkmax,lia,lja)
225 real(RP) :: U(lkmax,lia,lja)
226 real(RP) :: M(lkmax,lia,lja)
227 real(RP) :: L(lkmax,lia,lja)
228 real(RP) :: V(lkmax,lia,lja)
230 real(RP) :: NDG_TEMP (lkmax,lia,lja)
231 real(RP) :: NDG_WATER(lkmax,lia,lja)
238 log_progress(*)
'land / dynamics / bucket' 240 if( land_dyn_bucket_nudging )
then 242 call file_external_input_update( &
248 log_error(
"LAND_DYN_BUCKET",*)
'Requested data is not found!' 252 call file_external_input_update( &
258 log_error(
"LAND_DYN_BUCKET",*)
'Requested data is not found!' 262 if( land_dyn_bucket_nudging_tau > 0.0_rp )
then 264 solve_matrix = .true.
270 ndg_temp(k,i,j) = ( temp1(k,i,j) - temp(k,i,j) ) / land_dyn_bucket_nudging_tausec * dt
271 ndg_water(k,i,j) = ( water1(k,i,j) - water(k,i,j) ) / land_dyn_bucket_nudging_tausec * dt
278 solve_matrix = .false.
284 solve_matrix = .true.
286 ndg_temp(:,:,:) = 0.0_rp
287 ndg_water(:,:,:) = 0.0_rp
291 if( solve_matrix )
then 297 u(lks,i,j) = -2.0_rp * waterdiff(i,j) / ( cdz(lks) * ( cdz(lks) + cdz(lks+1) ) ) * dt
298 l(lke,i,j) = -2.0_rp * waterdiff(i,j) / ( cdz(lke) * ( cdz(lke) + cdz(lke-1) ) ) * dt
301 m(lks,i,j) = 1.0_rp - l(lks,i,j) - u(lks,i,j)
302 m(lke,i,j) = 1.0_rp - l(lke,i,j) - u(lke,i,j)
309 l(k,i,j) = -2.0_rp * waterdiff(i,j) / ( cdz(k) * ( cdz(k) + cdz(k-1) ) ) * dt
310 u(k,i,j) = -2.0_rp * waterdiff(i,j) / ( cdz(k) * ( cdz(k) + cdz(k+1) ) ) * dt
311 m(k,i,j) = 1.0_rp - l(k,i,j) - u(k,i,j)
319 v(lks,i,j) = water(lks,i,j) + ndg_water(lks,i,j) &
320 + ( sflx_water(i,j) + sflx_ice(i,j) ) / ( cdz(lks) * dwatr ) * dt
327 v(k,i,j) = water(k,i,j) + ndg_water(k,i,j)
332 call matrix_solver_tridiagonal( lkmax, &
341 if ( .not. land_dyn_bucket_update_bottom_water )
then 344 water1(lke,i,j) = water(lke,i,j)
354 runoff(i,j) = runoff(i,j) + max( water1(k,i,j) - waterlimit(i,j), 0.0_rp ) * cdz(k) * dwatr
355 water1(k,i,j) = min( water1(k,i,j), waterlimit(i,j) )
364 land_denscs(k,i,j) = ( 1.0_rp - waterlimit(i,j) ) * heatcapacity(i,j) + water_denscs * water1(k,i,j)
365 thermaldiff(k,i,j) = thermalcond(i,j) / land_denscs(k,i,j)
374 u(lks,i,j) = -2.0_rp * thermaldiff(lks,i,j) / ( cdz(lks) * ( cdz(lks) + cdz(lks+1) ) ) * dt
375 l(lke,i,j) = -2.0_rp * thermaldiff(lke,i,j) / ( cdz(lke) * ( cdz(lke) + cdz(lke-1) ) ) * dt
378 m(lks,i,j) = 1.0_rp - l(lks,i,j) - u(lks,i,j)
379 m(lke,i,j) = 1.0_rp - l(lke,i,j) - u(lke,i,j)
386 l(k,i,j) = -2.0_rp * thermaldiff(k,i,j) / ( cdz(k) * ( cdz(k) + cdz(k-1) ) ) * dt
387 u(k,i,j) = -2.0_rp * thermaldiff(k,i,j) / ( cdz(k) * ( cdz(k) + cdz(k+1) ) ) * dt
388 m(k,i,j) = 1.0_rp - l(k,i,j) - u(k,i,j)
398 if ( temp(lks,i,j) >= tem00 ) q = q - sflx_ice(i,j) * emelt
399 v(lks,i,j) = temp(lks,i,j) + ndg_temp(lks,i,j) + temp_t(lks,i,j) &
400 + q / ( land_denscs(lks,i,j) * cdz(lks) ) * dt
407 v(k,i,j) = temp(k,i,j) + ndg_temp(k,i,j) + temp_t(k,i,j)
412 call matrix_solver_tridiagonal( lkmax, &
421 if ( .not. land_dyn_bucket_update_bottom_temp )
then 424 temp1(lke,i,j) = temp(lke,i,j)
434 if( fact_land(i,j) > 0.0_rp )
then 436 temp(k,i,j) = temp1(k,i,j)
437 water(k,i,j) = water1(k,i,j)
subroutine, public calendar_unit2sec(second, value, unit)
Convert several units to second.
real(rp), parameter, public const_dwatr
density of water [kg/m3]
real(rp), parameter, public const_cl
specific heat (liquid water) [J/kg/K]
real(rp), parameter, public const_tem00
temperature reference (0C) [K]
integer, public io_fid_conf
Config file ID.
real(rp), public const_undef
module land / dynamics / bucket
subroutine, public prc_abort
Abort Process.
real(rp), parameter, public const_emelt
subroutine, public land_dyn_bucket(LKMAX, LKS, LKE, LIA, LIS, LIE, LJA, LJS, LJE, TEMP_t, WATER_t, WaterLimit, ThermalCond, HeatCapacity, WaterDiff, SFLX_GH, SFLX_water, SFLX_ice, fact_land, CDZ, dt, NOWDAYSEC, TEMP, WATER, RUNOFF)
Physical processes for land submodel.
subroutine, public land_dyn_bucket_setup
Setup.