MOM6
mom_tracer_flow_control Module Reference

Detailed Description

Orchestrates the registration and calling of tracer packages.

Data Types

type  tracer_flow_control_cs
 The control structure for orchestrating the calling of tracer packages. More...
 

Functions/Subroutines

subroutine, public call_tracer_flux_init (verbosity)
 This subroutine carries out a series of calls to initialize the air-sea tracer fluxes, but it does not record the generated indicies, and it may be called before the ocean model has been initialized and may be called on non-ocean PEs. It is not necessary to call this routine for ocean-only runs, because the same calls are made again inside of the routines called by call_tracer_register. More...
 
subroutine, public call_tracer_register (HI, GV, US, param_file, CS, tr_Reg, restart_CS)
 This subroutine determines which tracer packages are to be used and does the calls to register their tracers to be advected, diffused, and read from restarts. More...
 
subroutine, public tracer_flow_control_init (restart, day, G, GV, US, h, param_file, diag, OBC, CS, sponge_CSp, ALE_sponge_CSp, tv)
 This subroutine calls all registered tracer initialization subroutines. More...
 
subroutine, public get_chl_from_model (Chl_array, G, CS)
 This subroutine extracts the chlorophyll concentrations from the model state, if possible. More...
 
subroutine, public call_tracer_set_forcing (state, fluxes, day_start, day_interval, G, CS)
 This subroutine calls the individual tracer modules' subroutines to specify or read quantities related to their surface forcing. More...
 
subroutine, public call_tracer_column_fns (h_old, h_new, ea, eb, fluxes, Hml, dt, G, GV, US, tv, optics, CS, debug, evap_CFL_limit, minimum_forcing_depth)
 This subroutine calls all registered tracer column physics subroutines. More...
 
subroutine, public call_tracer_stocks (h, stock_values, G, GV, CS, stock_names, stock_units, num_stocks, stock_index, got_min_max, global_min, global_max, xgmin, ygmin, zgmin, xgmax, ygmax, zgmax)
 This subroutine calls all registered tracer packages to enable them to add to the surface state returned to the coupler. These routines are optional. More...
 
subroutine store_stocks (pkg_name, ns, names, units, values, index, stock_values, set_pkg_name, max_ns, ns_tot, stock_names, stock_units)
 This routine stores the stocks and does error handling for call_tracer_stocks. More...
 
subroutine, public call_tracer_surface_state (state, h, G, CS)
 This subroutine calls all registered tracer packages to enable them to add to the surface state returned to the coupler. These routines are optional. More...
 
subroutine, public tracer_flow_control_end (CS)
 

Function/Subroutine Documentation

◆ call_tracer_column_fns()

subroutine, public mom_tracer_flow_control::call_tracer_column_fns ( real, dimension(nimem_,njmem_,nkmem_), intent(in)  h_old,
real, dimension(nimem_,njmem_,nkmem_), intent(in)  h_new,
real, dimension(nimem_,njmem_,nkmem_), intent(in)  ea,
real, dimension(nimem_,njmem_,nkmem_), intent(in)  eb,
type(forcing), intent(in)  fluxes,
real, dimension(nimem_,njmem_), intent(in)  Hml,
real, intent(in)  dt,
type(ocean_grid_type), intent(in)  G,
type(verticalgrid_type), intent(in)  GV,
type(unit_scale_type), intent(in)  US,
type(thermo_var_ptrs), intent(in)  tv,
type(optics_type), pointer  optics,
type(tracer_flow_control_cs), pointer  CS,
logical, intent(in)  debug,
real, intent(in), optional  evap_CFL_limit,
real, intent(in), optional  minimum_forcing_depth 
)

This subroutine calls all registered tracer column physics subroutines.

Parameters
[in]h_oldLayer thickness before entrainment [H ~> m or kg m-2].
[in]h_newLayer thickness after entrainment [H ~> m or kg m-2].
[in]eaan array to which the amount of fluid entrained from the layer above during this call will be added [H ~> m or kg m-2].
[in]eban array to which the amount of fluid entrained from the layer below during this call will be added [H ~> m or kg m-2].
[in]fluxesA structure containing pointers to any possible forcing fields. Unused fields have NULL ptrs.
[in]hmlMixed layer depth [H ~> m or kg m-2]
[in]dtThe amount of time covered by this call [T ~> s]
[in]gThe ocean's grid structure.
[in]gvThe ocean's vertical grid structure.
[in]usA dimensional unit scaling type
[in]tvA structure pointing to various thermodynamic variables.
opticsThe structure containing optical properties.
csThe control structure returned by a previous call to call_tracer_register.
[in]debugIf true calculate checksums
[in]evap_cfl_limitLimit on the fraction of the water that can be fluxed out of the top layer in a timestep [nondim]
[in]minimum_forcing_depthThe smallest depth over which fluxes can be applied [H ~> m or kg m-2]

Definition at line 407 of file MOM_tracer_flow_control.F90.

