MOM6
mom_tracer_registry Module Reference

Detailed Description

This module contains the tracer_registry_type and the subroutines that handle registration of tracers and related subroutines. The primary subroutine, register_tracer, is called to indicate the tracers advected and diffused.

Data Types

type  tracer_registry_type
 Type to carry basic tracer information. More...
 
type  tracer_type
 The tracer type. More...
 

Functions/Subroutines

subroutine, public register_tracer (tr1, tr_desc, param_file, HI, GV, Reg, tr_desc_ptr, ad_x, ad_y, df_x, df_y, OBC_inflow, OBC_in_u, OBC_in_v, ad_2d_x, ad_2d_y, df_2d_x, df_2d_y, advection_xy)
 This subroutine registers a tracer to be advected and laterally diffused. More...
 
subroutine, public lock_tracer_registry (Reg)
 This subroutine locks the tracer registry to prevent the addition of more tracers. After locked=.true., can then register common diagnostics. More...
 
subroutine, public add_tracer_obc_values (name, Reg, OBC_inflow, OBC_in_u, OBC_in_v)
 This subroutine adds open boundary condition concentrations for a tracer that has previously been registered by a call to register_tracer. More...
 
subroutine, public add_tracer_diagnostics (name, Reg, ad_x, ad_y, df_x, df_y, ad_2d_x, ad_2d_y, df_2d_x, df_2d_y, advection_xy)
 This subroutine adds diagnostic arrays for a tracer that has previously been registered by a call to register_tracer. More...
 
subroutine, public mom_tracer_chksum (mesg, Tr, ntr, G)
 This subroutine writes out chksums for tracers. More...
 
subroutine, public mom_tracer_chkinv (mesg, G, h, Tr, ntr)
 Calculates and prints the global inventory of all tracers in the registry. More...
 
subroutine, public tracer_registry_init (param_file, Reg)
 This routine include declares and sets the variable "version". More...
 
subroutine, public tracer_registry_end (Reg)
 This routine closes the tracer registry module. More...
 

Function/Subroutine Documentation

◆ add_tracer_diagnostics()

subroutine, public mom_tracer_registry::add_tracer_diagnostics ( character(len=*), intent(in)  name,
type(tracer_registry_type), pointer  Reg,
real, dimension(:,:,:), optional, pointer  ad_x,
real, dimension(:,:,:), optional, pointer  ad_y,
real, dimension(:,:,:), optional, pointer  df_x,
real, dimension(:,:,:), optional, pointer  df_y,
real, dimension(:,:), optional, pointer  ad_2d_x,
real, dimension(:,:), optional, pointer  ad_2d_y,
real, dimension(:,:), optional, pointer  df_2d_x,
real, dimension(:,:), optional, pointer  df_2d_y,
real, dimension(:,:,:), optional, pointer  advection_xy 
)

This subroutine adds diagnostic arrays for a tracer that has previously been registered by a call to register_tracer.

Parameters
[in]namename of the tracer for which the diagnostic points
regpointer to the tracer registry
ad_xdiagnostic x-advective flux (CONC m3/s or CONC*kg/s)
ad_ydiagnostic y-advective flux (CONC m3/s or CONC*kg/s)
df_xdiagnostic x-diffusive flux (CONC m3/s or CONC*kg/s)
df_ydiagnostic y-diffusive flux (CONC m3/s or CONC*kg/s)
ad_2d_xvert sum of diagnostic x-advect flux (CONC m3/s or CONC*kg/s)
ad_2d_yvert sum of diagnostic y-advect flux (CONC m3/s or CONC*kg/s)
df_2d_xvert sum of diagnostic x-diffuse flux (CONC m3/s or CONC*kg/s)
df_2d_yvert sum of diagnostic y-diffuse flux (CONC m3/s or CONC*kg/s)
advection_xyconvergence of lateral advective tracer fluxes

Definition at line 210 of file MOM_tracer_registry.F90.

References mom_error_handler::mom_error().

Referenced by advection_test_tracer::initialize_advection_test_tracer(), boundary_impulse_tracer::initialize_boundary_impulse_tracer(), dome_tracer::initialize_dome_tracer(), regional_dyes::initialize_dye_tracer(), ideal_age_example::initialize_ideal_age_tracer(), isomip_tracer::initialize_isomip_tracer(), mom_ocmip2_cfc::initialize_ocmip2_cfc(), oil_tracer::initialize_oil_tracer(), pseudo_salt_tracer::initialize_pseudo_salt_tracer(), and user_tracer_example::user_initialize_tracer().

210  character(len=*), intent(in) :: name !< name of the tracer for which the diagnostic points
211  type(tracer_registry_type), pointer :: reg !< pointer to the tracer registry
212  real, dimension(:,:,:), pointer, optional :: ad_x !< diagnostic x-advective flux (CONC m3/s or CONC*kg/s)
213  real, dimension(:,:,:), pointer, optional :: ad_y !< diagnostic y-advective flux (CONC m3/s or CONC*kg/s)
214  real, dimension(:,:,:), pointer, optional :: df_x !< diagnostic x-diffusive flux (CONC m3/s or CONC*kg/s)
215  real, dimension(:,:,:), pointer, optional :: df_y !< diagnostic y-diffusive flux (CONC m3/s or CONC*kg/s)
216  real, dimension(:,:), pointer, optional :: ad_2d_x !< vert sum of diagnostic x-advect flux (CONC m3/s or CONC*kg/s)
217  real, dimension(:,:), pointer, optional :: ad_2d_y !< vert sum of diagnostic y-advect flux (CONC m3/s or CONC*kg/s)
218  real, dimension(:,:), pointer, optional :: df_2d_x !< vert sum of diagnostic x-diffuse flux (CONC m3/s or CONC*kg/s)
219  real, dimension(:,:), pointer, optional :: df_2d_y !< vert sum of diagnostic y-diffuse flux (CONC m3/s or CONC*kg/s)
220 
221  real, dimension(:,:,:), pointer, optional :: advection_xy !< convergence of lateral advective tracer fluxes
222 
223  integer :: m
224 
225  if (.not. associated(reg)) call mom_error(fatal, "add_tracer_diagnostics: "// &
226  "register_tracer must be called before add_tracer_diagnostics")
227 
228  do m=1,reg%ntr ; if (reg%Tr(m)%name == trim(name)) exit ; enddo
229 
230  if (m <= reg%ntr) then
231  if (present(ad_x)) then ; if (associated(ad_x)) reg%Tr(m)%ad_x => ad_x ; endif
232  if (present(ad_y)) then ; if (associated(ad_y)) reg%Tr(m)%ad_y => ad_y ; endif
233  if (present(df_x)) then ; if (associated(df_x)) reg%Tr(m)%df_x => df_x ; endif
234  if (present(df_y)) then ; if (associated(df_y)) reg%Tr(m)%df_y => df_y ; endif
235 
236  if (present(ad_2d_x)) then ; if (associated(ad_2d_x)) reg%Tr(m)%ad2d_x => ad_2d_x ; endif
237  if (present(ad_2d_y)) then ; if (associated(ad_2d_y)) reg%Tr(m)%ad2d_y => ad_2d_y ; endif
238  if (present(df_2d_x)) then ; if (associated(df_2d_x)) reg%Tr(m)%df2d_x => df_2d_x ; endif
239  if (present(df_2d_y)) then ; if (associated(df_2d_y)) reg%Tr(m)%df2d_y => df_2d_y ; endif
240 
241  if (present(advection_xy)) then ; if (associated(advection_xy)) reg%Tr(m)%advection_xy => advection_xy ; endif
242 
243  else
244 
245  call mom_error(fatal, "MOM_tracer: register_tracer must be called for "//&
246  trim(name)//" before add_tracer_diagnostics is called for it.")
247  endif
248 
Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_tracer_obc_values()

subroutine, public mom_tracer_registry::add_tracer_obc_values ( character(len=*), intent(in)  name,
type(tracer_registry_type), pointer  Reg,
real, intent(in), optional  OBC_inflow,
real, dimension(:,:,:), optional, pointer  OBC_in_u,
real, dimension(:,:,:), optional, pointer  OBC_in_v 
)

This subroutine adds open boundary condition concentrations for a tracer that has previously been registered by a call to register_tracer.

Parameters
[in]nametracer name for which the diagnostic points
regpointer to the tracer registry
[in]obc_inflowtracer value for all inflows via the OBC for which OBC_in_u or OBC_in_v are not specified (same units as tracer CONC)
obc_in_utracer at inflows through u-face of tracer cells (same units as tracer CONC)
obc_in_vtracer at inflows through v-face of tracer cells (same units as tracer CONC)

Definition at line 174 of file MOM_tracer_registry.F90.

References mom_error_handler::mom_error().

Referenced by dome_initialization::dome_set_obc_data(), dome_tracer::initialize_dome_tracer(), and user_tracer_example::user_initialize_tracer().

174  character(len=*), intent(in) :: name !< tracer name for which the diagnostic points
175  type(tracer_registry_type), pointer :: reg !< pointer to the tracer registry
176  real, intent(in), optional :: obc_inflow !< tracer value for all inflows via the OBC
177  !! for which OBC_in_u or OBC_in_v are
178  !! not specified (same units as tracer CONC)
179  real, pointer, dimension(:,:,:), optional :: obc_in_u !< tracer at inflows through u-face of tracer cells
180  !! (same units as tracer CONC)
181  real, pointer, dimension(:,:,:), optional :: obc_in_v !< tracer at inflows through v-face of tracer cells
182  !! (same units as tracer CONC)
183 
184  integer :: m
185 
186  if (.not. associated(reg)) call mom_error(fatal, "add_tracer_OBC_values :"// &
187  "register_tracer must be called before add_tracer_OBC_values")
188 
189  do m=1,reg%ntr ; if (reg%Tr(m)%name == trim(name)) exit ; enddo
190 
191  if (m <= reg%ntr) then
192  if (present(obc_inflow)) reg%Tr(m)%OBC_inflow_conc = obc_inflow
193  if (present(obc_in_u)) then ; if (associated(obc_in_u)) &
194  reg%Tr(m)%OBC_in_u => obc_in_u ; endif
195  if (present(obc_in_v)) then ; if (associated(obc_in_v)) &
196  reg%Tr(m)%OBC_in_v => obc_in_v ; endif
197  else
198  call mom_error(fatal, "MOM_tracer: register_tracer must be called for "//&
199  trim(name)//" before add_tracer_OBC_values is called for it.")
200  endif
201 
Here is the call graph for this function:
Here is the caller graph for this function:

◆ lock_tracer_registry()

subroutine, public mom_tracer_registry::lock_tracer_registry ( type(tracer_registry_type), pointer  Reg)

This subroutine locks the tracer registry to prevent the addition of more tracers. After locked=.true., can then register common diagnostics.

Parameters
regpointer to the tracer registry

Definition at line 161 of file MOM_tracer_registry.F90.

References mom_error_handler::mom_error().

Referenced by mom::initialize_mom().

161  type(tracer_registry_type), pointer :: reg !< pointer to the tracer registry
162 
163  if (.not. associated(reg)) call mom_error(warning, &
164  "lock_tracer_registry called with an unassocaited registry.")
165 
166  reg%locked = .true.
167 
Here is the call graph for this function:
Here is the caller graph for this function:

◆ mom_tracer_chkinv()

subroutine, public mom_tracer_registry::mom_tracer_chkinv ( character(len=*), intent(in)  mesg,
type(ocean_grid_type), intent(in)  G,
real, dimension( g %isd: g %ied, g %jsd: g %jed, g %ke), intent(in)  h,
type(tracer_type), dimension(:), intent(in)  Tr,
integer, intent(in)  ntr 
)

Calculates and prints the global inventory of all tracers in the registry.

Parameters
[in]mesgmessage that appears on the chksum lines
[in]gocean grid structure
[in]trarray of all of registered tracers
[in]hLayer thicknesses
[in]ntrnumber of registered tracers

Definition at line 270 of file MOM_tracer_registry.F90.

References mom_error_handler::is_root_pe().

Referenced by mom_ale::ale_offline_inputs(), mom_offline_main::offline_advection_ale(), and mom_offline_main::offline_redistribute_residual().

270  character(len=*), intent(in) :: mesg !< message that appears on the chksum lines
271  type(ocean_grid_type), intent(in) :: g !< ocean grid structure
272  type(tracer_type), intent(in) :: tr(:) !< array of all of registered tracers
273  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), intent(in) :: h !< Layer thicknesses
274  integer, intent(in) :: ntr !< number of registered tracers
275 
276  real, dimension(SZI_(G),SZJ_(G),SZK_(G)) :: tr_inv !< Tracer inventory
277  real :: total_inv
278  integer :: is, ie, js, je, nz
279  integer :: i, j, k, m
280 
281  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
282  do m=1,ntr
283  do k=1,nz ; do j=js,je ; do i=is,ie
284  tr_inv(i,j,k) = tr(m)%t(i,j,k)*h(i,j,k)*g%areaT(i,j)*g%mask2dT(i,j)
285  enddo ; enddo ; enddo
286  total_inv = reproducing_sum(tr_inv, is, ie, js, je)
287  if (is_root_pe()) write(0,'(A,1X,A5,1X,ES25.16,1X,A)') "h-point: inventory", tr(m)%name, total_inv, mesg
288  enddo
289 
Ocean grid type. See mom_grid for details.
Definition: MOM_grid.F90:19
Here is the call graph for this function:
Here is the caller graph for this function:

◆ mom_tracer_chksum()

subroutine, public mom_tracer_registry::mom_tracer_chksum ( character(len=*), intent(in)  mesg,
type(tracer_type), dimension(:), intent(in)  Tr,
integer, intent(in)  ntr,
type(ocean_grid_type), intent(in)  G 
)

This subroutine writes out chksums for tracers.

Parameters
[in]mesgmessage that appears on the chksum lines
[in]trarray of all of registered tracers
[in]ntrnumber of registered tracers
[in]gocean grid structure

Definition at line 253 of file MOM_tracer_registry.F90.

Referenced by mom_offline_main::offline_redistribute_residual(), and mom_tracer_hor_diff::tracer_hordiff().

253  character(len=*), intent(in) :: mesg !< message that appears on the chksum lines
254  type(tracer_type), intent(in) :: tr(:) !< array of all of registered tracers
255  integer, intent(in) :: ntr !< number of registered tracers
256  type(ocean_grid_type), intent(in) :: g !< ocean grid structure
257 
258  integer :: is, ie, js, je, nz
259  integer :: i, j, k, m
260 
261  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
262  do m=1,ntr
263  call hchksum(tr(m)%t, mesg//trim(tr(m)%name), g%HI)
264  enddo
265 
Ocean grid type. See mom_grid for details.
Definition: MOM_grid.F90:19
Here is the caller graph for this function:

◆ register_tracer()

subroutine, public mom_tracer_registry::register_tracer ( real, dimension( hi %isd: hi %ied, hi %jsd: hi %jed, gv %ke), target  tr1,
type(vardesc), intent(in)  tr_desc,
type(param_file_type), intent(in)  param_file,
type(hor_index_type), intent(in)  HI,
type(verticalgrid_type), intent(in)  GV,
type(tracer_registry_type), pointer  Reg,
type(vardesc), optional, target  tr_desc_ptr,
real, dimension(:,:,:), optional, pointer  ad_x,
real, dimension(:,:,:), optional, pointer  ad_y,
real, dimension(:,:,:), optional, pointer  df_x,
real, dimension(:,:,:), optional, pointer  df_y,
real, intent(in), optional  OBC_inflow,
real, dimension(:,:,:), optional, pointer  OBC_in_u,
real, dimension(:,:,:), optional, pointer  OBC_in_v,
real, dimension(:,:), optional, pointer  ad_2d_x,
real, dimension(:,:), optional, pointer  ad_2d_y,
real, dimension(:,:), optional, pointer  df_2d_x,
real, dimension(:,:), optional, pointer  df_2d_y,
real, dimension(:,:,:), optional, pointer  advection_xy 
)

This subroutine registers a tracer to be advected and laterally diffused.

Parameters
[in]hihorizontal index type
[in]gvocean vertical grid structure
tr1pointer to the tracer (concentration units)
[in]tr_descmetadata about the tracer
[in]param_filefile to parse for model parameter values
regpointer to the tracer registry
tr_desc_ptrA target that can be used to set a pointer to the stored value of trtr_desc. This target must be an enduring part of the control structure, because the tracer registry will use this memory, but it also means that any updates to this structure in the calling module will be available subsequently to the tracer registry.
ad_xdiagnostic x-advective flux (CONC m3/s or CONC*kg/s)
ad_ydiagnostic y-advective flux (CONC m3/s or CONC*kg/s)
df_xdiagnostic x-diffusive flux (CONC m3/s or CONC*kg/s)
df_ydiagnostic y-diffusive flux (CONC m3/s or CONC*kg/s)
[in]obc_inflowthe tracer for all inflows via OBC for which OBC_in_u or OBC_in_v are not specified (units of tracer CONC)
obc_in_utracer at inflows through u-faces of tracer cells (units of tracer CONC)
obc_in_vtracer at inflows through v-faces of tracer cells (units of tracer CONC)
ad_2d_xvert sum of diagnostic x-advect flux (CONC m3/s or CONC*kg/s)
ad_2d_yvert sum of diagnostic y-advect flux (CONC m3/s or CONC*kg/s)
df_2d_xvert sum of diagnostic x-diffuse flux (CONC m3/s or CONC*kg/s)
df_2d_yvert sum of diagnostic y-diffuse flux (CONC m3/s or CONC*kg/s)
advection_xyconvergence of lateral advective tracer fluxes

Definition at line 81 of file MOM_tracer_registry.F90.

References mom_error_handler::mom_error(), mom_io::query_vardesc(), and tracer_registry_init().

81  type(hor_index_type), intent(in) :: hi !< horizontal index type
82  type(verticalgrid_type), intent(in) :: gv !< ocean vertical grid structure
83  real, dimension(SZI_(HI),SZJ_(HI),SZK_(GV)), target :: tr1 !< pointer to the tracer (concentration units)
84  type(vardesc), intent(in) :: tr_desc !< metadata about the tracer
85  type(param_file_type), intent(in) :: param_file !< file to parse for model parameter values
86  type(tracer_registry_type), pointer :: reg !< pointer to the tracer registry
87  type(vardesc), target, optional :: tr_desc_ptr !< A target that can be used to set a pointer to the
88  !! stored value of tr%tr_desc. This target must be an
89  !! enduring part of the control structure, because the tracer
90  !! registry will use this memory, but it also means that any
91  !! updates to this structure in the calling module will be
92  !! available subsequently to the tracer registry.
93  real, pointer, dimension(:,:,:), optional :: ad_x !< diagnostic x-advective flux (CONC m3/s or CONC*kg/s)
94  real, pointer, dimension(:,:,:), optional :: ad_y !< diagnostic y-advective flux (CONC m3/s or CONC*kg/s)
95  real, pointer, dimension(:,:,:), optional :: df_x !< diagnostic x-diffusive flux (CONC m3/s or CONC*kg/s)
96  real, pointer, dimension(:,:,:), optional :: df_y !< diagnostic y-diffusive flux (CONC m3/s or CONC*kg/s)
97 
98  real, intent(in), optional :: obc_inflow !< the tracer for all inflows via OBC for which OBC_in_u
99  !! or OBC_in_v are not specified (units of tracer CONC)
100  real, pointer, dimension(:,:,:), optional :: obc_in_u !< tracer at inflows through u-faces of
101  !! tracer cells (units of tracer CONC)
102  real, pointer, dimension(:,:,:), optional :: obc_in_v !< tracer at inflows through v-faces of
103  !! tracer cells (units of tracer CONC)
104 
105  real, dimension(:,:), pointer, optional :: ad_2d_x !< vert sum of diagnostic x-advect flux (CONC m3/s or CONC*kg/s)
106  real, dimension(:,:), pointer, optional :: ad_2d_y !< vert sum of diagnostic y-advect flux (CONC m3/s or CONC*kg/s)
107  real, dimension(:,:), pointer, optional :: df_2d_x !< vert sum of diagnostic x-diffuse flux (CONC m3/s or CONC*kg/s)
108  real, dimension(:,:), pointer, optional :: df_2d_y !< vert sum of diagnostic y-diffuse flux (CONC m3/s or CONC*kg/s)
109 
110  real, pointer, dimension(:,:,:), optional :: advection_xy !< convergence of lateral advective tracer fluxes
111 
112  integer :: ntr
113  type(tracer_type) :: temp
114  character(len=256) :: mesg ! Message for error messages.
115 
116  if (.not. associated(reg)) call tracer_registry_init(param_file, reg)
117 
118  if (reg%ntr>=max_fields_) then
119  write(mesg,'("Increase MAX_FIELDS_ in MOM_memory.h to at least ",I3," to allow for &
120  &all the tracers being registered via register_tracer.")') reg%ntr+1
121  call mom_error(fatal,"MOM register_tracer: "//mesg)
122  endif
123  reg%ntr = reg%ntr + 1
124  ntr = reg%ntr
125 
126  if (present(tr_desc_ptr)) then
127  reg%Tr(ntr)%vd => tr_desc_ptr
128  else
129  allocate(reg%Tr(ntr)%vd) ; reg%Tr(ntr)%vd = tr_desc
130  endif
131 
132  call query_vardesc(reg%Tr(ntr)%vd, name=reg%Tr(ntr)%name)
133 
134  if (reg%locked) call mom_error(fatal, &
135  "MOM register_tracer was called for variable "//trim(reg%Tr(ntr)%name)//&
136  " with a locked tracer registry.")
137 
138  reg%Tr(ntr)%t => tr1
139 
140  if (present(ad_x)) then ; if (associated(ad_x)) reg%Tr(ntr)%ad_x => ad_x ; endif
141  if (present(ad_y)) then ; if (associated(ad_y)) reg%Tr(ntr)%ad_y => ad_y ; endif
142  if (present(df_x)) then ; if (associated(df_x)) reg%Tr(ntr)%df_x => df_x ; endif
143  if (present(df_y)) then ; if (associated(df_y)) reg%Tr(ntr)%df_y => df_y ; endif
144  if (present(obc_inflow)) reg%Tr(ntr)%OBC_inflow_conc = obc_inflow
145  if (present(obc_in_u)) then ; if (associated(obc_in_u)) &
146  reg%Tr(ntr)%OBC_in_u => obc_in_u ; endif
147  if (present(obc_in_v)) then ; if (associated(obc_in_v)) &
148  reg%Tr(ntr)%OBC_in_v => obc_in_v ; endif
149  if (present(ad_2d_x)) then ; if (associated(ad_2d_x)) reg%Tr(ntr)%ad2d_x => ad_2d_x ; endif
150  if (present(ad_2d_y)) then ; if (associated(ad_2d_y)) reg%Tr(ntr)%ad2d_y => ad_2d_y ; endif
151  if (present(df_2d_x)) then ; if (associated(df_2d_x)) reg%Tr(ntr)%df2d_x => df_2d_x ; endif
152 
153  if (present(advection_xy)) then ; if (associated(advection_xy)) reg%Tr(ntr)%advection_xy => advection_xy ; endif
154 
Here is the call graph for this function:

◆ tracer_registry_end()

subroutine, public mom_tracer_registry::tracer_registry_end ( type(tracer_registry_type), pointer  Reg)

This routine closes the tracer registry module.

Definition at line 321 of file MOM_tracer_registry.F90.

321  type(tracer_registry_type), pointer :: reg
322  if (associated(reg)) deallocate(reg)

◆ tracer_registry_init()

subroutine, public mom_tracer_registry::tracer_registry_init ( type(param_file_type), intent(in)  param_file,
type(tracer_registry_type), pointer  Reg 
)

This routine include declares and sets the variable "version".

Parameters
[in]param_fileopen file to parse for model parameters
regpointer to tracer registry

Definition at line 294 of file MOM_tracer_registry.F90.

References mom_error_handler::is_root_pe(), and mom_error_handler::mom_error().

Referenced by register_tracer().

294  type(param_file_type), intent(in) :: param_file !< open file to parse for model parameters
295  type(tracer_registry_type), pointer :: reg !< pointer to tracer registry
296 
297  integer, save :: init_calls = 0
298 
299 #include "version_variable.h"
300  character(len=40) :: mdl = "MOM_tracer_registry" ! This module's name.
301  character(len=256) :: mesg ! Message for error messages.
302 
303  if (.not.associated(reg)) then ; allocate(reg)
304  else ; return ; endif
305 
306  ! Read all relevant parameters and write them to the model log.
307  call log_version(param_file, mdl, version, "")
308 
309  init_calls = init_calls + 1
310  if (init_calls > 1) then
311  write(mesg,'("tracer_registry_init called ",I3, &
312  &" times with different registry pointers.")') init_calls
313  if (is_root_pe()) call mom_error(warning,"MOM_tracer"//mesg)
314  endif
315 
Here is the call graph for this function:
Here is the caller graph for this function: