The AGE_MEAN option introduced with ticket #674 https://www.myroms.org/projects/src/ticket/674 implements the mean water age method described by Gordon Zhang in a JPO article on age and residence time in the Hudson River plume. [Zhang et al. (2010): Simulation of water age and residence time in the New York Bight, JPO, 40,965-982, doi:10.1175/2009JPO4249.1]
This version corrects bugs in implementations of Zhang's code that are present in various branches of ROMS, so if you have been using a mean age tracer (probably with #define AGE_PASSIVE) please check your code against this ticket.
The bugs that were corrected are associated with less than optimal or outright incorrect time level index into the global tracer array in pre_step.F and step3d_t.F. The appropriate choice of time level is different for TS_MPDATA and the other advection schemes. This code works for all advection options. I know other users have implemented
their own incarnations of mean age with a forcing term in step3d_t.F only, and while this gives acceptable results the additional code in pre_step.F improves the outcome.
To use the option you must #define both AGE_MEAN and T_PASSIVE and set an even number of passive tracers (parameter NPT in ocean.in). Each odd number tracer is strictly passive and tags the water mass whose age you are tracking; it has a companion age concentration tracer (the even index in the passive tracer array) with a RHS term that causes it to age in proportion to the concentration of the conservative passive tracer. See Zhang et al. (2010) and references therein for an explanation.
We have made changes to the I/O (so update your varinfo.dat!) so that the output netcdf files distinguish between the passive and age concentration tracers. To compute the mean age of a tagged water mass, you divide the age concentration (e.g. dye_age_01) by the associated passive dye (e.g. dye_01) to get mean age in units of seconds. (Mean age itself is not a tracer).
(Sorry, but with this option you cannot mix a set of age tracer pairs with a set of simply passive dyes independent of the aging process.)
As with all passive tracer applications, you have to either customize ana_passive.h or add passive dyes to the initial and possibly the river source forcing netcdf files. This is application dependent.
The plot below is a very simple illustration of the method. The top panel shows initial conditions (blue line) that are a cosinusoidal shaped initial dye patch in a periodic channel with a steady uniform flow. The initial age concentration is zero because this is t=0.
After 0.5 days the dye patch has advected to the right with imperceptible dispersion; this is 3rd-order upwind advection with weak tnu2 = 1 m2/s diffusion) and the age concentration has grown accordingly. Within the dye patch the mean age is everywhere 0.5 days. Outside the patch where c=0 the mean age is undefined. After 2 days the dye patch has reentered the domain through the periodic boundary conditions and its mean age is now 2 days.
Numerical dispersion has introduced small but non zero (and some negative) passive dye values outside the extent of a perfectly advecting passive dye patch. The mean age becomes very noisy in those areas as shown by the dotted purple line. We recommend excluding very small passive dye values from the divisor of the mean age
calculation. The solid purple line is the mean age when c<1e-4 concentrations are excluded.
Using TS_MPDATA advection these issues with noisy and negative dye values are greatly suppressed but at the expense of numerically diffusing the passive dye patch. So, as always in passive tracer applications, exercise care in your choice of advection algorithm, explicit diffusion, and lateral mixing parameters, and evaluate your results recognizing that all these methods have compromises.
In Zhang's paper they describe age spectrum calculations using a large set of passive dyes. The AGE_DISTRIBUTION option present in some ROMS branches attempts to implement the age spectrum but has fundamental errors (incorrect factors of Hz for example, in addition to time index issues) and should not be used. I have a prototype implementation of an AGE_SPECTRUM option but it is highly dispersive in age space and is not suited to applications in its present form.
Archive of important messages sent via the ROMS mailing list
1 post • Page 1 of 1