"""Validate independently usable 2D design/mesh cases."""
from pathlib import Path
import numpy as np
import yaml
[docs]
def read_configuration(config_file):
"""Read and validate geometry, mesh and workflow settings from the YAML."""
from .geometry import geometry_2d as geo
from .meshing import meshing_2d as msh
with Path(config_file).open(encoding="utf-8") as stream:
config = yaml.safe_load(stream)
if not isinstance(config, dict) or set(config) != {
"nozzle",
"blade",
"passage",
"mesh",
"workflow",
}:
raise ValueError(
"Configuration must contain nozzle, blade, passage, mesh, and workflow mappings."
)
if not all(isinstance(value, dict) for value in config.values()):
raise ValueError("Each configuration section must be a mapping.")
validate_workflow(config["workflow"])
passage = config["passage"]
for key in ("inlet_chords", "outlet_chords"):
if not np.isfinite(passage[key]) or passage[key] <= 0:
raise ValueError(f"passage.{key} must be finite and positive.")
geo.validate_domain_shift(
passage.get("domain_shift_mode", "manual"), passage.get("domain_shift", 0.0)
)
geo.validate_flow_domain_settings(passage.get("smooth", {}))
msh.validate_mesh_settings(config["mesh"])
return config
[docs]
def validate_workflow(workflow):
"""Reject invalid execution/figure controls before solving or opening viewers."""
if set(workflow) != {"generate_mesh", "geometry_figure", "reporting"}:
raise ValueError("workflow must define generate_mesh, geometry_figure and reporting.")
if type(workflow["generate_mesh"]) is not bool:
raise ValueError("workflow.generate_mesh must be true or false.")
validate_geometry_figure(workflow["geometry_figure"])
reporting = workflow["reporting"]
if not isinstance(reporting, dict) or set(reporting) != {"level", "filename"}:
raise ValueError("workflow.reporting must define level and filename.")
if reporting["level"] not in ("DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"):
raise ValueError("workflow.reporting.level must be DEBUG, INFO, WARNING, ERROR or CRITICAL.")
filename = reporting["filename"]
if (not isinstance(filename, str) or Path(filename).name != filename or
"/" in filename or "\\" in filename or not filename.endswith(".log")):
raise ValueError("workflow.reporting.filename must be a filename ending in .log.")