407  real, dimension(NIMEM_,NJMEM_,NKMEM_), intent(in) :: h_old !< Layer thickness before entrainment
408  !! [H ~> m or kg m-2].
409  real, dimension(NIMEM_,NJMEM_,NKMEM_), intent(in) :: h_new !< Layer thickness after entrainment
410  !! [H ~> m or kg m-2].
411  real, dimension(NIMEM_,NJMEM_,NKMEM_), intent(in) :: ea !< an array to which the amount of
412  !! fluid entrained from the layer above during this call
413  !! will be added [H ~> m or kg m-2].
414  real, dimension(NIMEM_,NJMEM_,NKMEM_), intent(in) :: eb !< an array to which the amount of
415  !! fluid entrained from the layer below during this call
416  !! will be added [H ~> m or kg m-2].
417  type(forcing), intent(in) :: fluxes !< A structure containing pointers to
418  !! any possible forcing fields.
419  !! Unused fields have NULL ptrs.
420  real, dimension(NIMEM_,NJMEM_), intent(in) :: Hml !< Mixed layer depth [H ~> m or kg m-2]
421  real, intent(in) :: dt !< The amount of time covered by this
422  !! call [T ~> s]
423  type(ocean_grid_type), intent(in) :: G !< The ocean's grid structure.
424  type(verticalGrid_type), intent(in) :: GV !< The ocean's vertical grid
425  !! structure.
426  type(unit_scale_type), intent(in) :: US !< A dimensional unit scaling type
427  type(thermo_var_ptrs), intent(in) :: tv !< A structure pointing to various
428  !! thermodynamic variables.
429  type(optics_type), pointer :: optics !< The structure containing optical
430  !! properties.
431  type(tracer_flow_control_CS), pointer :: CS !< The control structure returned by
432  !! a previous call to
433  !! call_tracer_register.
434  logical, intent(in) :: debug !< If true calculate checksums
435  real, optional, intent(in) :: evap_CFL_limit !< Limit on the fraction of
436  !! the water that can be fluxed out
437  !! of the top layer in a timestep [nondim]
438  real, optional, intent(in) :: minimum_forcing_depth !< The smallest depth over
439  !! which fluxes can be applied [H ~> m or kg m-2]
440 
441  if (.not. associated(cs)) call mom_error(fatal, "call_tracer_column_fns: "// &
442  "Module must be initialized via call_tracer_register before it is used.")
443 
444  ! Use the applyTracerBoundaryFluxesInOut to handle surface fluxes
445  if (present(evap_cfl_limit) .and. present(minimum_forcing_depth)) then
446  ! Add calls to tracer column functions here.
447  if (cs%use_USER_tracer_example) &
448  call tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
449  g, gv, us, cs%USER_tracer_example_CSp)
450  if (cs%use_DOME_tracer) &
451  call dome_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
452  g, gv, us, cs%DOME_tracer_CSp, &
453  evap_cfl_limit=evap_cfl_limit, &
454  minimum_forcing_depth=minimum_forcing_depth)
455  if (cs%use_ISOMIP_tracer) &
456  call isomip_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
457  g, gv, us, cs%ISOMIP_tracer_CSp, &
458  evap_cfl_limit=evap_cfl_limit, &
459  minimum_forcing_depth=minimum_forcing_depth)
460  if (cs%use_RGC_tracer) &
461  call rgc_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
462  g, gv, us, cs%RGC_tracer_CSp, &
463  evap_cfl_limit=evap_cfl_limit, &
464  minimum_forcing_depth=minimum_forcing_depth)
465  if (cs%use_ideal_age) &
466  call ideal_age_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
467  g, gv, us, cs%ideal_age_tracer_CSp, &
468  evap_cfl_limit=evap_cfl_limit, &
469  minimum_forcing_depth=minimum_forcing_depth)
470  if (cs%use_regional_dyes) &
471  call dye_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
472  g, gv, us, cs%dye_tracer_CSp, &
473  evap_cfl_limit=evap_cfl_limit, &
474  minimum_forcing_depth=minimum_forcing_depth)
475  if (cs%use_oil) &
476  call oil_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
477  g, gv, us, cs%oil_tracer_CSp, tv, &
478  evap_cfl_limit=evap_cfl_limit, &
479  minimum_forcing_depth=minimum_forcing_depth)
480 
481  if (cs%use_advection_test_tracer) &
482  call advection_test_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
483  g, gv, us, cs%advection_test_tracer_CSp, &
484  evap_cfl_limit=evap_cfl_limit, &
485  minimum_forcing_depth=minimum_forcing_depth)
486  if (cs%use_OCMIP2_CFC) &
487  call ocmip2_cfc_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
488  g, gv, us, cs%OCMIP2_CFC_CSp, &
489  evap_cfl_limit=evap_cfl_limit, &
490  minimum_forcing_depth=minimum_forcing_depth)
491 #ifdef _USE_GENERIC_TRACER
492  if (cs%use_MOM_generic_tracer) &
493  call mom_generic_tracer_column_physics(h_old, h_new, ea, eb, fluxes, hml, us%T_to_s*dt, &
494  g, gv, cs%MOM_generic_tracer_CSp, tv, optics, &
495  evap_cfl_limit=evap_cfl_limit, &
496  minimum_forcing_depth=minimum_forcing_depth)
497 #endif
498  if (cs%use_pseudo_salt_tracer) &
499  call pseudo_salt_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
500  g, gv, us, cs%pseudo_salt_tracer_CSp, tv, debug, &
501  evap_cfl_limit=evap_cfl_limit, &
502  minimum_forcing_depth=minimum_forcing_depth)
503  if (cs%use_boundary_impulse_tracer) &
504  call boundary_impulse_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
505  g, gv, us, cs%boundary_impulse_tracer_CSp, tv, debug, &
506  evap_cfl_limit=evap_cfl_limit, &
507  minimum_forcing_depth=minimum_forcing_depth)
508  if (cs%use_dyed_obc_tracer) &
509  call dyed_obc_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
510  g, gv, us, cs%dyed_obc_tracer_CSp, &
511  evap_cfl_limit=evap_cfl_limit, &
512  minimum_forcing_depth=minimum_forcing_depth)
513 
514 
515  else ! Apply tracer surface fluxes using ea on the first layer
516  if (cs%use_USER_tracer_example) &
517  call tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
518  g, gv, us, cs%USER_tracer_example_CSp)
519  if (cs%use_DOME_tracer) &
520  call dome_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
521  g, gv, us, cs%DOME_tracer_CSp)
522  if (cs%use_ISOMIP_tracer) &
523  call isomip_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
524  g, gv, us, cs%ISOMIP_tracer_CSp)
525  if (cs%use_RGC_tracer) &
526  call rgc_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
527  g, gv, us, cs%RGC_tracer_CSp)
528  if (cs%use_ideal_age) &
529  call ideal_age_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
530  g, gv, us, cs%ideal_age_tracer_CSp)
531  if (cs%use_regional_dyes) &
532  call dye_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
533  g, gv, us, cs%dye_tracer_CSp)
534  if (cs%use_oil) &
535  call oil_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
536  g, gv, us, cs%oil_tracer_CSp, tv)
537  if (cs%use_advection_test_tracer) &
538  call advection_test_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
539  g, gv, us, cs%advection_test_tracer_CSp)
540  if (cs%use_OCMIP2_CFC) &
541  call ocmip2_cfc_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
542  g, gv, us, cs%OCMIP2_CFC_CSp)
543 #ifdef _USE_GENERIC_TRACER
544  if (cs%use_MOM_generic_tracer) &
545  call mom_generic_tracer_column_physics(h_old, h_new, ea, eb, fluxes, hml, us%T_to_s*dt, &
546  g, gv, cs%MOM_generic_tracer_CSp, tv, optics)
547 #endif
548  if (cs%use_pseudo_salt_tracer) &
549  call pseudo_salt_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
550  g, gv, us, cs%pseudo_salt_tracer_CSp, tv, debug)
551  if (cs%use_boundary_impulse_tracer) &
552  call boundary_impulse_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
553  g, gv, us, cs%boundary_impulse_tracer_CSp, tv, debug)
554  if (cs%use_dyed_obc_tracer) &
555  call dyed_obc_tracer_column_physics(h_old, h_new, ea, eb, fluxes, dt, &
556  g, gv, us, cs%dyed_obc_tracer_CSp)
557 
558  endif
559 
560 

References mom_error_handler::mom_error().

Referenced by mom_diabatic_driver::adiabatic(), mom_diabatic_driver::diabatic_ale(), mom_diabatic_driver::diabatic_ale_legacy(), mom_diabatic_driver::layered_diabatic(), mom_offline_main::offline_advection_layer(), and mom_offline_main::offline_diabatic_ale().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ call_tracer_flux_init()

