MOM6
boundary_impulse_tracer Module Reference

Detailed Description

Implements a boundary impulse response tracer to calculate Green's functions.

Boundary Impulse Response Tracer and Transit Time Distributions

Transit time distributions (TTD) are the Green's function solution of the passive tracer equation between the oceanic surface and interior. The name derives from the idea that the 'age' (e.g. time since last contact with the atmosphere) of a water parcel is best characterized as a distribution of ages because water parcels leaving the surface arrive at a particular interior point at different times. The more commonly used ideal age tracer is the first moment of the TTD, equivalently referred to as the mean age.

A boundary impulse response (BIR) is a passive tracer whose surface boundary condition is a rectangle function with width \(\Delta t\). In the case of unsteady flow, multiple BIRs, initiated at different times in the model can be used to infer the transit time distribution or Green's function between the oceanic surface and interior. In the case of steady or cyclostationary flow, a single BIR is sufficient.

In the References section, both the theoretical discussion of TTDs and BIRs are listed along with modeling studies which have this used framework in scientific investigations

Run-time parameters

-DO_BOUNDARY_IMPULSE_TRACER: Enables the boundary impulse tracer model -IMPULSE_SOURCE_TIME: Length of time that the surface layer acts as a source of the BIR tracer

References

and BIR Theory

-Holzer, M., and T.M. Hall, 2000: Transit-time and tracer-age distributions in geophysical flows. J. Atmos. Sci., 57, 3539-3558, doi:10.1175/1520-0469(2000)057<3539:TTATAD>2.0.CO;2. -T.W.N. Haine, H. Zhang, D.W. Waugh, M. Holzer, On transit-time distributions in unsteady circulation models, Ocean Modelling, Volume 21, Issues 1–2, 2008, Pages 35-45, ISSN 1463-5003 http://dx.doi.org/10.1016/j.ocemod.2007.11.004.

Modelling applications

-Peacock, S., and M. Maltrud (2006), Transit-time distributions in a global ocean model, J. Phys. Oceanogr., 36(3), 474–495, doi:10.1175/JPO2860.1. -Maltrud, M., Bryan, F. & Peacock, Boundary impulse response functions in a century-long eddying global ocean simulation, S. Environ Fluid Mech (2010) 10: 275. doi:10.1007/s10652-009-9154-3

Data Types

type  boundary_impulse_tracer_cs
 The control structure for the boundary impulse tracer package. More...
 

Functions/Subroutines

logical function, public register_boundary_impulse_tracer (HI, GV, param_file, CS, tr_Reg, restart_CS)
 Read in runtime options and add boundary impulse tracer to tracer registry. More...
 
subroutine, public initialize_boundary_impulse_tracer (restart, day, G, GV, h, diag, OBC, CS, sponge_CSp, tv)
 Initialize tracer from restart or set to 1 at surface to initialize. More...
 
subroutine, public boundary_impulse_tracer_column_physics (h_old, h_new, ea, eb, fluxes, dt, G, GV, CS, tv, debug, evap_CFL_limit, minimum_forcing_depth)
 Apply source or sink at boundary and do vertical diffusion. More...
 
integer function, public boundary_impulse_stock (h, stocks, G, GV, CS, names, units, stock_index)
 Calculate total inventory of tracer. More...
 
subroutine, public boundary_impulse_tracer_surface_state (state, h, G, CS)
 This subroutine extracts the surface fields from this tracer package that are to be shared with the atmosphere in coupled configurations. This particular tracer package does not report anything back to the coupler. More...
 
subroutine, public boundary_impulse_tracer_end (CS)
 Performs finalization of boundary impulse tracer. More...
 

Variables

integer, parameter ntr_max = 1
 NTR_MAX is the maximum number of tracers in this module.
 

Function/Subroutine Documentation

◆ boundary_impulse_stock()

