Simulation classes API¶
The simulation classes holds the simulation data (velocity, pressure, function spaces, mesh etc) and is also responsible for most utility functionality such as plugins (hooks), logging, reporting, plotting and input file handling.
-
class
ocellaris.
Simulation
¶ Bases:
object
Represents one Ocellaris simulation. The Simulation class connects the input file, geometry, mesh and more with the solver, results IO and reporting tools
-
input
¶ An
ocellaris.simulation.input.Input
object that holds the input from the input file provided by the user
-
io
¶ An
ocellaris.simulation.io.InputOutputHandling
object that holds supports writing VTK, XDMF, restart HDF5 files etc
-
hooks
¶ An
ocellaris.simulation.hooks.Hooks
object that keeps track of functions that should run at certain times during the simulation
-
reporting
¶ An
ocellaris.simulation.reporting.Reporting
object that helps report summary values each time step
-
log
¶ An
ocellaris.simulation.log.Log
object that helps with logging messages to screen while the simulation is running
-
data
a dictionary¶ In a typical simulation the
data
attribute will contain contents such as:Name
Value
boundary
boundary_marker
cell_info
connectivity_CC
connectivity_CF
connectivity_FC
constrained_domain
A SubDomain object that reporesents the periodic boundary conditions, or None if no periodic boundary conditions are applied
dirichlet_bcs
A dictionary of lists of boundary conditions {‘u0’: […], ‘p’: […], …}
ds
A measure of the boundaries that has been marked by the boundary conditions
facet_info
g
The acceleration of gravity (vector constant)
mesh
The FEniCS mesh object
neumann_bcs
A dictionary of lists of boundary conditions {‘u0’: […], ‘p’: […], …}
nu
The kinematic viscosity (constant or scalar valued function)
p
The pressure at the current time step
p_hat
The pressure correction used to get to the current time step
rho
The density (constant or scalar valued function)
u, u0, u1, u2
The velocity at the current time stepas a vector and as components
u_conv, u_conv0, u_conv1, u_conv2
The extrapolated convecting velocity at the current time step as a vector and as components
u_star, u_star0, u_star1, u_star2
The predicted velocity at the current time step as a vector and as components
up, up0, up1, up2
The velocity at the previous time step as a vector and as components
upp, upp0, upp1, upp2
The velocity at the previous-previous time step as a vector and as components
Vp
The function space of velocities
Vp
The function space of pressures
-
flush
(force=False)¶ Flush output files if an appropriate amount of time has passed. This ensures that flush can be called after important output without slowing down the solver too much with disk IO in case of many calls to flush in quick succession
-
get_data
(name)¶ Return a solver variable if one exists with the given name (p, u0, mesh, …) or a known field function if no solver variable with the given name exists.
Known field functions must be specified (as always) with forward slash separated field name and function name, e.g., “waves/c”
-
set_mesh
(mesh, mesh_facet_regions=None)¶ Set the computational domain
-
setup
()¶ Setup the simulation. This creates the .solver object as well as the mesh, boundary conditions, initial condition, function spaces, runtime post-processing probes, program and user defined hooks …
-
update_mesh_data
(connectivity_changed=True)¶ Some precomputed values must be calculated before the timestepping and updated every time the mesh changes
-
-
class
ocellaris.simulation.input.
Input
(simulation, values=None, basepath='')¶ Bases:
dict
Holds the input values provided by the user
-
ensure_path
(path)¶ Ensures that get_value(path) will succeed.
Returns the object at the given path.
-
get_input_file_path
(file_name)¶ Serch first relative to the current working dir and then relative to the input file dir
-
get_output_file_path
(path, default_value=<UNDEFINED>)¶ Get the name of an output file
Automatically prefixes the file name with the output prefix
-
get_value
(path, default_value=<UNDEFINED>, required_type='any', mpi_root_value=False, safe_mode=False, required_length=None)¶ Get an input value by its path in the input dictionary
Gives an error if there is no default value supplied and the input variable does not exist
- Parameters
path – a list of path components or the “/” separated path to the variable in the input dictionary
default_value – the value to return if the path does not exist in the input dictionary
required_type – expected type of the variable. Giving type=”any” does no type checking. Other options are “int”, “float”, “string”, “bool”, “Input”, “list(float)”, “dict(string:any)” etc
mpi_root_value – get the value on the root MPI process
safe_mode – do not evaluate python expressions “py$ xxx”
- Returns
The input value if it exist otherwise the default value
-
has_path
(path)¶ Checks if there is something (terminal or nested dict) at path
-
read_yaml
(file_name=None, yaml_string=None)¶ Read the input to an Ocellaris simulation from a YAML formated input file or a YAML formated string. The user will get an error if the input is malformed
-
set_value
(path, value)¶ Set an input value by its path in the input dictionary
- Parameters
path – a list of path components or the “/” separated path to the variable in the input dictionary
value – the value to set
-
validate_and_convert
(path, value, required_type='any', safe_mode=False, required_length=None)¶ Verify that the given value has an appropriate type. Returns the value if it is OK, else calls ocellaris_error
NOTE: returns copies of any mutable value type to avoid being able to change the input object by modifying the returned data
-
-
class
ocellaris.simulation.io.
InputOutputHandling
(simulation)¶ Bases:
object
This class handles reading and writing the simulation state such as velocity and presure fields. Files for postprocessing (xdmf) are also handled here
-
add_extra_output_function
(function)¶ The output files (XDMF) normally only contain u, p and potentially rho or c. Other custom fields can be added
-
add_plotter
(func, interval_inp_key, default_interval)¶ Add a plotting function which produces IO output every timestep
-
get_persisted_dict
(name)¶ Get dictionary that is persisted across program restarts by pickling the data when saving HDF5 restart files.
Only basic data types in the dictionary are persisted. Such data types are ints, floats, strings, booleans and containers such as lists, dictionaries, tuples and sets of these basic data types. All other data can be stored in the returned dictionary, but will not be persisted
-
is_restart_file
(file_name)¶ Is the given file an Ocellaris restart file
-
load_restart_file_functions
(h5_file_name)¶ Load only the Functions stored on the given restart file Returns a dictionary of functions, does not affect the Simulation object itself (for switching meshes etc.)
-
load_restart_file_input
(h5_file_name)¶ Load the input used in the given restart file
-
load_restart_file_results
(h5_file_name)¶ Load the results stored on the given restart file
-
setup
()¶
-
write_fields
()¶ Write fields to file after end of time step
-
write_restart_file
(h5_file_name=None)¶ Write a file that can be used to restart the simulation
-
-
class
ocellaris.simulation.hooks.
Hooks
(simulation)¶ Bases:
object
This class allows registering functions to run at given times during the simulation, e.g. to update some values for the next time step, report something after each time step or clean up after the simulation
-
add_custom_hook
(hook_point, hook, description)¶ Add other type of hook, must give a string name for the hook name
-
add_matrix_ready_hook
(hook, description)¶ Add a function that will run after matrix assembly
-
add_post_simulation_hook
(hook, description)¶ Add a function that will run after the simulation is done
-
add_post_timestep_hook
(hook, description, timer_name=None)¶ Add a function that will run after the solver in each time step
-
add_pre_simulation_hook
(hook, description)¶ Add a function that will run before the simulation starts
-
add_pre_timestep_hook
(hook, description, timer_name=None)¶ Add a function that will run before the solver in each time step
-
call_after
(callable, description, *args, **kwargs)¶ Call this after the current hook calls are done
-
end_timestep
()¶ Called by the solver at the end of a time step
Will run all post timestep hooks in the reverse order they have been added
-
matrix_ready
(Aname, A, b=None)¶ Called by the solver after assembly and before a linear solve. Can be used i.e for studies of condition numbers and reporting matrix sizes etc
-
new_timestep
(timestep_number, t, dt)¶ Called by the solver at the beginning of a new time step
Will run all pre timestep hooks in the reverse order they have been added
-
register_custom_hook_point
(hook_point)¶ Add a new custom hook points to which hooks can be added
-
run_custom_hook
(hook_point, *args, **kwargs)¶ Called by the solver at a custom point
Will run all custom hooks in the reverse order they have been added
-
show_hook_info
()¶ Show all registered hooks
-
simulation_ended
(success)¶ Called by the solver when the simulation is done
Will run all post simulation hooks in the reverse order they have been added
- Parameters
success – True if nothing went wrong, False for
solution and other problems (diverging) –
-
simulation_started
()¶ Called by the solver when the simulation starts
Will run all pre simulation hooks in the reverse order they have been added
-
-
class
ocellaris.simulation.reporting.
Reporting
(simulation)¶ Bases:
object
Central place to register reports that will be output during the simulation
-
get_report
(report_name)¶ Get a the time series of a reported value
-
log_timestep_reports
()¶ Write all reports for the finished time step to the log
-
report_timestep_value
(report_name, value)¶ Add a timestep to a report
-
setup_report_plotting
()¶ Setup the reports to be shown in plots during the simulation
-
-
class
ocellaris.simulation.log.
Log
(simulation)¶ Bases:
object
-
AVAILABLE_LOG_LEVELS
= {'all': 10000000000.0, 'critical': LogLevel.CRITICAL, 'debug': LogLevel.DEBUG, 'error': LogLevel.ERROR, 'info': LogLevel.INFO, 'progress': LogLevel.PROGRESS, 'warning': LogLevel.WARNING}¶
-
debug
(message='', flush=None)¶ Log a debug message
-
error
(message, flush=None)¶ Log an error message
-
flush
()¶ The simulation has started, flush to make sure input values are shown
or
The simulation is done. Make sure the output file is flushed, but keep it open in case some more output is coming
-
get_full_log
()¶ Get the contents of all logged messages as a string
-
info
(message='', flush=None)¶ Log an info message
-
set_log_level
(log_level)¶ Set the Ocellaris log level (not the dolfin log level!)
-
setup
()¶ Setup logging to file if requested in the simulation input
-
warning
(message='', flush=None)¶ Log a warning message
-
write
(message, msg_log_level=10000000000.0, color='%s', flush=None)¶ Write a message to the log without checking the log level
-