import os
import copy
from veros import time, logger
from veros.diagnostics.base import VerosDiagnostic
DEFAULT_OUTPUT_VARS = [
"dxt",
"dxu",
"dyt",
"dyu",
"zt",
"zw",
"dzt",
"dzw",
"ht",
"hu",
"hv",
"beta",
"area_t",
"area_u",
"area_v",
"rho",
"prho",
"int_drhodT",
"int_drhodS",
"Nsqr",
"Hd",
"temp",
"salt",
"forc_temp_surface",
"forc_salt_surface",
"u",
"v",
"w",
"p_hydro",
"kappaM",
"kappaH",
"surface_taux",
"surface_tauy",
"forc_rho_surface",
"psi",
"isle",
"psin",
"xt",
"xu",
"yt",
"yu",
"temp_source",
"salt_source",
"u_source",
"v_source",
"tke",
"forc_tke_surface",
"eke",
"E_iw",
"forc_iw_surface",
"forc_iw_bottom",
]
[docs]
class Snapshot(VerosDiagnostic):
"""Writes snapshots of the current solution. Also reads and writes the main restart
data required for restarting a Veros simulation.
"""
output_path = "{identifier}.snapshot.nc"
"""File to write to. May contain format strings that are replaced with Veros attributes."""
name = "snapshot" #:
output_frequency = None #: Frequency (in seconds) in which output is written.
def __init__(self, state):
self.output_variables = []
for var in DEFAULT_OUTPUT_VARS:
active = state.var_meta[var].active
if callable(active):
active = active(state.settings)
if active:
self.output_variables.append(var)
def initialize(self, state):
vs = state.variables
self.var_meta = {var: copy.copy(state.var_meta[var]) for var in self.output_variables}
for var in self.var_meta.values():
var.write_to_restart = False
self.variables = vs
self.initialize_output(state)
def diagnose(self, state):
pass
def output(self, state):
vs = state.variables
time_length, time_unit = time.format_time(vs.time)
logger.info(f" Writing snapshot at {time_length:.2f} {time_unit}")
if not os.path.isfile(self.get_output_file_name(state)):
self.initialize_output(state)
self.write_output(state)