PUBLIC INTERFACE ~ PUBLIC DATA ~ PUBLIC ROUTINES ~ NAMELIST ~ DIAGNOSTIC FIELDS ~ ERROR MESSAGES ~ REFERENCES ~ NOTES

Module ocean_residency_mod

Contact:  Richard D. Slater
Reviewers:  Stephen M. Griffies
Change History: WebCVS Log


OVERVIEW

Ocean residency module

This module is a superset of the ocean age tracer module. It may be used to reproduce the age tracer, but it can also do much more. Unlike the ocean age tracer module, here you may specify a 3-d field by specifying a series of "rectangular prisms". The grid cells which occupy this field may vary with time due to the variations in the thickness of the surface layer.

You may also specify a 3-d field by choosing one of three mixed-layers (KPP, density-derived or buoyancy-derived). You may also specify a region based on a a range of a prognostic or diagnostic ocean tracer (such as all points with a temperature of 10-20 degrees).

You may specify either the mixed-layer method or the tracer range along with the geographic specification. If multiple methods are used, then the resultant field is the intersection of the two methods. In fact, the geographic method is always in use, and defaults to the whole ocean.

There is an option of using the inverse of any method. This is sometimes easier to use than explicitly specifying the inverse. For instance, to get the temperatures outside of the range 10-20 degrees, one could specify the 10-20 degree range and set <swap> to true, or, specify two different regions, one less than 10 degrees and one greater than 20 degrees.

By default, the values inside the specified region are set to a specified value each time-step (default is 0), and outside of this region the field is integrated over time in units of years (integrand is 1/(365.25*86400) by default, but this value can be changed. The inner region can be forced to be 0 (or the user-specified inner value) at each time-step (the default), or it can be restored to this value at a user-specified rate (given in days), or, it can be left alone (not integrated or set to any value).

Finally, since we are just integrating a specified field by a constant value (by default), it is simple to make that field a simple function of another tracer. This is the final option. You may specify a prognostic or diagnostic variable to be the integrand, and have it scaled by a constant. One case which has been done is to integrate irradiance in the mixed-layer.

This module is split into several different modules. This particular module is the only one called from outside, and it makes appropriate calls to the other modules to implement its features. This was done so that it would be easier to expand the features of the ocean residency, without cluttering the code too much. Ideally, this could all be done with classes, but there is currently no support for classes in Fortran (pre-F2003). The current modules are:

ocean_residency.F90 This module, the control center, and also does the integrations and resetting in the inner regions. ocean_residency_meta.F90 Has specifications of the ocean_residency type and other utility routines. This is separate to stop circular references ocean_residency_ml.F90 Handles setting mixed-layer masks ocean_residency_range.F90 Handles setting the masks for the tracer ranges ocean_residency_integrand.F90 Handles setting the integrand to a non-constant value

field_table namelist inputs:

The following 6 arrays specify the bounds of boxes, the intersection of which will define the region where the integrand is set to restore_region_value. ALl arrays must have the same number of elements. If none are specified, then no region will be used, unless swap is true, which is a quick way of selecting the entire ocean. This may be useful when one really wants to use one of the other methods of selecting, such as mixed layer depth, or tracer range.

Longitudes will be shifted to lie in the range 0-360 degrees. If the eastern side is greater than the western, then the selected region will consist of those grid cells from the eastern value to 360, and 0 to the western value. If the northern value is less than the southern value, or if the top depth is greater than the bottom depth, then an error occurs, and the model stops.

Three special cases exist for the depth (which currently must be in meters). If the bottom value is less than or equal to zero, then the top box is selected. If the top value is greater than the maximum depth, then the bottom box is selected. If the top value is negative, then grid cells within "the absolute value of the top value" from the bottom are selected.

Note that the geographic specification is used for all residency tracers, so either values for these 6 arrays must be given so as to select a region, or else swap must be set to true and no arrays given.

east_bnd: array of boundary points of the eastern side of the box, in degrees longitude (default: NULL) north_bnd: array of boundary points of the northern side of the box, in degrees latitude (default: NULL) south_bnd: array of boundary points of the southern side of the box, in degrees latitude (default: NULL) west_bnd: array of boundary points of the western side of the box, in degrees longitude (default: NULL) top_bnd: array of boundary points of the top side of the box, in meters (default: NULL) bottom_bnd: array of boundary points of the bottom side of the box, in meters (default: NULL)

swap: if true, then select the inverse of the specified geographic region, otherwise, just use the specified region (default: false) restore: restoring value for values in the defined regions negative => do nothing, 0 => force to integrate_region_value, positive => time scale in days to force to integrate_region_value (default: 0.0) restore_region_value: value to set the mask to for grid cells within the specified region (default: 0.0) integrate_region_value: value to set the mask to for grid cells outside the specified region (default: secs_in_year_r) swap_module: if true, then select the inverse of the region from the specified module, otherwise, just use the specified region (default: false) module_name: if set, then it will be used to select the alternate method of selecting the region (default: ' ' -- only geographic selection is used)

For the following arrays, see the different extra modules for required and possible values for the module selected.

params: an array of real parameters which may be used for the method being used for selection (default: NULL) flags: an array of real parameters which may be used for the method being used for selection (default: NULL) strings: an array of real parameters which may be used for the method being used for selection (default: NULL)

For the following arrays, see the different extra modules for required and possible values for the module selected to specify the integrand. int_module_name: if set, then the name of the module used to set the integrand (default: ' ' -- integrate time, in years) int_params: an array of real parameters which may be used for the integrand (default: NULL) int_flags: an array of real parameters which may be used for the integrand (default: NULL) int_strings: an array of real parameters which may be used for the integrand (default: NULL)

----------------------------------------------------------------------------------------

Sample field table entries: ---------------------------

"tracer_packages","ocean_mod","ocean_residency" names = age_surface, age_bottom_inv, kppbl_nil, kppbl_14d, kppbl_frc, kppbl_irr_14d, temp_15_20 horizontal-advection-scheme = mdppm vertical-advection-scheme = mdppm units = yr min_tracer_limit=0.0 /

This is the same as the old age tracer with all surface values forced to zero

"namelists","ocean_mod","ocean_residency/age_surface" south_bnd = -90.0 north_bnd = 90.0 west_bnd = 0.0 east_bnd = 360.0 top_bnd = 0.0 bottom_bnd = 0.0 /

This integrates the age in the bottom box and forces to zero everywhere else (note that swap is true)

"namelists","ocean_mod","ocean_residency/age_bottom_inv" south_bnd = -90.0 north_bnd = 90.0 west_bnd = 0.0 east_bnd = 360.0 top_bnd = 10000.0 bottom_bnd = 10000.0 swap = t /

This integrates the age of the water in the KPP boundary layer, but lets the age outside of this region keep its value until it again mixes with the boundary layer. The module_name is set, and strings is set to pick the type of mixed layer desired (note that the global geographic area is explicitly specified, and that the restoring time scale is negative)

"namelists","ocean_mod","ocean_residency/kppbl_nil" south_bnd = -90.0 north_bnd = 90.0 west_bnd = 0.0 east_bnd = 360.0 top_bnd = 0.0 bottom_bnd = 10000.0 restore = -1.0 module_name = ocean_residency_ml strings = kpp_bl swap_module = t /

This is the same as above, but forces the age outside the boundary layer to 0 with a 14 day time scale (note that the global geographic region is specified by setting swap to true, also note the value of restore)

"namelists","ocean_mod","ocean_residency/kppbl_14d" swap = t restore = 14.0 module_name = ocean_residency_ml strings = kpp_bl swap_module = t /

This is the same as above, but forces age to zero outside the boundary layer (note that restore did not need to be explicitly specified, as the default is zero)

"namelists","ocean_mod","ocean_residency/kppbl_frc" swap = t restore = 0.0 module_name = ocean_residency_ml strings = kpp_bl swap_module = t /

The following integrates irradiance in the boundary layer (note that the units needed to be changed for netCDF output purposes)

"prog_tracers","ocean_mod","residency_kppbl_irr_14d" units = W-yr/m^2 /

"namelists","ocean_mod","ocean_residency/kppbl_irr_14d" swap = t restore = 14.0 module_name = ocean_residency_ml strings = kpp_bl swap_module = t int_module_name = ocean_residency_integrand int_strings = irr /

This specifies the region as the area with a temperature range of between 15 and 20 degrees (note that the params holds the variable range)

"namelists","ocean_mod","ocean_residency/temp_15_20" swap = t module_name = ocean_residency_range strings = tracer_range, temp params = 15.0, 20.0 /



OTHER MODULES USED

             time_manager_mod
field_manager_mod
mpp_mod
diag_manager_mod
ocean_tpm_util_mod
fm_util_mod
ocean_types_mod
ocean_residency_meta_mod
ocean_residency_ml_mod
ocean_residency_range_mod
ocean_residency_integrand_mod

PUBLIC INTERFACE

ocean_residency_init:
ocean_residency_source:
ocean_residency_start:
ocean_residency_tracer:


PUBLIC DATA

None.


PUBLIC ROUTINES

  1. ocean_residency_init

    DESCRIPTION
    Set up any extra fields needed by the tracer packages


  2. ocean_residency_source

    DESCRIPTION
    Calculate the source arrays for the tracer packages


  3. ocean_residency_start

    DESCRIPTION
    Start the ocean residency package

    Residency surface area specification

    west_bnd : western longitude of residency region east_bnd : eastern longitude of residency region south_bnd : southern latitude of residency region north_bnd : northern latitude of residency region top_bnd : top depth of residency region bottom_bnd : bottom depth of residency region

    To set the volumes, a number of namelists are read, each containing the above values. You may specify up to num_geog_region rectangular cubes bounded by (west_bnd, east_bnd, north_bnd, south_bnd, top_bnd, bottom_bnd). Any grid box whose center is in one of these volumes will be considered to be part of the volume where the residency is reset to zero every time-step.

    north_bnd may not equal south_bnd, and west_bnd may not equal east_bnd

    top_depth may equal bottom_depth. In that case, then whatever vertical box contains that depth will define the vertical range for the box

    If south_bnd > north_bnd, then nothing will be done for that rectangle

    The initial surface area is empty, with the default rectangle setting the surface area to be empty

    More than num_geog_regions rectanglar volumes may be used to specify the volume by using more than one namelist


  4. ocean_residency_tracer

    DESCRIPTION
    Subroutine to do calculations needed every time-step after the continuity equation has been integrated



DATA SETS

None.


ERROR MESSAGES

None.


top