47 real(RP),
private :: ocean_phy_ice_mass_critical = 1600.0_rp
48 real(RP),
private :: ocean_phy_ice_mass_limit = 50000.0_rp
49 real(RP),
private :: ocean_phy_ice_fraction_limit = 1.0_rp
50 real(RP),
private :: ocean_phy_ice_dt_max = 5.e-2_rp
52 logical,
private :: ocean_phy_ice_nudging = .false.
53 real(DP),
private :: ocean_phy_ice_nudging_tausec
54 logical,
private :: ocean_phy_ice_offline_mode = .false.
71 real(DP) :: OCEAN_PHY_ICE_nudging_tau = 0.0_dp
72 character(len=H_SHORT) :: OCEAN_PHY_ICE_nudging_tau_unit =
"SEC" 74 logical :: OCEAN_PHY_ICE_nudging_enable_periodic_year = .false.
75 logical :: OCEAN_PHY_ICE_nudging_enable_periodic_month = .false.
76 logical :: OCEAN_PHY_ICE_nudging_enable_periodic_day = .false.
77 integer :: OCEAN_PHY_ICE_nudging_step_fixed = 0
78 real(RP) :: OCEAN_PHY_ICE_nudging_offset = 0.0_rp
79 real(RP) :: OCEAN_PHY_ICE_nudging_defval
80 logical :: OCEAN_PHY_ICE_nudging_check_coordinates = .true.
81 integer :: OCEAN_PHY_ICE_nudging_step_limit = 0
83 namelist / param_ocean_phy_ice / &
85 ocean_phy_ice_mass_critical, &
86 ocean_phy_ice_mass_limit, &
87 ocean_phy_ice_fraction_limit, &
106 log_info(
"OCEAN_PHY_ICE_setup",*)
'Setup' 108 ocean_phy_ice_nudging_defval = undef
112 read(
io_fid_conf,nml=param_ocean_phy_ice,iostat=ierr)
114 log_info(
"OCEAN_PHY_ICE_setup",*)
'Not found namelist. Default used.' 115 elseif( ierr > 0 )
then 116 log_error(
"OCEAN_PHY_ICE_setup",*)
'Not appropriate names in namelist PARAM_OCEAN_PHY_ICE. Check!' 119 log_nml(param_ocean_phy_ice)
122 log_info(
"OCEAN_PHY_ICE_setup",*)
'Ice amount for frac. = 1 [kg/m2] : ', ocean_phy_ice_mass_critical
123 if ( ocean_phy_ice_nudging )
then 124 call calendar_unit2sec( ocean_phy_ice_nudging_tausec, ocean_phy_ice_nudging_tau, ocean_phy_ice_nudging_tau_unit )
126 log_info(
"OCEAN_PHY_ICE_setup",*)
'Use nudging for sea ice fraction : ON' 127 log_info(
"OCEAN_PHY_ICE_setup",*)
'Relaxation time Tau [sec] : ', ocean_phy_ice_nudging_tausec
129 if ( ocean_phy_ice_nudging_tausec == 0.0_rp )
then 130 ocean_phy_ice_offline_mode = .true.
131 log_info(
"OCEAN_PHY_ICE_setup",*)
'Tau=0 means that sea ice is completely replaced by the external data.' 134 if ( ocean_phy_ice_nudging_basename(1) ==
'' )
then 135 log_error(
"OCEAN_PHY_ICE_setup",*)
'OCEAN_PHY_ICE_nudging_basename is necessary. STOP' 139 log_info(
"OCEAN_PHY_ICE_setup",*)
'Use nudging for sea ice fraction : OFF' 142 if ( ocean_phy_ice_nudging )
then 146 ocean_phy_ice_nudging_enable_periodic_year, &
147 ocean_phy_ice_nudging_enable_periodic_month, &
148 ocean_phy_ice_nudging_enable_periodic_day, &
149 ocean_phy_ice_nudging_step_fixed, &
150 ocean_phy_ice_nudging_offset, &
151 ocean_phy_ice_nudging_defval, &
152 ocean_phy_ice_nudging_check_coordinates, &
153 ocean_phy_ice_nudging_step_limit )
167 integer,
intent(in) :: OIA, OIS, OIE
168 integer,
intent(in) :: OJA, OJS, OJE
169 real(RP),
intent(in) :: ICE_MASS(oia,oja)
170 real(RP),
intent(out) :: ICE_FRAC(oia,oja)
177 ice_frac(i,j) = ice_mass(i,j) / ocean_phy_ice_mass_critical
179 ice_frac(i,j) = min( sqrt( max( ice_frac(i,j), 0.0_rp ) ), ocean_phy_ice_fraction_limit )
202 integer,
intent(in) :: OIA, OIS, OIE
203 integer,
intent(in) :: OJA, OJS, OJE
204 logical,
intent(in) :: calc_flag (oia,oja)
205 real(RP),
intent(in) :: OCEAN_DEPTH
206 real(RP),
intent(inout) :: OCEAN_TEMP(oia,oja)
207 real(RP),
intent(inout) :: ICE_TEMP (oia,oja)
208 real(RP),
intent(inout) :: ICE_MASS (oia,oja)
210 real(RP) :: ICE_MASS_diff
211 real(RP) :: ICE_MASS_prev
223 factor = cl * dwatr * ocean_depth &
226 if ( calc_flag(i,j) )
then 229 ice_mass_prev = ice_mass(i,j)
230 ice_mass(i,j) = min( max( ice_mass(i,j) + ice_mass_diff, 0.0_rp ), ocean_phy_ice_mass_limit )
231 ice_mass_diff = ice_mass(i,j) - ice_mass_prev
234 ocean_temp(i,j) = ocean_temp(i,j) + ice_mass_diff / factor
237 if ( ice_mass(i,j) > 0.0_rp )
then 238 if ( ice_mass_diff > 0.0_rp )
then 239 ice_temp(i,j) = ( ice_temp(i,j) * ice_mass_prev &
280 file_external_input_update
283 integer,
intent(in) :: OIA, OIS, OIE
284 integer,
intent(in) :: OJA, OJS, OJE
285 real(RP),
intent(in) :: sflx_QV (oia,oja)
286 real(RP),
intent(in) :: sflx_rain (oia,oja)
287 real(RP),
intent(in) :: sflx_snow (oia,oja)
288 real(RP),
intent(in) :: sflx_hbalance(oia,oja)
289 real(RP),
intent(in) :: subsfc_temp (oia,oja)
290 real(RP),
intent(in) :: TC_dz (oia,oja)
291 real(RP),
intent(in) :: ICE_TEMP (oia,oja)
292 real(RP),
intent(in) :: ICE_MASS (oia,oja)
293 logical,
intent(in) :: calc_flag (oia,oja)
294 real(DP),
intent(in) :: dt
295 real(RP),
intent(out) :: ICE_TEMP_t (oia,oja)
296 real(RP),
intent(out) :: ICE_MASS_t (oia,oja)
297 real(RP),
intent(out) :: SFLX_G (oia,oja)
298 real(RP),
intent(out) :: SFLX_water (oia,oja)
299 real(RP),
intent(out) :: SFLX_ice (oia,oja)
301 real(RP) :: mass_budget
302 real(RP) :: ICE_MASS_new
303 real(RP) :: ICE_MASS_new2
304 real(RP) :: heat_budget
305 real(RP) :: heat_budget_new
307 real(RP) :: ICE_TEMP_new
308 real(RP) :: heatcapacity
311 real(RP) :: sflx_melt
317 log_progress(*)
'ocean / physics / seaice' 319 dt_rp =
real(dt,kind=
rp)
327 if ( calc_flag(i,j) )
then 329 mass_budget = -sflx_qv(i,j) + sflx_rain(i,j) + sflx_snow(i,j)
330 ice_mass_new = max( ice_mass(i,j) + mass_budget * dt_rp, 0.0_rp )
331 mass_budget = mass_budget - ( ice_mass_new - ice_mass(i,j) ) / dt_rp
334 gflx = ( subsfc_temp(i,j) - ice_temp(i,j) ) * tc_dz(i,j)
335 heat_budget = sflx_hbalance(i,j) &
339 ice_temp_new = ice_temp(i,j)
340 heatcapacity =
const_ci * ice_mass_new
343 if ( heat_budget > 0.0_rp .AND. ice_mass_new > 0.0_rp )
then 345 heat_budget_new = max( heat_budget - heating, 0.0_rp )
346 ice_temp_new = ice_temp(i,j) + ( heat_budget - heat_budget_new ) / heatcapacity * dt_rp
347 heat_budget = heat_budget_new
351 if ( heat_budget < 0.0_rp .AND. ice_mass_new > 0.0_rp )
then 357 cooling = max( heat_budget, -ocean_phy_ice_dt_max * heatcapacity )
359 ice_temp_new = ice_temp(i,j) + cooling / heatcapacity * dt_rp
360 heat_budget = heat_budget - cooling
364 sflx_melt = max( heat_budget /
const_emelt, 0.0_rp )
365 ice_mass_new2 = max( ice_mass_new - sflx_melt * dt_rp, 0.0_rp )
366 sflx_melt = ( ice_mass_new - ice_mass_new2 ) / dt_rp
367 heat_budget = heat_budget - sflx_melt *
const_emelt 368 mass_budget = mass_budget + sflx_melt
371 sflx_g(i,j) = heat_budget - gflx
372 sflx_water(i,j) = mass_budget
373 sflx_ice(i,j) = 0.0_rp
375 ice_mass_t(i,j) = ( ice_mass_new2 - ice_mass(i,j) ) / dt_rp
376 ice_temp_t(i,j) = ( ice_temp_new - ice_temp(i,j) ) / dt_rp
379 sflx_water(i,j) = 0.0_rp
380 sflx_ice(i,j) = 0.0_rp
381 ice_mass_t(i,j) = 0.0_rp
382 ice_temp_t(i,j) = 0.0_rp
subroutine, public calendar_unit2sec(second, value, unit)
Convert several units to second.
real(rp), parameter, public const_ci
specific heat (ice) [J/kg/K]
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), public ocean_phy_ice_density
integer, public io_fid_conf
Config file ID.
real(rp), public const_undef
subroutine, public ocean_phy_ice_adjustment(OIA, OIS, OIE, OJA, OJS, OJE, calc_flag, OCEAN_DEPTH, OCEAN_TEMP, ICE_TEMP, ICE_MASS)
subroutine, public prc_abort
Abort Process.
real(rp), parameter, public const_emelt
real(rp), public ocean_phy_ice_freezetemp
subroutine, public ocean_phy_ice_fraction(OIA, OIS, OIE, OJA, OJS, OJE, ICE_MASS, ICE_FRAC)
module ocean / physics / ice / simple
integer, parameter, public rp
subroutine, public ocean_phy_ice_setup
subroutine, public ocean_phy_ice_simple(OIA, OIS, OIE, OJA, OJS, OJE, sflx_QV, sflx_rain, sflx_snow, sflx_hbalance, subsfc_temp, TC_dz, ICE_TEMP, ICE_MASS, calc_flag, dt, ICE_TEMP_t, ICE_MASS_t, sflx_G, sflx_water, sflx_ice)
Slab ocean model.