tracer_monitor.py 2.2 KB
Newer Older
mashun1's avatar
veros  
mashun1 committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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


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