integer function, public boundary_impulse_tracer::boundary_impulse_stock ( real, dimension(szi_(g),szj_(g),szk_(g)), intent(in)  h,
real, dimension(:), intent(out)  stocks,
type(ocean_grid_type), intent(in)  G,
type(verticalgrid_type), intent(in)  GV,
type(boundary_impulse_tracer_cs), pointer  CS,
character(len=*), dimension(:), intent(out)  names,
character(len=*), dimension(:), intent(out)  units,
integer, intent(in), optional  stock_index 
)

Calculate total inventory of tracer.

Parameters
[in]gThe ocean's grid structure
[in]gvThe ocean's vertical grid structure
[in]hLayer thicknesses [H ~> m or kg m-2]
[out]stocksthe mass-weighted integrated amount of each tracer, in kg times concentration units [kg conc].
csThe control structure returned by a previous call to register_boundary_impulse_tracer.
[out]namesThe names of the stocks calculated.
[out]unitsThe units of the stocks calculated.
[in]stock_indexThe coded index of a specific stock being sought.
Returns
Return value: the number of stocks calculated here.

Definition at line 285 of file boundary_impulse_tracer.F90.

285  type(ocean_grid_type), intent(in ) :: G !< The ocean's grid structure
286  type(verticalGrid_type), intent(in ) :: GV !< The ocean's vertical grid structure
287  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), intent(in ) :: h !< Layer thicknesses [H ~> m or kg m-2]
288  real, dimension(:), intent( out) :: stocks !< the mass-weighted integrated amount of each
289  !! tracer, in kg times concentration units [kg conc].
290  type(boundary_impulse_tracer_CS), pointer :: CS !< The control structure returned by a previous
291  !! call to register_boundary_impulse_tracer.
292  character(len=*), dimension(:), intent( out) :: names !< The names of the stocks calculated.
293  character(len=*), dimension(:), intent( out) :: units !< The units of the stocks calculated.
294  integer, optional, intent(in ) :: stock_index !< The coded index of a specific stock
295  !! being sought.
296  integer :: boundary_impulse_stock !< Return value: the number of stocks calculated here.
297 
298 ! This function calculates the mass-weighted integral of all tracer stocks,
299 ! returning the number of stocks it has calculated. If the stock_index
300 ! is present, only the stock corresponding to that coded index is returned.
301 
302  ! Local variables
303  integer :: i, j, k, is, ie, js, je, nz, m
304  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = gv%ke
305 
306  boundary_impulse_stock = 0
307  if (.not.associated(cs)) return
308  if (cs%ntr < 1) return
309 
310  if (present(stock_index)) then ; if (stock_index > 0) then
311  ! Check whether this stock is available from this routine.
312 
313  ! No stocks from this routine are being checked yet. Return 0.
314  return
315  endif ; endif
316 
317  do m=1,1
318  call query_vardesc(cs%tr_desc(m), name=names(m), units=units(m), caller="boundary_impulse_stock")
319  units(m) = trim(units(m))//" kg"
320  stocks(m) = 0.0
321  do k=1,nz ; do j=js,je ; do i=is,ie
322  stocks(m) = stocks(m) + cs%tr(i,j,k,m) * &
323  (g%mask2dT(i,j) * g%areaT(i,j) * h(i,j,k))
324  enddo ; enddo ; enddo
325  stocks(m) = gv%H_to_kg_m2 * stocks(m)
326  enddo
327 
328  boundary_impulse_stock = cs%ntr
329 

◆ boundary_impulse_tracer_column_physics()

subroutine, public boundary_impulse_tracer::boundary_impulse_tracer_column_physics ( real, dimension(szi_(g),szj_(g),szk_(g)), intent(in)  h_old,
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in)  h_new,
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in)  ea,
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in)  eb,
type(forcing), intent(in)  fluxes,
real, intent(in)  dt,
type(ocean_grid_type), intent(in)  G,
type(verticalgrid_type), intent(in)  GV,
type(boundary_impulse_tracer_cs), pointer  CS,
type(thermo_var_ptrs), intent(in)  tv,
logical, intent(in)  debug,
real, intent(in), optional  evap_CFL_limit,
real, intent(in), optional  minimum_forcing_depth 
)

Apply source or sink at boundary and do vertical diffusion.