subroutine, public mom_tracer_flow_control::call_tracer_flux_init ( integer, intent(in), optional  verbosity)

This subroutine carries out a series of calls to initialize the air-sea tracer fluxes, but it does not record the generated indicies, and it may be called before the ocean model has been initialized and may be called on non-ocean PEs. It is not necessary to call this routine for ocean-only runs, because the same calls are made again inside of the routines called by call_tracer_register.

Parameters
[in]verbosityA 0-9 integer indicating a level of verbosity.

Definition at line 117 of file MOM_tracer_flow_control.F90.

117  integer, optional, intent(in) :: verbosity !< A 0-9 integer indicating a level of verbosity.
118 
119  type(param_file_type) :: param_file ! A structure to parse for run-time parameters
120  character(len=40) :: mdl = "call_tracer_flux_init" ! This module's name.
121  logical :: use_OCMIP_CFCs, use_MOM_generic_tracer
122 
123  ! Determine which tracer routines with tracer fluxes are to be called. Note
124  ! that not every tracer package is required to have a flux_init call.
125  call get_mom_input(param_file, check_params=.false.)
126 
127  call get_param(param_file, mdl, "USE_OCMIP2_CFC", use_ocmip_cfcs, &
128  default=.false., do_not_log=.true.)
129  call get_param(param_file, mdl, "USE_generic_tracer", use_mom_generic_tracer,&
130  default=.false., do_not_log=.true.)
131  call close_param_file(param_file, quiet_close=.true.)
132 
133  if (use_ocmip_cfcs) call flux_init_ocmip2_cfc(verbosity=verbosity)
134  if (use_mom_generic_tracer) then
135 #ifdef _USE_GENERIC_TRACER
136  call mom_generic_flux_init(verbosity=verbosity)
137 #else
138  call mom_error(fatal, &
139  "call_tracer_flux_init: use_MOM_generic_tracer=.true. but MOM6 was "//&
140  "not compiled with _USE_GENERIC_TRACER")
141 #endif
142  endif
143 

References mom_file_parser::close_param_file(), mom_get_input::get_mom_input(), and mom_error_handler::mom_error().

Referenced by mom_ocean_model_nuopc::ocean_model_flux_init(), and mom_ocean_model_mct::ocean_model_flux_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ call_tracer_register()

subroutine, public mom_tracer_flow_control::call_tracer_register ( type(hor_index_type), intent(in)  HI,
type(verticalgrid_type), intent(in)  GV,
type(unit_scale_type), intent(in)  US,
type(param_file_type), intent(in)  param_file,
type(tracer_flow_control_cs), pointer  CS,
type(tracer_registry_type), pointer  tr_Reg,
type(mom_restart_cs), pointer  restart_CS 
)

This subroutine determines which tracer packages are to be used and does the calls to register their tracers to be advected, diffused, and read from restarts.

Parameters
[in]hiA horizontal index type structure.
[in]gvThe ocean's vertical grid structure.
[in]usA dimensional unit scaling type
[in]param_fileA structure to parse for run-time parameters.
csA pointer that is set to point to the control structure for this module.
tr_regA pointer that is set to point to the control structure for the tracer advection and diffusion module.
restart_csA pointer to the restart control structure.

Definition at line 152 of file MOM_tracer_flow_control.F90.

