Source code for foxes.input.windio.runner
import yaml
from foxes.core import Algorithm
from foxes.output import Output
def _write_yaml(data, fpath):
""" Write the data to yaml """
rmap = {
"include": "!include",
}
with open(fpath, "w") as file:
yaml.dump(data, file)
with open(fpath, "r") as f:
s = f.read()
with open(fpath, 'w') as f:
for k1, k2 in rmap.items():
s = s.replace(k1, k2)
f.write(s)
[docs]
class WindioRunner:
"""
Runner for windio input
Attributes
----------
algo: foxes.core.Algorithm
The algorithm object
output_dir: pathlib.Path
Path to the output folder
output_dicts: list of dict
The output dictionaries
farm_results: xarray.Dataset
The farm results
output_results: list
The output results
wio_input_data: dict
The wind_energy_system windio input data
file_name_input_yaml: str
Name of the written input data file
file_name_output_yaml: str
Name of the written output data file
verbosity: int
The verbosity level, 0 = silent
:group: input.windio
"""
[docs]
def __init__(
self,
algo_dict,
output_dir=".",
output_dicts=[],
wio_input_data=None,
file_name_input_yaml="recorded_input.yaml",
file_name_output_yaml="recorded_output.yaml",
verbosity=1,
):
"""
Conbstructor
Parameters
----------
algo_dict: dict
The algorithm dictionary
output_dir: pathlib.Path
Path to the output folder
output_dicts: list of dict
The output dictionaries
wio_input_data: dict
The wind_energy_system windio input data
file_name_input_yaml: str
Name of the written input data file
file_name_output_yaml: str
Name of the written output data file
verbosity: int
The verbosity level, 0 = silent
"""
self.algo = algo_dict
self.output_dir = output_dir
self.output_dicts = output_dicts
self.wio_input_data = wio_input_data
self.file_name_input_yaml = file_name_input_yaml
self.file_name_output_yaml = file_name_output_yaml
self.verbosity = verbosity
self.farm_results = None
self.output_results = None
self.__initialized = False
self._output_yaml = {}
if wio_input_data is not None and len(wio_input_data):
fpath = output_dir/file_name_input_yaml
self.print(f"Writing file", fpath)
_write_yaml(wio_input_data, fpath)
self._output_yaml["wind_energy_system"] = f"include {file_name_input_yaml}"
[docs]
def print(self, *args, level=1, **kwargs):
"""Print based on verbosity"""
if self.verbosity >= level:
print(*args, **kwargs)
[docs]
def initialize(self):
"""Initializes the runner"""
if isinstance(self.algo, dict):
self.print(f"Creating algorithm '{self.algo['algo_type']}'", level=2)
self.algo = Algorithm.new(**self.algo)
if not self.algo.initialized:
self.algo.initialize()
self.__initialized = True
@property
def initialized(self):
"""Flag for initialization"""
return self.__initialized
[docs]
def run_farm_calc(self):
"""Runs the farm calculation"""
if not self.__initialized:
self.initialize()
self.print("Running farm_calc")
self.farm_results = self.algo.calc_farm()
[docs]
def run_outputs(self):
"""Runs the output calculation"""
self.output_results = []
for odict in self.output_dicts:
self.print("Running output:", odict["output_type"])
run_fname = odict.pop("run_func")
run_args = odict.pop("run_args", ())
run_kwargs = odict.pop("run_kwargs", {})
_odict = odict.copy()
if "output_yaml_update" in _odict:
self._output_yaml.update(_odict.pop("output_yaml_update"))
if _odict.pop("farm_results", False):
_odict["farm_results"] = self.farm_results
if _odict.pop("algo", False):
_odict["algo"] = self.algo
o = Output.new(**_odict)
f = getattr(o, run_fname)
self.output_results.append(f(*run_args, **run_kwargs))
fpath = self.output_dir/self.file_name_output_yaml
self.print(f"Writing file", fpath)
_write_yaml(self._output_yaml, fpath)
[docs]
def run(self):
"""Runs all calculations"""
self.run_farm_calc()
self.run_outputs()
[docs]
def finalize(self):
"""Initializes the runner"""
if self.algo.initialized:
self.algo.finalize(clear_mem=True)
self.algo = None
self.farm_results = None
self.output_results = None
self.__initialized = False
def __enter__(self):
self.initialize()
return self
def __exit__(self, *args):
self.finalize()