SCALE-RM
Functions/Subroutines | Variables
scale_ocean_dyn_slab Module Reference

module ocean / dynamics / slab More...

Functions/Subroutines

subroutine, public ocean_dyn_slab_setup
 Setup. More...
 
subroutine, public ocean_dyn_slab (OKMAX, OKS, OKE, OIA, OIS, OIE, OJA, OJS, OJE, OCEAN_TEMP_t, OCEAN_SFLX_G, OCEAN_SFLX_water, OCEAN_SFLX_ice, calc_flag, dt, NOWDAYSEC, OCEAN_TEMP)
 Slab ocean model. More...
 

Variables

real(rp), public ocean_dyn_slab_depth = 10.0_RP
 water depth of slab ocean [m] More...
 

Detailed Description

module ocean / dynamics / slab

Description
ocean slab model
Author
Team SCALE
NAMELIST
  • PARAM_OCEAN_DYN_SLAB
    nametypedefault valuecomment
    OCEAN_DYN_SLAB_DEPTH real(RP) 10.0_RP water depth of slab ocean [m]
    OCEAN_DYN_SLAB_NUDGING logical .false. SST Nudging is used?
    OCEAN_DYN_SLAB_NUDGING_TAU real(DP) 0.0_DP Relaxation time
    OCEAN_DYN_SLAB_NUDGING_TAU_UNIT character(len=H_SHORT) "SEC"
    OCEAN_DYN_SLAB_NUDGING_BASENAME character(len=H_LONG), dimension(FILE_EXTERNAL_INPUT_FILE_LIMIT) ''
    OCEAN_DYN_SLAB_NUDGING_ENABLE_PERIODIC_YEAR logical .false.
    OCEAN_DYN_SLAB_NUDGING_ENABLE_PERIODIC_MONTH logical .false.
    OCEAN_DYN_SLAB_NUDGING_ENABLE_PERIODIC_DAY logical .false.
    OCEAN_DYN_SLAB_NUDGING_STEP_FIXED integer 0
    OCEAN_DYN_SLAB_NUDGING_OFFSET real(RP) 0.0_RP
    OCEAN_DYN_SLAB_NUDGING_DEFVAL real(RP) = UNDEF
    OCEAN_DYN_SLAB_NUDGING_CHECK_COORDINATES logical .true.
    OCEAN_DYN_SLAB_NUDGING_STEP_LIMIT integer 0

History Output
No history output

Function/Subroutine Documentation

◆ ocean_dyn_slab_setup()

subroutine, public scale_ocean_dyn_slab::ocean_dyn_slab_setup ( )

Setup.

Definition at line 56 of file scale_ocean_dyn_slab.F90.

References scale_calendar::calendar_unit2sec(), scale_const::const_cl, scale_const::const_dwatr, scale_const::const_undef, scale_file_external_input::file_external_input_file_limit, scale_file_external_input::file_external_input_regist(), scale_io::io_fid_conf, ocean_dyn_slab_depth, and scale_prc::prc_abort().

Referenced by mod_ocean_driver::ocean_driver_setup().

56  use scale_prc, only: &
57  prc_abort
58  use scale_const, only: &
59  undef => const_undef, &
60  dwatr => const_dwatr, &
61  cl => const_cl
62  use scale_calendar, only: &
64  use scale_file_external_input, only: &
67  implicit none
68 
69  real(DP) :: ocean_dyn_slab_nudging_tau = 0.0_dp ! Relaxation time
70  character(len=H_SHORT) :: ocean_dyn_slab_nudging_tau_unit = "SEC"
71  character(len=H_LONG) :: ocean_dyn_slab_nudging_basename(file_external_input_file_limit) = ''
72  logical :: ocean_dyn_slab_nudging_enable_periodic_year = .false.
73  logical :: ocean_dyn_slab_nudging_enable_periodic_month = .false.
74  logical :: ocean_dyn_slab_nudging_enable_periodic_day = .false.
75  integer :: ocean_dyn_slab_nudging_step_fixed = 0
76  real(RP) :: ocean_dyn_slab_nudging_offset = 0.0_rp
77  real(RP) :: ocean_dyn_slab_nudging_defval != UNDEF
78  logical :: ocean_dyn_slab_nudging_check_coordinates = .true.
79  integer :: ocean_dyn_slab_nudging_step_limit = 0
80 
81  namelist / param_ocean_dyn_slab / &
83  ocean_dyn_slab_nudging, &
84  ocean_dyn_slab_nudging_tau, &
85  ocean_dyn_slab_nudging_tau_unit, &
86  ocean_dyn_slab_nudging_basename, &
87  ocean_dyn_slab_nudging_enable_periodic_year, &
88  ocean_dyn_slab_nudging_enable_periodic_month, &
89  ocean_dyn_slab_nudging_enable_periodic_day, &
90  ocean_dyn_slab_nudging_step_fixed, &
91  ocean_dyn_slab_nudging_offset, &
92  ocean_dyn_slab_nudging_defval, &
93  ocean_dyn_slab_nudging_check_coordinates, &
94  ocean_dyn_slab_nudging_step_limit
95 
96  integer :: ierr
97  !---------------------------------------------------------------------------
98 
99  log_newline
100  log_info("OCEAN_DYN_SLAB_setup",*) 'Setup'
101 
102  ocean_dyn_slab_nudging_defval = undef
103 
104  !--- read namelist
105  rewind(io_fid_conf)
106  read(io_fid_conf,nml=param_ocean_dyn_slab,iostat=ierr)
107  if( ierr < 0 ) then !--- missing
108  log_info("OCEAN_DYN_SLAB_setup",*) 'Not found namelist. Default used.'
109  elseif( ierr > 0 ) then !--- fatal error
110  log_error("OCEAN_DYN_SLAB_setup",*) 'Not appropriate names in namelist PARAM_OCEAN_DYN_SLAB. Check!'
111  call prc_abort
112  endif
113  log_nml(param_ocean_dyn_slab)
114 
115  ocean_dyn_slab_heatcapacity = dwatr * cl * ocean_dyn_slab_depth
116 
117  log_newline
118  log_info("OCEAN_DYN_SLAB_setup",*) 'Slab ocean depth [m] : ', ocean_dyn_slab_depth
119  log_info("OCEAN_DYN_SLAB_setup",*) 'Ocean heat capacity [J/K/m2] : ', ocean_dyn_slab_heatcapacity
120 
121  if ( ocean_dyn_slab_nudging ) then
122  call calendar_unit2sec( ocean_dyn_slab_nudging_tausec, ocean_dyn_slab_nudging_tau, ocean_dyn_slab_nudging_tau_unit )
123 
124  log_info("OCEAN_DYN_SLAB_setup",*) 'Use nudging for SST : ON'
125  log_info("OCEAN_DYN_SLAB_setup",*) 'Relaxation time Tau [sec] : ', ocean_dyn_slab_nudging_tausec
126 
127  if ( ocean_dyn_slab_nudging_tausec == 0.0_rp ) then
128  ocean_dyn_slab_offline_mode = .true.
129  log_info("OCEAN_DYN_SLAB_setup",*) 'Tau=0 means that SST is completely replaced by the external data.'
130  endif
131 
132  if ( ocean_dyn_slab_nudging_basename(1) == '' ) then
133  log_error("OCEAN_DYN_SLAB_setup",*) 'OCEAN_DYN_SLAB_nudging_basename is necessary !!'
134  call prc_abort
135  endif
136  else
137  log_info("OCEAN_DYN_SLAB_setup",*) 'Use nudging for SST : OFF'
138  endif
139 
140  if ( ocean_dyn_slab_nudging ) then
141  call file_external_input_regist( ocean_dyn_slab_nudging_basename(:), & ! [IN]
142  'OCEAN_TEMP', & ! [IN]
143  'OXY', & ! [IN]
144  ocean_dyn_slab_nudging_enable_periodic_year, & ! [IN]
145  ocean_dyn_slab_nudging_enable_periodic_month, & ! [IN]
146  ocean_dyn_slab_nudging_enable_periodic_day, & ! [IN]
147  ocean_dyn_slab_nudging_step_fixed, & ! [IN]
148  ocean_dyn_slab_nudging_offset, & ! [IN]
149  ocean_dyn_slab_nudging_defval, & ! [IN]
150  ocean_dyn_slab_nudging_check_coordinates, & ! [IN]
151  ocean_dyn_slab_nudging_step_limit ) ! [IN]
152  endif
153 
154  return
subroutine, public calendar_unit2sec(second, value, unit)
Convert several units to second.
real(rp), parameter, public const_dwatr
density of water [kg/m3]
Definition: scale_const.F90:82
real(rp), parameter, public const_cl
specific heat (liquid water) [J/kg/K]
Definition: scale_const.F90:66
integer, public io_fid_conf
Config file ID.
Definition: scale_io.F90:55
module file / external_input
subroutine, public file_external_input_regist(basename, varname, axistype, enable_periodic_year, enable_periodic_month, enable_periodic_day, step_fixed, offset, defval, check_coordinates, step_limit, exist)
Regist data.
real(rp), public const_undef
Definition: scale_const.F90:41
real(rp), public ocean_dyn_slab_depth
water depth of slab ocean [m]
integer, parameter, public file_external_input_file_limit
limit of file (for one item)
module PROCESS
Definition: scale_prc.F90:11
subroutine, public prc_abort
Abort Process.
Definition: scale_prc.F90:338
module CONSTANT
Definition: scale_const.F90:11
module CALENDAR
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ocean_dyn_slab()

subroutine, public scale_ocean_dyn_slab::ocean_dyn_slab ( integer, intent(in)  OKMAX,
integer, intent(in)  OKS,
integer, intent(in)  OKE,
integer, intent(in)  OIA,
integer, intent(in)  OIS,
integer, intent(in)  OIE,
integer, intent(in)  OJA,
integer, intent(in)  OJS,
integer, intent(in)  OJE,
real(rp), dimension (okmax,oia,oja), intent(in)  OCEAN_TEMP_t,
real(rp), dimension (oia,oja), intent(in)  OCEAN_SFLX_G,
real(rp), dimension(oia,oja), intent(in)  OCEAN_SFLX_water,
real(rp), dimension (oia,oja), intent(in)  OCEAN_SFLX_ice,
logical, dimension (oia,oja), intent(in)  calc_flag,
real(dp), intent(in)  dt,
real(dp), intent(in)  NOWDAYSEC,
real(rp), dimension (okmax,oia,oja), intent(inout)  OCEAN_TEMP 
)

Slab ocean model.

Definition at line 170 of file scale_ocean_dyn_slab.F90.

References scale_const::const_emelt, and scale_prc::prc_abort().

Referenced by mod_ocean_driver::ocean_driver_update().

170  use scale_prc, only: &
171  prc_abort
172  use scale_const, only: &
173  emelt => const_emelt
174  use scale_file_external_input, only: &
175  file_external_input_update
176  implicit none
177 
178  integer, intent(in) :: okmax, oks, oke
179  integer, intent(in) :: oia, ois, oie
180  integer, intent(in) :: oja, ojs, oje
181  real(RP), intent(in) :: ocean_temp_t (okmax,oia,oja) ! tendency of ocean temperature
182  real(RP), intent(in) :: ocean_sflx_g (oia,oja) ! heat flux from surface to subsurface (open ocean/sea ice)
183  real(RP), intent(in) :: ocean_sflx_water(oia,oja) ! liquid water flux from surface to subsurface (open ocean/sea ice)
184  real(RP), intent(in) :: ocean_sflx_ice (oia,oja) ! ice water flux from surface to subsurface (open ocean/sea ice)
185  logical, intent(in) :: calc_flag (oia,oja) ! to decide calculate or not
186  real(DP), intent(in) :: dt
187  real(DP), intent(in) :: nowdaysec
188  real(RP), intent(inout) :: ocean_temp (okmax,oia,oja)
189 
190  real(RP) :: ocean_temp_t_ndg(okmax,oia,oja)
191  real(RP) :: ocean_temp_ref (okmax,oia,oja)
192  real(RP) :: rtau
193 
194  logical :: error
195  integer :: k, i, j
196  !---------------------------------------------------------------------------
197 
198  log_progress(*) 'ocean / dynamics / slab'
199 
200  if ( ocean_dyn_slab_nudging ) then
201 
202  call file_external_input_update( 'OCEAN_TEMP', nowdaysec, ocean_temp_ref(:,:,:), error )
203 
204  if ( error ) then
205  log_error("OCEAN_DYN_SLAB",*) 'Requested data is not found!'
206  call prc_abort
207  endif
208 
209  ! if OCEAN_DYN_SLAB_nudging_tau < dt, Nudging acts as quasi-prescribed boundary
210  rtau = 1.0_rp / max(ocean_dyn_slab_nudging_tausec,dt)
211 
212  do j = ojs, oje
213  do i = ois, oie
214  do k = oks, oke
215  ocean_temp_t_ndg(k,i,j) = ( ocean_temp_ref(k,i,j) - ocean_temp(k,i,j) ) * rtau
216  enddo
217  enddo
218  enddo
219 
220  else
221  ocean_temp_t_ndg(:,:,:) = 0.0_rp
222  endif
223 
224  if ( ocean_dyn_slab_offline_mode ) then
225 
226  do j = ojs, oje
227  do i = ois, oie
228  if ( calc_flag(i,j) ) then
229  ocean_temp(oks,i,j) = ocean_temp_ref(oks,i,j)
230  endif
231  enddo
232  enddo
233 
234  else
235 
236  do j = ojs, oje
237  do i = ois, oie
238  if ( calc_flag(i,j) ) then
239  ! heat flux from atm/ice at uppermost ocean layer
240  ocean_temp(oks,i,j) = ocean_temp(oks,i,j) + ocean_temp_t_ndg(oks,i,j) * dt &
241  + ( ocean_sflx_g(i,j) - ocean_sflx_ice(i,j) * emelt ) / ocean_dyn_slab_heatcapacity * dt
242  do k = oks+1, oke
243  ocean_temp(k,i,j) = ocean_temp(k,i,j) + ocean_temp_t_ndg(k,i,j) * dt
244  enddo
245  endif
246  enddo
247  enddo
248 
249  endif
250 
251  return
module file / external_input
module PROCESS
Definition: scale_prc.F90:11
subroutine, public prc_abort
Abort Process.
Definition: scale_prc.F90:338
module CONSTANT
Definition: scale_const.F90:11
real(rp), parameter, public const_emelt
Definition: scale_const.F90:72
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ ocean_dyn_slab_depth

real(rp), public scale_ocean_dyn_slab::ocean_dyn_slab_depth = 10.0_RP

water depth of slab ocean [m]

Definition at line 35 of file scale_ocean_dyn_slab.F90.

Referenced by mod_ocean_driver::ocean_driver_update(), and ocean_dyn_slab_setup().

35  real(RP), public :: ocean_dyn_slab_depth = 10.0_rp
real(rp), public ocean_dyn_slab_depth
water depth of slab ocean [m]