152  type(hor_index_type), intent(in) :: HI !< A horizontal index type structure.
153  type(verticalGrid_type), intent(in) :: GV !< The ocean's vertical grid structure.
154  type(unit_scale_type), intent(in) :: US !< A dimensional unit scaling type
155  type(param_file_type), intent(in) :: param_file !< A structure to parse for run-time
156  !! parameters.
157  type(tracer_flow_control_CS), pointer :: CS !< A pointer that is set to point to the
158  !! control structure for this module.
159  type(tracer_registry_type), pointer :: tr_Reg !< A pointer that is set to point to the
160  !! control structure for the tracer
161  !! advection and diffusion module.
162  type(MOM_restart_CS), pointer :: restart_CS !< A pointer to the restart control
163  !! structure.
164 
165 
166  ! This include declares and sets the variable "version".
167 # include "version_variable.h"
168  character(len=40) :: mdl = "MOM_tracer_flow_control" ! This module's name.
169 
170  if (associated(cs)) then
171  call mom_error(warning, "call_tracer_register called with an associated "// &
172  "control structure.")
173  return
174  else ; allocate(cs) ; endif
175 
176  ! Read all relevant parameters and write them to the model log.
177  call log_version(param_file, mdl, version, "")
178  call get_param(param_file, mdl, "USE_USER_TRACER_EXAMPLE", &
179  cs%use_USER_tracer_example, &
180  "If true, use the USER_tracer_example tracer package.", &
181  default=.false.)
182  call get_param(param_file, mdl, "USE_DOME_TRACER", cs%use_DOME_tracer, &
183  "If true, use the DOME_tracer tracer package.", &
184  default=.false.)
185  call get_param(param_file, mdl, "USE_ISOMIP_TRACER", cs%use_ISOMIP_tracer, &
186  "If true, use the ISOMIP_tracer tracer package.", &
187  default=.false.)
188  call get_param(param_file, mdl, "USE_RGC_TRACER", cs%use_RGC_tracer, &
189  "If true, use the RGC_tracer tracer package.", &
190  default=.false.)
191  call get_param(param_file, mdl, "USE_IDEAL_AGE_TRACER", cs%use_ideal_age, &
192  "If true, use the ideal_age_example tracer package.", &
193  default=.false.)
194  call get_param(param_file, mdl, "USE_REGIONAL_DYES", cs%use_regional_dyes, &
195  "If true, use the regional_dyes tracer package.", &
196  default=.false.)
197  call get_param(param_file, mdl, "USE_OIL_TRACER", cs%use_oil, &
198  "If true, use the oil_tracer tracer package.", &
199  default=.false.)
200  call get_param(param_file, mdl, "USE_ADVECTION_TEST_TRACER", cs%use_advection_test_tracer, &
201  "If true, use the advection_test_tracer tracer package.", &
202  default=.false.)
203  call get_param(param_file, mdl, "USE_OCMIP2_CFC", cs%use_OCMIP2_CFC, &
204  "If true, use the MOM_OCMIP2_CFC tracer package.", &
205  default=.false.)
206  call get_param(param_file, mdl, "USE_generic_tracer", cs%use_MOM_generic_tracer, &
207  "If true and _USE_GENERIC_TRACER is defined as a "//&
208  "preprocessor macro, use the MOM_generic_tracer packages.", &
209  default=.false.)
210  call get_param(param_file, mdl, "USE_PSEUDO_SALT_TRACER", cs%use_pseudo_salt_tracer, &
211  "If true, use the pseudo salt tracer, typically run as a diagnostic.", &
212  default=.false.)
213  call get_param(param_file, mdl, "USE_BOUNDARY_IMPULSE_TRACER", cs%use_boundary_impulse_tracer, &
214  "If true, use the boundary impulse tracer.", &
215  default=.false.)
216  call get_param(param_file, mdl, "USE_DYED_OBC_TRACER", cs%use_dyed_obc_tracer, &
217  "If true, use the dyed_obc_tracer tracer package.", &
218  default=.false.)
219 
220 #ifndef _USE_GENERIC_TRACER
221  if (cs%use_MOM_generic_tracer) call mom_error(fatal, &
222  "call_tracer_register: use_MOM_generic_tracer=.true. but MOM6 was "//&
223  "not compiled with _USE_GENERIC_TRACER")
224 #endif
225 
226 ! Add other user-provided calls to register tracers for restarting here. Each
227 ! tracer package registration call returns a logical false if it cannot be run
228 ! for some reason. This then overrides the run-time selection from above.
229  if (cs%use_USER_tracer_example) cs%use_USER_tracer_example = &
230  user_register_tracer_example(hi, gv, param_file, cs%USER_tracer_example_CSp, &
231  tr_reg, restart_cs)
232  if (cs%use_DOME_tracer) cs%use_DOME_tracer = &
233  register_dome_tracer(hi, gv, param_file, cs%DOME_tracer_CSp, &
234  tr_reg, restart_cs)
235  if (cs%use_ISOMIP_tracer) cs%use_ISOMIP_tracer = &
236  register_isomip_tracer(hi, gv, param_file, cs%ISOMIP_tracer_CSp, &
237  tr_reg, restart_cs)
238  if (cs%use_RGC_tracer) cs%use_RGC_tracer = &
239  register_rgc_tracer(hi, gv, param_file, cs%RGC_tracer_CSp, &
240  tr_reg, restart_cs)
241  if (cs%use_ideal_age) cs%use_ideal_age = &
242  register_ideal_age_tracer(hi, gv, param_file, cs%ideal_age_tracer_CSp, &
243  tr_reg, restart_cs)
244  if (cs%use_regional_dyes) cs%use_regional_dyes = &
245  register_dye_tracer(hi, gv, us, param_file, cs%dye_tracer_CSp, &
246  tr_reg, restart_cs)
247  if (cs%use_oil) cs%use_oil = &
248  register_oil_tracer(hi, gv, us, param_file, cs%oil_tracer_CSp, &
249  tr_reg, restart_cs)
250  if (cs%use_advection_test_tracer) cs%use_advection_test_tracer = &
251  register_advection_test_tracer(hi, gv, param_file, cs%advection_test_tracer_CSp, &
252  tr_reg, restart_cs)
253  if (cs%use_OCMIP2_CFC) cs%use_OCMIP2_CFC = &
254  register_ocmip2_cfc(hi, gv, param_file, cs%OCMIP2_CFC_CSp, &
255  tr_reg, restart_cs)
256 #ifdef _USE_GENERIC_TRACER
257  if (cs%use_MOM_generic_tracer) cs%use_MOM_generic_tracer = &
258  register_mom_generic_tracer(hi, gv, param_file, cs%MOM_generic_tracer_CSp, &
259  tr_reg, restart_cs)
260 #endif
261  if (cs%use_pseudo_salt_tracer) cs%use_pseudo_salt_tracer = &
262  register_pseudo_salt_tracer(hi, gv, param_file, cs%pseudo_salt_tracer_CSp, &
263  tr_reg, restart_cs)
264  if (cs%use_boundary_impulse_tracer) cs%use_boundary_impulse_tracer = &
265  register_boundary_impulse_tracer(hi, gv, param_file, cs%boundary_impulse_tracer_CSp, &
266  tr_reg, restart_cs)
267  if (cs%use_dyed_obc_tracer) cs%use_dyed_obc_tracer = &
268  register_dyed_obc_tracer(hi, gv, param_file, cs%dyed_obc_tracer_CSp, &
269  tr_reg, restart_cs)
270 
271 

References mom_error_handler::mom_error().

Here is the call graph for this function:

◆ call_tracer_set_forcing()

subroutine, public mom_tracer_flow_control::call_tracer_set_forcing ( type(surface), intent(inout)  state,
type(forcing), intent(inout)  fluxes,
type(time_type), intent(in)  day_start,
type(time_type), intent(in)  day_interval,
type(ocean_grid_type), intent(in)  G,
type(tracer_flow_control_cs), pointer  CS 
)

This subroutine calls the individual tracer modules' subroutines to specify or read quantities related to their surface forcing.

Parameters
[in,out]stateA structure containing fields that describe the surface state of the ocean.
[in,out]fluxesA structure containing pointers to any possible forcing fields. Unused fields have NULL ptrs.
[in]day_startStart time of the fluxes.
[in]day_intervalLength of time over which these fluxes will be applied.
[in]gThe ocean's grid structure.
csThe control structure returned by a previous call to call_tracer_register.

Definition at line 382 of file MOM_tracer_flow_control.F90.

382 
383  type(surface), intent(inout) :: state !< A structure containing fields that
384  !! describe the surface state of the
385  !! ocean.
386  type(forcing), intent(inout) :: fluxes !< A structure containing pointers to any
387  !! possible forcing fields. Unused fields
388  !! have NULL ptrs.
389  type(time_type), intent(in) :: day_start !< Start time of the fluxes.
390  type(time_type), intent(in) :: day_interval !< Length of time over which these
391  !! fluxes will be applied.
392  type(ocean_grid_type), intent(in) :: G !< The ocean's grid structure.
393  type(tracer_flow_control_CS), pointer :: CS !< The control structure returned by a
394  !! previous call to call_tracer_register.
395 
396  if (.not. associated(cs)) call mom_error(fatal, "call_tracer_set_forcing"// &
397  "Module must be initialized via call_tracer_register before it is used.")
398 ! if (CS%use_ideal_age) &
399 ! call ideal_age_tracer_set_forcing(state, fluxes, day_start, day_interval, &
400 ! G, CS%ideal_age_tracer_CSp)
401 

References mom_error_handler::mom_error().

Here is the call graph for this function:

◆ call_tracer_stocks()

subroutine, public mom_tracer_flow_control::call_tracer_stocks ( real, dimension(nimem_,njmem_,nkmem_), intent(in)  h,
real, dimension(:), intent(out)  stock_values,
type(ocean_grid_type), intent(in)  G,
type(verticalgrid_type), intent(in)  GV,
type(tracer_flow_control_cs), pointer  CS,
character(len=*), dimension(:), intent(out), optional  stock_names,
character(len=*), dimension(:), intent(out), optional  stock_units,
integer, intent(out), optional  num_stocks,
integer, intent(in), optional  stock_index,
logical, dimension(:), intent(inout), optional  got_min_max,
real, dimension(:), intent(out), optional  global_min,
real, dimension(:), intent(out), optional  global_max,
real, dimension(:), intent(out), optional  xgmin,
real, dimension(:), intent(out), optional  ygmin,
real, dimension(:), intent(out), optional  zgmin,
real, dimension(:), intent(out), optional  xgmax,
real, dimension(:), intent(out), optional  ygmax,
real, dimension(:), intent(out), optional  zgmax 
)

