Source code for fluidsimfoam.solvers.base
"""Base class for the ``sim`` object"""
from pathlib import Path
from time import sleep, time
from inflection import underscore
from fluiddyn.util import mpi # noqa: F401
from fluidsim_core.solver import SimulCore
from fluidsimfoam.log import logger
from fluidsimfoam.params import Parameters
[docs]class SimulFoam(SimulCore):
"""Base OpenFOAM Fluidsim solver."""
Parameters = Parameters
@classmethod
def _complete_params_with_default(cls, params):
pass
[docs] @classmethod
def create_default_params(cls):
# TODO: needed because abstract method in fluidsim-core=<0.7.2
params = super().create_default_params()
return params
def __init__(self, params):
super().__init__(params)
self._objects_to_print = "{:28s}{}\n".format("sim: ", type(self))
dict_classes = self.info_solver.import_classes()
# initialize objects
for cls_name, Class in dict_classes.items():
# only initialize if Class is not the Simul class
if isinstance(self, Class):
continue
obj_name = underscore(cls_name)
setattr(self, obj_name, Class(self))
self._objects_to_print += "{:28s}{}\n".format(
f"sim.{obj_name}: ", Class
)
if "Output" in dict_classes:
if not params.NEW_DIR_RESULTS:
self.path_run = self.output.path_run = Path(params.path_run)
else:
# path_run would be initialized by the Output instance if available
# See self.output._init_name_run()
self.path_run = Path(self.output.path_run)
self.output.post_init()
else:
self.path_run = None
if mpi.rank == 0:
logger.warning("No output class initialized!")
self.input_files = self.output.input_files
[docs] def stop_time_loop(self, stop_at="writeNow", verbose=True):
if verbose:
print("Telling OpenFOAM to stop... (overwrite controlDict file)")
t_stop = time()
ctr_dict = self.input_files.control_dict.read()
ctr_dict["stopAt"] = stop_at
ctr_dict.overwrite()
process = self.make.process
if process is None:
return
while process.poll() is None:
# touch needed (strange OpenFOAM bug?)
(self.path_run / "system/controlDict").touch()
sleep(0.05)
if verbose:
saved_directories = sorted(
path.name
for path in self.path_run.glob("*")
if path.name[0].isdigit()
)
print(f"\rsaved times {saved_directories}", end="")
if verbose:
print(
f"\nSimulation stopped {time() - t_stop:.2f} s "
f"after `stopAt = {stop_at}`"
)