14 use mom_time_manager,
only : time_type,
operator(+),
operator(/), time_type_to_real
18 implicit none ;
private 20 #include <MOM_memory.h> 22 public scm_cvmix_tests_ts_init
23 public scm_cvmix_tests_surface_forcing_init
24 public scm_cvmix_tests_wind_forcing
25 public scm_cvmix_tests_buoyancy_forcing
35 logical :: usewindstress
36 logical :: useheatflux
37 logical :: useevaporation
38 logical :: usediurnalsw
48 #include "version_variable.h" 50 character(len=40) :: mdl =
"SCM_CVMix_tests" 55 subroutine scm_cvmix_tests_ts_init(T, S, h, G, GV, US, param_file, just_read_params)
58 real,
dimension(SZI_(G),SZJ_(G),SZK_(GV)),
intent(out) :: t
59 real,
dimension(SZI_(G),SZJ_(G),SZK_(GV)),
intent(out) :: s
60 real,
dimension(SZI_(G),SZJ_(G),SZK_(GV)),
intent(in) :: h
63 logical,
optional,
intent(in) :: just_read_params
66 real :: upperlayertempmld
67 real :: upperlayersaltmld
68 real :: upperlayertemp
69 real :: upperlayersalt
70 real :: lowerlayertemp
71 real :: lowerlayersalt
72 real :: lowerlayerdtdz
73 real :: lowerlayerdsdz
74 real :: lowerlayermintemp
75 real :: zc, dz, top, bottom
77 integer :: i, j, k, is, ie, js, je, isd, ied, jsd, jed, nz
79 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
80 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
83 just_read = .false. ;
if (
present(just_read_params)) just_read = just_read_params
85 if (.not.just_read)
call log_version(param_file, mdl, version)
86 call get_param(param_file, mdl,
"SCM_TEMP_MLD", upperlayertempmld, &
87 'Initial temp mixed layer depth', &
88 units=
'm', default=0.0, scale=us%m_to_Z, do_not_log=just_read)
89 call get_param(param_file, mdl,
"SCM_SALT_MLD", upperlayersaltmld, &
90 'Initial salt mixed layer depth', &
91 units=
'm', default=0.0, scale=us%m_to_Z, do_not_log=just_read)
92 call get_param(param_file, mdl,
"SCM_L1_SALT", upperlayersalt, &
93 'Layer 2 surface salinity', units=
'1e-3', default=35.0, do_not_log=just_read)
94 call get_param(param_file, mdl,
"SCM_L1_TEMP", upperlayertemp, &
95 'Layer 1 surface temperature', units=
'C', default=20.0, do_not_log=just_read)
96 call get_param(param_file, mdl,
"SCM_L2_SALT", lowerlayersalt, &
97 'Layer 2 surface salinity', units=
'1e-3', default=35.0, do_not_log=just_read)
98 call get_param(param_file, mdl,
"SCM_L2_TEMP", lowerlayertemp, &
99 'Layer 2 surface temperature', units=
'C', default=20.0, do_not_log=just_read)
100 call get_param(param_file, mdl,
"SCM_L2_DTDZ", lowerlayerdtdz, &
101 'Initial temperature stratification in layer 2', &
102 units=
'C/m', default=0.0, scale=us%Z_to_m, do_not_log=just_read)
103 call get_param(param_file, mdl,
"SCM_L2_DSDZ", lowerlayerdsdz, &
104 'Initial salinity stratification in layer 2', &
105 units=
'PPT/m', default=0.0, scale=us%Z_to_m, do_not_log=just_read)
106 call get_param(param_file, mdl,
"SCM_L2_MINTEMP",lowerlayermintemp, &
107 'Layer 2 minimum temperature', units=
'C', default=4.0, do_not_log=just_read)
109 if (just_read)
return 111 do j=js,je ;
do i=is,ie
115 bottom = bottom - h(i,j,k)*gv%H_to_Z
116 zc = 0.5*( top + bottom )
117 dz = min(0., zc + upperlayertempmld)
118 t(i,j,k) = max(lowerlayermintemp,lowerlayertemp + lowerlayerdtdz * dz)
119 dz = min(0., zc + upperlayersaltmld)
120 s(i,j,k) = lowerlayersalt + lowerlayerdsdz * dz
125 end subroutine scm_cvmix_tests_ts_init
128 subroutine scm_cvmix_tests_surface_forcing_init(Time, G, param_file, CS)
129 type(time_type),
intent(in) :: time
136 # include "version_variable.h" 141 if (
associated(cs))
then 142 call mom_error(fatal,
"SCM_CVMix_tests_surface_forcing_init called with an associated "// &
143 "control structure.")
150 call get_param(param_file, mdl,
"SCM_USE_WIND_STRESS", &
151 cs%UseWindStress,
"Wind Stress switch "// &
152 "used in the SCM CVMix surface forcing.", &
153 units=
'', default=.false.)
154 call get_param(param_file, mdl,
"SCM_USE_HEAT_FLUX", &
155 cs%UseHeatFlux,
"Heat flux switch "// &
156 "used in the SCM CVMix test surface forcing.", &
157 units=
'', default=.false.)
158 call get_param(param_file, mdl,
"SCM_USE_EVAPORATION", &
159 cs%UseEvaporation,
"Evaporation switch "// &
160 "used in the SCM CVMix test surface forcing.", &
161 units=
'', default=.false.)
162 call get_param(param_file, mdl,
"SCM_USE_DIURNAL_SW", &
163 cs%UseDiurnalSW,
"Diurnal sw radation switch "// &
164 "used in the SCM CVMix test surface forcing.", &
165 units=
'', default=.false.)
166 if (cs%UseWindStress)
then 167 call get_param(param_file, mdl,
"SCM_TAU_X", &
168 cs%tau_x,
"Constant X-dir wind stress "// &
169 "used in the SCM CVMix test surface forcing.", &
170 units=
'N/m2', scale=us%kg_m2s_to_RZ_T*us%m_s_to_L_T, fail_if_missing=.true.)
171 call get_param(param_file, mdl,
"SCM_TAU_Y", &
172 cs%tau_y,
"Constant y-dir wind stress "// &
173 "used in the SCM CVMix test surface forcing.", &
174 units=
'N/m2', scale=us%kg_m2s_to_RZ_T*us%m_s_to_L_T, fail_if_missing=.true.)
176 if (cs%UseHeatFlux)
then 177 call get_param(param_file, mdl,
"SCM_HEAT_FLUX", &
178 cs%surf_HF,
"Constant surface heat flux "// &
179 "used in the SCM CVMix test surface forcing.", &
180 units=
'm K/s', scale=us%m_to_Z*us%T_to_s, fail_if_missing=.true.)
182 if (cs%UseEvaporation)
then 183 call get_param(param_file, mdl,
"SCM_EVAPORATION", &
184 cs%surf_evap,
"Constant surface evaporation "// &
185 "used in the SCM CVMix test surface forcing.", &
186 units=
'm/s', scale=us%m_to_Z*us%T_to_s, fail_if_missing=.true.)
188 if (cs%UseDiurnalSW)
then 189 call get_param(param_file, mdl,
"SCM_DIURNAL_SW_MAX", &
190 cs%Max_sw,
"Maximum diurnal sw radiation "// &
191 "used in the SCM CVMix test surface forcing.", &
192 units=
'm K/s', scale=us%m_to_Z*us%T_to_s, fail_if_missing=.true.)
194 call get_param(param_file, mdl,
"RHO_0", cs%Rho0, &
195 "The mean ocean density used with BOUSSINESQ true to "//&
196 "calculate accelerations and the mass for conservation "//&
197 "properties, or with BOUSSINSEQ false to convert some "//&
198 "parameters from vertical units of m to kg m-2.", &
199 units=
"kg m-3", default=1035.0, scale=us%kg_m3_to_R)
201 end subroutine scm_cvmix_tests_surface_forcing_init
203 subroutine scm_cvmix_tests_wind_forcing(sfc_state, forces, day, G, US, CS)
206 type(time_type),
intent(in) :: day
211 integer :: i, j, is, ie, js, je, isq, ieq, jsq, jeq
212 integer :: isd, ied, jsd, jed, isdb, iedb, jsdb, jedb
215 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
216 isq = g%IscB ; ieq = g%IecB ; jsq = g%JscB ; jeq = g%JecB
217 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
218 isdb = g%IsdB ; iedb = g%IedB ; jsdb = g%JsdB ; jedb = g%JedB
220 do j=js,je ;
do i=isq,ieq
221 forces%taux(i,j) = cs%tau_x
223 do j=jsq,jeq ;
do i=is,ie
224 forces%tauy(i,j) = cs%tau_y
226 call pass_vector(forces%taux, forces%tauy, g%Domain, to_all)
228 mag_tau = sqrt(cs%tau_x*cs%tau_x + cs%tau_y*cs%tau_y)
229 if (
associated(forces%ustar))
then ;
do j=js,je ;
do i=is,ie
230 forces%ustar(i,j) = sqrt( us%L_to_Z * mag_tau / (cs%Rho0) )
231 enddo ;
enddo ;
endif 233 end subroutine scm_cvmix_tests_wind_forcing
236 subroutine scm_cvmix_tests_buoyancy_forcing(sfc_state, fluxes, day, G, US, CS)
238 type(
forcing),
intent(inout) :: fluxes
239 type(time_type),
intent(in) :: day
245 integer :: i, j, is, ie, js, je, isq, ieq, jsq, jeq
246 integer :: isd, ied, jsd, jed, isdb, iedb, jsdb, jedb
252 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
253 isq = g%IscB ; ieq = g%IecB ; jsq = g%JscB ; jeq = g%JecB
254 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
255 isdb = g%IsdB ; iedb = g%IedB ; jsdb = g%JsdB ; jedb = g%JedB
257 if (cs%UseHeatFlux)
then 261 do j=jsq,jeq ;
do i=is,ie
262 fluxes%sens(i,j) = cs%surf_HF * cs%Rho0 * fluxes%C_p
266 if (cs%UseEvaporation)
then 267 do j=jsq,jeq ;
do i=is,ie
271 fluxes%evap(i,j) = cs%surf_evap * cs%Rho0
275 if (cs%UseDiurnalSW)
then 276 do j=jsq,jeq ;
do i=is,ie
280 fluxes%sw(i,j) = cs%Max_sw * max(0.0, cos(2*pi*(time_type_to_real(day)/86400.0 - 0.5))) * cs%RHO0 * fluxes%C_p
284 end subroutine scm_cvmix_tests_buoyancy_forcing
Pointers to various fields which may be used describe the surface state of MOM, and which will be ret...
Wraps the FMS time manager functions.
This module implements boundary forcing for MOM6.
Ocean grid type. See mom_grid for details.
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.
Do a halo update on a pair of arrays representing the two components of a vector. ...
Structure that contains pointers to the mechanical forcing at the surface used to drive the liquid oc...
Allocate a pointer to a 1-d, 2-d or 3-d array.
Describes various unit conversion factors.
Provides a transparent unit rescaling type to facilitate dimensional consistency testing.
Convenience functions for safely allocating memory without accidentally reallocating pointer and caus...
Describes the decomposed MOM domain and has routines for communications across PEs.
Routines for error handling and I/O management.
Structure that contains pointers to the boundary forcing used to drive the liquid ocean simulated by ...
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...
Initial conditions and forcing for the single column model (SCM) CVMix test set.
Provides a transparent vertical ocean grid type and supporting routines.
Provides transparent structures with groups of MOM6 variables and supporting routines.
Do a halo update on an array.
Container for surface forcing parameters.
An overloaded interface to read and log the values of various types of parameters.