This subroutine calls all registered tracer packages to enable them to add to the surface state returned to the coupler. These routines are optional.

Parameters
[in]hLayer thicknesses [H ~> m or kg m-2]
[out]stock_valuesThe integrated amounts of a tracer on the current PE, usually in kg x concentration [kg conc].
[in]gThe ocean's grid structure.
[in]gvThe ocean's vertical grid structure.
csThe control structure returned by a previous call to call_tracer_register.
[out]stock_namesDiagnostic names to use for each stock.
[out]stock_unitsUnits to use in the metadata for each stock.
[out]num_stocksThe number of tracer stocks being returned.
[in]stock_indexThe integer stock index from stocks_constants_mod of the stock to be returned. If this is present and greater than 0, only a single stock can be returned.
[in,out]got_min_maxIndicates whether the global min and
[out]global_minThe global minimum of each tracer
[out]global_maxThe global maximum of each tracer
[out]xgminThe x-position of the global minimum
[out]ygminThe y-position of the global minimum
[out]zgminThe z-position of the global minimum
[out]xgmaxThe x-position of the global maximum
[out]ygmaxThe y-position of the global maximum
[out]zgmaxThe z-position of the global maximum

Definition at line 568 of file MOM_tracer_flow_control.F90.

568  real, dimension(NIMEM_,NJMEM_,NKMEM_), &
569  intent(in) :: h !< Layer thicknesses [H ~> m or kg m-2]
570  real, dimension(:), intent(out) :: stock_values !< The integrated amounts of a tracer
571  !! on the current PE, usually in kg x concentration [kg conc].
572  type(ocean_grid_type), intent(in) :: G !< The ocean's grid structure.
573  type(verticalGrid_type), intent(in) :: GV !< The ocean's vertical grid structure.
574  type(tracer_flow_control_CS), pointer :: CS !< The control structure returned by a
575  !! previous call to
576  !! call_tracer_register.
577  character(len=*), dimension(:), &
578  optional, intent(out) :: stock_names !< Diagnostic names to use for each stock.
579  character(len=*), dimension(:), &
580  optional, intent(out) :: stock_units !< Units to use in the metadata for each stock.
581  integer, optional, intent(out) :: num_stocks !< The number of tracer stocks being returned.
582  integer, optional, intent(in) :: stock_index !< The integer stock index from
583  !! stocks_constants_mod of the stock to be returned. If this is
584  !! present and greater than 0, only a single stock can be returned.
585  logical, dimension(:), &
586  optional, intent(inout) :: got_min_max !< Indicates whether the global min and
587  !! max are found for each tracer
588  real, dimension(:), optional, intent(out) :: global_min !< The global minimum of each tracer
589  real, dimension(:), optional, intent(out) :: global_max !< The global maximum of each tracer
590  real, dimension(:), optional, intent(out) :: xgmin !< The x-position of the global minimum
591  real, dimension(:), optional, intent(out) :: ygmin !< The y-position of the global minimum
592  real, dimension(:), optional, intent(out) :: zgmin !< The z-position of the global minimum
593  real, dimension(:), optional, intent(out) :: xgmax !< The x-position of the global maximum
594  real, dimension(:), optional, intent(out) :: ygmax !< The y-position of the global maximum
595  real, dimension(:), optional, intent(out) :: zgmax !< The z-position of the global maximum
596 
597  ! Local variables
598  character(len=200), dimension(MAX_FIELDS_) :: names, units
599  character(len=200) :: set_pkg_name
600  real, dimension(MAX_FIELDS_) :: values
601  integer :: max_ns, ns_tot, ns, index, pkg, max_pkgs, nn
602 
603  if (.not. associated(cs)) call mom_error(fatal, "call_tracer_stocks: "// &
604  "Module must be initialized via call_tracer_register before it is used.")
605 
606  index = -1 ; if (present(stock_index)) index = stock_index
607  ns_tot = 0
608  max_ns = size(stock_values)
609  if (present(stock_names)) max_ns = min(max_ns,size(stock_names))
610  if (present(stock_units)) max_ns = min(max_ns,size(stock_units))
611 
612 ! Add other user-provided calls here.
613  if (cs%use_USER_tracer_example) then
614  ns = user_tracer_stock(h, values, g, gv, cs%USER_tracer_example_CSp, &
615  names, units, stock_index)
616  call store_stocks("tracer_example", ns, names, units, values, index, stock_values, &
617  set_pkg_name, max_ns, ns_tot, stock_names, stock_units)
618  endif
619 ! if (CS%use_DOME_tracer) then
620 ! ns = DOME_tracer_stock(h, values, G, GV, CS%DOME_tracer_CSp, &
621 ! names, units, stock_index)
622 ! call store_stocks("DOME_tracer", ns, names, units, values, index, stock_values, &
623 ! set_pkg_name, max_ns, ns_tot, stock_names, stock_units)
624 ! endif
625  if (cs%use_ideal_age) then
626  ns = ideal_age_stock(h, values, g, gv, cs%ideal_age_tracer_CSp, &
627  names, units, stock_index)
628  call store_stocks("ideal_age_example", ns, names, units, values, index, &
629  stock_values, set_pkg_name, max_ns, ns_tot, stock_names, stock_units)
630  endif
631  if (cs%use_regional_dyes) then
632  ns = dye_stock(h, values, g, gv, cs%dye_tracer_CSp, &
633  names, units, stock_index)
634  call store_stocks("regional_dyes", ns, names, units, values, index, &
635  stock_values, set_pkg_name, max_ns, ns_tot, stock_names, stock_units)
636  endif
637  if (cs%use_oil) then
638  ns = oil_stock(h, values, g, gv, cs%oil_tracer_CSp, &
639  names, units, stock_index)
640  call store_stocks("oil_tracer", ns, names, units, values, index, &
641  stock_values, set_pkg_name, max_ns, ns_tot, stock_names, stock_units)
642  endif
643  if (cs%use_OCMIP2_CFC) then
644  ns = ocmip2_cfc_stock(h, values, g, gv, cs%OCMIP2_CFC_CSp, names, units, stock_index)
645  call store_stocks("MOM_OCMIP2_CFC", ns, names, units, values, index, stock_values, &
646  set_pkg_name, max_ns, ns_tot, stock_names, stock_units)
647  endif
648 
649  if (cs%use_advection_test_tracer) then
650  ns = advection_test_stock( h, values, g, gv, cs%advection_test_tracer_CSp, &
651  names, units, stock_index )
652  call store_stocks("advection_test_tracer", ns, names, units, values, index, &
653  stock_values, set_pkg_name, max_ns, ns_tot, stock_names, stock_units)
654  endif
655 
656 #ifdef _USE_GENERIC_TRACER
657  if (cs%use_MOM_generic_tracer) then
658  ns = mom_generic_tracer_stock(h, values, g, gv, cs%MOM_generic_tracer_CSp, &
659  names, units, stock_index)
660  call store_stocks("MOM_generic_tracer", ns, names, units, values, index, stock_values, &
661  set_pkg_name, max_ns, ns_tot, stock_names, stock_units)
662  nn=ns_tot-ns+1
663  nn=mom_generic_tracer_min_max(nn, got_min_max, global_min, global_max, &
664  xgmin, ygmin, zgmin, xgmax, ygmax, zgmax ,&
665  g, cs%MOM_generic_tracer_CSp,names, units)
666 
667  endif
668 #endif
669  if (cs%use_pseudo_salt_tracer) then
670  ns = pseudo_salt_stock(h, values, g, gv, cs%pseudo_salt_tracer_CSp, &
671  names, units, stock_index)
672  call store_stocks("pseudo_salt_tracer", ns, names, units, values, index, &
673  stock_values, set_pkg_name, max_ns, ns_tot, stock_names, stock_units)
674  endif
675 
676  if (cs%use_boundary_impulse_tracer) then
677  ns = boundary_impulse_stock(h, values, g, gv, cs%boundary_impulse_tracer_CSp, &
678  names, units, stock_index)
679  call store_stocks("boundary_impulse_tracer", ns, names, units, values, index, &
680  stock_values, set_pkg_name, max_ns, ns_tot, stock_names, stock_units)
681  endif
682 
683  if (ns_tot == 0) stock_values(1) = 0.0
684 
685  if (present(num_stocks)) num_stocks = ns_tot
686 

