20 use cvmix_tidal,
only : cvmix_init_tidal, cvmix_compute_simmons_invariant
21 use cvmix_tidal,
only : cvmix_coeffs_tidal, cvmix_tidal_params_type
22 use cvmix_tidal,
only : cvmix_compute_schmittner_invariant, cvmix_compute_schmittnercoeff
23 use cvmix_tidal,
only : cvmix_coeffs_tidal_schmittner
24 use cvmix_kinds_and_types,
only : cvmix_global_params_type
25 use cvmix_put_get,
only : cvmix_put
27 implicit none ;
private
29 #include <MOM_memory.h>
31 public tidal_mixing_init
32 public setup_tidal_diagnostics
33 public calculate_tidal_mixing
34 public post_tidal_diagnostics
35 public tidal_mixing_end
44 real,
pointer,
dimension(:,:,:) :: &
48 kd_niku_work => null(),&
49 kd_itidal_work => null(),&
50 kd_lowmode_work => null(),&
52 vert_dep_3d => null(),&
53 schmittner_coeff_3d => null()
54 real,
pointer,
dimension(:,:,:) :: tidal_qe_md => null()
56 real,
pointer,
dimension(:,:,:) :: kd_lowmode => null()
58 real,
pointer,
dimension(:,:,:) :: fl_lowmode => null()
60 real,
pointer,
dimension(:,:) :: &
61 tke_itidal_used => null(),&
64 polzin_decay_scale_scaled => null(),&
65 polzin_decay_scale => null(),&
66 simmons_coeff_2d => null()
73 logical :: debug = .true.
76 logical :: int_tide_dissipation = .false.
79 integer :: int_tide_profile
82 logical :: lee_wave_dissipation = .false.
87 integer :: lee_wave_profile
91 real :: int_tide_decay_scale
100 real :: decay_scale_factor_lee
103 real :: min_zbot_itides
104 logical :: lowmode_itidal_dissipation = .false.
113 real :: nbotref_polzin
116 real :: polzin_decay_scale_factor
118 real :: polzin_decay_scale_max_factor
121 real :: polzin_min_decay_scale
124 real :: tke_itide_max
129 real :: kappa_h2_factor
130 character(len=200) :: inputdir
132 logical :: use_cvmix_tidal = .false.
135 real :: min_thickness
138 integer :: cvmix_tidal_scheme = -1
139 type(cvmix_tidal_params_type) :: cvmix_tidal_params
140 type(cvmix_global_params_type) :: cvmix_glb_params
141 real :: tidal_max_coef
142 real :: tidal_diss_lim_tc
147 real,
pointer,
dimension(:,:) :: tke_niku => null()
149 real,
pointer,
dimension(:,:) :: tke_itidal => null()
151 real,
pointer,
dimension(:,:) :: nb => null()
152 real,
pointer,
dimension(:,:) :: mask_itidal => null()
153 real,
pointer,
dimension(:,:) :: h2 => null()
154 real,
pointer,
dimension(:,:) :: tideamp => null()
155 real,
allocatable,
dimension(:) :: h_src
156 real,
allocatable,
dimension(:,:) :: tidal_qe_2d
160 real,
allocatable,
dimension(:,:,:) :: tidal_qe_3d_in
162 logical :: answers_2018
171 integer :: id_tke_itidal = -1
172 integer :: id_tke_leewave = -1
173 integer :: id_kd_itidal = -1
174 integer :: id_kd_niku = -1
175 integer :: id_kd_lowmode = -1
176 integer :: id_kd_itidal_work = -1
177 integer :: id_kd_niku_work = -1
178 integer :: id_kd_lowmode_work = -1
179 integer :: id_nb = -1
180 integer :: id_n2_bot = -1
181 integer :: id_n2_meanz = -1
182 integer :: id_fl_itidal = -1
183 integer :: id_fl_lowmode = -1
184 integer :: id_polzin_decay_scale = -1
185 integer :: id_polzin_decay_scale_scaled = -1
186 integer :: id_n2_int = -1
187 integer :: id_simmons_coeff = -1
188 integer :: id_schmittner_coeff = -1
189 integer :: id_tidal_qe_md = -1
190 integer :: id_vert_dep = -1
196 character*(20),
parameter :: stlaurent_profile_string =
"STLAURENT_02"
197 character*(20),
parameter :: polzin_profile_string =
"POLZIN_09"
198 integer,
parameter :: stlaurent_02 = 1
199 integer,
parameter :: polzin_09 = 2
200 character*(20),
parameter :: simmons_scheme_string =
"SIMMONS"
201 character*(20),
parameter :: schmittner_scheme_string =
"SCHMITTNER"
202 integer,
parameter :: simmons = 1
203 integer,
parameter :: schmittner = 2
209 logical function tidal_mixing_init(Time, G, GV, US, param_file, diag, CS)
210 type(time_type),
intent(in) :: time
215 type(
diag_ctrl),
target,
intent(inout) :: diag
219 logical :: read_tideamp
220 logical :: default_2018_answers
221 character(len=20) :: tmpstr, int_tide_profile_str
222 character(len=20) :: cvmix_tidal_scheme_str, tidal_energy_type
223 character(len=200) :: filename, h2_file, niku_tke_input_file
224 character(len=200) :: tidal_energy_file, tideamp_file
225 real :: utide, hamp, prandtl_tidal, max_frac_rough
227 integer :: i, j, is, ie, js, je
228 integer :: isd, ied, jsd, jed
230 # include "version_variable.h"
231 character(len=40) :: mdl =
"MOM_tidal_mixing"
233 if (
associated(cs))
then
234 call mom_error(warning,
"tidal_mixing_init called when control structure "// &
235 "is already associated.")
241 cs%debug = cs%debug.and.is_root_pe()
243 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
244 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
250 "Vertical Tidal Mixing Parameterization")
251 call get_param(param_file, mdl,
"USE_CVMix_TIDAL", cs%use_CVMix_tidal, &
252 "If true, turns on tidal mixing via CVMix", &
255 call get_param(param_file, mdl,
"INPUTDIR", cs%inputdir, default=
".",do_not_log=.true.)
256 cs%inputdir = slasher(cs%inputdir)
257 call get_param(param_file, mdl,
"INT_TIDE_DISSIPATION", cs%int_tide_dissipation, &
258 "If true, use an internal tidal dissipation scheme to "//&
259 "drive diapycnal mixing, along the lines of St. Laurent "//&
260 "et al. (2002) and Simmons et al. (2004).", default=cs%use_CVMix_tidal)
263 tidal_mixing_init = cs%int_tide_dissipation
264 if (.not. tidal_mixing_init)
return
266 call get_param(param_file, mdl,
"DEFAULT_2018_ANSWERS", default_2018_answers, &
267 "This sets the default value for the various _2018_ANSWERS parameters.", &
269 call get_param(param_file, mdl,
"TIDAL_MIXING_2018_ANSWERS", cs%answers_2018, &
270 "If true, use the order of arithmetic and expressions that recover the "//&
271 "answers from the end of 2018. Otherwise, use updated and more robust "//&
272 "forms of the same expressions.", default=default_2018_answers)
274 if (cs%int_tide_dissipation)
then
277 if (cs%use_CVMix_tidal)
then
278 call get_param(param_file, mdl,
"CVMIX_TIDAL_SCHEME", cvmix_tidal_scheme_str, &
279 "CVMIX_TIDAL_SCHEME selects the CVMix tidal mixing "//&
280 "scheme with INT_TIDE_DISSIPATION. Valid values are:\n"//&
281 "\t SIMMONS - Use the Simmons et al (2004) tidal \n"//&
282 "\t mixing scheme.\n"//&
283 "\t SCHMITTNER - Use the Schmittner et al (2014) tidal \n"//&
284 "\t mixing scheme.", &
285 default=simmons_scheme_string)
286 cvmix_tidal_scheme_str = uppercase(cvmix_tidal_scheme_str)
288 select case (cvmix_tidal_scheme_str)
289 case (simmons_scheme_string) ; cs%CVMix_tidal_scheme = simmons
290 case (schmittner_scheme_string) ; cs%CVMix_tidal_scheme = schmittner
292 call mom_error(fatal,
"tidal_mixing_init: Unrecognized setting "// &
293 "#define CVMIX_TIDAL_SCHEME "//trim(cvmix_tidal_scheme_str)//
" found in input file.")
298 if ( cs%CVMix_tidal_scheme.eq.schmittner .or. .not. cs%use_CVMix_tidal)
then
299 call get_param(param_file, mdl,
"INT_TIDE_PROFILE", int_tide_profile_str, &
300 "INT_TIDE_PROFILE selects the vertical profile of energy "//&
301 "dissipation with INT_TIDE_DISSIPATION. Valid values are:\n"//&
302 "\t STLAURENT_02 - Use the St. Laurent et al exponential \n"//&
303 "\t decay profile.\n"//&
304 "\t POLZIN_09 - Use the Polzin WKB-stretched algebraic \n"//&
305 "\t decay profile.", &
306 default=stlaurent_profile_string)
307 int_tide_profile_str = uppercase(int_tide_profile_str)
309 select case (int_tide_profile_str)
310 case (stlaurent_profile_string) ; cs%int_tide_profile = stlaurent_02
311 case (polzin_profile_string) ; cs%int_tide_profile = polzin_09
313 call mom_error(fatal,
"tidal_mixing_init: Unrecognized setting "// &
314 "#define INT_TIDE_PROFILE "//trim(int_tide_profile_str)//
" found in input file.")
318 elseif (cs%use_CVMix_tidal)
then
319 call mom_error(fatal,
"tidal_mixing_init: Cannot set INT_TIDE_DISSIPATION to False "// &
320 "when USE_CVMix_TIDAL is set to True.")
323 call get_param(param_file, mdl,
"LEE_WAVE_DISSIPATION", cs%Lee_wave_dissipation, &
324 "If true, use an lee wave driven dissipation scheme to "//&
325 "drive diapycnal mixing, along the lines of Nikurashin "//&
326 "(2010) and using the St. Laurent et al. (2002) "//&
327 "and Simmons et al. (2004) vertical profile", default=.false.)
328 if (cs%lee_wave_dissipation)
then
329 if (cs%use_CVMix_tidal)
then
330 call mom_error(fatal,
"tidal_mixing_init: Lee wave driven dissipation scheme cannot "// &
331 "be used when CVMix tidal mixing scheme is active.")
333 call get_param(param_file, mdl,
"LEE_WAVE_PROFILE", tmpstr, &
334 "LEE_WAVE_PROFILE selects the vertical profile of energy "//&
335 "dissipation with LEE_WAVE_DISSIPATION. Valid values are:\n"//&
336 "\t STLAURENT_02 - Use the St. Laurent et al exponential \n"//&
337 "\t decay profile.\n"//&
338 "\t POLZIN_09 - Use the Polzin WKB-stretched algebraic \n"//&
339 "\t decay profile.", &
340 default=stlaurent_profile_string)
341 tmpstr = uppercase(tmpstr)
343 case (stlaurent_profile_string) ; cs%lee_wave_profile = stlaurent_02
344 case (polzin_profile_string) ; cs%lee_wave_profile = polzin_09
346 call mom_error(fatal,
"tidal_mixing_init: Unrecognized setting "// &
347 "#define LEE_WAVE_PROFILE "//trim(tmpstr)//
" found in input file.")
351 call get_param(param_file, mdl,
"INT_TIDE_LOWMODE_DISSIPATION", cs%Lowmode_itidal_dissipation, &
352 "If true, consider mixing due to breaking low modes that "//&
353 "have been remotely generated; as with itidal drag on the "//&
354 "barotropic tide, use an internal tidal dissipation scheme to "//&
355 "drive diapycnal mixing, along the lines of St. Laurent "//&
356 "et al. (2002) and Simmons et al. (2004).", default=.false.)
358 if ((cs%Int_tide_dissipation .and. (cs%int_tide_profile == polzin_09)) .or. &
359 (cs%lee_wave_dissipation .and. (cs%lee_wave_profile == polzin_09)))
then
360 if (cs%use_CVMix_tidal)
then
361 call mom_error(fatal,
"tidal_mixing_init: Polzin scheme cannot "// &
362 "be used when CVMix tidal mixing scheme is active.")
364 call get_param(param_file, mdl,
"NU_POLZIN", cs%Nu_Polzin, &
365 "When the Polzin decay profile is used, this is a "//&
366 "non-dimensional constant in the expression for the "//&
367 "vertical scale of decay for the tidal energy dissipation.", &
368 units=
"nondim", default=0.0697)
369 call get_param(param_file, mdl,
"NBOTREF_POLZIN", cs%Nbotref_Polzin, &
370 "When the Polzin decay profile is used, this is the "//&
371 "reference value of the buoyancy frequency at the ocean "//&
372 "bottom in the Polzin formulation for the vertical "//&
373 "scale of decay for the tidal energy dissipation.", &
374 units=
"s-1", default=9.61e-4, scale=us%T_to_s)
375 call get_param(param_file, mdl,
"POLZIN_DECAY_SCALE_FACTOR", &
376 cs%Polzin_decay_scale_factor, &
377 "When the Polzin decay profile is used, this is a "//&
378 "scale factor for the vertical scale of decay of the tidal "//&
379 "energy dissipation.", default=1.0, units=
"nondim")
380 call get_param(param_file, mdl,
"POLZIN_SCALE_MAX_FACTOR", &
381 cs%Polzin_decay_scale_max_factor, &
382 "When the Polzin decay profile is used, this is a factor "//&
383 "to limit the vertical scale of decay of the tidal "//&
384 "energy dissipation to POLZIN_DECAY_SCALE_MAX_FACTOR "//&
385 "times the depth of the ocean.", units=
"nondim", default=1.0)
386 call get_param(param_file, mdl,
"POLZIN_MIN_DECAY_SCALE", cs%Polzin_min_decay_scale, &
387 "When the Polzin decay profile is used, this is the "//&
388 "minimum vertical decay scale for the vertical profile\n"//&
389 "of internal tide dissipation with the Polzin (2009) formulation", &
390 units=
"m", default=0.0, scale=us%m_to_Z)
393 if (cs%Int_tide_dissipation .or. cs%Lee_wave_dissipation)
then
394 call get_param(param_file, mdl,
"INT_TIDE_DECAY_SCALE", cs%Int_tide_decay_scale, &
395 "The decay scale away from the bottom for tidal TKE with "//&
396 "the new coding when INT_TIDE_DISSIPATION is used.", &
398 units=
"m", default=500.0, scale=us%m_to_Z)
399 call get_param(param_file, mdl,
"MU_ITIDES", cs%Mu_itides, &
400 "A dimensionless turbulent mixing efficiency used with "//&
401 "INT_TIDE_DISSIPATION, often 0.2.", units=
"nondim", default=0.2)
402 call get_param(param_file, mdl,
"GAMMA_ITIDES", cs%Gamma_itides, &
403 "The fraction of the internal tidal energy that is "//&
404 "dissipated locally with INT_TIDE_DISSIPATION. "//&
405 "THIS NAME COULD BE BETTER.", &
406 units=
"nondim", default=0.3333)
407 call get_param(param_file, mdl,
"MIN_ZBOT_ITIDES", cs%min_zbot_itides, &
408 "Turn off internal tidal dissipation when the total "//&
409 "ocean depth is less than this value.", units=
"m", default=0.0, scale=us%m_to_Z)
412 if ( (cs%Int_tide_dissipation .or. cs%Lee_wave_dissipation) .and. &
413 .not. cs%use_CVMix_tidal)
then
415 call safe_alloc_ptr(cs%Nb,isd,ied,jsd,jed)
416 call safe_alloc_ptr(cs%h2,isd,ied,jsd,jed)
417 call safe_alloc_ptr(cs%TKE_itidal,isd,ied,jsd,jed)
418 call safe_alloc_ptr(cs%mask_itidal,isd,ied,jsd,jed) ; cs%mask_itidal(:,:) = 1.0
420 call get_param(param_file, mdl,
"KAPPA_ITIDES", cs%kappa_itides, &
421 "A topographic wavenumber used with INT_TIDE_DISSIPATION. "//&
422 "The default is 2pi/10 km, as in St.Laurent et al. 2002.", &
423 units=
"m-1", default=8.e-4*atan(1.0), scale=us%Z_to_m)
425 call get_param(param_file, mdl,
"UTIDE", cs%utide, &
426 "The constant tidal amplitude used with INT_TIDE_DISSIPATION.", &
427 units=
"m s-1", default=0.0, scale=us%m_to_Z*us%T_to_s)
428 call safe_alloc_ptr(cs%tideamp,is,ie,js,je) ; cs%tideamp(:,:) = cs%utide
430 call get_param(param_file, mdl,
"KAPPA_H2_FACTOR", cs%kappa_h2_factor, &
431 "A scaling factor for the roughness amplitude with "//&
432 "INT_TIDE_DISSIPATION.", units=
"nondim", default=1.0)
433 call get_param(param_file, mdl,
"TKE_ITIDE_MAX", cs%TKE_itide_max, &
434 "The maximum internal tide energy source available to mix "//&
435 "above the bottom boundary layer with INT_TIDE_DISSIPATION.", &
436 units=
"W m-2", default=1.0e3, scale=us%m_to_Z**3*us%T_to_s**3)
438 call get_param(param_file, mdl,
"READ_TIDEAMP", read_tideamp, &
439 "If true, read a file (given by TIDEAMP_FILE) containing "//&
440 "the tidal amplitude with INT_TIDE_DISSIPATION.", default=.false.)
441 if (read_tideamp)
then
442 if (cs%use_CVMix_tidal)
then
443 call mom_error(fatal,
"tidal_mixing_init: Tidal amplitude files are "// &
444 "not compatible with CVMix tidal mixing. ")
446 call get_param(param_file, mdl,
"TIDEAMP_FILE", tideamp_file, &
447 "The path to the file containing the spatially varying "//&
448 "tidal amplitudes with INT_TIDE_DISSIPATION.", default=
"tideamp.nc")
449 filename = trim(cs%inputdir) // trim(tideamp_file)
450 call log_param(param_file, mdl,
"INPUTDIR/TIDEAMP_FILE", filename)
451 call mom_read_data(filename,
'tideamp', cs%tideamp, g%domain, timelevel=1, scale=us%m_to_Z*us%T_to_s)
454 call get_param(param_file, mdl,
"H2_FILE", h2_file, &
455 "The path to the file containing the sub-grid-scale "//&
456 "topographic roughness amplitude with INT_TIDE_DISSIPATION.", &
457 fail_if_missing=(.not.cs%use_CVMix_tidal))
458 filename = trim(cs%inputdir) // trim(h2_file)
459 call log_param(param_file, mdl,
"INPUTDIR/H2_FILE", filename)
460 call mom_read_data(filename,
'h2', cs%h2, g%domain, timelevel=1, scale=us%m_to_Z**2)
462 call get_param(param_file, mdl,
"FRACTIONAL_ROUGHNESS_MAX", max_frac_rough, &
463 "The maximum topographic roughness amplitude as a fraction of the mean depth, "//&
464 "or a negative value for no limitations on roughness.", &
465 units=
"nondim", default=0.1)
467 do j=js,je ;
do i=is,ie
468 if (g%bathyT(i,j) < cs%min_zbot_itides) cs%mask_itidal(i,j) = 0.0
469 cs%tideamp(i,j) = cs%tideamp(i,j) * cs%mask_itidal(i,j) * g%mask2dT(i,j)
472 if (cs%answers_2018 .and. (max_frac_rough >= 0.0))
then
473 hamp = min(max_frac_rough*g%bathyT(i,j), sqrt(cs%h2(i,j)))
474 cs%h2(i,j) = hamp*hamp
476 if (max_frac_rough >= 0.0) &
477 cs%h2(i,j) = min((max_frac_rough*g%bathyT(i,j))**2, cs%h2(i,j))
480 utide = cs%tideamp(i,j)
483 cs%TKE_itidal(i,j) = 0.5 * cs%kappa_h2_factor * gv%Rho0 * &
484 cs%kappa_itides * cs%h2(i,j) * utide*utide
489 if (cs%Lee_wave_dissipation)
then
491 call get_param(param_file, mdl,
"NIKURASHIN_TKE_INPUT_FILE",niku_tke_input_file, &
492 "The path to the file containing the TKE input from lee "//&
493 "wave driven mixing. Used with LEE_WAVE_DISSIPATION.", &
494 fail_if_missing=.true.)
495 call get_param(param_file, mdl,
"NIKURASHIN_SCALE",niku_scale, &
496 "A non-dimensional factor by which to scale the lee-wave "//&
497 "driven TKE input. Used with LEE_WAVE_DISSIPATION.", &
498 units=
"nondim", default=1.0)
500 filename = trim(cs%inputdir) // trim(niku_tke_input_file)
501 call log_param(param_file, mdl,
"INPUTDIR/NIKURASHIN_TKE_INPUT_FILE", &
503 call safe_alloc_ptr(cs%TKE_Niku,is,ie,js,je) ; cs%TKE_Niku(:,:) = 0.0
504 call mom_read_data(filename,
'TKE_input', cs%TKE_Niku, g%domain, timelevel=1, &
505 scale=us%m_to_Z**3*us%T_to_s**3)
506 cs%TKE_Niku(:,:) = niku_scale * cs%TKE_Niku(:,:)
508 call get_param(param_file, mdl,
"GAMMA_NIKURASHIN",cs%Gamma_lee, &
509 "The fraction of the lee wave energy that is dissipated "//&
510 "locally with LEE_WAVE_DISSIPATION.", units=
"nondim", &
512 call get_param(param_file, mdl,
"DECAY_SCALE_FACTOR_LEE",cs%Decay_scale_factor_lee, &
513 "Scaling for the vertical decay scaleof the local "//&
514 "dissipation of lee waves dissipation.", units=
"nondim", &
517 cs%Decay_scale_factor_lee = -9.e99
521 if (cs%use_CVMix_tidal)
then
525 call get_param(param_file, mdl,
"TIDAL_MAX_COEF", cs%tidal_max_coef, &
526 "largest acceptable value for tidal diffusivity", &
527 units=
"m^2/s", default=50e-4)
528 call get_param(param_file, mdl,
"TIDAL_DISS_LIM_TC", cs%tidal_diss_lim_tc, &
529 "Min allowable depth for dissipation for tidal-energy-constituent data. "//&
530 "No dissipation contribution is applied above TIDAL_DISS_LIM_TC.", &
531 units=
"m", default=0.0, scale=us%m_to_Z)
532 call get_param(param_file, mdl,
"TIDAL_ENERGY_FILE",tidal_energy_file, &
533 "The path to the file containing tidal energy "//&
534 "dissipation. Used with CVMix tidal mixing schemes.", &
535 fail_if_missing=.true.)
536 call get_param(param_file, mdl,
'MIN_THICKNESS', cs%min_thickness, default=0.001, &
538 call get_param(param_file, mdl,
"PRANDTL_TIDAL", prandtl_tidal, &
539 "Prandtl number used by CVMix tidal mixing schemes "//&
540 "to convert vertical diffusivities into viscosities.", &
541 units=
"nondim", default=1.0, &
543 call cvmix_put(cs%CVMix_glb_params,
'Prandtl',prandtl_tidal)
545 tidal_energy_file = trim(cs%inputdir) // trim(tidal_energy_file)
546 call get_param(param_file, mdl,
"TIDAL_ENERGY_TYPE",tidal_energy_type, &
547 "The type of input tidal energy flux dataset. Valid values are"//&
550 fail_if_missing=.true.)
553 (uppercase(tidal_energy_type(1:4)).eq.
'JAYN' .and. cs%CVMix_tidal_scheme.eq.simmons).or. &
554 (uppercase(tidal_energy_type(1:4)).eq.
'ER03' .and. cs%CVMix_tidal_scheme.eq.schmittner) ) )
then
555 call mom_error(fatal,
"tidal_mixing_init: Tidal energy file type ("//&
556 trim(tidal_energy_type)//
") is incompatible with CVMix tidal "//&
557 " mixing scheme: "//trim(cvmix_tidal_scheme_str) )
559 cvmix_tidal_scheme_str = lowercase(cvmix_tidal_scheme_str)
562 call cvmix_init_tidal(cvmix_tidal_params_user = cs%CVMix_tidal_params, &
563 mix_scheme = cvmix_tidal_scheme_str, &
564 efficiency = cs%Mu_itides, &
565 vertical_decay_scale = cs%int_tide_decay_scale*us%Z_to_m, &
566 max_coefficient = cs%tidal_max_coef, &
567 local_mixing_frac = cs%Gamma_itides, &
568 depth_cutoff = cs%min_zbot_itides*us%Z_to_m)
570 call read_tidal_energy(g, us, tidal_energy_type, tidal_energy_file, cs)
578 if (cs%Int_tide_dissipation .or. cs%Lee_wave_dissipation .or. &
579 cs%Lowmode_itidal_dissipation)
then
581 cs%id_Kd_itidal = register_diag_field(
'ocean_model',
'Kd_itides',diag%axesTi,time, &
582 'Internal Tide Driven Diffusivity',
'm2 s-1', conversion=us%Z2_T_to_m2_s)
584 if (cs%use_CVMix_tidal)
then
585 cs%id_N2_int = register_diag_field(
'ocean_model',
'N2_int',diag%axesTi,time, &
586 'Bouyancy frequency squared, at interfaces',
's-2')
588 cs%id_Simmons_coeff = register_diag_field(
'ocean_model',
'Simmons_coeff',diag%axesT1,time, &
589 'time-invariant portion of the tidal mixing coefficient using the Simmons',
'')
590 cs%id_Schmittner_coeff = register_diag_field(
'ocean_model',
'Schmittner_coeff',diag%axesTL,time, &
591 'time-invariant portion of the tidal mixing coefficient using the Schmittner',
'')
592 cs%id_tidal_qe_md = register_diag_field(
'ocean_model',
'tidal_qe_md',diag%axesTL,time, &
593 'input tidal energy dissipated locally interpolated to model vertical coordinates',
'')
594 cs%id_vert_dep = register_diag_field(
'ocean_model',
'vert_dep',diag%axesTi,time, &
595 'vertical deposition function needed for Simmons et al tidal mixing',
'')
598 cs%id_TKE_itidal = register_diag_field(
'ocean_model',
'TKE_itidal',diag%axesT1,time, &
599 'Internal Tide Driven Turbulent Kinetic Energy',
'W m-2', conversion=(us%Z_to_m**3*us%s_to_T**3))
600 cs%id_Nb = register_diag_field(
'ocean_model',
'Nb',diag%axesT1,time, &
601 'Bottom Buoyancy Frequency',
's-1', conversion=us%s_to_T)
603 cs%id_Kd_lowmode = register_diag_field(
'ocean_model',
'Kd_lowmode',diag%axesTi,time, &
604 'Internal Tide Driven Diffusivity (from propagating low modes)', &
605 'm2 s-1', conversion=us%Z2_T_to_m2_s)
607 cs%id_Fl_itidal = register_diag_field(
'ocean_model',
'Fl_itides',diag%axesTi,time, &
608 'Vertical flux of tidal turbulent dissipation', &
609 'm3 s-3', conversion=(us%Z_to_m**3*us%s_to_T**3))
611 cs%id_Fl_lowmode = register_diag_field(
'ocean_model',
'Fl_lowmode',diag%axesTi,time, &
612 'Vertical flux of tidal turbulent dissipation (from propagating low modes)', &
613 'm3 s-3', conversion=(us%Z_to_m**3*us%s_to_T**3))
615 cs%id_Polzin_decay_scale = register_diag_field(
'ocean_model',
'Polzin_decay_scale',diag%axesT1,time, &
616 'Vertical decay scale for the tidal turbulent dissipation with Polzin scheme', &
617 'm', conversion=us%Z_to_m)
619 cs%id_Polzin_decay_scale_scaled = register_diag_field(
'ocean_model', &
620 'Polzin_decay_scale_scaled', diag%axesT1, time, &
621 'Vertical decay scale for the tidal turbulent dissipation with Polzin scheme, '// &
622 'scaled by N2_bot/N2_meanz',
'm', conversion=us%Z_to_m)
624 cs%id_N2_bot = register_diag_field(
'ocean_model',
'N2_b',diag%axesT1,time, &
625 'Bottom Buoyancy frequency squared',
's-2', conversion=us%s_to_T**2)
627 cs%id_N2_meanz = register_diag_field(
'ocean_model',
'N2_meanz', diag%axesT1, time, &
628 'Buoyancy frequency squared averaged over the water column',
's-2', conversion=us%s_to_T**2)
630 cs%id_Kd_Itidal_Work = register_diag_field(
'ocean_model',
'Kd_Itidal_Work',diag%axesTL,time, &
631 'Work done by Internal Tide Diapycnal Mixing',
'W m-2', conversion=(us%Z_to_m**3*us%s_to_T**3))
633 cs%id_Kd_Niku_Work = register_diag_field(
'ocean_model',
'Kd_Nikurashin_Work',diag%axesTL,time, &
634 'Work done by Nikurashin Lee Wave Drag Scheme',
'W m-2', conversion=(us%Z_to_m**3*us%s_to_T**3))
636 cs%id_Kd_Lowmode_Work = register_diag_field(
'ocean_model',
'Kd_Lowmode_Work',diag%axesTL,time, &
637 'Work done by Internal Tide Diapycnal Mixing (low modes)', &
638 'W m-2', conversion=(us%Z_to_m**3*us%s_to_T**3))
640 if (cs%Lee_wave_dissipation)
then
641 cs%id_TKE_leewave = register_diag_field(
'ocean_model',
'TKE_leewave',diag%axesT1,time, &
642 'Lee wave Driven Turbulent Kinetic Energy',
'W m-2', conversion=(us%Z_to_m**3*us%s_to_T**3))
643 cs%id_Kd_Niku = register_diag_field(
'ocean_model',
'Kd_Nikurashin',diag%axesTi,time, &
644 'Lee Wave Driven Diffusivity',
'm2 s-1', conversion=us%Z2_T_to_m2_s)
649 end function tidal_mixing_init
655 subroutine calculate_tidal_mixing(h, N2_bot, j, TKE_to_Kd, max_TKE, G, GV, US, CS, &
656 N2_lay, N2_int, Kd_lay, Kd_int, Kd_max, Kv)
660 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
662 real,
dimension(SZI_(G)),
intent(in) :: n2_bot
664 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: n2_lay
666 real,
dimension(SZI_(G),SZK_(G)+1),
intent(in) :: n2_int
668 integer,
intent(in) :: j
669 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: tke_to_kd
674 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: max_tke
677 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
678 intent(inout) :: kd_lay
679 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1), &
680 optional,
intent(inout) :: kd_int
682 real,
intent(in) :: kd_max
686 real,
dimension(:,:,:),
pointer :: kv
689 if (cs%Int_tide_dissipation .or. cs%Lee_wave_dissipation .or. cs%Lowmode_itidal_dissipation)
then
690 if (cs%use_CVMix_tidal)
then
691 call calculate_cvmix_tidal(h, j, g, gv, us, cs, n2_int, kd_lay, kv)
693 call add_int_tide_diffusivity(h, n2_bot, j, tke_to_kd, max_tke, &
694 g, gv, us, cs, n2_lay, kd_lay, kd_int, kd_max)
697 end subroutine calculate_tidal_mixing
702 subroutine calculate_cvmix_tidal(h, j, G, GV, US, CS, N2_int, Kd_lay, Kv)
703 integer,
intent(in) :: j
708 real,
dimension(SZI_(G),SZK_(G)+1),
intent(in) :: N2_int
710 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
712 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
713 intent(inout) :: Kd_lay
714 real,
dimension(:,:,:),
pointer :: Kv
717 real,
dimension(SZK_(G)+1) :: Kd_tidal
718 real,
dimension(SZK_(G)+1) :: Kv_tidal
719 real,
dimension(SZK_(G)+1) :: vert_dep
720 real,
dimension(SZK_(G)+1) :: iFaceHeight
721 real,
dimension(SZK_(G)+1) :: SchmittnerSocn
722 real,
dimension(SZK_(G)) :: cellHeight
723 real,
dimension(SZK_(G)) :: tidal_qe_md
725 real,
dimension(SZK_(G)+1) :: N2_int_i
726 real,
dimension(SZK_(G)) :: Schmittner_coeff
727 real,
dimension(SZK_(G)) :: h_m
728 real,
allocatable,
dimension(:,:) :: exp_hab_zetar
730 integer :: i, k, is, ie
731 real :: dh, hcorr, Simmons_coeff
732 real,
parameter :: rho_fw = 1000.0
734 real :: h_neglect, h_neglect_edge
737 is = g%isc ; ie = g%iec
740 select case (cs%CVMix_tidal_scheme)
744 if (g%mask2dT(i,j)<1) cycle
750 dh = h(i,j,k) * gv%H_to_m
752 hcorr = min( dh - cs%min_thickness, 0. )
753 dh = max( dh, cs%min_thickness )
754 cellheight(k) = ifaceheight(k) - 0.5 * dh
755 ifaceheight(k+1) = ifaceheight(k) - dh
758 call cvmix_compute_simmons_invariant( nlev = g%ke, &
759 energy_flux = cs%tidal_qe_2d(i,j), &
761 simmonscoeff = simmons_coeff, &
762 vertdep = vert_dep, &
765 cvmix_tidal_params_user = cs%CVMix_tidal_params)
770 simmons_coeff = simmons_coeff / cs%Gamma_itides
775 n2_int_i(k) = us%s_to_T**2 * n2_int(i,k)
778 call cvmix_coeffs_tidal( mdiff_out = kv_tidal, &
779 tdiff_out = kd_tidal, &
781 oceandepth = -ifaceheight(g%ke+1),&
782 simmonscoeff = simmons_coeff, &
783 vert_dep = vert_dep, &
786 cvmix_params = cs%CVMix_glb_params, &
787 cvmix_tidal_params_user = cs%CVMix_tidal_params)
791 kd_lay(i,j,k) = kd_lay(i,j,k) + 0.5 * us%m2_s_to_Z2_T * (kd_tidal(k) + kd_tidal(k+1))
795 if (
associated(kv))
then
797 kv(i,j,k) = kv(i,j,k) + us%m2_s_to_Z2_T * kv_tidal(k)
802 if (
associated(dd%Kd_itidal))
then
803 dd%Kd_itidal(i,j,:) = us%m2_s_to_Z2_T*kd_tidal(:)
805 if (
associated(dd%N2_int))
then
806 dd%N2_int(i,j,:) = n2_int(i,:)
808 if (
associated(dd%Simmons_coeff_2d))
then
809 dd%Simmons_coeff_2d(i,j) = simmons_coeff
811 if (
associated(dd%vert_dep_3d))
then
812 dd%vert_dep_3d(i,j,:) = vert_dep(:)
822 allocate(exp_hab_zetar(g%ke+1,g%ke+1))
823 if (gv%Boussinesq)
then
824 h_neglect = gv%m_to_H*1.0e-30 ; h_neglect_edge = gv%m_to_H*1.0e-10
826 h_neglect = gv%kg_m2_to_H*1.0e-30 ; h_neglect_edge = gv%kg_m2_to_H*1.0e-10
832 if (g%mask2dT(i,j)<1) cycle
837 h_m(k) = h(i,j,k)*gv%H_to_m
840 hcorr = min( dh - cs%min_thickness, 0. )
841 dh = max( dh, cs%min_thickness )
842 cellheight(k) = ifaceheight(k) - 0.5 * dh
843 ifaceheight(k+1) = ifaceheight(k) - dh
849 call cvmix_compute_schmittner_invariant(nlev = g%ke, &
850 vertdep = vert_dep, &
851 efficiency = cs%Mu_itides, &
853 exp_hab_zetar = exp_hab_zetar, &
855 cvmix_tidal_params_user = cs%CVMix_tidal_params)
862 call remapping_core_h(cs%remap_cs,
size(cs%h_src), cs%h_src, cs%tidal_qe_3d_in(i,j,:), &
863 g%ke, h_m, tidal_qe_md)
867 call cvmix_compute_schmittnercoeff( nlev = g%ke, &
868 energy_flux = tidal_qe_md(:), &
870 schmittnercoeff = schmittner_coeff, &
871 exp_hab_zetar = exp_hab_zetar, &
872 cvmix_tidal_params_user = cs%CVMix_tidal_params)
876 n2_int_i(k) = us%s_to_T**2 * n2_int(i,k)
879 call cvmix_coeffs_tidal_schmittner( mdiff_out = kv_tidal, &
880 tdiff_out = kd_tidal, &
882 oceandepth = -ifaceheight(g%ke+1), &
883 vert_dep = vert_dep, &
886 schmittnercoeff = schmittner_coeff, &
887 schmittnersouthernocean = schmittnersocn, &
888 cvmix_params = cs%CVMix_glb_params, &
889 cvmix_tidal_params_user = cs%CVMix_tidal_params)
893 kd_lay(i,j,k) = kd_lay(i,j,k) + 0.5 * us%m2_s_to_Z2_T * (kd_tidal(k) + kd_tidal(k+1))
897 if (
associated(kv))
then
899 kv(i,j,k) = kv(i,j,k) + us%m2_s_to_Z2_T * kv_tidal(k)
904 if (
associated(dd%Kd_itidal))
then
905 dd%Kd_itidal(i,j,:) = us%m2_s_to_Z2_T*kd_tidal(:)
907 if (
associated(dd%N2_int))
then
908 dd%N2_int(i,j,:) = n2_int(i,:)
910 if (
associated(dd%Schmittner_coeff_3d))
then
911 dd%Schmittner_coeff_3d(i,j,:) = schmittner_coeff(:)
913 if (
associated(dd%tidal_qe_md))
then
914 dd%tidal_qe_md(i,j,:) = tidal_qe_md(:)
916 if (
associated(dd%vert_dep_3d))
then
917 dd%vert_dep_3d(i,j,:) = vert_dep(:)
921 deallocate(exp_hab_zetar)
924 call mom_error(fatal,
"tidal_mixing_init: Unrecognized setting "// &
925 "#define CVMIX_TIDAL_SCHEME found in input file.")
928 end subroutine calculate_cvmix_tidal
937 subroutine add_int_tide_diffusivity(h, N2_bot, j, TKE_to_Kd, max_TKE, G, GV, US, CS, &
938 N2_lay, Kd_lay, Kd_int, Kd_max)
942 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
944 real,
dimension(SZI_(G)),
intent(in) :: N2_bot
946 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: N2_lay
948 integer,
intent(in) :: j
949 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: TKE_to_Kd
954 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: max_TKE
957 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
958 intent(inout) :: Kd_lay
959 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1), &
960 optional,
intent(inout) :: Kd_int
962 real,
intent(in) :: Kd_max
969 real,
dimension(SZI_(G)) :: &
990 tke_frac_top_lowmode, &
997 real :: TKE_itide_lay
999 real :: TKE_lowmode_lay
1006 real :: TKE_lowmode_tot
1008 logical :: use_Polzin, use_Simmons
1009 character(len=160) :: mesg
1010 integer :: i, k, is, ie, nz
1014 is = g%isc ; ie = g%iec ; nz = g%ke
1017 if (.not.(cs%Int_tide_dissipation .or. cs%Lee_wave_dissipation))
return
1019 do i=is,ie ; htot(i) = 0.0 ; inv_int(i) = 0.0 ; inv_int_lee(i) = 0.0 ; inv_int_low(i) = 0.0 ;
enddo
1020 do k=1,nz ;
do i=is,ie
1021 htot(i) = htot(i) + gv%H_to_Z*h(i,j,k)
1024 i_rho0 = 1.0/gv%Rho0
1026 use_polzin = ((cs%Int_tide_dissipation .and. (cs%int_tide_profile == polzin_09)) .or. &
1027 (cs%lee_wave_dissipation .and. (cs%lee_wave_profile == polzin_09)) .or. &
1028 (cs%Lowmode_itidal_dissipation .and. (cs%int_tide_profile == polzin_09)))
1029 use_simmons = ((cs%Int_tide_dissipation .and. (cs%int_tide_profile == stlaurent_02)) .or. &
1030 (cs%lee_wave_dissipation .and. (cs%lee_wave_profile == stlaurent_02)) .or. &
1031 (cs%Lowmode_itidal_dissipation .and. (cs%int_tide_profile == stlaurent_02)))
1035 if ( use_simmons )
then
1036 izeta = 1.0 / max(cs%Int_tide_decay_scale, gv%H_subroundoff*gv%H_to_Z)
1037 izeta_lee = 1.0 / max(cs%Int_tide_decay_scale*cs%Decay_scale_factor_lee, &
1038 gv%H_subroundoff*gv%H_to_Z)
1040 cs%Nb(i,j) = sqrt(n2_bot(i))
1041 if (
associated(dd%N2_bot)) dd%N2_bot(i,j) = n2_bot(i)
1042 if ( cs%Int_tide_dissipation )
then
1043 if (izeta*htot(i) > 1.0e-14)
then
1044 inv_int(i) = 1.0 / (1.0 - exp(-izeta*htot(i)))
1047 if ( cs%Lee_wave_dissipation )
then
1048 if (izeta_lee*htot(i) > 1.0e-14)
then
1049 inv_int_lee(i) = 1.0 / (1.0 - exp(-izeta_lee*htot(i)))
1052 if ( cs%Lowmode_itidal_dissipation)
then
1053 if (izeta*htot(i) > 1.0e-14)
then
1054 inv_int_low(i) = 1.0 / (1.0 - exp(-izeta*htot(i)))
1057 z_from_bot(i) = gv%H_to_Z*h(i,j,nz)
1062 if ( use_polzin )
then
1064 do i=is,ie ; n2_meanz(i) = 0.0 ;
enddo
1065 do k=1,nz ;
do i=is,ie
1066 n2_meanz(i) = n2_meanz(i) + n2_lay(i,k) * gv%H_to_Z * h(i,j,k)
1069 n2_meanz(i) = n2_meanz(i) / (htot(i) + gv%H_subroundoff*gv%H_to_Z)
1070 if (
associated(dd%N2_meanz)) dd%N2_meanz(i,j) = n2_meanz(i)
1074 do i=is,ie ; htot_wkb(i) = htot(i) ;
enddo
1082 cs%Nb(i,j) = sqrt(n2_bot(i))
1083 if (cs%answers_2018)
then
1084 if ((cs%tideamp(i,j) > 0.0) .and. &
1085 (cs%kappa_itides**2 * cs%h2(i,j) * cs%Nb(i,j)**3 > 1.0e-14*us%T_to_s**3) )
then
1086 z0_polzin(i) = cs%Polzin_decay_scale_factor * cs%Nu_Polzin * &
1087 cs%Nbotref_Polzin**2 * cs%tideamp(i,j) / &
1088 ( cs%kappa_itides**2 * cs%h2(i,j) * cs%Nb(i,j)**3 )
1089 if (z0_polzin(i) < cs%Polzin_min_decay_scale) &
1090 z0_polzin(i) = cs%Polzin_min_decay_scale
1091 if (n2_meanz(i) > 1.0e-14*us%T_to_s**2 )
then
1092 z0_polzin_scaled(i) = z0_polzin(i)*cs%Nb(i,j)**2 / n2_meanz(i)
1094 z0_polzin_scaled(i) = cs%Polzin_decay_scale_max_factor * htot(i)
1096 if (z0_polzin_scaled(i) > (cs%Polzin_decay_scale_max_factor * htot(i)) ) &
1097 z0_polzin_scaled(i) = cs%Polzin_decay_scale_max_factor * htot(i)
1099 z0_polzin(i) = cs%Polzin_decay_scale_max_factor * htot(i)
1100 z0_polzin_scaled(i) = cs%Polzin_decay_scale_max_factor * htot(i)
1103 z0ps_num = (cs%Polzin_decay_scale_factor * cs%Nu_Polzin * cs%Nbotref_Polzin**2) * cs%tideamp(i,j)
1104 z0ps_denom = ( cs%kappa_itides**2 * cs%h2(i,j) * cs%Nb(i,j) * n2_meanz(i) )
1105 if ((cs%tideamp(i,j) > 0.0) .and. &
1106 (z0ps_num < z0ps_denom * cs%Polzin_decay_scale_max_factor * htot(i)))
then
1107 z0_polzin_scaled(i) = z0ps_num / z0ps_denom
1109 if (abs(n2_meanz(i) * z0_polzin_scaled(i)) < &
1110 cs%Nb(i,j)**2 * (cs%Polzin_decay_scale_max_factor * htot(i)))
then
1111 z0_polzin(i) = z0_polzin_scaled(i) * (n2_meanz(i) / cs%Nb(i,j)**2)
1113 z0_polzin(i) = cs%Polzin_decay_scale_max_factor * htot(i)
1116 z0_polzin(i) = cs%Polzin_decay_scale_max_factor * htot(i)
1117 z0_polzin_scaled(i) = cs%Polzin_decay_scale_max_factor * htot(i)
1121 if (
associated(dd%Polzin_decay_scale)) &
1122 dd%Polzin_decay_scale(i,j) = z0_polzin(i)
1123 if (
associated(dd%Polzin_decay_scale_scaled)) &
1124 dd%Polzin_decay_scale_scaled(i,j) = z0_polzin_scaled(i)
1125 if (
associated(dd%N2_bot)) dd%N2_bot(i,j) = cs%Nb(i,j)*cs%Nb(i,j)
1127 if (cs%answers_2018)
then
1129 if ( cs%Int_tide_dissipation .and. (cs%int_tide_profile == polzin_09) )
then
1130 if (htot_wkb(i) > 1.0e-14*us%m_to_Z) &
1131 inv_int(i) = ( z0_polzin_scaled(i) / htot_wkb(i) ) + 1.0
1133 if ( cs%lee_wave_dissipation .and. (cs%lee_wave_profile == polzin_09) )
then
1134 if (htot_wkb(i) > 1.0e-14*us%m_to_Z) &
1135 inv_int_lee(i) = ( z0_polzin_scaled(i)*cs%Decay_scale_factor_lee / htot_wkb(i) ) + 1.0
1137 if ( cs%Lowmode_itidal_dissipation .and. (cs%int_tide_profile == polzin_09) )
then
1138 if (htot_wkb(i) > 1.0e-14*us%m_to_Z) &
1139 inv_int_low(i) = ( z0_polzin_scaled(i) / htot_wkb(i) ) + 1.0
1143 inv_int(i) = 0.0 ; inv_int_lee(i) = 0.0 ; inv_int_low(i) = 0.0
1144 if ( cs%Int_tide_dissipation .and. (cs%int_tide_profile == polzin_09) )
then
1145 if (z0_polzin_scaled(i) < 1.0e14 * htot_wkb(i)) &
1146 inv_int(i) = ( z0_polzin_scaled(i) / htot_wkb(i) ) + 1.0
1148 if ( cs%lee_wave_dissipation .and. (cs%lee_wave_profile == polzin_09) )
then
1149 if (z0_polzin_scaled(i) < 1.0e14 * htot_wkb(i)) &
1150 inv_int_lee(i) = ( z0_polzin_scaled(i)*cs%Decay_scale_factor_lee / htot_wkb(i) ) + 1.0
1152 if ( cs%Lowmode_itidal_dissipation .and. (cs%int_tide_profile == polzin_09) )
then
1153 if (z0_polzin_scaled(i) < 1.0e14 * htot_wkb(i)) &
1154 inv_int_low(i) = ( z0_polzin_scaled(i) / htot_wkb(i) ) + 1.0
1158 z_from_bot(i) = gv%H_to_Z*h(i,j,nz)
1160 if (cs%answers_2018)
then
1161 if (n2_meanz(i) > 1.0e-14*us%T_to_s**2 )
then
1162 z_from_bot_wkb(i) = gv%H_to_Z*h(i,j,nz) * n2_lay(i,nz) / n2_meanz(i)
1163 else ; z_from_bot_wkb(i) = 0 ;
endif
1165 if (gv%H_to_Z*h(i,j,nz) * n2_lay(i,nz) < n2_meanz(i) * (1.0e14 * htot_wkb(i)))
then
1166 z_from_bot_wkb(i) = gv%H_to_Z*h(i,j,nz) * n2_lay(i,nz) / n2_meanz(i)
1167 else ; z_from_bot_wkb(i) = 0 ;
endif
1176 tke_itidal_bot(i) = min(cs%TKE_itidal(i,j)*cs%Nb(i,j), cs%TKE_itide_max)
1177 if (
associated(dd%TKE_itidal_used)) &
1178 dd%TKE_itidal_used(i,j) = tke_itidal_bot(i)
1179 tke_itidal_bot(i) = (i_rho0 * cs%Mu_itides * cs%Gamma_itides) * tke_itidal_bot(i)
1181 tke_niku_bot(i) = 0.0
1182 if (cs%Lee_wave_dissipation)
then
1183 tke_niku_bot(i) = (i_rho0 * cs%Mu_itides * cs%Gamma_lee) * cs%TKE_Niku(i,j)
1186 tke_lowmode_tot = 0.0
1187 tke_lowmode_bot(i) = 0.0
1188 if (cs%Lowmode_itidal_dissipation)
then
1193 write (mesg,*)
"========", __file__, __line__
1194 call mom_error(fatal,trim(mesg)//
": this block not supported yet. (aa)")
1196 tke_lowmode_bot(i) = cs%Mu_itides * i_rho0 * tke_lowmode_tot
1199 tke_itidal_rem(i) = inv_int(i) * tke_itidal_bot(i)
1200 tke_niku_rem(i) = inv_int_lee(i) * tke_niku_bot(i)
1201 tke_lowmode_rem(i) = inv_int_low(i) * tke_lowmode_bot(i)
1203 if (
associated(dd%Fl_itidal)) dd%Fl_itidal(i,j,nz) = tke_itidal_rem(i)
1208 if ( use_simmons )
then
1209 do k=nz-1,2,-1 ;
do i=is,ie
1210 if (max_tke(i,k) <= 0.0) cycle
1211 z_from_bot(i) = z_from_bot(i) + gv%H_to_Z*h(i,j,k)
1214 tke_frac_top(i) = inv_int(i) * exp(-izeta * z_from_bot(i))
1215 tke_frac_top_lee(i) = inv_int_lee(i) * exp(-izeta_lee * z_from_bot(i))
1216 tke_frac_top_lowmode(i) = inv_int_low(i) * exp(-izeta * z_from_bot(i))
1220 tke_itide_lay = tke_itidal_rem(i) - tke_itidal_bot(i) * tke_frac_top(i)
1221 tke_niku_lay = tke_niku_rem(i) - tke_niku_bot(i) * tke_frac_top_lee(i)
1222 tke_lowmode_lay = tke_lowmode_rem(i) - tke_lowmode_bot(i)* tke_frac_top_lowmode(i)
1225 if (tke_itide_lay + tke_niku_lay + tke_lowmode_lay > (max_tke(i,k)))
then
1226 frac_used = (max_tke(i,k)) / (tke_itide_lay + tke_niku_lay + tke_lowmode_lay)
1227 tke_itide_lay = frac_used * tke_itide_lay
1228 tke_niku_lay = frac_used * tke_niku_lay
1229 tke_lowmode_lay = frac_used * tke_lowmode_lay
1233 tke_itidal_rem(i) = tke_itidal_rem(i) - tke_itide_lay
1234 tke_niku_rem(i) = tke_niku_rem(i) - tke_niku_lay
1235 tke_lowmode_rem(i) = tke_lowmode_rem(i) - tke_lowmode_lay
1238 kd_add = tke_to_kd(i,k) * (tke_itide_lay + tke_niku_lay + tke_lowmode_lay)
1240 if (kd_max >= 0.0) kd_add = min(kd_add, kd_max)
1241 kd_lay(i,j,k) = kd_lay(i,j,k) + kd_add
1243 if (
present(kd_int))
then
1244 kd_int(i,j,k) = kd_int(i,j,k) + 0.5 * kd_add
1245 kd_int(i,j,k+1) = kd_int(i,j,k+1) + 0.5 * kd_add
1249 if (
associated(dd%Kd_itidal))
then
1252 kd_add = tke_to_kd(i,k) * tke_itide_lay
1253 if (kd_max >= 0.0) kd_add = min(kd_add, kd_max)
1254 if (k>1) dd%Kd_itidal(i,j,k) = dd%Kd_itidal(i,j,k) + 0.5*kd_add
1255 if (k<nz) dd%Kd_itidal(i,j,k+1) = dd%Kd_itidal(i,j,k+1) + 0.5*kd_add
1257 if (
associated(dd%Kd_Itidal_work)) &
1258 dd%Kd_itidal_work(i,j,k) = gv%Rho0 * tke_itide_lay
1259 if (
associated(dd%Fl_itidal)) dd%Fl_itidal(i,j,k) = tke_itidal_rem(i)
1261 if (
associated(dd%Kd_Niku))
then
1264 kd_add = tke_to_kd(i,k) * tke_niku_lay
1265 if (kd_max >= 0.0) kd_add = min(kd_add, kd_max)
1266 if (k>1) dd%Kd_Niku(i,j,k) = dd%Kd_Niku(i,j,k) + 0.5*kd_add
1267 if (k<nz) dd%Kd_Niku(i,j,k+1) = dd%Kd_Niku(i,j,k+1) + 0.5*kd_add
1270 if (
associated(dd%Kd_Niku_work)) &
1271 dd%Kd_Niku_work(i,j,k) = gv%Rho0 * tke_niku_lay
1273 if (
associated(dd%Kd_lowmode))
then
1276 kd_add = tke_to_kd(i,k) * tke_lowmode_lay
1277 if (kd_max >= 0.0) kd_add = min(kd_add, kd_max)
1278 if (k>1) dd%Kd_lowmode(i,j,k) = dd%Kd_lowmode(i,j,k) + 0.5*kd_add
1279 if (k<nz) dd%Kd_lowmode(i,j,k+1) = dd%Kd_lowmode(i,j,k+1) + 0.5*kd_add
1281 if (
associated(dd%Kd_lowmode_work)) &
1282 dd%Kd_lowmode_work(i,j,k) = gv%Rho0 * tke_lowmode_lay
1283 if (
associated(dd%Fl_lowmode)) dd%Fl_lowmode(i,j,k) = tke_lowmode_rem(i)
1289 if ( use_polzin )
then
1290 do k=nz-1,2,-1 ;
do i=is,ie
1291 if (max_tke(i,k) <= 0.0) cycle
1292 z_from_bot(i) = z_from_bot(i) + gv%H_to_Z*h(i,j,k)
1293 if (n2_meanz(i) > 1.0e-14*us%T_to_s**2 )
then
1294 z_from_bot_wkb(i) = z_from_bot_wkb(i) &
1295 + gv%H_to_Z * h(i,j,k) * n2_lay(i,k) / n2_meanz(i)
1296 else ; z_from_bot_wkb(i) = 0 ;
endif
1299 tke_frac_top(i) = ( inv_int(i) * z0_polzin_scaled(i) ) / &
1300 ( z0_polzin_scaled(i) + z_from_bot_wkb(i) )
1301 z0_psl = z0_polzin_scaled(i)*cs%Decay_scale_factor_lee
1302 tke_frac_top_lee(i) = (inv_int_lee(i) * z0_psl) / (z0_psl + z_from_bot_wkb(i))
1303 tke_frac_top_lowmode(i) = ( inv_int_low(i) * z0_polzin_scaled(i) ) / &
1304 ( z0_polzin_scaled(i) + z_from_bot_wkb(i) )
1308 tke_itide_lay = tke_itidal_rem(i) - tke_itidal_bot(i) *tke_frac_top(i)
1309 tke_niku_lay = tke_niku_rem(i) - tke_niku_bot(i) * tke_frac_top_lee(i)
1310 tke_lowmode_lay = tke_lowmode_rem(i) - tke_lowmode_bot(i)*tke_frac_top_lowmode(i)
1313 if (tke_itide_lay + tke_niku_lay + tke_lowmode_lay > (max_tke(i,k)))
then
1314 frac_used = (max_tke(i,k)) / (tke_itide_lay + tke_niku_lay + tke_lowmode_lay)
1315 tke_itide_lay = frac_used * tke_itide_lay
1316 tke_niku_lay = frac_used * tke_niku_lay
1317 tke_lowmode_lay = frac_used * tke_lowmode_lay
1321 tke_itidal_rem(i) = tke_itidal_rem(i) - tke_itide_lay
1322 tke_niku_rem(i) = tke_niku_rem(i) - tke_niku_lay
1323 tke_lowmode_rem(i) = tke_lowmode_rem(i) - tke_lowmode_lay
1326 kd_add = tke_to_kd(i,k) * (tke_itide_lay + tke_niku_lay + tke_lowmode_lay)
1328 if (kd_max >= 0.0) kd_add = min(kd_add, kd_max)
1329 kd_lay(i,j,k) = kd_lay(i,j,k) + kd_add
1331 if (
present(kd_int))
then
1332 kd_int(i,j,k) = kd_int(i,j,k) + 0.5 * kd_add
1333 kd_int(i,j,k+1) = kd_int(i,j,k+1) + 0.5 * kd_add
1337 if (
associated(dd%Kd_itidal))
then
1340 kd_add = tke_to_kd(i,k) * tke_itide_lay
1341 if (kd_max >= 0.0) kd_add = min(kd_add, kd_max)
1342 if (k>1) dd%Kd_itidal(i,j,k) = dd%Kd_itidal(i,j,k) + 0.5*kd_add
1343 if (k<nz) dd%Kd_itidal(i,j,k+1) = dd%Kd_itidal(i,j,k+1) + 0.5*kd_add
1345 if (
associated(dd%Kd_Itidal_work)) &
1346 dd%Kd_itidal_work(i,j,k) = gv%Rho0 * tke_itide_lay
1347 if (
associated(dd%Fl_itidal)) dd%Fl_itidal(i,j,k) = tke_itidal_rem(i)
1349 if (
associated(dd%Kd_Niku))
then
1352 kd_add = tke_to_kd(i,k) * tke_niku_lay
1353 if (kd_max >= 0.0) kd_add = min(kd_add, kd_max)
1354 if (k>1) dd%Kd_Niku(i,j,k) = dd%Kd_Niku(i,j,k) + 0.5*kd_add
1355 if (k<nz) dd%Kd_Niku(i,j,k+1) = dd%Kd_Niku(i,j,k+1) + 0.5*kd_add
1358 if (
associated(dd%Kd_Niku_work)) dd%Kd_Niku_work(i,j,k) = gv%Rho0 * tke_niku_lay
1360 if (
associated(dd%Kd_lowmode))
then
1363 kd_add = tke_to_kd(i,k) * tke_lowmode_lay
1364 if (kd_max >= 0.0) kd_add = min(kd_add, kd_max)
1365 if (k>1) dd%Kd_lowmode(i,j,k) = dd%Kd_lowmode(i,j,k) + 0.5*kd_add
1366 if (k<nz) dd%Kd_lowmode(i,j,k+1) = dd%Kd_lowmode(i,j,k+1) + 0.5*kd_add
1368 if (
associated(dd%Kd_lowmode_work)) &
1369 dd%Kd_lowmode_work(i,j,k) = gv%Rho0 * tke_lowmode_lay
1370 if (
associated(dd%Fl_lowmode)) dd%Fl_lowmode(i,j,k) = tke_lowmode_rem(i)
1375 end subroutine add_int_tide_diffusivity
1378 subroutine setup_tidal_diagnostics(G,CS)
1383 integer :: isd, ied, jsd, jed, nz
1386 isd = g%isd; ied = g%ied; jsd = g%jsd; jed = g%jed; nz = g%ke
1389 if ((cs%id_Kd_itidal > 0) .or. (cs%id_Kd_Itidal_work > 0))
then
1390 allocate(dd%Kd_itidal(isd:ied,jsd:jed,nz+1)) ; dd%Kd_itidal(:,:,:) = 0.0
1392 if ((cs%id_Kd_lowmode > 0) .or. (cs%id_Kd_lowmode_work > 0))
then
1393 allocate(dd%Kd_lowmode(isd:ied,jsd:jed,nz+1)) ; dd%Kd_lowmode(:,:,:) = 0.0
1395 if ( (cs%id_Fl_itidal > 0) )
then
1396 allocate(dd%Fl_itidal(isd:ied,jsd:jed,nz+1)) ; dd%Fl_itidal(:,:,:) = 0.0
1398 if ( (cs%id_Fl_lowmode > 0) )
then
1399 allocate(dd%Fl_lowmode(isd:ied,jsd:jed,nz+1)) ; dd%Fl_lowmode(:,:,:) = 0.0
1401 if ( (cs%id_Polzin_decay_scale > 0) )
then
1402 allocate(dd%Polzin_decay_scale(isd:ied,jsd:jed))
1403 dd%Polzin_decay_scale(:,:) = 0.0
1405 if ( (cs%id_N2_bot > 0) )
then
1406 allocate(dd%N2_bot(isd:ied,jsd:jed)) ; dd%N2_bot(:,:) = 0.0
1408 if ( (cs%id_N2_meanz > 0) )
then
1409 allocate(dd%N2_meanz(isd:ied,jsd:jed)) ; dd%N2_meanz(:,:) = 0.0
1411 if ( (cs%id_Polzin_decay_scale_scaled > 0) )
then
1412 allocate(dd%Polzin_decay_scale_scaled(isd:ied,jsd:jed))
1413 dd%Polzin_decay_scale_scaled(:,:) = 0.0
1415 if ((cs%id_Kd_Niku > 0) .or. (cs%id_Kd_Niku_work > 0))
then
1416 allocate(dd%Kd_Niku(isd:ied,jsd:jed,nz+1)) ; dd%Kd_Niku(:,:,:) = 0.0
1418 if (cs%id_Kd_Niku_work > 0)
then
1419 allocate(dd%Kd_Niku_work(isd:ied,jsd:jed,nz)) ; dd%Kd_Niku_work(:,:,:) = 0.0
1421 if (cs%id_Kd_Itidal_work > 0)
then
1422 allocate(dd%Kd_Itidal_work(isd:ied,jsd:jed,nz))
1423 dd%Kd_Itidal_work(:,:,:) = 0.0
1425 if (cs%id_Kd_Lowmode_Work > 0)
then
1426 allocate(dd%Kd_Lowmode_Work(isd:ied,jsd:jed,nz))
1427 dd%Kd_Lowmode_Work(:,:,:) = 0.0
1429 if (cs%id_TKE_itidal > 0)
then
1430 allocate(dd%TKE_Itidal_used(isd:ied,jsd:jed)) ; dd%TKE_Itidal_used(:,:) = 0.
1433 if (cs%id_N2_int > 0)
then
1434 allocate(dd%N2_int(isd:ied,jsd:jed,nz+1)) ; dd%N2_int(:,:,:) = 0.0
1436 if (cs%id_Simmons_coeff > 0)
then
1437 if (cs%CVMix_tidal_scheme .ne. simmons)
then
1438 call mom_error(fatal,
"setup_tidal_diagnostics: Simmons_coeff diagnostics is available "//&
1439 "only when CVMix_tidal_scheme is Simmons")
1441 allocate(dd%Simmons_coeff_2d(isd:ied,jsd:jed)) ; dd%Simmons_coeff_2d(:,:) = 0.0
1443 if (cs%id_vert_dep > 0)
then
1444 allocate(dd%vert_dep_3d(isd:ied,jsd:jed,nz+1)) ; dd%vert_dep_3d(:,:,:) = 0.0
1446 if (cs%id_Schmittner_coeff > 0)
then
1447 if (cs%CVMix_tidal_scheme .ne. schmittner)
then
1448 call mom_error(fatal,
"setup_tidal_diagnostics: Schmittner_coeff diagnostics is available "//&
1449 "only when CVMix_tidal_scheme is Schmittner.")
1451 allocate(dd%Schmittner_coeff_3d(isd:ied,jsd:jed,nz)) ; dd%Schmittner_coeff_3d(:,:,:) = 0.0
1453 if (cs%id_tidal_qe_md > 0)
then
1454 if (cs%CVMix_tidal_scheme .ne. schmittner)
then
1455 call mom_error(fatal,
"setup_tidal_diagnostics: tidal_qe_md diagnostics is available "//&
1456 "only when CVMix_tidal_scheme is Schmittner.")
1458 allocate(dd%tidal_qe_md(isd:ied,jsd:jed,nz)) ; dd%tidal_qe_md(:,:,:) = 0.0
1460 end subroutine setup_tidal_diagnostics
1463 subroutine post_tidal_diagnostics(G, GV, h ,CS)
1466 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
1475 if (cs%Int_tide_dissipation .or. cs%Lee_wave_dissipation .or. cs%Lowmode_itidal_dissipation)
then
1476 if (cs%id_TKE_itidal > 0)
call post_data(cs%id_TKE_itidal, dd%TKE_itidal_used, cs%diag)
1477 if (cs%id_TKE_leewave > 0)
call post_data(cs%id_TKE_leewave, cs%TKE_Niku, cs%diag)
1478 if (cs%id_Nb > 0)
call post_data(cs%id_Nb, cs%Nb, cs%diag)
1479 if (cs%id_N2_bot > 0)
call post_data(cs%id_N2_bot, dd%N2_bot, cs%diag)
1480 if (cs%id_N2_meanz > 0)
call post_data(cs%id_N2_meanz,dd%N2_meanz,cs%diag)
1482 if (cs%id_Fl_itidal > 0)
call post_data(cs%id_Fl_itidal, dd%Fl_itidal, cs%diag)
1483 if (cs%id_Kd_itidal > 0)
call post_data(cs%id_Kd_itidal, dd%Kd_itidal, cs%diag)
1484 if (cs%id_Kd_Niku > 0)
call post_data(cs%id_Kd_Niku, dd%Kd_Niku, cs%diag)
1485 if (cs%id_Kd_lowmode> 0)
call post_data(cs%id_Kd_lowmode, dd%Kd_lowmode, cs%diag)
1486 if (cs%id_Fl_lowmode> 0)
call post_data(cs%id_Fl_lowmode, dd%Fl_lowmode, cs%diag)
1488 if (cs%id_N2_int> 0)
call post_data(cs%id_N2_int, dd%N2_int, cs%diag)
1489 if (cs%id_vert_dep> 0)
call post_data(cs%id_vert_dep, dd%vert_dep_3d, cs%diag)
1490 if (cs%id_Simmons_coeff> 0)
call post_data(cs%id_Simmons_coeff, dd%Simmons_coeff_2d, cs%diag)
1491 if (cs%id_Schmittner_coeff> 0)
call post_data(cs%id_Schmittner_coeff, dd%Schmittner_coeff_3d, cs%diag)
1492 if (cs%id_tidal_qe_md> 0)
call post_data(cs%id_tidal_qe_md, dd%tidal_qe_md, cs%diag)
1494 if (cs%id_Kd_Itidal_Work > 0) &
1495 call post_data(cs%id_Kd_Itidal_Work, dd%Kd_Itidal_Work, cs%diag)
1496 if (cs%id_Kd_Niku_Work > 0)
call post_data(cs%id_Kd_Niku_Work, dd%Kd_Niku_Work, cs%diag)
1497 if (cs%id_Kd_Lowmode_Work > 0) &
1498 call post_data(cs%id_Kd_Lowmode_Work, dd%Kd_Lowmode_Work, cs%diag)
1500 if (cs%id_Polzin_decay_scale > 0 ) &
1501 call post_data(cs%id_Polzin_decay_scale, dd%Polzin_decay_scale, cs%diag)
1502 if (cs%id_Polzin_decay_scale_scaled > 0 ) &
1503 call post_data(cs%id_Polzin_decay_scale_scaled, dd%Polzin_decay_scale_scaled, cs%diag)
1506 if (
associated(dd%Kd_itidal))
deallocate(dd%Kd_itidal)
1507 if (
associated(dd%Kd_lowmode))
deallocate(dd%Kd_lowmode)
1508 if (
associated(dd%Fl_itidal))
deallocate(dd%Fl_itidal)
1509 if (
associated(dd%Fl_lowmode))
deallocate(dd%Fl_lowmode)
1510 if (
associated(dd%Polzin_decay_scale))
deallocate(dd%Polzin_decay_scale)
1511 if (
associated(dd%Polzin_decay_scale_scaled))
deallocate(dd%Polzin_decay_scale_scaled)
1512 if (
associated(dd%N2_bot))
deallocate(dd%N2_bot)
1513 if (
associated(dd%N2_meanz))
deallocate(dd%N2_meanz)
1514 if (
associated(dd%Kd_Niku))
deallocate(dd%Kd_Niku)
1515 if (
associated(dd%Kd_Niku_work))
deallocate(dd%Kd_Niku_work)
1516 if (
associated(dd%Kd_Itidal_Work))
deallocate(dd%Kd_Itidal_Work)
1517 if (
associated(dd%Kd_Lowmode_Work))
deallocate(dd%Kd_Lowmode_Work)
1518 if (
associated(dd%TKE_itidal_used))
deallocate(dd%TKE_itidal_used)
1519 if (
associated(dd%N2_int))
deallocate(dd%N2_int)
1520 if (
associated(dd%vert_dep_3d))
deallocate(dd%vert_dep_3d)
1521 if (
associated(dd%Simmons_coeff_2d))
deallocate(dd%Simmons_coeff_2d)
1522 if (
associated(dd%Schmittner_coeff_3d))
deallocate(dd%Schmittner_coeff_3d)
1523 if (
associated(dd%tidal_qe_md))
deallocate(dd%tidal_qe_md)
1525 end subroutine post_tidal_diagnostics
1529 subroutine read_tidal_energy(G, US, tidal_energy_type, tidal_energy_file, CS)
1532 character(len=20),
intent(in) :: tidal_energy_type
1533 character(len=200),
intent(in) :: tidal_energy_file
1536 integer :: i, j, isd, ied, jsd, jed, nz
1537 real,
allocatable,
dimension(:,:) :: tidal_energy_flux_2d
1539 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed ; nz = g%ke
1541 select case (uppercase(tidal_energy_type(1:4)))
1543 if (.not.
allocated(cs%tidal_qe_2d))
allocate(cs%tidal_qe_2d(isd:ied,jsd:jed))
1544 allocate(tidal_energy_flux_2d(isd:ied,jsd:jed))
1545 call mom_read_data(tidal_energy_file,
'wave_dissipation',tidal_energy_flux_2d, g%domain)
1546 do j=g%jsc,g%jec ;
do i=g%isc,g%iec
1547 cs%tidal_qe_2d(i,j) = cs%Gamma_itides * tidal_energy_flux_2d(i,j)
1549 deallocate(tidal_energy_flux_2d)
1551 call read_tidal_constituents(g, us, tidal_energy_file, cs)
1553 call mom_error(fatal,
"read_tidal_energy: Unknown tidal energy file type.")
1556 end subroutine read_tidal_energy
1559 subroutine read_tidal_constituents(G, US, tidal_energy_file, CS)
1562 character(len=200),
intent(in) :: tidal_energy_file
1566 real,
parameter :: C1_3 = 1.0/3.0
1567 real,
dimension(SZI_(G),SZJ_(G)) :: &
1570 real,
allocatable,
dimension(:) :: &
1573 real,
allocatable,
dimension(:,:,:) :: &
1578 integer,
dimension(4) :: nz_in
1579 integer :: k, is, ie, js, je, isd, ied, jsd, jed, i, j
1581 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
1582 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
1585 call field_size(tidal_energy_file,
'z_t', nz_in)
1588 allocate(z_t(nz_in(1)), z_w(nz_in(1)) )
1589 allocate(tc_m2(isd:ied,jsd:jed,nz_in(1)), &
1590 tc_s2(isd:ied,jsd:jed,nz_in(1)), &
1591 tc_k1(isd:ied,jsd:jed,nz_in(1)), &
1592 tc_o1(isd:ied,jsd:jed,nz_in(1)) )
1595 if (.not.
allocated(cs%tidal_qe_3d_in))
allocate(cs%tidal_qe_3d_in(isd:ied,jsd:jed,nz_in(1)))
1596 if (.not.
allocated(cs%h_src))
allocate(cs%h_src(nz_in(1)))
1599 call mom_read_data(tidal_energy_file,
'M2', tc_m2, g%domain)
1600 call mom_read_data(tidal_energy_file,
'S2', tc_s2, g%domain)
1601 call mom_read_data(tidal_energy_file,
'K1', tc_k1, g%domain)
1602 call mom_read_data(tidal_energy_file,
'O1', tc_o1, g%domain)
1604 call mom_read_data(tidal_energy_file,
'z_t', z_t, scale=100.0*us%m_to_Z)
1605 call mom_read_data(tidal_energy_file,
'z_w', z_w, scale=100.0*us%m_to_Z)
1607 do j=js,je ;
do i=is,ie
1608 if (abs(g%geoLatT(i,j)) < 30.0)
then
1609 tidal_qk1(i,j) = c1_3
1610 tidal_qo1(i,j) = c1_3
1612 tidal_qk1(i,j) = 1.0
1613 tidal_qo1(i,j) = 1.0
1617 cs%tidal_qe_3d_in(:,:,:) = 0.0
1620 cs%h_src(k) = us%Z_to_m*(z_t(k)-z_w(k))*2.0
1622 do j=js,je ;
do i=is,ie
1623 if ((z_t(k) <= g%bathyT(i,j)) .and. (z_w(k) > cs%tidal_diss_lim_tc)) &
1624 cs%tidal_qe_3d_in(i,j,k) = c1_3*tc_m2(i,j,k) + c1_3*tc_s2(i,j,k) + &
1625 tidal_qk1(i,j)*tc_k1(i,j,k) + tidal_qo1(i,j)*tc_o1(i,j,k)
1645 if (any(cs%tidal_qe_3d_in<0.0))
then
1646 call mom_error(fatal,
"read_tidal_constituents: Negative tidal_qe_3d_in terms.")
1657 call initialize_remapping(cs%remap_cs, remapping_scheme=
"PLM", &
1658 boundary_extrapolation=.false., check_remapping=cs%debug)
1667 end subroutine read_tidal_constituents
1670 subroutine tidal_mixing_end(CS)
1674 if (.not.
associated(cs))
return
1677 if (
allocated(cs%tidal_qe_2d))
deallocate(cs%tidal_qe_2d)
1678 if (
allocated(cs%tidal_qe_3d_in))
deallocate(cs%tidal_qe_3d_in)
1679 if (
allocated(cs%h_src))
deallocate(cs%h_src)
1683 end subroutine tidal_mixing_end