20#ifndef LIBMESH_DIFF_SYSTEM_H
21#define LIBMESH_DIFF_SYSTEM_H
24#include "libmesh/diff_context.h"
25#include "libmesh/diff_physics.h"
26#include "libmesh/diff_qoi.h"
27#include "libmesh/implicit_system.h"
28#include "libmesh/time_solver.h"
40template <
typename T>
class NumericVector;
64 const std::string &
name,
65 const unsigned int number);
92 virtual void clear ()
override;
98 virtual void reinit ()
override;
123 virtual std::pair<unsigned int, Real>
138 bool apply_heterogeneous_constraints =
false,
139 bool apply_no_constraints =
false)
override = 0;
146 virtual void solve ()
override;
152 virtual std::pair<unsigned int, Real>
160 libmesh_not_implemented();
162 return std::unique_ptr<DifferentiablePhysics>(
nullptr);
168 virtual std::unique_ptr<DifferentiableQoI>
clone()
override
170 libmesh_not_implemented();
172 return std::unique_ptr<DifferentiableQoI>(
nullptr);
408#ifdef LIBMESH_ENABLE_DIRICHLET
433 std::stack<std::unique_ptr<DifferentiablePhysics>,
441 std::stack<std::unique_ptr<DifferentiableQoI>,
442 std::vector<std::unique_ptr<DifferentiableQoI>>>
_diff_qoi;
451 libmesh_assert_equal_to (&(
time_solver->system()),
this);
459 libmesh_assert_equal_to (&(
time_solver->system()),
this);
This class provides all data required for a physics package (e.g.
This class provides a specific system class.
virtual std::unique_ptr< DifferentiablePhysics > clone_physics()=0
Copy of this object.
This class provides a specific system class.
This class provides a specific system class.
unsigned int get_second_order_dot_var(unsigned int var) const
For a given second order (in time) variable var, this method will return the index to the correspondi...
virtual void postprocess()
Executes a postprocessing loop over all elements, and if postprocess_sides is true over all sides.
virtual std::unique_ptr< DifferentiablePhysics > clone_physics() override
We don't allow systems to be attached to each other.
bool print_jacobians
Set print_jacobians to true to print J whenever it is assembled.
virtual bool get_constrain_in_solver()
const DifferentiablePhysics * get_physics() const
bool postprocess_sides
If postprocess_sides is true (it is false by default), the postprocessing loop will loop over all sid...
bool print_residuals
Set print_residuals to true to print F whenever it is assembled.
ImplicitSystem Parent
The type of the parent.
DifferentiableSystem(DifferentiableSystem &&)=default
void pop_physics()
Pop a physics object off of our stack.
Real deltat
For time-dependent problems, this is the amount delta t to advance the solution in time.
std::stack< std::unique_ptr< DifferentiablePhysics >, std::vector< std::unique_ptr< DifferentiablePhysics > > > _diff_physics
Stack of pointers to objects to use for physics assembly evaluations.
virtual void set_constrain_in_solver(bool enable)
set_constrain_in_solver to false to apply constraints only via residual terms in the systems to be so...
bool have_second_order_scalar_vars() const
Check for any second order vars that are also belong to FEFamily::SCALAR.
void push_physics(DifferentiablePhysics &new_physics)
Push a clone of a new physics object onto our stack, overriding the current physics until the new phy...
std::stack< std::unique_ptr< DifferentiableQoI >, std::vector< std::unique_ptr< DifferentiableQoI > > > _diff_qoi
Pointer to object to use for quantity of interest assembly evaluations.
virtual void assembly(bool get_residual, bool get_jacobian, bool apply_heterogeneous_constraints=false, bool apply_no_constraints=false) override=0
Assembles a residual in rhs and/or a jacobian in matrix, as requested.
DifferentiableQoI * get_qoi()
DifferentiableSystem(const DifferentiableSystem &)=delete
Special functions.
DifferentiablePhysics * get_physics()
void set_time_solver(std::unique_ptr< TimeSolver > _time_solver)
Sets the time_solver FIXME: This code is a little dangerous as it transfers ownership from the TimeSo...
virtual ~DifferentiableSystem()
bool have_first_order_scalar_vars() const
Check for any first order vars that are also belong to FEFamily::SCALAR.
virtual std::unique_ptr< DifferentiableQoI > clone() override
We don't allow systems to be attached to each other.
void attach_qoi(DifferentiableQoI *qoi_in)
Attach external QoI object.
void add_second_order_dot_vars()
Helper function to add "velocity" variables that are cousins to second order-in-time variables in the...
bool print_element_jacobians
Set print_element_jacobians to true to print each J_elem contribution.
bool print_solution_norms
Set print_residual_norms to true to print |U| whenever it is used in an assembly() call.
virtual void element_postprocess(DiffContext &)
Does any work that needs to be done on elem in a postprocessing loop.
virtual LinearSolver< Number > * get_linear_solver() const override
bool _constrain_in_solver
_constrain_in_solver defaults to true; if false then we apply constraints only via residual terms in ...
bool print_solutions
Set print_solutions to true to print U whenever it is used in an assembly() call.
bool print_element_solutions
Set print_element_solutions to true to print each U_elem input.
bool print_residual_norms
Set print_residual_norms to true to print |F| whenever it is assembled.
virtual std::pair< unsigned int, Real > get_linear_solve_parameters() const override
DifferentiableSystem sys_type
The type of system.
virtual std::pair< unsigned int, Real > adjoint_solve(const QoISet &qoi_indices=QoISet()) override
This function sets the _is_adjoint boolean member of TimeSolver to true and then calls the adjoint_so...
TimeSolver & get_time_solver()
virtual void clear() override
Clear all the data structures associated with the system.
DifferentiableSystem & operator=(const DifferentiableSystem &)=delete
void add_dot_var_dirichlet_bcs(unsigned int var_idx, unsigned int dot_var_idx)
Helper function to and Dirichlet boundary conditions to "dot" variable cousins of second order variab...
void attach_physics(DifferentiablePhysics *physics_in)
Attach external Physics object.
virtual void init_data() override
Initializes the member data fields associated with the system, so that, e.g., assemble() may be used.
bool print_element_residuals
Set print_element_residuals to true to print each R_elem contribution.
virtual std::unique_ptr< DiffContext > build_context()
Builds a DiffContext object with enough information to do evaluations on each element.
bool print_jacobian_norms
Set print_jacobian_norms to true to print |J| whenever it is assembled.
std::unique_ptr< TimeSolver > time_solver
A pointer to the solver object we're going to use.
virtual void reinit() override
Reinitializes the member data fields associated with the system, so that, e.g., assemble() may be use...
const DifferentiableQoI * get_qoi() const
virtual void solve() override
Invokes the solver associated with the system.
virtual void assemble() override
Prepares matrix and rhs for matrix assembly.
virtual void side_postprocess(DiffContext &)
Does any work that needs to be done on side of elem in a postprocessing loop.
This is the EquationSystems class.
Manages consistently variables, degrees of freedom, coefficient vectors, and matrices for implicit sy...
This base class can be inherited from to provide interfaces to linear solvers from different packages...
Data structure for specifying which Quantities of Interest should be calculated in an adjoint or a pa...
const std::string & name() const
unsigned int number() const
This is a generic class that defines a solver to handle time integration of DifferentiableSystems.
The libMesh namespace provides an interface to certain functionality in the library.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real