References advection_test_tracer::advection_test_stock(), regional_dyes::dye_stock(), ideal_age_example::ideal_age_stock(), mom_error_handler::mom_error(), mom_ocmip2_cfc::ocmip2_cfc_stock(), oil_tracer::oil_stock(), pseudo_salt_tracer::pseudo_salt_stock(), and store_stocks().

Referenced by mom_sum_output::write_energy().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ call_tracer_surface_state()

subroutine, public mom_tracer_flow_control::call_tracer_surface_state ( type(surface), intent(inout)  state,
real, dimension(nimem_,njmem_,nkmem_), intent(in)  h,
type(ocean_grid_type), intent(in)  G,
type(tracer_flow_control_cs), pointer  CS 
)

This subroutine calls all registered tracer packages to enable them to add to the surface state returned to the coupler. These routines are optional.

Parameters
[in,out]stateA structure containing fields that describe the surface state of the ocean.
[in]hLayer thicknesses [H ~> m or kg m-2]
[in]gThe ocean's grid structure.
csThe control structure returned by a previous call to call_tracer_register.

Definition at line 751 of file MOM_tracer_flow_control.F90.

751  type(surface), intent(inout) :: state !< A structure containing fields that
752  !! describe the surface state of the ocean.
753  real, dimension(NIMEM_,NJMEM_,NKMEM_), &
754  intent(in) :: h !< Layer thicknesses [H ~> m or kg m-2]
755  type(ocean_grid_type), intent(in) :: G !< The ocean's grid structure.
756  type(tracer_flow_control_CS), pointer :: CS !< The control structure returned by a
757  !! previous call to call_tracer_register.
758 
759  if (.not. associated(cs)) call mom_error(fatal, "call_tracer_surface_state: "// &
760  "Module must be initialized via call_tracer_register before it is used.")
761 
762 ! Add other user-provided calls here.
763  if (cs%use_USER_tracer_example) &
764  call user_tracer_surface_state(state, h, g, cs%USER_tracer_example_CSp)
765  if (cs%use_DOME_tracer) &
766  call dome_tracer_surface_state(state, h, g, cs%DOME_tracer_CSp)
767  if (cs%use_ISOMIP_tracer) &
768  call isomip_tracer_surface_state(state, h, g, cs%ISOMIP_tracer_CSp)
769  if (cs%use_ideal_age) &
770  call ideal_age_tracer_surface_state(state, h, g, cs%ideal_age_tracer_CSp)
771  if (cs%use_regional_dyes) &
772  call dye_tracer_surface_state(state, h, g, cs%dye_tracer_CSp)
773  if (cs%use_oil) &
774  call oil_tracer_surface_state(state, h, g, cs%oil_tracer_CSp)
775  if (cs%use_advection_test_tracer) &
776  call advection_test_tracer_surface_state(state, h, g, cs%advection_test_tracer_CSp)
777  if (cs%use_OCMIP2_CFC) &
778  call ocmip2_cfc_surface_state(state, h, g, cs%OCMIP2_CFC_CSp)
779 #ifdef _USE_GENERIC_TRACER
780  if (cs%use_MOM_generic_tracer) &
781  call mom_generic_tracer_surface_state(state, h, g, cs%MOM_generic_tracer_CSp)
782 #endif
783 

References mom_error_handler::mom_error().

Here is the call graph for this function:

◆ get_chl_from_model()

subroutine, public mom_tracer_flow_control::get_chl_from_model ( real, dimension(nimem_,njmem_,nkmem_), intent(out)  Chl_array,
type(ocean_grid_type), intent(in)  G,
type(tracer_flow_control_cs), pointer  CS 
)

This subroutine extracts the chlorophyll concentrations from the model state, if possible.

Parameters
[out]chl_arrayThe array in which to store the model's
[in]gThe ocean's grid structure.
csThe control structure returned by a previous call to call_tracer_register.

Definition at line 355 of file MOM_tracer_flow_control.F90.

355  real, dimension(NIMEM_,NJMEM_,NKMEM_), &
356  intent(out) :: Chl_array !< The array in which to store the model's
357  !! Chlorophyll-A concentrations in mg m-3.
358  type(ocean_grid_type), intent(in) :: G !< The ocean's grid structure.
359  type(tracer_flow_control_CS), pointer :: CS !< The control structure returned by a
360  !! previous call to call_tracer_register.
361 
362 #ifdef _USE_GENERIC_TRACER
363  if (cs%use_MOM_generic_tracer) then
364  call mom_generic_tracer_get('chl','field',chl_array, cs%MOM_generic_tracer_CSp)
365  else
366  call mom_error(fatal, "get_chl_from_model was called in a configuration "// &
367  "that is unable to provide a sensible model-based value.\n"// &
368  "CS%use_MOM_generic_tracer is false and no other viable options are on.")
369  endif
370 #else
371  call mom_error(fatal, "get_chl_from_model was called in a configuration "// &
372  "that is unable to provide a sensible model-based value.\n"// &
373  "_USE_GENERIC_TRACER is undefined and no other options "//&
374  "are currently viable.")
375 #endif
376 

