Source code for pycif.plugins.modes.response_functions.base_function.yaml_config
import os
from typing import Any, Union
from .....utils.yml import ordered_dump
from ..ref_forward import get_inicond_from_ref_forward
from .base_function import BaseFunction
from .base_function_batch import BaseFunctionSamplingBatch
# Aliases for type hinting
Mode = Any
ControlVect = Any
[docs]
def dump_yaml_config(
self: Mode,
base_function: Union[BaseFunction, BaseFunctionSamplingBatch],
) -> None:
"""Generates and dump a YAML configuration file for a base function
Args:
self (Mode): the mode plugin
base_function (BaseFunction or BaseFunctionSamplingBatch):
the base function or sampling batch of base functions
"""
# Creating directory
os.makedirs(base_function.rundir, exist_ok=True)
# Getting base configuration
yaml_file = self.reference_instances["reference_setup"].def_file
yaml_dict = self.from_yaml(yaml_file)
# Updating configuration
yaml_dict.update({
'workdir': base_function.rundir,
'datei': base_function.date_start,
'datef': base_function.date_end,
'mode': {
'plugin': {'name': "forward", 'version': "std"},
'run_mode': self.run_mode,
'use_xb': False
}
})
if self.use_batch_sampling:
assert isinstance(base_function, BaseFunctionSamplingBatch)
# Updating observation operator configuration
yaml_dict['obsoperator'].update({
'plugin': {'name': "standard", 'version': "std"},
'batch_computation': {
'nsamples': base_function.n_samples,
'dir_samples': base_function.rundir,
'file_samples': base_function.controlvect_filename,
'dont_propagate': base_function.dont_propagate,
}
})
if self.independant_parameters:
yaml_dict['model']['dont_perturb_species'] = \
[param for _, param in base_function.independant_obs]
yaml_dict['obsoperator']['batch_computation'][
'dont_propagate_obsvect'] = base_function.independant_obs
# Removing independant obs species from approximated operator check
if 'approx_operator' in yaml_dict['model']:
for _, spec in base_function.independant_obs:
if spec in yaml_dict['model']['approx_operator']['species_threshold']:
yaml_dict['model']['approx_operator'][
'species_threshold'].pop(spec)
if self.use_model_approximation:
yaml_dict['obsoperator'].update({'ref_fwd_dir': self.ref_fwd_dir})
# Updating observation vector configuration
yaml_dict['obsvect'].update({
'plugin': {'name': "standard", 'version': "std"},
'dir_obsvect': self.dir_obsvect,
'dump_type': "nc"
})
# Updating control vector configuration
yaml_dict['controlvect'].update({
'plugin': {'name': "standard", 'version': "std"},
'reload_xb': True,
'reload_file': base_function.controlvect_path
})
if self.run_mode == "tl" and base_function.date_start != self.datei:
# Initial datetime is not the main initial datetime, using initial
# condition file from the reference forward simulation
component, data = get_inicond_from_ref_forward(
self, base_function.date_start)
yaml_dict['datavect']['components'][component] = data
# Writing configuration file
with open(base_function.yaml_config_path, "w") as f:
ordered_dump(f, yaml_dict)