Parameters
[in]gThe ocean's grid structure
[in]gvThe ocean's vertical grid structure
[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
[in]eban array to which the amount of fluid entrained
[in]fluxesA structure containing pointers to thermodynamic and tracer forcing fields. Unused fields have NULL ptrs.
[in]dtThe amount of time covered by this call [s]
csThe control structure returned by a previous call to register_boundary_impulse_tracer.
[in]tvA structure pointing to various thermodynamic variables
[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 [m]

Definition at line 208 of file boundary_impulse_tracer.F90.

208  type(ocean_grid_type), intent(in) :: G !< The ocean's grid structure
209  type(verticalGrid_type), intent(in) :: GV !< The ocean's vertical grid structure
210  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
211  intent(in) :: h_old !< Layer thickness before entrainment [H ~> m or kg m-2].
212  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
213  intent(in) :: h_new !< Layer thickness after entrainment [H ~> m or kg m-2].
214  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
215  intent(in) :: ea !< an array to which the amount of fluid entrained
216  !! from the layer above during this call will be
217  !! added [H ~> m or kg m-2].
218  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
219  intent(in) :: eb !< an array to which the amount of fluid entrained
220  !! from the layer below during this call will be
221  !! added [H ~> m or kg m-2].
222  type(forcing), intent(in) :: fluxes !< A structure containing pointers to thermodynamic
223  !! and tracer forcing fields. Unused fields have NULL ptrs.
224  real, intent(in) :: dt !< The amount of time covered by this call [s]
225  type(boundary_impulse_tracer_CS), pointer :: CS !< The control structure returned by a previous
226  !! call to register_boundary_impulse_tracer.
227  type(thermo_var_ptrs), intent(in) :: tv !< A structure pointing to various
228  !! thermodynamic variables
229  logical, intent(in) :: debug !< If true calculate checksums
230  real, optional, intent(in) :: evap_CFL_limit !< Limit on the fraction of the water that can
231  !! be fluxed out of the top layer in a timestep [nondim]
232  real, optional, intent(in) :: minimum_forcing_depth !< The smallest depth over which
233  !! fluxes can be applied [m]
234 
235 ! This subroutine applies diapycnal diffusion and any other column
236 ! tracer physics or chemistry to the tracers from this file.
237 ! This is a simple example of a set of advected passive tracers.
238 
239 ! The arguments to this subroutine are redundant in that
240 ! h_new(k) = h_old(k) + ea(k) - eb(k-1) + eb(k) - ea(k+1)
241 
242  ! Local variables
243  real :: Isecs_per_year = 1.0 / (365.0*86400.0)
244  real :: year, h_total, scale, htot, Ih_limit
245  integer :: secs, days
246  integer :: i, j, k, is, ie, js, je, nz, m, k_max
247  real, dimension(SZI_(G),SZJ_(G),SZK_(G)) :: h_work ! Used so that h can be modified
248 
249  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = gv%ke
250 
251  if (.not.associated(cs)) return
252  if (cs%ntr < 1) return
253 
254  ! This uses applyTracerBoundaryFluxesInOut, usually in ALE mode
255  if (present(evap_cfl_limit) .and. present(minimum_forcing_depth)) then
256  do k=1,nz ;do j=js,je ; do i=is,ie
257  h_work(i,j,k) = h_old(i,j,k)
258  enddo ; enddo ; enddo
259  call applytracerboundaryfluxesinout(g, gv, cs%tr(:,:,:,1), dt, fluxes, h_work, &
260  evap_cfl_limit, minimum_forcing_depth)
261  call tracer_vertdiff(h_work, ea, eb, dt, cs%tr(:,:,:,1), g, gv)
262  else
263  call tracer_vertdiff(h_old, ea, eb, dt, cs%tr(:,:,:,1), g, gv)
264  endif
265 
266  ! Set surface conditions
267  do m=1,1
268  if (cs%remaining_source_time>0.0) then
269  do k=1,cs%nkml ; do j=js,je ; do i=is,ie
270  cs%tr(i,j,k,m) = 1.0
271  enddo ; enddo ; enddo
272  cs%remaining_source_time = cs%remaining_source_time-dt
273  else
274  do k=1,cs%nkml ; do j=js,je ; do i=is,ie
275  cs%tr(i,j,k,m) = 0.0
276  enddo ; enddo ; enddo
277  endif
278 
279  enddo
280 

◆ boundary_impulse_tracer_end()

subroutine, public boundary_impulse_tracer::boundary_impulse_tracer_end ( type(boundary_impulse_tracer_cs), pointer  CS)

Performs finalization of boundary impulse tracer.

Parameters
csThe control structure returned by a previous call to register_boundary_impulse_tracer.

Definition at line 367 of file boundary_impulse_tracer.F90.

367  type(boundary_impulse_tracer_CS), pointer :: CS !< The control structure returned by a previous
368  !! call to register_boundary_impulse_tracer.
369  integer :: m
370 
371  if (associated(cs)) then
372  if (associated(cs%tr)) deallocate(cs%tr)
373  deallocate(cs)
374  endif

◆ boundary_impulse_tracer_surface_state()

subroutine, public boundary_impulse_tracer::boundary_impulse_tracer_surface_state ( type(surface), intent(inout)  state,
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in)  h,
type(ocean_grid_type), intent(in)  G,
type(boundary_impulse_tracer_cs), pointer  CS 
)

This subroutine extracts the surface fields from this tracer package that are to be shared with the atmosphere in coupled configurations. This particular tracer package does not report anything back to the coupler.

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

Definition at line 336 of file boundary_impulse_tracer.F90.

336  type(ocean_grid_type), intent(in) :: G !< The ocean's grid structure.
337  type(surface), intent(inout) :: state !< A structure containing fields that
338  !! describe the surface state of the ocean.
339  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
340  intent(in) :: h !< Layer thickness [H ~> m or kg m-2].
341  type(boundary_impulse_tracer_CS), pointer :: CS !< The control structure returned by a previous
342  !! call to register_boundary_impulse_tracer.
343 
344  ! This particular tracer package does not report anything back to the coupler.
345  ! The code that is here is just a rough guide for packages that would.
346 
347  integer :: m, is, ie, js, je, isd, ied, jsd, jed
348  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
349  isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
350 
351  if (.not.associated(cs)) return
352 
353  if (cs%coupled_tracers) then
354  do m=1,cs%ntr
355  ! This call loads the surface values into the appropriate array in the
356  ! coupler-type structure.
357  call coupler_type_set_data(cs%tr(:,:,1,m), cs%ind_tr(m), ind_csurf, &
358  state%tr_fields, idim=(/isd, is, ie, ied/), &
359  jdim=(/jsd, js, je, jed/) )
360  enddo
361  endif
362 

◆ initialize_boundary_impulse_tracer()

subroutine, public boundary_impulse_tracer::initialize_boundary_impulse_tracer ( logical, intent(in)  restart,
type(time_type), intent(in), target  day,
type(ocean_grid_type), intent(in)  G,
type(verticalgrid_type), intent(in)  GV,
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in)  h,
type(diag_ctrl), intent(in), target  diag,
type(ocean_obc_type), pointer  OBC,
type(boundary_impulse_tracer_cs), pointer  CS,
type(sponge_cs), pointer  sponge_CSp,
type(thermo_var_ptrs), intent(in)  tv 
)