References mom_error_handler::mom_error().

Referenced by mom_diabatic_aux::set_pen_shortwave().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ store_stocks()

subroutine mom_tracer_flow_control::store_stocks ( character(len=*), intent(in)  pkg_name,
integer, intent(in)  ns,
character(len=*), dimension(:), intent(in)  names,
character(len=*), dimension(:), intent(in)  units,
real, dimension(:), intent(in)  values,
integer, intent(in)  index,
real, dimension(:), intent(inout)  stock_values,
character(len=*), intent(inout)  set_pkg_name,
integer, intent(in)  max_ns,
integer, intent(inout)  ns_tot,
character(len=*), dimension(:), intent(inout), optional  stock_names,
character(len=*), dimension(:), intent(inout), optional  stock_units 
)
private

This routine stores the stocks and does error handling for call_tracer_stocks.

Parameters
[in]pkg_nameThe tracer package name
[in]nsThe number of stocks associated with this tracer package
[in]namesDiagnostic names to use for each stock.
[in]unitsUnits to use in the metadata for each stock.
[in]valuesThe values of the tracer stocks
[in]indexThe integer stock index from stocks_constants_mod of the stock to be returned. If this is present and greater than 0, only a single stock can be returned.
[in,out]stock_valuesThe master list of stock values
[in,out]set_pkg_nameThe name of the last tracer package whose stocks were stored for a specific index. This is used to trigger an error if there are redundant stocks.
[in]max_nsThe maximum size of the master stock list
[in,out]ns_totThe total number of stocks in the master list
[in,out]stock_namesDiagnostic names to use for each stock in the master list
[in,out]stock_unitsUnits to use in the metadata for each stock in the master list

Definition at line 692 of file MOM_tracer_flow_control.F90.

