Source code for deode.tasks.c903

"""C903."""

import json
import os

from ..config_parser import ConfigPaths
from ..datetime_utils import as_datetime, as_timedelta, cycle_offset
from ..logs import logger
from ..namelist import NamelistGenerator
from .base import Task
from .batch import BatchJob
from .marsprep import Marsprep


[docs] class C903(Task): """C903, preform interpolation from IFS to IAL LAM.""" def __init__(self, config): """Construct C903 object. Args: config (deode.ParsedConfig): Configuration """ Task.__init__(self, config, __class__.__name__) self.climdir = self.platform.get_system_value("climdir") self.basetime = as_datetime(self.config["general.times.basetime"]) mars = Marsprep.mars_selection(self) bdcycle = as_timedelta(mars["ifs_cycle_length"]) bdcycle_start = as_timedelta(mars["ifs_cycle_start"]) bdshift = as_timedelta(self.config["boundaries.bdshift"]) # Boundary basetime self.bd_basetime = self.basetime - cycle_offset( self.basetime, bdcycle, bdcycle_start=bdcycle_start, bdshift=-bdshift ) self.bdnr = self.config["task.args.bd_nr"] self.bd_time = self.config["task.args.bd_time"] self.forecast_range = self.config["general.times.forecast_range"] self.bdfile_template = self.config["system.bdfile_template"] self.intp_bddir = self.platform.get_system_value("intp_bddir") self.nlgen = NamelistGenerator(self.config, "master") self.master = self.get_binary("MASTERODB") self.name = f"{self.name}_{self.bdnr}"
[docs] def execute(self): """Run task. Define run sequence. """ # Fetch input data input_definition = ConfigPaths.path_from_subpath( self.platform.get_system_value("c903_input_definition") ) logger.info("Read input data spec from: {}", input_definition) with open(input_definition, "r", encoding="utf-8") as f: input_data = json.load(f) ifs_files = input_data.pop("IFS_files") # Link the static data self.fmanager.input_data_iterator(input_data) # IFS input files path = ifs_files["path"] for dst, src in ifs_files["files"].items(): self.fmanager.input( f"{path}/{src}", dst, basetime=self.bd_basetime, validtime=as_datetime(self.bd_time), ) # Namelist self.nlgen.generate_namelist("c903_main", "fort.4") self.nlgen.generate_namelist("c903_domain", "namelist_c903_domain") # Run masterodb batch = BatchJob(os.environ, wrapper=self.wrapper) batch.run(self.master) # Store result target = f"{self.intp_bddir}/{self.bdfile_template}" self.fmanager.output("ELSCFMARS@FPDOMAIN@+0000", target) self.archive_logs(["fort.4", "namelist_c903_domain", "NODE.001_01"])