MOM6
boundary_impulse_tracer.F90
1 !> Implements a boundary impulse response tracer to calculate Green's functions
3 
4 ! This file is part of MOM6. See LICENSE.md for the license.
5 
7 use mom_error_handler, only : mom_error, fatal, warning
9 use mom_forcing_type, only : forcing
10 use mom_grid, only : ocean_grid_type
11 use mom_hor_index, only : hor_index_type
12 use mom_io, only : file_exists, read_data, slasher, vardesc, var_desc, query_vardesc
15 use mom_sponge, only : set_up_sponge_field, sponge_cs
16 use mom_time_manager, only : time_type
17 use mom_tracer_registry, only : register_tracer, tracer_registry_type
18 use mom_tracer_diabatic, only : tracer_vertdiff, applytracerboundaryfluxesinout
19 use mom_tracer_z_init, only : tracer_z_init
20 use mom_variables, only : surface
23 
24 use coupler_types_mod, only : coupler_type_set_data, ind_csurf
25 use atmos_ocean_fluxes_mod, only : aof_set_coupler_flux
26 
27 implicit none ; private
28 
29 #include <MOM_memory.h>
30 
31 public register_boundary_impulse_tracer, initialize_boundary_impulse_tracer
32 public boundary_impulse_tracer_column_physics, boundary_impulse_tracer_surface_state
33 public boundary_impulse_stock, boundary_impulse_tracer_end
34 
35 !> NTR_MAX is the maximum number of tracers in this module.
36 integer, parameter :: ntr_max = 1
37 
38 !> The control structure for the boundary impulse tracer package
39 type, public :: boundary_impulse_tracer_cs ; private
40  integer :: ntr=ntr_max !< The number of tracers that are actually used.
41  logical :: coupled_tracers = .false. !< These tracers are not offered to the coupler.
42  type(time_type), pointer :: time => null() !< A pointer to the ocean model's clock.
43  type(tracer_registry_type), pointer :: tr_reg => null() !< A pointer to the tracer registry
44  real, pointer :: tr(:,:,:,:) => null() !< The array of tracers used in this subroutine, in g m-3?
45  logical :: tracers_may_reinit !< If true, boundary_impulse can be initialized if not found in restart file
46  integer, dimension(NTR_MAX) :: ind_tr !< Indices returned by aof_set_coupler_flux if it is used and the
47  !! surface tracer concentrations are to be provided to the coupler.
48 
49  integer :: nkml !< Number of layers in mixed layer
50  real, dimension(NTR_MAX) :: land_val = -1.0 !< A value to use to fill in tracers over land
51  real :: kw_eff !< An effective piston velocity used to flux tracer out at the surface
52  real :: remaining_source_time !< How much longer (same units as the timestep) to
53  !! inject the tracer at the surface
54 
55  type(diag_ctrl), pointer :: diag => null() !< A structure that is used to
56  !! regulate the timing of diagnostic output.
57  type(mom_restart_cs), pointer :: restart_csp => null() !< A pointer to the retart control structure
58 
59  type(vardesc) :: tr_desc(ntr_max) !< Descriptions and metadata for the tracers
61 
62 contains
63 
64 !> Read in runtime options and add boundary impulse tracer to tracer registry
65 function register_boundary_impulse_tracer(HI, GV, param_file, CS, tr_Reg, restart_CS)
66  type(hor_index_type), intent(in ) :: hi !< A horizontal index type structure
67  type(verticalgrid_type), intent(in ) :: gv !< The ocean's vertical grid structure
68  type(param_file_type), intent(in ) :: param_file !< A structure to parse for run-time parameters
69  type(boundary_impulse_tracer_cs), pointer :: cs !< The control structure returned by a previous
70  !! call to register_boundary_impulse_tracer.
71  type(tracer_registry_type), pointer :: tr_reg !< A pointer that is set to point to the control
72  !! structure for the tracer advection and
73  !! diffusion module
74  type(mom_restart_cs), pointer :: restart_cs !< A pointer to the restart control structure
75 
76  ! Local variables
77  character(len=40) :: mdl = "boundary_impulse_tracer" ! This module's name.
78  character(len=200) :: inputdir ! The directory where the input files are.
79  character(len=48) :: var_name ! The variable's name.
80  character(len=3) :: name_tag ! String for creating identifying boundary_impulse
81  character(len=48) :: flux_units ! The units for tracer fluxes, usually
82  ! kg(tracer) kg(water)-1 m3 s-1 or kg(tracer) s-1.
83  ! This include declares and sets the variable "version".
84 #include "version_variable.h"
85  real, pointer :: tr_ptr(:,:,:) => null()
86  real, pointer :: rem_time_ptr => null()
87  logical :: register_boundary_impulse_tracer
88  integer :: isd, ied, jsd, jed, nz, m, i, j
89  isd = hi%isd ; ied = hi%ied ; jsd = hi%jsd ; jed = hi%jed ; nz = gv%ke
90 
91  if (associated(cs)) then
92  call mom_error(warning, "register_boundary_impulse_tracer called with an "// &
93  "associated control structure.")
94  return
95  endif
96  allocate(cs)
97 
98  ! Read all relevant parameters and write them to the model log.
99  call log_version(param_file, mdl, version, "")
100  call get_param(param_file, mdl, "IMPULSE_SOURCE_TIME", cs%remaining_source_time, &
101  "Length of time for the boundary tracer to be injected "//&
102  "into the mixed layer. After this time has elapsed, the "//&
103  "surface becomes a sink for the boundary impulse tracer.", &
104  default=31536000.0)
105  call get_param(param_file, mdl, "TRACERS_MAY_REINIT", cs%tracers_may_reinit, &
106  "If true, tracers may go through the initialization code "//&
107  "if they are not found in the restart files. Otherwise "//&
108  "it is a fatal error if the tracers are not found in the "//&
109  "restart files of a restarted run.", default=.false.)
110  cs%ntr = ntr_max
111  allocate(cs%tr(isd:ied,jsd:jed,nz,cs%ntr)) ; cs%tr(:,:,:,:) = 0.0
112 
113  cs%nkml = max(gv%nkml,1)
114 
115  do m=1,cs%ntr
116  ! This is needed to force the compiler not to do a copy in the registration
117  ! calls. Curses on the designers and implementers of Fortran90.
118  cs%tr_desc(m) = var_desc(trim("boundary_impulse"), "kg kg-1", &
119  "Boundary impulse tracer", caller=mdl)
120  if (gv%Boussinesq) then ; flux_units = "kg kg-1 m3 s-1"
121  else ; flux_units = "kg s-1" ; endif
122 
123  tr_ptr => cs%tr(:,:,:,m)
124  call query_vardesc(cs%tr_desc(m), name=var_name, caller="register_boundary_impulse_tracer")
125  ! Register the tracer for horizontal advection, diffusion, and restarts.
126  call register_tracer(tr_ptr, tr_reg, param_file, hi, gv, tr_desc=cs%tr_desc(m), &
127  registry_diags=.true., flux_units=flux_units, &
128  restart_cs=restart_cs, mandatory=.not.cs%tracers_may_reinit)
129 
130  ! Set coupled_tracers to be true (hard-coded above) to provide the surface
131  ! values to the coupler (if any). This is meta-code and its arguments will
132  ! currently (deliberately) give fatal errors if it is used.
133  if (cs%coupled_tracers) &
134  cs%ind_tr(m) = aof_set_coupler_flux(trim(var_name)//'_flux', &
135  flux_type=' ', implementation=' ', caller="register_boundary_impulse_tracer")
136  enddo
137  ! Register remaining source time as a restart field
138  rem_time_ptr => cs%remaining_source_time
139  call register_restart_field(rem_time_ptr, "bir_remain_time", &
140  .not.cs%tracers_may_reinit, restart_cs, &
141  "Remaining time to apply BIR source", "s")
142 
143  cs%tr_Reg => tr_reg
144  cs%restart_CSp => restart_cs
145  register_boundary_impulse_tracer = .true.
146 
147 end function register_boundary_impulse_tracer
148 
149 !> Initialize tracer from restart or set to 1 at surface to initialize
150 subroutine initialize_boundary_impulse_tracer(restart, day, G, GV, h, diag, OBC, CS, &
151  sponge_CSp, tv)
152  logical, intent(in) :: restart !< .true. if the fields have already
153  !! been read from a restart file.
154  type(time_type), target, intent(in) :: day !< Time of the start of the run.
155  type(ocean_grid_type), intent(in) :: g !< The ocean's grid structure
156  type(verticalgrid_type), intent(in) :: gv !< The ocean's vertical grid structure
157  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
158  intent(in) :: h !< Layer thicknesses [H ~> m or kg m-2]
159  type(diag_ctrl), target, intent(in) :: diag !< A structure that is used to regulate
160  !! diagnostic output.
161  type(ocean_obc_type), pointer :: obc !< This open boundary condition type specifies
162  !! whether, where, and what open boundary
163  !! conditions are used.
164  type(boundary_impulse_tracer_cs), pointer :: cs !< The control structure returned by a previous
165  !! call to register_boundary_impulse_tracer.
166  type(sponge_cs), pointer :: sponge_csp !< Pointer to the control structure for the sponges.
167  type(thermo_var_ptrs), intent(in) :: tv !< A structure pointing to various
168  !! thermodynamic variables
169  ! Local variables
170  character(len=16) :: name ! A variable's name in a NetCDF file.
171  character(len=72) :: longname ! The long name of that variable.
172  character(len=48) :: units ! The dimensions of the variable.
173  character(len=48) :: flux_units ! The units for age tracer fluxes, either
174  ! years m3 s-1 or years kg s-1.
175  logical :: ok
176  integer :: i, j, k, is, ie, js, je, isd, ied, jsd, jed, nz, m
177  integer :: isdb, iedb, jsdb, jedb
178 
179  if (.not.associated(cs)) return
180  if (cs%ntr < 1) return
181  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = gv%ke
182  isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
183  isdb = g%IsdB ; iedb = g%IedB ; jsdb = g%JsdB ; jedb = g%JedB
184 
185  cs%Time => day
186  cs%diag => diag
187  name = "boundary_impulse"
188 
189  do m=1,cs%ntr
190  call query_vardesc(cs%tr_desc(m), name=name, caller="initialize_boundary_impulse_tracer")
191  if ((.not.restart) .or. (.not. &
192  query_initialized(cs%tr(:,:,:,m), name, cs%restart_CSp))) then
193  do k=1,cs%nkml ; do j=jsd,jed ; do i=isd,ied
194  cs%tr(i,j,k,m) = 1.0
195  enddo ; enddo ; enddo
196  endif
197  enddo ! Tracer loop
198 
199  if (associated(obc)) then
200  ! Steal from updated DOME in the fullness of time.
201  endif
202 
203 end subroutine initialize_boundary_impulse_tracer
204 
205 !> Apply source or sink at boundary and do vertical diffusion
206 subroutine boundary_impulse_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, G, GV, CS, &
207  tv, debug, evap_CFL_limit, minimum_forcing_depth)
208  type(ocean_grid_type), intent(in) :: g !< The ocean's grid structure
209  type(verticalgrid_type), intent(in) :: gv !< The ocean's vertical grid structure
210  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
211  intent(in) :: h_old !< Layer thickness before entrainment [H ~> m or kg m-2].
212  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
213  intent(in) :: h_new !< Layer thickness after entrainment [H ~> m or kg m-2].
214  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
215  intent(in) :: ea !< an array to which the amount of fluid entrained
216  !! from the layer above during this call will be
217  !! added [H ~> m or kg m-2].
218  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
219  intent(in) :: eb !< an array to which the amount of fluid entrained
220  !! from the layer below during this call will be
221  !! added [H ~> m or kg m-2].
222  type(forcing), intent(in) :: fluxes !< A structure containing pointers to thermodynamic
223  !! and tracer forcing fields. Unused fields have NULL ptrs.
224  real, intent(in) :: dt !< The amount of time covered by this call [s]
225  type(boundary_impulse_tracer_cs), pointer :: cs !< The control structure returned by a previous
226  !! call to register_boundary_impulse_tracer.
227  type(thermo_var_ptrs), intent(in) :: tv !< A structure pointing to various
228  !! thermodynamic variables
229  logical, intent(in) :: debug !< If true calculate checksums
230  real, optional, intent(in) :: evap_cfl_limit !< Limit on the fraction of the water that can
231  !! be fluxed out of the top layer in a timestep [nondim]
232  real, optional, intent(in) :: minimum_forcing_depth !< The smallest depth over which
233  !! fluxes can be applied [m]
234 
235 ! This subroutine applies diapycnal diffusion and any other column
236 ! tracer physics or chemistry to the tracers from this file.
237 ! This is a simple example of a set of advected passive tracers.
238 
239 ! The arguments to this subroutine are redundant in that
240 ! h_new(k) = h_old(k) + ea(k) - eb(k-1) + eb(k) - ea(k+1)
241 
242  ! Local variables
243  real :: isecs_per_year = 1.0 / (365.0*86400.0)
244  real :: year, h_total, scale, htot, ih_limit
245  integer :: secs, days
246  integer :: i, j, k, is, ie, js, je, nz, m, k_max
247  real, dimension(SZI_(G),SZJ_(G),SZK_(G)) :: h_work ! Used so that h can be modified
248 
249  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = gv%ke
250 
251  if (.not.associated(cs)) return
252  if (cs%ntr < 1) return
253 
254  ! This uses applyTracerBoundaryFluxesInOut, usually in ALE mode
255  if (present(evap_cfl_limit) .and. present(minimum_forcing_depth)) then
256  do k=1,nz ;do j=js,je ; do i=is,ie
257  h_work(i,j,k) = h_old(i,j,k)
258  enddo ; enddo ; enddo
259  call applytracerboundaryfluxesinout(g, gv, cs%tr(:,:,:,1), dt, fluxes, h_work, &
260  evap_cfl_limit, minimum_forcing_depth)
261  call tracer_vertdiff(h_work, ea, eb, dt, cs%tr(:,:,:,1), g, gv)
262  else
263  call tracer_vertdiff(h_old, ea, eb, dt, cs%tr(:,:,:,1), g, gv)
264  endif
265 
266  ! Set surface conditions
267  do m=1,1
268  if (cs%remaining_source_time>0.0) then
269  do k=1,cs%nkml ; do j=js,je ; do i=is,ie
270  cs%tr(i,j,k,m) = 1.0
271  enddo ; enddo ; enddo
272  cs%remaining_source_time = cs%remaining_source_time-dt
273  else
274  do k=1,cs%nkml ; do j=js,je ; do i=is,ie
275  cs%tr(i,j,k,m) = 0.0
276  enddo ; enddo ; enddo
277  endif
278 
279  enddo
280 
281 end subroutine boundary_impulse_tracer_column_physics
282 
283 !> Calculate total inventory of tracer
284 function boundary_impulse_stock(h, stocks, G, GV, CS, names, units, stock_index)
285  type(ocean_grid_type), intent(in ) :: g !< The ocean's grid structure
286  type(verticalgrid_type), intent(in ) :: gv !< The ocean's vertical grid structure
287  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), intent(in ) :: h !< Layer thicknesses [H ~> m or kg m-2]
288  real, dimension(:), intent( out) :: stocks !< the mass-weighted integrated amount of each
289  !! tracer, in kg times concentration units [kg conc].
290  type(boundary_impulse_tracer_cs), pointer :: cs !< The control structure returned by a previous
291  !! call to register_boundary_impulse_tracer.
292  character(len=*), dimension(:), intent( out) :: names !< The names of the stocks calculated.
293  character(len=*), dimension(:), intent( out) :: units !< The units of the stocks calculated.
294  integer, optional, intent(in ) :: stock_index !< The coded index of a specific stock
295  !! being sought.
296  integer :: boundary_impulse_stock !< Return value: the number of stocks calculated here.
297 
298 ! This function calculates the mass-weighted integral of all tracer stocks,
299 ! returning the number of stocks it has calculated. If the stock_index
300 ! is present, only the stock corresponding to that coded index is returned.
301 
302  ! Local variables
303  integer :: i, j, k, is, ie, js, je, nz, m
304  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = gv%ke
305 
306  boundary_impulse_stock = 0
307  if (.not.associated(cs)) return
308  if (cs%ntr < 1) return
309 
310  if (present(stock_index)) then ; if (stock_index > 0) then
311  ! Check whether this stock is available from this routine.
312 
313  ! No stocks from this routine are being checked yet. Return 0.
314  return
315  endif ; endif
316 
317  do m=1,1
318  call query_vardesc(cs%tr_desc(m), name=names(m), units=units(m), caller="boundary_impulse_stock")
319  units(m) = trim(units(m))//" kg"
320  stocks(m) = 0.0
321  do k=1,nz ; do j=js,je ; do i=is,ie
322  stocks(m) = stocks(m) + cs%tr(i,j,k,m) * &
323  (g%mask2dT(i,j) * g%areaT(i,j) * h(i,j,k))
324  enddo ; enddo ; enddo
325  stocks(m) = gv%H_to_kg_m2 * stocks(m)
326  enddo
327 
328  boundary_impulse_stock = cs%ntr
329 
330 end function boundary_impulse_stock
331 
332 !> This subroutine extracts the surface fields from this tracer package that
333 !! are to be shared with the atmosphere in coupled configurations.
334 !! This particular tracer package does not report anything back to the coupler.
335 subroutine boundary_impulse_tracer_surface_state(state, h, G, CS)
336  type(ocean_grid_type), intent(in) :: g !< The ocean's grid structure.
337  type(surface), intent(inout) :: state !< A structure containing fields that
338  !! describe the surface state of the ocean.
339  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
340  intent(in) :: h !< Layer thickness [H ~> m or kg m-2].
341  type(boundary_impulse_tracer_cs), pointer :: cs !< The control structure returned by a previous
342  !! call to register_boundary_impulse_tracer.
343 
344  ! This particular tracer package does not report anything back to the coupler.
345  ! The code that is here is just a rough guide for packages that would.
346 
347  integer :: m, is, ie, js, je, isd, ied, jsd, jed
348  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
349  isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
350 
351  if (.not.associated(cs)) return
352 
353  if (cs%coupled_tracers) then
354  do m=1,cs%ntr
355  ! This call loads the surface values into the appropriate array in the
356  ! coupler-type structure.
357  call coupler_type_set_data(cs%tr(:,:,1,m), cs%ind_tr(m), ind_csurf, &
358  state%tr_fields, idim=(/isd, is, ie, ied/), &
359  jdim=(/jsd, js, je, jed/) )
360  enddo
361  endif
362 
363 end subroutine boundary_impulse_tracer_surface_state
364 
365 !> Performs finalization of boundary impulse tracer
366 subroutine boundary_impulse_tracer_end(CS)
367  type(boundary_impulse_tracer_cs), pointer :: cs !< The control structure returned by a previous
368  !! call to register_boundary_impulse_tracer.
369  integer :: m
370 
371  if (associated(cs)) then
372  if (associated(cs%tr)) deallocate(cs%tr)
373  deallocate(cs)
374  endif
375 end subroutine boundary_impulse_tracer_end
376 
377 !> \namespace boundary_impulse_tracer
378 !!
379 !! \section section_BIT_desc Boundary Impulse Response Tracer and Transit Time Distributions
380 !! Transit time distributions (TTD) are the Green's function solution of the passive tracer equation between
381 !! the oceanic surface and interior. The name derives from the idea that the 'age' (e.g. time since last
382 !! contact with the atmosphere) of a water parcel is best characterized as a distribution of ages
383 !! because water parcels leaving the surface arrive at a particular interior point at different times.
384 !! The more commonly used ideal age tracer is the first moment of the TTD, equivalently referred to as the
385 !! mean age.
386 !!
387 !! A boundary impulse response (BIR) is a passive tracer whose surface boundary condition is a rectangle
388 !! function with width \f$\Delta t\f$. In the case of unsteady flow, multiple BIRs, initiated at different
389 !! times in the model can be used to infer the transit time distribution or Green's function between
390 !! the oceanic surface and interior. In the case of steady or cyclostationary flow, a single BIR is
391 !! sufficient.
392 !!
393 !! In the References section, both the theoretical discussion of TTDs and BIRs are listed along with
394 !! modeling studies which have this used framework in scientific investigations
395 !!
396 !! \section section_BIT_params Run-time parameters
397 !! -DO_BOUNDARY_IMPULSE_TRACER: Enables the boundary impulse tracer model
398 !! -IMPULSE_SOURCE_TIME: Length of time that the surface layer acts as a source of the BIR tracer
399 !!
400 !! \section section_BIT_refs References
401 !! \subsection TTD and BIR Theory
402 !! -Holzer, M., and T.M. Hall, 2000: Transit-time and tracer-age distributions in geophysical flows.
403 !! J. Atmos. Sci., 57, 3539-3558, doi:10.1175/1520-0469(2000)057<3539:TTATAD>2.0.CO;2.
404 !! -T.W.N. Haine, H. Zhang, D.W. Waugh, M. Holzer, On transit-time distributions in unsteady circulation
405 !! models, Ocean Modelling, Volume 21, Issues 1–2, 2008, Pages 35-45, ISSN 1463-5003
406 !! http://dx.doi.org/10.1016/j.ocemod.2007.11.004.
407 !! \subsection section_BIT_apps Modelling applications
408 !! -Peacock, S., and M. Maltrud (2006), Transit-time distributions in a global ocean model,
409 !! J. Phys. Oceanogr., 36(3), 474–495, doi:10.1175/JPO2860.1.
410 !! -Maltrud, M., Bryan, F. & Peacock, Boundary impulse response functions in a century-long eddying global
411 !! ocean simulation, S. Environ Fluid Mech (2010) 10: 275. doi:10.1007/s10652-009-9154-3
412 !!
413 end module boundary_impulse_tracer
mom_time_manager
Wraps the FMS time manager functions.
Definition: MOM_time_manager.F90:2
mom_variables::surface
Pointers to various fields which may be used describe the surface state of MOM, and which will be ret...
Definition: MOM_variables.F90:38
mom_verticalgrid
Provides a transparent vertical ocean grid type and supporting routines.
Definition: MOM_verticalGrid.F90:2
boundary_impulse_tracer::boundary_impulse_tracer_cs
The control structure for the boundary impulse tracer package.
Definition: boundary_impulse_tracer.F90:39
mom_file_parser::log_version
An overloaded interface to log version information about modules.
Definition: MOM_file_parser.F90:109
atmos_ocean_fluxes_mod
A dummy version of atmos_ocean_fluxes_mod module for use when the vastly larger FMS package is not ne...
Definition: atmos_ocean_fluxes.F90:3
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
boundary_impulse_tracer
Implements a boundary impulse response tracer to calculate Green's functions.
Definition: boundary_impulse_tracer.F90:2
mom_tracer_registry
This module contains the tracer_registry_type and the subroutines that handle registration of tracers...
Definition: MOM_tracer_registry.F90:5
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_hor_index
Defines the horizontal index type (hor_index_type) used for providing index ranges.
Definition: MOM_hor_index.F90:2
mom_io
This module contains I/O framework code.
Definition: MOM_io.F90:2
mom_restart::mom_restart_cs
A restart registry and the control structure for restarts.
Definition: MOM_restart.F90:72
mom_tracer_z_init
Used to initialize tracers from a depth- (or z*-) space file.
Definition: MOM_tracer_Z_init.F90:2
mom_tracer_diabatic
This module contains routines that implement physical fluxes of tracers (e.g. due to surface fluxes o...
Definition: MOM_tracer_diabatic.F90:4
mom_forcing_type
This module implements boundary forcing for MOM6.
Definition: MOM_forcing_type.F90:2
mom_verticalgrid::verticalgrid_type
Describes the vertical ocean grid, including unit conversion factors.
Definition: MOM_verticalGrid.F90:24
mom_restart
The MOM6 facility for reading and writing restart files, and querying what has been read.
Definition: MOM_restart.F90:2
mom_variables
Provides transparent structures with groups of MOM6 variables and supporting routines.
Definition: MOM_variables.F90:2
mom_open_boundary
Controls where open boundary conditions are applied.
Definition: MOM_open_boundary.F90:2
mom_file_parser
The MOM6 facility to parse input files for runtime parameters.
Definition: MOM_file_parser.F90:2
mom_sponge
Implements sponge regions in isopycnal mode.
Definition: MOM_sponge.F90:2
mom_tracer_registry::tracer_registry_type
Type to carry basic tracer information.
Definition: MOM_tracer_registry.F90:122
mom_hor_index::hor_index_type
Container for horizontal index ranges for data, computational and global domains.
Definition: MOM_hor_index.F90:15
mom_grid
Provides the ocean grid type.
Definition: MOM_grid.F90:2
mom_open_boundary::ocean_obc_type
Open-boundary data.
Definition: MOM_open_boundary.F90:186
mom_sponge::sponge_cs
This control structure holds memory and parameters for the MOM_sponge module.
Definition: MOM_sponge.F90:40
mom_restart::register_restart_field
Register fields for restarts.
Definition: MOM_restart.F90:107
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_io::vardesc
Type for describing a variable, typically a tracer.
Definition: MOM_io.F90:53
mom_io::file_exists
Indicate whether a file exists, perhaps with domain decomposition.
Definition: MOM_io.F90:68
mom_file_parser::log_param
An overloaded interface to log the values of various types of parameters.
Definition: MOM_file_parser.F90:96
mom_restart::query_initialized
Indicate whether a field has been read from a restart file.
Definition: MOM_restart.F90:116
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