Source code for pyleecan.Functions.Simulation.VarSimu.run_single_simu
from numpy import ndarray, min as np_min, max as np_max
from SciDataTool import VectorField, Data
[docs]def run_single_simu(
xoutput,
datakeeper_list,
simulation,
index,
stop_if_error,
ref_simu_index,
is_keep_all_output,
post_keeper_postproc_list=None,
):
"""
Execute a simulation and run datakeepers
Parameters:
-----------
xoutput: XOutput
Contains results
datakeeper_list
List of datakeeper to extract results
simulation: Simulation
Simulation to run
index: int
Index of the simulation
stop_if_error: bool
Raises an error if the simulation fails
ref_simu_index: tuple
Index of the reference simulation
is_keep_all_output: bool
store simulation output
post_keeper_postproc_list : list
list of postprocessing to run after the datakeeper
"""
if stop_if_error:
is_error = False
result = simulation.run()
else:
# Run simulation
try:
result = simulation.run()
is_error = False
except Exception as err:
print(err)
is_error = True
# Extract results
if is_keep_all_output:
xoutput.output_list.append(result)
# Datakeepers
if is_error:
# Execute error_keeper if error
for datakeeper in datakeeper_list:
if datakeeper.error_keeper is None:
xoutput.xoutput_dict[datakeeper.symbol].result[index] = None
else:
xoutput.xoutput_dict[datakeeper.symbol].result[
index
] = datakeeper.error_keeper(simulation)
else:
if index == ref_simu_index:
for attr in dir(result):
if (
# Not method
not callable(getattr(result, attr))
# Not private properties
and not attr.startswith("_")
# Not following properties
and attr not in ["VERSION", "logger_name", "parent"]
):
setattr(xoutput, attr, getattr(result, attr))
# DataKeeper
msg = "Results: "
for datakeeper in datakeeper_list:
# Run and store Datakeeper
xoutput.xoutput_dict[datakeeper.symbol].result[index] = datakeeper.keeper(
result
)
# Format log
if isinstance(
xoutput.xoutput_dict[datakeeper.symbol].result[index], ndarray
):
msg += (
datakeeper.symbol
+ "=array(min="
+ format(
np_min(xoutput.xoutput_dict[datakeeper.symbol].result[index]),
".8g",
)
+ ",max="
+ format(
np_max(xoutput.xoutput_dict[datakeeper.symbol].result[index]),
".8g",
)
+ ")"
)
elif isinstance(
xoutput.xoutput_dict[datakeeper.symbol].result[index], Data
) or isinstance(
xoutput.xoutput_dict[datakeeper.symbol].result[index], VectorField
):
msg += (
datakeeper.symbol
+ "="
+ type(
xoutput.xoutput_dict[datakeeper.symbol].result[index]
).__name__
)
else:
msg += (
datakeeper.symbol
+ "="
+ format(
xoutput.xoutput_dict[datakeeper.symbol].result[index], ".8g"
)
)
msg += ", "
msg = msg[:-2]
simulation.get_logger().info(msg)
# Run Post datakeeper post-processings
if post_keeper_postproc_list is not None:
for postproc in post_keeper_postproc_list:
postproc.run(result)