692  character(len=*), intent(in) :: pkg_name !< The tracer package name
693  integer, intent(in) :: ns !< The number of stocks associated with this tracer package
694  character(len=*), dimension(:), &
695  intent(in) :: names !< Diagnostic names to use for each stock.
696  character(len=*), dimension(:), &
697  intent(in) :: units !< Units to use in the metadata for each stock.
698  real, dimension(:), intent(in) :: values !< The values of the tracer stocks
699  integer, intent(in) :: index !< The integer stock index from
700  !! stocks_constants_mod of the stock to be returned. If this is
701  !! present and greater than 0, only a single stock can be returned.
702  real, dimension(:), intent(inout) :: stock_values !< The master list of stock values
703  character(len=*), intent(inout) :: set_pkg_name !< The name of the last tracer package whose
704  !! stocks were stored for a specific index. This is
705  !! used to trigger an error if there are redundant stocks.
706  integer, intent(in) :: max_ns !< The maximum size of the master stock list
707  integer, intent(inout) :: ns_tot !< The total number of stocks in the master list
708  character(len=*), dimension(:), &
709  optional, intent(inout) :: stock_names !< Diagnostic names to use for each stock in the master list
710  character(len=*), dimension(:), &
711  optional, intent(inout) :: stock_units !< Units to use in the metadata for each stock in the master list
712 
713 ! This routine stores the stocks and does error handling for call_tracer_stocks.
714  character(len=16) :: ind_text, ns_text, max_text
715  integer :: n
716 
717  if ((index > 0) .and. (ns > 0)) then
718  write(ind_text,'(i8)') index
719  if (ns > 1) then
720  call mom_error(fatal,"Tracer package "//trim(pkg_name)//&
721  " is not permitted to return more than one value when queried"//&
722  " for specific stock index "//trim(adjustl(ind_text))//".")
723  elseif (ns+ns_tot > 1) then
724  call mom_error(fatal,"Tracer packages "//trim(pkg_name)//" and "//&
725  trim(set_pkg_name)//" both attempted to set values for"//&
726  " specific stock index "//trim(adjustl(ind_text))//".")
727  else
728  set_pkg_name = pkg_name
729  endif
730  endif
731 
732  if (ns_tot+ns > max_ns) then
733  write(ns_text,'(i8)') ns_tot+ns ; write(max_text,'(i8)') max_ns
734  call mom_error(fatal,"Attempted to return more tracer stock values (at least "//&
735  trim(adjustl(ns_text))//") than the size "//trim(adjustl(max_text))//&
736  "of the smallest value, name, or units array.")
737  endif
738 
739  do n=1,ns
740  stock_values(ns_tot+n) = values(n)
741  if (present(stock_names)) stock_names(ns_tot+n) = names(n)
742  if (present(stock_units)) stock_units(ns_tot+n) = units(n)
743  enddo
744  ns_tot = ns_tot + ns
745 

References mom_error_handler::mom_error().

Referenced by call_tracer_stocks().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ tracer_flow_control_end()

subroutine, public mom_tracer_flow_control::tracer_flow_control_end ( type(tracer_flow_control_cs), pointer  CS)
Parameters
csThe control structure returned by a previous call to call_tracer_register.

Definition at line 787 of file MOM_tracer_flow_control.F90.

787  type(tracer_flow_control_CS), pointer :: CS !< The control structure returned by a
788  !! previous call to call_tracer_register.
789 
790  if (cs%use_USER_tracer_example) &
791  call user_tracer_example_end(cs%USER_tracer_example_CSp)
792  if (cs%use_DOME_tracer) call dome_tracer_end(cs%DOME_tracer_CSp)
793  if (cs%use_ISOMIP_tracer) call isomip_tracer_end(cs%ISOMIP_tracer_CSp)
794  if (cs%use_RGC_tracer) call rgc_tracer_end(cs%RGC_tracer_CSp)
795  if (cs%use_ideal_age) call ideal_age_example_end(cs%ideal_age_tracer_CSp)
796  if (cs%use_regional_dyes) call regional_dyes_end(cs%dye_tracer_CSp)
797  if (cs%use_oil) call oil_tracer_end(cs%oil_tracer_CSp)
798  if (cs%use_advection_test_tracer) call advection_test_tracer_end(cs%advection_test_tracer_CSp)
799  if (cs%use_OCMIP2_CFC) call ocmip2_cfc_end(cs%OCMIP2_CFC_CSp)
800 #ifdef _USE_GENERIC_TRACER
801  if (cs%use_MOM_generic_tracer) call end_mom_generic_tracer(cs%MOM_generic_tracer_CSp)
802 #endif
803  if (cs%use_pseudo_salt_tracer) call pseudo_salt_tracer_end(cs%pseudo_salt_tracer_CSp)
804  if (cs%use_boundary_impulse_tracer) call boundary_impulse_tracer_end(cs%boundary_impulse_tracer_CSp)
805  if (cs%use_dyed_obc_tracer) call dyed_obc_tracer_end(cs%dyed_obc_tracer_CSp)
806 
807  if (associated(cs)) deallocate(cs)

Referenced by mom::mom_end().

Here is the caller graph for this function:

◆ tracer_flow_control_init()

subroutine, public mom_tracer_flow_control::tracer_flow_control_init ( logical, intent(in)  restart,
type(time_type), intent(in), target  day,
type(ocean_grid_type), intent(inout)  G,
type(verticalgrid_type), intent(in)  GV,
type(unit_scale_type), intent(in)  US,
real, dimension(nimem_,njmem_,nkmem_), intent(in)  h,
type(param_file_type), intent(in)  param_file,
type(diag_ctrl), intent(in), target  diag,
type(ocean_obc_type), pointer  OBC,
type(tracer_flow_control_cs), pointer  CS,
type(sponge_cs), pointer  sponge_CSp,
type(ale_sponge_cs), pointer  ALE_sponge_CSp,
type(thermo_var_ptrs), intent(in)  tv 
)

This subroutine calls all registered tracer initialization subroutines.

Parameters
[in]restart1 if the fields have already been read from a restart file.
[in]dayTime of the start of the run.
[in,out]gThe ocean's grid structure.
[in]gvThe ocean's vertical grid structure.
[in]usA dimensional unit scaling type
[in]hLayer thicknesses [H ~> m or kg m-2]
[in]param_fileA structure to parse for run-time parameters
[in]diagA structure that is used to regulate diagnostic output.
obcThis open boundary condition type specifies whether, where, and what open boundary conditions are used.
csThe control structure returned by a previous call to call_tracer_register.
sponge_cspA pointer to the control structure for the sponges, if they are in use. Otherwise this may be unassociated.
ale_sponge_cspA pointer to the control structure for the ALE sponges, if they are in use. Otherwise this may be unassociated.
[in]tvA structure pointing to various thermodynamic variables

Definition at line 278 of file MOM_tracer_flow_control.F90.

278  logical, intent(in) :: restart !< 1 if the fields have already
279  !! been read from a restart file.
280  type(time_type), target, intent(in) :: day !< Time of the start of the run.
281  type(ocean_grid_type), intent(inout) :: G !< The ocean's grid structure.
282  type(verticalGrid_type), intent(in) :: GV !< The ocean's vertical grid
283  !! structure.
284  type(unit_scale_type), intent(in) :: US !< A dimensional unit scaling type
285  real, dimension(NIMEM_,NJMEM_,NKMEM_), intent(in) :: h !< Layer thicknesses [H ~> m or kg m-2]
286  type(param_file_type), intent(in) :: param_file !< A structure to parse for
287  !! run-time parameters
288  type(diag_ctrl), target, intent(in) :: diag !< A structure that is used to
289  !! regulate diagnostic output.
290  type(ocean_OBC_type), pointer :: OBC !< This open boundary condition
291  !! type specifies whether, where,
292  !! and what open boundary
293  !! conditions are used.
294  type(tracer_flow_control_CS), pointer :: CS !< The control structure returned
295  !! by a previous call to
296  !! call_tracer_register.
297  type(sponge_CS), pointer :: sponge_CSp !< A pointer to the control
298  !! structure for the sponges, if they are in use.
299  !! Otherwise this may be unassociated.
300  type(ALE_sponge_CS), pointer :: ALE_sponge_CSp !< A pointer to the control
301  !! structure for the ALE sponges, if they are in use.
302  !! Otherwise this may be unassociated.
303  type(thermo_var_ptrs), intent(in) :: tv !< A structure pointing to various
304  !! thermodynamic variables
305 
306  if (.not. associated(cs)) call mom_error(fatal, "tracer_flow_control_init: "// &
307  "Module must be initialized via call_tracer_register before it is used.")
308 
309 ! Add other user-provided calls here.
310  if (cs%use_USER_tracer_example) &
311  call user_initialize_tracer(restart, day, g, gv, h, diag, obc, cs%USER_tracer_example_CSp, &
312  sponge_csp)
313  if (cs%use_DOME_tracer) &
314  call initialize_dome_tracer(restart, day, g, gv, us, h, diag, obc, cs%DOME_tracer_CSp, &
315  sponge_csp, param_file)
316  if (cs%use_ISOMIP_tracer) &
317  call initialize_isomip_tracer(restart, day, g, gv, h, diag, obc, cs%ISOMIP_tracer_CSp, &
318  ale_sponge_csp)
319  if (cs%use_RGC_tracer) &
320  call initialize_rgc_tracer(restart, day, g, gv, h, diag, obc, &
321  cs%RGC_tracer_CSp, sponge_csp, ale_sponge_csp)
322  if (cs%use_ideal_age) &
323  call initialize_ideal_age_tracer(restart, day, g, gv, us, h, diag, obc, cs%ideal_age_tracer_CSp, &
324  sponge_csp)
325  if (cs%use_regional_dyes) &
326  call initialize_dye_tracer(restart, day, g, gv, h, diag, obc, cs%dye_tracer_CSp, &
327  sponge_csp)
328  if (cs%use_oil) &
329  call initialize_oil_tracer(restart, day, g, gv, us, h, diag, obc, cs%oil_tracer_CSp, &
330  sponge_csp)
331  if (cs%use_advection_test_tracer) &
332  call initialize_advection_test_tracer(restart, day, g, gv, h, diag, obc, cs%advection_test_tracer_CSp, &
333  sponge_csp)
334  if (cs%use_OCMIP2_CFC) &
335  call initialize_ocmip2_cfc(restart, day, g, gv, us, h, diag, obc, cs%OCMIP2_CFC_CSp, &
336  sponge_csp)
337 #ifdef _USE_GENERIC_TRACER
338  if (cs%use_MOM_generic_tracer) &
339  call initialize_mom_generic_tracer(restart, day, g, gv, us, h, param_file, diag, obc, &
340  cs%MOM_generic_tracer_CSp, sponge_csp, ale_sponge_csp)
341 #endif
342  if (cs%use_pseudo_salt_tracer) &
343  call initialize_pseudo_salt_tracer(restart, day, g, gv, h, diag, obc, cs%pseudo_salt_tracer_CSp, &
344  sponge_csp, tv)
345  if (cs%use_boundary_impulse_tracer) &
346  call initialize_boundary_impulse_tracer(restart, day, g, gv, h, diag, obc, cs%boundary_impulse_tracer_CSp, &
347  sponge_csp, tv)
348  if (cs%use_dyed_obc_tracer) &
349  call initialize_dyed_obc_tracer(restart, day, g, gv, h, diag, obc, cs%dyed_obc_tracer_CSp)
350 

References mom_error_handler::mom_error().

Here is the call graph for this function: