Source code for veros.diagnostics.tracer_monitor

from veros import logger

from veros.variables import Variable
from veros.core.operators import numpy as npx
from veros.diagnostics.base import VerosDiagnostic
from veros.distributed import global_sum


[docs]class TracerMonitor(VerosDiagnostic): """Diagnostic monitoring global tracer contents / fluxes. Writes output to stdout (no binary output). """ name = "tracer_monitor" output_frequency = None def __init__(self, state): self.var_meta = { "tempm1": Variable("tempm1", None, write_to_restart=True), "vtemp1": Variable("vtemp1", None, write_to_restart=True), "saltm1": Variable("saltm1", None, write_to_restart=True), "vsalt1": Variable("vsalt1", None, write_to_restart=True), } def initialize(self, state): self.initialize_variables(state) def diagnose(self, state): pass def output(self, state): """ Diagnose tracer content """ vs = state.variables tracer_vs = self.variables cell_volume = vs.area_t[2:-2, 2:-2, npx.newaxis] * vs.dzt[npx.newaxis, npx.newaxis, :] * vs.maskT[2:-2, 2:-2, :] volm = global_sum(npx.sum(cell_volume)) tempm = global_sum(npx.sum(cell_volume * vs.temp[2:-2, 2:-2, :, vs.tau])) saltm = global_sum(npx.sum(cell_volume * vs.salt[2:-2, 2:-2, :, vs.tau])) vtemp = global_sum(npx.sum(cell_volume * vs.temp[2:-2, 2:-2, :, vs.tau] ** 2)) vsalt = global_sum(npx.sum(cell_volume * vs.salt[2:-2, 2:-2, :, vs.tau] ** 2)) logger.diagnostic( f" Mean temperature {tempm / volm:.2e} change to last {(tempm - tracer_vs.tempm1) / volm:.2e}" ) logger.diagnostic( f" Mean salinity {saltm / volm:.2e} change to last {(saltm - tracer_vs.saltm1) / volm:.2e}" ) logger.diagnostic( f" Temperature var. {vtemp / volm:.2e} change to last {(vtemp - tracer_vs.vtemp1) / volm:.2e}" ) logger.diagnostic( f" Salinity var. {vsalt / volm:.2e} change to last {(vsalt - tracer_vs.vsalt1) / volm:.2e}" ) tracer_vs.tempm1 = tempm tracer_vs.vtemp1 = vtemp tracer_vs.saltm1 = saltm tracer_vs.vsalt1 = vsalt