MOM6
MOM_internal_tide_input.F90
1 !> Calculates energy input to the internal tides
3 
4 ! This file is part of MOM6. See LICENSE.md for the license.
5 
6 use mom_cpu_clock, only : cpu_clock_id, cpu_clock_begin, cpu_clock_end
7 use mom_cpu_clock, only : clock_module_driver, clock_module, clock_routine
8 use mom_diag_mediator, only : diag_ctrl, query_averaging_enabled
9 use mom_diag_mediator, only : safe_alloc_ptr, post_data, register_diag_field
10 use mom_debugging, only : hchksum
11 use mom_error_handler, only : mom_error, is_root_pe, fatal, warning, note
13 use mom_forcing_type, only : forcing
14 use mom_grid, only : ocean_grid_type
15 use mom_io, only : slasher, vardesc, mom_read_data
16 use mom_isopycnal_slopes, only : vert_fill_ts
17 use mom_time_manager, only : time_type, set_time, operator(+), operator(<=)
22 
23 implicit none ; private
24 
25 #include <MOM_memory.h>
26 
27 public set_int_tide_input, int_tide_input_init, int_tide_input_end
28 
29 ! A note on unit descriptions in comments: MOM6 uses units that can be rescaled for dimensional
30 ! consistency testing. These are noted in comments with units like Z, H, L, and T, along with
31 ! their mks counterparts with notation like "a velocity [Z T-1 ~> m s-1]". If the units
32 ! vary with the Boussinesq approximation, the Boussinesq variant is given first.
33 
34 !> This control structure holds parameters that regulate internal tide energy inputs.
35 type, public :: int_tide_input_cs ; private
36  logical :: debug !< If true, write verbose checksums for debugging.
37  type(diag_ctrl), pointer :: diag => null() !< A structure that is used to
38  !! regulate the timing of diagnostic output.
39  real :: tke_itide_max !< Maximum Internal tide conversion
40  !! available to mix above the BBL [W m-2]
41  real :: kappa_fill !< Vertical diffusivity used to interpolate sensible values
42  !! of T & S into thin layers [Z2 T-1 ~> m2 s-1].
43 
44  real, allocatable, dimension(:,:) :: tke_itidal_coef
45  !< The time-invariant field that enters the TKE_itidal input calculation [J m-2].
46  character(len=200) :: inputdir !< The directory for input files.
47 
48  logical :: int_tide_source_test !< If true, apply an arbitrary generation site
49  !! for internal tide testing (BDM)
50  type(time_type) :: time_max_source !< A time for use in testing internal tides
51  real :: int_tide_source_x !< X Location of generation site
52  !! for internal tide for testing (BDM)
53  real :: int_tide_source_y !< Y Location of generation site
54  !! for internal tide for testing (BDM)
55 
56 
57  !>@{ Diagnostic IDs
58  integer :: id_tke_itidal = -1, id_nb = -1, id_n2_bot = -1
59  !!@}
60 end type int_tide_input_cs
61 
62 !> This type is used to exchange fields related to the internal tides.
63 type, public :: int_tide_input_type
64  real, allocatable, dimension(:,:) :: &
65  tke_itidal_input, & !< The internal tide TKE input at the bottom of the ocean [W m-2].
66  h2, & !< The squared topographic roughness height [Z2 ~> m2].
67  tideamp, & !< The amplitude of the tidal velocities [m s-1].
68  nb !< The bottom stratification [s-1].
69 end type int_tide_input_type
70 
71 contains
72 
73 !> Sets the model-state dependent internal tide energy sources.
74 subroutine set_int_tide_input(u, v, h, tv, fluxes, itide, dt, G, GV, US, CS)
75  type(ocean_grid_type), intent(in) :: g !< The ocean's grid structure
76  type(verticalgrid_type), intent(in) :: gv !< The ocean's vertical grid structure
77  type(unit_scale_type), intent(in) :: us !< A dimensional unit scaling type
78  real, dimension(SZIB_(G),SZJ_(G),SZK_(G)), intent(in) :: u !< The zonal velocity [m s-1]
79  real, dimension(SZI_(G),SZJB_(G),SZK_(G)), intent(in) :: v !< The meridional velocity [m s-1]
80  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), intent(in) :: h !< Layer thicknesses [H ~> m or kg m-2]
81  type(thermo_var_ptrs), intent(in) :: tv !< A structure containing pointers to the
82  !! thermodynamic fields
83  type(forcing), intent(in) :: fluxes !< A structure of thermodynamic surface fluxes
84  type(int_tide_input_type), intent(inout) :: itide !< A structure containing fields related
85  !! to the internal tide sources.
86  real, intent(in) :: dt !< The time increment [s].
87  type(int_tide_input_cs), pointer :: cs !< This module's control structure.
88  ! Local variables
89  real, dimension(SZI_(G),SZJ_(G)) :: &
90  n2_bot ! The bottom squared buoyancy frequency [T-2 ~> s-2].
91 
92  real, dimension(SZI_(G),SZJ_(G),SZK_(G)) :: &
93  t_f, s_f ! The temperature and salinity in [degC] and [ppt] with the values in
94  ! the massless layers filled vertically by diffusion.
95  logical :: use_eos ! If true, density is calculated from T & S using an
96  ! equation of state.
97  logical :: avg_enabled ! for testing internal tides (BDM)
98  type(time_type) :: time_end !< For use in testing internal tides (BDM)
99 
100 
101  integer :: i, j, k, is, ie, js, je, nz
102  integer :: isd, ied, jsd, jed
103 
104 
105  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
106  isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
107 
108  if (.not.associated(cs)) call mom_error(fatal,"set_diffusivity: "//&
109  "Module must be initialized before it is used.")
110 
111  use_eos = associated(tv%eqn_of_state)
112 
113  ! Smooth the properties through massless layers.
114  if (use_eos) then
115  call vert_fill_ts(h, tv%T, tv%S, cs%kappa_fill*dt*us%s_to_T, t_f, s_f, g, gv, larger_h_denom=.true.)
116  endif
117 
118  call find_n2_bottom(h, tv, t_f, s_f, itide%h2, fluxes, g, gv, us, n2_bot)
119 
120  !$OMP parallel do default(shared)
121  do j=js,je ; do i=is,ie
122  itide%Nb(i,j) = g%mask2dT(i,j) * us%s_to_T*sqrt(n2_bot(i,j))
123  itide%TKE_itidal_input(i,j) = min(cs%TKE_itidal_coef(i,j)*itide%Nb(i,j), cs%TKE_itide_max)
124  enddo ; enddo
125 
126  if (cs%int_tide_source_test) then
127  itide%TKE_itidal_input(:,:) = 0.0
128  avg_enabled = query_averaging_enabled(cs%diag, time_end=time_end)
129  if (time_end <= cs%time_max_source) then
130  do j=js,je ; do i=is,ie
131  ! Input an arbitrary energy point source.id_
132  if (((g%geoLonCu(i-1,j)-cs%int_tide_source_x) * (g%geoLonBu(i,j)-cs%int_tide_source_x) <= 0.0) .and. &
133  ((g%geoLatCv(i,j-1)-cs%int_tide_source_y) * (g%geoLatCv(i,j)-cs%int_tide_source_y) <= 0.0)) then
134  itide%TKE_itidal_input(i,j) = 1.0
135  endif
136  enddo ; enddo
137  endif
138  endif
139 
140  if (cs%debug) then
141  call hchksum(n2_bot,"N2_bot",g%HI,haloshift=0, scale=us%s_to_T**2)
142  call hchksum(itide%TKE_itidal_input,"TKE_itidal_input",g%HI,haloshift=0)
143  endif
144 
145  if (cs%id_TKE_itidal > 0) call post_data(cs%id_TKE_itidal, itide%TKE_itidal_input, cs%diag)
146  if (cs%id_Nb > 0) call post_data(cs%id_Nb, itide%Nb, cs%diag)
147  if (cs%id_N2_bot > 0 ) call post_data(cs%id_N2_bot, n2_bot, cs%diag)
148 
149 end subroutine set_int_tide_input
150 
151 !> Estimates the near-bottom buoyancy frequency (N^2).
152 subroutine find_n2_bottom(h, tv, T_f, S_f, h2, fluxes, G, GV, US, N2_bot)
153  type(ocean_grid_type), intent(in) :: G !< The ocean's grid structure
154  type(verticalgrid_type), intent(in) :: GV !< The ocean's vertical grid structure
155  type(unit_scale_type), intent(in) :: US !< A dimensional unit scaling type
156  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), intent(in) :: h !< Layer thicknesses [H ~> m or kg m-2]
157  type(thermo_var_ptrs), intent(in) :: tv !< A structure containing pointers to the
158  !! thermodynamic fields
159  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), intent(in) :: T_f !< Temperature after vertical filtering to
160  !! smooth out the values in thin layers [degC].
161  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), intent(in) :: S_f !< Salinity after vertical filtering to
162  !! smooth out the values in thin layers [ppt].
163  real, dimension(SZI_(G),SZJ_(G)), intent(in) :: h2 !< Bottom topographic roughness [Z2 ~> m2].
164  type(forcing), intent(in) :: fluxes !< A structure of thermodynamic surface fluxes
165  type(int_tide_input_cs), pointer :: CS !< This module's control structure.
166  real, dimension(SZI_(G),SZJ_(G)), intent(out) :: N2_bot !< The squared buoyancy freqency at the
167  !! ocean bottom [s-2].
168  ! Local variables
169  real, dimension(SZI_(G),SZK_(G)+1) :: &
170  dRho_int ! The unfiltered density differences across interfaces.
171  real, dimension(SZI_(G)) :: &
172  pres, & ! The pressure at each interface [Pa].
173  Temp_int, & ! The temperature at each interface [degC].
174  Salin_int, & ! The salinity at each interface [ppt].
175  drho_bot, &
176  h_amp, & ! The amplitude of topographic roughness [Z ~> m].
177  hb, & ! The depth below a layer [Z ~> m].
178  z_from_bot, & ! The height of a layer center above the bottom [Z ~> m].
179  dRho_dT, & ! The partial derivatives of density with temperature and
180  dRho_dS ! salinity [kg m-3 degC-1] and [kg m-3 ppt-1].
181 
182  real :: dz_int ! The thickness associated with an interface [Z ~> m].
183  real :: G_Rho0 ! The gravitation acceleration divided by the Boussinesq
184  ! density [Z m3 T-2 kg-1 ~> m4 s-2 kg-1].
185  logical :: do_i(SZI_(G)), do_any
186  integer :: i, j, k, is, ie, js, je, nz
187  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
188  g_rho0 = (us%L_to_Z**2*gv%g_Earth) / gv%Rho0
189 
190  ! Find the (limited) density jump across each interface.
191  do i=is,ie
192  drho_int(i,1) = 0.0 ; drho_int(i,nz+1) = 0.0
193  enddo
194 !$OMP parallel do default(none) shared(is,ie,js,je,nz,tv,fluxes,G,GV,h,T_f,S_f, &
195 !$OMP h2,N2_bot,G_Rho0) &
196 !$OMP private(pres,Temp_Int,Salin_Int,dRho_dT,dRho_dS, &
197 !$OMP hb,dRho_bot,z_from_bot,do_i,h_amp, &
198 !$OMP do_any,dz_int) &
199 !$OMP firstprivate(dRho_int)
200  do j=js,je
201  if (associated(tv%eqn_of_state)) then
202  if (associated(fluxes%p_surf)) then
203  do i=is,ie ; pres(i) = fluxes%p_surf(i,j) ; enddo
204  else
205  do i=is,ie ; pres(i) = 0.0 ; enddo
206  endif
207  do k=2,nz
208  do i=is,ie
209  pres(i) = pres(i) + gv%H_to_Pa*h(i,j,k-1)
210  temp_int(i) = 0.5 * (t_f(i,j,k) + t_f(i,j,k-1))
211  salin_int(i) = 0.5 * (s_f(i,j,k) + s_f(i,j,k-1))
212  enddo
213  call calculate_density_derivs(temp_int, salin_int, pres, &
214  drho_dt(:), drho_ds(:), is, ie-is+1, tv%eqn_of_state)
215  do i=is,ie
216  drho_int(i,k) = max(drho_dt(i)*(t_f(i,j,k) - t_f(i,j,k-1)) + &
217  drho_ds(i)*(s_f(i,j,k) - s_f(i,j,k-1)), 0.0)
218  enddo
219  enddo
220  else
221  do k=2,nz ; do i=is,ie
222  drho_int(i,k) = gv%Rlay(k) - gv%Rlay(k-1)
223  enddo ; enddo
224  endif
225 
226  ! Find the bottom boundary layer stratification.
227  do i=is,ie
228  hb(i) = 0.0 ; drho_bot(i) = 0.0
229  z_from_bot(i) = 0.5*gv%H_to_Z*h(i,j,nz)
230  do_i(i) = (g%mask2dT(i,j) > 0.5)
231  h_amp(i) = sqrt(h2(i,j))
232  enddo
233 
234  do k=nz,2,-1
235  do_any = .false.
236  do i=is,ie ; if (do_i(i)) then
237  dz_int = 0.5*gv%H_to_Z*(h(i,j,k) + h(i,j,k-1))
238  z_from_bot(i) = z_from_bot(i) + dz_int ! middle of the layer above
239 
240  hb(i) = hb(i) + dz_int
241  drho_bot(i) = drho_bot(i) + drho_int(i,k)
242 
243  if (z_from_bot(i) > h_amp(i)) then
244  if (k>2) then
245  ! Always include at least one full layer.
246  hb(i) = hb(i) + 0.5*gv%H_to_Z*(h(i,j,k-1) + h(i,j,k-2))
247  drho_bot(i) = drho_bot(i) + drho_int(i,k-1)
248  endif
249  do_i(i) = .false.
250  else
251  do_any = .true.
252  endif
253  endif ; enddo
254  if (.not.do_any) exit
255  enddo
256 
257  do i=is,ie
258  if (hb(i) > 0.0) then
259  n2_bot(i,j) = (g_rho0 * drho_bot(i)) / hb(i)
260  else ; n2_bot(i,j) = 0.0 ; endif
261  enddo
262  enddo
263 
264 end subroutine find_n2_bottom
265 
266 !> Initializes the data related to the internal tide input module
267 subroutine int_tide_input_init(Time, G, GV, US, param_file, diag, CS, itide)
268  type(time_type), intent(in) :: time !< The current model time
269  type(ocean_grid_type), intent(in) :: g !< The ocean's grid structure
270  type(verticalgrid_type), intent(in) :: gv !< The ocean's vertical grid structure
271  type(unit_scale_type), intent(in) :: us !< A dimensional unit scaling type
272  type(param_file_type), intent(in) :: param_file !< A structure to parse for run-time parameters
273  type(diag_ctrl), target, intent(inout) :: diag !< structure used to regulate diagnostic output.
274  type(int_tide_input_cs), pointer :: cs !< This module's control structure, which is initialized here.
275  type(int_tide_input_type), pointer :: itide !< A structure containing fields related
276  !! to the internal tide sources.
277  ! Local variables
278  type(vardesc) :: vd
279  logical :: read_tideamp
280 ! This include declares and sets the variable "version".
281 #include "version_variable.h"
282  character(len=40) :: mdl = "MOM_int_tide_input" ! This module's name.
283  character(len=20) :: tmpstr
284  character(len=200) :: filename, tideamp_file, h2_file
285 
286  real :: mask_itidal
287  real :: max_frac_rough ! The fraction relating the maximum topographic roughness
288  ! to the mean depth [nondim]
289  real :: utide ! constant tidal amplitude [m s-1] to be used if
290  ! tidal amplitude file is not present.
291  real :: kappa_h2_factor ! factor for the product of wavenumber * rms sgs height.
292  real :: kappa_itides ! topographic wavenumber and non-dimensional scaling
293  real :: min_zbot_itides ! Minimum ocean depth for internal tide conversion [Z ~> m].
294  integer :: tlen_days !< Time interval from start for adding wave source
295  !! for testing internal tides (BDM)
296  integer :: i, j, is, ie, js, je, isd, ied, jsd, jed
297 
298  if (associated(cs)) then
299  call mom_error(warning, "int_tide_input_init called with an associated "// &
300  "control structure.")
301  return
302  endif
303  if (associated(itide)) then
304  call mom_error(warning, "int_tide_input_init called with an associated "// &
305  "internal tide input type.")
306  return
307  endif
308  allocate(cs)
309  allocate(itide)
310 
311  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
312  isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
313 
314  cs%diag => diag
315 
316  ! Read all relevant parameters and write them to the model log.
317  call log_version(param_file, mdl, version, "")
318 
319  call get_param(param_file, mdl, "INPUTDIR", cs%inputdir, default=".")
320  cs%inputdir = slasher(cs%inputdir)
321 
322  call get_param(param_file, mdl, "DEBUG", cs%debug, default=.false., do_not_log=.true.)
323 
324  call get_param(param_file, mdl, "MIN_ZBOT_ITIDES", min_zbot_itides, &
325  "Turn off internal tidal dissipation when the total "//&
326  "ocean depth is less than this value.", units="m", default=0.0, scale=us%m_to_Z)
327  call get_param(param_file, mdl, "KD_SMOOTH", cs%kappa_fill, &
328  "A diapycnal diffusivity that is used to interpolate "//&
329  "more sensible values of T & S into thin layers.", &
330  default=1.0e-6, scale=us%m2_s_to_Z2_T)
331 
332  call get_param(param_file, mdl, "UTIDE", utide, &
333  "The constant tidal amplitude used with INT_TIDE_DISSIPATION.", &
334  units="m s-1", default=0.0)
335 
336  allocate(itide%Nb(isd:ied,jsd:jed)) ; itide%Nb(:,:) = 0.0
337  allocate(itide%h2(isd:ied,jsd:jed)) ; itide%h2(:,:) = 0.0
338  allocate(itide%TKE_itidal_input(isd:ied,jsd:jed)) ; itide%TKE_itidal_input(:,:) = 0.0
339  allocate(itide%tideamp(isd:ied,jsd:jed)) ; itide%tideamp(:,:) = utide
340  allocate(cs%TKE_itidal_coef(isd:ied,jsd:jed)) ; cs%TKE_itidal_coef(:,:) = 0.0
341 
342  call get_param(param_file, mdl, "KAPPA_ITIDES", kappa_itides, &
343  "A topographic wavenumber used with INT_TIDE_DISSIPATION. "//&
344  "The default is 2pi/10 km, as in St.Laurent et al. 2002.", &
345  units="m-1", default=8.e-4*atan(1.0))
346 
347  call get_param(param_file, mdl, "KAPPA_H2_FACTOR", kappa_h2_factor, &
348  "A scaling factor for the roughness amplitude with n"//&
349  "INT_TIDE_DISSIPATION.", units="nondim", default=1.0)
350  call get_param(param_file, mdl, "TKE_ITIDE_MAX", cs%TKE_itide_max, &
351  "The maximum internal tide energy source available to mix "//&
352  "above the bottom boundary layer with INT_TIDE_DISSIPATION.", &
353  units="W m-2", default=1.0e3)
354 
355  call get_param(param_file, mdl, "READ_TIDEAMP", read_tideamp, &
356  "If true, read a file (given by TIDEAMP_FILE) containing "//&
357  "the tidal amplitude with INT_TIDE_DISSIPATION.", default=.false.)
358  if (read_tideamp) then
359  call get_param(param_file, mdl, "TIDEAMP_FILE", tideamp_file, &
360  "The path to the file containing the spatially varying "//&
361  "tidal amplitudes with INT_TIDE_DISSIPATION.", default="tideamp.nc")
362  filename = trim(cs%inputdir) // trim(tideamp_file)
363  call log_param(param_file, mdl, "INPUTDIR/TIDEAMP_FILE", filename)
364  call mom_read_data(filename, 'tideamp', itide%tideamp, g%domain, timelevel=1)
365  endif
366 
367  call get_param(param_file, mdl, "H2_FILE", h2_file, &
368  "The path to the file containing the sub-grid-scale "//&
369  "topographic roughness amplitude with INT_TIDE_DISSIPATION.", &
370  fail_if_missing=.true.)
371  filename = trim(cs%inputdir) // trim(h2_file)
372  call log_param(param_file, mdl, "INPUTDIR/H2_FILE", filename)
373  call mom_read_data(filename, 'h2', itide%h2, g%domain, timelevel=1, scale=us%m_to_Z**2)
374 
375  call get_param(param_file, mdl, "FRACTIONAL_ROUGHNESS_MAX", max_frac_rough, &
376  "The maximum topographic roughness amplitude as a fraction of the mean depth, "//&
377  "or a negative value for no limitations on roughness.", &
378  units="nondim", default=0.1)
379 
380  ! The following parameters are used in testing the internal tide code.
381  call get_param(param_file, mdl, "INTERNAL_TIDE_SOURCE_TEST", cs%int_tide_source_test, &
382  "If true, apply an arbitrary generation site for internal tide testing", &
383  default=.false.)
384  if (cs%int_tide_source_test)then
385  call get_param(param_file, mdl, "INTERNAL_TIDE_SOURCE_X", cs%int_tide_source_x, &
386  "X Location of generation site for internal tide", default=1.)
387  call get_param(param_file, mdl, "INTERNAL_TIDE_SOURCE_Y", cs%int_tide_source_y, &
388  "Y Location of generation site for internal tide", default=1.)
389  call get_param(param_file, mdl, "INTERNAL_TIDE_SOURCE_TLEN_DAYS", tlen_days, &
390  "Time interval from start of experiment for adding wave source", &
391  units="days", default=0)
392  cs%time_max_source = time + set_time(0, days=tlen_days)
393  endif
394 
395  do j=js,je ; do i=is,ie
396  mask_itidal = 1.0
397  if (g%bathyT(i,j) < min_zbot_itides) mask_itidal = 0.0
398 
399  itide%tideamp(i,j) = itide%tideamp(i,j) * mask_itidal * g%mask2dT(i,j)
400 
401  ! Restrict rms topo to a fraction (often 10 percent) of the column depth.
402  if (max_frac_rough >= 0.0) &
403  itide%h2(i,j) = min((max_frac_rough*g%bathyT(i,j))**2, itide%h2(i,j))
404 
405  ! Compute the fixed part of internal tidal forcing; units are [J m-2] here.
406  cs%TKE_itidal_coef(i,j) = 0.5*kappa_h2_factor*gv%Rho0*&
407  kappa_itides * us%Z_to_m**2*itide%h2(i,j) * itide%tideamp(i,j)**2
408  enddo ; enddo
409 
410 
411  cs%id_TKE_itidal = register_diag_field('ocean_model','TKE_itidal_itide',diag%axesT1,time, &
412  'Internal Tide Driven Turbulent Kinetic Energy', 'W m-2')
413 
414  cs%id_Nb = register_diag_field('ocean_model','Nb_itide',diag%axesT1,time, &
415  'Bottom Buoyancy Frequency', 's-1')
416 
417  cs%id_N2_bot = register_diag_field('ocean_model','N2_b_itide',diag%axesT1,time, &
418  'Bottom Buoyancy frequency squared', 's-2', conversion=us%s_to_T**2)
419 
420 end subroutine int_tide_input_init
421 
422 !> Deallocates any memory related to the internal tide input module.
423 subroutine int_tide_input_end(CS)
424  type(int_tide_input_cs), pointer :: cs !< This module's control structure, which is deallocated here.
425 
426  if (associated(cs)) deallocate(cs)
427 
428 end subroutine int_tide_input_end
429 
430 end module mom_int_tide_input
mom_time_manager
Wraps the FMS time manager functions.
Definition: MOM_time_manager.F90:2
mom_verticalgrid
Provides a transparent vertical ocean grid type and supporting routines.
Definition: MOM_verticalGrid.F90:2
mom_file_parser::log_version
An overloaded interface to log version information about modules.
Definition: MOM_file_parser.F90:109
mom_int_tide_input::int_tide_input_cs
This control structure holds parameters that regulate internal tide energy inputs.
Definition: MOM_internal_tide_input.F90:35
mom_diag_mediator
The subroutines here provide convenient wrappers to the fms diag_manager interfaces with additional d...
Definition: MOM_diag_mediator.F90:3
mom_variables::thermo_var_ptrs
Pointers to an assortment of thermodynamic fields that may be available, including potential temperat...
Definition: MOM_variables.F90:82
mom_eos
Provides subroutines for quantities specific to the equation of state.
Definition: MOM_EOS.F90:2
mom_file_parser::param_file_type
A structure that can be parsed to read and document run-time parameters.
Definition: MOM_file_parser.F90:54
mom_file_parser::get_param
An overloaded interface to read and log the values of various types of parameters.
Definition: MOM_file_parser.F90:102
mom_int_tide_input
Calculates energy input to the internal tides.
Definition: MOM_internal_tide_input.F90:2
mom_io
This module contains I/O framework code.
Definition: MOM_io.F90:2
mom_unit_scaling::unit_scale_type
Describes various unit conversion factors.
Definition: MOM_unit_scaling.F90:14
mom_isopycnal_slopes
Calculations of isoneutral slopes and stratification.
Definition: MOM_isopycnal_slopes.F90:2
mom_diag_mediator::post_data
Make a diagnostic available for averaging or output.
Definition: MOM_diag_mediator.F90:70
mom_forcing_type
This module implements boundary forcing for MOM6.
Definition: MOM_forcing_type.F90:2
mom_int_tide_input::int_tide_input_type
This type is used to exchange fields related to the internal tides.
Definition: MOM_internal_tide_input.F90:63
mom_variables::vertvisc_type
Vertical viscosities, drag coefficients, and related fields.
Definition: MOM_variables.F90:200
mom_verticalgrid::verticalgrid_type
Describes the vertical ocean grid, including unit conversion factors.
Definition: MOM_verticalGrid.F90:24
mom_variables
Provides transparent structures with groups of MOM6 variables and supporting routines.
Definition: MOM_variables.F90:2
mom_io::mom_read_data
Read a data field from a file.
Definition: MOM_io.F90:74
mom_cpu_clock
Wraps the MPP cpu clock functions.
Definition: MOM_cpu_clock.F90:2
mom_file_parser
The MOM6 facility to parse input files for runtime parameters.
Definition: MOM_file_parser.F90:2
mom_eos::calculate_density_derivs
Calculate the derivatives of density with temperature and salinity from T, S, and P.
Definition: MOM_EOS.F90:70
mom_grid
Provides the ocean grid type.
Definition: MOM_grid.F90:2
mom_unit_scaling
Provides a transparent unit rescaling type to facilitate dimensional consistency testing.
Definition: MOM_unit_scaling.F90:2
mom_forcing_type::forcing
Structure that contains pointers to the boundary forcing used to drive the liquid ocean simulated by ...
Definition: MOM_forcing_type.F90:49
mom_debugging
Provides checksumming functions for debugging.
Definition: MOM_debugging.F90:7
mom_io::vardesc
Type for describing a variable, typically a tracer.
Definition: MOM_io.F90:53
mom_variables::p3d
A structure for creating arrays of pointers to 3D arrays.
Definition: MOM_variables.F90:28
mom_file_parser::log_param
An overloaded interface to log the values of various types of parameters.
Definition: MOM_file_parser.F90:96
mom_error_handler
Routines for error handling and I/O management.
Definition: MOM_error_handler.F90:2
mom_grid::ocean_grid_type
Ocean grid type. See mom_grid for details.
Definition: MOM_grid.F90:25
mom_diag_mediator::diag_ctrl
The following data type a list of diagnostic fields an their variants, as well as variables that cont...
Definition: MOM_diag_mediator.F90:239
mom_eos::calculate_density
Calculates density of sea water from T, S and P.
Definition: MOM_EOS.F90:60