Initialize tracer from restart or set to 1 at surface to initialize.

Parameters
[in]restart.true. if the fields have already been read from a restart file.
[in]dayTime of the start of the run.
[in]gThe ocean's grid structure
[in]gvThe ocean's vertical grid structure
[in]hLayer thicknesses [H ~> m or kg m-2]
[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 register_boundary_impulse_tracer.
sponge_cspPointer to the control structure for the sponges.
[in]tvA structure pointing to various thermodynamic variables

Definition at line 152 of file boundary_impulse_tracer.F90.

152  logical, intent(in) :: restart !< .true. if the fields have already
153  !! been read from a restart file.
154  type(time_type), target, intent(in) :: day !< Time of the start of the run.
155  type(ocean_grid_type), intent(in) :: G !< The ocean's grid structure
156  type(verticalGrid_type), intent(in) :: GV !< The ocean's vertical grid structure
157  real, dimension(SZI_(G),SZJ_(G),SZK_(G)), &
158  intent(in) :: h !< Layer thicknesses [H ~> m or kg m-2]
159  type(diag_ctrl), target, intent(in) :: diag !< A structure that is used to regulate
160  !! diagnostic output.
161  type(ocean_OBC_type), pointer :: OBC !< This open boundary condition type specifies
162  !! whether, where, and what open boundary
163  !! conditions are used.
164  type(boundary_impulse_tracer_CS), pointer :: CS !< The control structure returned by a previous
165  !! call to register_boundary_impulse_tracer.
166  type(sponge_CS), pointer :: sponge_CSp !< Pointer to the control structure for the sponges.
167  type(thermo_var_ptrs), intent(in) :: tv !< A structure pointing to various
168  !! thermodynamic variables
169  ! Local variables
170  character(len=16) :: name ! A variable's name in a NetCDF file.
171  character(len=72) :: longname ! The long name of that variable.
172  character(len=48) :: units ! The dimensions of the variable.
173  character(len=48) :: flux_units ! The units for age tracer fluxes, either
174  ! years m3 s-1 or years kg s-1.
175  logical :: OK
176  integer :: i, j, k, is, ie, js, je, isd, ied, jsd, jed, nz, m
177  integer :: IsdB, IedB, JsdB, JedB
178 
179  if (.not.associated(cs)) return
180  if (cs%ntr < 1) return
181  is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = gv%ke
182  isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
183  isdb = g%IsdB ; iedb = g%IedB ; jsdb = g%JsdB ; jedb = g%JedB
184 
185  cs%Time => day
186  cs%diag => diag
187  name = "boundary_impulse"
188 
189  do m=1,cs%ntr
190  call query_vardesc(cs%tr_desc(m), name=name, caller="initialize_boundary_impulse_tracer")
191  if ((.not.restart) .or. (.not. &
192  query_initialized(cs%tr(:,:,:,m), name, cs%restart_CSp))) then
193  do k=1,cs%nkml ; do j=jsd,jed ; do i=isd,ied
194  cs%tr(i,j,k,m) = 1.0
195  enddo ; enddo ; enddo
196  endif
197  enddo ! Tracer loop
198 
199  if (associated(obc)) then
200  ! Steal from updated DOME in the fullness of time.
201  endif
202 

◆ register_boundary_impulse_tracer()

logical function, public boundary_impulse_tracer::register_boundary_impulse_tracer ( type(hor_index_type), intent(in)  HI,
type(verticalgrid_type), intent(in)  GV,
type(param_file_type), intent(in)  param_file,
type(boundary_impulse_tracer_cs), pointer  CS,
type(tracer_registry_type), pointer  tr_Reg,
type(mom_restart_cs), pointer  restart_CS 
)

Read in runtime options and add boundary impulse tracer to tracer registry.

Parameters
[in]hiA horizontal index type structure
[in]gvThe ocean's vertical grid structure
[in]param_fileA structure to parse for run-time parameters
csThe control structure returned by a previous call to register_boundary_impulse_tracer.
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 66 of file boundary_impulse_tracer.F90.

66  type(hor_index_type), intent(in ) :: HI !< A horizontal index type structure
67  type(verticalGrid_type), intent(in ) :: GV !< The ocean's vertical grid structure
68  type(param_file_type), intent(in ) :: param_file !< A structure to parse for run-time parameters
69  type(boundary_impulse_tracer_CS), pointer :: CS !< The control structure returned by a previous
70  !! call to register_boundary_impulse_tracer.
71  type(tracer_registry_type), pointer :: tr_Reg !< A pointer that is set to point to the control
72  !! structure for the tracer advection and
73  !! diffusion module
74  type(MOM_restart_CS), pointer :: restart_CS !< A pointer to the restart control structure
75 
76  ! Local variables
77  character(len=40) :: mdl = "boundary_impulse_tracer" ! This module's name.
78  character(len=200) :: inputdir ! The directory where the input files are.
79  character(len=48) :: var_name ! The variable's name.
80  character(len=3) :: name_tag ! String for creating identifying boundary_impulse
81  character(len=48) :: flux_units ! The units for tracer fluxes, usually
82  ! kg(tracer) kg(water)-1 m3 s-1 or kg(tracer) s-1.
83  ! This include declares and sets the variable "version".
84 #include "version_variable.h"
85  real, pointer :: tr_ptr(:,:,:) => null()
86  real, pointer :: rem_time_ptr => null()
87  logical :: register_boundary_impulse_tracer
88  integer :: isd, ied, jsd, jed, nz, m, i, j
89  isd = hi%isd ; ied = hi%ied ; jsd = hi%jsd ; jed = hi%jed ; nz = gv%ke
90 
91  if (associated(cs)) then
92  call mom_error(warning, "register_boundary_impulse_tracer called with an "// &
93  "associated control structure.")
94  return
95  endif
96  allocate(cs)
97 
98  ! Read all relevant parameters and write them to the model log.
99  call log_version(param_file, mdl, version, "")
100  call get_param(param_file, mdl, "IMPULSE_SOURCE_TIME", cs%remaining_source_time, &
101  "Length of time for the boundary tracer to be injected "//&
102  "into the mixed layer. After this time has elapsed, the "//&
103  "surface becomes a sink for the boundary impulse tracer.", &
104  default=31536000.0)
105  call get_param(param_file, mdl, "TRACERS_MAY_REINIT", cs%tracers_may_reinit, &
106  "If true, tracers may go through the initialization code "//&
107  "if they are not found in the restart files. Otherwise "//&
108  "it is a fatal error if the tracers are not found in the "//&
109  "restart files of a restarted run.", default=.false.)
110  cs%ntr = ntr_max
111  allocate(cs%tr(isd:ied,jsd:jed,nz,cs%ntr)) ; cs%tr(:,:,:,:) = 0.0
112 
113  cs%nkml = max(gv%nkml,1)
114 
115  do m=1,cs%ntr
116  ! This is needed to force the compiler not to do a copy in the registration
117  ! calls. Curses on the designers and implementers of Fortran90.
118  cs%tr_desc(m) = var_desc(trim("boundary_impulse"), "kg kg-1", &
119  "Boundary impulse tracer", caller=mdl)
120  if (gv%Boussinesq) then ; flux_units = "kg kg-1 m3 s-1"
121  else ; flux_units = "kg s-1" ; endif
122 
123  tr_ptr => cs%tr(:,:,:,m)
124  call query_vardesc(cs%tr_desc(m), name=var_name, caller="register_boundary_impulse_tracer")
125  ! Register the tracer for horizontal advection, diffusion, and restarts.
126  call register_tracer(tr_ptr, tr_reg, param_file, hi, gv, tr_desc=cs%tr_desc(m), &
127  registry_diags=.true., flux_units=flux_units, &
128  restart_cs=restart_cs, mandatory=.not.cs%tracers_may_reinit)
129 
130  ! Set coupled_tracers to be true (hard-coded above) to provide the surface
131  ! values to the coupler (if any). This is meta-code and its arguments will
132  ! currently (deliberately) give fatal errors if it is used.
133  if (cs%coupled_tracers) &
134  cs%ind_tr(m) = aof_set_coupler_flux(trim(var_name)//'_flux', &
135  flux_type=' ', implementation=' ', caller="register_boundary_impulse_tracer")
136  enddo
137  ! Register remaining source time as a restart field
138  rem_time_ptr => cs%remaining_source_time
139  call register_restart_field(rem_time_ptr, "bir_remain_time", &
140  .not.cs%tracers_may_reinit, restart_cs, &
141  "Remaining time to apply BIR source", "s")
142 
143  cs%tr_Reg => tr_reg
144  cs%restart_CSp => restart_cs
145  register_boundary_impulse_tracer = .true.
146