14 use regrid_consts,
only : coordinatemode, default_coordinate_mode
18 implicit none ;
private 20 #include <MOM_memory.h> 23 character(len=40) :: mdl =
"Rossby_front_2d_initialization" 25 #include "version_variable.h" 27 public rossby_front_initialize_thickness
28 public rossby_front_initialize_temperature_salinity
29 public rossby_front_initialize_velocity
32 real,
parameter :: frontfractionalwidth = 0.5
33 real,
parameter :: hmlmin = 0.25
34 real,
parameter :: hmlmax = 0.75
39 subroutine rossby_front_initialize_thickness(h, G, GV, US, param_file, just_read_params)
43 real,
dimension(SZI_(G),SZJ_(G),SZK_(GV)), &
47 logical,
optional,
intent(in) :: just_read_params
50 integer :: i, j, k, is, ie, js, je, nz
51 real :: tz, dml, eta, stretch, h0
52 real :: min_thickness, t_range
55 character(len=40) :: verticalcoordinate
57 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
59 just_read = .false. ;
if (
present(just_read_params)) just_read = just_read_params
62 call mom_mesg(
"Rossby_front_2d_initialization.F90, Rossby_front_initialize_thickness: setting thickness")
64 if (.not.just_read)
call log_version(param_file, mdl, version,
"")
66 call get_param(param_file, mdl,
"MIN_THICKNESS", min_thickness, &
67 'Minimum layer thickness',units=
'm',default=1.e-3, do_not_log=just_read)
68 call get_param(param_file, mdl,
"REGRIDDING_COORDINATE_MODE", verticalcoordinate, &
69 default=default_coordinate_mode, do_not_log=just_read)
70 call get_param(param_file, mdl,
"T_RANGE", t_range,
'Initial temperature range', &
71 units=
'C', default=0.0, do_not_log=just_read)
72 call get_param(param_file, mdl,
"DRHO_DT", drho_dt, default=-0.2, scale=us%kg_m3_to_R, do_not_log=.true.)
76 tz = t_range / g%max_depth
78 select case ( coordinatemode(verticalcoordinate) )
80 case (regridding_layer, regridding_rho)
81 do j = g%jsc,g%jec ;
do i = g%isc,g%iec
82 dml = hml( g, g%geoLatT(i,j) )
83 eta = -( -drho_dt / gv%Rho0 ) * tz * 0.5 * ( dml * dml )
84 stretch = ( ( g%max_depth + eta ) / g%max_depth )
85 h0 = ( g%max_depth /
real(nz) ) * stretch
87 h(i,j,k) = h0 * gv%Z_to_H
91 case (regridding_zstar, regridding_sigma)
92 do j = g%jsc,g%jec ;
do i = g%isc,g%iec
93 dml = hml( g, g%geoLatT(i,j) )
94 eta = -( -drho_dt / gv%Rho0 ) * tz * 0.5 * ( dml * dml )
95 stretch = ( ( g%max_depth + eta ) / g%max_depth )
96 h0 = ( g%max_depth /
real(nz) ) * stretch
98 h(i,j,k) = h0 * gv%Z_to_H
103 call mom_error(fatal,
"Rossby_front_initialize: "// &
104 "Unrecognized i.c. setup - set REGRIDDING_COORDINATE_MODE")
108 end subroutine rossby_front_initialize_thickness
112 subroutine rossby_front_initialize_temperature_salinity(T, S, h, G, GV, &
113 param_file, eqn_of_state, just_read_params)
116 real,
dimension(SZI_(G),SZJ_(G), SZK_(G)),
intent(out) :: t
117 real,
dimension(SZI_(G),SZJ_(G), SZK_(G)),
intent(out) :: s
118 real,
dimension(SZI_(G),SZJ_(G), SZK_(G)),
intent(in) :: h
120 type(
eos_type),
pointer :: eqn_of_state
121 logical,
optional,
intent(in) :: just_read_params
124 integer :: i, j, k, is, ie, js, je, nz
127 real :: y, zc, zi, dtdz
129 character(len=40) :: verticalcoordinate
132 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
134 just_read = .false. ;
if (
present(just_read_params)) just_read = just_read_params
136 call get_param(param_file, mdl,
"REGRIDDING_COORDINATE_MODE", verticalcoordinate, &
137 default=default_coordinate_mode, do_not_log=just_read)
138 call get_param(param_file, mdl,
"S_REF", s_ref,
'Reference salinity', &
139 default=35.0, units=
'1e-3', do_not_log=just_read)
140 call get_param(param_file, mdl,
"T_REF",t_ref,
'Reference temperature',units=
'C',&
141 fail_if_missing=.not.just_read, do_not_log=just_read)
142 call get_param(param_file, mdl,
"T_RANGE",t_range,
'Initial temperature range',&
143 units=
'C', default=0.0, do_not_log=just_read)
145 if (just_read)
return 149 dtdz = t_range / g%max_depth
151 do j = g%jsc,g%jec ;
do i = g%isc,g%iec
155 zc = gv%H_to_Z * (zi - 0.5*h(i,j,k))
156 zc = min( zc, -hml(g, g%geoLatT(i,j)) )
157 t(i,j,k) = t_ref + dtdz * zc
161 end subroutine rossby_front_initialize_temperature_salinity
165 subroutine rossby_front_initialize_velocity(u, v, h, G, GV, US, param_file, just_read_params)
168 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
170 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
172 real,
dimension(SZI_(G),SZJ_(G), SZK_(G)), &
177 logical,
optional,
intent(in) :: just_read_params
184 real :: dml, zi, zc, zm
188 integer :: i, j, k, is, ie, js, je, nz
190 character(len=40) :: verticalcoordinate
192 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
194 just_read = .false. ;
if (
present(just_read_params)) just_read = just_read_params
196 call get_param(param_file, mdl,
"REGRIDDING_COORDINATE_MODE", verticalcoordinate, &
197 default=default_coordinate_mode, do_not_log=just_read)
198 call get_param(param_file, mdl,
"T_RANGE", t_range,
'Initial temperature range', &
199 units=
'C', default=0.0, do_not_log=just_read)
200 call get_param(param_file, mdl,
"DRHO_DT", drho_dt, default=-0.2, scale=us%kg_m3_to_R, do_not_log=.true.)
202 if (just_read)
return 207 do j = g%jsc,g%jec ;
do i = g%isc-1,g%iec+1
208 f = 0.5* (g%CoriolisBu(i,j) + g%CoriolisBu(i,j-1) )
209 dudt = 0.0 ;
if (abs(f) > 0.0) &
210 dudt = ( gv%g_Earth*drho_dt ) / ( f * gv%Rho0 )
211 dml = hml( g, g%geoLatT(i,j) )
212 ty = us%L_to_m*dtdy( g, t_range, g%geoLatT(i,j) )
215 hatu = 0.5*(h(i,j,k)+h(i+1,j,k)) * gv%H_to_Z
218 zm = max( zc + dml, 0. )
219 u(i,j,k) = dudt * ty * zm
223 end subroutine rossby_front_initialize_velocity
228 real function ypseudo( G, lat )
230 real,
intent(in) :: lat
235 ypseudo = ( ( lat - g%south_lat ) / g%len_lat ) - 0.5
236 ypseudo = pi * max(-0.5, min(0.5, ypseudo / frontfractionalwidth))
242 real function hml( G, lat )
244 real,
intent(in) :: lat
246 real :: dhml, hmlmean
248 dhml = 0.5 * ( hmlmax - hmlmin ) * g%max_depth
249 hmlmean = 0.5 * ( hmlmin + hmlmax ) * g%max_depth
250 hml = hmlmean + dhml * sin( ypseudo(g, lat) )
255 real function dtdy( G, dT, lat )
257 real,
intent(in) :: dt
258 real,
intent(in) :: lat
260 real :: pi, dhml, dhdy
264 dhml = 0.5 * ( hmlmax - hmlmin ) * g%max_depth
265 dhdy = dhml * ( pi / ( frontfractionalwidth * g%len_lat * km ) ) * cos( ypseudo(g, lat) )
266 dtdy = -( dt / g%max_depth ) * dhdy
Ocean grid type. See mom_grid for details.
Calculates density of sea water from T, S and P.
A structure that can be parsed to read and document run-time parameters.
Provides the ocean grid type.
The MOM6 facility to parse input files for runtime parameters.
Initial conditions for the 2D Rossby front test.
Describes various unit conversion factors.
Provides a transparent unit rescaling type to facilitate dimensional consistency testing.
Routines for error handling and I/O management.
Calculate the derivatives of density with temperature and salinity from T, S, and P...
Provides subroutines for quantities specific to the equation of state.
An overloaded interface to log version information about modules.
Describes the vertical ocean grid, including unit conversion factors.
Pointers to an assortment of thermodynamic fields that may be available, including potential temperat...
Contains constants for interpreting input parameters that control regridding.
Provides a transparent vertical ocean grid type and supporting routines.
Provides transparent structures with groups of MOM6 variables and supporting routines.
An overloaded interface to read and log the values of various types of parameters.
A control structure for the equation of state.