hydrogym.firedrake.flow
FlowConfig Objects
class FlowConfig(PDEBase)
DEFAULT_VELOCITY_ORDER
Taylor-Hood elements
FUNCTIONS
tuple of functions necessary for the flow
set_state
def set_state(q: fd.Function)
Set the current state fields
Arguments:
qfd.Function - State to be assigned
copy_state
def copy_state(deepcopy: bool = True) -> fd.Function
Return a copy of the current state fields
Returns:
qfd.Function - copy of the flow state
create_actuator
def create_actuator(tau=None) -> ActuatorBase
Create a single actuator for this flow
reset_controls
def reset_controls(function_spaces=None)
Reset the controls to a zero state
Note that this is broken out from reset because
the two are not necessarily called together (e.g.
for linearization or deriving the control vector)
TODO: Allow for different kinds of actuators
vorticity
def vorticity(u: fd.Function = None) -> fd.Function
Compute the vorticity field curl(u) of the flow
Arguments:
u (fd.Function, optional): If given, compute the vorticity of this velocity field rather than the current state.
Returns:
fd.Function- vorticity field
function_spaces
def function_spaces(mixed: bool = True)
Function spaces for velocity and pressure
Arguments:
mixed (bool, optional): If True (default), return subspaces of the mixed velocity/pressure space. Otherwise return the segregated velocity and pressure spaces.
Returns:
Tuple[fd.FunctionSpace, fd.FunctionSpace]: Velocity and pressure spaces
collect_bcu
def collect_bcu() -> Iterable[fd.DirichletBC]
List of velocity boundary conditions
collect_bcp
def collect_bcp() -> Iterable[fd.DirichletBC]
List of pressure boundary conditions
collect_bcs
def collect_bcs() -> Iterable[fd.DirichletBC]
List of all boundary conditions
epsilon
def epsilon(u) -> ufl.Form
Symmetric gradient (strain) tensor
sigma
def sigma(u, p) -> ufl.Form
Newtonian stress tensor
residual
def residual(q, q_test=None)
Nonlinear residual for the incompressible Navier-Stokes equations.
Returns a UFL form F(u, p, v, s) = 0, where (u, p) is the trial function and (v, s) is the test function. This residual is also the right-hand side of the unsteady equations.
A linearized form can be constructed by calling:
F = flow.residual((uB, pB), (v, s))
J = fd.derivative(F, qB, q_trial)
max_cfl
@pyadjoint.no_annotations
def max_cfl(dt) -> float
Estimate of maximum CFL number
linearize_bcs
def linearize_bcs()
Sets the boundary conditions appropriately for linearized flow
set_control
def set_control(act: ArrayLike = None)
Directly sets the control state
Note that for time-varying controls it will be better to adjust the controls
in the timestepper, e.g. with solver.step(iter, control=c). This could be used
to change control for a steady-state solve, for instance, and is also used
internally to compute the control matrix
inner_product
def inner_product(q1: fd.Function,
q2: fd.Function,
assemble=True,
augmented=False)
Energy inner product for the Navier-Stokes equations.
augmented is used to specify whether the function space is
extended to represent complex numbers. In this case the inner
product is the L2 norm of the real and imaginary parts.
velocity_probe
def velocity_probe(probes, q: fd.Function = None) -> list[float]
Probe velocity in the wake.
Returns a list of velocities at the probe locations, ordered as (u1, u2, ..., uN, v1, v2, ..., vN) where N is the number of probes.
pressure_probe
def pressure_probe(probes, q: fd.Function = None) -> list[float]
Probe pressure around the cylinder
vorticity_probe
def vorticity_probe(probes, q: fd.Function = None) -> list[float]
Probe vorticity in the wake.