MOM6
dye_example.F90
1 !> A tracer package for using dyes to diagnose regional flows.
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
21 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_dye_tracer, initialize_dye_tracer
32 public dye_tracer_column_physics, dye_tracer_surface_state
33 public dye_stock, regional_dyes_end
34 
35 ! A note on unit descriptions in comments: MOM6 uses units that can be rescaled for dimensional
36 ! consistency testing. These are noted in comments with units like Z, H, L, and T, along with
37 ! their mks counterparts with notation like "a velocity [Z T-1 ~> m s-1]". If the units
38 ! vary with the Boussinesq approximation, the Boussinesq variant is given first.
39 
40 !> The control structure for the regional dyes tracer package
41 type, public :: dye_tracer_cs ; private
42  integer :: ntr !< The number of tracers that are actually used.
43  logical :: coupled_tracers = .false. !< These tracers are not offered to the coupler.
44  real, allocatable, dimension(:) :: dye_source_minlon !< Minimum longitude of region dye will be injected.
45  real, allocatable, dimension(:) :: dye_source_maxlon !< Maximum longitude of region dye will be injected.
46  real, allocatable, dimension(:) :: dye_source_minlat !< Minimum latitude of region dye will be injected.
47  real, allocatable, dimension(:) :: dye_source_maxlat !< Maximum latitude of region dye will be injected.
48  real, allocatable, dimension(:) :: dye_source_mindepth !< Minimum depth of region dye will be injected [Z ~> m].
49  real, allocatable, dimension(:) :: dye_source_maxdepth !< Maximum depth of region dye will be injected [Z ~> m].
50  type(tracer_registry_type), pointer :: tr_reg => null() !< A pointer to the tracer registry
51  real, pointer :: tr(:,:,:,:) => null() !< The array of tracers used in this subroutine, in g m-3?
52 
53  integer, allocatable, dimension(:) :: ind_tr !< Indices returned by aof_set_coupler_flux if it is used and the
54  !! surface tracer concentrations are to be provided to the coupler.
55 
56  type(diag_ctrl), pointer :: diag => null() !< A structure that is used to
57  !! regulate the timing of diagnostic output.
58  type(mom_restart_cs), pointer :: restart_csp => null() !< A pointer to the restart control structure
59 
60  type(vardesc), allocatable :: tr_desc(:) !< Descriptions and metadata for the tracers
61  logical :: tracers_may_reinit = .false. !< If true the tracers may be initialized if not found in a restart file
62 end type dye_tracer_cs
63 
64 contains
65 
66 !> This subroutine is used to register tracer fields and subroutines
67 !! to be used with MOM.
68 function register_dye_tracer(HI, GV, US, param_file, CS, tr_Reg, restart_CS)
69  type(hor_index_type), intent(in) :: hi !< A horizontal index type structure.
70  type(verticalgrid_type), intent(in) :: gv !< The ocean's vertical grid structure
71  type(unit_scale_type), intent(in) :: us !< A dimensional unit scaling type
72  type(param_file_type), intent(in) :: param_file !< A structure to parse for run-time parameters
73  type(dye_tracer_cs), pointer :: cs !< A pointer that is set to point to the control
74  !! structure for this module
75  type(tracer_registry_type), pointer :: tr_reg !< A pointer that is set to point to the control
76  !! structure for the tracer advection and diffusion module.
77  type(mom_restart_cs), pointer :: restart_cs !< A pointer to the restart control structure.
78 
79 ! Local variables
80 ! This include declares and sets the variable "version".
81 #include "version_variable.h"
82  character(len=40) :: mdl = "regional_dyes" ! This module's name.
83  character(len=200) :: inputdir ! The directory where the input files are.
84  character(len=48) :: var_name ! The variable's name.
85  character(len=48) :: desc_name ! The variable's descriptor.
86  real, pointer :: tr_ptr(:,:,:) => null()
87  logical :: register_dye_tracer
88  integer :: isd, ied, jsd, jed, nz, m
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_dye_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, "NUM_DYE_TRACERS", cs%ntr, &
101  "The number of dye tracers in this run. Each tracer "//&
102  "should have a separate region.", default=0)
103  allocate(cs%dye_source_minlon(cs%ntr), &
104  cs%dye_source_maxlon(cs%ntr), &
105  cs%dye_source_minlat(cs%ntr), &
106  cs%dye_source_maxlat(cs%ntr), &
107  cs%dye_source_mindepth(cs%ntr), &
108  cs%dye_source_maxdepth(cs%ntr))
109  allocate(cs%ind_tr(cs%ntr))
110  allocate(cs%tr_desc(cs%ntr))
111 
112  cs%dye_source_minlon(:) = -1.e30
113  call get_param(param_file, mdl, "DYE_SOURCE_MINLON", cs%dye_source_minlon, &
114  "This is the starting longitude at which we start injecting dyes.", &
115  fail_if_missing=.true.)
116  if (minval(cs%dye_source_minlon(:)) < -1.e29) &
117  call mom_error(fatal, "register_dye_tracer: Not enough values provided for DYE_SOURCE_MINLON ")
118 
119  cs%dye_source_maxlon(:) = -1.e30
120  call get_param(param_file, mdl, "DYE_SOURCE_MAXLON", cs%dye_source_maxlon, &
121  "This is the ending longitude at which we finish injecting dyes.", &
122  fail_if_missing=.true.)
123  if (minval(cs%dye_source_maxlon(:)) < -1.e29) &
124  call mom_error(fatal, "register_dye_tracer: Not enough values provided for DYE_SOURCE_MAXLON ")
125 
126  cs%dye_source_minlat(:) = -1.e30
127  call get_param(param_file, mdl, "DYE_SOURCE_MINLAT", cs%dye_source_minlat, &
128  "This is the starting latitude at which we start injecting dyes.", &
129  fail_if_missing=.true.)
130  if (minval(cs%dye_source_minlat(:)) < -1.e29) &
131  call mom_error(fatal, "register_dye_tracer: Not enough values provided for DYE_SOURCE_MINLAT ")
132 
133  cs%dye_source_maxlat(:) = -1.e30
134  call get_param(param_file, mdl, "DYE_SOURCE_MAXLAT", cs%dye_source_maxlat, &
135  "This is the ending latitude at which we finish injecting dyes.", &
136  fail_if_missing=.true.)
137  if (minval(cs%dye_source_maxlat(:)) < -1.e29) &
138  call mom_error(fatal, "register_dye_tracer: Not enough values provided for DYE_SOURCE_MAXLAT ")
139 
140  cs%dye_source_mindepth(:) = -1.e30
141  call get_param(param_file, mdl, "DYE_SOURCE_MINDEPTH", cs%dye_source_mindepth, &
142  "This is the minimum depth at which we inject dyes.", &
143  units="m", scale=us%m_to_Z, fail_if_missing=.true.)
144  if (minval(cs%dye_source_mindepth(:)) < -1.e29*us%m_to_Z) &
145  call mom_error(fatal, "register_dye_tracer: Not enough values provided for DYE_SOURCE_MINDEPTH")
146 
147  cs%dye_source_maxdepth(:) = -1.e30
148  call get_param(param_file, mdl, "DYE_SOURCE_MAXDEPTH", cs%dye_source_maxdepth, &
149  "This is the maximum depth at which we inject dyes.", &
150  units="m", scale=us%m_to_Z, fail_if_missing=.true.)
151  if (minval(cs%dye_source_maxdepth(:)) < -1.e29*us%m_to_Z) &
152  call mom_error(fatal, "register_dye_tracer: Not enough values provided for DYE_SOURCE_MAXDEPTH ")
153 
154  allocate(cs%tr(isd:ied,jsd:jed,nz,cs%ntr)) ; cs%tr(:,:,:,:) = 0.0
155 
156  do m = 1, cs%ntr
157  write(var_name(:),'(A,I3.3)') "dye",m
158  write(desc_name(:),'(A,I3.3)') "Dye Tracer ",m
159  cs%tr_desc(m) = var_desc(trim(var_name), "conc", trim(desc_name), caller=mdl)
160 
161  ! This is needed to force the compiler not to do a copy in the registration
162  ! calls. Curses on the designers and implementers of Fortran90.
163  tr_ptr => cs%tr(:,:,:,m)
164  call query_vardesc(cs%tr_desc(m), name=var_name, &
165  caller="register_dye_tracer")
166  ! Register the tracer for horizontal advection, diffusion, and restarts.
167  call register_tracer(tr_ptr, tr_reg, param_file, hi, gv, &
168  tr_desc=cs%tr_desc(m), registry_diags=.true., &
169  restart_cs=restart_cs, mandatory=.not.cs%tracers_may_reinit)
170 
171  ! Set coupled_tracers to be true (hard-coded above) to provide the surface
172  ! values to the coupler (if any). This is meta-code and its arguments will
173  ! currently (deliberately) give fatal errors if it is used.
174  if (cs%coupled_tracers) &
175  cs%ind_tr(m) = aof_set_coupler_flux(trim(var_name)//'_flux', &
176  flux_type=' ', implementation=' ', caller="register_dye_tracer")
177  enddo
178 
179  cs%tr_Reg => tr_reg
180  cs%restart_CSp => restart_cs
181  register_dye_tracer = .true.
182 end function register_dye_tracer
183 
184 !> This subroutine initializes the CS%ntr tracer fields in tr(:,:,:,:)
185 !! and it sets up the tracer output.
186 subroutine initialize_dye_tracer(restart, day, G, GV, h, diag, OBC, CS, sponge_CSp)
187  logical, intent(in) :: restart !< .true. if the fields have already been
188  !! read from a restart file.
189  type(time_type), target, intent(in) :: day !< Time of the start of the run.
190  type(ocean_grid_type), intent(in) :: g !< The ocean's grid structure
191  type(verticalgrid_type), intent(in) :: gv !< The ocean's vertical grid structure
192  real, dimension(NIMEM_,NJMEM_,NKMEM_), intent(in) :: h !< Layer thicknesses [H ~> m or kg m-2]
193  type(diag_ctrl), target, intent(in) :: diag !< Structure used to regulate diagnostic output.
194  type(ocean_obc_type), pointer :: obc !< This open boundary condition type specifies
195  !! whether, where, and what open boundary
196  !! conditions are used.
197  type(dye_tracer_cs), pointer :: cs !< The control structure returned by a previous
198  !! call to register_dye_tracer.
199  type(sponge_cs), pointer :: sponge_csp !< A pointer to the control structure
200  !! for the sponges, if they are in use.
201 
202 ! Local variables
203  character(len=24) :: name ! A variable's name in a NetCDF file.
204  character(len=72) :: longname ! The long name of that variable.
205  character(len=48) :: units ! The dimensions of the variable.
206  character(len=48) :: flux_units ! The units for age tracer fluxes, either
207  ! years m3 s-1 or years kg s-1.
208  logical :: ok
209  integer :: i, j, k, m
210  real :: z_bot, z_center
211 
212  if (.not.associated(cs)) return
213  if (cs%ntr < 1) return
214 
215  cs%diag => diag
216 
217  ! Establish location of source
218  do m= 1, cs%ntr
219  do j=g%jsd,g%jed ; do i=g%isd,g%ied
220  ! A dye is set dependent on the center of the cell being inside the rectangular box.
221  if (cs%dye_source_minlon(m)<g%geoLonT(i,j) .and. &
222  cs%dye_source_maxlon(m)>=g%geoLonT(i,j) .and. &
223  cs%dye_source_minlat(m)<g%geoLatT(i,j) .and. &
224  cs%dye_source_maxlat(m)>=g%geoLatT(i,j) .and. &
225  g%mask2dT(i,j) > 0.0 ) then
226  z_bot = -g%bathyT(i,j)
227  do k = gv%ke, 1, -1
228  z_center = z_bot + 0.5*h(i,j,k)*gv%H_to_Z
229  if ( z_center > -cs%dye_source_maxdepth(m) .and. &
230  z_center < -cs%dye_source_mindepth(m) ) then
231  cs%tr(i,j,k,m) = 1.0
232  endif
233  z_bot = z_bot + h(i,j,k)*gv%H_to_Z
234  enddo
235  endif
236  enddo ; enddo
237  enddo
238 
239 end subroutine initialize_dye_tracer
240 
241 !> This subroutine applies diapycnal diffusion and any other column
242 !! tracer physics or chemistry to the tracers from this file.
243 !! This is a simple example of a set of advected passive tracers.
244 !! The arguments to this subroutine are redundant in that
245 !! h_new(k) = h_old(k) + ea(k) - eb(k-1) + eb(k) - ea(k+1)
246 subroutine dye_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, G, GV, CS, &
247  evap_CFL_limit, minimum_forcing_depth)
248  type(ocean_grid_type), intent(in) :: g !< The ocean's grid structure
249  type(verticalgrid_type), intent(in) :: gv !< The ocean's vertical grid structure
250  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
251  intent(in) :: h_old !< Layer thickness before entrainment [H ~> m or kg m-2].
252  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
253  intent(in) :: h_new !< Layer thickness after entrainment [H ~> m or kg m-2].
254  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
255  intent(in) :: ea !< an array to which the amount of fluid entrained
256  !! from the layer above during this call will be
257  !! added [H ~> m or kg m-2].
258  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
259  intent(in) :: eb !< an array to which the amount of fluid entrained
260  !! from the layer below during this call will be
261  !! added [H ~> m or kg m-2].
262  type(forcing), intent(in) :: fluxes !< A structure containing pointers to thermodynamic
263  !! and tracer forcing fields. Unused fields have NULL ptrs.
264  real, intent(in) :: dt !< The amount of time covered by this call [s]
265  type(dye_tracer_cs), pointer :: cs !< The control structure returned by a previous
266  !! call to register_dye_tracer.
267  real, optional, intent(in) :: evap_cfl_limit !< Limit on the fraction of the water that can
268  !! be fluxed out of the top layer in a timestep [nondim]
269  real, optional, intent(in) :: minimum_forcing_depth !< The smallest depth over which
270  !! fluxes can be applied [m]
271 
272 ! Local variables
273  real, dimension(SZI_(G),SZJ_(G),SZK_(G)) :: h_work ! Used so that h can be modified
274  real :: sfc_val ! The surface value for the tracers.
275  real :: isecs_per_year ! The number of seconds in a year.
276  real :: year ! The time in years.
277  integer :: secs, days ! Integer components of the time type.
278  integer :: i, j, k, is, ie, js, je, nz, m
279  real :: z_bot, z_center
280 
281  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = gv%ke
282 
283  if (.not.associated(cs)) return
284  if (cs%ntr < 1) return
285 
286  if (present(evap_cfl_limit) .and. present(minimum_forcing_depth)) then
287  do m=1,cs%ntr
288  do k=1,nz ;do j=js,je ; do i=is,ie
289  h_work(i,j,k) = h_old(i,j,k)
290  enddo ; enddo ; enddo
291  call applytracerboundaryfluxesinout(g, gv, cs%tr(:,:,:,m) , dt, fluxes, h_work, &
292  evap_cfl_limit, minimum_forcing_depth)
293  call tracer_vertdiff(h_work, ea, eb, dt, cs%tr(:,:,:,m), g, gv)
294  enddo
295  else
296  do m=1,cs%ntr
297  call tracer_vertdiff(h_old, ea, eb, dt, cs%tr(:,:,:,m), g, gv)
298  enddo
299  endif
300 
301  do m=1,cs%ntr
302  do j=g%jsd,g%jed ; do i=g%isd,g%ied
303  ! A dye is set dependent on the center of the cell being inside the rectangular box.
304  if (cs%dye_source_minlon(m)<g%geoLonT(i,j) .and. &
305  cs%dye_source_maxlon(m)>=g%geoLonT(i,j) .and. &
306  cs%dye_source_minlat(m)<g%geoLatT(i,j) .and. &
307  cs%dye_source_maxlat(m)>=g%geoLatT(i,j) .and. &
308  g%mask2dT(i,j) > 0.0 ) then
309  z_bot = -g%bathyT(i,j)
310  do k=nz,1,-1
311  z_center = z_bot + 0.5*h_new(i,j,k)*gv%H_to_Z
312  if ( z_center > -cs%dye_source_maxdepth(m) .and. &
313  z_center < -cs%dye_source_mindepth(m) ) then
314  cs%tr(i,j,k,m) = 1.0
315  endif
316  z_bot = z_bot + h_new(i,j,k)*gv%H_to_Z
317  enddo
318  endif
319  enddo ; enddo
320  enddo
321 
322 end subroutine dye_tracer_column_physics
323 
324 !> This function calculates the mass-weighted integral of all tracer stocks,
325 !! returning the number of stocks it has calculated. If the stock_index
326 !! is present, only the stock corresponding to that coded index is returned.
327 function dye_stock(h, stocks, G, GV, CS, names, units, stock_index)
328  real, dimension(NIMEM_,NJMEM_,NKMEM_), intent(in) :: h !< Layer thicknesses [H ~> m or kg m-2]
329  real, dimension(:), intent(out) :: stocks !< the mass-weighted integrated amount of
330  !! each tracer, in kg times concentration units [kg conc].
331  type(ocean_grid_type), intent(in) :: g !< The ocean's grid structure
332  type(verticalgrid_type), intent(in) :: gv !< The ocean's vertical grid structure
333  type(dye_tracer_cs), pointer :: cs !< The control structure returned by a
334  !! previous call to register_dye_tracer.
335  character(len=*), dimension(:), intent(out) :: names !< the names of the stocks calculated.
336  character(len=*), dimension(:), intent(out) :: units !< the units of the stocks calculated.
337  integer, optional, intent(in) :: stock_index !< the coded index of a specific stock
338  !! being sought.
339  integer :: dye_stock !< Return value: the number of stocks
340  !! calculated here.
341 
342 ! Local variables
343  integer :: i, j, k, is, ie, js, je, nz, m
344  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = gv%ke
345 
346  dye_stock = 0
347  if (.not.associated(cs)) return
348  if (cs%ntr < 1) return
349 
350  if (present(stock_index)) then ; if (stock_index > 0) then
351  ! Check whether this stock is available from this routine.
352 
353  ! No stocks from this routine are being checked yet. Return 0.
354  return
355  endif ; endif
356 
357  do m=1,cs%ntr
358  call query_vardesc(cs%tr_desc(m), name=names(m), units=units(m), caller="dye_stock")
359  units(m) = trim(units(m))//" kg"
360  stocks(m) = 0.0
361  do k=1,nz ; do j=js,je ; do i=is,ie
362  stocks(m) = stocks(m) + cs%tr(i,j,k,m) * &
363  (g%mask2dT(i,j) * g%areaT(i,j) * h(i,j,k))
364  enddo ; enddo ; enddo
365  stocks(m) = gv%H_to_kg_m2 * stocks(m)
366  enddo
367  dye_stock = cs%ntr
368 
369 end function dye_stock
370 
371 !> This subroutine extracts the surface fields from this tracer package that
372 !! are to be shared with the atmosphere in coupled configurations.
373 !! This particular tracer package does not report anything back to the coupler.
374 subroutine dye_tracer_surface_state(state, h, G, CS)
375  type(ocean_grid_type), intent(in) :: g !< The ocean's grid structure.
376  type(surface), intent(inout) :: state !< A structure containing fields that
377  !! describe the surface state of the ocean.
378  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
379  intent(in) :: h !< Layer thickness [H ~> m or kg m-2].
380  type(dye_tracer_cs), pointer :: cs !< The control structure returned by a previous
381  !! call to register_dye_tracer.
382 
383  ! This particular tracer package does not report anything back to the coupler.
384  ! The code that is here is just a rough guide for packages that would.
385 
386  integer :: m, is, ie, js, je, isd, ied, jsd, jed
387  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
388  isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
389 
390  if (.not.associated(cs)) return
391 
392  if (cs%coupled_tracers) then
393  do m=1,cs%ntr
394  ! This call loads the surface values into the appropriate array in the
395  ! coupler-type structure.
396  call coupler_type_set_data(cs%tr(:,:,1,m), cs%ind_tr(m), ind_csurf, &
397  state%tr_fields, idim=(/isd, is, ie, ied/), &
398  jdim=(/jsd, js, je, jed/) )
399  enddo
400  endif
401 
402 end subroutine dye_tracer_surface_state
403 
404 !> Clean up any allocated memory after the run.
405 subroutine regional_dyes_end(CS)
406  type(dye_tracer_cs), pointer :: cs !< The control structure returned by a previous
407  !! call to register_dye_tracer.
408  integer :: m
409 
410  if (associated(cs)) then
411  if (associated(cs%tr)) deallocate(cs%tr)
412  deallocate(cs)
413  endif
414 end subroutine regional_dyes_end
415 
416 !> \namespace regional_dyes
417 !!
418 !! This file contains an example of the code that is needed to set
419 !! up and use a set (in this case two) of dynamically passive tracers
420 !! for diagnostic purposes. The tracers here are dye tracers which
421 !! are set to 1 within the geographical region specified. The depth
422 !! which a tracer is set is determined by calculating the depth from
423 !! the seafloor upwards through the column.
424 
425 end module regional_dyes
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
regional_dyes
A tracer package for using dyes to diagnose regional flows.
Definition: dye_example.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
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_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_unit_scaling::unit_scale_type
Describes various unit conversion factors.
Definition: MOM_unit_scaling.F90:14
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_unit_scaling
Provides a transparent unit rescaling type to facilitate dimensional consistency testing.
Definition: MOM_unit_scaling.F90:2
regional_dyes::dye_tracer_cs
The control structure for the regional dyes tracer package.
Definition: dye_example.F90:41
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