api.py 1.61 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
from veros import logger, time


def create_default_diagnostics(state):
    # do not import these at module level to make sure core import is deferred
    from veros.diagnostics.averages import Averages
    from veros.diagnostics.cfl_monitor import CFLMonitor
    from veros.diagnostics.energy import Energy
    from veros.diagnostics.overturning import Overturning
    from veros.diagnostics.snapshot import Snapshot
    from veros.diagnostics.tracer_monitor import TracerMonitor

    return {Diag.name: Diag(state) for Diag in (Averages, CFLMonitor, Energy, Overturning, Snapshot, TracerMonitor)}


def initialize(state):
    for name, diagnostic in state.diagnostics.items():
        diagnostic.initialize(state)

        if diagnostic.sampling_frequency:
            t, unit = time.format_time(diagnostic.sampling_frequency)
            logger.info(f' Running diagnostic "{name}" every {t:.1f} {unit}')

        if diagnostic.output_frequency:
            t, unit = time.format_time(diagnostic.output_frequency)
            logger.info(f' Writing output for diagnostic "{name}" every {t:.1f} {unit}')


def diagnose(state):
    vs = state.variables
    settings = state.settings

    for diagnostic in state.diagnostics.values():
        if diagnostic.sampling_frequency and vs.time % diagnostic.sampling_frequency < settings.dt_tracer:
            diagnostic.diagnose(state)


def output(state):
    vs = state.variables
    settings = state.settings

    for diagnostic in state.diagnostics.values():
        if diagnostic.output_frequency and vs.time % diagnostic.output_frequency < settings.dt_tracer:
            diagnostic.output(state)