libMesh
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Protected Types | Protected Member Functions | Protected Attributes | Static Protected Attributes | List of all members
HeatSystem Class Reference

#include <heatsystem.h>

Inheritance diagram for HeatSystem:
[legend]

Public Types

typedef FEMSystem sys_type
 The type of system. More...
 
typedef DifferentiableSystem Parent
 The type of the parent. More...
 
typedef bool(TimeSolver::* TimeSolverResPtr) (bool, DiffContext &)
 Syntax sugar to make numerical_jacobian() declaration easier. More...
 
typedef Number(* ValueFunctionPointer) (const Point &p, const Parameters &Parameters, const std::string &sys_name, const std::string &unknown_name)
 Projects arbitrary functions onto the current solution. More...
 
typedef Gradient(* GradientFunctionPointer) (const Point &p, const Parameters &parameters, const std::string &sys_name, const std::string &unknown_name)
 
typedef std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> >::iterator vectors_iterator
 Vector iterator typedefs. More...
 
typedef std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> >::const_iterator const_vectors_iterator
 
typedef std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> >::iterator matrices_iterator
 Matrix iterator typedefs. More...
 
typedef std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> >::const_iterator const_matrices_iterator
 

Public Member Functions

 HeatSystem (EquationSystems &es, const std::string &name_in, const unsigned int number_in)
 
std::string & fe_family ()
 
unsigned intfe_order ()
 
Real & k ()
 
bool & analytic_jacobians ()
 
void perturb_accumulate_residuals (ParameterVector &parameters)
 
Number & compute_final_sensitivity ()
 
void set_tf (Real val)
 
ParameterVectorget_parameter_vector ()
 
Number & get_QoI_value (unsigned int QoI_index)
 
 HeatSystem (EquationSystems &es, const std::string &name_in, const unsigned int number_in)
 
Real & k ()
 
bool & analytic_jacobians ()
 
 HeatSystem (libMesh::EquationSystems &es, const std::string &name, const unsigned int number)
 
std::string & fe_family ()
 
unsigned intfe_order ()
 
virtual void assembly (bool get_residual, bool get_jacobian, bool apply_heterogeneous_constraints=false, bool apply_no_constraints=false) override
 Prepares matrix or rhs for matrix assembly. More...
 
virtual void solve () override
 Invokes the solver associated with the system. More...
 
void mesh_position_get ()
 Tells the FEMSystem to set the degree of freedom coefficients which should correspond to mesh nodal coordinates. More...
 
void mesh_position_set ()
 Tells the FEMSystem to set the mesh nodal coordinates which should correspond to degree of freedom coefficients. More...
 
virtual std::unique_ptr< DiffContextbuild_context () override
 Builds a FEMContext object with enough information to do evaluations on each element. More...
 
virtual void postprocess () override
 Runs a postprocessing loop over all elements, and if postprocess_sides is true over all sides. More...
 
virtual void assemble_qoi (const QoISet &indices=QoISet()) override
 Runs a qoi assembly loop over all elements, and if assemble_qoi_sides is true over all sides. More...
 
virtual void assemble_qoi_derivative (const QoISet &qoi_indices=QoISet(), bool include_liftfunc=true, bool apply_constraints=true) override
 Runs a qoi derivative assembly loop over all elements, and if assemble_qoi_sides is true over all sides. More...
 
Real numerical_jacobian_h_for_var (unsigned int var_num) const
 If numerical_jacobian_h_for_var(var_num) is changed from its default value (numerical_jacobian_h), the FEMSystem will perturb solution vector entries for variable var_num by that amount when calculating finite differences with respect to that variable. More...
 
void set_numerical_jacobian_h_for_var (unsigned int var_num, Real new_h)
 
void numerical_jacobian (TimeSolverResPtr res, FEMContext &context) const
 Uses the results of multiple res calls to numerically differentiate the corresponding jacobian. More...
 
void numerical_elem_jacobian (FEMContext &context) const
 Uses the results of multiple element_residual() calls to numerically differentiate the corresponding jacobian on an element. More...
 
void numerical_side_jacobian (FEMContext &context) const
 Uses the results of multiple side_residual() calls to numerically differentiate the corresponding jacobian on an element's side. More...
 
void numerical_nonlocal_jacobian (FEMContext &context) const
 Uses the results of multiple side_residual() calls to numerically differentiate the corresponding jacobian on nonlocal DoFs. More...
 
virtual void clear () override
 Clear all the data structures associated with the system. More...
 
virtual void reinit () override
 Reinitializes the member data fields associated with the system, so that, e.g., assemble() may be used. More...
 
virtual void assemble () override
 Prepares matrix and rhs for matrix assembly. More...
 
virtual LinearSolver< Number > * get_linear_solver () const override
 
virtual std::pair< unsigned int, Real > get_linear_solve_parameters () const override
 
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_solve in implicit system. More...
 
virtual std::unique_ptr< DifferentiablePhysicsclone_physics () override
 We don't allow systems to be attached to each other. More...
 
virtual std::unique_ptr< DifferentiableQoIclone () override
 We don't allow systems to be attached to each other. More...
 
const DifferentiablePhysicsget_physics () const
 
DifferentiablePhysicsget_physics ()
 
void attach_physics (DifferentiablePhysics *physics_in)
 Attach external Physics object. More...
 
void swap_physics (DifferentiablePhysics *&swap_physics)
 Swap current physics object with external object. More...
 
void push_physics (DifferentiablePhysics &new_physics)
 Push a clone of a new physics object onto our stack, overriding the current physics until the new physics is popped off again (or until something else is pushed on top of it). More...
 
void pop_physics ()
 Pop a physics object off of our stack. More...
 
const DifferentiableQoIget_qoi () const
 
DifferentiableQoIget_qoi ()
 
void attach_qoi (DifferentiableQoI *qoi_in)
 Attach external QoI object. More...
 
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 TimeSolver creator to this class. More...
 
TimeSolver & get_time_solver ()
 
const TimeSolver & get_time_solver () const
 Non-const version of the above. More...
 
virtual void element_postprocess (DiffContext &)
 Does any work that needs to be done on elem in a postprocessing loop. More...
 
virtual void side_postprocess (DiffContext &)
 Does any work that needs to be done on side of elem in a postprocessing loop. More...
 
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 corresponding "dot" variable. More...
 
bool have_first_order_scalar_vars () const
 Check for any first order vars that are also belong to FEFamily::SCALAR. More...
 
bool have_second_order_scalar_vars () const
 Check for any second order vars that are also belong to FEFamily::SCALAR. More...
 
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 solved. More...
 
virtual bool get_constrain_in_solver ()
 
sys_typesystem ()
 
virtual void disable_cache () override
 Avoids use of any cached data that might affect any solve result. More...
 
virtual std::string system_type () const override
 
virtual void release_linear_solver (LinearSolver< Number > *) const
 Currently a no-op. More...
 
virtual void assemble_residual_derivatives (const ParameterVector &parameters) override
 Residual parameter derivative function. More...
 
virtual std::pair< unsigned int, Real > sensitivity_solve (const ParameterVector &parameters) override
 Assembles & solves the linear system(s) (dR/du)*u_p = -dR/dp, for those parameters contained within parameters. More...
 
virtual std::pair< unsigned int, Real > weighted_sensitivity_solve (const ParameterVector &parameters, const ParameterVector &weights) override
 Assembles & solves the linear system(s) (dR/du)*u_w = sum(w_p*-dR/dp), for those parameters p contained within parameters weighted by the values w_p found within weights. More...
 
virtual std::pair< unsigned int, Real > weighted_sensitivity_adjoint_solve (const ParameterVector &parameters, const ParameterVector &weights, const QoISet &qoi_indices=QoISet()) override
 Assembles & solves the linear system(s) (dR/du)^T*z_w = sum(w_p*(d^2q/dudp - d^2R/dudp*z)), for those parameters p contained within parameters, weighted by the values w_p found within weights. More...
 
virtual void adjoint_qoi_parameter_sensitivity (const QoISet &qoi_indices, const ParameterVector &parameters, SensitivityData &sensitivities) override
 Solves for the derivative of each of the system's quantities of interest q in qoi[qoi_indices] with respect to each parameter in parameters, placing the result for qoi i and parameter j into sensitivities[i][j]. More...
 
virtual void forward_qoi_parameter_sensitivity (const QoISet &qoi_indices, const ParameterVector &parameters, SensitivityData &sensitivities) override
 Solves for the derivative of each of the system's quantities of interest q in qoi[qoi_indices] with respect to each parameter in parameters, placing the result for qoi i and parameter j into sensitivities[i][j]. More...
 
virtual void qoi_parameter_hessian (const QoISet &qoi_indices, const ParameterVector &parameters, SensitivityData &hessian) override
 For each of the system's quantities of interest q in qoi[qoi_indices], and for a vector of parameters p, the parameter sensitivity Hessian H_ij is defined as H_ij = (d^2 q)/(d p_i d p_j) This Hessian is the output of this method, where for each q_i, H_jk is stored in hessian.second_derivative(i,j,k). More...
 
virtual void qoi_parameter_hessian_vector_product (const QoISet &qoi_indices, const ParameterVector &parameters, const ParameterVector &vector, SensitivityData &product) override
 For each of the system's quantities of interest q in qoi[qoi_indices], and for a vector of parameters p, the parameter sensitivity Hessian H_ij is defined as H_ij = (d^2 q)/(d p_i d p_j) The Hessian-vector product, for a vector v_k in parameter space, is S_j = H_jk v_k This product is the output of this method, where for each q_i, S_j is stored in sensitivities[i][j]. More...
 
const SparseMatrix< Number > & get_system_matrix () const
 
SparseMatrix< Number > & get_system_matrix ()
 
void init ()
 Initializes degrees of freedom on the current mesh. More...
 
virtual void reinit_constraints ()
 Reinitializes the constraints for this system. More...
 
virtual void reinit_mesh ()
 Reinitializes the system with a new mesh. More...
 
bool is_initialized ()
 
virtual void update ()
 Update the local values to reflect the solution on neighboring processors. More...
 
virtual void restrict_solve_to (const SystemSubset *subset, const SubsetSolveMode subset_solve_mode=SUBSET_ZERO)
 After calling this method, any solve will be restricted to the given subdomain. More...
 
bool is_adjoint_already_solved () const
 Accessor for the adjoint_already_solved boolean. More...
 
void set_adjoint_already_solved (bool setting)
 Setter for the adjoint_already_solved boolean. More...
 
virtual void qoi_parameter_sensitivity (const QoISet &qoi_indices, const ParameterVector &parameters, SensitivityData &sensitivities)
 Solves for the derivative of each of the system's quantities of interest q in qoi[qoi_indices] with respect to each parameter in parameters, placing the result for qoi i and parameter j into sensitivities[i][j]. More...
 
virtual bool compare (const System &other_system, const Real threshold, const bool verbose) const
 
const std::string & name () const
 
void project_solution (FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr) const
 Projects arbitrary functions onto the current solution. More...
 
void project_solution (FEMFunctionBase< Number > *f, FEMFunctionBase< Gradient > *g=nullptr) const
 Projects arbitrary functions onto the current solution. More...
 
void project_solution (ValueFunctionPointer fptr, GradientFunctionPointer gptr, const Parameters &parameters) const
 This method projects an arbitrary function onto the solution via L2 projections and nodal interpolations on each element. More...
 
void project_vector (NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1) const
 Projects arbitrary functions onto a vector of degree of freedom values for the current system. More...
 
void project_vector (NumericVector< Number > &new_vector, FEMFunctionBase< Number > *f, FEMFunctionBase< Gradient > *g=nullptr, int is_adjoint=-1) const
 Projects arbitrary functions onto a vector of degree of freedom values for the current system. More...
 
void project_vector (ValueFunctionPointer fptr, GradientFunctionPointer gptr, const Parameters &parameters, NumericVector< Number > &new_vector, int is_adjoint=-1) const
 Projects arbitrary functions onto a vector of degree of freedom values for the current system. More...
 
void boundary_project_solution (const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr)
 Projects arbitrary boundary functions onto a vector of degree of freedom values for the current system. More...
 
void boundary_project_solution (const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, ValueFunctionPointer fptr, GradientFunctionPointer gptr, const Parameters &parameters)
 Projects arbitrary boundary functions onto a vector of degree of freedom values for the current system. More...
 
void boundary_project_vector (const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1) const
 Projects arbitrary boundary functions onto a vector of degree of freedom values for the current system. More...
 
void boundary_project_vector (const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, ValueFunctionPointer fptr, GradientFunctionPointer gptr, const Parameters &parameters, NumericVector< Number > &new_vector, int is_adjoint=-1) const
 Projects arbitrary boundary functions onto a vector of degree of freedom values for the current system. More...
 
unsigned int number () const
 
void update_global_solution (std::vector< Number > &global_soln) const
 Fill the input vector global_soln so that it contains the global solution on all processors. More...
 
void update_global_solution (std::vector< Number > &global_soln, const processor_id_type dest_proc) const
 Fill the input vector global_soln so that it contains the global solution on processor dest_proc. More...
 
const MeshBase & get_mesh () const
 
MeshBase & get_mesh ()
 
const DofMap & get_dof_map () const
 
DofMap & get_dof_map ()
 
const EquationSystems & get_equation_systems () const
 
EquationSystems & get_equation_systems ()
 
bool active () const
 
void activate ()
 Activates the system. More...
 
void deactivate ()
 Deactivates the system. More...
 
void set_basic_system_only ()
 Sets the system to be "basic only": i.e. More...
 
vectors_iterator vectors_begin ()
 Beginning of vectors container. More...
 
const_vectors_iterator vectors_begin () const
 Beginning of vectors container. More...
 
vectors_iterator vectors_end ()
 End of vectors container. More...
 
const_vectors_iterator vectors_end () const
 End of vectors container. More...
 
NumericVector< Number > & add_vector (std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
 Adds the additional vector vec_name to this system. More...
 
void remove_vector (std::string_view vec_name)
 Removes the additional vector vec_name from this system. More...
 
bool & project_solution_on_reinit (void)
 Tells the System whether or not to project the solution vector onto new grids when the system is reinitialized. More...
 
bool have_vector (std::string_view vec_name) const
 
const NumericVector< Number > * request_vector (std::string_view vec_name) const
 
NumericVector< Number > * request_vector (std::string_view vec_name)
 
const NumericVector< Number > * request_vector (const unsigned int vec_num) const
 
NumericVector< Number > * request_vector (const unsigned int vec_num)
 
const NumericVector< Number > & get_vector (std::string_view vec_name) const
 
NumericVector< Number > & get_vector (std::string_view vec_name)
 
const NumericVector< Number > & get_vector (const unsigned int vec_num) const
 
NumericVector< Number > & get_vector (const unsigned int vec_num)
 
const std::string & vector_name (const unsigned int vec_num) const
 
const std::string & vector_name (const NumericVector< Number > &vec_reference) const
 
void set_vector_as_adjoint (const std::string &vec_name, int qoi_num)
 Allows one to set the QoI index controlling whether the vector identified by vec_name represents a solution from the adjoint (qoi_num >= 0) or primal (qoi_num == -1) space. More...
 
int vector_is_adjoint (std::string_view vec_name) const
 
void set_vector_preservation (const std::string &vec_name, bool preserve)
 Allows one to set the boolean controlling whether the vector identified by vec_name should be "preserved": projected to new meshes, saved, etc. More...
 
bool vector_preservation (std::string_view vec_name) const
 
NumericVector< Number > & add_adjoint_solution (unsigned int i=0)
 
NumericVector< Number > & get_adjoint_solution (unsigned int i=0)
 
const NumericVector< Number > & get_adjoint_solution (unsigned int i=0) const
 
NumericVector< Number > & add_sensitivity_solution (unsigned int i=0)
 
NumericVector< Number > & get_sensitivity_solution (unsigned int i=0)
 
const NumericVector< Number > & get_sensitivity_solution (unsigned int i=0) const
 
NumericVector< Number > & add_weighted_sensitivity_adjoint_solution (unsigned int i=0)
 
NumericVector< Number > & get_weighted_sensitivity_adjoint_solution (unsigned int i=0)
 
const NumericVector< Number > & get_weighted_sensitivity_adjoint_solution (unsigned int i=0) const
 
NumericVector< Number > & add_weighted_sensitivity_solution ()
 
NumericVector< Number > & get_weighted_sensitivity_solution ()
 
const NumericVector< Number > & get_weighted_sensitivity_solution () const
 
NumericVector< Number > & add_adjoint_rhs (unsigned int i=0)
 
NumericVector< Number > & get_adjoint_rhs (unsigned int i=0)
 
const NumericVector< Number > & get_adjoint_rhs (unsigned int i=0) const
 
NumericVector< Number > & add_sensitivity_rhs (unsigned int i=0)
 
NumericVector< Number > & get_sensitivity_rhs (unsigned int i=0)
 
const NumericVector< Number > & get_sensitivity_rhs (unsigned int i=0) const
 
unsigned int n_vectors () const
 
unsigned int n_matrices () const
 
unsigned int n_vars () const
 
unsigned int n_variable_groups () const
 
unsigned int n_components () const
 
dof_id_type n_dofs () const
 
dof_id_type n_active_dofs () const
 
dof_id_type n_constrained_dofs () const
 
dof_id_type n_local_constrained_dofs () const
 
dof_id_type n_local_dofs () const
 
unsigned int add_variable (std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
 Adds the variable var to the list of variables for this system. More...
 
unsigned int add_variable (std::string_view var, const Order order=FIRST, const FEFamily=LAGRANGE, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
 Adds the variable var to the list of variables for this system. More...
 
unsigned int add_variables (const std::vector< std::string > &vars, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
 Adds the variable var to the list of variables for this system. More...
 
unsigned int add_variables (const std::vector< std::string > &vars, const Order order=FIRST, const FEFamily=LAGRANGE, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
 Adds the variable var to the list of variables for this system. More...
 
const Variable & variable (unsigned int var) const
 Return a constant reference to Variable var. More...
 
const VariableGroup & variable_group (unsigned int vg) const
 Return a constant reference to VariableGroup vg. More...
 
bool has_variable (std::string_view var) const
 
const std::string & variable_name (const unsigned int i) const
 
unsigned int variable_number (std::string_view var) const
 
void get_all_variable_numbers (std::vector< unsigned int > &all_variable_numbers) const
 Fills all_variable_numbers with all the variable numbers for the variables that have been added to this system. More...
 
unsigned int variable_scalar_number (std::string_view var, unsigned int component) const
 
unsigned int variable_scalar_number (unsigned int var_num, unsigned int component) const
 
const FEType & variable_type (const unsigned int i) const
 
const FEType & variable_type (std::string_view var) const
 
bool identify_variable_groups () const
 
void identify_variable_groups (const bool)
 Toggle automatic VariableGroup identification. More...
 
Real calculate_norm (const NumericVector< Number > &v, unsigned int var, FEMNormType norm_type, std::set< unsigned int > *skip_dimensions=nullptr) const
 
Real calculate_norm (const NumericVector< Number > &v, const SystemNorm &norm, std::set< unsigned int > *skip_dimensions=nullptr) const
 
void read_header (Xdr &io, std::string_view version, const bool read_header=true, const bool read_additional_data=true, const bool read_legacy_format=false)
 Reads the basic data header for this System. More...
 
void read_legacy_data (Xdr &io, const bool read_additional_data=true)
 Reads additional data, namely vectors, for this System. More...
 
template<typename ValType >
void read_serialized_data (Xdr &io, const bool read_additional_data=true)
 Reads additional data, namely vectors, for this System. More...
 
void read_serialized_data (Xdr &io, const bool read_additional_data=true)
 Non-templated version for backward compatibility. More...
 
template<typename InValType >
std::size_t read_serialized_vectors (Xdr &io, const std::vector< NumericVector< Number > *> &vectors) const
 Read a number of identically distributed vectors. More...
 
std::size_t read_serialized_vectors (Xdr &io, const std::vector< NumericVector< Number > *> &vectors) const
 Non-templated version for backward compatibility. More...
 
template<typename InValType >
void read_parallel_data (Xdr &io, const bool read_additional_data)
 Reads additional data, namely vectors, for this System. More...
 
void read_parallel_data (Xdr &io, const bool read_additional_data)
 Non-templated version for backward compatibility. More...
 
void write_header (Xdr &io, std::string_view version, const bool write_additional_data) const
 Writes the basic data header for this System. More...
 
void write_serialized_data (Xdr &io, const bool write_additional_data=true) const
 Writes additional data, namely vectors, for this System. More...
 
std::size_t write_serialized_vectors (Xdr &io, const std::vector< const NumericVector< Number > *> &vectors) const
 Serialize & write a number of identically distributed vectors. More...
 
void write_parallel_data (Xdr &io, const bool write_additional_data) const
 Writes additional data, namely vectors, for this System. More...
 
std::string get_info () const
 
void attach_init_function (void fptr(EquationSystems &es, const std::string &name))
 Register a user function to use in initializing the system. More...
 
void attach_init_object (Initialization &init)
 Register a user class to use to initialize the system. More...
 
void attach_assemble_function (void fptr(EquationSystems &es, const std::string &name))
 Register a user function to use in assembling the system matrix and RHS. More...
 
void attach_assemble_object (Assembly &assemble)
 Register a user object to use in assembling the system matrix and RHS. More...
 
void attach_constraint_function (void fptr(EquationSystems &es, const std::string &name))
 Register a user function for imposing constraints. More...
 
void attach_constraint_object (Constraint &constrain)
 Register a user object for imposing constraints. More...
 
bool has_constraint_object () const
 
Constraintget_constraint_object ()
 Return the user object for imposing constraints. More...
 
void attach_QOI_function (void fptr(EquationSystems &es, const std::string &name, const QoISet &qoi_indices))
 Register a user function for evaluating the quantities of interest, whose values should be placed in System::qoi. More...
 
void attach_QOI_object (QOI &qoi)
 Register a user object for evaluating the quantities of interest, whose values should be placed in System::qoi. More...
 
void attach_QOI_derivative (void fptr(EquationSystems &es, const std::string &name, const QoISet &qoi_indices, bool include_liftfunc, bool apply_constraints))
 Register a user function for evaluating derivatives of a quantity of interest with respect to test functions, whose values should be placed in System::rhs. More...
 
void attach_QOI_derivative_object (QOIDerivative &qoi_derivative)
 Register a user object for evaluating derivatives of a quantity of interest with respect to test functions, whose values should be placed in System::rhs. More...
 
virtual void user_initialization ()
 Calls user's attached initialization function, or is overridden by the user in derived classes. More...
 
virtual void user_assembly ()
 Calls user's attached assembly function, or is overridden by the user in derived classes. More...
 
virtual void user_constrain ()
 Calls user's attached constraint function, or is overridden by the user in derived classes. More...
 
virtual void user_QOI (const QoISet &qoi_indices)
 Calls user's attached quantity of interest function, or is overridden by the user in derived classes. More...
 
virtual void user_QOI_derivative (const QoISet &qoi_indices=QoISet(), bool include_liftfunc=true, bool apply_constraints=true)
 Calls user's attached quantity of interest derivative function, or is overridden by the user in derived classes. More...
 
virtual void re_update ()
 Re-update the local values when the mesh has changed. More...
 
virtual void restrict_vectors ()
 Restrict vectors after the mesh has coarsened. More...
 
virtual void prolong_vectors ()
 Prolong vectors after the mesh has refined. More...
 
Number current_solution (const dof_id_type global_dof_number) const
 
unsigned int n_qois () const
 Number of currently active quantities of interest. More...
 
void init_qois (unsigned int n_qois)
 Accessors for qoi and qoi_error_estimates vectors. More...
 
void set_qoi (unsigned int qoi_index, Number qoi_value)
 
void set_qoi (std::vector< Number > new_qoi)
 
Number get_qoi_value (unsigned int qoi_index) const
 
std::vector< Number > get_qoi_values () const
 Returns a copy of qoi, not a reference. More...
 
void set_qoi_error_estimate (unsigned int qoi_index, Number qoi_error_estimate)
 
Number get_qoi_error_estimate_value (unsigned int qoi_index) const
 
Number point_value (unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
 
Number point_value (unsigned int var, const Point &p, const Elem &e, const NumericVector< Number > *sol=nullptr) const
 
Number point_value (unsigned int var, const Point &p, const Elem *e) const
 Calls the version of point_value() which takes a reference. More...
 
Number point_value (unsigned int var, const Point &p, const NumericVector< Number > *sol) const
 Calls the parallel version of point_value(). More...
 
Gradient point_gradient (unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
 
Gradient point_gradient (unsigned int var, const Point &p, const Elem &e, const NumericVector< Number > *sol=nullptr) const
 
Gradient point_gradient (unsigned int var, const Point &p, const Elem *e) const
 Calls the version of point_gradient() which takes a reference. More...
 
Gradient point_gradient (unsigned int var, const Point &p, const NumericVector< Number > *sol) const
 Calls the parallel version of point_gradient(). More...
 
Tensor point_hessian (unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
 
Tensor point_hessian (unsigned int var, const Point &p, const Elem &e, const NumericVector< Number > *sol=nullptr) const
 
Tensor point_hessian (unsigned int var, const Point &p, const Elem *e) const
 Calls the version of point_hessian() which takes a reference. More...
 
Tensor point_hessian (unsigned int var, const Point &p, const NumericVector< Number > *sol) const
 Calls the parallel version of point_hessian(). More...
 
void local_dof_indices (const unsigned int var, std::set< dof_id_type > &var_indices) const
 Fills the std::set with the degrees of freedom on the local processor corresponding the the variable number passed in. More...
 
void zero_variable (NumericVector< Number > &v, unsigned int var_num) const
 Zeroes all dofs in v that correspond to variable number var_num. More...
 
bool get_project_with_constraints ()
 Setter and getter functions for project_with_constraints boolean. More...
 
void set_project_with_constraints (bool _project_with_constraints)
 
bool & hide_output ()
 
void projection_matrix (SparseMatrix< Number > &proj_mat) const
 This method creates a projection matrix which corresponds to the operation of project_vector between old and new solution spaces. More...
 
SparseMatrix< Number > & add_matrix (std::string_view mat_name, ParallelType type=PARALLEL, MatrixBuildType mat_build_type=MatrixBuildType::AUTOMATIC)
 Adds the additional matrix mat_name to this system. More...
 
template<template< typename > class>
SparseMatrix< Number > & add_matrix (std::string_view mat_name, ParallelType=PARALLEL)
 Adds the additional matrix mat_name to this system. More...
 
void remove_matrix (std::string_view mat_name)
 Removes the additional matrix mat_name from this system. More...
 
bool have_matrix (std::string_view mat_name) const
 
const SparseMatrix< Number > * request_matrix (std::string_view mat_name) const
 
SparseMatrix< Number > * request_matrix (std::string_view mat_name)
 
const SparseMatrix< Number > & get_matrix (std::string_view mat_name) const
 
SparseMatrix< Number > & get_matrix (std::string_view mat_name)
 
const Parallel::Communicator & comm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 
virtual void clear_physics ()
 Clear any data structures associated with the physics. More...
 
virtual void init_physics (const System &sys)
 Initialize any data structures associated with the physics. More...
 
virtual bool element_constraint (bool request_jacobian, DiffContext &)
 Adds the constraint contribution on elem to elem_residual. More...
 
virtual bool side_time_derivative (bool request_jacobian, DiffContext &)
 Adds the time derivative contribution on side of elem to elem_residual. More...
 
virtual bool side_constraint (bool request_jacobian, DiffContext &)
 Adds the constraint contribution on side of elem to elem_residual. More...
 
virtual bool nonlocal_time_derivative (bool request_jacobian, DiffContext &)
 Adds any nonlocal time derivative contributions (e.g. More...
 
virtual bool nonlocal_constraint (bool request_jacobian, DiffContext &)
 Adds any nonlocal constraint contributions (e.g. More...
 
virtual void time_evolving (unsigned int var, unsigned int order)
 Tells the DiffSystem that variable var is evolving with respect to time. More...
 
bool is_time_evolving (unsigned int var) const
 
virtual bool eulerian_residual (bool request_jacobian, DiffContext &)
 Adds a pseudo-convection contribution on elem to elem_residual, if the nodes of elem are being translated by a moving mesh. More...
 
virtual bool eulerian_residual (bool request_jacobian, DiffContext &context) override
 Adds a pseudo-convection contribution on elem to elem_residual, if the nodes of elem are being translated by a moving mesh. More...
 
virtual bool mass_residual (bool request_jacobian, DiffContext &)
 Subtracts a mass vector contribution on elem from elem_residual. More...
 
virtual bool mass_residual (bool request_jacobian, DiffContext &) override
 Subtracts a mass vector contribution on elem from elem_residual. More...
 
virtual bool side_mass_residual (bool request_jacobian, DiffContext &)
 Subtracts a mass vector contribution on side of elem from elem_residual. More...
 
virtual bool nonlocal_mass_residual (bool request_jacobian, DiffContext &c)
 Subtracts any nonlocal mass vector contributions (e.g. More...
 
virtual bool damping_residual (bool request_jacobian, DiffContext &)
 Subtracts a damping vector contribution on elem from elem_residual. More...
 
virtual bool side_damping_residual (bool request_jacobian, DiffContext &)
 Subtracts a damping vector contribution on side of elem from elem_residual. More...
 
virtual bool nonlocal_damping_residual (bool request_jacobian, DiffContext &)
 Subtracts any nonlocal damping vector contributions (e.g. More...
 
virtual void set_mesh_system (System *sys)
 Tells the DifferentiablePhysics that system sys contains the isoparametric Lagrangian variables which correspond to the coordinates of mesh nodes, in problems where the mesh itself is expected to move in time. More...
 
const Systemget_mesh_system () const
 
Systemget_mesh_system ()
 
virtual void set_mesh_x_var (unsigned int var)
 Tells the DifferentiablePhysics that variable var from the mesh system should be used to update the x coordinate of mesh nodes, in problems where the mesh itself is expected to move in time. More...
 
unsigned int get_mesh_x_var () const
 
virtual void set_mesh_y_var (unsigned int var)
 Tells the DifferentiablePhysics that variable var from the mesh system should be used to update the y coordinate of mesh nodes. More...
 
unsigned int get_mesh_y_var () const
 
virtual void set_mesh_z_var (unsigned int var)
 Tells the DifferentiablePhysics that variable var from the mesh system should be used to update the z coordinate of mesh nodes. More...
 
unsigned int get_mesh_z_var () const
 
bool _eulerian_time_deriv (bool request_jacobian, DiffContext &)
 This method simply combines element_time_derivative() and eulerian_residual(), which makes its address useful as a pointer-to-member-function when refactoring. More...
 
bool have_first_order_vars () const
 
const std::set< unsigned int > & get_first_order_vars () const
 
bool is_first_order_var (unsigned int var) const
 
bool have_second_order_vars () const
 
const std::set< unsigned int > & get_second_order_vars () const
 
bool is_second_order_var (unsigned int var) const
 
virtual void init_qoi (std::vector< Number > &)
 Initialize system qoi. More...
 
void init_qoi (std::vector< Number > &)
 Non-virtual, to try to help deprecated user code catch this change at compile time (if they specified override) More...
 
virtual void init_qoi_count (System &)
 Initialize system qoi. More...
 
virtual void clear_qoi ()
 Clear all the data structures associated with the QoI. More...
 
virtual void side_qoi (DiffContext &, const QoISet &)
 Does any work that needs to be done on side of elem in a quantity of interest assembly loop, outputting to elem_qoi. More...
 
virtual void side_qoi_derivative (DiffContext &, const QoISet &)
 Does any work that needs to be done on side of elem in a quantity of interest derivative assembly loop, outputting to elem_qoi_derivative. More...
 
virtual void thread_join (std::vector< Number > &qoi, const std::vector< Number > &other_qoi, const QoISet &qoi_indices)
 Method to combine thread-local qois. More...
 
virtual void parallel_op (const Parallel::Communicator &communicator, std::vector< Number > &sys_qoi, std::vector< Number > &local_qoi, const QoISet &qoi_indices)
 Method to populate system qoi data structure with process-local qoi. More...
 
virtual void finalize_derivative (NumericVector< Number > &derivatives, std::size_t qoi_index)
 Method to finalize qoi derivatives which require more than just a simple sum of element contributions. More...
 

Static Public Member Functions

static std::string get_info ()
 Gets a string containing the reference information. More...
 
static void print_info (std::ostream &out_stream=libMesh::out)
 Prints the reference information, by default to libMesh::out. More...
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects. More...
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info() More...
 
static void disable_print_counter_info ()
 

Public Attributes

std::vector< Real > QoI_time_instant
 
bool fe_reinit_during_postprocess
 If fe_reinit_during_postprocess is true (it is true by default), FE objects will be reinit()ed with their default quadrature rules. More...
 
Real numerical_jacobian_h
 If calculating numeric jacobians is required, the FEMSystem will perturb each solution vector entry by numerical_jacobian_h when calculating finite differences. More...
 
Real verify_analytic_jacobians
 If verify_analytic_jacobian is equal to zero (as it is by default), no numeric jacobians will be calculated unless an overridden element_time_derivative(), element_constraint(), side_time_derivative(), or side_constraint() function cannot provide an analytic jacobian upon request. More...
 
std::unique_ptr< TimeSolver > time_solver
 A pointer to the solver object we're going to use. More...
 
Real deltat
 For time-dependent problems, this is the amount delta t to advance the solution in time. More...
 
bool postprocess_sides
 If postprocess_sides is true (it is false by default), the postprocessing loop will loop over all sides as well as all elements. More...
 
bool print_solution_norms
 Set print_residual_norms to true to print |U| whenever it is used in an assembly() call. More...
 
bool print_solutions
 Set print_solutions to true to print U whenever it is used in an assembly() call. More...
 
bool print_residual_norms
 Set print_residual_norms to true to print |F| whenever it is assembled. More...
 
bool print_residuals
 Set print_residuals to true to print F whenever it is assembled. More...
 
bool print_jacobian_norms
 Set print_jacobian_norms to true to print |J| whenever it is assembled. More...
 
bool print_jacobians
 Set print_jacobians to true to print J whenever it is assembled. More...
 
bool print_element_solutions
 Set print_element_solutions to true to print each U_elem input. More...
 
bool print_element_residuals
 Set print_element_residuals to true to print each R_elem contribution. More...
 
bool print_element_jacobians
 Set print_element_jacobians to true to print each J_elem contribution. More...
 
SparseMatrix< Number > * matrix
 The system matrix. More...
 
bool zero_out_matrix_and_rhs
 By default, the system will zero out the matrix and the right hand side. More...
 
std::unique_ptr< LinearSolver< Number > > linear_solver
 This class handles all the details of interfacing with various linear algebra packages like PETSc or LASPACK. More...
 
NumericVector< Number > * rhs
 The system matrix. More...
 
bool assemble_before_solve
 Flag which tells the system to whether or not to call the user assembly function during each call to solve(). More...
 
bool use_fixed_solution
 A boolean to be set to true by systems using elem_fixed_solution, for optional use by e.g. More...
 
int extra_quadrature_order
 A member int that can be employed to indicate increased or reduced quadrature order. More...
 
std::unique_ptr< NumericVector< Number > > solution
 Data structure to hold solution values. More...
 
std::unique_ptr< NumericVector< Number > > current_local_solution
 All the values I need to compute my contribution to the simulation at hand. More...
 
Real time
 For time-dependent problems, this is the time t at the beginning of the current timestep. More...
 
bool compute_internal_sides
 compute_internal_sides is false by default, indicating that side_* computations will only be done on boundary sides. More...
 
bool assemble_qoi_sides
 If assemble_qoi_sides is true (it is false by default), the assembly loop for a quantity of interest or its derivatives will loop over domain boundary sides. More...
 
bool assemble_qoi_internal_sides
 If assemble_qoi_internal_sides is true (it is false by default), the assembly loop for a quantity of interest or its derivatives will loop over element sides which do not fall on domain boundaries. More...
 
bool assemble_qoi_elements
 If assemble_qoi_elements is false (it is true by default), the assembly loop for a quantity of interest or its derivatives will skip computing on mesh elements, and will only compute on mesh sides. More...
 

Protected Types

typedef std::map< std::string, std::pair< unsigned int, unsigned int > > Counts
 Data structure to log the information. More...
 

Protected Member Functions

virtual void init_data ()
 Initializes the member data fields associated with the system, so that, e.g., assemble() may be used. More...
 
virtual void init_context (DiffContext &context)
 
virtual bool element_time_derivative (bool request_jacobian, DiffContext &context)
 Adds the time derivative contribution on elem to elem_residual. More...
 
virtual void element_qoi_derivative (DiffContext &context, const QoISet &)
 Does any work that needs to be done on elem in a quantity of interest derivative assembly loop, outputting to elem_qoi_derivative. More...
 
virtual void init_data ()
 Initializes the member data fields associated with the system, so that, e.g., assemble() may be used. More...
 
virtual void init_context (DiffContext &context)
 
virtual bool element_time_derivative (bool request_jacobian, DiffContext &context)
 Adds the time derivative contribution on elem to elem_residual. More...
 
virtual void element_qoi (DiffContext &context, const QoISet &qois)
 Does any work that needs to be done on elem in a quantity of interest assembly loop, outputting to elem_qoi. More...
 
virtual void element_qoi_derivative (DiffContext &context, const QoISet &)
 Does any work that needs to be done on elem in a quantity of interest derivative assembly loop, outputting to elem_qoi_derivative. More...
 
virtual void init_data ()
 Initializes the member data fields associated with the system, so that, e.g., assemble() may be used. More...
 
virtual void init_context (libMesh::DiffContext &context)
 
virtual bool element_time_derivative (bool request_jacobian, libMesh::DiffContext &context)
 Adds the time derivative contribution on elem to elem_residual. More...
 
void add_second_order_dot_vars ()
 Helper function to add "velocity" variables that are cousins to second order-in-time variables in the DifferentiableSystem. More...
 
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 variables in the system. More...
 
virtual void add_matrices () override
 Adds the system matrix. More...
 
void project_vector (NumericVector< Number > &, int is_adjoint=-1) const
 Projects the vector defined on the old mesh onto the new mesh. More...
 
void project_vector (const NumericVector< Number > &, NumericVector< Number > &, int is_adjoint=-1) const
 Projects the vector defined on the old mesh onto the new mesh. More...
 
virtual void init_matrices ()
 Initializes the matrices associated with this system. More...
 
bool can_add_matrices () const
 
void solve_for_unconstrained_dofs (NumericVector< Number > &, int is_adjoint=-1) const
 
void increment_constructor_count (const std::string &name) noexcept
 Increments the construction counter. More...
 
void increment_destructor_count (const std::string &name) noexcept
 Increments the destruction counter. More...
 

Protected Attributes

std::vector< Number > parameters
 
ParameterVector parameter_vector
 
Real _k
 
Real tf
 
Number computed_QoI [1]
 
std::string _fe_family
 
unsigned int _fe_order
 
unsigned int T_var
 
bool _analytic_jacobians
 
std::vector< Number > R_plus_dp
 
std::vector< Number > R_minus_dp
 
std::vector< Number > deltat_vector
 
Number dp
 
Number final_sensitivity
 
bool _averaged_model
 
libMesh::Real _k [4]
 
bool _constrain_in_solver
 _constrain_in_solver defaults to true; if false then we apply constraints only via residual terms in the systems to be solved. More...
 
const Parallel::Communicator & _communicator
 
System_mesh_sys
 System from which to acquire moving mesh information. More...
 
unsigned int _mesh_x_var
 Variables from which to acquire moving mesh information. More...
 
unsigned int _mesh_y_var
 
unsigned int _mesh_z_var
 
std::vector< unsigned int_time_evolving
 Stores unsigned int to tell us which variables are evolving as first order in time (1), second order in time (2), or are not time evolving (0). More...
 
std::set< unsigned int_first_order_vars
 Variable indices for those variables that are first order in time. More...
 
std::set< unsigned int_second_order_vars
 Variable indices for those variables that are second order in time. More...
 
std::map< unsigned int, unsigned int_second_order_dot_vars
 If the user adds any second order variables, then we need to also cache the map to their corresponding dot variable that will be added by this TimeSolver class. More...
 

Static Protected Attributes

static Counts _counts
 Actually holds the data. More...
 
static Threads::atomic< unsigned int_n_objects
 The number of objects. More...
 
static Threads::spin_mutex _mutex
 Mutual exclusion object to enable thread-safe reference counting. More...
 
static bool _enable_print_counter = true
 Flag to control whether reference count information is printed when print_info is called. More...
 

Detailed Description

Definition at line 31 of file heatsystem.h.

Member Typedef Documentation

◆ const_matrices_iterator

typedef std::map<std::string, std::unique_ptr<SparseMatrix<Number> >, std::less<> >::const_iterator libMesh::System::const_matrices_iterator
inherited

Definition at line 1810 of file system.h.

◆ const_vectors_iterator

typedef std::map<std::string, std::unique_ptr<NumericVector<Number> >, std::less<> >::const_iterator libMesh::System::const_vectors_iterator
inherited

Definition at line 767 of file system.h.

◆ Counts

typedef std::map<std::string, std::pair<unsigned int, unsigned int> > libMesh::ReferenceCounter::Counts
protectedinherited

Data structure to log the information.

The log is identified by the class name.

Definition at line 119 of file reference_counter.h.

◆ GradientFunctionPointer

typedef Gradient(* libMesh::System::GradientFunctionPointer) (const Point &p, const Parameters &parameters, const std::string &sys_name, const std::string &unknown_name)
inherited

Definition at line 542 of file system.h.

◆ matrices_iterator

typedef std::map<std::string, std::unique_ptr<SparseMatrix<Number> >, std::less<> >::iterator libMesh::System::matrices_iterator
inherited

Matrix iterator typedefs.

Definition at line 1809 of file system.h.

◆ Parent

The type of the parent.

Definition at line 85 of file fem_system.h.

◆ sys_type

The type of system.

Definition at line 80 of file fem_system.h.

◆ TimeSolverResPtr

typedef bool(TimeSolver::* libMesh::FEMSystem::TimeSolverResPtr) (bool, DiffContext &)
inherited

Syntax sugar to make numerical_jacobian() declaration easier.

Definition at line 220 of file fem_system.h.

◆ ValueFunctionPointer

typedef Number(* libMesh::System::ValueFunctionPointer) (const Point &p, const Parameters &Parameters, const std::string &sys_name, const std::string &unknown_name)
inherited

Projects arbitrary functions onto the current solution.

The function value fptr and its gradient gptr are represented by function pointers. A gradient gptr is only required/used for projecting onto finite element spaces with continuous derivatives.

Definition at line 538 of file system.h.

◆ vectors_iterator

typedef std::map<std::string, std::unique_ptr<NumericVector<Number> >, std::less<> >::iterator libMesh::System::vectors_iterator
inherited

Vector iterator typedefs.

Definition at line 766 of file system.h.

Constructor & Destructor Documentation

◆ HeatSystem() [1/3]

HeatSystem::HeatSystem ( EquationSystems es,
const std::string &  name_in,
const unsigned int  number_in 
)
inline

Definition at line 35 of file heatsystem.h.

38  : FEMSystem(es, name_in, number_in),
39  _k(1.0),
40  _fe_family("LAGRANGE"),
41  _fe_order(1),
42  _analytic_jacobians(true),
43  dp(1.e-6)
44  { this->init_qois(1); }
void init_qois(unsigned int n_qois)
Accessors for qoi and qoi_error_estimates vectors.
Definition: system.C:2319
bool _analytic_jacobians
Definition: heatsystem.h:136
Number dp
Definition: heatsystem.h:146
FEMSystem(EquationSystems &es, const std::string &name, const unsigned int number)
Constructor.
Definition: fem_system.C:858
std::string _fe_family
Definition: heatsystem.h:129
unsigned int _fe_order
Definition: heatsystem.h:130

◆ HeatSystem() [2/3]

HeatSystem::HeatSystem ( EquationSystems es,
const std::string &  name_in,
const unsigned int  number_in 
)
inline

Definition at line 33 of file heatsystem.h.

36  : FEMSystem(es, name_in, number_in),
37  _k(1.0),
38  _fe_family("LAGRANGE"),
39  _fe_order(1),
41  { this->init_qois(2); QoI_time_instant.resize(2);}
std::vector< Real > QoI_time_instant
Definition: heatsystem.h:47
void init_qois(unsigned int n_qois)
Accessors for qoi and qoi_error_estimates vectors.
Definition: system.C:2319
bool _analytic_jacobians
Definition: heatsystem.h:136
FEMSystem(EquationSystems &es, const std::string &name, const unsigned int number)
Constructor.
Definition: fem_system.C:858
std::string _fe_family
Definition: heatsystem.h:129
unsigned int _fe_order
Definition: heatsystem.h:130

◆ HeatSystem() [3/3]

HeatSystem::HeatSystem ( libMesh::EquationSystems es,
const std::string &  name,
const unsigned int  number 
)
inline

Definition at line 10 of file heatsystem.h.

References _k, libMesh::pi, libMesh::Real, and std::sqrt().

12  :
14  _fe_family("LAGRANGE"), _fe_order(1)
15  {
16  // Get the conductivity ratios right for both 2D and 3D
17  // benchmarks
19  _k[2] = 1;
21  }
ADRealEigenVector< T, D, asd > sqrt(const ADRealEigenVector< T, D, asd > &)
Definition: type_vector.h:53
This class provides a specific system class.
Definition: fem_system.h:53
unsigned int number() const
Definition: system.h:2269
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::string _fe_family
Definition: heatsystem.h:129
unsigned int _fe_order
Definition: heatsystem.h:130
const std::string & name() const
Definition: system.h:2261
const Real pi
.
Definition: libmesh.h:274

Member Function Documentation

◆ _eulerian_time_deriv()

bool libMesh::DifferentiablePhysics::_eulerian_time_deriv ( bool  request_jacobian,
DiffContext context 
)
inherited

This method simply combines element_time_derivative() and eulerian_residual(), which makes its address useful as a pointer-to-member-function when refactoring.

Definition at line 96 of file diff_physics.C.

References libMesh::DifferentiablePhysics::element_time_derivative(), and libMesh::DifferentiablePhysics::eulerian_residual().

Referenced by libMesh::EulerSolver::element_residual(), libMesh::Euler2Solver::element_residual(), and libMesh::NewmarkSolver::element_residual().

98 {
99  // For any problem we need time derivative terms
100  request_jacobian =
101  this->element_time_derivative(request_jacobian, context);
102 
103  // For a moving mesh problem we may need the pseudoconvection term too
104  return this->eulerian_residual(request_jacobian, context) &&
105  request_jacobian;
106 }
virtual bool element_time_derivative(bool request_jacobian, DiffContext &)
Adds the time derivative contribution on elem to elem_residual.
Definition: diff_physics.h:125
virtual bool eulerian_residual(bool request_jacobian, DiffContext &)
Adds a pseudo-convection contribution on elem to elem_residual, if the nodes of elem are being transl...
Definition: diff_physics.h:277

◆ activate()

void libMesh::System::activate ( )
inlineinherited

Activates the system.

Only active systems are solved.

Definition at line 2317 of file system.h.

References libMesh::System::_active.

2318 {
2319  _active = true;
2320 }
bool _active
Flag stating if the system is active or not.
Definition: system.h:2156

◆ active()

bool libMesh::System::active ( ) const
inlineinherited
Returns
true if the system is active, false otherwise. An active system will be solved.

Definition at line 2309 of file system.h.

References libMesh::System::_active.

2310 {
2311  return _active;
2312 }
bool _active
Flag stating if the system is active or not.
Definition: system.h:2156

◆ add_adjoint_rhs()

NumericVector< Number > & libMesh::System::add_adjoint_rhs ( unsigned int  i = 0)
inherited
Returns
A reference to one of the system's adjoint rhs vectors, by default the one corresponding to the first qoi. Creates the vector if it doesn't already exist.

Definition at line 1245 of file system.C.

References libMesh::System::add_vector().

Referenced by libMesh::ExplicitSystem::assemble_qoi_derivative(), and libMesh::FEMSystem::assemble_qoi_derivative().

1246 {
1247  std::ostringstream adjoint_rhs_name;
1248  adjoint_rhs_name << "adjoint_rhs" << i;
1249 
1250  return this->add_vector(adjoint_rhs_name.str(), false);
1251 }
NumericVector< Number > & add_vector(std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Adds the additional vector vec_name to this system.
Definition: system.C:751

◆ add_adjoint_solution()

NumericVector< Number > & libMesh::System::add_adjoint_solution ( unsigned int  i = 0)
inherited
Returns
A reference to one of the system's adjoint solution vectors, by default the one corresponding to the first qoi. Creates the vector if it doesn't already exist.

Definition at line 1181 of file system.C.

References libMesh::System::add_vector(), and libMesh::System::set_vector_as_adjoint().

Referenced by libMesh::ImplicitSystem::adjoint_solve().

1182 {
1183  std::ostringstream adjoint_name;
1184  adjoint_name << "adjoint_solution" << i;
1185 
1186  NumericVector<Number> & returnval = this->add_vector(adjoint_name.str());
1187  this->set_vector_as_adjoint(adjoint_name.str(), i);
1188  return returnval;
1189 }
void set_vector_as_adjoint(const std::string &vec_name, int qoi_num)
Allows one to set the QoI index controlling whether the vector identified by vec_name represents a so...
Definition: system.C:1107
NumericVector< Number > & add_vector(std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Adds the additional vector vec_name to this system.
Definition: system.C:751
template class LIBMESH_EXPORT NumericVector< Number >

◆ add_dot_var_dirichlet_bcs()

void libMesh::DifferentiableSystem::add_dot_var_dirichlet_bcs ( unsigned int  var_idx,
unsigned int  dot_var_idx 
)
protectedinherited

Helper function to and Dirichlet boundary conditions to "dot" variable cousins of second order variables in the system.

The function takes the second order variable index, it's corresponding "dot" variable index and then searches for DirichletBoundary objects for var_idx and then adds a DirichletBoundary object for dot_var_idx using the same boundary ids and functors for the var_idx DirichletBoundary.

Definition at line 214 of file diff_system.C.

References libMesh::DofMap::add_dirichlet_boundary(), libMesh::DofMap::get_dirichlet_boundaries(), libMesh::System::get_dof_map(), and libMesh::libmesh_assert().

Referenced by libMesh::DifferentiableSystem::add_second_order_dot_vars().

216 {
217  // We're assuming that there could be a lot more variables than
218  // boundary conditions, so we search each of the boundary conditions
219  // for this variable rather than looping over boundary conditions
220  // in a separate loop and searching through all the variables.
221  const DirichletBoundaries * all_dbcs =
223 
224  if (all_dbcs)
225  {
226  // We need to cache the DBCs to be added so that we add them
227  // after looping over the existing DBCs. Otherwise, we're polluting
228  // the thing we're looping over.
229  std::vector<DirichletBoundary> new_dbcs;
230 
231  for (const auto & dbc : *all_dbcs)
232  {
233  libmesh_assert(dbc);
234 
235  // Look for second order variable in the current
236  // DirichletBoundary object
237  std::vector<unsigned int>::const_iterator dbc_var_it =
238  std::find( dbc->variables.begin(), dbc->variables.end(), var_idx );
239 
240  // If we found it, then we also need to add it's corresponding
241  // "dot" variable to a DirichletBoundary
242  std::vector<unsigned int> vars_to_add;
243  if (dbc_var_it != dbc->variables.end())
244  vars_to_add.push_back(dot_var_idx);
245 
246  if (!vars_to_add.empty())
247  {
248  // We need to check if the boundary condition is time-dependent.
249  // Currently, we cannot automatically differentiate w.r.t. time
250  // so if the user supplies a time-dependent Dirichlet BC, then
251  // we can't automatically support the Dirichlet BC for the
252  // "velocity" boundary condition, so we error. Otherwise,
253  // the "velocity boundary condition will just be zero.
254  bool is_time_evolving_bc = false;
255  if (dbc->f)
256  is_time_evolving_bc = dbc->f->is_time_dependent();
257  else if (dbc->f_fem)
258  // We it's a FEMFunctionBase object, it will be implicitly
259  // time-dependent since it is assumed to depend on the solution.
260  is_time_evolving_bc = true;
261  else
262  libmesh_error_msg("Could not find valid boundary function!");
263 
264  libmesh_error_msg_if(is_time_evolving_bc, "Cannot currently support time-dependent Dirichlet BC for dot variables!");
265  libmesh_error_msg_if(!dbc->f, "Expected valid DirichletBoundary function");
266 
267  new_dbcs.emplace_back(dbc->b, vars_to_add, ZeroFunction<Number>());
268  }
269  }
270 
271  // Let the DofMap make its own deep copy of the DirichletBC objects
272  for (const auto & dbc : new_dbcs)
273  this->get_dof_map().add_dirichlet_boundary(dbc);
274 
275  } // if (all_dbcs)
276 }
libmesh_assert(ctx)
const DirichletBoundaries * get_dirichlet_boundaries() const
Definition: dof_map.h:1485
void add_dirichlet_boundary(const DirichletBoundary &dirichlet_boundary)
Adds a copy of the specified Dirichlet boundary to the system.
const DofMap & get_dof_map() const
Definition: system.h:2293

◆ add_matrices()

void libMesh::ImplicitSystem::add_matrices ( )
overrideprotectedvirtualinherited

Adds the system matrix.

Reimplemented from libMesh::System.

Definition at line 86 of file implicit_system.C.

References libMesh::System::add_matrices(), libMesh::System::add_matrix(), libMesh::libmesh_assert(), libMesh::ImplicitSystem::matrix, and libMesh::System::n_matrices().

87 {
89 
90  // Possible that we cleared the _matrices but
91  // forgot to update the matrix pointer?
92  if (this->n_matrices() == 0)
93  matrix = nullptr;
94 
95  // Only need to add the matrix if it isn't there
96  // already!
97  if (matrix == nullptr)
98  matrix = &(this->add_matrix ("System Matrix"));
99 
101 }
virtual void add_matrices()
Insertion point for adding matrices in derived classes before init_matrices() is called.
Definition: system.h:1903
libmesh_assert(ctx)
unsigned int n_matrices() const
Definition: system.h:2594
SparseMatrix< Number > * matrix
The system matrix.
SparseMatrix< Number > & add_matrix(std::string_view mat_name, ParallelType type=PARALLEL, MatrixBuildType mat_build_type=MatrixBuildType::AUTOMATIC)
Adds the additional matrix mat_name to this system.
Definition: system.C:985

◆ add_matrix() [1/2]

SparseMatrix< Number > & libMesh::System::add_matrix ( std::string_view  mat_name,
ParallelType  type = PARALLEL,
MatrixBuildType  mat_build_type = MatrixBuildType::AUTOMATIC 
)
inherited

Adds the additional matrix mat_name to this system.

Only allowed prior to assemble(). All additional matrices have the same sparsity pattern as the matrix used during solution. When not System but the user wants to initialize the mayor matrix, then all the additional matrices, if existent, have to be initialized by the user, too.

This non-template method will add a derived matrix type corresponding to the solver package. If the user wishes to specify the matrix type to add, use the templated add_matrix method instead

Parameters
mat_nameA name for the matrix
typeThe serial/parallel/ghosted type of the matrix
mat_build_typeThe matrix type to build

Definition at line 985 of file system.C.

References libMesh::System::_matrices, libMesh::System::_matrix_types, libMesh::ParallelObject::comm(), libMesh::default_solver_package(), libMesh::System::late_matrix_init(), and libMesh::libmesh_assert().

Referenced by libMesh::ImplicitSystem::add_matrices(), libMesh::EigenSystem::add_matrices(), alternative_fe_assembly(), libMesh::EigenTimeSolver::init(), main(), and libMesh::NewmarkSystem::NewmarkSystem().

988 {
989  parallel_object_only();
990 
991  libmesh_assert(this->comm().verify(std::string(mat_name)));
992  libmesh_assert(this->comm().verify(int(type)));
993  libmesh_assert(this->comm().verify(int(mat_build_type)));
994 
995  // Return the matrix if it is already there.
996  auto it = this->_matrices.find(mat_name);
997  if (it != this->_matrices.end())
998  return *it->second;
999 
1000  // Otherwise build the matrix to return.
1001  auto pr = _matrices.emplace
1002  (mat_name,
1003  SparseMatrix<Number>::build(this->comm(),
1005  mat_build_type));
1006 
1007  _matrix_types.emplace(mat_name, type);
1008 
1009  SparseMatrix<Number> & mat = *(pr.first->second);
1010 
1011  // Initialize it first if we've already initialized the others.
1012  this->late_matrix_init(mat, type);
1013 
1014  return mat;
1015 }
const Parallel::Communicator & comm() const
static std::unique_ptr< SparseMatrix< Number > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package(), const MatrixBuildType matrix_build_type=MatrixBuildType::AUTOMATIC)
Builds a SparseMatrix<T> using the linear solver package specified by solver_package.
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2181
SolverPackage default_solver_package()
Definition: libmesh.C:1050
libmesh_assert(ctx)
std::map< std::string, ParallelType, std::less<> > _matrix_types
Holds the types of the matrices.
Definition: system.h:2186
template class LIBMESH_EXPORT SparseMatrix< Number >
void late_matrix_init(SparseMatrix< Number > &mat, ParallelType type)
Helper function to keep DofMap forward declarable in system.h.
Definition: system.C:1019

◆ add_matrix() [2/2]

template<template< typename > class MatrixType>
SparseMatrix< Number > & libMesh::System::add_matrix ( std::string_view  mat_name,
ParallelType  type = PARALLEL 
)
inlineinherited

Adds the additional matrix mat_name to this system.

Only allowed prior to assemble(). All additional matrices have the same sparsity pattern as the matrix used during solution. When not System but the user wants to initialize the mayor matrix, then all the additional matrices, if existent, have to be initialized by the user, too.

This method will create add a derived matrix of type MatrixType<Number>. One can use the non-templated add_matrix method to add a matrix corresponding to the default solver package

Parameters
mat_nameA name for the matrix
typeThe serial/parallel/ghosted type of the matrix

Definition at line 2602 of file system.h.

References libMesh::System::_matrices, libMesh::System::_matrix_types, and libMesh::System::late_matrix_init().

2604 {
2605  // Return the matrix if it is already there.
2606  auto it = this->_matrices.find(mat_name);
2607  if (it != this->_matrices.end())
2608  return *it->second;
2609 
2610  // Otherwise build the matrix to return.
2611  auto pr = _matrices.emplace(mat_name, std::make_unique<MatrixType<Number>>(this->comm()));
2612  _matrix_types.emplace(mat_name, type);
2613 
2614  SparseMatrix<Number> & mat = *(pr.first->second);
2615 
2616  // Initialize it first if we've already initialized the others.
2617  this->late_matrix_init(mat, type);
2618 
2619  return mat;
2620 }
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2181
std::map< std::string, ParallelType, std::less<> > _matrix_types
Holds the types of the matrices.
Definition: system.h:2186
template class LIBMESH_EXPORT SparseMatrix< Number >
void late_matrix_init(SparseMatrix< Number > &mat, ParallelType type)
Helper function to keep DofMap forward declarable in system.h.
Definition: system.C:1019

◆ add_second_order_dot_vars()

void libMesh::DifferentiableSystem::add_second_order_dot_vars ( )
protectedinherited

Helper function to add "velocity" variables that are cousins to second order-in-time variables in the DifferentiableSystem.

This function is only called if the TimeSolver is a FirstOrderUnsteadySolver.

Definition at line 182 of file diff_system.C.

References libMesh::DifferentiablePhysics::_second_order_dot_vars, libMesh::Variable::active_subdomains(), libMesh::DifferentiableSystem::add_dot_var_dirichlet_bcs(), libMesh::System::add_variable(), libMesh::DifferentiablePhysics::get_second_order_vars(), libMesh::Variable::name(), libMesh::DifferentiablePhysics::time_evolving(), libMesh::Variable::type(), and libMesh::System::variable().

Referenced by libMesh::DifferentiableSystem::init_data().

183 {
184  const std::set<unsigned int> & second_order_vars = this->get_second_order_vars();
185  if (!second_order_vars.empty())
186  {
187  for (const auto & var_id : second_order_vars)
188  {
189  const Variable & var = this->variable(var_id);
190  std::string new_var_name = std::string("dot_")+var.name();
191 
192  unsigned int v_var_idx;
193 
194  if (var.active_subdomains().empty())
195  v_var_idx = this->add_variable( new_var_name, var.type() );
196  else
197  v_var_idx = this->add_variable( new_var_name, var.type(), &var.active_subdomains() );
198 
199  _second_order_dot_vars.insert(std::pair<unsigned int, unsigned int>(var_id, v_var_idx));
200 
201  // The new velocities are time evolving variables of first order
202  this->time_evolving( v_var_idx, 1 );
203 
204 #ifdef LIBMESH_ENABLE_DIRICHLET
205  // And if there are any boundary conditions set on the second order
206  // variable, we also need to set it on its velocity variable.
207  this->add_dot_var_dirichlet_bcs(var_id, v_var_idx);
208 #endif
209  }
210  }
211 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.h:2377
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...
Definition: diff_system.C:214
virtual void time_evolving(unsigned int var, unsigned int order)
Tells the DiffSystem that variable var is evolving with respect to time.
Definition: diff_physics.C:41
std::map< unsigned int, unsigned int > _second_order_dot_vars
If the user adds any second order variables, then we need to also cache the map to their correspondin...
Definition: diff_physics.h:560
const std::set< unsigned int > & get_second_order_vars() const
Definition: diff_physics.h:519
unsigned int add_variable(std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variable var to the list of variables for this system.
Definition: system.C:1305

◆ add_sensitivity_rhs()

NumericVector< Number > & libMesh::System::add_sensitivity_rhs ( unsigned int  i = 0)
inherited
Returns
A reference to one of the system's sensitivity rhs vectors, by default the one corresponding to the first parameter. Creates the vector if it doesn't already exist.

Definition at line 1275 of file system.C.

References libMesh::System::add_vector().

Referenced by libMesh::ImplicitSystem::assemble_residual_derivatives().

1276 {
1277  std::ostringstream sensitivity_rhs_name;
1278  sensitivity_rhs_name << "sensitivity_rhs" << i;
1279 
1280  return this->add_vector(sensitivity_rhs_name.str(), false);
1281 }
NumericVector< Number > & add_vector(std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Adds the additional vector vec_name to this system.
Definition: system.C:751

◆ add_sensitivity_solution()

NumericVector< Number > & libMesh::System::add_sensitivity_solution ( unsigned int  i = 0)
inherited
Returns
A reference to one of the system's solution sensitivity vectors, by default the one corresponding to the first parameter. Creates the vector if it doesn't already exist.

Definition at line 1130 of file system.C.

References libMesh::System::add_vector().

Referenced by libMesh::ImplicitSystem::sensitivity_solve().

1131 {
1132  std::ostringstream sensitivity_name;
1133  sensitivity_name << "sensitivity_solution" << i;
1134 
1135  return this->add_vector(sensitivity_name.str());
1136 }
NumericVector< Number > & add_vector(std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Adds the additional vector vec_name to this system.
Definition: system.C:751

◆ add_variable() [1/2]

unsigned int libMesh::System::add_variable ( std::string_view  var,
const FEType type,
const std::set< subdomain_id_type > *const  active_subdomains = nullptr 
)
inherited

Adds the variable var to the list of variables for this system.

If active_subdomains is either nullptr (the default) or points to an empty set, then it will be assumed that var has no subdomain restrictions

Returns
The index number for the new variable.

Definition at line 1305 of file system.C.

References libMesh::System::_variable_groups, libMesh::System::_variable_numbers, libMesh::System::_variables, libMesh::Variable::active_subdomains(), libMesh::System::add_variables(), libMesh::ParallelObject::comm(), libMesh::System::identify_variable_groups(), libMesh::Variable::implicitly_active(), libMesh::System::is_initialized(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::System::n_variable_groups(), libMesh::System::n_vars(), libMesh::System::variable(), libMesh::System::variable_name(), and libMesh::System::variable_type().

Referenced by libMesh::DifferentiableSystem::add_second_order_dot_vars(), libMesh::System::add_variable(), assemble_and_solve(), OverlappingTestBase::init(), SolidSystem::init_data(), CurlCurlSystem::init_data(), SimpleEIMConstruction::init_data(), init_data(), SimpleRBConstruction::init_data(), main(), libMesh::ErrorVector::plot_error(), libMesh::System::read_header(), RationalMapTest< elem_type >::setUp(), SlitMeshRefinedSystemTest::setUp(), FETestBase< order, family, elem_type, 1 >::setUp(), WriteVecAndScalar::setupTests(), SystemsTest::simpleSetup(), MultiEvaluablePredTest::test(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), MeshFunctionTest::test_subdomain_id_sets(), SystemsTest::testAssemblyWithDgFemContext(), DofMapTest::testBadElemFECombo(), EquationSystemsTest::testBadVarNames(), SystemsTest::testBlockRestrictedVarNDofs(), SystemsTest::testBoundaryProjectCube(), DofMapTest::testConstraintLoopDetection(), MeshInputTest::testCopyElementSolutionImpl(), MeshInputTest::testCopyElementVectorImpl(), MeshInputTest::testCopyNodalSolutionImpl(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), SystemsTest::testDofCouplingWithVarGroups(), DofMapTest::testDofOwner(), MeshInputTest::testDynaReadPatch(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), MeshAssignTest::testMeshMoveAssign(), PeriodicBCTest::testPeriodicBC(), EquationSystemsTest::testPostInitAddElem(), EquationSystemsTest::testPostInitAddRealSystem(), SystemsTest::testProjectCubeWithMeshFunction(), MeshInputTest::testProjectionRegression(), SystemsTest::testProjectMatrix1D(), SystemsTest::testProjectMatrix2D(), SystemsTest::testProjectMatrix3D(), InfFERadialTest::testRefinement(), EquationSystemsTest::testRefineThenReinitPreserveFlags(), EquationSystemsTest::testReinitWithNodeElem(), EquationSystemsTest::testRepartitionThenReinit(), EquationSystemsTest::testSelectivePRefine(), BoundaryInfoTest::testShellFaceConstraints(), MeshInputTest::testSingleElementImpl(), WriteVecAndScalar::testWriteExodus(), and WriteVecAndScalar::testWriteNemesis().

1308 {
1309  parallel_object_only(); // Not strictly needed, but the only safe way to keep in sync
1310 
1311  libmesh_assert(this->comm().verify(std::string(var)));
1312  libmesh_assert(this->comm().verify(type));
1313  libmesh_assert(this->comm().verify((active_subdomains == nullptr)));
1314 
1315  if (active_subdomains)
1316  libmesh_assert(this->comm().verify(active_subdomains->size()));
1317 
1318  // Make sure the variable isn't there already
1319  // or if it is, that it's the type we want
1320  for (auto v : make_range(this->n_vars()))
1321  if (this->variable_name(v) == var)
1322  {
1323  if (this->variable_type(v) == type)
1324  {
1325  // Check whether the existing variable's active subdomains also matches
1326  // the incoming variable's active subdomains. If they don't match, then
1327  // either it is an error by the user or the user is trying to change the
1328  // subdomain restriction after the variable has already been added, which
1329  // is not supported.
1330  const Variable & existing_var = this->variable(v);
1331 
1332  // Check whether active_subdomains is not provided/empty and the existing_var is implicitly_active()
1333  bool check1 = (!active_subdomains || active_subdomains->empty()) && existing_var.implicitly_active();
1334 
1335  // Check if the provided active_subdomains is equal to the existing_var's active_subdomains
1336  bool check2 = (active_subdomains && (*active_subdomains == existing_var.active_subdomains()));
1337 
1338  // If either of these checks passed, then we already have this variable
1339  if (check1 || check2)
1340  return _variables[v].number();
1341  }
1342 
1343  libmesh_error_msg("ERROR: incompatible variable " << var << " has already been added for this system!");
1344  }
1345 
1346  libmesh_assert(!this->is_initialized());
1347 
1348  if (this->n_variable_groups())
1349  {
1350  // Optimize for VariableGroups here - if the user is adding multiple
1351  // variables of the same FEType and subdomain restriction, catch
1352  // that here and add them as members of the same VariableGroup.
1353  //
1354  // start by setting this flag to whatever the user has requested
1355  // and then consider the conditions which should negate it.
1356  bool should_be_in_vg = this->identify_variable_groups();
1357 
1358  VariableGroup & vg(_variable_groups.back());
1359 
1360  // get a pointer to their subdomain restriction, if any.
1361  const std::set<subdomain_id_type> * const
1362  their_active_subdomains (vg.implicitly_active() ?
1363  nullptr : &vg.active_subdomains());
1364 
1365  // Different types?
1366  if (vg.type() != type)
1367  should_be_in_vg = false;
1368 
1369  // they are restricted, we aren't?
1370  if (their_active_subdomains &&
1371  (!active_subdomains || (active_subdomains && active_subdomains->empty())))
1372  should_be_in_vg = false;
1373 
1374  // they aren't restricted, we are?
1375  if (!their_active_subdomains && (active_subdomains && !active_subdomains->empty()))
1376  should_be_in_vg = false;
1377 
1378  if (their_active_subdomains && active_subdomains)
1379  // restricted to different sets?
1380  if (*their_active_subdomains != *active_subdomains)
1381  should_be_in_vg = false;
1382 
1383  // OK, after all that, append the variable to the vg if none of the conditions
1384  // were violated
1385  if (should_be_in_vg)
1386  {
1387  const unsigned int curr_n_vars = this->n_vars();
1388 
1389  std::string varstr(var);
1390 
1391  _variable_numbers[varstr] = curr_n_vars;
1392  vg.append (std::move(varstr));
1393  _variables.push_back(vg(vg.n_variables()-1));
1394 
1395  return curr_n_vars;
1396  }
1397  }
1398 
1399  // otherwise, fall back to adding a single variable group
1400  return this->add_variables (std::vector<std::string>(1, std::string(var)),
1401  type,
1402  active_subdomains);
1403 }
unsigned int add_variables(const std::vector< std::string > &vars, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variable var to the list of variables for this system.
Definition: system.C:1419
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.h:2377
unsigned int n_variable_groups() const
Definition: system.h:2357
const Parallel::Communicator & comm() const
std::vector< Variable > _variables
The Variable in this System.
Definition: system.h:2140
std::vector< VariableGroup > _variable_groups
The VariableGroup in this System.
Definition: system.h:2145
bool is_initialized()
Definition: system.h:2333
libmesh_assert(ctx)
const std::string & variable_name(const unsigned int i) const
Definition: system.h:2397
bool identify_variable_groups() const
Definition: system.h:2445
const FEType & variable_type(const unsigned int i) const
Definition: system.h:2427
std::map< std::string, unsigned int, std::less<> > _variable_numbers
The variable numbers corresponding to user-specified names, useful for name-based lookups...
Definition: system.h:2151
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
unsigned int n_vars() const
Definition: system.h:2349

◆ add_variable() [2/2]

unsigned int libMesh::System::add_variable ( std::string_view  var,
const Order  order = FIRST,
const FEFamily  family = LAGRANGE,
const std::set< subdomain_id_type > *const  active_subdomains = nullptr 
)
inherited

Adds the variable var to the list of variables for this system.

Same as before, but assumes LAGRANGE as default value for FEType.family. If active_subdomains is either nullptr (the default) or points to an empty set, then it will be assumed that var has no subdomain restrictions

Definition at line 1407 of file system.C.

References libMesh::System::add_variable().

1411 {
1412  return this->add_variable(var,
1413  FEType(order, family),
1414  active_subdomains);
1415 }
unsigned int add_variable(std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variable var to the list of variables for this system.
Definition: system.C:1305

◆ add_variables() [1/2]

unsigned int libMesh::System::add_variables ( const std::vector< std::string > &  vars,
const FEType type,
const std::set< subdomain_id_type > *const  active_subdomains = nullptr 
)
inherited

Adds the variable var to the list of variables for this system.

If active_subdomains is either nullptr (the default) or points to an empty set, then it will be assumed that var has no subdomain restrictions

Returns
The index number for the new variable.

Definition at line 1419 of file system.C.

References libMesh::System::_variable_groups, libMesh::System::_variable_numbers, libMesh::System::_variables, libMesh::ParallelObject::comm(), libMesh::System::identify_variable_groups(), libMesh::System::is_initialized(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::System::n_components(), libMesh::System::n_variable_groups(), libMesh::System::n_vars(), libMesh::System::variable_name(), and libMesh::System::variable_type().

Referenced by libMesh::System::add_variable(), libMesh::System::add_variables(), and SystemsTest::test100KVariables().

1422 {
1423  parallel_object_only(); // Not strictly needed, but the only safe way to keep in sync
1424 
1425  libmesh_assert(!this->is_initialized());
1426 
1427  libmesh_assert(this->comm().verify(vars.size()));
1428  libmesh_assert(this->comm().verify(type));
1429  libmesh_assert(this->comm().verify((active_subdomains == nullptr)));
1430 
1431  if (active_subdomains)
1432  libmesh_assert(this->comm().verify(active_subdomains->size()));
1433 
1434  // Make sure the variable isn't there already
1435  // or if it is, that it's the type we want
1436  for (auto ovar : vars)
1437  {
1438  libmesh_assert(this->comm().verify(ovar));
1439 
1440  for (auto v : make_range(this->n_vars()))
1441  if (this->variable_name(v) == ovar)
1442  {
1443  if (this->variable_type(v) == type)
1444  return _variables[v].number();
1445 
1446  libmesh_error_msg("ERROR: incompatible variable " << ovar << " has already been added for this system!");
1447  }
1448  }
1449 
1450  if (this->n_variable_groups())
1451  {
1452  // Optimize for VariableGroups here - if the user is adding multiple
1453  // variables of the same FEType and subdomain restriction, catch
1454  // that here and add them as members of the same VariableGroup.
1455  //
1456  // start by setting this flag to whatever the user has requested
1457  // and then consider the conditions which should negate it.
1458  bool should_be_in_vg = this->identify_variable_groups();
1459 
1460  VariableGroup & vg(_variable_groups.back());
1461 
1462  // get a pointer to their subdomain restriction, if any.
1463  const std::set<subdomain_id_type> * const
1464  their_active_subdomains (vg.implicitly_active() ?
1465  nullptr : &vg.active_subdomains());
1466 
1467  // Different types?
1468  if (vg.type() != type)
1469  should_be_in_vg = false;
1470 
1471  // they are restricted, we aren't?
1472  if (their_active_subdomains &&
1473  (!active_subdomains || (active_subdomains && active_subdomains->empty())))
1474  should_be_in_vg = false;
1475 
1476  // they aren't restricted, we are?
1477  if (!their_active_subdomains && (active_subdomains && !active_subdomains->empty()))
1478  should_be_in_vg = false;
1479 
1480  if (their_active_subdomains && active_subdomains)
1481  // restricted to different sets?
1482  if (*their_active_subdomains != *active_subdomains)
1483  should_be_in_vg = false;
1484 
1485  // If after all that none of the conditions were violated,
1486  // append the variables to the vg and we're done
1487  if (should_be_in_vg)
1488  {
1489  unsigned int curr_n_vars = this->n_vars();
1490 
1491  for (auto ovar : vars)
1492  {
1493  curr_n_vars = this->n_vars();
1494 
1495  vg.append (ovar);
1496 
1497  _variables.push_back(vg(vg.n_variables()-1));
1498  _variable_numbers[ovar] = curr_n_vars;
1499  }
1500  return curr_n_vars;
1501  }
1502  }
1503 
1504  const unsigned int curr_n_vars = this->n_vars();
1505 
1506  const unsigned int next_first_component = this->n_components();
1507 
1508  // We weren't able to add to an existing variable group, so
1509  // add a new variable group to the list
1510  _variable_groups.push_back((active_subdomains == nullptr) ?
1511  VariableGroup(this, vars, curr_n_vars,
1512  next_first_component, type) :
1513  VariableGroup(this, vars, curr_n_vars,
1514  next_first_component, type, *active_subdomains));
1515 
1516  const VariableGroup & vg (_variable_groups.back());
1517 
1518  // Add each component of the group individually
1519  for (auto v : make_range(vars.size()))
1520  {
1521  _variables.push_back (vg(v));
1522  _variable_numbers[vars[v]] = curr_n_vars+v;
1523  }
1524 
1525  libmesh_assert_equal_to ((curr_n_vars+vars.size()), this->n_vars());
1526 
1527  // BSK - Defer this now to System::init_data() so we can detect
1528  // VariableGroups 12/28/2012
1529  // // Add the variable group to the _dof_map
1530  // _dof_map->add_variable_group (vg);
1531 
1532  // Return the number of the new variable
1533  return cast_int<unsigned int>(curr_n_vars+vars.size()-1);
1534 }
unsigned int n_components() const
Definition: system.h:2365
unsigned int n_variable_groups() const
Definition: system.h:2357
const Parallel::Communicator & comm() const
std::vector< Variable > _variables
The Variable in this System.
Definition: system.h:2140
std::vector< VariableGroup > _variable_groups
The VariableGroup in this System.
Definition: system.h:2145
bool is_initialized()
Definition: system.h:2333
libmesh_assert(ctx)
const std::string & variable_name(const unsigned int i) const
Definition: system.h:2397
bool identify_variable_groups() const
Definition: system.h:2445
const FEType & variable_type(const unsigned int i) const
Definition: system.h:2427
std::map< std::string, unsigned int, std::less<> > _variable_numbers
The variable numbers corresponding to user-specified names, useful for name-based lookups...
Definition: system.h:2151
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
unsigned int n_vars() const
Definition: system.h:2349

◆ add_variables() [2/2]

unsigned int libMesh::System::add_variables ( const std::vector< std::string > &  vars,
const Order  order = FIRST,
const FEFamily  family = LAGRANGE,
const std::set< subdomain_id_type > *const  active_subdomains = nullptr 
)
inherited

Adds the variable var to the list of variables for this system.

Same as before, but assumes LAGRANGE as default value for FEType.family. If active_subdomains is either nullptr (the default) or points to an empty set, then it will be assumed that var has no subdomain restrictions

Definition at line 1538 of file system.C.

References libMesh::System::add_variables().

1542 {
1543  return this->add_variables(vars,
1544  FEType(order, family),
1545  active_subdomains);
1546 }
unsigned int add_variables(const std::vector< std::string > &vars, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variable var to the list of variables for this system.
Definition: system.C:1419

◆ add_vector()

NumericVector< Number > & libMesh::System::add_vector ( std::string_view  vec_name,
const bool  projections = true,
const ParallelType  type = PARALLEL 
)
inherited

Adds the additional vector vec_name to this system.

All the additional vectors are similarly distributed, like the solution, and initialized to zero.

By default vectors added by add_vector are projected to changed grids by reinit(). To zero them instead (more efficient), pass "false" as the second argument

If the vector already exists, the existing vector is returned. after any upgrade to the projections or type has been made. We only handle upgrades (projections false->true, or type PARALLEL->GHOSTED) in this fashion, not downgrades, on the theory that if two codes have differing needs we want to support the union of those needs, not the intersection. Downgrades can only be accomplished manually, via set_vector_preservation() or by setting a vector type() and re-initializing.

Definition at line 751 of file system.C.

References libMesh::System::_dof_map, libMesh::System::_is_initialized, libMesh::System::_vector_is_adjoint, libMesh::System::_vector_projections, libMesh::System::_vectors, libMesh::NumericVector< T >::build(), libMesh::NumericVector< T >::close(), libMesh::NumericVector< T >::closed(), libMesh::ParallelObject::comm(), libMesh::GHOSTED, libMesh::NumericVector< T >::initialized(), libMesh::libmesh_assert(), libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), libMesh::ParallelObject::n_processors(), libMesh::PARALLEL, libMesh::SERIAL, libMesh::NumericVector< T >::swap(), and libMesh::NumericVector< T >::type().

Referenced by libMesh::System::add_adjoint_rhs(), libMesh::System::add_adjoint_solution(), libMesh::System::add_sensitivity_rhs(), libMesh::System::add_sensitivity_solution(), libMesh::ExplicitSystem::add_system_rhs(), libMesh::System::add_weighted_sensitivity_adjoint_solution(), libMesh::System::add_weighted_sensitivity_solution(), alternative_fe_assembly(), libMesh::AdjointRefinementEstimator::estimate_error(), fe_assembly(), libMesh::SecondOrderUnsteadySolver::init(), libMesh::UnsteadySolver::init(), libMesh::UnsteadySolver::init_adjoints(), libMesh::TimeSolver::init_adjoints(), libMesh::OptimizationSystem::init_data(), libMesh::ContinuationSystem::init_data(), main(), libMesh::NewmarkSystem::NewmarkSystem(), libMesh::System::read_header(), libMesh::FrequencySystem::set_frequencies(), libMesh::FrequencySystem::set_frequencies_by_range(), libMesh::FrequencySystem::set_frequencies_by_steps(), SystemsTest::testAddVectorProjChange(), SystemsTest::testAddVectorTypeChange(), SystemsTest::testPostInitAddVector(), and SystemsTest::testPostInitAddVectorTypeChange().

754 {
755  parallel_object_only();
756 
757  libmesh_assert(this->comm().verify(std::string(vec_name)));
758  libmesh_assert(this->comm().verify(int(type)));
759  libmesh_assert(this->comm().verify(projections));
760 
761  // Return the vector if it is already there.
762  auto it = this->_vectors.find(vec_name);
763  if (it != this->_vectors.end())
764  {
765  // If the projection setting has *upgraded*, change it.
766  if (projections) // only do expensive lookup if needed
767  libmesh_map_find(_vector_projections, vec_name) = projections;
768 
769  NumericVector<Number> & vec = *it->second;
770 
771  // If we're in serial, our vectors are effectively SERIAL, so
772  // we'll ignore any type setting. If we're in parallel, we
773  // might have a type change to deal with.
774 
775  if (this->n_processors() > 1)
776  {
777  // If the type setting has changed in a way we can't
778  // perceive as an upgrade or a downgrade, scream.
779  libmesh_assert_equal_to(type == SERIAL,
780  vec.type() == SERIAL);
781 
782  // If the type setting has *upgraded*, change it.
783  if (type == GHOSTED && vec.type() == PARALLEL)
784  {
785  // A *really* late upgrade is expensive, but better not
786  // to risk zeroing data.
787  if (vec.initialized())
788  {
789  if (!vec.closed())
790  vec.close();
791 
792  // Ideally we'd move parallel coefficients and then
793  // add ghosted coefficients, but copy and swap is
794  // simpler. If anyone actually ever uses this case
795  // for real we can look into optimizing it.
796  auto new_vec = NumericVector<Number>::build(this->comm());
797 #ifdef LIBMESH_ENABLE_GHOSTED
798  new_vec->init (this->n_dofs(), this->n_local_dofs(),
799  _dof_map->get_send_list(), /*fast=*/false,
800  GHOSTED);
801 #else
802  libmesh_error_msg("Cannot initialize ghosted vectors when they are not enabled.");
803 #endif
804 
805  *new_vec = vec;
806  vec.swap(*new_vec);
807  }
808  else
809  vec.type() = type;
810  }
811  }
812 
813  // Any upgrades are done; we're happy here.
814  return vec;
815  }
816 
817  // Otherwise build the vector
818  auto pr = _vectors.emplace(vec_name, NumericVector<Number>::build(this->comm()));
819  auto buf = pr.first->second.get();
820  _vector_projections.emplace(vec_name, projections);
821  buf->type() = type;
822 
823  // Vectors are primal by default
824  _vector_is_adjoint.emplace(vec_name, -1);
825 
826  // Initialize it if necessary
827  if (_is_initialized)
828  {
829  if (type == GHOSTED)
830  {
831 #ifdef LIBMESH_ENABLE_GHOSTED
832  buf->init (this->n_dofs(), this->n_local_dofs(),
833  _dof_map->get_send_list(), /*fast=*/false,
834  GHOSTED);
835 #else
836  libmesh_error_msg("Cannot initialize ghosted vectors when they are not enabled.");
837 #endif
838  }
839  else
840  buf->init (this->n_dofs(), this->n_local_dofs(), false, type);
841  }
842 
843  return *buf;
844 }
bool _is_initialized
true when additional vectors and variables do not require immediate initialization, false otherwise.
Definition: system.h:2210
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2113
const Parallel::Communicator & comm() const
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
dof_id_type n_local_dofs() const
Definition: system.C:150
dof_id_type n_dofs() const
Definition: system.C:113
processor_id_type n_processors() const
std::map< std::string, int, std::less<> > _vector_is_adjoint
Holds non-negative if a vector by that name should be projected using adjoint constraints/BCs, -1 if primal.
Definition: system.h:2176
libmesh_assert(ctx)
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package())
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
template class LIBMESH_EXPORT NumericVector< Number >
std::map< std::string, bool, std::less<> > _vector_projections
Holds true if a vector by that name should be projected onto a changed grid, false if it should be ze...
Definition: system.h:2170

◆ add_weighted_sensitivity_adjoint_solution()

NumericVector< Number > & libMesh::System::add_weighted_sensitivity_adjoint_solution ( unsigned int  i = 0)
inherited
Returns
A reference to one of the system's weighted sensitivity adjoint solution vectors, by default the one corresponding to the first qoi. Creates the vector if it doesn't already exist.

Definition at line 1213 of file system.C.

References libMesh::System::add_vector(), and libMesh::System::set_vector_as_adjoint().

Referenced by libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve().

1214 {
1215  std::ostringstream adjoint_name;
1216  adjoint_name << "weighted_sensitivity_adjoint_solution" << i;
1217 
1218  NumericVector<Number> & returnval = this->add_vector(adjoint_name.str());
1219  this->set_vector_as_adjoint(adjoint_name.str(), i);
1220  return returnval;
1221 }
void set_vector_as_adjoint(const std::string &vec_name, int qoi_num)
Allows one to set the QoI index controlling whether the vector identified by vec_name represents a so...
Definition: system.C:1107
NumericVector< Number > & add_vector(std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Adds the additional vector vec_name to this system.
Definition: system.C:751
template class LIBMESH_EXPORT NumericVector< Number >

◆ add_weighted_sensitivity_solution()

NumericVector< Number > & libMesh::System::add_weighted_sensitivity_solution ( )
inherited
Returns
A reference to the solution of the last weighted sensitivity solve Creates the vector if it doesn't already exist.

Definition at line 1160 of file system.C.

References libMesh::System::add_vector().

Referenced by libMesh::ImplicitSystem::weighted_sensitivity_solve().

1161 {
1162  return this->add_vector("weighted_sensitivity_solution");
1163 }
NumericVector< Number > & add_vector(std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Adds the additional vector vec_name to this system.
Definition: system.C:751

◆ adjoint_qoi_parameter_sensitivity()

void libMesh::ImplicitSystem::adjoint_qoi_parameter_sensitivity ( const QoISet qoi_indices,
const ParameterVector parameters,
SensitivityData sensitivities 
)
overridevirtualinherited

Solves for the derivative of each of the system's quantities of interest q in qoi[qoi_indices] with respect to each parameter in parameters, placing the result for qoi i and parameter j into sensitivities[i][j].

Uses adjoint_solve() and the adjoint sensitivity method.

Currently uses finite differenced derivatives (partial q / partial p) and (partial R / partial p).

Reimplemented from libMesh::System.

Definition at line 490 of file implicit_system.C.

References std::abs(), libMesh::ImplicitSystem::adjoint_solve(), libMesh::SensitivityData::allocate_data(), libMesh::ExplicitSystem::assemble_qoi(), libMesh::ImplicitSystem::assemble_residual_derivatives(), libMesh::NumericVector< T >::dot(), libMesh::System::get_qoi_values(), libMesh::System::get_sensitivity_rhs(), libMesh::QoISet::has_index(), libMesh::System::is_adjoint_already_solved(), libMesh::System::n_qois(), libMesh::Real, libMesh::ParameterVector::size(), and libMesh::TOLERANCE.

Referenced by libMesh::UnsteadySolver::integrate_adjoint_sensitivity(), and main().

493 {
494  ParameterVector & parameters =
495  const_cast<ParameterVector &>(parameters_in);
496 
497  const unsigned int Np = cast_int<unsigned int>
498  (parameters.size());
499  const unsigned int Nq = this->n_qois();
500 
501  // An introduction to the problem:
502  //
503  // Residual R(u(p),p) = 0
504  // partial R / partial u = J = system matrix
505  //
506  // This implies that:
507  // d/dp(R) = 0
508  // (partial R / partial p) +
509  // (partial R / partial u) * (partial u / partial p) = 0
510 
511  // We first do an adjoint solve:
512  // J^T * z = (partial q / partial u)
513  // if we haven't already or dont have an initial condition for the adjoint
514  if (!this->is_adjoint_already_solved())
515  {
516  this->adjoint_solve(qoi_indices);
517  }
518 
519  this->assemble_residual_derivatives(parameters_in);
520 
521  // Get ready to fill in sensitivities:
522  sensitivities.allocate_data(qoi_indices, *this, parameters);
523 
524  // We use the identities:
525  // dq/dp = (partial q / partial p) + (partial q / partial u) *
526  // (partial u / partial p)
527  // dq/dp = (partial q / partial p) + (J^T * z) *
528  // (partial u / partial p)
529  // dq/dp = (partial q / partial p) + z * J *
530  // (partial u / partial p)
531 
532  // Leading to our final formula:
533  // dq/dp = (partial q / partial p) - z * (partial R / partial p)
534 
535  // In the case of adjoints with heterogenous Dirichlet boundary
536  // function phi, where
537  // q := S(u) - R(u,phi)
538  // the final formula works out to:
539  // dq/dp = (partial S / partial p) - z * (partial R / partial p)
540  // Because we currently have no direct access to
541  // (partial S / partial p), we use the identity
542  // (partial S / partial p) = (partial q / partial p) +
543  // phi * (partial R / partial p)
544  // to derive an equivalent equation:
545  // dq/dp = (partial q / partial p) - (z-phi) * (partial R / partial p)
546 
547  // Since z-phi degrees of freedom are zero for constrained indices,
548  // we can use the same constrained -(partial R / partial p) that we
549  // use for forward sensitivity solves, taking into account the
550  // differing sign convention.
551  //
552  // Since that vector is constrained, its constrained indices are
553  // zero, so its product with phi is zero, so we can neglect the
554  // evaluation of phi terms.
555 
556  for (unsigned int j=0; j != Np; ++j)
557  {
558  // We currently get partial derivatives via central differencing
559 
560  // (partial q / partial p) ~= (q(p+dp)-q(p-dp))/(2*dp)
561  // (partial R / partial p) ~= (rhs(p+dp) - rhs(p-dp))/(2*dp)
562 
563  Number old_parameter = *parameters[j];
564 
565  const Real delta_p =
566  TOLERANCE * std::max(std::abs(old_parameter), 1e-3);
567 
568  *parameters[j] = old_parameter - delta_p;
569  this->assemble_qoi(qoi_indices);
570  const std::vector<Number> qoi_minus = this->get_qoi_values();
571 
572  NumericVector<Number> & neg_partialR_partialp = this->get_sensitivity_rhs(j);
573 
574  *parameters[j] = old_parameter + delta_p;
575  this->assemble_qoi(qoi_indices);
576  const std::vector<Number> qoi_plus = this->get_qoi_values();
577 
578  std::vector<Number> partialq_partialp(Nq, 0);
579  for (unsigned int i=0; i != Nq; ++i)
580  if (qoi_indices.has_index(i))
581  partialq_partialp[i] = (qoi_plus[i] - qoi_minus[i]) / (2.*delta_p);
582 
583  // Don't leave the parameter changed
584  *parameters[j] = old_parameter;
585 
586  for (unsigned int i=0; i != Nq; ++i)
587  if (qoi_indices.has_index(i))
588  sensitivities[i][j] = partialq_partialp[i] +
589  neg_partialR_partialp.dot(this->get_adjoint_solution(i));
590  }
591 
592  // All parameters have been reset.
593  // Reset the original qoi.
594 
595  this->assemble_qoi(qoi_indices);
596 }
static constexpr Real TOLERANCE
unsigned int n_qois() const
Number of currently active quantities of interest.
Definition: system.h:2516
NumericVector< Number > & get_sensitivity_rhs(unsigned int i=0)
Definition: system.C:1285
virtual std::pair< unsigned int, Real > adjoint_solve(const QoISet &qoi_indices=QoISet()) override
Assembles & solves the linear system (dR/du)^T*z = dq/du, for those quantities of interest q specifie...
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
Definition: type_vector.h:57
bool is_adjoint_already_solved() const
Accessor for the adjoint_already_solved boolean.
Definition: system.h:406
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual void assemble_qoi(const QoISet &qoi_indices=QoISet()) override
Prepares qoi for quantity of interest assembly, then calls user qoi function.
virtual void assemble_residual_derivatives(const ParameterVector &parameters) override
Residual parameter derivative function.
template class LIBMESH_EXPORT NumericVector< Number >
std::vector< Number > get_qoi_values() const
Returns a copy of qoi, not a reference.
Definition: system.C:2341

◆ adjoint_solve()

std::pair< unsigned int, Real > libMesh::DifferentiableSystem::adjoint_solve ( const QoISet qoi_indices = QoISet())
overridevirtualinherited

This function sets the _is_adjoint boolean member of TimeSolver to true and then calls the adjoint_solve in implicit system.

Reimplemented from libMesh::ImplicitSystem.

Definition at line 150 of file diff_system.C.

References libMesh::DifferentiableSystem::get_time_solver(), libMesh::TimeSolver::set_is_adjoint(), and libMesh::DifferentiableSystem::time_solver.

Referenced by main().

151 {
152  // Get the time solver object associated with the system, and tell it that
153  // we are solving the adjoint problem
154  this->get_time_solver().set_is_adjoint(true);
155 
156  return time_solver->adjoint_solve(qoi_indices);
157 
158  //return this->ImplicitSystem::adjoint_solve(qoi_indices);
159 }
std::unique_ptr< TimeSolver > time_solver
A pointer to the solver object we&#39;re going to use.
Definition: diff_system.h:251
void set_is_adjoint(bool _is_adjoint_value)
Accessor for setting whether we need to do a primal or adjoint solve.
Definition: time_solver.h:284
TimeSolver & get_time_solver()
Definition: diff_system.h:454

◆ analytic_jacobians() [1/2]

bool& HeatSystem::analytic_jacobians ( )
inline

Definition at line 44 of file heatsystem.h.

44 { return _analytic_jacobians; }
bool _analytic_jacobians
Definition: heatsystem.h:136

◆ analytic_jacobians() [2/2]

bool& HeatSystem::analytic_jacobians ( )
inline

Definition at line 49 of file heatsystem.h.

Referenced by set_system_parameters().

49 { return _analytic_jacobians; }
bool _analytic_jacobians
Definition: heatsystem.h:136

◆ assemble()

void libMesh::DifferentiableSystem::assemble ( )
overridevirtualinherited

Prepares matrix and rhs for matrix assembly.

Users should not reimplement this. Note that in some cases only current_local_solution is used during assembly, and, therefore, if solution has been altered without update() being called, then the user must call update() before calling this function.

Reimplemented from libMesh::ImplicitSystem.

Definition at line 131 of file diff_system.C.

References libMesh::DifferentiableSystem::assembly().

132 {
133  this->assembly(true, true);
134 }
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.

◆ assemble_qoi()

void FEMSystem::assemble_qoi ( const QoISet indices = QoISet())
overridevirtualinherited

Runs a qoi assembly loop over all elements, and if assemble_qoi_sides is true over all sides.

Users may have to override this function if they have any quantities of interest that are not expressible as a sum of element qois.

Reimplemented from libMesh::ExplicitSystem.

Definition at line 1147 of file fem_system.C.

References libMesh::ParallelObject::comm(), libMesh::System::get_mesh(), libMesh::DifferentiableSystem::get_qoi(), libMesh::System::get_qoi_values(), libMesh::QoISet::has_index(), mesh, libMesh::System::n_qois(), libMesh::DifferentiableQoI::parallel_op(), libMesh::Threads::parallel_reduce(), libMesh::StoredRange< iterator_type, object_type >::reset(), libMesh::System::set_qoi(), and libMesh::System::update().

1148 {
1149  LOG_SCOPE("assemble_qoi()", "FEMSystem");
1150 
1151  const MeshBase & mesh = this->get_mesh();
1152 
1153  this->update();
1154 
1155  const unsigned int Nq = this->n_qois();
1156 
1157  // the quantity of interest is assumed to be a sum of element and
1158  // side terms
1159  for (unsigned int i=0; i != Nq; ++i)
1160  if (qoi_indices.has_index(i))
1161  this->set_qoi(i, 0);
1162 
1163  // Create a non-temporary qoi_contributions object, so we can query
1164  // its results after the reduction
1165  QoIContributions qoi_contributions(*this, *(this->get_qoi()), qoi_indices);
1166 
1167  // Loop over every active mesh element on this processor
1168  Threads::parallel_reduce(elem_range.reset(mesh.active_local_elements_begin(),
1169  mesh.active_local_elements_end()),
1170  qoi_contributions);
1171 
1172  std::vector<Number> global_qoi = this->get_qoi_values();
1173  this->get_qoi()->parallel_op( this->comm(), global_qoi, qoi_contributions.qoi, qoi_indices );
1174  this->set_qoi(std::move(global_qoi));
1175 }
const DifferentiableQoI * get_qoi() const
Definition: diff_system.h:227
virtual void parallel_op(const Parallel::Communicator &communicator, std::vector< Number > &sys_qoi, std::vector< Number > &local_qoi, const QoISet &qoi_indices)
Method to populate system qoi data structure with process-local qoi.
Definition: diff_qoi.C:41
unsigned int n_qois() const
Number of currently active quantities of interest.
Definition: system.h:2516
MeshBase & mesh
const Parallel::Communicator & comm() const
const MeshBase & get_mesh() const
Definition: system.h:2277
This is the MeshBase class.
Definition: mesh_base.h:74
virtual void update()
Update the local values to reflect the solution on neighboring processors.
Definition: system.C:493
void parallel_reduce(const Range &range, Body &body)
Execute the provided reduction operation in parallel on the specified range.
Definition: threads_none.h:101
void set_qoi(unsigned int qoi_index, Number qoi_value)
Definition: system.C:2326
std::vector< Number > get_qoi_values() const
Returns a copy of qoi, not a reference.
Definition: system.C:2341

◆ assemble_qoi_derivative()

void FEMSystem::assemble_qoi_derivative ( const QoISet qoi_indices = QoISet(),
bool  include_liftfunc = true,
bool  apply_constraints = true 
)
overridevirtualinherited

Runs a qoi derivative assembly loop over all elements, and if assemble_qoi_sides is true over all sides.

Users may have to override this function for quantities of interest that are not expressible as a sum of element qois.

Reimplemented from libMesh::ExplicitSystem.

Definition at line 1179 of file fem_system.C.

References libMesh::System::add_adjoint_rhs(), libMesh::DifferentiableQoI::finalize_derivative(), libMesh::System::get_adjoint_rhs(), libMesh::System::get_mesh(), libMesh::DifferentiableSystem::get_qoi(), libMesh::QoISet::has_index(), libMesh::make_range(), mesh, libMesh::System::n_qois(), libMesh::Threads::parallel_for(), libMesh::StoredRange< iterator_type, object_type >::reset(), libMesh::System::update(), and libMesh::NumericVector< T >::zero().

1182 {
1183  LOG_SCOPE("assemble_qoi_derivative()", "FEMSystem");
1184 
1185  const MeshBase & mesh = this->get_mesh();
1186 
1187  this->update();
1188 
1189  // The quantity of interest derivative assembly accumulates on
1190  // initially zero vectors
1191  for (auto i : make_range(this->n_qois()))
1192  if (qoi_indices.has_index(i))
1193  this->add_adjoint_rhs(i).zero();
1194 
1195  // Loop over every active mesh element on this processor
1196  Threads::parallel_for (elem_range.reset(mesh.active_local_elements_begin(),
1197  mesh.active_local_elements_end()),
1198  QoIDerivativeContributions(*this, qoi_indices,
1199  *(this->get_qoi()),
1200  include_liftfunc,
1201  apply_constraints));
1202 
1203  for (auto i : make_range(this->n_qois()))
1204  if (qoi_indices.has_index(i))
1205  this->get_qoi()->finalize_derivative(this->get_adjoint_rhs(i),i);
1206 }
const DifferentiableQoI * get_qoi() const
Definition: diff_system.h:227
void parallel_for(const Range &range, const Body &body)
Execute the provided function object in parallel on the specified range.
Definition: threads_none.h:73
unsigned int n_qois() const
Number of currently active quantities of interest.
Definition: system.h:2516
MeshBase & mesh
const MeshBase & get_mesh() const
Definition: system.h:2277
This is the MeshBase class.
Definition: mesh_base.h:74
virtual void zero()=0
Set all entries to zero.
bool has_index(std::size_t) const
Return whether or not this index is in the set to be calculated.
Definition: qoi_set.h:224
NumericVector< Number > & add_adjoint_rhs(unsigned int i=0)
Definition: system.C:1245
virtual void update()
Update the local values to reflect the solution on neighboring processors.
Definition: system.C:493
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
virtual void finalize_derivative(NumericVector< Number > &derivatives, std::size_t qoi_index)
Method to finalize qoi derivatives which require more than just a simple sum of element contributions...
Definition: diff_qoi.C:53
NumericVector< Number > & get_adjoint_rhs(unsigned int i=0)
Definition: system.C:1255

◆ assemble_residual_derivatives()

void libMesh::ImplicitSystem::assemble_residual_derivatives ( const ParameterVector parameters)
overridevirtualinherited

Residual parameter derivative function.

Uses finite differences by default.

This will assemble the sensitivity rhs vectors to hold -(partial R / partial p_i), making them ready to solve the forward sensitivity equation.

Can be overridden in derived classes.

Reimplemented from libMesh::System.

Definition at line 447 of file implicit_system.C.

References std::abs(), libMesh::System::add_sensitivity_rhs(), libMesh::ImplicitSystem::assembly(), libMesh::NumericVector< T >::close(), libMesh::Real, libMesh::ExplicitSystem::rhs, libMesh::ParameterVector::size(), and libMesh::TOLERANCE.

Referenced by libMesh::ImplicitSystem::adjoint_qoi_parameter_sensitivity(), and libMesh::ImplicitSystem::sensitivity_solve().

448 {
449  ParameterVector & parameters =
450  const_cast<ParameterVector &>(parameters_in);
451 
452  const unsigned int Np = cast_int<unsigned int>
453  (parameters.size());
454 
455  for (unsigned int p=0; p != Np; ++p)
456  {
457  NumericVector<Number> & sensitivity_rhs = this->add_sensitivity_rhs(p);
458 
459  // Approximate -(partial R / partial p) by
460  // (R(p-dp) - R(p+dp)) / (2*dp)
461 
462  Number old_parameter = *parameters[p];
463 
464  const Real delta_p =
465  TOLERANCE * std::max(std::abs(old_parameter), 1e-3);
466 
467  *parameters[p] -= delta_p;
468 
469  // this->assembly(true, false, true);
470  this->assembly(true, false, false);
471  this->rhs->close();
472  sensitivity_rhs = *this->rhs;
473 
474  *parameters[p] = old_parameter + delta_p;
475 
476  // this->assembly(true, false, true);
477  this->assembly(true, false, false);
478  this->rhs->close();
479 
480  sensitivity_rhs -= *this->rhs;
481  sensitivity_rhs /= (2*delta_p);
482  sensitivity_rhs.close();
483 
484  *parameters[p] = old_parameter;
485  }
486 }
static constexpr Real TOLERANCE
NumericVector< Number > * rhs
The system matrix.
NumericVector< Number > & add_sensitivity_rhs(unsigned int i=0)
Definition: system.C:1275
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
Definition: type_vector.h:57
virtual void assembly(bool, bool, bool=false, bool=false)
Assembles a residual in rhs and/or a jacobian in matrix, as requested.
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
template class LIBMESH_EXPORT NumericVector< Number >

◆ assembly()

void FEMSystem::assembly ( bool  get_residual,
bool  get_jacobian,
bool  apply_heterogeneous_constraints = false,
bool  apply_no_constraints = false 
)
overridevirtualinherited

Prepares matrix or rhs for matrix assembly.

Users may reimplement this to add pre- or post-assembly code before or after calling FEMSystem::assembly(). Note that in some cases only current_local_solution is used during assembly, and, therefore, if solution has been altered without update() being called, then the user must call update() before calling this function.

Implements libMesh::DifferentiableSystem.

Definition at line 880 of file fem_system.C.

References libMesh::DenseMatrix< T >::add(), libMesh::FEMSystem::build_context(), libMesh::NumericVector< T >::close(), libMesh::SparseMatrix< T >::close(), libMesh::err, libMesh::FEType::family, libMesh::DiffContext::get_elem_jacobian(), libMesh::DiffContext::get_elem_residual(), libMesh::System::get_mesh(), libMesh::FEMSystem::init_context(), libMesh::NumericVector< T >::l1_norm(), libMesh::DenseMatrix< T >::l1_norm(), libMesh::SparseMatrix< T >::l1_norm(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::ImplicitSystem::matrix, mesh, libMesh::ParallelObject::n_processors(), libMesh::System::n_variable_groups(), libMesh::FEMSystem::numerical_nonlocal_jacobian(), libMesh::out, libMesh::Threads::parallel_for(), libMesh::FEMContext::pre_fe_reinit(), libMesh::BasicOStreamProxy< charT, traits >::precision(), libMesh::DifferentiableSystem::print_jacobian_norms, libMesh::DifferentiableSystem::print_jacobians, libMesh::DifferentiableSystem::print_residual_norms, libMesh::DifferentiableSystem::print_residuals, libMesh::DifferentiableSystem::print_solution_norms, libMesh::DifferentiableSystem::print_solutions, libMesh::ParallelObject::processor_id(), libMesh::Real, libMesh::StoredRange< iterator_type, object_type >::reset(), libMesh::ExplicitSystem::rhs, libMesh::SCALAR, libMesh::DenseVector< T >::size(), libMesh::System::solution, libMesh::DifferentiableSystem::time_solver, libMesh::Variable::type(), libMesh::System::variable_group(), libMesh::FEMSystem::verify_analytic_jacobians, libMesh::DenseMatrix< T >::zero(), libMesh::NumericVector< T >::zero(), and libMesh::SparseMatrix< T >::zero().

Referenced by libMesh::ContinuationSystem::continuation_solve(), perturb_accumulate_residuals(), and libMesh::ContinuationSystem::solve_tangent().

883 {
884  libmesh_assert(get_residual || get_jacobian);
885 
886  // Log residual and jacobian and combined performance separately
887 #ifdef LIBMESH_ENABLE_PERFORMANCE_LOGGING
888  const char * log_name;
889  if (get_residual && get_jacobian)
890  log_name = "assembly()";
891  else if (get_residual)
892  log_name = "assembly(get_residual)";
893  else
894  log_name = "assembly(get_jacobian)";
895 
896  LOG_SCOPE(log_name, "FEMSystem");
897 #endif
898 
899  const MeshBase & mesh = this->get_mesh();
900 
902  {
903  this->solution->close();
904 
905  std::streamsize old_precision = libMesh::out.precision();
907  libMesh::out << "|U| = "
908  << this->solution->l1_norm()
909  << std::endl;
910  libMesh::out.precision(old_precision);
911  }
912  if (print_solutions)
913  {
914  std::streamsize old_precision = libMesh::out.precision();
916  libMesh::out << "U = [" << *(this->solution)
917  << "];" << std::endl;
918  libMesh::out.precision(old_precision);
919  }
920 
921  // Is this definitely necessary? [RHS]
922  // Yes. [RHS 2012]
923  if (get_jacobian)
924  matrix->zero();
925  if (get_residual)
926  rhs->zero();
927 
928  // Stupid C++ lets you set *Real* verify_analytic_jacobians = true!
929  if (verify_analytic_jacobians > 0.5)
930  {
931  libMesh::err << "WARNING! verify_analytic_jacobians was set "
932  << "to absurdly large value of "
933  << verify_analytic_jacobians << std::endl;
934  libMesh::err << "Resetting to 1e-6!" << std::endl;
936  }
937 
938  // In time-dependent problems, the nonlinear function we're trying
939  // to solve at each timestep may depend on the particular solver
940  // we're using
942 
943  // Build the residual and jacobian contributions on every active
944  // mesh element on this processor
946  (elem_range.reset(mesh.active_local_elements_begin(),
947  mesh.active_local_elements_end()),
948  AssemblyContributions(*this, get_residual, get_jacobian,
949  apply_heterogeneous_constraints,
950  apply_no_constraints));
951 
952  // Check and see if we have SCALAR variables
953  bool have_scalar = false;
954  for (auto i : make_range(this->n_variable_groups()))
955  {
956  if (this->variable_group(i).type().family == SCALAR)
957  {
958  have_scalar = true;
959  break;
960  }
961  }
962 
963  // SCALAR dofs are stored on the last processor, so we'll evaluate
964  // their equation terms there and only if we have a SCALAR variable
965  if (this->processor_id() == (this->n_processors()-1) && have_scalar)
966  {
967  std::unique_ptr<DiffContext> con = this->build_context();
968  FEMContext & _femcontext = cast_ref<FEMContext &>(*con);
969  this->init_context(_femcontext);
970  _femcontext.pre_fe_reinit(*this, nullptr);
971 
972  bool jacobian_computed =
973  this->time_solver->nonlocal_residual(get_jacobian, _femcontext);
974 
975  // Nonlocal residuals are likely to be length 0, in which case we
976  // don't need to do any more. And we shouldn't try to do any
977  // more; lots of DenseVector/DenseMatrix code assumes rank>0.
978  if (_femcontext.get_elem_residual().size())
979  {
980  // Compute a numeric jacobian if we have to
981  if (get_jacobian && !jacobian_computed)
982  {
983  // Make sure we didn't compute a jacobian and lie about it
984  libmesh_assert_equal_to (_femcontext.get_elem_jacobian().l1_norm(), 0.0);
985  // Logging of numerical jacobians is done separately
986  this->numerical_nonlocal_jacobian(_femcontext);
987  }
988 
989  // Compute a numeric jacobian if we're asked to verify the
990  // analytic jacobian we got
991  if (get_jacobian && jacobian_computed &&
992  this->verify_analytic_jacobians != 0.0)
993  {
994  DenseMatrix<Number> analytic_jacobian(_femcontext.get_elem_jacobian());
995 
996  _femcontext.get_elem_jacobian().zero();
997  // Logging of numerical jacobians is done separately
998  this->numerical_nonlocal_jacobian(_femcontext);
999 
1000  Real analytic_norm = analytic_jacobian.l1_norm();
1001  Real numerical_norm = _femcontext.get_elem_jacobian().l1_norm();
1002 
1003  // If we can continue, we'll probably prefer the analytic jacobian
1004  analytic_jacobian.swap(_femcontext.get_elem_jacobian());
1005 
1006  // The matrix "analytic_jacobian" will now hold the error matrix
1007  analytic_jacobian.add(-1.0, _femcontext.get_elem_jacobian());
1008  Real error_norm = analytic_jacobian.l1_norm();
1009 
1010  Real relative_error = error_norm /
1011  std::max(analytic_norm, numerical_norm);
1012 
1013  if (relative_error > this->verify_analytic_jacobians)
1014  {
1015  libMesh::err << "Relative error " << relative_error
1016  << " detected in analytic jacobian on nonlocal dofs!"
1017  << std::endl;
1018 
1019  std::streamsize old_precision = libMesh::out.precision();
1020  libMesh::out.precision(16);
1021  libMesh::out << "J_analytic nonlocal = "
1022  << _femcontext.get_elem_jacobian() << std::endl;
1023  analytic_jacobian.add(1.0, _femcontext.get_elem_jacobian());
1024  libMesh::out << "J_numeric nonlocal = "
1025  << analytic_jacobian << std::endl;
1026 
1027  libMesh::out.precision(old_precision);
1028 
1029  libmesh_error_msg("Relative error too large, exiting!");
1030  }
1031  }
1032 
1033  add_element_system
1034  (*this, get_residual, get_jacobian,
1035  apply_heterogeneous_constraints, apply_no_constraints, _femcontext);
1036  }
1037  }
1038 
1039  if (get_residual && (print_residual_norms || print_residuals))
1040  this->rhs->close();
1041  if (get_residual && print_residual_norms)
1042  {
1043  std::streamsize old_precision = libMesh::out.precision();
1044  libMesh::out.precision(16);
1045  libMesh::out << "|F| = " << this->rhs->l1_norm() << std::endl;
1046  libMesh::out.precision(old_precision);
1047  }
1048  if (get_residual && print_residuals)
1049  {
1050  std::streamsize old_precision = libMesh::out.precision();
1051  libMesh::out.precision(16);
1052  libMesh::out << "F = [" << *(this->rhs) << "];" << std::endl;
1053  libMesh::out.precision(old_precision);
1054  }
1055 
1056  if (get_jacobian && (print_jacobian_norms || print_jacobians))
1057  this->matrix->close();
1058  if (get_jacobian && print_jacobian_norms)
1059  {
1060  std::streamsize old_precision = libMesh::out.precision();
1061  libMesh::out.precision(16);
1062  libMesh::out << "|J| = " << this->matrix->l1_norm() << std::endl;
1063  libMesh::out.precision(old_precision);
1064  }
1065  if (get_jacobian && print_jacobians)
1066  {
1067  std::streamsize old_precision = libMesh::out.precision();
1068  libMesh::out.precision(16);
1069  libMesh::out << "J = [" << *(this->matrix) << "];" << std::endl;
1070  libMesh::out.precision(old_precision);
1071  }
1072 }
OStreamProxy err
FEFamily family
The type of finite element.
Definition: fe_type.h:207
virtual std::unique_ptr< DiffContext > build_context() override
Builds a FEMContext object with enough information to do evaluations on each element.
Definition: fem_system.C:1346
const DenseMatrix< Number > & get_elem_jacobian() const
Const accessor for element Jacobian.
Definition: diff_context.h:274
Real verify_analytic_jacobians
If verify_analytic_jacobian is equal to zero (as it is by default), no numeric jacobians will be calc...
Definition: fem_system.h:215
virtual void pre_fe_reinit(const System &, const Elem *e)
Reinitializes local data vectors/matrices on the current geometric element.
Definition: fem_context.C:1675
std::streamsize precision() const
Get the associated write precision.
virtual void zero() override final
Sets all elements of the matrix to 0 and resets any decomposition flag which may have been previously...
Definition: dense_matrix.h:911
void parallel_for(const Range &range, const Body &body)
Execute the provided function object in parallel on the specified range.
Definition: threads_none.h:73
bool print_jacobian_norms
Set print_jacobian_norms to true to print |J| whenever it is assembled.
Definition: diff_system.h:359
virtual void init_context(DiffContext &) override
Definition: fem_system.C:1370
unsigned int n_variable_groups() const
Definition: system.h:2357
std::unique_ptr< TimeSolver > time_solver
A pointer to the solver object we&#39;re going to use.
Definition: diff_system.h:251
MeshBase & mesh
NumericVector< Number > * rhs
The system matrix.
auto l1_norm() const -> decltype(std::abs(T(0)))
bool print_jacobians
Set print_jacobians to true to print J whenever it is assembled.
Definition: diff_system.h:364
const MeshBase & get_mesh() const
Definition: system.h:2277
This is the MeshBase class.
Definition: mesh_base.h:74
virtual void zero()=0
Set all entries to zero.
bool print_solution_norms
Set print_residual_norms to true to print |U| whenever it is used in an assembly() call...
Definition: diff_system.h:338
processor_id_type n_processors() const
virtual void zero()=0
Set all entries to 0.
bool print_residual_norms
Set print_residual_norms to true to print |F| whenever it is assembled.
Definition: diff_system.h:349
void numerical_nonlocal_jacobian(FEMContext &context) const
Uses the results of multiple side_residual() calls to numerically differentiate the corresponding jac...
Definition: fem_system.C:1338
boostcopy::enable_if_c< ScalarTraits< T2 >::value, void >::type add(const T2 factor, const DenseMatrix< T3 > &mat)
Adds factor times mat to this matrix.
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
bool print_residuals
Set print_residuals to true to print F whenever it is assembled.
Definition: diff_system.h:354
libmesh_assert(ctx)
This class provides all data required for a physics package (e.g.
Definition: fem_context.h:62
virtual Real l1_norm() const =0
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
bool print_solutions
Set print_solutions to true to print U whenever it is used in an assembly() call. ...
Definition: diff_system.h:344
const DenseVector< Number > & get_elem_residual() const
Const accessor for element residual.
Definition: diff_context.h:242
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
OStreamProxy out
SparseMatrix< Number > * matrix
The system matrix.
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
virtual unsigned int size() const override final
Definition: dense_vector.h:104
virtual Real l1_norm() const =0
processor_id_type processor_id() const
const VariableGroup & variable_group(unsigned int vg) const
Return a constant reference to VariableGroup vg.
Definition: system.h:2387
const FEType & type() const
Definition: variable.h:140

◆ attach_assemble_function()

void libMesh::System::attach_assemble_function ( void   fptrEquationSystems &es, const std::string &name)
inherited

Register a user function to use in assembling the system matrix and RHS.

Definition at line 2109 of file system.C.

References libMesh::System::_assemble_system_function, libMesh::System::_assemble_system_object, fptr(), and libMesh::libmesh_assert().

Referenced by assemble_and_solve(), main(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), SystemsTest::testAssemblyWithDgFemContext(), SystemsTest::testDofCouplingWithVarGroups(), and PeriodicBCTest::testPeriodicBC().

2111 {
2113 
2114  if (_assemble_system_object != nullptr)
2115  {
2116  libmesh_warning("WARNING: Cannot specify both assembly function and object!");
2117 
2118  _assemble_system_object = nullptr;
2119  }
2120 
2122 }
Assembly * _assemble_system_object
Object that assembles the system.
Definition: system.h:2070
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:80
libmesh_assert(ctx)
void(* _assemble_system_function)(EquationSystems &es, const std::string &name)
Function that assembles the system.
Definition: system.h:2064

◆ attach_assemble_object()

void libMesh::System::attach_assemble_object ( System::Assembly assemble_in)
inherited

Register a user object to use in assembling the system matrix and RHS.

Definition at line 2126 of file system.C.

References libMesh::System::_assemble_system_function, and libMesh::System::_assemble_system_object.

Referenced by main().

2127 {
2128  if (_assemble_system_function != nullptr)
2129  {
2130  libmesh_warning("WARNING: Cannot specify both assembly object and function!");
2131 
2132  _assemble_system_function = nullptr;
2133  }
2134 
2135  _assemble_system_object = &assemble_in;
2136 }
Assembly * _assemble_system_object
Object that assembles the system.
Definition: system.h:2070
void(* _assemble_system_function)(EquationSystems &es, const std::string &name)
Function that assembles the system.
Definition: system.h:2064

◆ attach_constraint_function()

void libMesh::System::attach_constraint_function ( void   fptrEquationSystems &es, const std::string &name)
inherited

Register a user function for imposing constraints.

Definition at line 2140 of file system.C.

References libMesh::System::_constrain_system_function, libMesh::System::_constrain_system_object, fptr(), and libMesh::libmesh_assert().

2142 {
2144 
2145  if (_constrain_system_object != nullptr)
2146  {
2147  libmesh_warning("WARNING: Cannot specify both constraint function and object!");
2148 
2149  _constrain_system_object = nullptr;
2150  }
2151 
2153 }
void(* _constrain_system_function)(EquationSystems &es, const std::string &name)
Function to impose constraints.
Definition: system.h:2075
Constraint * _constrain_system_object
Object that constrains the system.
Definition: system.h:2081
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:80
libmesh_assert(ctx)

◆ attach_constraint_object()

void libMesh::System::attach_constraint_object ( System::Constraint constrain)
inherited

Register a user object for imposing constraints.

Definition at line 2157 of file system.C.

References libMesh::System::_constrain_system_function, and libMesh::System::_constrain_system_object.

Referenced by DofMapTest::testConstraintLoopDetection().

2158 {
2159  if (_constrain_system_function != nullptr)
2160  {
2161  libmesh_warning("WARNING: Cannot specify both constraint object and function!");
2162 
2163  _constrain_system_function = nullptr;
2164  }
2165 
2166  _constrain_system_object = &constrain;
2167 }
void(* _constrain_system_function)(EquationSystems &es, const std::string &name)
Function to impose constraints.
Definition: system.h:2075
Constraint * _constrain_system_object
Object that constrains the system.
Definition: system.h:2081

◆ attach_init_function()

void libMesh::System::attach_init_function ( void   fptrEquationSystems &es, const std::string &name)
inherited

Register a user function to use in initializing the system.

Definition at line 2078 of file system.C.

References libMesh::System::_init_system_function, libMesh::System::_init_system_object, fptr(), and libMesh::libmesh_assert().

Referenced by main().

2080 {
2082 
2083  if (_init_system_object != nullptr)
2084  {
2085  libmesh_warning("WARNING: Cannot specify both initialization function and object!");
2086 
2087  _init_system_object = nullptr;
2088  }
2089 
2091 }
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:80
libmesh_assert(ctx)
Initialization * _init_system_object
Object that initializes the system.
Definition: system.h:2059
void(* _init_system_function)(EquationSystems &es, const std::string &name)
Function that initializes the system.
Definition: system.h:2053

◆ attach_init_object()

void libMesh::System::attach_init_object ( System::Initialization init_in)
inherited

Register a user class to use to initialize the system.

Note
This is exclusive with the attach_init_function.

Definition at line 2095 of file system.C.

References libMesh::System::_init_system_function, and libMesh::System::_init_system_object.

2096 {
2097  if (_init_system_function != nullptr)
2098  {
2099  libmesh_warning("WARNING: Cannot specify both initialization object and function!");
2100 
2101  _init_system_function = nullptr;
2102  }
2103 
2104  _init_system_object = &init_in;
2105 }
Initialization * _init_system_object
Object that initializes the system.
Definition: system.h:2059
void(* _init_system_function)(EquationSystems &es, const std::string &name)
Function that initializes the system.
Definition: system.h:2053

◆ attach_physics()

void libMesh::DifferentiableSystem::attach_physics ( DifferentiablePhysics physics_in)
inlineinherited

Attach external Physics object.

Definition at line 200 of file diff_system.h.

References libMesh::DifferentiableSystem::_diff_physics, and libMesh::DifferentiablePhysics::clone_physics().

201  { this->_diff_physics.push(physics_in->clone_physics());
202  this->_diff_physics.top()->init_physics(*this);}
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.
Definition: diff_system.h:440

◆ attach_qoi()

void libMesh::DifferentiableSystem::attach_qoi ( DifferentiableQoI qoi_in)
inherited

Attach external QoI object.

Definition at line 279 of file diff_system.C.

References libMesh::DifferentiableSystem::_diff_qoi, libMesh::DifferentiableQoI::clone(), libMesh::libmesh_assert(), and libMesh::System::qoi.

Referenced by main().

280 {
281  this->_diff_qoi = {};
282  this->_diff_qoi.push(qoi_in->clone());
283 
284  auto & dq = this->_diff_qoi.top();
285  // User needs to resize qoi system qoi accordingly
286 #ifdef LIBMESH_ENABLE_DEPRECATED
287  // Call the old API for backwards compatibility
288  dq->init_qoi( this->qoi );
289 
290  // Then the new API for forwards compatibility
291  dq->init_qoi_count( *this );
292 #else
293 #ifndef NDEBUG
294  // Make sure the user has updated their QoI subclass - call the old
295  // API and make sure it does nothing
296  std::vector<Number> deprecated_vector;
297  dq->init_qoi( deprecated_vector );
298  libmesh_assert(deprecated_vector.empty());
299 #endif
300 
301  // Then the new API
302  dq->init_qoi_count( *this );
303 #endif
304 }
std::vector< Number > qoi
Values of the quantities of interest.
Definition: system.h:1611
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.
Definition: diff_system.h:448
libmesh_assert(ctx)

◆ attach_QOI_derivative()

void libMesh::System::attach_QOI_derivative ( void   fptrEquationSystems &es, const std::string &name, const QoISet &qoi_indices, bool include_liftfunc, bool apply_constraints)
inherited

Register a user function for evaluating derivatives of a quantity of interest with respect to test functions, whose values should be placed in System::rhs.

Definition at line 2214 of file system.C.

References libMesh::System::_qoi_evaluate_derivative_function, libMesh::System::_qoi_evaluate_derivative_object, fptr(), and libMesh::libmesh_assert().

2216 {
2218 
2219  if (_qoi_evaluate_derivative_object != nullptr)
2220  {
2221  libmesh_warning("WARNING: Cannot specify both QOI derivative function and object!");
2222 
2224  }
2225 
2227 }
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:80
QOIDerivative * _qoi_evaluate_derivative_object
Object to compute derivatives of quantities of interest.
Definition: system.h:2107
libmesh_assert(ctx)
void(* _qoi_evaluate_derivative_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices, bool include_liftfunc, bool apply_constraints)
Function to evaluate quantity of interest derivative.
Definition: system.h:2098

◆ attach_QOI_derivative_object()

void libMesh::System::attach_QOI_derivative_object ( QOIDerivative qoi_derivative)
inherited

Register a user object for evaluating derivatives of a quantity of interest with respect to test functions, whose values should be placed in System::rhs.

Definition at line 2231 of file system.C.

References libMesh::System::_qoi_evaluate_derivative_function, and libMesh::System::_qoi_evaluate_derivative_object.

2232 {
2233  if (_qoi_evaluate_derivative_function != nullptr)
2234  {
2235  libmesh_warning("WARNING: Cannot specify both QOI derivative object and function!");
2236 
2238  }
2239 
2240  _qoi_evaluate_derivative_object = &qoi_derivative;
2241 }
QOIDerivative * _qoi_evaluate_derivative_object
Object to compute derivatives of quantities of interest.
Definition: system.h:2107
void(* _qoi_evaluate_derivative_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices, bool include_liftfunc, bool apply_constraints)
Function to evaluate quantity of interest derivative.
Definition: system.h:2098

◆ attach_QOI_function()

void libMesh::System::attach_QOI_function ( void   fptrEquationSystems &es, const std::string &name, const QoISet &qoi_indices)
inherited

Register a user function for evaluating the quantities of interest, whose values should be placed in System::qoi.

Definition at line 2182 of file system.C.

References libMesh::System::_qoi_evaluate_function, libMesh::System::_qoi_evaluate_object, fptr(), and libMesh::libmesh_assert().

2185 {
2187 
2188  if (_qoi_evaluate_object != nullptr)
2189  {
2190  libmesh_warning("WARNING: Cannot specify both QOI function and object!");
2191 
2192  _qoi_evaluate_object = nullptr;
2193  }
2194 
2196 }
void(* _qoi_evaluate_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices)
Function to evaluate quantity of interest.
Definition: system.h:2086
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:80
libmesh_assert(ctx)
QOI * _qoi_evaluate_object
Object to compute quantities of interest.
Definition: system.h:2093

◆ attach_QOI_object()

void libMesh::System::attach_QOI_object ( QOI qoi)
inherited

Register a user object for evaluating the quantities of interest, whose values should be placed in System::qoi.

Definition at line 2200 of file system.C.

References libMesh::System::_qoi_evaluate_function, and libMesh::System::_qoi_evaluate_object.

2201 {
2202  if (_qoi_evaluate_function != nullptr)
2203  {
2204  libmesh_warning("WARNING: Cannot specify both QOI object and function!");
2205 
2206  _qoi_evaluate_function = nullptr;
2207  }
2208 
2209  _qoi_evaluate_object = &qoi_in;
2210 }
void(* _qoi_evaluate_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices)
Function to evaluate quantity of interest.
Definition: system.h:2086
QOI * _qoi_evaluate_object
Object to compute quantities of interest.
Definition: system.h:2093

◆ boundary_project_solution() [1/2]

void libMesh::System::boundary_project_solution ( const std::set< boundary_id_type > &  b,
const std::vector< unsigned int > &  variables,
FunctionBase< Number > *  f,
FunctionBase< Gradient > *  g = nullptr 
)
inherited

Projects arbitrary boundary functions onto a vector of degree of freedom values for the current system.

This method projects an arbitrary boundary function onto the solution via L2 projections and nodal interpolations on each element.

Only degrees of freedom which affect the function's trace on a boundary in the set b are affected. Only degrees of freedom associated with the variables listed in the vector variables are projected. The function value f and its gradient g are user-provided cloneable functors. A gradient g is only required/used for projecting onto finite element spaces with continuous derivatives. If non-default Parameters are to be used, they can be provided in the parameters argument.

Definition at line 1244 of file system_projection.C.

Referenced by SystemsTest::testBoundaryProjectCube().

1248 {
1249  this->boundary_project_vector(b, variables, *solution, f, g);
1250 
1251  solution->localize(*current_local_solution);
1252 }
void boundary_project_vector(const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1) const
Projects arbitrary boundary functions onto a vector of degree of freedom values for the current syste...
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1585

◆ boundary_project_solution() [2/2]

void libMesh::System::boundary_project_solution ( const std::set< boundary_id_type > &  b,
const std::vector< unsigned int > &  variables,
ValueFunctionPointer  fptr,
GradientFunctionPointer  gptr,
const Parameters parameters 
)
inherited

Projects arbitrary boundary functions onto a vector of degree of freedom values for the current system.

This method projects components of an arbitrary boundary function onto the solution via L2 projections and nodal interpolations on each element.

Only degrees of freedom which affect the function's trace on a boundary in the set b are affected. Only degrees of freedom associated with the variables listed in the vector variables are projected. The function value fptr and its gradient gptr are represented by function pointers. A gradient gptr is only required/used for projecting onto finite element spaces with continuous derivatives.

Definition at line 1227 of file system_projection.C.

References fptr(), and gptr().

1232 {
1233  WrappedFunction<Number> f(*this, fptr, &parameters);
1234  WrappedFunction<Gradient> g(*this, gptr, &parameters);
1235  this->boundary_project_solution(b, variables, &f, &g);
1236 }
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:80
Gradient gptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:95
void boundary_project_solution(const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr)
Projects arbitrary boundary functions onto a vector of degree of freedom values for the current syste...

◆ boundary_project_vector() [1/2]

void libMesh::System::boundary_project_vector ( const std::set< boundary_id_type > &  b,
const std::vector< unsigned int > &  variables,
NumericVector< Number > &  new_vector,
FunctionBase< Number > *  f,
FunctionBase< Gradient > *  g = nullptr,
int  is_adjoint = -1 
) const
inherited

Projects arbitrary boundary functions onto a vector of degree of freedom values for the current system.

This method projects an arbitrary function via L2 projections and nodal interpolations on each element.

Only degrees of freedom which affect the function's trace on a boundary in the set b are affected. Only degrees of freedom associated with the variables listed in the vector variables are projected. The function value f and its gradient g are user-provided cloneable functors. A gradient g is only required/used for projecting onto finite element spaces with continuous derivatives. If non-default Parameters are to be used, they can be provided in the parameters argument.

Constrain the new vector using the requested adjoint rather than primal constraints if is_adjoint is non-negative.

Definition at line 1280 of file system_projection.C.

References libMesh::NumericVector< T >::close(), libMesh::libmesh_ignore(), and libMesh::Threads::parallel_for().

1286 {
1287  LOG_SCOPE ("boundary_project_vector()", "System");
1288 
1290  (ConstElemRange (this->get_mesh().active_local_elements_begin(),
1291  this->get_mesh().active_local_elements_end() ),
1292  BoundaryProjectSolution(b, variables, *this, f, g,
1293  this->get_equation_systems().parameters,
1294  new_vector)
1295  );
1296 
1297  // We don't do SCALAR dofs when just projecting the boundary, so
1298  // we're done here.
1299 
1300  new_vector.close();
1301 
1302 #ifdef LIBMESH_ENABLE_CONSTRAINTS
1303  if (is_adjoint == -1)
1304  this->get_dof_map().enforce_constraints_exactly(*this, &new_vector);
1305  else if (is_adjoint >= 0)
1307  is_adjoint);
1308 #else
1309  libmesh_ignore(is_adjoint);
1310 #endif
1311 }
void parallel_for(const Range &range, const Body &body)
Execute the provided function object in parallel on the specified range.
Definition: threads_none.h:73
const EquationSystems & get_equation_systems() const
Definition: system.h:730
const MeshBase & get_mesh() const
Definition: system.h:2277
StoredRange< MeshBase::const_element_iterator, const Elem * > ConstElemRange
Definition: elem_range.h:34
void enforce_adjoint_constraints_exactly(NumericVector< Number > &v, unsigned int q) const
Heterogeneously constrains the numeric vector v, which represents an adjoint solution defined on the ...
Definition: dof_map.h:2278
void libmesh_ignore(const Args &...)
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
const DofMap & get_dof_map() const
Definition: system.h:2293
void enforce_constraints_exactly(const System &system, NumericVector< Number > *v=nullptr, bool homogeneous=false) const
Constrains the numeric vector v, which represents a solution defined on the mesh. ...
Definition: dof_map.h:2274

◆ boundary_project_vector() [2/2]

void libMesh::System::boundary_project_vector ( const std::set< boundary_id_type > &  b,
const std::vector< unsigned int > &  variables,
ValueFunctionPointer  fptr,
GradientFunctionPointer  gptr,
const Parameters parameters,
NumericVector< Number > &  new_vector,
int  is_adjoint = -1 
) const
inherited

Projects arbitrary boundary functions onto a vector of degree of freedom values for the current system.

This method projects an arbitrary boundary function via L2 projections and nodal interpolations on each element.

Only degrees of freedom which affect the function's trace on a boundary in the set b are affected. Only degrees of freedom associated with the variables listed in the vector variables are projected. The function value fptr and its gradient gptr are represented by function pointers. A gradient gptr is only required/used for projecting onto finite element spaces with continuous derivatives.

Constrain the new vector using the requested adjoint rather than primal constraints if is_adjoint is non-negative.

Definition at line 1262 of file system_projection.C.

References fptr(), and gptr().

1269 {
1270  WrappedFunction<Number> f(*this, fptr, &parameters);
1271  WrappedFunction<Gradient> g(*this, gptr, &parameters);
1272  this->boundary_project_vector(b, variables, new_vector, &f, &g,
1273  is_adjoint);
1274 }
void boundary_project_vector(const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1) const
Projects arbitrary boundary functions onto a vector of degree of freedom values for the current syste...
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:80
Gradient gptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:95

◆ build_context()

std::unique_ptr< DiffContext > FEMSystem::build_context ( )
overridevirtualinherited

Builds a FEMContext object with enough information to do evaluations on each element.

For most problems, the default FEMSystem implementation is correct; users who subclass FEMContext will need to also reimplement this method to build it.

Reimplemented from libMesh::DifferentiableSystem.

Definition at line 1346 of file fem_system.C.

References libMesh::DifferentiableSystem::deltat, libMesh::DifferentiablePhysics::get_mesh_system(), libMesh::DifferentiablePhysics::get_mesh_x_var(), libMesh::DifferentiablePhysics::get_mesh_y_var(), libMesh::DifferentiablePhysics::get_mesh_z_var(), libMesh::DifferentiableSystem::get_physics(), libMesh::DifferentiableSystem::get_time_solver(), libMesh::TimeSolver::is_adjoint(), libMesh::DiffContext::is_adjoint(), libMesh::libmesh_assert(), libMesh::DiffContext::set_deltat_pointer(), libMesh::FEMContext::set_mesh_system(), libMesh::FEMContext::set_mesh_x_var(), libMesh::FEMContext::set_mesh_y_var(), and libMesh::FEMContext::set_mesh_z_var().

Referenced by libMesh::FEMSystem::assembly(), libMesh::FEMSystem::mesh_position_get(), and libMesh::FEMSystem::mesh_position_set().

1347 {
1348  FEMContext * fc = new FEMContext(*this);
1349 
1350  DifferentiablePhysics * phys = this->get_physics();
1351 
1352  libmesh_assert (phys);
1353 
1354  // If we are solving a moving mesh problem, tell that to the Context
1355  fc->set_mesh_system(phys->get_mesh_system());
1356  fc->set_mesh_x_var(phys->get_mesh_x_var());
1357  fc->set_mesh_y_var(phys->get_mesh_y_var());
1358  fc->set_mesh_z_var(phys->get_mesh_z_var());
1359 
1360  fc->set_deltat_pointer( &deltat );
1361 
1362  // If we are solving the adjoint problem, tell that to the Context
1363  fc->is_adjoint() = this->get_time_solver().is_adjoint();
1364 
1365  return std::unique_ptr<DiffContext>(fc);
1366 }
unsigned int get_mesh_x_var() const
Definition: diff_physics.h:625
void set_mesh_z_var(unsigned int z_var)
Accessor for z-variable of moving mesh System.
Definition: fem_context.h:896
void set_mesh_x_var(unsigned int x_var)
Accessor for x-variable of moving mesh System.
Definition: fem_context.h:868
const System * get_mesh_system() const
Definition: diff_physics.h:613
bool is_adjoint() const
Accessor for querying whether we need to do a primal or adjoint solve.
Definition: diff_context.h:466
virtual void set_mesh_system(System *sys)
Tells the FEMContext that system sys contains the isoparametric Lagrangian variables which correspond...
Definition: fem_context.h:842
unsigned int get_mesh_y_var() const
Definition: diff_physics.h:631
Real deltat
For time-dependent problems, this is the amount delta t to advance the solution in time...
Definition: diff_system.h:278
bool is_adjoint() const
Accessor for querying whether we need to do a primal or adjoint solve.
Definition: time_solver.h:277
libmesh_assert(ctx)
This class provides all data required for a physics package (e.g.
Definition: fem_context.h:62
const DifferentiablePhysics * get_physics() const
Definition: diff_system.h:181
This class provides a specific system class.
Definition: diff_physics.h:76
void set_mesh_y_var(unsigned int y_var)
Accessor for y-variable of moving mesh System.
Definition: fem_context.h:882
unsigned int get_mesh_z_var() const
Definition: diff_physics.h:637
void set_deltat_pointer(Real *dt)
Points the _deltat member of this class at a timestep value stored in the creating System...
Definition: diff_context.C:109
TimeSolver & get_time_solver()
Definition: diff_system.h:454

◆ calculate_norm() [1/2]

Real libMesh::System::calculate_norm ( const NumericVector< Number > &  v,
unsigned int  var,
FEMNormType  norm_type,
std::set< unsigned int > *  skip_dimensions = nullptr 
) const
inherited
Returns
A norm of variable var in the vector v, in the specified norm (e.g. L2, L_INF, H1)

Definition at line 1672 of file system.C.

References libMesh::DISCRETE_L1, libMesh::DISCRETE_L2, libMesh::DISCRETE_L_INF, libMesh::System::discrete_var_norm(), libMesh::L2, libMesh::System::n_vars(), and libMesh::Real.

Referenced by libMesh::TwostepTimeSolver::adjoint_solve(), libMesh::AdaptiveTimeSolver::calculate_norm(), libMesh::UnsteadySolver::du(), main(), output_norms(), and MeshInputTest::testProjectionRegression().

1676 {
1677  //short circuit to save time
1678  if (norm_type == DISCRETE_L1 ||
1679  norm_type == DISCRETE_L2 ||
1680  norm_type == DISCRETE_L_INF)
1681  return discrete_var_norm(v,var,norm_type);
1682 
1683  // Not a discrete norm
1684  std::vector<FEMNormType> norms(this->n_vars(), L2);
1685  std::vector<Real> weights(this->n_vars(), 0.0);
1686  norms[var] = norm_type;
1687  weights[var] = 1.0;
1688  Real val = this->calculate_norm(v, SystemNorm(norms, weights), skip_dimensions);
1689  return val;
1690 }
Real calculate_norm(const NumericVector< Number > &v, unsigned int var, FEMNormType norm_type, std::set< unsigned int > *skip_dimensions=nullptr) const
Definition: system.C:1672
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Real discrete_var_norm(const NumericVector< Number > &v, unsigned int var, FEMNormType norm_type) const
Finds the discrete norm for the entries in the vector corresponding to Dofs associated with var...
Definition: system.C:1653
unsigned int n_vars() const
Definition: system.h:2349

◆ calculate_norm() [2/2]

Real libMesh::System::calculate_norm ( const NumericVector< Number > &  v,
const SystemNorm norm,
std::set< unsigned int > *  skip_dimensions = nullptr 
) const
inherited
Returns
A norm of the vector v, using component_norm and component_scale to choose and weight the norms of each variable.

Definition at line 1694 of file system.C.

References libMesh::System::_dof_map, libMesh::System::_mesh, libMesh::FEGenericBase< OutputType >::build(), libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), libMesh::FEType::default_quadrature_rule(), dim, libMesh::DISCRETE_L1, libMesh::DISCRETE_L2, libMesh::DISCRETE_L_INF, libMesh::System::discrete_var_norm(), libMesh::DofMap::dof_indices(), libMesh::MeshBase::elem_dimensions(), libMesh::Utility::enum_to_string(), libMesh::FEInterface::field_type(), libMesh::System::get_dof_map(), libMesh::System::get_mesh(), libMesh::GHOSTED, libMesh::H1, libMesh::H1_SEMINORM, libMesh::H2, libMesh::H2_SEMINORM, libMesh::L1, libMesh::NumericVector< T >::l1_norm(), libMesh::L2, libMesh::NumericVector< T >::l2_norm(), libMesh::L_INF, libMesh::libmesh_assert(), libMesh::NumericVector< T >::linfty_norm(), libMesh::NumericVector< T >::local_size(), libMesh::NumericVector< T >::localize(), libMesh::make_range(), TIMPI::Communicator::max(), libMesh::System::n_vars(), libMesh::TensorTools::norm(), libMesh::TensorTools::norm_sq(), libMesh::Real, libMesh::NumericVector< T >::size(), std::sqrt(), TIMPI::Communicator::sum(), libMesh::TYPE_SCALAR, libMesh::TYPE_VECTOR, libMesh::DofMap::variable_type(), libMesh::W1_INF_SEMINORM, libMesh::W2_INF_SEMINORM, and libMesh::SystemNorm::weight().

1697 {
1698  // This function must be run on all processors at once
1699  parallel_object_only();
1700 
1701  LOG_SCOPE ("calculate_norm()", "System");
1702 
1703  // Zero the norm before summation
1704  Real v_norm = 0.;
1705 
1706  if (norm.is_discrete())
1707  {
1708  //Check to see if all weights are 1.0 and all types are equal
1709  FEMNormType norm_type0 = norm.type(0);
1710  unsigned int check_var = 0, check_end = this->n_vars();
1711  for (; check_var != check_end; ++check_var)
1712  if ((norm.weight(check_var) != 1.0) || (norm.type(check_var) != norm_type0))
1713  break;
1714 
1715  //All weights were 1.0 so just do the full vector discrete norm
1716  if (check_var == this->n_vars())
1717  {
1718  if (norm_type0 == DISCRETE_L1)
1719  return v.l1_norm();
1720  if (norm_type0 == DISCRETE_L2)
1721  return v.l2_norm();
1722  if (norm_type0 == DISCRETE_L_INF)
1723  return v.linfty_norm();
1724  else
1725  libmesh_error_msg("Invalid norm_type0 = " << Utility::enum_to_string(norm_type0));
1726  }
1727 
1728  for (auto var : make_range(this->n_vars()))
1729  {
1730  // Skip any variables we don't need to integrate
1731  if (norm.weight(var) == 0.0)
1732  continue;
1733 
1734  v_norm += norm.weight(var) * discrete_var_norm(v, var, norm.type(var));
1735  }
1736 
1737  return v_norm;
1738  }
1739 
1740  // Localize the potentially parallel vector
1741  std::unique_ptr<NumericVector<Number>> local_v = NumericVector<Number>::build(this->comm());
1742  local_v->init(v.size(), v.local_size(), _dof_map->get_send_list(),
1743  true, GHOSTED);
1744  v.localize (*local_v, _dof_map->get_send_list());
1745 
1746  // I'm not sure how best to mix Hilbert norms on some variables (for
1747  // which we'll want to square then sum then square root) with norms
1748  // like L_inf (for which we'll just want to take an absolute value
1749  // and then sum).
1750  bool using_hilbert_norm = true,
1751  using_nonhilbert_norm = true;
1752 
1753  // Loop over all variables
1754  for (auto var : make_range(this->n_vars()))
1755  {
1756  // Skip any variables we don't need to integrate
1757  Real norm_weight_sq = norm.weight_sq(var);
1758  if (norm_weight_sq == 0.0)
1759  continue;
1760  Real norm_weight = norm.weight(var);
1761 
1762  // Check for unimplemented norms (rather than just returning 0).
1763  FEMNormType norm_type = norm.type(var);
1764  if ((norm_type==H1) ||
1765  (norm_type==H2) ||
1766  (norm_type==L2) ||
1767  (norm_type==H1_SEMINORM) ||
1768  (norm_type==H2_SEMINORM))
1769  {
1770  if (!using_hilbert_norm)
1771  libmesh_not_implemented();
1772  using_nonhilbert_norm = false;
1773  }
1774  else if ((norm_type==L1) ||
1775  (norm_type==L_INF) ||
1776  (norm_type==W1_INF_SEMINORM) ||
1777  (norm_type==W2_INF_SEMINORM))
1778  {
1779  if (!using_nonhilbert_norm)
1780  libmesh_not_implemented();
1781  using_hilbert_norm = false;
1782  }
1783  else
1784  libmesh_not_implemented();
1785 
1786  const FEType & fe_type = this->get_dof_map().variable_type(var);
1787 
1788  // Allow space for dims 0-3, and for both scalar and vector
1789  // elements, even if we don't use them all
1790  std::vector<std::unique_ptr<FEBase>> fe_ptrs(4);
1791  std::vector<std::unique_ptr<FEVectorBase>> vec_fe_ptrs(4);
1792  std::vector<std::unique_ptr<QBase>> q_rules(4);
1793 
1794  const std::set<unsigned char> & elem_dims = _mesh.elem_dimensions();
1795 
1796  // Prepare finite elements for each dimension present in the mesh
1797  for (const auto & dim : elem_dims)
1798  {
1799  if (skip_dimensions && skip_dimensions->find(dim) != skip_dimensions->end())
1800  continue;
1801 
1802  // Construct quadrature and finite element objects
1803  q_rules[dim] = fe_type.default_quadrature_rule (dim);
1804 
1805  const FEFieldType field_type = FEInterface::field_type(fe_type);
1806  if (field_type == TYPE_SCALAR)
1807  {
1808  fe_ptrs[dim] = FEBase::build(dim, fe_type);
1809  fe_ptrs[dim]->attach_quadrature_rule (q_rules[dim].get());
1810  }
1811  else
1812  {
1813  vec_fe_ptrs[dim] = FEVectorBase::build(dim, fe_type);
1814  vec_fe_ptrs[dim]->attach_quadrature_rule (q_rules[dim].get());
1815  libmesh_assert_equal_to(field_type, TYPE_VECTOR);
1816  }
1817 
1818  }
1819 
1820  std::vector<dof_id_type> dof_indices;
1821 
1822  // Begin the loop over the elements
1823  for (const auto & elem : this->get_mesh().active_local_element_ptr_range())
1824  {
1825  const unsigned int dim = elem->dim();
1826 
1827  // One way for implementing this would be to exchange the fe with the FEInterface- class.
1828  // However, it needs to be discussed whether integral-norms make sense for infinite elements.
1829  // or in which sense they could make sense.
1830  if (elem->infinite() )
1831  libmesh_not_implemented();
1832 
1833  if (skip_dimensions && skip_dimensions->find(dim) != skip_dimensions->end())
1834  continue;
1835 
1836  QBase * qrule = q_rules[dim].get();
1837  libmesh_assert(qrule);
1838 
1839  this->get_dof_map().dof_indices (elem, dof_indices, var);
1840 
1841  auto element_calculation = [&dof_indices, &elem,
1842  norm_type, norm_weight, norm_weight_sq, &qrule,
1843  &local_v, &v_norm](auto & fe) {
1844  typedef typename std::remove_reference<decltype(fe)>::type::OutputShape OutputShape;
1845  typedef typename TensorTools::MakeNumber<OutputShape>::type OutputNumberShape;
1846  typedef typename std::remove_reference<decltype(fe)>::type::OutputGradient OutputGradient;
1847  typedef typename TensorTools::MakeNumber<OutputGradient>::type OutputNumberGradient;
1848 
1849  const std::vector<Real> & JxW = fe.get_JxW();
1850  const std::vector<std::vector<OutputShape>> * phi = nullptr;
1851  if (norm_type == H1 ||
1852  norm_type == H2 ||
1853  norm_type == L2 ||
1854  norm_type == L1 ||
1855  norm_type == L_INF)
1856  phi = &(fe.get_phi());
1857 
1858  const std::vector<std::vector<OutputGradient>> * dphi = nullptr;
1859  if (norm_type == H1 ||
1860  norm_type == H2 ||
1861  norm_type == H1_SEMINORM ||
1862  norm_type == W1_INF_SEMINORM)
1863  dphi = &(fe.get_dphi());
1864 
1865 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
1866  typedef typename std::remove_reference<decltype(fe)>::type::OutputTensor OutputTensor;
1867 
1868  const std::vector<std::vector<OutputTensor>> * d2phi = nullptr;
1869  if (norm_type == H2 ||
1870  norm_type == H2_SEMINORM ||
1871  norm_type == W2_INF_SEMINORM)
1872  d2phi = &(fe.get_d2phi());
1873 #endif
1874 
1875  fe.reinit (elem);
1876 
1877  const unsigned int n_qp = qrule->n_points();
1878 
1879  const unsigned int n_sf = cast_int<unsigned int>
1880  (dof_indices.size());
1881 
1882  // Begin the loop over the Quadrature points.
1883  for (unsigned int qp=0; qp<n_qp; qp++)
1884  {
1885  if (norm_type == L1)
1886  {
1887  OutputNumberShape u_h = 0.;
1888  for (unsigned int i=0; i != n_sf; ++i)
1889  u_h += (*phi)[i][qp] * (*local_v)(dof_indices[i]);
1890  v_norm += norm_weight *
1891  JxW[qp] * TensorTools::norm(u_h);
1892  }
1893 
1894  if (norm_type == L_INF)
1895  {
1896  OutputNumberShape u_h = 0.;
1897  for (unsigned int i=0; i != n_sf; ++i)
1898  u_h += (*phi)[i][qp] * (*local_v)(dof_indices[i]);
1899  v_norm = std::max(v_norm, norm_weight * TensorTools::norm(u_h));
1900  }
1901 
1902  if (norm_type == H1 ||
1903  norm_type == H2 ||
1904  norm_type == L2)
1905  {
1906  OutputNumberShape u_h = 0.;
1907  for (unsigned int i=0; i != n_sf; ++i)
1908  u_h += (*phi)[i][qp] * (*local_v)(dof_indices[i]);
1909  v_norm += norm_weight_sq *
1910  JxW[qp] * TensorTools::norm_sq(u_h);
1911  }
1912 
1913  if (norm_type == H1 ||
1914  norm_type == H2 ||
1915  norm_type == H1_SEMINORM)
1916  {
1917  OutputNumberGradient grad_u_h;
1918  for (unsigned int i=0; i != n_sf; ++i)
1919  grad_u_h.add_scaled((*dphi)[i][qp], (*local_v)(dof_indices[i]));
1920  v_norm += norm_weight_sq *
1921  JxW[qp] * grad_u_h.norm_sq();
1922  }
1923 
1924  if (norm_type == W1_INF_SEMINORM)
1925  {
1926  OutputNumberGradient grad_u_h;
1927  for (unsigned int i=0; i != n_sf; ++i)
1928  grad_u_h.add_scaled((*dphi)[i][qp], (*local_v)(dof_indices[i]));
1929  v_norm = std::max(v_norm, norm_weight * grad_u_h.norm());
1930  }
1931 
1932 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
1933  typedef typename TensorTools::MakeNumber<OutputTensor>::type OutputNumberTensor;
1934 
1935  if (norm_type == H2 ||
1936  norm_type == H2_SEMINORM)
1937  {
1938  OutputNumberTensor hess_u_h;
1939  for (unsigned int i=0; i != n_sf; ++i)
1940  hess_u_h.add_scaled((*d2phi)[i][qp], (*local_v)(dof_indices[i]));
1941  v_norm += norm_weight_sq *
1942  JxW[qp] * hess_u_h.norm_sq();
1943  }
1944 
1945  if (norm_type == W2_INF_SEMINORM)
1946  {
1947  OutputNumberTensor hess_u_h;
1948  for (unsigned int i=0; i != n_sf; ++i)
1949  hess_u_h.add_scaled((*d2phi)[i][qp], (*local_v)(dof_indices[i]));
1950  v_norm = std::max(v_norm, norm_weight * hess_u_h.norm());
1951  }
1952 #endif
1953  }
1954  };
1955 
1956  FEBase * scalar_fe = fe_ptrs[dim].get();
1957  FEVectorBase * vec_fe = vec_fe_ptrs[dim].get();
1958 
1959  if (scalar_fe)
1960  {
1961  libmesh_assert(!vec_fe);
1962  element_calculation(*scalar_fe);
1963  }
1964 
1965  if (vec_fe)
1966  {
1967  libmesh_assert(!scalar_fe);
1968  element_calculation(*vec_fe);
1969  }
1970  }
1971  }
1972 
1973  if (using_hilbert_norm)
1974  {
1975  this->comm().sum(v_norm);
1976  v_norm = std::sqrt(v_norm);
1977  }
1978  else
1979  {
1980  this->comm().max(v_norm);
1981  }
1982 
1983  return v_norm;
1984 }
void dof_indices(const Elem *const elem, std::vector< dof_id_type > &di) const
Fills the vector di with the global degree of freedom indices for the element.
Definition: dof_map.C:1992
unsigned int dim
virtual numeric_index_type size() const =0
const FEType & variable_type(const unsigned int c) const
Definition: dof_map.h:2144
void sum(T &r) const
static FEFieldType field_type(const FEType &fe_type)
FEMNormType
defines an enum for norms defined on vectors of finite element coefficients
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2113
const Parallel::Communicator & comm() const
ADRealEigenVector< T, D, asd > sqrt(const ADRealEigenVector< T, D, asd > &)
Definition: type_vector.h:53
FEGenericBase< RealGradient > FEVectorBase
Definition: fe_base.h:818
const MeshBase & get_mesh() const
Definition: system.h:2277
virtual Real l2_norm() const =0
static std::unique_ptr< FEGenericBase > build(const unsigned int dim, const FEType &type)
Builds a specific finite element type.
libmesh_assert(ctx)
const std::set< unsigned char > & elem_dimensions() const
Definition: mesh_base.h:276
auto norm(const T &a) -> decltype(std::abs(a))
Definition: tensor_tools.h:74
FEGenericBase< Real > FEBase
virtual Real l1_norm() const =0
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package())
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
std::string enum_to_string(const T e)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void max(const T &r, T &o, Request &req) const
auto norm_sq(const T &a) -> decltype(std::norm(a))
Definition: tensor_tools.h:104
virtual numeric_index_type local_size() const =0
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
Real discrete_var_norm(const NumericVector< Number > &v, unsigned int var, FEMNormType norm_type) const
Finds the discrete norm for the entries in the vector corresponding to Dofs associated with var...
Definition: system.C:1653
unsigned int n_vars() const
Definition: system.h:2349
const DofMap & get_dof_map() const
Definition: system.h:2293
MeshBase & _mesh
Constant reference to the mesh data structure used for the simulation.
Definition: system.h:2125
virtual Real linfty_norm() const =0
virtual void localize(std::vector< T > &v_local) const =0
Creates a copy of the global vector in the local vector v_local.
FEFieldType
defines an enum for finite element field types - i.e.

◆ can_add_matrices()

bool libMesh::System::can_add_matrices ( ) const
inlineprotectedinherited
Returns
Whether or not matrices can still be added without expensive per-matrix initialization.

Definition at line 1914 of file system.h.

References libMesh::System::_matrices_initialized.

Referenced by libMesh::EigenSystem::set_eigenproblem_type().

1914 { return !_matrices_initialized; }
bool _matrices_initialized
false when additional matrices being added require initialization, true otherwise.
Definition: system.h:2191

◆ clear()

void libMesh::DifferentiableSystem::clear ( )
overridevirtualinherited

Clear all the data structures associated with the system.

Reimplemented from libMesh::ImplicitSystem.

Reimplemented in libMesh::ContinuationSystem.

Definition at line 64 of file diff_system.C.

References libMesh::DifferentiableSystem::_diff_physics, libMesh::DifferentiableSystem::_diff_qoi, libMesh::DifferentiablePhysics::clear_physics(), libMesh::DifferentiableQoI::clear_qoi(), and libMesh::System::use_fixed_solution.

Referenced by libMesh::ContinuationSystem::clear().

65 {
66  // If we had no attached Physics object, clear our own Physics data
67  if (this->_diff_physics.empty())
68  this->clear_physics();
69 
70  this->_diff_physics = {}; // No stack::clear
71  this->_diff_qoi = {};
72 
73  // If we had no attached QoI object, clear our own QoI data
74  if (this->_diff_qoi.empty())
75  this->clear_qoi();
76 
77  use_fixed_solution = false;
78 }
virtual void clear_physics()
Clear any data structures associated with the physics.
Definition: diff_physics.C:28
bool use_fixed_solution
A boolean to be set to true by systems using elem_fixed_solution, for optional use by e...
Definition: system.h:1543
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.
Definition: diff_system.h:440
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.
Definition: diff_system.h:448
virtual void clear_qoi()
Clear all the data structures associated with the QoI.
Definition: diff_qoi.h:91

◆ clear_physics()

void libMesh::DifferentiablePhysics::clear_physics ( )
virtualinherited

Clear any data structures associated with the physics.

Definition at line 28 of file diff_physics.C.

References libMesh::DifferentiablePhysics::_time_evolving.

Referenced by libMesh::DifferentiableSystem::clear().

29 {
30  _time_evolving.resize(0);
31 }
std::vector< unsigned int > _time_evolving
Stores unsigned int to tell us which variables are evolving as first order in time (1)...
Definition: diff_physics.h:543

◆ clear_qoi()

virtual void libMesh::DifferentiableQoI::clear_qoi ( )
inlinevirtualinherited

Clear all the data structures associated with the QoI.

Definition at line 91 of file diff_qoi.h.

Referenced by libMesh::DifferentiableSystem::clear().

91 {}

◆ clone()

virtual std::unique_ptr<DifferentiableQoI> libMesh::DifferentiableSystem::clone ( )
inlineoverridevirtualinherited

We don't allow systems to be attached to each other.

Implements libMesh::DifferentiableQoI.

Definition at line 168 of file diff_system.h.

Referenced by libMesh::AdjointRefinementEstimator::estimate_error().

169  {
170  libmesh_not_implemented();
171  // dummy to avoid compiler warnings, not a real implementation
172  return std::unique_ptr<DifferentiableQoI>(nullptr);
173  }

◆ clone_physics()

virtual std::unique_ptr<DifferentiablePhysics> libMesh::DifferentiableSystem::clone_physics ( )
inlineoverridevirtualinherited

We don't allow systems to be attached to each other.

Implements libMesh::DifferentiablePhysics.

Definition at line 158 of file diff_system.h.

159  {
160  libmesh_not_implemented();
161  // dummy to avoid compiler warnings, not a real implementation
162  return std::unique_ptr<DifferentiablePhysics>(nullptr);
163  }

◆ comm()

const Parallel::Communicator& libMesh::ParallelObject::comm ( ) const
inlineinherited
Returns
A reference to the Parallel::Communicator object used by this mesh.

Definition at line 97 of file parallel_object.h.

References libMesh::ParallelObject::_communicator.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), libMesh::__libmesh_petsc_diff_solver_monitor(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::__libmesh_tao_equality_constraints(), libMesh::__libmesh_tao_equality_constraints_jacobian(), libMesh::__libmesh_tao_gradient(), libMesh::__libmesh_tao_hessian(), libMesh::__libmesh_tao_inequality_constraints(), libMesh::__libmesh_tao_inequality_constraints_jacobian(), libMesh::__libmesh_tao_objective(), libMesh::MeshRefinement::_coarsen_elements(), libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::SlepcEigenSolver< libMesh::Number >::_petsc_shell_matrix_get_diagonal(), libMesh::PetscLinearSolver< Number >::_petsc_shell_matrix_get_diagonal(), libMesh::SlepcEigenSolver< libMesh::Number >::_petsc_shell_matrix_mult(), libMesh::PetscLinearSolver< Number >::_petsc_shell_matrix_mult(), libMesh::PetscLinearSolver< Number >::_petsc_shell_matrix_mult_add(), libMesh::MeshRefinement::_refine_elements(), libMesh::MeshRefinement::_smooth_flags(), libMesh::DofMap::add_constraints_to_send_list(), add_cube_convex_hull_to_mesh(), libMesh::PetscDMWrapper::add_dofs_helper(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::TransientRBConstruction::add_IC_to_RB_space(), libMesh::EigenSystem::add_matrices(), libMesh::System::add_matrix(), libMesh::RBConstruction::add_scaled_matrix_and_vector(), libMesh::System::add_variable(), libMesh::System::add_variables(), libMesh::System::add_vector(), libMesh::MeshTools::Modification::all_tri(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::TransientRBConstruction::allocate_data_structures(), libMesh::RBConstruction::allocate_data_structures(), libMesh::TransientRBConstruction::assemble_affine_expansion(), libMesh::FEMSystem::assemble_qoi(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::MeshCommunication::assign_global_indices(), libMesh::Partitioner::assign_partitioning(), libMesh::MeshTools::Generation::build_extrusion(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::PetscDMWrapper::build_section(), libMesh::PetscDMWrapper::build_sf(), libMesh::MeshBase::cache_elem_data(), libMesh::System::calculate_norm(), libMesh::DofMap::check_dirichlet_bcid_consistency(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_max_error_bound(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::RBSCMConstruction::compute_SCM_bounds_on_training_set(), libMesh::DofMap::computed_sparsity_already(), libMesh::Problem_Interface::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), libMesh::ContinuationSystem::ContinuationSystem(), libMesh::MeshBase::copy_constraint_rows(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::MeshTools::create_bounding_box(), libMesh::DofMap::create_dof_constraints(), libMesh::MeshTools::create_nodal_bounding_box(), libMesh::MeshRefinement::create_parent_error_vector(), libMesh::MeshTools::create_processor_bounding_box(), libMesh::MeshTools::create_subdomain_bounding_box(), libMesh::PetscMatrix< libMesh::Number >::create_submatrix_nosort(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::RBEIMEvaluation::distribute_bfs(), libMesh::DofMap::distribute_dofs(), DMlibMeshFunction(), DMlibMeshJacobian(), DMlibMeshSetSystem_libMesh(), DMVariableBounds_libMesh(), libMesh::DTKSolutionTransfer::DTKSolutionTransfer(), libMesh::MeshRefinement::eliminate_unrefined_patches(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_interiors(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_nodes(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_sides(), libMesh::TransientRBConstruction::enrich_RB_space(), libMesh::EpetraVector< T >::EpetraVector(), AssembleOptimization::equality_constraints(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::MeshRefinement::flag_elements_by_elem_fraction(), libMesh::MeshRefinement::flag_elements_by_error_fraction(), libMesh::MeshRefinement::flag_elements_by_error_tolerance(), libMesh::MeshRefinement::flag_elements_by_mean_stddev(), libMesh::MeshRefinement::flag_elements_by_nelem_target(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::DofMap::gather_constraints(), libMesh::MeshfreeInterpolation::gather_remote_data(), libMesh::CondensedEigenSystem::get_eigenpair(), libMesh::RBEIMEvaluation::get_eim_basis_function_node_value(), libMesh::RBEIMEvaluation::get_eim_basis_function_side_value(), libMesh::RBEIMEvaluation::get_eim_basis_function_value(), libMesh::MeshBase::get_info(), libMesh::System::get_info(), libMesh::DofMap::get_info(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::RBEIMConstruction::get_max_abs_value(), libMesh::RBEIMConstruction::get_node_max_abs_value(), libMesh::RBEIMEvaluation::get_parametrized_function_node_value(), libMesh::RBEIMEvaluation::get_parametrized_function_side_value(), libMesh::RBEIMEvaluation::get_parametrized_function_value(), libMesh::RBEIMConstruction::get_random_point(), AssembleOptimization::inequality_constraints(), AssembleOptimization::inequality_constraints_jacobian(), libMesh::LocationMap< T >::init(), libMesh::TimeSolver::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), libMesh::RBEIMConstruction::initialize_parametrized_functions_in_training_set(), libMesh::RBEIMConstruction::inner_product(), integrate_function(), libMesh::MeshTools::libmesh_assert_consistent_distributed(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_equal_connectivity(), libMesh::MeshTools::libmesh_assert_equal_points(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_boundary_ids(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_flags(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_object_ids(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_p_levels(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::MeshTools::libmesh_assert_valid_unique_ids(), libMesh::libmesh_petsc_linesearch_shellfunc(), libMesh::libmesh_petsc_preconditioner_apply(), libMesh::libmesh_petsc_recalculate_monitor(), libMesh::libmesh_petsc_snes_fd_residual(), libMesh::libmesh_petsc_snes_jacobian(), libMesh::libmesh_petsc_snes_mffd_interface(), libMesh::libmesh_petsc_snes_mffd_residual(), libMesh::libmesh_petsc_snes_postcheck(), libMesh::libmesh_petsc_snes_precheck(), libMesh::libmesh_petsc_snes_residual(), libMesh::libmesh_petsc_snes_residual_helper(), libMesh::MeshRefinement::limit_level_mismatch_at_edge(), libMesh::MeshRefinement::limit_level_mismatch_at_node(), libMesh::MeshRefinement::limit_overrefined_boundary(), libMesh::MeshRefinement::limit_underrefined_boundary(), libMesh::LinearImplicitSystem::LinearImplicitSystem(), main(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::MeshCommunication::make_elems_parallel_consistent(), libMesh::MeshRefinement::make_flags_parallel_consistent(), libMesh::MeshCommunication::make_new_node_proc_ids_parallel_consistent(), libMesh::MeshCommunication::make_new_nodes_parallel_consistent(), libMesh::MeshCommunication::make_node_bcids_parallel_consistent(), libMesh::MeshCommunication::make_node_ids_parallel_consistent(), libMesh::MeshCommunication::make_node_proc_ids_parallel_consistent(), libMesh::MeshCommunication::make_node_unique_ids_parallel_consistent(), libMesh::MeshCommunication::make_nodes_parallel_consistent(), libMesh::MeshCommunication::make_p_levels_parallel_consistent(), libMesh::MeshRefinement::make_refinement_compatible(), libMesh::TransientRBConstruction::mass_matrix_scaled_matvec(), libMesh::FEMSystem::mesh_position_set(), libMesh::TriangulatorInterface::MeshedHole::MeshedHole(), LinearElasticityWithContact::move_mesh(), libMesh::DistributedMesh::n_active_elem(), libMesh::MeshTools::n_active_levels(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::DofMap::n_constrained_dofs(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::CondensedEigenSystem::n_global_non_condensed_dofs(), libMesh::MeshTools::n_levels(), MixedOrderTest::n_neighbor_links(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::SparsityPattern::Build::n_nonzeros(), libMesh::MeshTools::n_p_levels(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::RBEIMEvaluation::node_distribute_bfs(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::RBEIMConstruction::node_inner_product(), libMesh::MeshBase::operator==(), libMesh::DistributedMesh::parallel_max_elem_id(), libMesh::DistributedMesh::parallel_max_node_id(), libMesh::ReplicatedMesh::parallel_max_unique_id(), libMesh::DistributedMesh::parallel_max_unique_id(), libMesh::DistributedMesh::parallel_n_elem(), libMesh::DistributedMesh::parallel_n_nodes(), libMesh::SparsityPattern::Build::parallel_sync(), libMesh::BoundaryInfo::parallel_sync_node_ids(), libMesh::BoundaryInfo::parallel_sync_side_ids(), libMesh::MeshTools::paranoid_n_levels(), libMesh::Partitioner::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::petsc_auto_fieldsplit(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::MeshBase::prepare_for_use(), libMesh::DofMap::print_dof_constraints(), libMesh::DofMap::process_mesh_constraint_rows(), libMesh::Partitioner::processor_pairs_to_interface_nodes(), libMesh::InterMeshProjection::project_system_vectors(), FEMParameters::read(), libMesh::Nemesis_IO::read(), libMesh::XdrIO::read(), libMesh::EquationSystems::read(), libMesh::ExodusII_IO::read_header(), libMesh::CheckpointIO::read_header(), libMesh::XdrIO::read_header(), libMesh::System::read_header(), libMesh::RBEIMEvaluation::read_in_interior_basis_functions(), libMesh::RBEIMEvaluation::read_in_node_basis_functions(), libMesh::RBEIMEvaluation::read_in_side_basis_functions(), libMesh::RBEvaluation::read_in_vectors_from_multiple_files(), libMesh::System::read_legacy_data(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs_helper(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), libMesh::Nemesis_IO_Helper::read_var_names_impl(), libMesh::MeshBase::recalculate_n_partitions(), libMesh::MeshRefinement::refine_and_coarsen_elements(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DistributedMesh::renumber_nodes_and_elements(), LinearElasticityWithContact::residual_and_jacobian(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), scale_mesh_and_plot(), libMesh::DofMap::scatter_constraints(), libMesh::CheckpointIO::select_split_config(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::send_and_insert_dof_values(), libMesh::TransientRBConstruction::set_error_temporal_data(), libMesh::Partitioner::set_interface_node_processor_ids_BFS(), libMesh::Partitioner::set_interface_node_processor_ids_linear(), libMesh::Partitioner::set_interface_node_processor_ids_petscpartitioner(), libMesh::Partitioner::set_node_processor_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::Partitioner::set_parent_processor_ids(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::PetscDiffSolver::setup_petsc_data(), libMesh::RBEIMEvaluation::side_distribute_bfs(), libMesh::RBEIMEvaluation::side_gather_bfs(), libMesh::RBEIMConstruction::side_inner_product(), libMesh::Partitioner::single_partition(), libMesh::LaplaceMeshSmoother::smooth(), libMesh::split_mesh(), libMesh::RBEIMConstruction::store_eim_solutions_for_training_set(), libMesh::MeshBase::subdomain_ids(), libMesh::BoundaryInfo::sync(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), libMesh::MeshRefinement::test_level_one(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), libMesh::MeshRefinement::test_unflagged(), DofMapTest::testBadElemFECombo(), SystemsTest::testBlockRestrictedVarNDofs(), BoundaryInfoTest::testBoundaryOnChildrenErrors(), MeshInputTest::testExodusIGASidesets(), MeshTriangulationTest::testFoundCenters(), PointLocatorTest::testLocator(), BoundaryInfoTest::testMesh(), PointLocatorTest::testPlanar(), MeshTriangulationTest::testPoly2TriRefinementBase(), SystemsTest::testProjectCubeWithMeshFunction(), BoundaryInfoTest::testRenumber(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshTriangulationTest::testTriangulatorInterp(), MeshTriangulationTest::testTriangulatorMeshedHoles(), libMesh::MeshTools::total_weight(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::Poly2TriTriangulator::triangulate(), libMesh::TransientRBConstruction::truth_assembly(), libMesh::RBConstruction::truth_assembly(), libMesh::MeshRefinement::uniformly_coarsen(), libMesh::TransientRBConstruction::update_RB_initial_condition_all_N(), libMesh::TransientRBConstruction::update_RB_system_matrices(), libMesh::RBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), libMesh::RBConstruction::update_residual_terms(), libMesh::NameBasedIO::write(), libMesh::XdrIO::write(), libMesh::VTKIO::write_nodal_data(), libMesh::RBEIMEvaluation::write_out_interior_basis_functions(), libMesh::RBEIMEvaluation::write_out_node_basis_functions(), libMesh::RBEIMEvaluation::write_out_side_basis_functions(), libMesh::RBEvaluation::write_out_vectors(), libMesh::TransientRBConstruction::write_riesz_representors_to_files(), libMesh::RBConstruction::write_riesz_representors_to_files(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::RBDataSerialization::RBEvaluationSerialization::write_to_file(), libMesh::RBDataSerialization::TransientRBEvaluationSerialization::write_to_file(), libMesh::RBDataSerialization::RBEIMEvaluationSerialization::write_to_file(), and libMesh::RBDataSerialization::RBSCMEvaluationSerialization::write_to_file().

98  { return _communicator; }
const Parallel::Communicator & _communicator

◆ compare()

bool libMesh::System::compare ( const System other_system,
const Real  threshold,
const bool  verbose 
) const
virtualinherited
Returns
true when the other system contains identical data, up to the given threshold. Outputs some diagnostic info when verbose is set.

Definition at line 601 of file system.C.

References libMesh::System::_is_initialized, libMesh::System::_sys_name, libMesh::System::_vectors, libMesh::System::get_vector(), libMesh::libmesh_assert(), libMesh::System::n_vectors(), libMesh::System::name(), libMesh::out, and libMesh::System::solution.

604 {
605  // we do not care for matrices, but for vectors
607  libmesh_assert (other_system._is_initialized);
608 
609  if (verbose)
610  {
611  libMesh::out << " Systems \"" << _sys_name << "\"" << std::endl;
612  libMesh::out << " comparing matrices not supported." << std::endl;
613  libMesh::out << " comparing names...";
614  }
615 
616  // compare the name: 0 means identical
617  const int name_result = _sys_name.compare(other_system.name());
618  if (verbose)
619  {
620  if (name_result == 0)
621  libMesh::out << " identical." << std::endl;
622  else
623  libMesh::out << " names not identical." << std::endl;
624  libMesh::out << " comparing solution vector...";
625  }
626 
627 
628  // compare the solution: -1 means identical
629  const int solu_result = solution->compare (*other_system.solution.get(),
630  threshold);
631 
632  if (verbose)
633  {
634  if (solu_result == -1)
635  libMesh::out << " identical up to threshold." << std::endl;
636  else
637  libMesh::out << " first difference occurred at index = "
638  << solu_result << "." << std::endl;
639  }
640 
641 
642  // safety check, whether we handle at least the same number
643  // of vectors
644  std::vector<int> ov_result;
645 
646  if (this->n_vectors() != other_system.n_vectors())
647  {
648  if (verbose)
649  {
650  libMesh::out << " Fatal difference. This system handles "
651  << this->n_vectors() << " add'l vectors," << std::endl
652  << " while the other system handles "
653  << other_system.n_vectors()
654  << " add'l vectors." << std::endl
655  << " Aborting comparison." << std::endl;
656  }
657  return false;
658  }
659  else if (this->n_vectors() == 0)
660  {
661  // there are no additional vectors...
662  ov_result.clear ();
663  }
664  else
665  {
666  // compare other vectors
667  for (auto & [vec_name, vec] : _vectors)
668  {
669  if (verbose)
670  libMesh::out << " comparing vector \""
671  << vec_name << "\" ...";
672 
673  // assume they have the same name
674  const NumericVector<Number> & other_system_vector =
675  other_system.get_vector(vec_name);
676 
677  ov_result.push_back(vec->compare(other_system_vector, threshold));
678 
679  if (verbose)
680  {
681  if (ov_result[ov_result.size()-1] == -1)
682  libMesh::out << " identical up to threshold." << std::endl;
683  else
684  libMesh::out << " first difference occurred at" << std::endl
685  << " index = " << ov_result[ov_result.size()-1] << "." << std::endl;
686  }
687  }
688  } // finished comparing additional vectors
689 
690 
691  bool overall_result;
692 
693  // sum up the results
694  if ((name_result==0) && (solu_result==-1))
695  {
696  if (ov_result.size()==0)
697  overall_result = true;
698  else
699  {
700  bool ov_identical;
701  unsigned int n = 0;
702  do
703  {
704  ov_identical = (ov_result[n]==-1);
705  n++;
706  }
707  while (ov_identical && n<ov_result.size());
708  overall_result = ov_identical;
709  }
710  }
711  else
712  overall_result = false;
713 
714  if (verbose)
715  {
716  libMesh::out << " finished comparisons, ";
717  if (overall_result)
718  libMesh::out << "found no differences." << std::endl << std::endl;
719  else
720  libMesh::out << "found differences." << std::endl << std::endl;
721  }
722 
723  return overall_result;
724 }
bool _is_initialized
true when additional vectors and variables do not require immediate initialization, false otherwise.
Definition: system.h:2210
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
unsigned int n_vectors() const
Definition: system.h:2477
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
libmesh_assert(ctx)
OStreamProxy out
const std::string _sys_name
A name associated with this system.
Definition: system.h:2130
template class LIBMESH_EXPORT NumericVector< Number >

◆ compute_final_sensitivity()

Number& HeatSystem::compute_final_sensitivity ( )
inline

Definition at line 55 of file heatsystem.h.

56  {
57  final_sensitivity = 0.0;
58 
59  // Use the trapezoidal rule to compute the sensitivity integral
60  for(unsigned int i = 0; i < R_plus_dp.size()-1; i++)
61  {
62  Number left_contribution = -(R_plus_dp[i] - R_minus_dp[i])/(2.*dp);
63  Number right_contribution = -(R_plus_dp[i+1] - R_minus_dp[i+1])/(2.*dp);
64 
65  final_sensitivity += ( (left_contribution + right_contribution)/2. )*deltat_vector[i];
66  }
67 
68  return final_sensitivity;
69  }
std::vector< Number > deltat_vector
Definition: heatsystem.h:143
std::vector< Number > R_plus_dp
Definition: heatsystem.h:139
Number dp
Definition: heatsystem.h:146
std::vector< Number > R_minus_dp
Definition: heatsystem.h:140
Number final_sensitivity
Definition: heatsystem.h:149

◆ current_solution()

Number libMesh::System::current_solution ( const dof_id_type  global_dof_number) const
inherited
Returns
The current solution for the specified global DOF.

Definition at line 157 of file system.C.

References libMesh::System::_dof_map, and libMesh::System::current_local_solution.

Referenced by libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::HPCoarsenTest::add_projection(), compute_stresses(), LinearElasticityWithContact::compute_stresses(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), libMesh::ExactErrorEstimator::estimate_error(), main(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::PatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::HPCoarsenTest::select_refinement(), SolidSystem::side_time_derivative(), libMesh::EnsightIO::write_scalar_ascii(), and libMesh::EnsightIO::write_vector_ascii().

158 {
159  // Check the sizes
160  libmesh_assert_less (global_dof_number, _dof_map->n_dofs());
161  libmesh_assert_less (global_dof_number, current_local_solution->size());
162 
163  return (*current_local_solution)(global_dof_number);
164 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2113
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1585

◆ damping_residual()

virtual bool libMesh::DifferentiablePhysics::damping_residual ( bool  request_jacobian,
DiffContext  
)
inlinevirtualinherited

Subtracts a damping vector contribution on elem from elem_residual.

This method is not used in first-order-in-time problems. For second-order-in-time problems, this is the \( C(u,\ddot{u})\ddot{u} \) term. This method is only called for UnsteadySolver-based TimeSolvers.

If this method receives request_jacobian = true, then it should compute elem_jacobian and return true if possible. If elem_jacobian has not been computed then the method should return false.

If the problem has no damping, the default "do-nothing" is correct. Otherwise, this must be reimplemented.

Reimplemented in SecondOrderScalarSystemFirstOrderTimeSolverBase, and SecondOrderScalarSystemSecondOrderTimeSolverBase.

Definition at line 360 of file diff_physics.h.

Referenced by libMesh::EulerSolver::element_residual(), libMesh::Euler2Solver::element_residual(), and libMesh::NewmarkSolver::element_residual().

362  {
363  return request_jacobian;
364  }

◆ deactivate()

void libMesh::System::deactivate ( )
inlineinherited

Deactivates the system.

Only active systems are solved.

Definition at line 2325 of file system.h.

References libMesh::System::_active.

2326 {
2327  _active = false;
2328 }
bool _active
Flag stating if the system is active or not.
Definition: system.h:2156

◆ disable_cache()

void libMesh::ImplicitSystem::disable_cache ( )
overridevirtualinherited

Avoids use of any cached data that might affect any solve result.

Should be overridden in derived systems.

Reimplemented from libMesh::System.

Definition at line 105 of file implicit_system.C.

References libMesh::System::assemble_before_solve, libMesh::ImplicitSystem::get_linear_solver(), and libMesh::LinearSolver< T >::reuse_preconditioner().

Referenced by libMesh::DifferentiableSystem::pop_physics(), libMesh::DifferentiableSystem::push_physics(), and libMesh::DifferentiableSystem::swap_physics().

105  {
106  this->assemble_before_solve = true;
107  this->get_linear_solver()->reuse_preconditioner(false);
108 }
virtual LinearSolver< Number > * get_linear_solver() const
virtual void reuse_preconditioner(bool)
Set the same_preconditioner flag, which indicates if we reuse the same preconditioner for subsequent ...
bool assemble_before_solve
Flag which tells the system to whether or not to call the user assembly function during each call to ...
Definition: system.h:1527

◆ disable_print_counter_info()

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 100 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

101 {
102  _enable_print_counter = false;
103  return;
104 }
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ element_constraint()

virtual bool libMesh::DifferentiablePhysics::element_constraint ( bool  request_jacobian,
DiffContext  
)
inlinevirtualinherited

Adds the constraint contribution on elem to elem_residual.

If this method receives request_jacobian = true, then it should compute elem_jacobian and return true if possible. If elem_jacobian has not been computed then the method should return false.

Users may need to reimplement this for their particular PDE.

To implement the constraint 0 = G(u), the user should examine u = elem_solution and add (G(u), phi_i) to elem_residual in elem_constraint().

Reimplemented in CoupledSystem, and NavierSystem.

Definition at line 144 of file diff_physics.h.

Referenced by libMesh::EulerSolver::element_residual(), libMesh::SteadySolver::element_residual(), libMesh::Euler2Solver::element_residual(), libMesh::NewmarkSolver::element_residual(), and libMesh::EigenTimeSolver::element_residual().

146  {
147  return request_jacobian;
148  }

◆ element_postprocess()

virtual void libMesh::DifferentiableSystem::element_postprocess ( DiffContext )
inlinevirtualinherited

Does any work that needs to be done on elem in a postprocessing loop.

Reimplemented in LaplaceSystem, LaplaceSystem, and PoissonSystem.

Definition at line 299 of file diff_system.h.

299 {}

◆ element_qoi()

void HeatSystem::element_qoi ( DiffContext ,
const QoISet  
)
protectedvirtual

Does any work that needs to be done on elem in a quantity of interest assembly loop, outputting to elem_qoi.

Only qois included in the supplied QoISet need to be assembled.

Reimplemented from libMesh::DifferentiableQoI.

Definition at line 17 of file element_qoi.C.

References std::abs(), libMesh::FEMContext::get_element_fe(), libMesh::FEMContext::get_element_qrule(), libMesh::DiffContext::get_qois(), libMesh::DiffContext::get_system(), libMesh::FEMContext::interior_value(), libMesh::QBase::n_points(), libMesh::System::time, and libMesh::TOLERANCE.

18 {
19  FEMContext & c = cast_ref<FEMContext &>(context);
20 
21  FEBase * elem_fe = nullptr;
22  c.get_element_fe( 0, elem_fe );
23 
24  // Element Jacobian * quadrature weights for interior integration
25  const std::vector<Real> & JxW = elem_fe->get_JxW();
26 
27  // The number of local degrees of freedom in each variable
28 
29  unsigned int n_qpoints = c.get_element_qrule().n_points();
30 
31  // A reference to the system context is built with
32  const System & sys = c.get_system();
33 
34  Number dQoI_0 = 0.;
35  Number dQoI_1 = 0.;
36 
37  // Smooth QoI weight
38  Number q = 0.0;
39 
40  // Loop over quadrature points
41  for (unsigned int qp = 0; qp != n_qpoints; qp++)
42  {
43  Number u = c.interior_value(0, qp);
44 
45  // The final time QoI
46  if(std::abs(sys.time - (dynamic_cast<const HeatSystem &>(sys).QoI_time_instant)[0]) < TOLERANCE)
47  {
48  dQoI_0 += JxW[qp] * ( u * 1.0 );
49  }
50 
51  // Smooth QoI contribution
52  q = 1.0;
53 
54  dQoI_1 += (JxW[qp] * ( u * q ));
55  }
56  // End loop over quadrature points
57 
58  // Update the computed value of the global functional R, by adding the contribution from this element
59  c.get_qois()[0] = c.get_qois()[0] + dQoI_0;
60  c.get_qois()[1] = c.get_qois()[1] + dQoI_1;
61 
62 }
Real time
For time-dependent problems, this is the time t at the beginning of the current timestep.
Definition: system.h:1595
const std::vector< Number > & get_qois() const
Const accessor for QoI vector.
Definition: diff_context.h:317
Number interior_value(unsigned int var, unsigned int qp) const
Definition: fem_context.C:404
static constexpr Real TOLERANCE
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
Definition: type_vector.h:57
const System & get_system() const
Accessor for associated system.
Definition: diff_context.h:106
Manages consistently variables, degrees of freedom, and coefficient vectors.
Definition: system.h:96
This class provides all data required for a physics package (e.g.
Definition: fem_context.h:62
unsigned int n_points() const
Definition: quadrature.h:123
void get_element_fe(unsigned int var, FEGenericBase< OutputShape > *&fe) const
Accessor for interior finite element object for variable var for the largest dimension in the mesh...
Definition: fem_context.h:277
This class forms the foundation from which generic finite elements may be derived.
const QBase & get_element_qrule() const
Accessor for element interior quadrature rule for the dimension of the current _elem.
Definition: fem_context.h:802

◆ element_qoi_derivative() [1/2]

virtual void HeatSystem::element_qoi_derivative ( DiffContext ,
const QoISet  
)
protectedvirtual

Does any work that needs to be done on elem in a quantity of interest derivative assembly loop, outputting to elem_qoi_derivative.

Only qois included in the supplied QoISet need their derivatives assembled.

Reimplemented from libMesh::DifferentiableQoI.

◆ element_qoi_derivative() [2/2]

void HeatSystem::element_qoi_derivative ( DiffContext ,
const QoISet  
)
protectedvirtual

Does any work that needs to be done on elem in a quantity of interest derivative assembly loop, outputting to elem_qoi_derivative.

Only qois included in the supplied QoISet need their derivatives assembled.

Reimplemented from libMesh::DifferentiableQoI.

Definition at line 36 of file element_qoi_derivative.C.

References libMesh::FEMContext::get_element_fe(), libMesh::FEMContext::get_element_qrule(), libMesh::DiffContext::get_qoi_derivatives(), libMesh::DiffContext::get_system(), libMesh::FEMContext::interior_values(), libMesh::DiffContext::n_dof_indices(), and libMesh::QBase::n_points().

38 {
39  FEMContext & c = cast_ref<FEMContext &>(context);
40 
41  // First we get some references to cell-specific data that
42  // will be used to assemble the linear system.
43  FEBase * elem_fe = nullptr;
44  c.get_element_fe(0, elem_fe);
45 
46  // Element Jacobian * quadrature weights for interior integration
47  const std::vector<Real> & JxW = elem_fe->get_JxW();
48 
49  // The basis functions for the element
50  const std::vector<std::vector<Real>> & phi = elem_fe->get_phi();
51 
52  // The number of local degrees of freedom in each variable
53  const unsigned int n_T_dofs = c.n_dof_indices(0);
54  unsigned int n_qpoints = c.get_element_qrule().n_points();
55 
56  // Fill the QoI RHS corresponding to this QoI. Since this is the 0th QoI
57  // we fill in the [0][i] subderivatives, i corresponding to the variable index.
58  // Our system has only one variable, so we only have to fill the [0][0] subderivative
60 
61  // A reference to the system context is built with
62  const System & sys = c.get_system();
63 
64  // Get a pointer to the adjoint solution vector
65  NumericVector<Number> & adjoint_solution = const_cast<System &>(sys).get_adjoint_solution(0);
66 
67  // Get the previous adjoint solution values at all the qps
68 
69  std::vector<Number> old_adjoint (n_qpoints, 0);
70 
71  c.interior_values<Number>(0, adjoint_solution, old_adjoint);
72 
73  // Our QoI depends solely on the final time, so there are no QoI contributions.
74  // However, there is a contribution from the adjoint solution timestep, for the
75  // time part of the residual of the adjoint problem
76  // Loop over the qps
77  for (unsigned int qp=0; qp != n_qpoints; qp++)
78  for (unsigned int i=0; i != n_T_dofs; i++)
79  Q(i) += -JxW[qp] * old_adjoint[qp] * phi[i][qp] * (1./(dynamic_cast<const HeatSystem &>(sys).deltat));
80 }
unsigned int n_dof_indices() const
Total number of dof indices on the element.
Definition: diff_context.h:395
void interior_values(unsigned int var, const NumericVector< Number > &_system_vector, std::vector< OutputType > &interior_values_vector) const
Fills a vector of values of the _system_vector at the all the quadrature points in the current elemen...
Definition: fem_context.C:424
Defines a dense subvector for use in finite element computations.
const System & get_system() const
Accessor for associated system.
Definition: diff_context.h:106
Real deltat
For time-dependent problems, this is the amount delta t to advance the solution in time...
Definition: diff_system.h:278
Manages consistently variables, degrees of freedom, and coefficient vectors.
Definition: system.h:96
This class provides all data required for a physics package (e.g.
Definition: fem_context.h:62
unsigned int n_points() const
Definition: quadrature.h:123
NumericVector< Number > & get_adjoint_solution(unsigned int i=0)
Definition: system.C:1193
void get_element_fe(unsigned int var, FEGenericBase< OutputShape > *&fe) const
Accessor for interior finite element object for variable var for the largest dimension in the mesh...
Definition: fem_context.h:277
const std::vector< DenseVector< Number > > & get_qoi_derivatives() const
Const accessor for QoI derivatives.
Definition: diff_context.h:329
This class forms the foundation from which generic finite elements may be derived.
const QBase & get_element_qrule() const
Accessor for element interior quadrature rule for the dimension of the current _elem.
Definition: fem_context.h:802

◆ element_time_derivative() [1/3]

virtual bool HeatSystem::element_time_derivative ( bool  request_jacobian,
libMesh::DiffContext  
)
protectedvirtual

Adds the time derivative contribution on elem to elem_residual.

If this method receives request_jacobian = true, then it should compute elem_jacobian and return true if possible. If elem_jacobian has not been computed then the method should return false.

Users need to reimplement this for their particular PDE.

To implement the physics model du/dt = F(u), the user should examine u = elem_solution and add (F(u), phi_i) to elem_residual in elem_time_derivative().

Reimplemented from libMesh::DifferentiablePhysics.

◆ element_time_derivative() [2/3]

bool HeatSystem::element_time_derivative ( bool  request_jacobian,
DiffContext &   
)
protectedvirtual

Adds the time derivative contribution on elem to elem_residual.

If this method receives request_jacobian = true, then it should compute elem_jacobian and return true if possible. If elem_jacobian has not been computed then the method should return false.

Users need to reimplement this for their particular PDE.

To implement the physics model du/dt = F(u), the user should examine u = elem_solution and add (F(u), phi_i) to elem_residual in elem_time_derivative().

Reimplemented from libMesh::DifferentiablePhysics.

Definition at line 112 of file heatsystem.C.

References _analytic_jacobians, compute_jacobian(), and parameters.

114 {
115  bool compute_jacobian = request_jacobian && _analytic_jacobians;
116 
117  FEMContext & c = cast_ref<FEMContext &>(context);
118 
119  // First we get some references to cell-specific data that
120  // will be used to assemble the linear system.
121  FEBase * elem_fe = nullptr;
122  c.get_element_fe(0, elem_fe);
123 
124  // Element Jacobian * quadrature weights for interior integration
125  const std::vector<Real> & JxW = elem_fe->get_JxW();
126 
127  // Element basis functions
128  const std::vector<std::vector<RealGradient>> & dphi = elem_fe->get_dphi();
129 
130  // The number of local degrees of freedom in each variable
131  const unsigned int n_u_dofs = c.n_dof_indices(0);
132 
133  // The subvectors and submatrices we need to fill:
134  DenseSubMatrix<Number> & K = c.get_elem_jacobian(0, 0);
135  DenseSubVector<Number> & F = c.get_elem_residual(0);
136 
137  // Now we will build the element Jacobian and residual.
138  // Constructing the residual requires the solution and its
139  // gradient from the previous timestep. This must be
140  // calculated at each quadrature point by summing the
141  // solution degree-of-freedom values by the appropriate
142  // weight functions.
143  unsigned int n_qpoints = c.get_element_qrule().n_points();
144 
145  for (unsigned int qp=0; qp != n_qpoints; qp++)
146  {
147  // Compute the solution gradient at the Newton iterate
148  Gradient grad_T = c.interior_gradient(0, qp);
149 
150  for (unsigned int i=0; i != n_u_dofs; i++)
151  F(i) += JxW[qp] * -parameters[0] * (grad_T * dphi[i][qp]);
152  if (compute_jacobian)
153  for (unsigned int i=0; i != n_u_dofs; i++)
154  for (unsigned int j=0; j != n_u_dofs; ++j)
155  K(i,j) += JxW[qp] * -parameters[0] * (dphi[i][qp] * dphi[j][qp]);
156  } // end of the quadrature point qp-loop
157 
158  return compute_jacobian;
159 }
void compute_jacobian(const NumericVector< Number > &, SparseMatrix< Number > &J, NonlinearImplicitSystem &system)
Definition: assembly.C:315
bool _analytic_jacobians
Definition: heatsystem.h:136
NumberVectorValue Gradient
std::vector< Number > parameters
Definition: heatsystem.h:113
FEGenericBase< Real > FEBase

◆ element_time_derivative() [3/3]

bool HeatSystem::element_time_derivative ( bool  request_jacobian,
DiffContext  
)
protectedvirtual

Adds the time derivative contribution on elem to elem_residual.

If this method receives request_jacobian = true, then it should compute elem_jacobian and return true if possible. If elem_jacobian has not been computed then the method should return false.

Users need to reimplement this for their particular PDE.

To implement the physics model du/dt = F(u), the user should examine u = elem_solution and add (F(u), phi_i) to elem_residual in elem_time_derivative().

Reimplemented from libMesh::DifferentiablePhysics.

Definition at line 78 of file heatsystem.C.

References dim, libMesh::Elem::dim(), libMesh::FEGenericBase< OutputType >::get_dphi(), libMesh::FEMContext::get_elem(), libMesh::DiffContext::get_elem_jacobian(), libMesh::DiffContext::get_elem_residual(), libMesh::DiffContext::get_elem_solution_derivative(), libMesh::FEMContext::get_element_fe(), libMesh::FEMContext::get_element_qrule(), libMesh::FEAbstract::get_JxW(), libMesh::System::get_mesh(), libMesh::FEGenericBase< OutputType >::get_phi(), libMesh::DiffContext::get_system(), libMesh::FEAbstract::get_xyz(), libMesh::FEMContext::interior_gradient(), libMesh::MeshBase::mesh_dimension(), libMesh::DiffContext::n_dof_indices(), libMesh::QBase::n_points(), and libMesh::pi.

80 {
81  FEMContext & c = cast_ref<FEMContext &>(context);
82 
83  const unsigned int mesh_dim =
85 
86  // First we get some references to cell-specific data that
87  // will be used to assemble the linear system.
88  const unsigned short dim = c.get_elem().dim();
89  FEBase * fe = nullptr;
90  c.get_element_fe(T_var, fe, dim);
91 
92  // Element Jacobian * quadrature weights for interior integration
93  const std::vector<Real> & JxW = fe->get_JxW();
94 
95  const std::vector<Point> & xyz = fe->get_xyz();
96 
97  const std::vector<std::vector<Real>> & phi = fe->get_phi();
98 
99  const std::vector<std::vector<RealGradient>> & dphi = fe->get_dphi();
100 
101  // The number of local degrees of freedom in each variable
102  const unsigned int n_T_dofs = c.n_dof_indices(T_var);
103 
104  // The subvectors and submatrices we need to fill:
107 
108  // Now we will build the element Jacobian and residual.
109  // Constructing the residual requires the solution and its
110  // gradient from the previous timestep. This must be
111  // calculated at each quadrature point by summing the
112  // solution degree-of-freedom values by the appropriate
113  // weight functions.
114  unsigned int n_qpoints = c.get_element_qrule().n_points();
115 
116  for (unsigned int qp=0; qp != n_qpoints; qp++)
117  {
118  // Compute the solution gradient at the Newton iterate
119  Gradient grad_T = c.interior_gradient(T_var, qp);
120 
121  const Number k = _k[dim];
122 
123  const Point & p = xyz[qp];
124 
125  // solution + laplacian depend on problem dimension
126  const Number u_exact = (mesh_dim == 2) ?
127  std::sin(libMesh::pi*p(0)) * std::sin(libMesh::pi*p(1)) :
128  std::sin(libMesh::pi*p(0)) * std::sin(libMesh::pi*p(1)) *
129  std::sin(libMesh::pi*p(2));
130 
131  // Only apply forcing to interior elements
132  const Number forcing = (dim == mesh_dim) ?
133  -k * u_exact * (dim * libMesh::pi * libMesh::pi) : 0;
134 
135  const Number JxWxNK = JxW[qp] * -k;
136 
137  for (unsigned int i=0; i != n_T_dofs; i++)
138  F(i) += JxWxNK * (grad_T * dphi[i][qp] + forcing * phi[i][qp]);
139  if (request_jacobian)
140  {
141  const Number JxWxNKxD = JxWxNK *
142  context.get_elem_solution_derivative();
143 
144  for (unsigned int i=0; i != n_T_dofs; i++)
145  for (unsigned int j=0; j != n_T_dofs; ++j)
146  K(i,j) += JxWxNKxD * (dphi[i][qp] * dphi[j][qp]);
147  }
148  } // end of the quadrature point qp-loop
149 
150  return request_jacobian;
151 }
const DenseMatrix< Number > & get_elem_jacobian() const
Const accessor for element Jacobian.
Definition: diff_context.h:274
Real & k()
Definition: heatsystem.h:48
const Elem & get_elem() const
Accessor for current Elem object.
Definition: fem_context.h:908
unsigned int dim
unsigned int n_dof_indices() const
Total number of dof indices on the element.
Definition: diff_context.h:395
This class defines a vector in LIBMESH_DIM dimensional Real or Complex space.
const MeshBase & get_mesh() const
Definition: system.h:2277
unsigned int T_var
Definition: heatsystem.h:133
Defines a dense subvector for use in finite element computations.
const std::vector< std::vector< OutputGradient > > & get_dphi() const
Definition: fe_base.h:230
Gradient interior_gradient(unsigned int var, unsigned int qp) const
Definition: fem_context.C:459
const System & get_system() const
Accessor for associated system.
Definition: diff_context.h:106
Defines a dense submatrix for use in Finite Element-type computations.
virtual_for_inffe const std::vector< Real > & get_JxW() const
Definition: fe_abstract.h:295
This class provides all data required for a physics package (e.g.
Definition: fem_context.h:62
unsigned int n_points() const
Definition: quadrature.h:123
virtual_for_inffe const std::vector< Point > & get_xyz() const
Definition: fe_abstract.h:272
const DenseVector< Number > & get_elem_residual() const
Const accessor for element residual.
Definition: diff_context.h:242
virtual unsigned short dim() const =0
unsigned int mesh_dimension() const
Definition: mesh_base.C:324
void get_element_fe(unsigned int var, FEGenericBase< OutputShape > *&fe) const
Accessor for interior finite element object for variable var for the largest dimension in the mesh...
Definition: fem_context.h:277
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition: point.h:39
This class forms the foundation from which generic finite elements may be derived.
const QBase & get_element_qrule() const
Accessor for element interior quadrature rule for the dimension of the current _elem.
Definition: fem_context.h:802
const Real pi
.
Definition: libmesh.h:274
const std::vector< std::vector< OutputShape > > & get_phi() const
Definition: fe_base.h:207

◆ enable_print_counter_info()

void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

Methods to enable/disable the reference counter output from print_info()

Definition at line 94 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

95 {
96  _enable_print_counter = true;
97  return;
98 }
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ eulerian_residual() [1/2]

bool libMesh::FEMPhysics::eulerian_residual ( bool  request_jacobian,
DiffContext context 
)
overridevirtualinherited

Adds a pseudo-convection contribution on elem to elem_residual, if the nodes of elem are being translated by a moving mesh.

This function assumes that the user's time derivative equations (except for any equations involving unknown mesh xyz coordinates themselves) are expressed in an Eulerian frame of reference, and that the user is satisfied with an unstabilized convection term. Lagrangian equations will probably require overriding eulerian_residual() with a blank function; ALE or stabilized formulations will require reimplementing eulerian_residual() entirely.

Reimplemented from libMesh::DifferentiablePhysics.

Reimplemented in SolidSystem.

Definition at line 38 of file fem_physics.C.

References libMesh::DifferentiablePhysics::_mesh_sys, libMesh::DifferentiablePhysics::_mesh_x_var, libMesh::DifferentiablePhysics::_mesh_y_var, libMesh::DifferentiablePhysics::_mesh_z_var, libMesh::FEMContext::get_element_qrule(), libMesh::FEMContext::interior_gradient(), libMesh::invalid_uint, libMesh::DifferentiablePhysics::is_time_evolving(), libMesh::libmesh_assert(), libMesh::libmesh_real(), libMesh::make_range(), libMesh::DiffContext::n_vars(), and libMesh::UnsteadySolver::old_nonlinear_solution().

40 {
41  // Only calculate a mesh movement residual if it's necessary
42  if (!_mesh_sys)
43  return request_jacobian;
44 
45  libmesh_not_implemented();
46 
47 #if 0
48  FEMContext & context = cast_ref<FEMContext &>(c);
49 
50  // This function only supports fully coupled mesh motion for now
51  libmesh_assert_equal_to (_mesh_sys, this);
52 
53  unsigned int n_qpoints = (context.get_element_qrule())->n_points();
54 
55  const unsigned int n_x_dofs = (_mesh_x_var == libMesh::invalid_uint) ?
56  0 : context.dof_indices_var[_mesh_x_var].size();
57  const unsigned int n_y_dofs = (_mesh_y_var == libMesh::invalid_uint) ?
58  0 : context.dof_indices_var[_mesh_y_var].size();
59  const unsigned int n_z_dofs = (_mesh_z_var == libMesh::invalid_uint) ?
60  0 : context.dof_indices_var[_mesh_z_var].size();
61 
62  const unsigned int mesh_xyz_var = n_x_dofs ? _mesh_x_var :
63  (n_y_dofs ? _mesh_y_var :
64  (n_z_dofs ? _mesh_z_var :
66 
67  // If we're our own _mesh_sys, we'd better be in charge of
68  // at least one coordinate, and we'd better have the same
69  // FE type for all coordinates we are in charge of
70  libmesh_assert_not_equal_to (mesh_xyz_var, libMesh::invalid_uint);
71  libmesh_assert(!n_x_dofs || context.element_fe_var[_mesh_x_var] ==
72  context.element_fe_var[mesh_xyz_var]);
73  libmesh_assert(!n_y_dofs || context.element_fe_var[_mesh_y_var] ==
74  context.element_fe_var[mesh_xyz_var]);
75  libmesh_assert(!n_z_dofs || context.element_fe_var[_mesh_z_var] ==
76  context.element_fe_var[mesh_xyz_var]);
77 
78  const std::vector<std::vector<Real>> & psi =
79  context.element_fe_var[mesh_xyz_var]->get_phi();
80 
81  for (auto var : make_range(context.n_vars()))
82  {
83  // Mesh motion only affects time-evolving variables
84  if (this->is_time_evolving(var))
85  continue;
86 
87  // The mesh coordinate variables themselves are Lagrangian,
88  // not Eulerian, and no convective term is desired.
89  if (/*_mesh_sys == this && */
90  (var == _mesh_x_var ||
91  var == _mesh_y_var ||
92  var == _mesh_z_var))
93  continue;
94 
95  // Some of this code currently relies on the assumption that
96  // we can pull mesh coordinate data from our own system
97  if (_mesh_sys != this)
98  libmesh_not_implemented();
99 
100  // This residual should only be called by unsteady solvers:
101  // if the mesh is steady, there's no mesh convection term!
102  UnsteadySolver * unsteady;
103  if (this->time_solver->is_steady())
104  return request_jacobian;
105  else
106  unsteady = cast_ptr<UnsteadySolver*>(this->time_solver.get());
107 
108  const std::vector<Real> & JxW =
109  context.element_fe_var[var]->get_JxW();
110 
111  const std::vector<std::vector<Real>> & phi =
112  context.element_fe_var[var]->get_phi();
113 
114  const std::vector<std::vector<RealGradient>> & dphi =
115  context.element_fe_var[var]->get_dphi();
116 
117  const unsigned int n_u_dofs = context.dof_indices_var[var].size();
118 
119  DenseSubVector<Number> & Fu = *context.elem_subresiduals[var];
120  DenseSubMatrix<Number> & Kuu = *context.elem_subjacobians[var][var];
121 
122  DenseSubMatrix<Number> * Kux = n_x_dofs ?
123  context.elem_subjacobians[var][_mesh_x_var] : nullptr;
124  DenseSubMatrix<Number> * Kuy = n_y_dofs ?
125  context.elem_subjacobians[var][_mesh_y_var] : nullptr;
126  DenseSubMatrix<Number> * Kuz = n_z_dofs ?
127  context.elem_subjacobians[var][_mesh_z_var] : nullptr;
128 
129  std::vector<Real> delta_x(n_x_dofs, 0.);
130  std::vector<Real> delta_y(n_y_dofs, 0.);
131  std::vector<Real> delta_z(n_z_dofs, 0.);
132 
133  for (unsigned int i = 0; i != n_x_dofs; ++i)
134  {
135  unsigned int j = context.dof_indices_var[_mesh_x_var][i];
136  delta_x[i] = libmesh_real(this->current_solution(j)) -
137  libmesh_real(unsteady->old_nonlinear_solution(j));
138  }
139 
140  for (unsigned int i = 0; i != n_y_dofs; ++i)
141  {
142  unsigned int j = context.dof_indices_var[_mesh_y_var][i];
143  delta_y[i] = libmesh_real(this->current_solution(j)) -
144  libmesh_real(unsteady->old_nonlinear_solution(j));
145  }
146 
147  for (unsigned int i = 0; i != n_z_dofs; ++i)
148  {
149  unsigned int j = context.dof_indices_var[_mesh_z_var][i];
150  delta_z[i] = libmesh_real(this->current_solution(j)) -
151  libmesh_real(unsteady->old_nonlinear_solution(j));
152  }
153 
154  for (unsigned int qp = 0; qp != n_qpoints; ++qp)
155  {
156  Gradient grad_u = context.interior_gradient(var, qp);
157  RealGradient convection(0.);
158 
159  for (unsigned int i = 0; i != n_x_dofs; ++i)
160  convection(0) += delta_x[i] * psi[i][qp];
161  for (unsigned int i = 0; i != n_y_dofs; ++i)
162  convection(1) += delta_y[i] * psi[i][qp];
163  for (unsigned int i = 0; i != n_z_dofs; ++i)
164  convection(2) += delta_z[i] * psi[i][qp];
165 
166  for (unsigned int i = 0; i != n_u_dofs; ++i)
167  {
168  Number JxWxPhiI = JxW[qp] * phi[i][qp];
169  Fu(i) += (convection * grad_u) * JxWxPhiI;
170  if (request_jacobian)
171  {
172  Number JxWxPhiI = JxW[qp] * phi[i][qp];
173  for (unsigned int j = 0; j != n_u_dofs; ++j)
174  Kuu(i,j) += JxWxPhiI * (convection * dphi[j][qp]);
175 
176  Number JxWxPhiIoverDT = JxWxPhiI/this->deltat;
177 
178  Number JxWxPhiIxDUDXoverDT = JxWxPhiIoverDT * grad_u(0);
179  for (unsigned int j = 0; j != n_x_dofs; ++j)
180  (*Kux)(i,j) += JxWxPhiIxDUDXoverDT * psi[j][qp];
181 
182  Number JxWxPhiIxDUDYoverDT = JxWxPhiIoverDT * grad_u(1);
183  for (unsigned int j = 0; j != n_y_dofs; ++j)
184  (*Kuy)(i,j) += JxWxPhiIxDUDYoverDT * psi[j][qp];
185 
186  Number JxWxPhiIxDUDZoverDT = JxWxPhiIoverDT * grad_u(2);
187  for (unsigned int j = 0; j != n_z_dofs; ++j)
188  (*Kuz)(i,j) += JxWxPhiIxDUDZoverDT * psi[j][qp];
189  }
190  }
191  }
192  }
193 #endif // 0
194 
195  return request_jacobian;
196 }
T libmesh_real(T a)
RealVectorValue RealGradient
unsigned int _mesh_x_var
Variables from which to acquire moving mesh information.
Definition: diff_physics.h:536
const unsigned int invalid_uint
A number which is used quite often to represent an invalid or uninitialized value for an unsigned int...
Definition: libmesh.h:286
System * _mesh_sys
System from which to acquire moving mesh information.
Definition: diff_physics.h:531
NumberVectorValue Gradient
libmesh_assert(ctx)
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
bool is_time_evolving(unsigned int var) const
Definition: diff_physics.h:260

◆ eulerian_residual() [2/2]

virtual bool libMesh::DifferentiablePhysics::eulerian_residual ( bool  request_jacobian,
DiffContext  
)
inlinevirtualinherited

Adds a pseudo-convection contribution on elem to elem_residual, if the nodes of elem are being translated by a moving mesh.

The library provides a basic implementation in FEMPhysics::eulerian_residual()

Reimplemented in libMesh::FEMPhysics, and SolidSystem.

Definition at line 277 of file diff_physics.h.

Referenced by libMesh::DifferentiablePhysics::_eulerian_time_deriv().

279  {
280  return request_jacobian;
281  }

◆ fe_family() [1/2]

std::string& HeatSystem::fe_family ( )
inline

Definition at line 23 of file heatsystem.h.

References _fe_family.

23 { return _fe_family; }
std::string _fe_family
Definition: heatsystem.h:129

◆ fe_family() [2/2]

std::string& HeatSystem::fe_family ( )
inline

Definition at line 46 of file heatsystem.h.

Referenced by set_system_parameters().

46 { return _fe_family; }
std::string _fe_family
Definition: heatsystem.h:129

◆ fe_order() [1/2]

unsigned int& HeatSystem::fe_order ( )
inline

Definition at line 24 of file heatsystem.h.

References _fe_order.

24 { return _fe_order; }
unsigned int _fe_order
Definition: heatsystem.h:130

◆ fe_order() [2/2]

unsigned int& HeatSystem::fe_order ( )
inline

Definition at line 47 of file heatsystem.h.

Referenced by set_system_parameters().

47 { return _fe_order; }
unsigned int _fe_order
Definition: heatsystem.h:130

◆ finalize_derivative()

void libMesh::DifferentiableQoI::finalize_derivative ( NumericVector< Number > &  derivatives,
std::size_t  qoi_index 
)
virtualinherited

Method to finalize qoi derivatives which require more than just a simple sum of element contributions.

Definition at line 53 of file diff_qoi.C.

Referenced by libMesh::FEMSystem::assemble_qoi_derivative().

54 {
55  // by default, do nothing
56 }

◆ forward_qoi_parameter_sensitivity()

void libMesh::ImplicitSystem::forward_qoi_parameter_sensitivity ( const QoISet qoi_indices,
const ParameterVector parameters,
SensitivityData sensitivities 
)
overridevirtualinherited

Solves for the derivative of each of the system's quantities of interest q in qoi[qoi_indices] with respect to each parameter in parameters, placing the result for qoi i and parameter j into sensitivities[i][j].

Uses the forward sensitivity method.

Currently uses finite differenced derivatives (partial q / partial p) and (partial R / partial p).

Reimplemented from libMesh::System.

Definition at line 600 of file implicit_system.C.

References std::abs(), libMesh::SensitivityData::allocate_data(), libMesh::ExplicitSystem::assemble_qoi(), libMesh::ExplicitSystem::assemble_qoi_derivative(), libMesh::ImplicitSystem::assembly(), libMesh::NumericVector< T >::close(), libMesh::SparseMatrix< T >::close(), libMesh::NumericVector< T >::dot(), libMesh::System::get_adjoint_rhs(), libMesh::System::get_qoi_values(), libMesh::System::get_sensitivity_solution(), libMesh::QoISet::has_index(), libMesh::make_range(), libMesh::ImplicitSystem::matrix, libMesh::System::n_qois(), libMesh::Real, libMesh::ExplicitSystem::rhs, libMesh::ImplicitSystem::sensitivity_solve(), libMesh::ParameterVector::size(), and libMesh::TOLERANCE.

Referenced by main().

603 {
604  ParameterVector & parameters =
605  const_cast<ParameterVector &>(parameters_in);
606 
607  const unsigned int Np = cast_int<unsigned int>
608  (parameters.size());
609  const unsigned int Nq = this->n_qois();
610 
611  // An introduction to the problem:
612  //
613  // Residual R(u(p),p) = 0
614  // partial R / partial u = J = system matrix
615  //
616  // This implies that:
617  // d/dp(R) = 0
618  // (partial R / partial p) +
619  // (partial R / partial u) * (partial u / partial p) = 0
620 
621  // We first solve for (partial u / partial p) for each parameter:
622  // J * (partial u / partial p) = - (partial R / partial p)
623 
624  this->sensitivity_solve(parameters);
625 
626  // Get ready to fill in sensitivities:
627  sensitivities.allocate_data(qoi_indices, *this, parameters);
628 
629  // We use the identity:
630  // dq/dp = (partial q / partial p) + (partial q / partial u) *
631  // (partial u / partial p)
632 
633  // We get (partial q / partial u) from the user
634  this->assemble_qoi_derivative(qoi_indices,
635  /* include_liftfunc = */ true,
636  /* apply_constraints = */ false);
637 
638  // We don't need these to be closed() in this function, but libMesh
639  // standard practice is to have them closed() by the time the
640  // function exits
641  for (auto i : make_range(this->n_qois()))
642  if (qoi_indices.has_index(i))
643  this->get_adjoint_rhs(i).close();
644 
645  for (unsigned int j=0; j != Np; ++j)
646  {
647  // We currently get partial derivatives via central differencing
648 
649  // (partial q / partial p) ~= (q(p+dp)-q(p-dp))/(2*dp)
650 
651  Number old_parameter = *parameters[j];
652 
653  const Real delta_p =
654  TOLERANCE * std::max(std::abs(old_parameter), 1e-3);
655 
656  *parameters[j] = old_parameter - delta_p;
657  this->assemble_qoi(qoi_indices);
658  const std::vector<Number> qoi_minus = this->get_qoi_values();
659 
660  *parameters[j] = old_parameter + delta_p;
661  this->assemble_qoi(qoi_indices);
662  const std::vector<Number> qoi_plus = this->get_qoi_values();
663 
664  std::vector<Number> partialq_partialp(Nq, 0);
665  for (unsigned int i=0; i != Nq; ++i)
666  if (qoi_indices.has_index(i))
667  partialq_partialp[i] = (qoi_plus[i] - qoi_minus[i]) / (2.*delta_p);
668 
669  // Don't leave the parameter changed
670  *parameters[j] = old_parameter;
671 
672  for (unsigned int i=0; i != Nq; ++i)
673  if (qoi_indices.has_index(i))
674  sensitivities[i][j] = partialq_partialp[i] +
675  this->get_adjoint_rhs(i).dot(this->get_sensitivity_solution(j));
676  }
677 
678  // All parameters have been reset.
679  // We didn't cache the original rhs or matrix for memory reasons,
680  // but we can restore them to a state consistent solution -
681  // principle of least surprise.
682  this->assembly(true, true);
683  this->rhs->close();
684  this->matrix->close();
685  this->assemble_qoi(qoi_indices);
686 }
static constexpr Real TOLERANCE
unsigned int n_qois() const
Number of currently active quantities of interest.
Definition: system.h:2516
NumericVector< Number > & get_sensitivity_solution(unsigned int i=0)
Definition: system.C:1140
NumericVector< Number > * rhs
The system matrix.
virtual std::pair< unsigned int, Real > sensitivity_solve(const ParameterVector &parameters) override
Assembles & solves the linear system(s) (dR/du)*u_p = -dR/dp, for those parameters contained within p...
virtual T dot(const NumericVector< T > &v) const =0
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
Definition: type_vector.h:57
virtual void assembly(bool, bool, bool=false, bool=false)
Assembles a residual in rhs and/or a jacobian in matrix, as requested.
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
SparseMatrix< Number > * matrix
The system matrix.
virtual void assemble_qoi(const QoISet &qoi_indices=QoISet()) override
Prepares qoi for quantity of interest assembly, then calls user qoi function.
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
virtual void assemble_qoi_derivative(const QoISet &qoi_indices=QoISet(), bool include_liftfunc=true, bool apply_constraints=true) override
Prepares adjoint_rhs for quantity of interest derivative assembly, then calls user qoi derivative fun...
std::vector< Number > get_qoi_values() const
Returns a copy of qoi, not a reference.
Definition: system.C:2341
NumericVector< Number > & get_adjoint_rhs(unsigned int i=0)
Definition: system.C:1255

◆ get_adjoint_rhs() [1/2]

NumericVector< Number > & libMesh::System::get_adjoint_rhs ( unsigned int  i = 0)
inherited
Returns
A reference to one of the system's adjoint rhs vectors, by default the one corresponding to the first qoi. This what the user's QoI derivative code should assemble when setting up an adjoint problem

Definition at line 1255 of file system.C.

References libMesh::System::get_vector().

Referenced by libMesh::ImplicitSystem::adjoint_solve(), libMesh::FEMSystem::assemble_qoi_derivative(), libMesh::ImplicitSystem::forward_qoi_parameter_sensitivity(), libMesh::ImplicitSystem::qoi_parameter_hessian(), libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product(), and libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve().

1256 {
1257  std::ostringstream adjoint_rhs_name;
1258  adjoint_rhs_name << "adjoint_rhs" << i;
1259 
1260  return this->get_vector(adjoint_rhs_name.str());
1261 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:918

◆ get_adjoint_rhs() [2/2]

const NumericVector< Number > & libMesh::System::get_adjoint_rhs ( unsigned int  i = 0) const
inherited
Returns
A reference to one of the system's adjoint rhs vectors, by default the one corresponding to the first qoi.

Definition at line 1265 of file system.C.

References libMesh::System::get_vector().

1266 {
1267  std::ostringstream adjoint_rhs_name;
1268  adjoint_rhs_name << "adjoint_rhs" << i;
1269 
1270  return this->get_vector(adjoint_rhs_name.str());
1271 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:918

◆ get_adjoint_solution() [1/2]

NumericVector< Number > & libMesh::System::get_adjoint_solution ( unsigned int  i = 0)
inherited

◆ get_adjoint_solution() [2/2]

const NumericVector< Number > & libMesh::System::get_adjoint_solution ( unsigned int  i = 0) const
inherited
Returns
A reference to one of the system's adjoint solution vectors, by default the one corresponding to the first qoi.

Definition at line 1203 of file system.C.

References libMesh::System::get_vector().

1204 {
1205  std::ostringstream adjoint_name;
1206  adjoint_name << "adjoint_solution" << i;
1207 
1208  return this->get_vector(adjoint_name.str());
1209 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:918

◆ get_all_variable_numbers()

void libMesh::System::get_all_variable_numbers ( std::vector< unsigned int > &  all_variable_numbers) const
inherited

Fills all_variable_numbers with all the variable numbers for the variables that have been added to this system.

Definition at line 1565 of file system.C.

References libMesh::System::_variable_numbers, and libMesh::System::n_vars().

Referenced by MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), and SystemsTest::testProjectCubeWithMeshFunction().

1566 {
1567  all_variable_numbers.resize(n_vars());
1568 
1569  unsigned int count = 0;
1570  for (auto vn : _variable_numbers)
1571  all_variable_numbers[count++] = vn.second;
1572 }
std::map< std::string, unsigned int, std::less<> > _variable_numbers
The variable numbers corresponding to user-specified names, useful for name-based lookups...
Definition: system.h:2151
unsigned int n_vars() const
Definition: system.h:2349

◆ get_constrain_in_solver()

virtual bool libMesh::DifferentiableSystem::get_constrain_in_solver ( )
inlinevirtualinherited

Definition at line 387 of file diff_system.h.

References libMesh::DifferentiableSystem::_constrain_in_solver.

388  {
389  return _constrain_in_solver;
390  }
bool _constrain_in_solver
_constrain_in_solver defaults to true; if false then we apply constraints only via residual terms in ...
Definition: diff_system.h:430

◆ get_constraint_object()

System::Constraint & libMesh::System::get_constraint_object ( )
inherited

Return the user object for imposing constraints.

Definition at line 2174 of file system.C.

References libMesh::System::_constrain_system_object.

2175 {
2176  libmesh_assert_msg(_constrain_system_object,"No constraint object available.");
2177  return *_constrain_system_object;
2178 }
Constraint * _constrain_system_object
Object that constrains the system.
Definition: system.h:2081

◆ get_dof_map() [1/2]

const DofMap & libMesh::System::get_dof_map ( ) const
inlineinherited
Returns
A constant reference to this system's _dof_map.

Definition at line 2293 of file system.h.

References libMesh::System::_dof_map.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::DifferentiableSystem::add_dot_var_dirichlet_bcs(), libMesh::HPCoarsenTest::add_projection(), libMesh::RBConstruction::add_scaled_matrix_and_vector(), libMesh::AdaptiveTimeSolver::adjoint_advance_timestep(), libMesh::UnsteadySolver::adjoint_advance_timestep(), libMesh::ImplicitSystem::adjoint_solve(), libMesh::NewmarkSolver::advance_timestep(), libMesh::AdaptiveTimeSolver::advance_timestep(), libMesh::UnsteadySolver::advance_timestep(), libMesh::EquationSystems::allgather(), libMesh::TransientRBConstruction::allocate_data_structures(), libMesh::RBConstruction::allocate_data_structures(), alternative_fe_assembly(), assemble(), LinearElasticity::assemble(), assemble_1D(), AssembleOptimization::assemble_A_and_F(), assemble_and_solve(), assemble_biharmonic(), assemble_divgrad(), assemble_elasticity(), assemble_ellipticdg(), assemble_func(), assemble_helmholtz(), assemble_laplace(), assemble_mass(), assemble_matrices(), assemble_matrix_and_rhs(), assemble_poisson(), assemble_SchroedingerEquation(), assemble_shell(), assemble_stokes(), assemble_wave(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::PetscDMWrapper::build_sf(), libMesh::System::calculate_norm(), compute_jacobian(), compute_residual(), compute_stresses(), LinearElasticityWithContact::compute_stresses(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), libMesh::Problem_Interface::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), MyConstraint::constrain(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), DMCreateDomainDecomposition_libMesh(), DMCreateFieldDecomposition_libMesh(), DMlibMeshFunction(), DMlibMeshJacobian(), DMlibMeshSetSystem_libMesh(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), fe_assembly(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::System::get_info(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::SecondOrderUnsteadySolver::init_data(), libMesh::UnsteadySolver::init_data(), init_data(), SimpleRBConstruction::init_data(), LaplaceSystem::init_dirichlet_bcs(), libMesh::FEMContext::init_internal_data(), libMesh::EigenSystem::init_matrices(), libMesh::System::init_matrices(), libMesh::CondensedEigenSystem::initialize_condensed_dofs(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), LaplaceYoung::jacobian(), LargeDeformationElasticity::jacobian(), libMesh::System::late_matrix_init(), libMesh::libmesh_petsc_snes_fd_residual(), libMesh::libmesh_petsc_snes_jacobian(), libMesh::libmesh_petsc_snes_mffd_residual(), libMesh::libmesh_petsc_snes_residual(), libMesh::libmesh_petsc_snes_residual_helper(), libMesh::System::local_dof_indices(), AssembleOptimization::lower_and_upper_bounds(), main(), libMesh::DofMap::max_constraint_error(), LinearElasticityWithContact::move_mesh(), libMesh::DGFEMContext::neighbor_side_fe_reinit(), libMesh::UnsteadySolver::old_nonlinear_solution(), libMesh::SecondOrderUnsteadySolver::old_solution_accel(), libMesh::SecondOrderUnsteadySolver::old_solution_rate(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::PatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectSides::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectInteriors::operator()(), libMesh::RBSCMConstruction::perform_SCM_greedy(), periodic_bc_test_poisson(), libMesh::petsc_auto_fieldsplit(), libMesh::ErrorVector::plot_error(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::FEMContext::pre_fe_reinit(), libMesh::InterMeshProjection::project_system_vectors(), libMesh::System::re_update(), libMesh::System::read_parallel_data(), libMesh::System::read_SCALAR_dofs(), libMesh::SecondOrderUnsteadySolver::reinit(), libMesh::UnsteadySolver::reinit(), libMesh::System::reinit(), libMesh::System::reinit_constraints(), libMesh::EquationSystems::reinit_solutions(), LaplaceYoung::residual(), LargeDeformationElasticity::residual(), LinearElasticityWithContact::residual_and_jacobian(), libMesh::UnsteadySolver::retrieve_timestep(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), libMesh::HPCoarsenTest::select_refinement(), libMesh::ImplicitSystem::sensitivity_solve(), libMesh::RBConstruction::set_context_solution_vec(), libMesh::PetscDMWrapper::set_point_range_in_section(), set_system_parameters(), FETestBase< order, family, elem_type, 1 >::setUp(), SolidSystem::side_time_derivative(), libMesh::NewtonSolver::solve(), libMesh::PetscDiffSolver::solve(), libMesh::EigenSystem::solve(), libMesh::RBConstruction::solve_for_matrix_and_rhs(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), MeshFunctionTest::test_subdomain_id_sets(), SystemsTest::testBlockRestrictedVarNDofs(), DofMapTest::testConstraintLoopDetection(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), EquationSystemsTest::testDisableDefaultGhosting(), SystemsTest::testDofCouplingWithVarGroups(), DofMapTest::testDofOwner(), MeshInputTest::testDynaReadPatch(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), MeshAssignTest::testMeshMoveAssign(), PeriodicBCTest::testPeriodicBC(), SystemsTest::testPostInitAddVectorTypeChange(), SystemsTest::testProjectCubeWithMeshFunction(), SystemsTest::testProjectMatrix1D(), SystemsTest::testProjectMatrix2D(), SystemsTest::testProjectMatrix3D(), InfFERadialTest::testRefinement(), EquationSystemsTest::testSelectivePRefine(), BoundaryInfoTest::testShellFaceConstraints(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::BoundaryVolumeSolutionTransfer::transfer_boundary_volume(), libMesh::UnsteadySolver::update(), libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve(), libMesh::ImplicitSystem::weighted_sensitivity_solve(), libMesh::Nemesis_IO_Helper::write_nodal_solution(), libMesh::System::write_parallel_data(), libMesh::EnsightIO::write_scalar_ascii(), libMesh::System::write_SCALAR_dofs(), libMesh::EnsightIO::write_vector_ascii(), and libMesh::RBConstruction::zero_constrained_dofs_on_vector().

2294 {
2295  return *_dof_map;
2296 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2113

◆ get_dof_map() [2/2]

DofMap & libMesh::System::get_dof_map ( )
inlineinherited
Returns
A writable reference to this system's _dof_map.

Definition at line 2301 of file system.h.

References libMesh::System::_dof_map.

2302 {
2303  return *_dof_map;
2304 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2113

◆ get_equation_systems() [1/2]

const EquationSystems& libMesh::System::get_equation_systems ( ) const
inlineinherited
Returns
A constant reference to this system's parent EquationSystems object.

Definition at line 730 of file system.h.

References libMesh::System::_equation_systems.

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::RBSCMConstruction::add_scaled_symm_Aq(), libMesh::NewmarkSystem::clear(), libMesh::FrequencySystem::clear_all(), compute_jacobian(), compute_residual(), LinearElasticityWithContact::compute_stresses(), SolidSystem::element_time_derivative(), libMesh::RBConstruction::enrich_basis_from_rhs_terms(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::AdjointResidualErrorEstimator::estimate_error(), libMesh::ExactErrorEstimator::find_squared_element_error(), libMesh::ImplicitSystem::get_linear_solve_parameters(), SolidSystem::init_data(), init_data(), libMesh::FrequencySystem::init_data(), LaplaceYoung::jacobian(), libMesh::RBSCMConstruction::load_matrix_B(), LinearElasticityWithContact::move_mesh(), libMesh::FrequencySystem::n_frequencies(), libMesh::RBSCMConstruction::perform_SCM_greedy(), libMesh::System::point_gradient(), libMesh::System::point_value(), libMesh::InterMeshProjection::project_system_vectors(), LaplaceYoung::residual(), LinearElasticityWithContact::residual_and_jacobian(), libMesh::FileHistoryData::retrieve_adjoint_solution(), libMesh::FileHistoryData::retrieve_primal_solution(), libMesh::FileHistoryData::rewrite_stored_solution(), SolidSystem::save_initial_mesh(), libMesh::FrequencySystem::set_current_frequency(), libMesh::FrequencySystem::set_frequencies(), libMesh::FrequencySystem::set_frequencies_by_range(), libMesh::FrequencySystem::set_frequencies_by_steps(), libMesh::NewmarkSystem::set_newmark_parameters(), libMesh::NonlinearImplicitSystem::set_solver_parameters(), SolidSystem::side_time_derivative(), libMesh::EigenSystem::solve(), libMesh::CondensedEigenSystem::solve(), libMesh::FrequencySystem::solve(), libMesh::LinearImplicitSystem::solve(), libMesh::RBConstruction::solve_for_matrix_and_rhs(), libMesh::FileHistoryData::store_adjoint_solution(), libMesh::FileHistoryData::store_initial_solution(), libMesh::FileHistoryData::store_primal_solution(), MeshFunctionTest::test_p_level(), MeshFunctionTest::test_subdomain_id_sets(), MeshAssignTest::testMeshMoveAssign(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::DirectSolutionTransfer::transfer(), libMesh::DTKSolutionTransfer::transfer(), libMesh::TransientRBConstruction::truth_solve(), libMesh::RBConstruction::truth_solve(), and libMesh::WrappedFunction< Output >::WrappedFunction().

730 { return _equation_systems; }
EquationSystems & _equation_systems
Constant reference to the EquationSystems object used for the simulation.
Definition: system.h:2119

◆ get_equation_systems() [2/2]

EquationSystems& libMesh::System::get_equation_systems ( )
inlineinherited
Returns
A reference to this system's parent EquationSystems object.

Definition at line 735 of file system.h.

References libMesh::System::_equation_systems.

735 { return _equation_systems; }
EquationSystems & _equation_systems
Constant reference to the EquationSystems object used for the simulation.
Definition: system.h:2119

◆ get_first_order_vars()

const std::set<unsigned int>& libMesh::DifferentiablePhysics::get_first_order_vars ( ) const
inlineinherited
Returns
The set of first order in time variable indices. May be empty.

Definition at line 506 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_first_order_vars.

Referenced by libMesh::DifferentiableSystem::have_first_order_scalar_vars().

507  { return _first_order_vars; }
std::set< unsigned int > _first_order_vars
Variable indices for those variables that are first order in time.
Definition: diff_physics.h:548

◆ get_info() [1/2]

std::string libMesh::ReferenceCounter::get_info ( )
staticinherited

Gets a string containing the reference information.

Definition at line 47 of file reference_counter.C.

References libMesh::ReferenceCounter::_counts, and libMesh::Quality::name().

Referenced by libMesh::ReferenceCounter::print_info().

48 {
49 #if defined(LIBMESH_ENABLE_REFERENCE_COUNTING) && defined(DEBUG)
50 
51  std::ostringstream oss;
52 
53  oss << '\n'
54  << " ---------------------------------------------------------------------------- \n"
55  << "| Reference count information |\n"
56  << " ---------------------------------------------------------------------------- \n";
57 
58  for (const auto & [name, cd] : _counts)
59  oss << "| " << name << " reference count information:\n"
60  << "| Creations: " << cd.first << '\n'
61  << "| Destructions: " << cd.second << '\n';
62 
63  oss << " ---------------------------------------------------------------------------- \n";
64 
65  return oss.str();
66 
67 #else
68 
69  return "";
70 
71 #endif
72 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
static Counts _counts
Actually holds the data.

◆ get_info() [2/2]

std::string libMesh::System::get_info ( ) const
inherited
Returns
A string containing information about the system.

Definition at line 1988 of file system.C.

References libMesh::ParallelObject::comm(), libMesh::FEType::family, libMesh::System::get_dof_map(), libMesh::DofMap::get_info(), libMesh::FEType::inf_map, libMesh::make_range(), TIMPI::Communicator::max(), libMesh::System::n_constrained_dofs(), libMesh::System::n_dofs(), libMesh::System::n_local_constrained_dofs(), libMesh::System::n_local_dofs(), libMesh::System::n_matrices(), libMesh::System::n_variable_groups(), libMesh::VariableGroup::n_variables(), libMesh::System::n_vectors(), libMesh::VariableGroup::name(), libMesh::System::name(), libMesh::System::number(), libMesh::FEType::order, libMesh::FEType::radial_family, libMesh::FEType::radial_order, libMesh::System::system_type(), libMesh::Variable::type(), libMesh::DofMap::variable_group(), and libMesh::System::variable_group().

1989 {
1990  std::ostringstream oss;
1991 
1992 
1993  const std::string & sys_name = this->name();
1994 
1995  oss << " System #" << this->number() << ", \"" << sys_name << "\"\n"
1996  << " Type \"" << this->system_type() << "\"\n"
1997  << " Variables=";
1998 
1999  for (auto vg : make_range(this->n_variable_groups()))
2000  {
2001  const VariableGroup & vg_description (this->variable_group(vg));
2002 
2003  if (vg_description.n_variables() > 1) oss << "{ ";
2004  for (auto vn : make_range(vg_description.n_variables()))
2005  oss << "\"" << vg_description.name(vn) << "\" ";
2006  if (vg_description.n_variables() > 1) oss << "} ";
2007  }
2008 
2009  oss << '\n';
2010 
2011  oss << " Finite Element Types=";
2012 #ifndef LIBMESH_ENABLE_INFINITE_ELEMENTS
2013  for (auto vg : make_range(this->n_variable_groups()))
2014  oss << "\""
2015  << Utility::enum_to_string<FEFamily>(this->get_dof_map().variable_group(vg).type().family)
2016  << "\" ";
2017 #else
2018  for (auto vg : make_range(this->n_variable_groups()))
2019  {
2020  oss << "\""
2021  << Utility::enum_to_string<FEFamily>(this->get_dof_map().variable_group(vg).type().family)
2022  << "\", \""
2023  << Utility::enum_to_string<FEFamily>(this->get_dof_map().variable_group(vg).type().radial_family)
2024  << "\" ";
2025  }
2026 
2027  oss << '\n' << " Infinite Element Mapping=";
2028  for (auto vg : make_range(this->n_variable_groups()))
2029  oss << "\""
2030  << Utility::enum_to_string<InfMapType>(this->get_dof_map().variable_group(vg).type().inf_map)
2031  << "\" ";
2032 #endif
2033 
2034  oss << '\n';
2035 
2036  oss << " Approximation Orders=";
2037  for (auto vg : make_range(this->n_variable_groups()))
2038  {
2039 #ifndef LIBMESH_ENABLE_INFINITE_ELEMENTS
2040  oss << "\""
2041  << Utility::enum_to_string<Order>(this->get_dof_map().variable_group(vg).type().order)
2042  << "\" ";
2043 #else
2044  oss << "\""
2045  << Utility::enum_to_string<Order>(this->get_dof_map().variable_group(vg).type().order)
2046  << "\", \""
2047  << Utility::enum_to_string<Order>(this->get_dof_map().variable_group(vg).type().radial_order)
2048  << "\" ";
2049 #endif
2050  }
2051 
2052  oss << '\n';
2053 
2054  oss << " n_dofs()=" << this->n_dofs() << '\n';
2055  dof_id_type local_dofs = this->n_local_dofs();
2056  oss << " n_local_dofs()=" << local_dofs << '\n';
2057  this->comm().max(local_dofs);
2058  oss << " max(n_local_dofs())=" << local_dofs << '\n';
2059 #ifdef LIBMESH_ENABLE_CONSTRAINTS
2060  oss << " n_constrained_dofs()=" << this->n_constrained_dofs() << '\n';
2061  oss << " n_local_constrained_dofs()=" << this->n_local_constrained_dofs() << '\n';
2062  dof_id_type local_unconstrained_dofs = this->n_local_dofs() - this->n_local_constrained_dofs();
2063  this->comm().max(local_unconstrained_dofs);
2064  oss << " max(local unconstrained dofs)=" << local_unconstrained_dofs << '\n';
2065 #endif
2066 
2067  oss << " " << "n_vectors()=" << this->n_vectors() << '\n';
2068  oss << " " << "n_matrices()=" << this->n_matrices() << '\n';
2069  // oss << " " << "n_additional_matrices()=" << this->n_additional_matrices() << '\n';
2070 
2071  oss << this->get_dof_map().get_info();
2072 
2073  return oss.str();
2074 }
FEFamily family
The type of finite element.
Definition: fe_type.h:207
OrderWrapper radial_order
The approximation order in radial direction of the infinite element.
Definition: fe_type.h:240
unsigned int n_variable_groups() const
Definition: system.h:2357
const Parallel::Communicator & comm() const
OrderWrapper order
The approximation order of the element.
Definition: fe_type.h:201
dof_id_type n_local_dofs() const
Definition: system.C:150
std::string get_info() const
Gets summary info about the sparsity bandwidth and constraints.
Definition: dof_map.C:2922
dof_id_type n_dofs() const
Definition: system.C:113
unsigned int number() const
Definition: system.h:2269
unsigned int n_vectors() const
Definition: system.h:2477
const VariableGroup & variable_group(const unsigned int c) const
Definition: dof_map.h:2104
InfMapType inf_map
The coordinate mapping type of the infinite element.
Definition: fe_type.h:261
unsigned int n_matrices() const
Definition: system.h:2594
FEFamily radial_family
The type of approximation in radial direction.
Definition: fe_type.h:253
virtual std::string system_type() const
Definition: system.h:505
void max(const T &r, T &o, Request &req) const
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
dof_id_type n_local_constrained_dofs() const
Definition: system.C:135
const std::string & name() const
Definition: system.h:2261
const DofMap & get_dof_map() const
Definition: system.h:2293
const VariableGroup & variable_group(unsigned int vg) const
Return a constant reference to VariableGroup vg.
Definition: system.h:2387
dof_id_type n_constrained_dofs() const
Definition: system.C:120
uint8_t dof_id_type
Definition: id_types.h:67
const FEType & type() const
Definition: variable.h:140

◆ get_linear_solve_parameters()

std::pair< unsigned int, Real > libMesh::DifferentiableSystem::get_linear_solve_parameters ( ) const
overridevirtualinherited
Returns
An integer corresponding to the upper iteration count limit and a Real corresponding to the convergence tolerance to be used in linear adjoint and/or sensitivity solves

Reimplemented from libMesh::ImplicitSystem.

Definition at line 172 of file diff_system.C.

References libMesh::libmesh_assert(), and libMesh::DifferentiableSystem::time_solver.

173 {
175  libmesh_assert_equal_to (&(time_solver->system()), this);
176  return std::make_pair(this->time_solver->diff_solver()->max_linear_iterations,
177  this->time_solver->diff_solver()->relative_residual_tolerance);
178 }
std::unique_ptr< TimeSolver > time_solver
A pointer to the solver object we&#39;re going to use.
Definition: diff_system.h:251
libmesh_assert(ctx)

◆ get_linear_solver()

LinearSolver< Number > * libMesh::DifferentiableSystem::get_linear_solver ( ) const
overridevirtualinherited
Returns
A pointer to a linear solver appropriate for use in adjoint and/or sensitivity solves

Reimplemented from libMesh::ImplicitSystem.

Definition at line 163 of file diff_system.C.

References libMesh::libmesh_assert(), and libMesh::DifferentiableSystem::time_solver.

Referenced by adjust_linear_solvers(), and main().

164 {
166  libmesh_assert_equal_to (&(time_solver->system()), this);
167  return this->time_solver->linear_solver().get();
168 }
std::unique_ptr< TimeSolver > time_solver
A pointer to the solver object we&#39;re going to use.
Definition: diff_system.h:251
libmesh_assert(ctx)

◆ get_matrix() [1/2]

const SparseMatrix< Number > & libMesh::System::get_matrix ( std::string_view  mat_name) const
inherited
Returns
A const reference to this system's matrix named mat_name.

Definition at line 1073 of file system.C.

References libMesh::System::_matrices.

Referenced by add_M_C_K_helmholtz(), assemble(), assemble_helmholtz(), libMesh::NewmarkSystem::compute_matrix(), libMesh::CondensedEigenSystem::get_condensed_matrix_A(), libMesh::CondensedEigenSystem::get_condensed_matrix_B(), libMesh::ImplicitSystem::get_system_matrix(), main(), libMesh::EigenTimeSolver::solve(), and libMesh::NewmarkSystem::update_rhs().

1074 {
1075  return *libmesh_map_find(_matrices, mat_name);
1076 }
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2181

◆ get_matrix() [2/2]

SparseMatrix< Number > & libMesh::System::get_matrix ( std::string_view  mat_name)
inherited
Returns
A writable reference to this system's matrix named mat_name.

Definition at line 1080 of file system.C.

References libMesh::System::_matrices.

1081 {
1082  return *libmesh_map_find(_matrices, mat_name);
1083 }
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2181

◆ get_mesh() [1/2]

const MeshBase & libMesh::System::get_mesh ( ) const
inlineinherited
Returns
A constant reference to this systems's _mesh.

Definition at line 2277 of file system.h.

References libMesh::System::_mesh.

Referenced by libMesh::ExactSolution::_compute_error(), LinearElasticityWithContact::add_contact_edge_elements(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::HPCoarsenTest::add_projection(), libMesh::RBConstruction::add_scaled_matrix_and_vector(), AssembleOptimization::assemble_A_and_F(), libMesh::FEMSystem::assemble_qoi(), libMesh::FEMSystem::assemble_qoi_derivative(), libMesh::FEMSystem::assembly(), AssemblyA0::boundary_assembly(), AssemblyA1::boundary_assembly(), AssemblyF0::boundary_assembly(), AssemblyF1::boundary_assembly(), AssemblyA2::boundary_assembly(), AssemblyF2::boundary_assembly(), libMesh::System::calculate_norm(), compute_jacobian(), compute_residual(), LinearElasticityWithContact::compute_stresses(), libMesh::RBEIMEvaluation::distribute_bfs(), DMCreateDomainDecomposition_libMesh(), DMCreateFieldDecomposition_libMesh(), DMlibMeshSetSystem_libMesh(), SolidSystem::element_time_derivative(), element_time_derivative(), libMesh::RBConstruction::enrich_basis_from_rhs_terms(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_interiors(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_sides(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::AdjointResidualErrorEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::GenericProjector(), LinearElasticityWithContact::get_least_and_max_gap_function(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::RBEIMConstruction::init_context(), SolidSystem::init_data(), libMesh::System::init_data(), libMesh::System::init_matrices(), LinearElasticityWithContact::initialize_contact_load_paths(), libMesh::RBEIMConstruction::initialize_qp_data(), libMesh::System::local_dof_indices(), libMesh::DofMap::max_constraint_error(), libMesh::FEMSystem::mesh_position_get(), libMesh::FEMSystem::mesh_position_set(), LinearElasticityWithContact::move_mesh(), libMesh::RBEIMEvaluation::node_distribute_bfs(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::PatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::petsc_auto_fieldsplit(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::FEMSystem::postprocess(), libMesh::RBParametrizedFunction::preevaluate_parametrized_function_on_mesh(), libMesh::RBParametrizedFunction::preevaluate_parametrized_function_on_mesh_sides(), libMesh::RBEIMEvaluation::project_qp_data_map_onto_system(), libMesh::System::read_header(), libMesh::RBEvaluation::read_in_vectors_from_multiple_files(), libMesh::System::read_legacy_data(), libMesh::System::read_parallel_data(), libMesh::System::read_serialized_vector(), libMesh::System::read_serialized_vectors(), libMesh::System::reinit(), LinearElasticityWithContact::residual_and_jacobian(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), SolidSystem::save_initial_mesh(), libMesh::HPSingularity::select_refinement(), libMesh::HPCoarsenTest::select_refinement(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::RBEIMEvaluation::side_distribute_bfs(), SolidSystem::side_time_derivative(), libMesh::PetscDiffSolver::solve(), MeshAssignTest::testMeshMoveAssign(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::BoundaryVolumeSolutionTransfer::transfer(), libMesh::BoundaryVolumeSolutionTransfer::transfer_boundary_volume(), libMesh::BoundaryVolumeSolutionTransfer::transfer_volume_boundary(), libMesh::TransientRBConstruction::truth_solve(), libMesh::RBConstruction::truth_solve(), libMesh::System::write_header(), libMesh::RBEvaluation::write_out_vectors(), libMesh::System::write_parallel_data(), libMesh::System::write_serialized_vector(), libMesh::System::write_serialized_vectors(), and libMesh::System::zero_variable().

2278 {
2279  return _mesh;
2280 }
MeshBase & _mesh
Constant reference to the mesh data structure used for the simulation.
Definition: system.h:2125

◆ get_mesh() [2/2]

MeshBase & libMesh::System::get_mesh ( )
inlineinherited
Returns
A reference to this systems's _mesh.

Definition at line 2285 of file system.h.

References libMesh::System::_mesh.

2286 {
2287  return _mesh;
2288 }
MeshBase & _mesh
Constant reference to the mesh data structure used for the simulation.
Definition: system.h:2125

◆ get_mesh_system() [1/2]

const System * libMesh::DifferentiablePhysics::get_mesh_system ( ) const
inlineinherited
Returns
A const reference to the system with variables corresponding to mesh nodal coordinates, or nullptr if the mesh is fixed. Useful for ALE calculations.

Definition at line 613 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_mesh_sys.

Referenced by libMesh::FEMSystem::build_context().

614 {
615  return _mesh_sys;
616 }
System * _mesh_sys
System from which to acquire moving mesh information.
Definition: diff_physics.h:531

◆ get_mesh_system() [2/2]

System * libMesh::DifferentiablePhysics::get_mesh_system ( )
inlineinherited
Returns
A reference to the system with variables corresponding to mesh nodal coordinates, or nullptr if the mesh is fixed.

Definition at line 619 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_mesh_sys.

620 {
621  return _mesh_sys;
622 }
System * _mesh_sys
System from which to acquire moving mesh information.
Definition: diff_physics.h:531

◆ get_mesh_x_var()

unsigned int libMesh::DifferentiablePhysics::get_mesh_x_var ( ) const
inlineinherited
Returns
The variable number corresponding to the mesh x coordinate. Useful for ALE calculations.

Definition at line 625 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_mesh_x_var.

Referenced by libMesh::FEMSystem::build_context().

626 {
627  return _mesh_x_var;
628 }
unsigned int _mesh_x_var
Variables from which to acquire moving mesh information.
Definition: diff_physics.h:536

◆ get_mesh_y_var()

unsigned int libMesh::DifferentiablePhysics::get_mesh_y_var ( ) const
inlineinherited
Returns
The variable number corresponding to the mesh y coordinate. Useful for ALE calculations.

Definition at line 631 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_mesh_y_var.

Referenced by libMesh::FEMSystem::build_context().

632 {
633  return _mesh_y_var;
634 }

◆ get_mesh_z_var()

unsigned int libMesh::DifferentiablePhysics::get_mesh_z_var ( ) const
inlineinherited
Returns
The variable number corresponding to the mesh z coordinate. Useful for ALE calculations.

Definition at line 637 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_mesh_z_var.

Referenced by libMesh::FEMSystem::build_context().

638 {
639  return _mesh_z_var;
640 }

◆ get_parameter_vector()

ParameterVector& HeatSystem::get_parameter_vector ( )
inline

Definition at line 76 of file heatsystem.h.

References libMesh::ParameterVector::push_back().

Referenced by main().

77  {
78  if (!parameter_vector.size())
79  for (std::size_t i = 0; i != parameters.size(); ++i)
81 
82  return parameter_vector;
83  }
std::size_t size() const
Accessor object allowing reading and modification of the independent variables in a parameter sensiti...
std::vector< Number > parameters
Definition: heatsystem.h:113
void push_back(std::unique_ptr< ParameterAccessor< Number >> new_accessor)
Adds an additional parameter accessor to the end of the vector.
ParameterVector parameter_vector
Definition: heatsystem.h:117

◆ get_physics() [1/2]

const DifferentiablePhysics* libMesh::DifferentiableSystem::get_physics ( ) const
inlineinherited
Returns
A const reference to a DifferentiablePhysics object.
Note
If no external Physics objects have been attached, the default is this.

Definition at line 181 of file diff_system.h.

References libMesh::DifferentiableSystem::_diff_physics.

Referenced by libMesh::EulerSolver::_general_residual(), libMesh::Euler2Solver::_general_residual(), libMesh::SteadySolver::_general_residual(), libMesh::NewmarkSolver::_general_residual(), libMesh::FEMSystem::build_context(), libMesh::EulerSolver::element_residual(), libMesh::Euler2Solver::element_residual(), libMesh::EigenTimeSolver::element_residual(), libMesh::FEMSystem::init_context(), libMesh::EigenTimeSolver::nonlocal_residual(), and libMesh::EigenTimeSolver::side_residual().

182  { if (this->_diff_physics.empty())
183  return this;
184  return this->_diff_physics.top().get(); }
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.
Definition: diff_system.h:440

◆ get_physics() [2/2]

DifferentiablePhysics* libMesh::DifferentiableSystem::get_physics ( )
inlineinherited
Returns
A reference to a DifferentiablePhysics object.
Note
If no external Physics object is attached, the default is this.

Definition at line 192 of file diff_system.h.

References libMesh::DifferentiableSystem::_diff_physics.

193  { if (this->_diff_physics.empty())
194  return this;
195  return this->_diff_physics.top().get(); }
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.
Definition: diff_system.h:440

◆ get_project_with_constraints()

bool libMesh::System::get_project_with_constraints ( )
inlineinherited

Setter and getter functions for project_with_constraints boolean.

Definition at line 1775 of file system.h.

References libMesh::System::project_with_constraints.

Referenced by libMesh::AdjointRefinementEstimator::estimate_error().

1776  {
1777  return project_with_constraints;
1778  }
bool project_with_constraints
Do we want to apply constraints while projecting vectors ?
Definition: system.h:2253

◆ get_qoi() [1/2]

const DifferentiableQoI* libMesh::DifferentiableSystem::get_qoi ( ) const
inlineinherited
Returns
A const reference to a DifferentiableQoI object.
Note
If no external QoI object is attached, the default is this.

Definition at line 227 of file diff_system.h.

References libMesh::DifferentiableSystem::_diff_qoi.

Referenced by libMesh::FEMSystem::assemble_qoi(), and libMesh::FEMSystem::assemble_qoi_derivative().

228  { if (this->_diff_qoi.empty())
229  return this;
230  return this->_diff_qoi.top().get(); }
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.
Definition: diff_system.h:448

◆ get_qoi() [2/2]

DifferentiableQoI* libMesh::DifferentiableSystem::get_qoi ( )
inlineinherited
Returns
A reference to a DifferentiableQoI object.
Note
If no external QoI object is attached, the default is this.

Definition at line 237 of file diff_system.h.

References libMesh::DifferentiableSystem::_diff_qoi.

238  { if (this->_diff_qoi.empty())
239  return this;
240  return this->_diff_qoi.top().get(); }
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.
Definition: diff_system.h:448

◆ get_qoi_error_estimate_value()

Number libMesh::System::get_qoi_error_estimate_value ( unsigned int  qoi_index) const
inherited

Definition at line 2361 of file system.C.

References libMesh::libmesh_assert(), and libMesh::System::qoi_error_estimates.

Referenced by libMesh::TwostepTimeSolver::integrate_adjoint_refinement_error_estimate(), and main().

2362 {
2363  libmesh_assert(qoi_index < qoi_error_estimates.size());
2364  return qoi_error_estimates[qoi_index];
2365 }
libmesh_assert(ctx)
std::vector< Number > qoi_error_estimates
Vector to hold error estimates for qois, either from a steady state calculation, or from a single uns...
Definition: system.h:1619

◆ get_QoI_value()

Number& HeatSystem::get_QoI_value ( unsigned int  QoI_index)
inline

Definition at line 85 of file heatsystem.h.

86  {
87  return computed_QoI[QoI_index];
88  }
Number computed_QoI[1]
Definition: heatsystem.h:126

◆ get_qoi_value()

Number libMesh::System::get_qoi_value ( unsigned int  qoi_index) const
inherited

◆ get_qoi_values()

std::vector< Number > libMesh::System::get_qoi_values ( ) const
inherited

Returns a copy of qoi, not a reference.

Definition at line 2341 of file system.C.

References libMesh::System::qoi.

Referenced by libMesh::ImplicitSystem::adjoint_qoi_parameter_sensitivity(), libMesh::FEMSystem::assemble_qoi(), libMesh::ImplicitSystem::forward_qoi_parameter_sensitivity(), libMesh::ImplicitSystem::qoi_parameter_hessian(), and libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product().

2342 {
2343  return this->qoi;
2344 }
std::vector< Number > qoi
Values of the quantities of interest.
Definition: system.h:1611

◆ get_second_order_dot_var()

unsigned int libMesh::DifferentiableSystem::get_second_order_dot_var ( unsigned int  var) const
inherited

For a given second order (in time) variable var, this method will return the index to the corresponding "dot" variable.

For FirstOrderUnsteadySolver classes, the "dot" variable would automatically be added and the returned index will correspond to that variable. For SecondOrderUnsteadySolver classes, this method will return var as there this is no "dot" variable per se, but having this function allows one to use the interface to treat both FirstOrderUnsteadySolver and SecondOrderUnsteadySolver simultaneously.

Definition at line 306 of file diff_system.C.

References libMesh::DifferentiablePhysics::_second_order_dot_vars, libMesh::UnsteadySolver::time_order(), and libMesh::DifferentiableSystem::time_solver.

Referenced by libMesh::FirstOrderUnsteadySolver::compute_second_order_eqns().

307 {
308  // For SteadySolver or SecondOrderUnsteadySolvers, we just give back var
309  unsigned int dot_var = var;
310 
311  if (!time_solver->is_steady())
312  {
313  const UnsteadySolver & unsteady_solver =
314  cast_ref<const UnsteadySolver &>(*(time_solver.get()));
315 
316  if (unsteady_solver.time_order() == 1)
317  dot_var = this->_second_order_dot_vars.find(var)->second;
318  }
319 
320  return dot_var;
321 }
std::unique_ptr< TimeSolver > time_solver
A pointer to the solver object we&#39;re going to use.
Definition: diff_system.h:251
std::map< unsigned int, unsigned int > _second_order_dot_vars
If the user adds any second order variables, then we need to also cache the map to their correspondin...
Definition: diff_physics.h:560

◆ get_second_order_vars()

const std::set<unsigned int>& libMesh::DifferentiablePhysics::get_second_order_vars ( ) const
inlineinherited
Returns
The set of second order in time variable indices. May be empty.

Definition at line 519 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_second_order_vars.

Referenced by libMesh::DifferentiableSystem::add_second_order_dot_vars(), libMesh::DiffContext::DiffContext(), libMesh::Euler2Solver::element_residual(), libMesh::DifferentiableSystem::have_second_order_scalar_vars(), and libMesh::FEMContext::pre_fe_reinit().

520  { return _second_order_vars; }
std::set< unsigned int > _second_order_vars
Variable indices for those variables that are second order in time.
Definition: diff_physics.h:553

◆ get_sensitivity_rhs() [1/2]

NumericVector< Number > & libMesh::System::get_sensitivity_rhs ( unsigned int  i = 0)
inherited
Returns
A reference to one of the system's sensitivity rhs vectors, by default the one corresponding to the first parameter. By default these vectors are built by the library, using finite differences, when assemble_residual_derivatives() is called.

When assembled, this vector should hold -(partial R / partial p_i)

Definition at line 1285 of file system.C.

References libMesh::System::get_vector().

Referenced by libMesh::ImplicitSystem::adjoint_qoi_parameter_sensitivity(), and libMesh::ImplicitSystem::sensitivity_solve().

1286 {
1287  std::ostringstream sensitivity_rhs_name;
1288  sensitivity_rhs_name << "sensitivity_rhs" << i;
1289 
1290  return this->get_vector(sensitivity_rhs_name.str());
1291 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:918

◆ get_sensitivity_rhs() [2/2]

const NumericVector< Number > & libMesh::System::get_sensitivity_rhs ( unsigned int  i = 0) const
inherited
Returns
A reference to one of the system's sensitivity rhs vectors, by default the one corresponding to the first parameter.

Definition at line 1295 of file system.C.

References libMesh::System::get_vector().

1296 {
1297  std::ostringstream sensitivity_rhs_name;
1298  sensitivity_rhs_name << "sensitivity_rhs" << i;
1299 
1300  return this->get_vector(sensitivity_rhs_name.str());
1301 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:918

◆ get_sensitivity_solution() [1/2]

NumericVector< Number > & libMesh::System::get_sensitivity_solution ( unsigned int  i = 0)
inherited
Returns
A reference to one of the system's solution sensitivity vectors, by default the one corresponding to the first parameter.

Definition at line 1140 of file system.C.

References libMesh::System::get_vector().

Referenced by libMesh::ImplicitSystem::forward_qoi_parameter_sensitivity(), libMesh::ImplicitSystem::qoi_parameter_hessian(), and libMesh::ImplicitSystem::sensitivity_solve().

1141 {
1142  std::ostringstream sensitivity_name;
1143  sensitivity_name << "sensitivity_solution" << i;
1144 
1145  return this->get_vector(sensitivity_name.str());
1146 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:918

◆ get_sensitivity_solution() [2/2]

const NumericVector< Number > & libMesh::System::get_sensitivity_solution ( unsigned int  i = 0) const
inherited
Returns
A reference to one of the system's solution sensitivity vectors, by default the one corresponding to the first parameter.

Definition at line 1150 of file system.C.

References libMesh::System::get_vector().

1151 {
1152  std::ostringstream sensitivity_name;
1153  sensitivity_name << "sensitivity_solution" << i;
1154 
1155  return this->get_vector(sensitivity_name.str());
1156 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:918

◆ get_system_matrix() [1/2]

const SparseMatrix< Number > & libMesh::ImplicitSystem::get_system_matrix ( ) const
inherited

◆ get_system_matrix() [2/2]

SparseMatrix< Number > & libMesh::ImplicitSystem::get_system_matrix ( )
inherited
Returns
A reference to the system's primary matrix.

Definition at line 1239 of file implicit_system.C.

References libMesh::System::get_matrix(), libMesh::libmesh_assert(), and libMesh::ImplicitSystem::matrix.

1240 {
1242  libmesh_assert_equal_to(&get_matrix("System Matrix"), matrix);
1243  return *matrix;
1244 }
libmesh_assert(ctx)
SparseMatrix< Number > * matrix
The system matrix.
const SparseMatrix< Number > & get_matrix(std::string_view mat_name) const
Definition: system.C:1073

◆ get_time_solver() [1/2]

TimeSolver & libMesh::DifferentiableSystem::get_time_solver ( )
inlineinherited
Returns
A pointer to the time solver attached to the calling system

Definition at line 454 of file diff_system.h.

References libMesh::libmesh_assert(), and libMesh::DifferentiableSystem::time_solver.

Referenced by libMesh::DifferentiableSystem::adjoint_solve(), adjust_linear_solvers(), libMesh::FEMSystem::build_context(), libMesh::DiffContext::DiffContext(), libMesh::FEMSystem::postprocess(), libMesh::FEMContext::pre_fe_reinit(), and libMesh::DifferentiableSystem::solve().

455 {
457  libmesh_assert_equal_to (&(time_solver->system()), this);
458  return *time_solver;
459 }
std::unique_ptr< TimeSolver > time_solver
A pointer to the solver object we&#39;re going to use.
Definition: diff_system.h:251
libmesh_assert(ctx)

◆ get_time_solver() [2/2]

const TimeSolver & libMesh::DifferentiableSystem::get_time_solver ( ) const
inlineinherited

Non-const version of the above.

Definition at line 462 of file diff_system.h.

References libMesh::libmesh_assert(), and libMesh::DifferentiableSystem::time_solver.

463 {
465  libmesh_assert_equal_to (&(time_solver->system()), this);
466  return *time_solver;
467 }
std::unique_ptr< TimeSolver > time_solver
A pointer to the solver object we&#39;re going to use.
Definition: diff_system.h:251
libmesh_assert(ctx)

◆ get_vector() [1/4]

const NumericVector< Number > & libMesh::System::get_vector ( std::string_view  vec_name) const
inherited
Returns
A const reference to this system's additional vector named vec_name. Access is only granted when the vector is already properly initialized.

Definition at line 918 of file system.C.

References libMesh::System::_vectors.

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), add_M_C_K_helmholtz(), libMesh::AdaptiveTimeSolver::adjoint_advance_timestep(), libMesh::UnsteadySolver::adjoint_advance_timestep(), libMesh::NewmarkSolver::advance_timestep(), libMesh::AdaptiveTimeSolver::advance_timestep(), libMesh::UnsteadySolver::advance_timestep(), apply_initial(), assemble(), libMesh::System::compare(), libMesh::NewmarkSolver::compute_initial_accel(), libMesh::UnsteadySolver::du(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::System::get_adjoint_rhs(), libMesh::System::get_adjoint_solution(), libMesh::System::get_sensitivity_rhs(), libMesh::System::get_sensitivity_solution(), libMesh::System::get_weighted_sensitivity_adjoint_solution(), libMesh::System::get_weighted_sensitivity_solution(), libMesh::NewmarkSystem::initial_conditions(), AssembleOptimization::lower_and_upper_bounds(), main(), libMesh::NewmarkSolver::project_initial_accel(), libMesh::SecondOrderUnsteadySolver::project_initial_rate(), libMesh::InterMeshProjection::project_system_vectors(), libMesh::SecondOrderUnsteadySolver::reinit(), libMesh::UnsteadySolver::reinit(), libMesh::FileSolutionHistory::retrieve(), libMesh::UnsteadySolver::retrieve_timestep(), libMesh::MemoryHistoryData::retrieve_vectors(), libMesh::TwostepTimeSolver::solve(), libMesh::FrequencySystem::solve(), libMesh::UnsteadySolver::update(), libMesh::NewmarkSystem::update_rhs(), and libMesh::NewmarkSystem::update_u_v_a().

919 {
920  return *(libmesh_map_find(_vectors, vec_name));
921 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164

◆ get_vector() [2/4]

NumericVector< Number > & libMesh::System::get_vector ( std::string_view  vec_name)
inherited
Returns
A writable reference to this system's additional vector named vec_name. Access is only granted when the vector is already properly initialized.

Definition at line 925 of file system.C.

References libMesh::System::_vectors.

926 {
927  return *(libmesh_map_find(_vectors, vec_name));
928 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164

◆ get_vector() [3/4]

const NumericVector< Number > & libMesh::System::get_vector ( const unsigned int  vec_num) const
inherited
Returns
A const reference to this system's additional vector number vec_num (where the vectors are counted starting with 0).

Definition at line 932 of file system.C.

References libMesh::System::_vectors, and libMesh::System::vectors_begin().

933 {
934  // If we don't have that many vectors, throw an error
935  libmesh_assert_less(vec_num, _vectors.size());
936 
937  // Otherwise return a reference to the vec_num'th vector
938  auto it = vectors_begin();
939  std::advance(it, vec_num);
940  return *(it->second);
941 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
vectors_iterator vectors_begin()
Beginning of vectors container.
Definition: system.h:2483

◆ get_vector() [4/4]

NumericVector< Number > & libMesh::System::get_vector ( const unsigned int  vec_num)
inherited
Returns
A writable reference to this system's additional vector number vec_num (where the vectors are counted starting with 0).

Definition at line 945 of file system.C.

References libMesh::System::_vectors, and libMesh::System::vectors_begin().

946 {
947  // If we don't have that many vectors, throw an error
948  libmesh_assert_less(vec_num, _vectors.size());
949 
950  // Otherwise return a reference to the vec_num'th vector
951  auto it = vectors_begin();
952  std::advance(it, vec_num);
953  return *(it->second);
954 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
vectors_iterator vectors_begin()
Beginning of vectors container.
Definition: system.h:2483

◆ get_weighted_sensitivity_adjoint_solution() [1/2]

NumericVector< Number > & libMesh::System::get_weighted_sensitivity_adjoint_solution ( unsigned int  i = 0)
inherited
Returns
A reference to one of the system's weighted sensitivity adjoint solution vectors, by default the one corresponding to the first qoi.

Definition at line 1225 of file system.C.

References libMesh::System::get_vector().

Referenced by libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product(), and libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve().

1226 {
1227  std::ostringstream adjoint_name;
1228  adjoint_name << "weighted_sensitivity_adjoint_solution" << i;
1229 
1230  return this->get_vector(adjoint_name.str());
1231 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:918

◆ get_weighted_sensitivity_adjoint_solution() [2/2]

const NumericVector< Number > & libMesh::System::get_weighted_sensitivity_adjoint_solution ( unsigned int  i = 0) const
inherited
Returns
A reference to one of the system's weighted sensitivity adjoint solution vectors, by default the one corresponding to the first qoi.

Definition at line 1235 of file system.C.

References libMesh::System::get_vector().

1236 {
1237  std::ostringstream adjoint_name;
1238  adjoint_name << "weighted_sensitivity_adjoint_solution" << i;
1239 
1240  return this->get_vector(adjoint_name.str());
1241 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:918

◆ get_weighted_sensitivity_solution() [1/2]

NumericVector< Number > & libMesh::System::get_weighted_sensitivity_solution ( )
inherited
Returns
A reference to the solution of the last weighted sensitivity solve

Definition at line 1167 of file system.C.

References libMesh::System::get_vector().

Referenced by libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product(), and libMesh::ImplicitSystem::weighted_sensitivity_solve().

1168 {
1169  return this->get_vector("weighted_sensitivity_solution");
1170 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:918

◆ get_weighted_sensitivity_solution() [2/2]

const NumericVector< Number > & libMesh::System::get_weighted_sensitivity_solution ( ) const
inherited
Returns
A reference to the solution of the last weighted sensitivity solve

Definition at line 1174 of file system.C.

References libMesh::System::get_vector().

1175 {
1176  return this->get_vector("weighted_sensitivity_solution");
1177 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:918

◆ has_constraint_object()

bool libMesh::System::has_constraint_object ( ) const
inherited
Returns
true if there is a user-defined constraint object attached to this object, false otherwise. Calling System:: get_constraint_object() when there is no user-defined constraint object attached leads to either undefined behavior (dereferencing a nullptr) or an assert (in dbg mode) so you should call this function first unless you are sure there is a user-defined constraint object attached.

Definition at line 2169 of file system.C.

References libMesh::System::_constrain_system_object.

2170 {
2171  return _constrain_system_object != nullptr;
2172 }
Constraint * _constrain_system_object
Object that constrains the system.
Definition: system.h:2081

◆ has_variable()

bool libMesh::System::has_variable ( std::string_view  var) const
inherited
Returns
true if a variable named var exists in this System

Definition at line 1550 of file system.C.

References libMesh::System::_variable_numbers.

Referenced by libMesh::GMVIO::copy_nodal_solution(), and main().

1551 {
1552  return _variable_numbers.count(var);
1553 }
std::map< std::string, unsigned int, std::less<> > _variable_numbers
The variable numbers corresponding to user-specified names, useful for name-based lookups...
Definition: system.h:2151

◆ have_first_order_scalar_vars()

bool libMesh::DifferentiableSystem::have_first_order_scalar_vars ( ) const
inherited

Check for any first order vars that are also belong to FEFamily::SCALAR.

Definition at line 323 of file diff_system.C.

References libMesh::DifferentiablePhysics::get_first_order_vars(), libMesh::DifferentiablePhysics::have_first_order_vars(), libMesh::SCALAR, and libMesh::System::variable().

324 {
325  bool have_first_order_scalar_vars = false;
326 
327  if (this->have_first_order_vars())
328  for (const auto & var : this->get_first_order_vars())
329  if (this->variable(var).type().family == SCALAR)
331 
333 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.h:2377
const std::set< unsigned int > & get_first_order_vars() const
Definition: diff_physics.h:506
bool have_first_order_scalar_vars() const
Check for any first order vars that are also belong to FEFamily::SCALAR.
Definition: diff_system.C:323

◆ have_first_order_vars()

bool libMesh::DifferentiablePhysics::have_first_order_vars ( ) const
inlineinherited

Definition at line 500 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_first_order_vars.

Referenced by libMesh::DifferentiableSystem::have_first_order_scalar_vars().

501  { return !_first_order_vars.empty(); }
std::set< unsigned int > _first_order_vars
Variable indices for those variables that are first order in time.
Definition: diff_physics.h:548

◆ have_matrix()

bool libMesh::System::have_matrix ( std::string_view  mat_name) const
inlineinherited
Returns
true if this System has a matrix associated with the given name, false otherwise.

Definition at line 1860 of file system.h.

References libMesh::System::_matrices.

Referenced by libMesh::EigenTimeSolver::init().

1860 { return _matrices.count(mat_name); };
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2181

◆ have_second_order_scalar_vars()

bool libMesh::DifferentiableSystem::have_second_order_scalar_vars ( ) const
inherited

Check for any second order vars that are also belong to FEFamily::SCALAR.

Definition at line 335 of file diff_system.C.

References libMesh::DifferentiablePhysics::get_second_order_vars(), libMesh::DifferentiablePhysics::have_second_order_vars(), libMesh::SCALAR, and libMesh::System::variable().

Referenced by libMesh::EulerSolver::nonlocal_residual(), and libMesh::Euler2Solver::nonlocal_residual().

336 {
337  bool have_second_order_scalar_vars = false;
338 
339  if (this->have_second_order_vars())
340  for (const auto & var : this->get_second_order_vars())
341  if (this->variable(var).type().family == SCALAR)
343 
345 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.h:2377
const std::set< unsigned int > & get_second_order_vars() const
Definition: diff_physics.h:519
bool have_second_order_scalar_vars() const
Check for any second order vars that are also belong to FEFamily::SCALAR.
Definition: diff_system.C:335

◆ have_second_order_vars()

bool libMesh::DifferentiablePhysics::have_second_order_vars ( ) const
inlineinherited

Definition at line 513 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_second_order_vars.

Referenced by libMesh::EulerSolver::element_residual(), and libMesh::DifferentiableSystem::have_second_order_scalar_vars().

514  { return !_second_order_vars.empty(); }
std::set< unsigned int > _second_order_vars
Variable indices for those variables that are second order in time.
Definition: diff_physics.h:553

◆ have_vector()

bool libMesh::System::have_vector ( std::string_view  vec_name) const
inlineinherited
Returns
true if this System has a vector associated with the given name, false otherwise.

Definition at line 2469 of file system.h.

References libMesh::System::_vectors.

2470 {
2471  return (_vectors.count(vec_name));
2472 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164

◆ hide_output()

bool& libMesh::System::hide_output ( )
inlineinherited
Returns
A writable reference to a boolean that determines if this system can be written to file or not. If set to true, then EquationSystems::write will ignore this system.

Definition at line 1790 of file system.h.

References libMesh::System::_hide_output.

1790 { return _hide_output; }
bool _hide_output
Are we allowed to write this system to file? If _hide_output is true, then EquationSystems::write wil...
Definition: system.h:2248

◆ identify_variable_groups() [1/2]

bool libMesh::System::identify_variable_groups ( ) const
inlineinherited
Returns
true when VariableGroup structures should be automatically identified, false otherwise.

Definition at line 2445 of file system.h.

References libMesh::System::_identify_variable_groups.

Referenced by libMesh::System::add_variable(), and libMesh::System::add_variables().

2446 {
2448 }
bool _identify_variable_groups
true when VariableGroup structures should be automatically identified, false otherwise.
Definition: system.h:2216

◆ identify_variable_groups() [2/2]

void libMesh::System::identify_variable_groups ( const bool  ivg)
inlineinherited

Toggle automatic VariableGroup identification.

Definition at line 2453 of file system.h.

References libMesh::System::_identify_variable_groups.

2454 {
2456 }
bool _identify_variable_groups
true when VariableGroup structures should be automatically identified, false otherwise.
Definition: system.h:2216

◆ increment_constructor_count()

void libMesh::ReferenceCounter::increment_constructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the construction counter.

Should be called in the constructor of any derived class that will be reference counted.

Definition at line 183 of file reference_counter.h.

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::ReferenceCountedObject().

184 {
185  libmesh_try
186  {
187  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
188  std::pair<unsigned int, unsigned int> & p = _counts[name];
189  p.first++;
190  }
191  libmesh_catch (...)
192  {
193  auto stream = libMesh::err.get();
194  stream->exceptions(stream->goodbit); // stream must not throw
195  libMesh::err << "Encountered unrecoverable error while calling "
196  << "ReferenceCounter::increment_constructor_count() "
197  << "for a(n) " << name << " object." << std::endl;
198  std::terminate();
199  }
200 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
OStreamProxy err
static Counts _counts
Actually holds the data.
streamT * get()
Rather than implement every ostream/ios/ios_base function, we&#39;ll be lazy and make esoteric uses go th...
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition: threads.C:30

◆ increment_destructor_count()

void libMesh::ReferenceCounter::increment_destructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the destruction counter.

Should be called in the destructor of any derived class that will be reference counted.

Definition at line 207 of file reference_counter.h.

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::~ReferenceCountedObject().

208 {
209  libmesh_try
210  {
211  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
212  std::pair<unsigned int, unsigned int> & p = _counts[name];
213  p.second++;
214  }
215  libmesh_catch (...)
216  {
217  auto stream = libMesh::err.get();
218  stream->exceptions(stream->goodbit); // stream must not throw
219  libMesh::err << "Encountered unrecoverable error while calling "
220  << "ReferenceCounter::increment_destructor_count() "
221  << "for a(n) " << name << " object." << std::endl;
222  std::terminate();
223  }
224 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
OStreamProxy err
static Counts _counts
Actually holds the data.
streamT * get()
Rather than implement every ostream/ios/ios_base function, we&#39;ll be lazy and make esoteric uses go th...
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition: threads.C:30

◆ init()

void libMesh::System::init ( )
inherited

Initializes degrees of freedom on the current mesh.

Sets the

Definition at line 189 of file system.C.

References libMesh::System::_basic_system_only, libMesh::System::init_data(), libMesh::System::is_initialized(), libMesh::libmesh_assert(), libMesh::System::n_vars(), and libMesh::System::user_initialization().

190 {
191  parallel_object_only();
192 
193  // Calling init() twice on the same system currently works evil
194  // magic, whether done directly or via EquationSystems::read()
195  libmesh_assert(!this->is_initialized());
196 
197  // First initialize any required data:
198  // either only the basic System data
199  if (_basic_system_only)
201  // or all the derived class' data too
202  else
203  this->init_data();
204 
205  // If no variables have been added to this system
206  // don't do anything
207  if (!this->n_vars())
208  return;
209 
210  // Then call the user-provided initialization function
211  this->user_initialization();
212 }
bool _basic_system_only
Holds true if the components of more advanced system types (e.g.
Definition: system.h:2204
virtual void init_data()
Initializes the data for the system.
Definition: system.C:216
virtual void user_initialization()
Calls user&#39;s attached initialization function, or is overridden by the user in derived classes...
Definition: system.C:2245
bool is_initialized()
Definition: system.h:2333
libmesh_assert(ctx)
unsigned int n_vars() const
Definition: system.h:2349

◆ init_context() [1/3]

virtual void HeatSystem::init_context ( libMesh::DiffContext context)
protectedvirtual

Reimplemented from libMesh::FEMSystem.

◆ init_context() [2/3]

void HeatSystem::init_context ( DiffContext &  context)
protectedvirtual

Reimplemented from libMesh::FEMSystem.

Definition at line 74 of file heatsystem.C.

References libMesh::System::get_adjoint_solution(), libMesh::NumericVector< Number >, and libMesh::System::System().

75 {
76  FEMContext & c = cast_ref<FEMContext &>(context);
77 
78  FEBase * elem_fe = nullptr;
79  c.get_element_fe(0, elem_fe);
80 
81  // Now make sure we have requested all the data
82  // we need to build the linear system.
83  elem_fe->get_JxW();
84  elem_fe->get_dphi();
85 
86  // Don't waste time on side computations for T
87  FEBase * side_fe = nullptr;
88  c.get_side_fe(0, side_fe);
89  side_fe->get_nothing();
90 
91  // We'll have a more automatic solution to preparing adjoint
92  // solutions for time integration, eventually...
93  if (c.is_adjoint())
94  {
95  // A reference to the system context is built with
96  const System & sys = c.get_system();
97 
98  // Get a pointer to the adjoint solution vector
99  NumericVector<Number> & adjoint_solution =
100  const_cast<System &>(sys).get_adjoint_solution(0);
101 
102  // Add this adjoint solution to the vectors that diff context should localize
103  c.add_localized_vector(adjoint_solution, sys);
104  }
105 
106  FEMSystem::init_context(context);
107 }
FEGenericBase< Real > FEBase
NumericVector< Number > & get_adjoint_solution(unsigned int i=0)
Definition: system.C:1193
System(EquationSystems &es, const std::string &name, const unsigned int number)
Constructor.
Definition: system.C:63
template class LIBMESH_EXPORT NumericVector< Number >

◆ init_context() [3/3]

void HeatSystem::init_context ( DiffContext context)
protectedvirtual

Reimplemented from libMesh::FEMSystem.

Definition at line 48 of file heatsystem.C.

References dim, libMesh::FEMContext::elem_dimensions(), libMesh::FEGenericBase< OutputType >::get_dphi(), libMesh::FEMContext::get_element_fe(), libMesh::FEAbstract::get_JxW(), libMesh::FEAbstract::get_nothing(), libMesh::FEGenericBase< OutputType >::get_phi(), libMesh::FEMContext::get_side_fe(), libMesh::FEAbstract::get_xyz(), and libMesh::FEMSystem::init_context().

49 {
50  FEMContext & c = cast_ref<FEMContext &>(context);
51 
52  const std::set<unsigned char> & elem_dims =
53  c.elem_dimensions();
54 
55  for (std::set<unsigned char>::const_iterator dim_it =
56  elem_dims.begin(); dim_it != elem_dims.end(); ++dim_it)
57  {
58  const unsigned char dim = *dim_it;
59 
60  FEBase * fe = nullptr;
61 
62  c.get_element_fe(T_var, fe, dim);
63 
64  fe->get_JxW(); // For integration
65  fe->get_dphi(); // For bilinear form
66  fe->get_xyz(); // For forcing
67  fe->get_phi(); // For forcing
68 
69  FEBase * side_fe = nullptr;
70  c.get_side_fe(T_var, side_fe, dim);
71  side_fe->get_nothing();
72  }
73 
74  FEMSystem::init_context(context);
75 }
void get_side_fe(unsigned int var, FEGenericBase< OutputShape > *&fe) const
Accessor for edge/face (2D/3D) finite element object for variable var for the largest dimension in th...
Definition: fem_context.h:317
unsigned int dim
unsigned int T_var
Definition: heatsystem.h:133
const std::vector< std::vector< OutputGradient > > & get_dphi() const
Definition: fe_base.h:230
virtual_for_inffe const std::vector< Real > & get_JxW() const
Definition: fe_abstract.h:295
This class provides all data required for a physics package (e.g.
Definition: fem_context.h:62
virtual_for_inffe const std::vector< Point > & get_xyz() const
Definition: fe_abstract.h:272
void get_nothing() const
Definition: fe_abstract.h:261
void get_element_fe(unsigned int var, FEGenericBase< OutputShape > *&fe) const
Accessor for interior finite element object for variable var for the largest dimension in the mesh...
Definition: fem_context.h:277
This class forms the foundation from which generic finite elements may be derived.
const std::set< unsigned char > & elem_dimensions() const
Definition: fem_context.h:951
const std::vector< std::vector< OutputShape > > & get_phi() const
Definition: fe_base.h:207

◆ init_data() [1/3]

virtual void HeatSystem::init_data ( )
protectedvirtual

Initializes the member data fields associated with the system, so that, e.g., assemble() may be used.

Reimplemented from libMesh::FEMSystem.

◆ init_data() [2/3]

virtual void HeatSystem::init_data ( )
protectedvirtual

Initializes the member data fields associated with the system, so that, e.g., assemble() may be used.

Reimplemented from libMesh::FEMSystem.

◆ init_data() [3/3]

void HeatSystem::init_data ( )
protectedvirtual

Initializes the member data fields associated with the system, so that, e.g., assemble() may be used.

Reimplemented from libMesh::FEMSystem.

Definition at line 37 of file heatsystem.C.

References _analytic_jacobians, _fe_family, _fe_order, _k, libMesh::DofMap::add_dirichlet_boundary(), libMesh::System::add_variable(), libMesh::System::get_dof_map(), libMesh::System::get_equation_systems(), libMesh::LOCAL_VARIABLE_ORDER, parameters, libMesh::EquationSystems::parameters, libMesh::ParallelObject::processor_id(), libMesh::Real, libMesh::Parameters::set(), T_var, libMesh::DifferentiablePhysics::time_evolving(), and libMesh::zero.

38 {
39  T_var = this->add_variable ("T", static_cast<Order>(_fe_order),
40  Utility::string_to_enum<FEFamily>(_fe_family));
41 
42  // Make sure the input file heat.in exists, and parse it.
43  {
44  std::ifstream i("heat.in");
45  libmesh_error_msg_if(!i, '[' << this->processor_id() << "] Can't find heat.in; exiting early.");
46  }
47  GetPot infile("heat.in");
48  _k = infile("k", 1.0);
49  _analytic_jacobians = infile("analytic_jacobians", true);
50 
51  parameters.push_back(_k);
52 
53  // Set equation system parameters _k and theta, so they can be read by the exact solution
54  this->get_equation_systems().parameters.set<Real>("_k") = _k;
55 
56  // The temperature is evolving, with a first order time derivative
57  this->time_evolving(T_var, 1);
58 
59  ZeroFunction<Number> zero;
60 
61 #ifdef LIBMESH_ENABLE_DIRICHLET
62  // Most DirichletBoundary users will want to supply a "locally
63  // indexed" functor
65  (DirichletBoundary ({0,1,2,3}, {T_var}, zero,
67 #endif
68 
69  FEMSystem::init_data();
70 }
const EquationSystems & get_equation_systems() const
Definition: system.h:730
virtual void time_evolving(unsigned int var, unsigned int order)
Tells the DiffSystem that variable var is evolving with respect to time.
Definition: diff_physics.C:41
const Number zero
.
Definition: libmesh.h:280
unsigned int T_var
Definition: heatsystem.h:133
bool _analytic_jacobians
Definition: heatsystem.h:136
unsigned int add_variable(std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variable var to the list of variables for this system.
Definition: system.C:1305
std::vector< Number > parameters
Definition: heatsystem.h:113
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
T & set(const std::string &)
Definition: parameters.h:469
std::string _fe_family
Definition: heatsystem.h:129
unsigned int _fe_order
Definition: heatsystem.h:130
Parameters parameters
Data structure holding arbitrary parameters.
void add_dirichlet_boundary(const DirichletBoundary &dirichlet_boundary)
Adds a copy of the specified Dirichlet boundary to the system.
processor_id_type processor_id() const
const DofMap & get_dof_map() const
Definition: system.h:2293

◆ init_matrices()

void libMesh::System::init_matrices ( )
protectedvirtualinherited

Initializes the matrices associated with this system.

Reimplemented in libMesh::EigenSystem.

Definition at line 326 of file system.C.

References libMesh::System::_matrices, libMesh::System::_matrices_initialized, libMesh::System::_matrix_types, libMesh::DofMap::attach_matrix(), libMesh::DofMap::compute_sparsity(), libMesh::System::get_dof_map(), libMesh::System::get_mesh(), libMesh::SparseMatrix< T >::initialized(), libMesh::DofMap::is_attached(), and libMesh::libmesh_assert().

Referenced by libMesh::System::init_data(), and libMesh::EigenSystem::init_matrices().

327 {
328  parallel_object_only();
329 
330  // No matrices to init
331  if (_matrices.empty())
332  {
333  // any future matrices to be added will need their own
334  // initialization
335  _matrices_initialized = true;
336 
337  return;
338  }
339 
340  // Check for quick return in case the first matrix
341  // (and by extension all the matrices) has already
342  // been initialized
343  if (_matrices.begin()->second->initialized())
344  {
346  return;
347  }
348 
349  _matrices_initialized = true;
350 
351  // Tell the matrices about the dof map, and vice versa
352  for (auto & pr : _matrices)
353  {
354  SparseMatrix<Number> & m = *(pr.second);
355  libmesh_assert (!m.initialized());
356 
357  // We want to allow repeated init() on systems, but we don't
358  // want to attach the same matrix to the DofMap twice
359  if (!this->get_dof_map().is_attached(m))
360  this->get_dof_map().attach_matrix(m);
361  }
362 
363  // Compute the sparsity pattern for the current
364  // mesh and DOF distribution. This also updates
365  // additional matrices, \p DofMap now knows them
366  this->get_dof_map().compute_sparsity(this->get_mesh());
367 
368  // Initialize matrices and set to zero
369  for (auto & pr : _matrices)
370  {
371  pr.second->init(_matrix_types[pr.first]);
372  pr.second->zero();
373  }
374 }
bool is_attached(SparseMatrix< Number > &matrix)
Matrices should not be attached more than once.
Definition: dof_map.C:333
void attach_matrix(SparseMatrix< Number > &matrix)
Additional matrices may be attached to this DofMap.
Definition: dof_map.C:278
const MeshBase & get_mesh() const
Definition: system.h:2277
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2181
libmesh_assert(ctx)
std::map< std::string, ParallelType, std::less<> > _matrix_types
Holds the types of the matrices.
Definition: system.h:2186
template class LIBMESH_EXPORT SparseMatrix< Number >
bool _matrices_initialized
false when additional matrices being added require initialization, true otherwise.
Definition: system.h:2191
void compute_sparsity(const MeshBase &)
Computes the sparsity pattern for the matrices corresponding to proc_id and sends that data to Linear...
Definition: dof_map.C:1816
const DofMap & get_dof_map() const
Definition: system.h:2293

◆ init_physics()

void libMesh::DifferentiablePhysics::init_physics ( const System sys)
virtualinherited

Initialize any data structures associated with the physics.

Definition at line 35 of file diff_physics.C.

References libMesh::DifferentiablePhysics::_time_evolving, and libMesh::System::n_vars().

Referenced by libMesh::DifferentiableSystem::init_data().

36 {
37  // give us flags for every variable that might be time evolving
38  _time_evolving.resize(sys.n_vars(), false);
39 }
std::vector< unsigned int > _time_evolving
Stores unsigned int to tell us which variables are evolving as first order in time (1)...
Definition: diff_physics.h:543

◆ init_qoi() [1/2]

virtual void libMesh::DifferentiableQoI::init_qoi ( std::vector< Number > &  )
inlinevirtualinherited

Initialize system qoi.

This version of the function required direct vector access, and is now deprecated.

Definition at line 72 of file diff_qoi.h.

72 {}

◆ init_qoi() [2/2]

void libMesh::DifferentiableQoI::init_qoi ( std::vector< Number > &  )
inlineinherited

Non-virtual, to try to help deprecated user code catch this change at compile time (if they specified override)

Definition at line 78 of file diff_qoi.h.

78 {}

◆ init_qoi_count()

virtual void libMesh::DifferentiableQoI::init_qoi_count ( System )
inlinevirtualinherited

Initialize system qoi.

Often this will just call sys.init_qois(some_desired_number_of_qois)

Reimplemented in LaplaceQoI, and CoupledSystemQoI.

Definition at line 85 of file diff_qoi.h.

85 {}

◆ init_qois()

void libMesh::System::init_qois ( unsigned int  n_qois)
inherited

Accessors for qoi and qoi_error_estimates vectors.

Definition at line 2319 of file system.C.

References libMesh::System::n_qois(), libMesh::System::qoi, and libMesh::System::qoi_error_estimates.

Referenced by CoupledSystemQoI::init_qoi_count(), LaplaceQoI::init_qoi_count(), and main().

2320 {
2321  qoi.resize(n_qois);
2322  qoi_error_estimates.resize(n_qois);
2323 }
unsigned int n_qois() const
Number of currently active quantities of interest.
Definition: system.h:2516
std::vector< Number > qoi
Values of the quantities of interest.
Definition: system.h:1611
std::vector< Number > qoi_error_estimates
Vector to hold error estimates for qois, either from a steady state calculation, or from a single uns...
Definition: system.h:1619

◆ is_adjoint_already_solved()

bool libMesh::System::is_adjoint_already_solved ( ) const
inlineinherited

Accessor for the adjoint_already_solved boolean.

Definition at line 406 of file system.h.

References libMesh::System::adjoint_already_solved.

Referenced by libMesh::ImplicitSystem::adjoint_qoi_parameter_sensitivity(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::AdjointResidualErrorEstimator::estimate_error(), libMesh::ImplicitSystem::qoi_parameter_hessian(), and libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product().

407  { return adjoint_already_solved;}
bool adjoint_already_solved
Has the adjoint problem already been solved? If the user sets adjoint_already_solved to true...
Definition: system.h:2242

◆ is_first_order_var()

bool libMesh::DifferentiablePhysics::is_first_order_var ( unsigned int  var) const
inlineinherited

Definition at line 509 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_first_order_vars.

510  { return _first_order_vars.find(var) != _first_order_vars.end(); }
std::set< unsigned int > _first_order_vars
Variable indices for those variables that are first order in time.
Definition: diff_physics.h:548

◆ is_initialized()

bool libMesh::System::is_initialized ( )
inlineinherited
Returns
true iff this system has been initialized.

Definition at line 2333 of file system.h.

References libMesh::System::_is_initialized.

Referenced by libMesh::System::add_variable(), libMesh::System::add_variables(), and libMesh::System::init().

2334 {
2335  return _is_initialized;
2336 }
bool _is_initialized
true when additional vectors and variables do not require immediate initialization, false otherwise.
Definition: system.h:2210

◆ is_second_order_var()

bool libMesh::DifferentiablePhysics::is_second_order_var ( unsigned int  var) const
inlineinherited

Definition at line 522 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_second_order_vars.

Referenced by libMesh::FirstOrderUnsteadySolver::compute_second_order_eqns().

523  { return _second_order_vars.find(var) != _second_order_vars.end(); }
std::set< unsigned int > _second_order_vars
Variable indices for those variables that are second order in time.
Definition: diff_physics.h:553

◆ is_time_evolving()

bool libMesh::DifferentiablePhysics::is_time_evolving ( unsigned int  var) const
inlineinherited
Returns
true iff variable var is evolving with respect to time. In general, the user's init() function should have set time_evolving() for any variables which behave like du/dt = F(u), and should not call time_evolving() for any variables which behave like 0 = G(u).

Definition at line 260 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_time_evolving, and libMesh::libmesh_assert().

Referenced by libMesh::FEMPhysics::eulerian_residual(), libMesh::FEMSystem::init_context(), libMesh::FEMPhysics::mass_residual(), and libMesh::DifferentiablePhysics::nonlocal_mass_residual().

261  {
262  libmesh_assert_less(var,_time_evolving.size());
263  libmesh_assert( _time_evolving[var] == 0 ||
264  _time_evolving[var] == 1 ||
265  _time_evolving[var] == 2 );
266  return _time_evolving[var];
267  }
libmesh_assert(ctx)
std::vector< unsigned int > _time_evolving
Stores unsigned int to tell us which variables are evolving as first order in time (1)...
Definition: diff_physics.h:543

◆ k() [1/2]

Real& HeatSystem::k ( )
inline

Definition at line 43 of file heatsystem.h.

43 { return _k; }

◆ k() [2/2]

Real& HeatSystem::k ( )
inline

Definition at line 48 of file heatsystem.h.

48 { return _k; }

◆ local_dof_indices()

void libMesh::System::local_dof_indices ( const unsigned int  var,
std::set< dof_id_type > &  var_indices 
) const
inherited

Fills the std::set with the degrees of freedom on the local processor corresponding the the variable number passed in.

Definition at line 1575 of file system.C.

References libMesh::DofMap::dof_indices(), libMesh::DofMap::end_dof(), libMesh::DofMap::first_dof(), libMesh::System::get_dof_map(), libMesh::System::get_mesh(), and libMesh::libmesh_assert().

Referenced by libMesh::System::discrete_var_norm(), SystemsTest::testBlockRestrictedVarNDofs(), and libMesh::DirectSolutionTransfer::transfer().

1577 {
1578  // Make sure the set is clear
1579  var_indices.clear();
1580 
1581  std::vector<dof_id_type> dof_indices;
1582 
1583  const dof_id_type
1584  first_local = this->get_dof_map().first_dof(),
1585  end_local = this->get_dof_map().end_dof();
1586 
1587  // Begin the loop over the elements
1588  for (const auto & elem : this->get_mesh().active_local_element_ptr_range())
1589  {
1590  this->get_dof_map().dof_indices (elem, dof_indices, var);
1591 
1592  for (dof_id_type dof : dof_indices)
1593  //If the dof is owned by the local processor
1594  if (first_local <= dof && dof < end_local)
1595  var_indices.insert(dof);
1596  }
1597 
1598  // we may have missed assigning DOFs to nodes that we own
1599  // but to which we have no connected elements matching our
1600  // variable restriction criterion. this will happen, for example,
1601  // if variable V is restricted to subdomain S. We may not own
1602  // any elements which live in S, but we may own nodes which are
1603  // *connected* to elements which do.
1604  for (const auto & node : this->get_mesh().local_node_ptr_range())
1605  {
1606  libmesh_assert(node);
1607  this->get_dof_map().dof_indices (node, dof_indices, var);
1608  for (auto dof : dof_indices)
1609  if (first_local <= dof && dof < end_local)
1610  var_indices.insert(dof);
1611  }
1612 }
void dof_indices(const Elem *const elem, std::vector< dof_id_type > &di) const
Fills the vector di with the global degree of freedom indices for the element.
Definition: dof_map.C:1992
const MeshBase & get_mesh() const
Definition: system.h:2277
libmesh_assert(ctx)
dof_id_type first_dof(const processor_id_type proc) const
Definition: dof_map.h:684
dof_id_type end_dof(const processor_id_type proc) const
Definition: dof_map.h:708
const DofMap & get_dof_map() const
Definition: system.h:2293
uint8_t dof_id_type
Definition: id_types.h:67

◆ mass_residual() [1/2]

bool libMesh::FEMPhysics::mass_residual ( bool  request_jacobian,
DiffContext c 
)
overridevirtualinherited

Subtracts a mass vector contribution on elem from elem_residual.

If this method receives request_jacobian = true, then it should compute elem_jacobian and return true if possible. If elem_jacobian has not been computed then the method should return false.

Many problems can use the reimplementation in FEMPhysics::mass_residual which subtracts (du/dt,v) for each transient variable u; users with more complicated transient problems will need to reimplement this themselves.

Reimplemented from libMesh::DifferentiablePhysics.

Reimplemented in SecondOrderScalarSystemFirstOrderTimeSolverBase, SecondOrderScalarSystemSecondOrderTimeSolverBase, FirstOrderScalarSystemBase, ElasticitySystem, ElasticitySystem, and NavierSystem.

Definition at line 200 of file fem_physics.C.

References libMesh::DiffContext::elem_solution_rate_derivative, libMesh::DiffContext::get_dof_indices(), libMesh::DiffContext::get_elem_jacobian(), libMesh::DiffContext::get_elem_residual(), libMesh::FEMContext::get_element_fe(), libMesh::FEMContext::get_element_qrule(), libMesh::FEAbstract::get_JxW(), libMesh::FEGenericBase< OutputType >::get_phi(), libMesh::FEMContext::interior_rate(), libMesh::DifferentiablePhysics::is_time_evolving(), libMesh::make_range(), libMesh::QBase::n_points(), and libMesh::DiffContext::n_vars().

202 {
203  FEMContext & context = cast_ref<FEMContext &>(c);
204 
205  unsigned int n_qpoints = context.get_element_qrule().n_points();
206 
207  for (auto var : make_range(context.n_vars()))
208  {
209  if (!this->is_time_evolving(var))
210  continue;
211 
212  FEBase * elem_fe = nullptr;
213  context.get_element_fe( var, elem_fe );
214 
215  const std::vector<Real> & JxW = elem_fe->get_JxW();
216 
217  const std::vector<std::vector<Real>> & phi = elem_fe->get_phi();
218 
219  const unsigned int n_dofs = cast_int<unsigned int>
220  (context.get_dof_indices(var).size());
221 
222  DenseSubVector<Number> & Fu = context.get_elem_residual(var);
223  DenseSubMatrix<Number> & Kuu = context.get_elem_jacobian( var, var );
224 
225  for (unsigned int qp = 0; qp != n_qpoints; ++qp)
226  {
227  Number uprime;
228  context.interior_rate(var, qp, uprime);
229  const Number JxWxU = JxW[qp] * uprime;
230  for (unsigned int i = 0; i != n_dofs; ++i)
231  {
232  Fu(i) -= JxWxU * phi[i][qp];
233  if (request_jacobian && context.elem_solution_rate_derivative)
234  {
235  const Number JxWxPhiIxDeriv = JxW[qp] * phi[i][qp] *
236  context.elem_solution_rate_derivative;
237  Kuu(i,i) -= JxWxPhiIxDeriv * phi[i][qp];
238  for (unsigned int j = i+1; j < n_dofs; ++j)
239  {
240  const Number Kij = JxWxPhiIxDeriv * phi[j][qp];
241  Kuu(i,j) -= Kij;
242  Kuu(j,i) -= Kij;
243  }
244  }
245  }
246  }
247  }
248 
249  return request_jacobian;
250 }
FEGenericBase< Real > FEBase
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
bool is_time_evolving(unsigned int var) const
Definition: diff_physics.h:260

◆ mass_residual() [2/2]

virtual bool libMesh::DifferentiablePhysics::mass_residual ( bool  request_jacobian,
DiffContext  
)
inlinevirtualinherited

Subtracts a mass vector contribution on elem from elem_residual.

For first-order-in-time problems, this is the \( M(u,\dot{u})\dot{u} \) term. For second-order-in-time problems, this is the \( M(u,\ddot{u})\ddot{u} \) term. This method is only called for UnsteadySolver-based TimeSolvers.

If this method receives request_jacobian = true, then it should compute elem_jacobian and return true if possible. If elem_jacobian has not been computed then the method should return false.

Many first-order-in-time problems can use the reimplementation in FEMPhysics::mass_residual which subtracts (du/dt,v) for each transient variable u; users with more complicated transient problems or second-order-in-time problems will need to reimplement this themselves.

Reimplemented in SecondOrderScalarSystemFirstOrderTimeSolverBase, SecondOrderScalarSystemSecondOrderTimeSolverBase, FirstOrderScalarSystemBase, libMesh::FEMPhysics, ElasticitySystem, ElasticitySystem, and NavierSystem.

Definition at line 302 of file diff_physics.h.

Referenced by libMesh::EulerSolver::element_residual(), libMesh::Euler2Solver::element_residual(), libMesh::NewmarkSolver::element_residual(), and libMesh::EigenTimeSolver::element_residual().

304  {
305  return request_jacobian;
306  }

◆ mesh_position_get()

void FEMSystem::mesh_position_get ( )
inherited

Tells the FEMSystem to set the degree of freedom coefficients which should correspond to mesh nodal coordinates.

Definition at line 1423 of file fem_system.C.

References libMesh::DifferentiablePhysics::_mesh_sys, libMesh::DifferentiablePhysics::_mesh_x_var, libMesh::DifferentiablePhysics::_mesh_y_var, libMesh::DifferentiablePhysics::_mesh_z_var, libMesh::FEMSystem::build_context(), libMesh::FEMContext::elem_position_get(), libMesh::DiffContext::get_dof_indices(), libMesh::DiffContext::get_elem_solution(), libMesh::System::get_mesh(), libMesh::FEMSystem::init_context(), libMesh::invalid_uint, mesh, libMesh::FEMContext::pre_fe_reinit(), libMesh::System::solution, and libMesh::System::update().

Referenced by SolidSystem::init_data().

1424 {
1425  // This function makes no sense unless we've already picked out some
1426  // variable(s) to reflect mesh position coordinates
1427  libmesh_error_msg_if(!_mesh_sys, "_mesh_sys was nullptr!");
1428 
1429  // We currently assume mesh variables are in our own system
1430  if (_mesh_sys != this)
1431  libmesh_not_implemented();
1432 
1433  // Loop over every active mesh element on this processor
1434  const MeshBase & mesh = this->get_mesh();
1435 
1436  std::unique_ptr<DiffContext> con = this->build_context();
1437  FEMContext & _femcontext = cast_ref<FEMContext &>(*con);
1438  this->init_context(_femcontext);
1439 
1440  // Get the solution's mesh variables from every element
1441  for (const auto & elem : mesh.active_local_element_ptr_range())
1442  {
1443  _femcontext.pre_fe_reinit(*this, elem);
1444 
1445  _femcontext.elem_position_get();
1446 
1448  this->solution->insert(_femcontext.get_elem_solution(_mesh_x_var),
1449  _femcontext.get_dof_indices(_mesh_x_var) );
1451  this->solution->insert(_femcontext.get_elem_solution(_mesh_y_var),
1452  _femcontext.get_dof_indices(_mesh_y_var));
1454  this->solution->insert(_femcontext.get_elem_solution(_mesh_z_var),
1455  _femcontext.get_dof_indices(_mesh_z_var));
1456  }
1457 
1458  this->solution->close();
1459 
1460  // And make sure the current_local_solution is up to date too
1461  this->System::update();
1462 }
virtual std::unique_ptr< DiffContext > build_context() override
Builds a FEMContext object with enough information to do evaluations on each element.
Definition: fem_system.C:1346
unsigned int _mesh_x_var
Variables from which to acquire moving mesh information.
Definition: diff_physics.h:536
virtual void pre_fe_reinit(const System &, const Elem *e)
Reinitializes local data vectors/matrices on the current geometric element.
Definition: fem_context.C:1675
const unsigned int invalid_uint
A number which is used quite often to represent an invalid or uninitialized value for an unsigned int...
Definition: libmesh.h:286
virtual void init_context(DiffContext &) override
Definition: fem_system.C:1370
MeshBase & mesh
void elem_position_get()
Uses the geometry of elem to set the coordinate data specified by mesh_*_position configuration...
Definition: fem_context.C:1518
const MeshBase & get_mesh() const
Definition: system.h:2277
This is the MeshBase class.
Definition: mesh_base.h:74
const DenseVector< Number > & get_elem_solution() const
Accessor for element solution.
Definition: diff_context.h:112
System * _mesh_sys
System from which to acquire moving mesh information.
Definition: diff_physics.h:531
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
This class provides all data required for a physics package (e.g.
Definition: fem_context.h:62
const std::vector< dof_id_type > & get_dof_indices() const
Accessor for element dof indices.
Definition: diff_context.h:363
virtual void update()
Update the local values to reflect the solution on neighboring processors.
Definition: system.C:493

◆ mesh_position_set()

void FEMSystem::mesh_position_set ( )
inherited

Tells the FEMSystem to set the mesh nodal coordinates which should correspond to degree of freedom coefficients.

Definition at line 1087 of file fem_system.C.

References libMesh::DifferentiablePhysics::_mesh_sys, libMesh::FEMSystem::build_context(), libMesh::ParallelObject::comm(), libMesh::FEMContext::elem_fe_reinit(), libMesh::FEMContext::elem_position_set(), libMesh::FEMContext::get_elem(), libMesh::System::get_mesh(), libMesh::Elem::has_children(), libMesh::FEMSystem::init_context(), libMesh::libmesh_assert(), mesh, libMesh::FEMContext::pre_fe_reinit(), and libMesh::Parallel::sync_dofobject_data_by_id().

Referenced by libMesh::FEMSystem::solve(), and SolidSystem::update().

1088 {
1089  // If we don't need to move the mesh, we're done
1090  if (_mesh_sys != this)
1091  return;
1092 
1093  MeshBase & mesh = this->get_mesh();
1094 
1095  std::unique_ptr<DiffContext> con = this->build_context();
1096  FEMContext & _femcontext = cast_ref<FEMContext &>(*con);
1097  this->init_context(_femcontext);
1098 
1099  // Move every mesh element we can
1100  for (const auto & elem : mesh.active_local_element_ptr_range())
1101  {
1102  // We need the algebraic data
1103  _femcontext.pre_fe_reinit(*this, elem);
1104  // And when asserts are on, we also need the FE so
1105  // we can assert that the mesh data is of the right type.
1106 #ifndef NDEBUG
1107  _femcontext.elem_fe_reinit();
1108 #endif
1109 
1110  // This code won't handle moving subactive elements
1111  libmesh_assert(!_femcontext.get_elem().has_children());
1112 
1113  _femcontext.elem_position_set(1.);
1114  }
1115 
1116  // We've now got positions set on all local nodes (and some
1117  // semilocal nodes); let's request positions for non-local nodes
1118  // from their processors.
1119 
1120  SyncNodalPositions sync_object(mesh);
1122  (this->comm(), mesh.nodes_begin(), mesh.nodes_end(), sync_object);
1123 }
virtual std::unique_ptr< DiffContext > build_context() override
Builds a FEMContext object with enough information to do evaluations on each element.
Definition: fem_system.C:1346
void elem_position_set(Real theta)
Uses the coordinate data specified by mesh_*_position configuration to set the geometry of elem to th...
Definition: fem_context.h:1270
virtual void pre_fe_reinit(const System &, const Elem *e)
Reinitializes local data vectors/matrices on the current geometric element.
Definition: fem_context.C:1675
const Elem & get_elem() const
Accessor for current Elem object.
Definition: fem_context.h:908
virtual void init_context(DiffContext &) override
Definition: fem_system.C:1370
MeshBase & mesh
const Parallel::Communicator & comm() const
const MeshBase & get_mesh() const
Definition: system.h:2277
This is the MeshBase class.
Definition: mesh_base.h:74
virtual void elem_fe_reinit(const std::vector< Point > *const pts=nullptr)
Reinitializes interior FE objects on the current geometric element.
Definition: fem_context.C:1469
System * _mesh_sys
System from which to acquire moving mesh information.
Definition: diff_physics.h:531
libmesh_assert(ctx)
This class provides all data required for a physics package (e.g.
Definition: fem_context.h:62
void sync_dofobject_data_by_id(const Communicator &comm, const Iterator &range_begin, const Iterator &range_end, SyncFunctor &sync)
Request data about a range of ghost dofobjects uniquely identified by their id.
bool has_children() const
Definition: elem.h:2816

◆ n_active_dofs()

dof_id_type libMesh::System::n_active_dofs ( ) const
inlineinherited
Returns
The number of active degrees of freedom for this System.

Definition at line 2461 of file system.h.

References libMesh::System::n_constrained_dofs(), and libMesh::System::n_dofs().

2462 {
2463  return this->n_dofs() - this->n_constrained_dofs();
2464 }
dof_id_type n_dofs() const
Definition: system.C:113
dof_id_type n_constrained_dofs() const
Definition: system.C:120

◆ n_components()

unsigned int libMesh::System::n_components ( ) const
inlineinherited
Returns
The total number of scalar components in the system's variables. This will equal n_vars() in the case of all scalar-valued variables.

Definition at line 2365 of file system.h.

References libMesh::System::_variables, libMesh::Variable::first_scalar_number(), and libMesh::Variable::n_components().

Referenced by libMesh::System::add_variables().

2366 {
2367  if (_variables.empty())
2368  return 0;
2369 
2370  const Variable & last = _variables.back();
2371  return last.first_scalar_number() + last.n_components();
2372 }
std::vector< Variable > _variables
The Variable in this System.
Definition: system.h:2140

◆ n_constrained_dofs()

dof_id_type libMesh::System::n_constrained_dofs ( ) const
inherited
Returns
The total number of constrained degrees of freedom in the system.

Definition at line 120 of file system.C.

References libMesh::System::_dof_map.

Referenced by libMesh::System::get_info(), libMesh::System::n_active_dofs(), libMesh::EigenSystem::solve(), and BoundaryInfoTest::testShellFaceConstraints().

121 {
122 #ifdef LIBMESH_ENABLE_CONSTRAINTS
123 
124  return _dof_map->n_constrained_dofs();
125 
126 #else
127 
128  return 0;
129 
130 #endif
131 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2113

◆ n_dofs()

dof_id_type libMesh::System::n_dofs ( ) const
inherited
Returns
The number of degrees of freedom in the system

Definition at line 113 of file system.C.

References libMesh::System::_dof_map.

Referenced by libMesh::TransientRBConstruction::add_IC_to_RB_space(), libMesh::System::add_vector(), libMesh::TransientRBConstruction::allocate_data_structures(), libMesh::RBConstruction::allocate_data_structures(), libMesh::TransientRBConstruction::assemble_affine_expansion(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::TransientRBConstruction::enrich_RB_space(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::System::get_info(), libMesh::SecondOrderUnsteadySolver::init_data(), libMesh::UnsteadySolver::init_data(), libMesh::System::init_data(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), main(), libMesh::TransientRBConstruction::mass_matrix_scaled_matvec(), libMesh::System::n_active_dofs(), libMesh::CondensedEigenSystem::n_global_non_condensed_dofs(), libMesh::FEMSystem::numerical_jacobian(), libMesh::RBSCMConstruction::perform_SCM_greedy(), libMesh::RBEvaluation::read_in_vectors_from_multiple_files(), libMesh::System::read_legacy_data(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::SecondOrderUnsteadySolver::reinit(), libMesh::UnsteadySolver::reinit(), libMesh::System::restrict_vectors(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), libMesh::TransientRBConstruction::set_error_temporal_data(), SystemsTest::test100KVariables(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), SystemsTest::testPostInitAddVector(), SystemsTest::testPostInitAddVectorTypeChange(), SystemsTest::testProjectCubeWithMeshFunction(), SystemsTest::testProjectMatrix1D(), SystemsTest::testProjectMatrix2D(), SystemsTest::testProjectMatrix3D(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::TransientRBConstruction::truth_assembly(), libMesh::RBConstruction::truth_assembly(), libMesh::TransientRBConstruction::update_RB_initial_condition_all_N(), libMesh::TransientRBConstruction::update_RB_system_matrices(), libMesh::RBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), and libMesh::RBConstruction::update_residual_terms().

114 {
115  return _dof_map->n_dofs();
116 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2113

◆ n_local_constrained_dofs()

dof_id_type libMesh::System::n_local_constrained_dofs ( ) const
inherited
Returns
The number of constrained degrees of freedom on this processor.

Definition at line 135 of file system.C.

References libMesh::System::_dof_map.

Referenced by libMesh::System::get_info().

136 {
137 #ifdef LIBMESH_ENABLE_CONSTRAINTS
138 
139  return _dof_map->n_local_constrained_dofs();
140 
141 #else
142 
143  return 0;
144 
145 #endif
146 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2113

◆ n_local_dofs()

dof_id_type libMesh::System::n_local_dofs ( ) const
inherited
Returns
The number of degrees of freedom local to this processor

Definition at line 150 of file system.C.

References libMesh::System::_dof_map, and libMesh::ParallelObject::processor_id().

Referenced by libMesh::TransientRBConstruction::add_IC_to_RB_space(), libMesh::System::add_vector(), libMesh::TransientRBConstruction::allocate_data_structures(), libMesh::RBConstruction::allocate_data_structures(), libMesh::TransientRBConstruction::assemble_affine_expansion(), libMesh::PetscDMWrapper::build_section(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::TransientRBConstruction::enrich_RB_space(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::System::get_info(), libMesh::SecondOrderUnsteadySolver::init_data(), libMesh::UnsteadySolver::init_data(), libMesh::System::init_data(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), main(), libMesh::TransientRBConstruction::mass_matrix_scaled_matvec(), libMesh::RBEvaluation::read_in_vectors_from_multiple_files(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::SecondOrderUnsteadySolver::reinit(), libMesh::UnsteadySolver::reinit(), libMesh::System::restrict_vectors(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), libMesh::TransientRBConstruction::set_error_temporal_data(), MeshFunctionTest::test_p_level(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::TransientRBConstruction::truth_assembly(), libMesh::RBConstruction::truth_assembly(), libMesh::TransientRBConstruction::update_RB_initial_condition_all_N(), libMesh::TransientRBConstruction::update_RB_system_matrices(), libMesh::RBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), and libMesh::RBConstruction::update_residual_terms().

151 {
152  return _dof_map->n_dofs_on_processor (this->processor_id());
153 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2113
processor_id_type processor_id() const

◆ n_matrices()

unsigned int libMesh::System::n_matrices ( ) const
inlineinherited
Returns
The number of matrices handled by this system. This is the size of the _matrices map

Definition at line 2594 of file system.h.

References libMesh::System::_matrices.

Referenced by libMesh::ImplicitSystem::add_matrices(), and libMesh::System::get_info().

2595 {
2596  return cast_int<unsigned int>(_matrices.size());
2597 }
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2181

◆ n_objects()

static unsigned int libMesh::ReferenceCounter::n_objects ( )
inlinestaticinherited

Prints the number of outstanding (created, but not yet destroyed) objects.

Definition at line 85 of file reference_counter.h.

References libMesh::ReferenceCounter::_n_objects.

Referenced by libMesh::LibMeshInit::~LibMeshInit().

86  { return _n_objects; }
static Threads::atomic< unsigned int > _n_objects
The number of objects.

◆ n_processors()

processor_id_type libMesh::ParallelObject::n_processors ( ) const
inlineinherited
Returns
The number of processors in the group.

Definition at line 103 of file parallel_object.h.

References libMesh::ParallelObject::_communicator, libMesh::libmesh_assert(), and TIMPI::Communicator::size().

Referenced by libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::DofMap::add_constraints_to_send_list(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::DofMap::add_neighbors_to_send_list(), libMesh::DistributedMesh::add_node(), libMesh::System::add_vector(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::FEMSystem::assembly(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::Partitioner::assign_partitioning(), libMesh::AztecLinearSolver< T >::AztecLinearSolver(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::DistributedMesh::clear(), libMesh::DistributedMesh::clear_elems(), libMesh::Nemesis_IO_Helper::compute_border_node_ids(), libMesh::Nemesis_IO_Helper::construct_nemesis_filename(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::UnstructuredMesh::create_pid_mesh(), libMesh::MeshTools::create_processor_bounding_box(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::distribute_scalar_dofs(), libMesh::DistributedMesh::DistributedMesh(), libMesh::EnsightIO::EnsightIO(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::MeshBase::get_info(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::Nemesis_IO_Helper::initialize(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::DistributedMesh::insert_elem(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_boundary_ids(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::DofMap::local_variable_indices(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::MeshBase::n_active_elem_on_proc(), libMesh::MeshBase::n_elem_on_proc(), libMesh::MeshBase::n_nodes_on_proc(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::Partitioner::partition(), libMesh::MeshBase::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::DofMap::prepare_send_list(), libMesh::DofMap::print_dof_constraints(), libMesh::NameBasedIO::read(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::CheckpointIO::read_connectivity(), libMesh::XdrIO::read_header(), libMesh::CheckpointIO::read_nodes(), libMesh::System::read_parallel_data(), libMesh::System::read_SCALAR_dofs(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::System::read_serialized_vector(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::Partitioner::repartition(), OverlappingFunctorTest::run_partitioner_test(), libMesh::DofMap::scatter_constraints(), libMesh::DistributedMesh::set_next_unique_id(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), WriteVecAndScalar::setupTests(), libMesh::RBEIMEvaluation::side_gather_bfs(), DistributedMeshTest::testRemoteElemError(), CheckpointIOTest::testSplitter(), libMesh::MeshRefinement::uniformly_coarsen(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::GMVIO::write_binary(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::VTKIO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::System::write_parallel_data(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), and libMesh::XdrIO::write_serialized_nodesets().

104  {
105  processor_id_type returnval =
106  cast_int<processor_id_type>(_communicator.size());
107  libmesh_assert(returnval); // We never have an empty comm
108  return returnval;
109  }
const Parallel::Communicator & _communicator
processor_id_type size() const
uint8_t processor_id_type
libmesh_assert(ctx)

◆ n_qois()

unsigned int libMesh::System::n_qois ( ) const
inlineinherited

Number of currently active quantities of interest.

Definition at line 2516 of file system.h.

References libMesh::System::qoi, and libMesh::System::qoi_error_estimates.

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::AdaptiveTimeSolver::adjoint_advance_timestep(), libMesh::UnsteadySolver::adjoint_advance_timestep(), libMesh::ImplicitSystem::adjoint_qoi_parameter_sensitivity(), libMesh::TwostepTimeSolver::adjoint_solve(), libMesh::ImplicitSystem::adjoint_solve(), libMesh::SensitivityData::allocate_data(), libMesh::SensitivityData::allocate_hessian_data(), libMesh::ExplicitSystem::assemble_qoi(), libMesh::FEMSystem::assemble_qoi(), libMesh::ExplicitSystem::assemble_qoi_derivative(), libMesh::FEMSystem::assemble_qoi_derivative(), libMesh::DiffContext::DiffContext(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::AdjointResidualErrorEstimator::estimate_error(), libMesh::FileSolutionHistory::FileSolutionHistory(), libMesh::ImplicitSystem::forward_qoi_parameter_sensitivity(), libMesh::UnsteadySolver::init_adjoints(), libMesh::TimeSolver::init_adjoints(), libMesh::System::init_qois(), libMesh::Euler2Solver::integrate_adjoint_refinement_error_estimate(), libMesh::TwostepTimeSolver::integrate_adjoint_refinement_error_estimate(), libMesh::EulerSolver::integrate_adjoint_refinement_error_estimate(), libMesh::Euler2Solver::integrate_qoi_timestep(), libMesh::TwostepTimeSolver::integrate_qoi_timestep(), libMesh::EulerSolver::integrate_qoi_timestep(), main(), libMesh::FEMContext::pre_fe_reinit(), libMesh::ImplicitSystem::qoi_parameter_hessian(), libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product(), libMesh::FileSolutionHistory::retrieve(), libMesh::QoISet::size(), libMesh::UnsteadySolver::UnsteadySolver(), and libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve().

2517 {
2518 #ifndef LIBMESH_ENABLE_DEPRECATED
2519  libmesh_assert_equal_to(this->qoi.size(), this->qoi_error_estimates.size());
2520 #endif
2521 
2522  return cast_int<unsigned int>(this->qoi.size());
2523 }
std::vector< Number > qoi
Values of the quantities of interest.
Definition: system.h:1611
std::vector< Number > qoi_error_estimates
Vector to hold error estimates for qois, either from a steady state calculation, or from a single uns...
Definition: system.h:1619

◆ n_variable_groups()

unsigned int libMesh::System::n_variable_groups ( ) const
inlineinherited
Returns
The number of VariableGroup variable groups in the system

Definition at line 2357 of file system.h.

References libMesh::System::_variable_groups.

Referenced by libMesh::System::add_variable(), libMesh::System::add_variables(), libMesh::FEMSystem::assembly(), libMesh::System::get_info(), and libMesh::System::init_data().

2358 {
2359  return cast_int<unsigned int>(_variable_groups.size());
2360 }
std::vector< VariableGroup > _variable_groups
The VariableGroup in this System.
Definition: system.h:2145

◆ n_vars()

unsigned int libMesh::System::n_vars ( ) const
inlineinherited
Returns
The number of variables in the system

Definition at line 2349 of file system.h.

References libMesh::System::_variables.

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::PetscDMWrapper::add_dofs_helper(), libMesh::DiffContext::add_localized_vector(), libMesh::RBConstruction::add_scaled_matrix_and_vector(), libMesh::System::add_variable(), libMesh::System::add_variables(), libMesh::TwostepTimeSolver::adjoint_solve(), libMesh::FEMContext::attach_quadrature_rules(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::PetscDMWrapper::build_section(), libMesh::System::calculate_norm(), compute_stresses(), LinearElasticityWithContact::compute_stresses(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), libMesh::DGFEMContext::DGFEMContext(), libMesh::DiffContext::DiffContext(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::AdjointResidualErrorEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::ErrorEstimator::estimate_errors(), libMesh::ExactSolution::ExactSolution(), libMesh::FEMContext::find_hardest_fe_type(), libMesh::EquationSystems::find_variable_numbers(), libMesh::System::get_all_variable_numbers(), libMesh::System::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::FEMSystem::init_context(), libMesh::RBEIMConstruction::init_context(), libMesh::FEMContext::init_internal_data(), libMesh::DifferentiablePhysics::init_physics(), AssemblyA0::interior_assembly(), AssemblyA1::interior_assembly(), AssemblyA2::interior_assembly(), InnerProductAssembly::interior_assembly(), main(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::PatchRecoveryErrorEstimator::EstimateError::operator()(), output_norms(), libMesh::petsc_auto_fieldsplit(), libMesh::FEMContext::pre_fe_reinit(), libMesh::RBEIMEvaluation::project_qp_data_map_onto_system(), libMesh::InterMeshProjection::project_system_vectors(), libMesh::System::re_update(), libMesh::System::read_legacy_data(), libMesh::System::read_parallel_data(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::System::read_serialized_vector(), libMesh::System::read_serialized_vectors(), libMesh::System::reinit_mesh(), libMesh::HPCoarsenTest::select_refinement(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::SystemSubsetBySubdomain::set_var_nums(), OverlappingTestBase::setup_coupling_matrix(), SystemsTest::testDofCouplingWithVarGroups(), SlitMeshRefinedSystemTest::testRestart(), SlitMeshRefinedSystemTest::testSystem(), libMesh::System::write_header(), libMesh::System::write_parallel_data(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::System::write_serialized_vector(), libMesh::System::write_serialized_vectors(), and libMesh::System::zero_variable().

2350 {
2351  return cast_int<unsigned int>(_variables.size());
2352 }
std::vector< Variable > _variables
The Variable in this System.
Definition: system.h:2140

◆ n_vectors()

unsigned int libMesh::System::n_vectors ( ) const
inlineinherited
Returns
The number of vectors (in addition to the solution) handled by this system This is the size of the _vectors map

Definition at line 2477 of file system.h.

References libMesh::System::_vectors.

Referenced by libMesh::ExplicitSystem::add_system_rhs(), libMesh::System::compare(), libMesh::System::get_info(), main(), libMesh::InterMeshProjection::project_system_vectors(), and libMesh::System::write_header().

2478 {
2479  return cast_int<unsigned int>(_vectors.size());
2480 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164

◆ name()

const std::string & libMesh::System::name ( ) const
inlineinherited

◆ nonlocal_constraint()

virtual bool libMesh::DifferentiablePhysics::nonlocal_constraint ( bool  request_jacobian,
DiffContext  
)
inlinevirtualinherited

Adds any nonlocal constraint contributions (e.g.

some components of constraints in scalar variable equations) to elem_residual

If this method receives request_jacobian = true, then it should also modify elem_jacobian and return true if possible. If the Jacobian changes have not been computed then the method should return false.

Users may need to reimplement this for PDEs on systems to which SCALAR variables with non-transient equations have been added.

Definition at line 233 of file diff_physics.h.

Referenced by libMesh::EulerSolver::nonlocal_residual(), libMesh::SteadySolver::nonlocal_residual(), libMesh::Euler2Solver::nonlocal_residual(), libMesh::EigenTimeSolver::nonlocal_residual(), and libMesh::NewmarkSolver::nonlocal_residual().

235  {
236  return request_jacobian;
237  }

◆ nonlocal_damping_residual()

virtual bool libMesh::DifferentiablePhysics::nonlocal_damping_residual ( bool  request_jacobian,
DiffContext  
)
inlinevirtualinherited

Subtracts any nonlocal damping vector contributions (e.g.

any first time derivative coefficients in scalar variable equations) from elem_residual

If this method receives request_jacobian = true, then it should also modify elem_jacobian and return true if possible. If the Jacobian changes have not been computed then the method should return false.

Definition at line 394 of file diff_physics.h.

Referenced by libMesh::EulerSolver::nonlocal_residual(), libMesh::Euler2Solver::nonlocal_residual(), and libMesh::NewmarkSolver::nonlocal_residual().

396  {
397  return request_jacobian;
398  }

◆ nonlocal_mass_residual()

bool libMesh::DifferentiablePhysics::nonlocal_mass_residual ( bool  request_jacobian,
DiffContext c 
)
virtualinherited

Subtracts any nonlocal mass vector contributions (e.g.

any time derivative coefficients in scalar variable equations) from elem_residual

If this method receives request_jacobian = true, then it should also modify elem_jacobian and return true if possible. If the Jacobian changes have not been computed then the method should return false.

Many problems can use the reimplementation in FEMPhysics::mass_residual which subtracts (du/dt,v) for each transient scalar variable u; users with more complicated transient scalar variable equations will need to reimplement this themselves.

Definition at line 57 of file diff_physics.C.

References libMesh::DiffContext::elem_solution_rate_derivative, libMesh::FEType::family, libMesh::DiffContext::get_dof_indices(), libMesh::DiffContext::get_elem_jacobian(), libMesh::DiffContext::get_elem_residual(), libMesh::DiffContext::get_elem_solution(), libMesh::DiffContext::get_system(), libMesh::DifferentiablePhysics::is_time_evolving(), libMesh::make_range(), libMesh::DiffContext::n_vars(), libMesh::SCALAR, libMesh::Variable::type(), and libMesh::System::variable().

Referenced by libMesh::EulerSolver::nonlocal_residual(), libMesh::Euler2Solver::nonlocal_residual(), libMesh::EigenTimeSolver::nonlocal_residual(), and libMesh::NewmarkSolver::nonlocal_residual().

59 {
60  FEMContext & context = cast_ref<FEMContext &>(c);
61 
62  for (auto var : make_range(context.n_vars()))
63  {
64  if (!this->is_time_evolving(var))
65  continue;
66 
67  if (c.get_system().variable(var).type().family != SCALAR)
68  continue;
69 
70  const std::vector<dof_id_type> & dof_indices =
71  context.get_dof_indices(var);
72 
73  const unsigned int n_dofs = cast_int<unsigned int>
74  (dof_indices.size());
75 
76  DenseSubVector<Number> & Fs = context.get_elem_residual(var);
77  DenseSubMatrix<Number> & Kss = context.get_elem_jacobian( var, var );
78 
80  context.get_elem_solution(var);
81 
82  for (unsigned int i=0; i != n_dofs; ++i)
83  {
84  Fs(i) -= Us(i);
85 
86  if (request_jacobian)
87  Kss(i,i) -= context.elem_solution_rate_derivative;
88  }
89  }
90 
91  return request_jacobian;
92 }
Defines a dense subvector for use in finite element computations.
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
bool is_time_evolving(unsigned int var) const
Definition: diff_physics.h:260

◆ nonlocal_time_derivative()

virtual bool libMesh::DifferentiablePhysics::nonlocal_time_derivative ( bool  request_jacobian,
DiffContext  
)
inlinevirtualinherited

Adds any nonlocal time derivative contributions (e.g.

some components of time derivatives in scalar variable equations) to elem_residual

If this method receives request_jacobian = true, then it should also modify elem_jacobian and return true if possible. If the Jacobian changes have not been computed then the method should return false.

Users may need to reimplement this for PDEs on systems to which SCALAR variables have been added.

Definition at line 214 of file diff_physics.h.

Referenced by libMesh::EulerSolver::nonlocal_residual(), libMesh::SteadySolver::nonlocal_residual(), libMesh::Euler2Solver::nonlocal_residual(), libMesh::EigenTimeSolver::nonlocal_residual(), and libMesh::NewmarkSolver::nonlocal_residual().

216  {
217  return request_jacobian;
218  }

◆ number()

unsigned int libMesh::System::number ( ) const
inlineinherited
Returns
The system number.

Definition at line 2269 of file system.h.

References libMesh::System::_sys_number.

Referenced by libMesh::ExactSolution::_compute_error(), libMesh::PetscDMWrapper::add_dofs_helper(), assemble_matrix_and_rhs(), assemble_shell(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::find_squared_element_error(), libMesh::EquationSystems::find_variable_numbers(), libMesh::System::get_info(), main(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SortAndCopy::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectEdges::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectSides::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectInteriors::operator()(), libMesh::System::read_legacy_data(), libMesh::System::read_parallel_data(), libMesh::System::read_serialized_blocked_dof_objects(), LinearElasticityWithContact::residual_and_jacobian(), SolidSystem::save_initial_mesh(), libMesh::HPCoarsenTest::select_refinement(), libMesh::PetscDMWrapper::set_point_range_in_section(), MeshInputTest::testCopyElementVectorImpl(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::BoundaryVolumeSolutionTransfer::transfer_boundary_volume(), libMesh::BoundaryVolumeSolutionTransfer::transfer_volume_boundary(), libMesh::DTKAdapter::update_variable_values(), libMesh::System::write_parallel_data(), libMesh::System::write_serialized_blocked_dof_objects(), and libMesh::System::zero_variable().

2270 {
2271  return _sys_number;
2272 }
const unsigned int _sys_number
The number associated with this system.
Definition: system.h:2135

◆ numerical_elem_jacobian()

void FEMSystem::numerical_elem_jacobian ( FEMContext context) const
inherited

Uses the results of multiple element_residual() calls to numerically differentiate the corresponding jacobian on an element.

Definition at line 1322 of file fem_system.C.

References libMesh::TimeSolver::element_residual(), and libMesh::FEMSystem::numerical_jacobian().

1323 {
1324  LOG_SCOPE("numerical_elem_jacobian()", "FEMSystem");
1326 }
virtual bool element_residual(bool request_jacobian, DiffContext &)=0
This method uses the DifferentiablePhysics element_time_derivative(), element_constraint(), and mass_residual() to build a full residual on an element.
void numerical_jacobian(TimeSolverResPtr res, FEMContext &context) const
Uses the results of multiple res calls to numerically differentiate the corresponding jacobian...
Definition: fem_system.C:1210

◆ numerical_jacobian()

void FEMSystem::numerical_jacobian ( TimeSolverResPtr  res,
FEMContext context 
) const
inherited

Uses the results of multiple res calls to numerically differentiate the corresponding jacobian.

Definition at line 1210 of file fem_system.C.

References libMesh::DifferentiablePhysics::_mesh_sys, libMesh::DifferentiablePhysics::_mesh_x_var, libMesh::DifferentiablePhysics::_mesh_y_var, libMesh::DifferentiablePhysics::_mesh_z_var, libMesh::DiffContext::get_dof_indices(), libMesh::FEMContext::get_elem(), libMesh::DiffContext::get_elem_jacobian(), libMesh::DiffContext::get_elem_residual(), libMesh::DiffContext::get_elem_solution(), libMesh::Elem::hmin(), libMesh::invalid_uint, libMesh::libmesh_real(), libMesh::make_range(), libMesh::System::n_dofs(), libMesh::DiffContext::n_vars(), libMesh::FEMSystem::numerical_jacobian_h, libMesh::FEMSystem::numerical_jacobian_h_for_var(), libMesh::Elem::point(), libMesh::Real, and libMesh::DenseVector< T >::zero().

Referenced by libMesh::FEMSystem::numerical_elem_jacobian(), libMesh::FEMSystem::numerical_nonlocal_jacobian(), and libMesh::FEMSystem::numerical_side_jacobian().

1212 {
1213  // Logging is done by numerical_elem_jacobian
1214  // or numerical_side_jacobian
1215 
1216  DenseVector<Number> original_residual(context.get_elem_residual());
1217  DenseVector<Number> backwards_residual(context.get_elem_residual());
1218  DenseMatrix<Number> numeric_jacobian(context.get_elem_jacobian());
1219 #ifdef DEBUG
1220  DenseMatrix<Number> old_jacobian(context.get_elem_jacobian());
1221 #endif
1222 
1223  Real numerical_point_h = 0.;
1224  if (_mesh_sys == this)
1225  numerical_point_h = numerical_jacobian_h * context.get_elem().hmin();
1226 
1227  const unsigned int n_dofs =
1228  cast_int<unsigned int>(context.get_dof_indices().size());
1229 
1230  for (auto v : make_range(context.n_vars()))
1231  {
1232  const Real my_h = this->numerical_jacobian_h_for_var(v);
1233 
1234  unsigned int j_offset = libMesh::invalid_uint;
1235 
1236  if (!context.get_dof_indices(v).empty())
1237  {
1238  for (auto i : make_range(n_dofs))
1239  if (context.get_dof_indices()[i] ==
1240  context.get_dof_indices(v)[0])
1241  j_offset = i;
1242 
1243  libmesh_assert_not_equal_to(j_offset, libMesh::invalid_uint);
1244  }
1245 
1246  for (auto j : make_range(context.get_dof_indices(v).size()))
1247  {
1248  const unsigned int total_j = j + j_offset;
1249 
1250  // Take the "minus" side of a central differenced first derivative
1251  Number original_solution = context.get_elem_solution(v)(j);
1252  context.get_elem_solution(v)(j) -= my_h;
1253 
1254  // Make sure to catch any moving mesh terms
1255  Real * coord = nullptr;
1256  if (_mesh_sys == this)
1257  {
1258  if (_mesh_x_var == v)
1259  coord = &(context.get_elem().point(j)(0));
1260  else if (_mesh_y_var == v)
1261  coord = &(context.get_elem().point(j)(1));
1262  else if (_mesh_z_var == v)
1263  coord = &(context.get_elem().point(j)(2));
1264  }
1265  if (coord)
1266  {
1267  // We have enough information to scale the perturbations
1268  // here appropriately
1269  context.get_elem_solution(v)(j) = original_solution - numerical_point_h;
1270  *coord = libmesh_real(context.get_elem_solution(v)(j));
1271  }
1272 
1273  context.get_elem_residual().zero();
1274  ((*time_solver).*(res))(false, context);
1275 #ifdef DEBUG
1276  libmesh_assert_equal_to (old_jacobian, context.get_elem_jacobian());
1277 #endif
1278  backwards_residual = context.get_elem_residual();
1279 
1280  // Take the "plus" side of a central differenced first derivative
1281  context.get_elem_solution(v)(j) = original_solution + my_h;
1282  if (coord)
1283  {
1284  context.get_elem_solution()(j) = original_solution + numerical_point_h;
1285  *coord = libmesh_real(context.get_elem_solution(v)(j));
1286  }
1287  context.get_elem_residual().zero();
1288  ((*time_solver).*(res))(false, context);
1289 #ifdef DEBUG
1290  libmesh_assert_equal_to (old_jacobian, context.get_elem_jacobian());
1291 #endif
1292 
1293  context.get_elem_solution(v)(j) = original_solution;
1294  if (coord)
1295  {
1296  *coord = libmesh_real(context.get_elem_solution(v)(j));
1297  for (auto i : make_range(n_dofs))
1298  {
1299  numeric_jacobian(i,total_j) =
1300  (context.get_elem_residual()(i) - backwards_residual(i)) /
1301  2. / numerical_point_h;
1302  }
1303  }
1304  else
1305  {
1306  for (auto i : make_range(n_dofs))
1307  {
1308  numeric_jacobian(i,total_j) =
1309  (context.get_elem_residual()(i) - backwards_residual(i)) /
1310  2. / my_h;
1311  }
1312  }
1313  }
1314  }
1315 
1316  context.get_elem_residual() = original_residual;
1317  context.get_elem_jacobian() = numeric_jacobian;
1318 }
T libmesh_real(T a)
const DenseMatrix< Number > & get_elem_jacobian() const
Const accessor for element Jacobian.
Definition: diff_context.h:274
unsigned int _mesh_x_var
Variables from which to acquire moving mesh information.
Definition: diff_physics.h:536
virtual void zero() override final
Set every element in the vector to 0.
Definition: dense_vector.h:398
const unsigned int invalid_uint
A number which is used quite often to represent an invalid or uninitialized value for an unsigned int...
Definition: libmesh.h:286
const Elem & get_elem() const
Accessor for current Elem object.
Definition: fem_context.h:908
Real numerical_jacobian_h
If calculating numeric jacobians is required, the FEMSystem will perturb each solution vector entry b...
Definition: fem_system.h:187
dof_id_type n_dofs() const
Definition: system.C:113
const DenseVector< Number > & get_elem_solution() const
Accessor for element solution.
Definition: diff_context.h:112
virtual Real hmin() const
Definition: elem.C:512
System * _mesh_sys
System from which to acquire moving mesh information.
Definition: diff_physics.h:531
const std::vector< dof_id_type > & get_dof_indices() const
Accessor for element dof indices.
Definition: diff_context.h:363
const DenseVector< Number > & get_elem_residual() const
Const accessor for element residual.
Definition: diff_context.h:242
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
Real numerical_jacobian_h_for_var(unsigned int var_num) const
If numerical_jacobian_h_for_var(var_num) is changed from its default value (numerical_jacobian_h), the FEMSystem will perturb solution vector entries for variable var_num by that amount when calculating finite differences with respect to that variable.
Definition: fem_system.h:265
unsigned int n_vars() const
Number of variables in solution.
Definition: diff_context.h:100
const Point & point(const unsigned int i) const
Definition: elem.h:2277

◆ numerical_jacobian_h_for_var()

Real FEMSystem::numerical_jacobian_h_for_var ( unsigned int  var_num) const
inlineinherited

If numerical_jacobian_h_for_var(var_num) is changed from its default value (numerical_jacobian_h), the FEMSystem will perturb solution vector entries for variable var_num by that amount when calculating finite differences with respect to that variable.

This is useful in multiphysics problems which have not been normalized.

Definition at line 265 of file fem_system.h.

References libMesh::FEMSystem::_numerical_jacobian_h_for_var, libMesh::FEMSystem::numerical_jacobian_h, and libMesh::Real.

Referenced by libMesh::FEMSystem::numerical_jacobian().

266 {
267  if ((var_num >= _numerical_jacobian_h_for_var.size()) ||
268  _numerical_jacobian_h_for_var[var_num] == Real(0))
269  return numerical_jacobian_h;
270 
271  return _numerical_jacobian_h_for_var[var_num];
272 }
Real numerical_jacobian_h
If calculating numeric jacobians is required, the FEMSystem will perturb each solution vector entry b...
Definition: fem_system.h:187
std::vector< Real > _numerical_jacobian_h_for_var
Definition: fem_system.h:258
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ numerical_nonlocal_jacobian()

void FEMSystem::numerical_nonlocal_jacobian ( FEMContext context) const
inherited

Uses the results of multiple side_residual() calls to numerically differentiate the corresponding jacobian on nonlocal DoFs.

Definition at line 1338 of file fem_system.C.

References libMesh::TimeSolver::nonlocal_residual(), and libMesh::FEMSystem::numerical_jacobian().

Referenced by libMesh::FEMSystem::assembly().

1339 {
1340  LOG_SCOPE("numerical_nonlocal_jacobian()", "FEMSystem");
1342 }
virtual bool nonlocal_residual(bool request_jacobian, DiffContext &)=0
This method uses the DifferentiablePhysics nonlocal_time_derivative(), nonlocal_constraint(), and nonlocal_mass_residual() to build a full residual of non-local terms.
void numerical_jacobian(TimeSolverResPtr res, FEMContext &context) const
Uses the results of multiple res calls to numerically differentiate the corresponding jacobian...
Definition: fem_system.C:1210

◆ numerical_side_jacobian()

void FEMSystem::numerical_side_jacobian ( FEMContext context) const
inherited

Uses the results of multiple side_residual() calls to numerically differentiate the corresponding jacobian on an element's side.

Definition at line 1330 of file fem_system.C.

References libMesh::FEMSystem::numerical_jacobian(), and libMesh::TimeSolver::side_residual().

1331 {
1332  LOG_SCOPE("numerical_side_jacobian()", "FEMSystem");
1334 }
virtual bool side_residual(bool request_jacobian, DiffContext &)=0
This method uses the DifferentiablePhysics side_time_derivative(), side_constraint(), and side_mass_residual() to build a full residual on an element&#39;s side.
void numerical_jacobian(TimeSolverResPtr res, FEMContext &context) const
Uses the results of multiple res calls to numerically differentiate the corresponding jacobian...
Definition: fem_system.C:1210

◆ parallel_op()

void libMesh::DifferentiableQoI::parallel_op ( const Parallel::Communicator communicator,
std::vector< Number > &  sys_qoi,
std::vector< Number > &  local_qoi,
const QoISet qoi_indices 
)
virtualinherited

Method to populate system qoi data structure with process-local qoi.

By default, simply sums process qois into system qoi.

Definition at line 41 of file diff_qoi.C.

References communicator.

Referenced by libMesh::FEMSystem::assemble_qoi().

45 {
46  // Sum everything into local_qoi
47  communicator.sum(local_qoi);
48 
49  // Now put into system qoi
50  sys_qoi = local_qoi;
51 }
DIE A HORRIBLE DEATH HERE typedef MPI_Comm communicator

◆ perturb_accumulate_residuals()

void HeatSystem::perturb_accumulate_residuals ( ParameterVector &  parameters)

Definition at line 162 of file heatsystem.C.

References libMesh::FEMSystem::assembly(), libMesh::NumericVector< T >::clone(), libMesh::NumericVector< T >::close(), libMesh::DifferentiableSystem::deltat, deltat_vector, dp, R_minus_dp, R_plus_dp, libMesh::ExplicitSystem::rhs, and libMesh::System::update().

163 {
164  this->update();
165 
166  // Get the timestep size
167  deltat_vector.push_back(this->deltat);
168 
169  for (std::size_t j=0, Np = parameters_in.size(); j != Np; ++j)
170  {
171  Number old_parameter = *parameters_in[j];
172 
173  *parameters_in[j] = old_parameter - dp;
174 
175  this->assembly(true, false);
176 
177  this->rhs->close();
178 
179  std::unique_ptr<NumericVector<Number>> R_minus = this->rhs->clone();
180 
181  // The contribution at a single time step would be [f(z;p+dp) - <partialu/partialt, z>(p+dp) - <g(u),z>(p+dp)] * dt
182  // dt can vary per timestep, so its stored and multiplied separately during the integration
183  R_minus_dp.push_back(-R_minus->dot(this->get_adjoint_solution(0)));
184 
185  *parameters_in[j] = old_parameter + dp;
186 
187  this->assembly(true, false);
188 
189  this->rhs->close();
190 
191  std::unique_ptr<NumericVector<Number>> R_plus = this->rhs->clone();
192 
193  R_plus_dp.push_back(-R_plus->dot(this->get_adjoint_solution(0)));
194 
195  *parameters_in[j] = old_parameter;
196  }
197 }
std::vector< Number > deltat_vector
Definition: heatsystem.h:143
NumericVector< Number > * rhs
The system matrix.
virtual std::unique_ptr< NumericVector< T > > clone() const =0
std::vector< Number > R_plus_dp
Definition: heatsystem.h:139
Real deltat
For time-dependent problems, this is the amount delta t to advance the solution in time...
Definition: diff_system.h:278
Number dp
Definition: heatsystem.h:146
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
virtual void update()
Update the local values to reflect the solution on neighboring processors.
Definition: system.C:493
std::vector< Number > R_minus_dp
Definition: heatsystem.h:140
virtual void assembly(bool get_residual, bool get_jacobian, bool apply_heterogeneous_constraints=false, bool apply_no_constraints=false) override
Prepares matrix or rhs for matrix assembly.
Definition: fem_system.C:880

◆ point_gradient() [1/4]

Gradient libMesh::System::point_gradient ( unsigned int  var,
const Point p,
const bool  insist_on_success = true,
const NumericVector< Number > *  sol = nullptr 
) const
inherited
Returns
The gradient of the solution variable var at the physical point p in the mesh, similarly to point_value.

Definition at line 2498 of file system.C.

References libMesh::Variable::active_subdomains(), TIMPI::Communicator::broadcast(), libMesh::ParallelObject::comm(), libMesh::PointLocatorBase::enable_out_of_mesh_mode(), libMesh::System::get_dof_map(), libMesh::System::get_mesh(), libMesh::libmesh_assert(), mesh, TIMPI::Communicator::min(), libMesh::ParallelObject::n_processors(), libMesh::ParallelObject::processor_id(), libMesh::DofObject::processor_id(), and libMesh::System::variable().

Referenced by line_print(), and libMesh::System::point_gradient().

2502 {
2503  // This function must be called on every processor; there's no
2504  // telling where in the partition p falls.
2505  parallel_object_only();
2506 
2507  // And every processor had better agree about which point we're
2508  // looking for
2509 #ifndef NDEBUG
2510  libmesh_assert(this->comm().verify(p(0)));
2511 #if LIBMESH_DIM > 1
2512  libmesh_assert(this->comm().verify(p(1)));
2513 #endif
2514 #if LIBMESH_DIM > 2
2515  libmesh_assert(this->comm().verify(p(2)));
2516 #endif
2517 #endif // NDEBUG
2518 
2519  // Get a reference to the mesh object associated with the system object that calls this function
2520  const MeshBase & mesh = this->get_mesh();
2521 
2522  // Use an existing PointLocator or create a new one
2523  std::unique_ptr<PointLocatorBase> locator_ptr = mesh.sub_point_locator();
2524  PointLocatorBase & locator = *locator_ptr;
2525 
2526  if (!insist_on_success || !mesh.is_serial())
2527  locator.enable_out_of_mesh_mode();
2528 
2529  // Get a pointer to an element that contains p and allows us to
2530  // evaluate var
2531  const std::set<subdomain_id_type> & raw_subdomains =
2532  this->variable(var).active_subdomains();
2533  const std::set<subdomain_id_type> * implicit_subdomains =
2534  raw_subdomains.empty() ? nullptr : &raw_subdomains;
2535  const Elem * e = locator(p, implicit_subdomains);
2536 
2537  Gradient grad_u;
2538 
2539  if (e && this->get_dof_map().is_evaluable(*e, var))
2540  grad_u = point_gradient(var, p, *e, sol);
2541 
2542  // If I have an element containing p, then let's let everyone know
2543  processor_id_type lowest_owner =
2544  (e && (e->processor_id() == this->processor_id())) ?
2545  this->processor_id() : this->n_processors();
2546  this->comm().min(lowest_owner);
2547 
2548  // Everybody should get their value from a processor that was able
2549  // to compute it.
2550  // If nobody admits owning the point, we may have a problem.
2551  if (lowest_owner != this->n_processors())
2552  this->comm().broadcast(grad_u, lowest_owner);
2553  else
2554  libmesh_assert(!insist_on_success);
2555 
2556  return grad_u;
2557 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.h:2377
Gradient point_gradient(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition: system.C:2498
MeshBase & mesh
const Parallel::Communicator & comm() const
const MeshBase & get_mesh() const
Definition: system.h:2277
uint8_t processor_id_type
processor_id_type n_processors() const
const std::set< subdomain_id_type > & active_subdomains() const
Definition: variable.h:171
void min(const T &r, T &o, Request &req) const
NumberVectorValue Gradient
libmesh_assert(ctx)
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
processor_id_type processor_id() const
const DofMap & get_dof_map() const
Definition: system.h:2293

◆ point_gradient() [2/4]

Gradient libMesh::System::point_gradient ( unsigned int  var,
const Point p,
const Elem e,
const NumericVector< Number > *  sol = nullptr 
) const
inherited
Returns
The gradient of the solution variable var at the physical point p in local Elem e in the mesh, similarly to point_value.

Definition at line 2560 of file system.C.

References libMesh::FEInterface::compute_data(), libMesh::Elem::contains_point(), libMesh::System::current_local_solution, dim, libMesh::Elem::dim(), libMesh::DofMap::dof_indices(), libMesh::FEComputeData::dshape, libMesh::FEComputeData::enable_derivative(), libMesh::System::get_dof_map(), libMesh::System::get_equation_systems(), libMesh::FEMap::inverse_map(), libMesh::DofMap::is_evaluable(), libMesh::libmesh_assert(), libMesh::FEComputeData::local_transform, and libMesh::DofMap::variable_type().

2564 {
2565  // Ensuring that the given point is really in the element is an
2566  // expensive assert, but as long as debugging is turned on we might
2567  // as well try to catch a particularly nasty potential error
2568  libmesh_assert (e.contains_point(p));
2569 
2570  if (!sol)
2571  sol = this->current_local_solution.get();
2572 
2573  // Get the dof map to get the proper indices for our computation
2574  const DofMap & dof_map = this->get_dof_map();
2575 
2576  // write the element dimension into a separate variable.
2577  const unsigned int dim = e.dim();
2578 
2579  // Make sure we can evaluate on this element.
2580  libmesh_assert (dof_map.is_evaluable(e, var));
2581 
2582  // Need dof_indices for phi[i][j]
2583  std::vector<dof_id_type> dof_indices;
2584 
2585  // Fill in the dof_indices for our element
2586  dof_map.dof_indices (&e, dof_indices, var);
2587 
2588  // Get the no of dofs associated with this point
2589  const unsigned int num_dofs = cast_int<unsigned int>
2590  (dof_indices.size());
2591 
2592  FEType fe_type = dof_map.variable_type(var);
2593 
2594  // Map the physical co-ordinates to the master co-ordinates
2595  Point coor = FEMap::inverse_map(dim, &e, p);
2596 
2597  // get the shape function value via the FEInterface to also handle the case
2598  // of infinite elements correctly, the shape function is not fe->phi().
2599  FEComputeData fe_data(this->get_equation_systems(), coor);
2600  fe_data.enable_derivative();
2601  FEInterface::compute_data(dim, fe_type, &e, fe_data);
2602 
2603  // Get ready to accumulate a gradient
2604  Gradient grad_u;
2605 
2606  for (unsigned int l=0; l<num_dofs; l++)
2607  {
2608  // Chartesian coordinates have always LIBMESH_DIM entries,
2609  // local coordinates have as many coordinates as the element has.
2610  for (std::size_t v=0; v<dim; v++)
2611  for (std::size_t xyz=0; xyz<LIBMESH_DIM; xyz++)
2612  {
2613  // FIXME: this needs better syntax: It is matrix-vector multiplication.
2614  grad_u(xyz) += fe_data.local_transform[v][xyz]
2615  * fe_data.dshape[l](v)
2616  * (*sol)(dof_indices[l]);
2617  }
2618  }
2619 
2620  return grad_u;
2621 }
unsigned int dim
static Point inverse_map(const unsigned int dim, const Elem *elem, const Point &p, const Real tolerance=TOLERANCE, const bool secure=true, const bool extra_checks=true)
Definition: fe_map.C:1626
const EquationSystems & get_equation_systems() const
Definition: system.h:730
static void compute_data(const unsigned int dim, const FEType &fe_t, const Elem *elem, FEComputeData &data)
Lets the appropriate child of FEBase compute the requested data for the input specified in data...
NumberVectorValue Gradient
libmesh_assert(ctx)
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1585
const DofMap & get_dof_map() const
Definition: system.h:2293

◆ point_gradient() [3/4]

Gradient libMesh::System::point_gradient ( unsigned int  var,
const Point p,
const Elem e 
) const
inherited

Calls the version of point_gradient() which takes a reference.

This function exists only to prevent people from calling the version of point_gradient() that has a boolean third argument, which would result in unnecessary PointLocator calls.

Definition at line 2625 of file system.C.

References libMesh::libmesh_assert(), and libMesh::System::point_gradient().

2626 {
2627  libmesh_assert(e);
2628  return this->point_gradient(var, p, *e);
2629 }
Gradient point_gradient(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition: system.C:2498
libmesh_assert(ctx)

◆ point_gradient() [4/4]

Gradient libMesh::System::point_gradient ( unsigned int  var,
const Point p,
const NumericVector< Number > *  sol 
) const
inherited

Calls the parallel version of point_gradient().

This function exists only to prevent people from accidentally calling the version of point_gradient() that has a boolean third argument, which would result in incorrect output.

Definition at line 2633 of file system.C.

References libMesh::System::point_gradient().

2634 {
2635  return this->point_gradient(var, p, true, sol);
2636 }
Gradient point_gradient(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition: system.C:2498

◆ point_hessian() [1/4]

Tensor libMesh::System::point_hessian ( unsigned int  var,
const Point p,
const bool  insist_on_success = true,
const NumericVector< Number > *  sol = nullptr 
) const
inherited
Returns
The second derivative tensor of the solution variable var at the physical point p in the mesh, similarly to point_value.

Definition at line 2642 of file system.C.

References libMesh::Variable::active_subdomains(), TIMPI::Communicator::broadcast(), libMesh::ParallelObject::comm(), libMesh::PointLocatorBase::enable_out_of_mesh_mode(), libMesh::System::get_dof_map(), libMesh::System::get_mesh(), libMesh::libmesh_assert(), mesh, TIMPI::Communicator::min(), libMesh::ParallelObject::n_processors(), libMesh::ParallelObject::processor_id(), libMesh::DofObject::processor_id(), and libMesh::System::variable().

Referenced by libMesh::System::point_hessian().

2646 {
2647  // This function must be called on every processor; there's no
2648  // telling where in the partition p falls.
2649  parallel_object_only();
2650 
2651  // And every processor had better agree about which point we're
2652  // looking for
2653 #ifndef NDEBUG
2654  libmesh_assert(this->comm().verify(p(0)));
2655 #if LIBMESH_DIM > 1
2656  libmesh_assert(this->comm().verify(p(1)));
2657 #endif
2658 #if LIBMESH_DIM > 2
2659  libmesh_assert(this->comm().verify(p(2)));
2660 #endif
2661 #endif // NDEBUG
2662 
2663  // Get a reference to the mesh object associated with the system object that calls this function
2664  const MeshBase & mesh = this->get_mesh();
2665 
2666  // Use an existing PointLocator or create a new one
2667  std::unique_ptr<PointLocatorBase> locator_ptr = mesh.sub_point_locator();
2668  PointLocatorBase & locator = *locator_ptr;
2669 
2670  if (!insist_on_success || !mesh.is_serial())
2671  locator.enable_out_of_mesh_mode();
2672 
2673  // Get a pointer to an element that contains p and allows us to
2674  // evaluate var
2675  const std::set<subdomain_id_type> & raw_subdomains =
2676  this->variable(var).active_subdomains();
2677  const std::set<subdomain_id_type> * implicit_subdomains =
2678  raw_subdomains.empty() ? nullptr : &raw_subdomains;
2679  const Elem * e = locator(p, implicit_subdomains);
2680 
2681  Tensor hess_u;
2682 
2683  if (e && this->get_dof_map().is_evaluable(*e, var))
2684  hess_u = point_hessian(var, p, *e, sol);
2685 
2686  // If I have an element containing p, then let's let everyone know
2687  processor_id_type lowest_owner =
2688  (e && (e->processor_id() == this->processor_id())) ?
2689  this->processor_id() : this->n_processors();
2690  this->comm().min(lowest_owner);
2691 
2692  // Everybody should get their value from a processor that was able
2693  // to compute it.
2694  // If nobody admits owning the point, we may have a problem.
2695  if (lowest_owner != this->n_processors())
2696  this->comm().broadcast(hess_u, lowest_owner);
2697  else
2698  libmesh_assert(!insist_on_success);
2699 
2700  return hess_u;
2701 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.h:2377
MeshBase & mesh
const Parallel::Communicator & comm() const
const MeshBase & get_mesh() const
Definition: system.h:2277
uint8_t processor_id_type
processor_id_type n_processors() const
const std::set< subdomain_id_type > & active_subdomains() const
Definition: variable.h:171
void min(const T &r, T &o, Request &req) const
libmesh_assert(ctx)
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
NumberTensorValue Tensor
Tensor point_hessian(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition: system.C:2642
processor_id_type processor_id() const
const DofMap & get_dof_map() const
Definition: system.h:2293

◆ point_hessian() [2/4]

Tensor libMesh::System::point_hessian ( unsigned int  var,
const Point p,
const Elem e,
const NumericVector< Number > *  sol = nullptr 
) const
inherited
Returns
The second derivative tensor of the solution variable var at the physical point p in local Elem e in the mesh, similarly to point_value.

Definition at line 2703 of file system.C.

References libMesh::TypeTensor< T >::add_scaled(), libMesh::FEGenericBase< OutputType >::build(), libMesh::Elem::contains_point(), libMesh::System::current_local_solution, libMesh::Elem::dim(), libMesh::DofMap::dof_indices(), libMesh::System::get_dof_map(), libMesh::Elem::infinite(), libMesh::FEMap::inverse_map(), libMesh::DofMap::is_evaluable(), libMesh::libmesh_assert(), and libMesh::DofMap::variable_type().

2707 {
2708  // Ensuring that the given point is really in the element is an
2709  // expensive assert, but as long as debugging is turned on we might
2710  // as well try to catch a particularly nasty potential error
2711  libmesh_assert (e.contains_point(p));
2712 
2713  if (!sol)
2714  sol = this->current_local_solution.get();
2715 
2716  if (e.infinite())
2717  libmesh_not_implemented();
2718 
2719  // Get the dof map to get the proper indices for our computation
2720  const DofMap & dof_map = this->get_dof_map();
2721 
2722  // Make sure we can evaluate on this element.
2723  libmesh_assert (dof_map.is_evaluable(e, var));
2724 
2725  // Need dof_indices for phi[i][j]
2726  std::vector<dof_id_type> dof_indices;
2727 
2728  // Fill in the dof_indices for our element
2729  dof_map.dof_indices (&e, dof_indices, var);
2730 
2731  // Get the no of dofs associated with this point
2732  const unsigned int num_dofs = cast_int<unsigned int>
2733  (dof_indices.size());
2734 
2735  FEType fe_type = dof_map.variable_type(var);
2736 
2737  // Build a FE again so we can calculate u(p)
2738  std::unique_ptr<FEBase> fe (FEBase::build(e.dim(), fe_type));
2739 
2740  // Map the physical co-ordinates to the master co-ordinates
2741  // Build a vector of point co-ordinates to send to reinit
2742  std::vector<Point> coor(1, FEMap::inverse_map(e.dim(), &e, p));
2743 
2744  // Get the values of the shape function derivatives
2745  const std::vector<std::vector<RealTensor>> & d2phi = fe->get_d2phi();
2746 
2747  // Reinitialize the element and compute the shape function values at coor
2748  fe->reinit (&e, &coor);
2749 
2750  // Get ready to accumulate a hessian
2751  Tensor hess_u;
2752 
2753  for (unsigned int l=0; l<num_dofs; l++)
2754  {
2755  hess_u.add_scaled (d2phi[l][0], (*sol)(dof_indices[l]));
2756  }
2757 
2758  return hess_u;
2759 }
static Point inverse_map(const unsigned int dim, const Elem *elem, const Point &p, const Real tolerance=TOLERANCE, const bool secure=true, const bool extra_checks=true)
Definition: fe_map.C:1626
static std::unique_ptr< FEGenericBase > build(const unsigned int dim, const FEType &type)
Builds a specific finite element type.
libmesh_assert(ctx)
void add_scaled(const TypeTensor< T2 > &, const T &)
Add a scaled tensor to this tensor without creating a temporary.
Definition: type_tensor.h:851
NumberTensorValue Tensor
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1585
const DofMap & get_dof_map() const
Definition: system.h:2293

◆ point_hessian() [3/4]

Tensor libMesh::System::point_hessian ( unsigned int  var,
const Point p,
const Elem e 
) const
inherited

Calls the version of point_hessian() which takes a reference.

This function exists only to prevent people from calling the version of point_hessian() that has a boolean third argument, which would result in unnecessary PointLocator calls.

Definition at line 2763 of file system.C.

References libMesh::libmesh_assert(), and libMesh::System::point_hessian().

2764 {
2765  libmesh_assert(e);
2766  return this->point_hessian(var, p, *e);
2767 }
libmesh_assert(ctx)
Tensor point_hessian(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition: system.C:2642

◆ point_hessian() [4/4]

Tensor libMesh::System::point_hessian ( unsigned int  var,
const Point p,
const NumericVector< Number > *  sol 
) const
inherited

Calls the parallel version of point_hessian().

This function exists only to prevent people from accidentally calling the version of point_hessian() that has a boolean third argument, which would result in incorrect output.

Definition at line 2771 of file system.C.

References libMesh::System::point_hessian().

2772 {
2773  return this->point_hessian(var, p, true, sol);
2774 }
Tensor point_hessian(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition: system.C:2642

◆ point_value() [1/4]

Number libMesh::System::point_value ( unsigned int  var,
const Point p,
const bool  insist_on_success = true,
const NumericVector< Number > *  sol = nullptr 
) const
inherited
Returns
The value of the solution variable var at the physical point p in the mesh, without knowing a priori which element contains p, using the degree of freedom coefficients in sol (or in current_local_solution if sol is left null).
Note
This function uses MeshBase::sub_point_locator(); users may or may not want to call MeshBase::clear_point_locator() afterward. Also, point_locator() is expensive (N log N for initial construction, log N for evaluations). Avoid using this function in any context where you are already looping over elements.

Because the element containing p may lie on any processor, this function is parallel-only.

By default this method expects the point to reside inside the domain and will abort if no element can be found which contains p. The optional parameter insist_on_success can be set to false to allow the method to return 0 when the point is not located.

Definition at line 2369 of file system.C.

References libMesh::Variable::active_subdomains(), TIMPI::Communicator::broadcast(), libMesh::ParallelObject::comm(), libMesh::PointLocatorBase::enable_out_of_mesh_mode(), libMesh::System::get_dof_map(), libMesh::System::get_mesh(), libMesh::libmesh_assert(), mesh, TIMPI::Communicator::min(), libMesh::ParallelObject::n_processors(), libMesh::ParallelObject::processor_id(), libMesh::DofObject::processor_id(), and libMesh::System::variable().

Referenced by line_print(), main(), libMesh::System::point_value(), MeshInputTest::testCopyElementSolutionImpl(), MeshInputTest::testCopyElementVectorImpl(), MeshInputTest::testCopyNodalSolutionImpl(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), PeriodicBCTest::testPeriodicBC(), SystemsTest::testProjectCubeWithMeshFunction(), and EquationSystemsTest::testRepartitionThenReinit().

2373 {
2374  // This function must be called on every processor; there's no
2375  // telling where in the partition p falls.
2376  parallel_object_only();
2377 
2378  // And every processor had better agree about which point we're
2379  // looking for
2380 #ifndef NDEBUG
2381  libmesh_assert(this->comm().verify(p(0)));
2382 #if LIBMESH_DIM > 1
2383  libmesh_assert(this->comm().verify(p(1)));
2384 #endif
2385 #if LIBMESH_DIM > 2
2386  libmesh_assert(this->comm().verify(p(2)));
2387 #endif
2388 #endif // NDEBUG
2389 
2390  // Get a reference to the mesh object associated with the system object that calls this function
2391  const MeshBase & mesh = this->get_mesh();
2392 
2393  // Use an existing PointLocator or create a new one
2394  std::unique_ptr<PointLocatorBase> locator_ptr = mesh.sub_point_locator();
2395  PointLocatorBase & locator = *locator_ptr;
2396 
2397  if (!insist_on_success || !mesh.is_serial())
2398  locator.enable_out_of_mesh_mode();
2399 
2400  // Get a pointer to an element that contains p and allows us to
2401  // evaluate var
2402  const std::set<subdomain_id_type> & raw_subdomains =
2403  this->variable(var).active_subdomains();
2404  const std::set<subdomain_id_type> * implicit_subdomains =
2405  raw_subdomains.empty() ? nullptr : &raw_subdomains;
2406  const Elem * e = locator(p, implicit_subdomains);
2407 
2408  Number u = 0;
2409 
2410  if (e && this->get_dof_map().is_evaluable(*e, var))
2411  u = point_value(var, p, *e, sol);
2412 
2413  // If I have an element containing p, then let's let everyone know
2414  processor_id_type lowest_owner =
2415  (e && (e->processor_id() == this->processor_id())) ?
2416  this->processor_id() : this->n_processors();
2417  this->comm().min(lowest_owner);
2418 
2419  // Everybody should get their value from a processor that was able
2420  // to compute it.
2421  // If nobody admits owning the point, we have a problem.
2422  if (lowest_owner != this->n_processors())
2423  this->comm().broadcast(u, lowest_owner);
2424  else
2425  libmesh_assert(!insist_on_success);
2426 
2427  return u;
2428 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.h:2377
MeshBase & mesh
Number point_value(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition: system.C:2369
const Parallel::Communicator & comm() const
const MeshBase & get_mesh() const
Definition: system.h:2277
uint8_t processor_id_type
processor_id_type n_processors() const
const std::set< subdomain_id_type > & active_subdomains() const
Definition: variable.h:171
void min(const T &r, T &o, Request &req) const
libmesh_assert(ctx)
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
processor_id_type processor_id() const
const DofMap & get_dof_map() const
Definition: system.h:2293

◆ point_value() [2/4]

Number libMesh::System::point_value ( unsigned int  var,
const Point p,
const Elem e,
const NumericVector< Number > *  sol = nullptr 
) const
inherited
Returns
The value of the solution variable var at the physical point p contained in local Elem e, using the degree of freedom coefficients in sol (or in current_local_solution if sol is left null).

This version of point_value can be run in serial, but assumes e is in the local mesh partition or is algebraically ghosted.

Definition at line 2430 of file system.C.

References libMesh::FEInterface::compute_data(), libMesh::Elem::contains_point(), libMesh::System::current_local_solution, libMesh::Elem::dim(), libMesh::DofMap::dof_indices(), libMesh::System::get_dof_map(), libMesh::System::get_equation_systems(), libMesh::FEMap::inverse_map(), libMesh::DofMap::is_evaluable(), libMesh::libmesh_assert(), and libMesh::DofMap::variable_type().

2434 {
2435  // Ensuring that the given point is really in the element is an
2436  // expensive assert, but as long as debugging is turned on we might
2437  // as well try to catch a particularly nasty potential error
2438  libmesh_assert (e.contains_point(p));
2439 
2440  if (!sol)
2441  sol = this->current_local_solution.get();
2442 
2443  // Get the dof map to get the proper indices for our computation
2444  const DofMap & dof_map = this->get_dof_map();
2445 
2446  // Make sure we can evaluate on this element.
2447  libmesh_assert (dof_map.is_evaluable(e, var));
2448 
2449  // Need dof_indices for phi[i][j]
2450  std::vector<dof_id_type> dof_indices;
2451 
2452  // Fill in the dof_indices for our element
2453  dof_map.dof_indices (&e, dof_indices, var);
2454 
2455  // Get the no of dofs associated with this point
2456  const unsigned int num_dofs = cast_int<unsigned int>
2457  (dof_indices.size());
2458 
2459  FEType fe_type = dof_map.variable_type(var);
2460 
2461  // Map the physical co-ordinates to the master co-ordinates
2462  Point coor = FEMap::inverse_map(e.dim(), &e, p);
2463 
2464  // get the shape function value via the FEInterface to also handle the case
2465  // of infinite elements correctly, the shape function is not fe->phi().
2466  FEComputeData fe_data(this->get_equation_systems(), coor);
2467  FEInterface::compute_data(e.dim(), fe_type, &e, fe_data);
2468 
2469  // Get ready to accumulate a value
2470  Number u = 0;
2471 
2472  for (unsigned int l=0; l<num_dofs; l++)
2473  {
2474  u += fe_data.shape[l] * (*sol)(dof_indices[l]);
2475  }
2476 
2477  return u;
2478 }
static Point inverse_map(const unsigned int dim, const Elem *elem, const Point &p, const Real tolerance=TOLERANCE, const bool secure=true, const bool extra_checks=true)
Definition: fe_map.C:1626
const EquationSystems & get_equation_systems() const
Definition: system.h:730
static void compute_data(const unsigned int dim, const FEType &fe_t, const Elem *elem, FEComputeData &data)
Lets the appropriate child of FEBase compute the requested data for the input specified in data...
libmesh_assert(ctx)
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1585
const DofMap & get_dof_map() const
Definition: system.h:2293

◆ point_value() [3/4]

Number libMesh::System::point_value ( unsigned int  var,
const Point p,
const Elem e 
) const
inherited

Calls the version of point_value() which takes a reference.

This function exists only to prevent people from calling the version of point_value() that has a boolean third argument, which would result in unnecessary PointLocator calls.

Definition at line 2482 of file system.C.

References libMesh::libmesh_assert(), and libMesh::System::point_value().

2483 {
2484  libmesh_assert(e);
2485  return this->point_value(var, p, *e);
2486 }
Number point_value(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition: system.C:2369
libmesh_assert(ctx)

◆ point_value() [4/4]

Number libMesh::System::point_value ( unsigned int  var,
const Point p,
const NumericVector< Number > *  sol 
) const
inherited

Calls the parallel version of point_value().

This function exists only to prevent people from accidentally calling the version of point_value() that has a boolean third argument, which would result in incorrect output.

Definition at line 2490 of file system.C.

References libMesh::System::point_value().

2491 {
2492  return this->point_value(var, p, true, sol);
2493 }
Number point_value(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition: system.C:2369

◆ pop_physics()

void libMesh::DifferentiableSystem::pop_physics ( )
inherited

Pop a physics object off of our stack.

Definition at line 409 of file diff_system.C.

References libMesh::DifferentiableSystem::_diff_physics, libMesh::ImplicitSystem::disable_cache(), and libMesh::libmesh_assert().

Referenced by main().

410 {
411  libmesh_assert(!this->_diff_physics.empty());
412 
413  this->_diff_physics.pop();
414 
415  // If the physics has been changed, we will reassemble
416  // the matrix from scratch before doing an adjoint solve
417  // rather than just transposing
418  this->disable_cache();
419 }
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.
Definition: diff_system.h:440
libmesh_assert(ctx)
virtual void disable_cache() override
Avoids use of any cached data that might affect any solve result.

◆ postprocess()

void FEMSystem::postprocess ( void  )
overridevirtualinherited

Runs a postprocessing loop over all elements, and if postprocess_sides is true over all sides.

Reimplemented from libMesh::DifferentiableSystem.

Reimplemented in CoupledSystem, NavierSystem, LaplaceSystem, LaplaceSystem, and PoissonSystem.

Definition at line 1127 of file fem_system.C.

References libMesh::System::get_mesh(), libMesh::DifferentiableSystem::get_time_solver(), mesh, libMesh::Threads::parallel_for(), libMesh::StoredRange< iterator_type, object_type >::reset(), libMesh::TimeSolver::set_is_adjoint(), and libMesh::System::update().

Referenced by main(), PoissonSystem::postprocess(), and LaplaceSystem::postprocess().

1128 {
1129  LOG_SCOPE("postprocess()", "FEMSystem");
1130 
1131  const MeshBase & mesh = this->get_mesh();
1132 
1133  this->update();
1134 
1135  // Get the time solver object associated with the system, and tell it that
1136  // we are not solving the adjoint problem
1137  this->get_time_solver().set_is_adjoint(false);
1138 
1139  // Loop over every active mesh element on this processor
1140  Threads::parallel_for (elem_range.reset(mesh.active_local_elements_begin(),
1141  mesh.active_local_elements_end()),
1142  PostprocessContributions(*this));
1143 }
void parallel_for(const Range &range, const Body &body)
Execute the provided function object in parallel on the specified range.
Definition: threads_none.h:73
MeshBase & mesh
const MeshBase & get_mesh() const
Definition: system.h:2277
This is the MeshBase class.
Definition: mesh_base.h:74
void set_is_adjoint(bool _is_adjoint_value)
Accessor for setting whether we need to do a primal or adjoint solve.
Definition: time_solver.h:284
virtual void update()
Update the local values to reflect the solution on neighboring processors.
Definition: system.C:493
TimeSolver & get_time_solver()
Definition: diff_system.h:454

◆ print_info()

void libMesh::ReferenceCounter::print_info ( std::ostream &  out_stream = libMesh::out)
staticinherited

Prints the reference information, by default to libMesh::out.

Definition at line 81 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter, and libMesh::ReferenceCounter::get_info().

Referenced by libMesh::LibMeshInit::~LibMeshInit().

82 {
84  out_stream << ReferenceCounter::get_info();
85 }
static std::string get_info()
Gets a string containing the reference information.
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ processor_id()

processor_id_type libMesh::ParallelObject::processor_id ( ) const
inlineinherited
Returns
The rank of this processor in the group.

Definition at line 114 of file parallel_object.h.

References libMesh::ParallelObject::_communicator, and TIMPI::Communicator::rank().

Referenced by libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::BoundaryInfo::add_elements(), libMesh::DofMap::add_neighbors_to_send_list(), libMesh::DistributedMesh::add_node(), libMesh::MeshTools::Modification::all_tri(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::FEMSystem::assembly(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::Partitioner::assign_partitioning(), libMesh::Nemesis_IO_Helper::build_element_and_node_maps(), libMesh::Partitioner::build_graph(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::DistributedMesh::clear(), libMesh::DistributedMesh::clear_elems(), libMesh::ExodusII_IO_Helper::close(), libMesh::Nemesis_IO_Helper::compute_border_node_ids(), libMesh::Nemesis_IO_Helper::compute_communication_map_parameters(), libMesh::Nemesis_IO_Helper::compute_internal_and_border_elems_and_internal_nodes(), libMesh::RBConstruction::compute_max_error_bound(), libMesh::Nemesis_IO_Helper::compute_node_communication_maps(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::Nemesis_IO_Helper::construct_nemesis_filename(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::ExodusII_IO_Helper::create(), libMesh::DistributedMesh::delete_elem(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::distribute_local_dofs_node_major(), libMesh::DofMap::distribute_local_dofs_var_major(), libMesh::DofMap::distribute_scalar_dofs(), libMesh::DistributedMesh::DistributedMesh(), libMesh::DofMap::end_dof(), libMesh::DofMap::end_old_dof(), libMesh::EnsightIO::EnsightIO(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::MeshFunction::find_element(), libMesh::MeshFunction::find_elements(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::DofMap::first_dof(), libMesh::DofMap::first_old_dof(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::Nemesis_IO_Helper::get_cmap_params(), libMesh::Nemesis_IO_Helper::get_eb_info_global(), libMesh::Nemesis_IO_Helper::get_elem_cmap(), libMesh::Nemesis_IO_Helper::get_elem_map(), libMesh::MeshBase::get_info(), libMesh::DofMap::get_info(), libMesh::Nemesis_IO_Helper::get_init_global(), libMesh::Nemesis_IO_Helper::get_init_info(), libMesh::Nemesis_IO_Helper::get_loadbal_param(), libMesh::DofMap::get_local_constraints(), libMesh::Nemesis_IO_Helper::get_node_cmap(), libMesh::Nemesis_IO_Helper::get_node_map(), libMesh::Nemesis_IO_Helper::get_ns_param_global(), libMesh::Nemesis_IO_Helper::get_ss_param_global(), libMesh::SparsityPattern::Build::handle_vi_vj(), libMesh::LaplaceMeshSmoother::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), init_data(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::ExodusII_IO_Helper::initialize_element_variables(), libMesh::ExodusII_IO_Helper::initialize_global_variables(), libMesh::ExodusII_IO_Helper::initialize_nodal_variables(), libMesh::DistributedMesh::insert_elem(), libMesh::DofMap::is_evaluable(), libMesh::SparsityPattern::Build::join(), libMesh::TransientRBEvaluation::legacy_write_offline_data_to_files(), libMesh::RBSCMEvaluation::legacy_write_offline_data_to_files(), libMesh::RBEvaluation::legacy_write_offline_data_to_files(), libMesh::MeshTools::libmesh_assert_consistent_distributed(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_object_ids(), libMesh::DofMap::local_variable_indices(), main(), libMesh::MeshRefinement::make_coarsening_compatible(), AugmentSparsityOnInterface::mesh_reinit(), libMesh::TriangulatorInterface::MeshedHole::MeshedHole(), libMesh::MeshBase::n_active_local_elem(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::DofMap::n_local_dofs(), libMesh::System::n_local_dofs(), libMesh::MeshBase::n_local_elem(), libMesh::MeshBase::n_local_nodes(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::SparsityPattern::Build::operator()(), libMesh::DistributedMesh::own_node(), libMesh::BoundaryInfo::parallel_sync_node_ids(), libMesh::BoundaryInfo::parallel_sync_side_ids(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::DofMap::print_dof_constraints(), libMesh::DofMap::process_mesh_constraint_rows(), libMesh::Nemesis_IO_Helper::put_cmap_params(), libMesh::Nemesis_IO_Helper::put_elem_cmap(), libMesh::Nemesis_IO_Helper::put_elem_map(), libMesh::Nemesis_IO_Helper::put_loadbal_param(), libMesh::Nemesis_IO_Helper::put_node_cmap(), libMesh::Nemesis_IO_Helper::put_node_map(), libMesh::NameBasedIO::read(), libMesh::Nemesis_IO::read(), libMesh::XdrIO::read(), libMesh::CheckpointIO::read(), libMesh::EquationSystems::read(), libMesh::ExodusII_IO_Helper::read_elem_num_map(), libMesh::ExodusII_IO_Helper::read_global_values(), libMesh::ExodusII_IO::read_header(), libMesh::CheckpointIO::read_header(), libMesh::XdrIO::read_header(), libMesh::System::read_header(), libMesh::System::read_legacy_data(), libMesh::DynaIO::read_mesh(), libMesh::ExodusII_IO_Helper::read_node_num_map(), libMesh::System::read_parallel_data(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs_helper(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::System::read_serialized_data(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), libMesh::System::read_serialized_vectors(), libMesh::Nemesis_IO_Helper::read_var_names_impl(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DistributedMesh::renumber_nodes_and_elements(), libMesh::DofMap::scatter_constraints(), libMesh::CheckpointIO::select_split_config(), libMesh::DistributedMesh::set_next_unique_id(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::RBEIMEvaluation::side_gather_bfs(), ExodusTest< elem_type >::test_read_gold(), ExodusTest< elem_type >::test_write(), MeshInputTest::testAbaqusRead(), MeshInputTest::testCopyElementSolutionImpl(), MeshInputTest::testCopyElementVectorImpl(), MeshInputTest::testCopyNodalSolutionImpl(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), MeshInputTest::testDynaFileMappings(), MeshInputTest::testDynaNoSplines(), MeshInputTest::testDynaReadElem(), MeshInputTest::testDynaReadPatch(), MeshInputTest::testExodusFileMappings(), MeshInputTest::testExodusIGASidesets(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), MeshInputTest::testLowOrderEdgeBlocks(), SystemsTest::testProjectMatrix1D(), SystemsTest::testProjectMatrix2D(), SystemsTest::testProjectMatrix3D(), BoundaryInfoTest::testShellFaceConstraints(), MeshInputTest::testSingleElementImpl(), WriteVecAndScalar::testSolution(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), libMesh::MeshTools::total_weight(), libMesh::MeshRefinement::uniformly_coarsen(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::DTKAdapter::update_variable_values(), libMesh::NameBasedIO::write(), libMesh::XdrIO::write(), libMesh::CheckpointIO::write(), libMesh::EquationSystems::write(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO::write_element_data(), libMesh::ExodusII_IO_Helper::write_element_values(), libMesh::ExodusII_IO_Helper::write_element_values_element_major(), libMesh::ExodusII_IO_Helper::write_elements(), libMesh::ExodusII_IO_Helper::write_elemset_data(), libMesh::ExodusII_IO_Helper::write_elemsets(), libMesh::ExodusII_IO::write_global_data(), libMesh::ExodusII_IO_Helper::write_global_values(), libMesh::System::write_header(), libMesh::ExodusII_IO::write_information_records(), libMesh::ExodusII_IO_Helper::write_information_records(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::UCDIO::write_nodal_data(), libMesh::VTKIO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data_common(), libMesh::ExodusII_IO::write_nodal_data_discontinuous(), libMesh::ExodusII_IO_Helper::write_nodal_values(), libMesh::ExodusII_IO_Helper::write_nodeset_data(), libMesh::Nemesis_IO_Helper::write_nodesets(), libMesh::ExodusII_IO_Helper::write_nodesets(), libMesh::RBEIMEvaluation::write_out_interior_basis_functions(), libMesh::RBEIMEvaluation::write_out_node_basis_functions(), libMesh::RBEIMEvaluation::write_out_side_basis_functions(), write_output_solvedata(), libMesh::System::write_parallel_data(), libMesh::RBConstruction::write_riesz_representors_to_files(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bc_names(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::System::write_serialized_data(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::XdrIO::write_serialized_subdomain_names(), libMesh::System::write_serialized_vector(), libMesh::System::write_serialized_vectors(), libMesh::ExodusII_IO_Helper::write_sideset_data(), libMesh::Nemesis_IO_Helper::write_sidesets(), libMesh::ExodusII_IO_Helper::write_sidesets(), libMesh::ExodusII_IO::write_timestep(), libMesh::ExodusII_IO_Helper::write_timestep(), and libMesh::ExodusII_IO::write_timestep_discontinuous().

115  { return cast_int<processor_id_type>(_communicator.rank()); }
processor_id_type rank() const
const Parallel::Communicator & _communicator

◆ project_solution() [1/3]

void libMesh::System::project_solution ( FunctionBase< Number > *  f,
FunctionBase< Gradient > *  g = nullptr 
) const
inherited

Projects arbitrary functions onto the current solution.

This method projects an arbitrary function onto the solution via L2 projections and nodal interpolations on each element.

The function value f and its gradient g are user-provided cloneable functors. A gradient g is only required/used for projecting onto finite element spaces with continuous derivatives. If non-default Parameters are to be used, they can be provided in the parameters argument.

Definition at line 1032 of file system_projection.C.

Referenced by init_sys(), initialize(), main(), SlitMeshRefinedSystemTest::setUp(), FETestBase< order, family, elem_type, 1 >::setUp(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), MeshFunctionTest::test_subdomain_id_sets(), MeshInputTest::testCopyElementSolutionImpl(), MeshInputTest::testCopyNodalSolutionImpl(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), SystemsTest::testProjectCubeWithMeshFunction(), MeshInputTest::testProjectionRegression(), EquationSystemsTest::testRepartitionThenReinit(), and libMesh::MeshfreeSolutionTransfer::transfer().

1034 {
1035  this->project_vector(*solution, f, g);
1036 
1037  solution->localize(*current_local_solution, _dof_map->get_send_list());
1038 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2113
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1585
void project_vector(NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1) const
Projects arbitrary functions onto a vector of degree of freedom values for the current system...

◆ project_solution() [2/3]

void libMesh::System::project_solution ( FEMFunctionBase< Number > *  f,
FEMFunctionBase< Gradient > *  g = nullptr 
) const
inherited

Projects arbitrary functions onto the current solution.

This method projects an arbitrary function onto the solution via L2 projections and nodal interpolations on each element.

The function value f and its gradient g are user-provided cloneable functors. A gradient g is only required/used for projecting onto finite element spaces with continuous derivatives. If non-default Parameters are to be used, they can be provided in the parameters argument.

Definition at line 1045 of file system_projection.C.

1047 {
1048  this->project_vector(*solution, f, g);
1049 
1050  solution->localize(*current_local_solution, _dof_map->get_send_list());
1051 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2113
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1585
void project_vector(NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1) const
Projects arbitrary functions onto a vector of degree of freedom values for the current system...

◆ project_solution() [3/3]

void libMesh::System::project_solution ( ValueFunctionPointer  fptr,
GradientFunctionPointer  gptr,
const Parameters parameters 
) const
inherited

This method projects an arbitrary function onto the solution via L2 projections and nodal interpolations on each element.

Definition at line 1018 of file system_projection.C.

References fptr(), and gptr().

1021 {
1022  WrappedFunction<Number> f(*this, fptr, &parameters);
1023  WrappedFunction<Gradient> g(*this, gptr, &parameters);
1024  this->project_solution(&f, &g);
1025 }
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:80
void project_solution(FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr) const
Projects arbitrary functions onto the current solution.
Gradient gptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:95

◆ project_solution_on_reinit()

bool& libMesh::System::project_solution_on_reinit ( void  )
inlineinherited

Tells the System whether or not to project the solution vector onto new grids when the system is reinitialized.

The solution will be projected unless project_solution_on_reinit() = false is called.

Definition at line 821 of file system.h.

References libMesh::System::_solution_projection.

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), and libMesh::MemoryHistoryData::store_vectors().

822  { return _solution_projection; }
bool _solution_projection
Holds true if the solution vector should be projected onto a changed grid, false if it should be zero...
Definition: system.h:2198

◆ project_vector() [1/5]

void libMesh::System::project_vector ( NumericVector< Number > &  new_vector,
FunctionBase< Number > *  f,
FunctionBase< Gradient > *  g = nullptr,
int  is_adjoint = -1 
) const
inherited

Projects arbitrary functions onto a vector of degree of freedom values for the current system.

This method projects an arbitrary function via L2 projections and nodal interpolations on each element.

The function value f and its gradient g are user-provided cloneable functors. A gradient g is only required/used for projecting onto finite element spaces with continuous derivatives. If non-default Parameters are to be used, they can be provided in the parameters argument.

Constrain the new vector using the requested adjoint rather than primal constraints if is_adjoint is non-negative.

Definition at line 1073 of file system_projection.C.

References libMesh::libmesh_assert().

Referenced by main(), libMesh::NewmarkSolver::project_initial_accel(), libMesh::SecondOrderUnsteadySolver::project_initial_rate(), libMesh::InterMeshProjection::project_system_vectors(), and libMesh::System::restrict_vectors().

1077 {
1078  LOG_SCOPE ("project_vector(FunctionBase)", "System");
1079 
1080  libmesh_assert(f);
1081 
1082  WrappedFunctor<Number> f_fem(*f);
1083 
1084  if (g)
1085  {
1086  WrappedFunctor<Gradient> g_fem(*g);
1087 
1088  this->project_vector(new_vector, &f_fem, &g_fem, is_adjoint);
1089  }
1090  else
1091  this->project_vector(new_vector, &f_fem, nullptr, is_adjoint);
1092 }
libmesh_assert(ctx)
void project_vector(NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1) const
Projects arbitrary functions onto a vector of degree of freedom values for the current system...

◆ project_vector() [2/5]

void libMesh::System::project_vector ( NumericVector< Number > &  new_vector,
FEMFunctionBase< Number > *  f,
FEMFunctionBase< Gradient > *  g = nullptr,
int  is_adjoint = -1 
) const
inherited

Projects arbitrary functions onto a vector of degree of freedom values for the current system.

This method projects an arbitrary function via L2 projections and nodal interpolations on each element.

The function value f and its gradient g are user-provided cloneable functors. A gradient g is only required/used for projecting onto finite element spaces with continuous derivatives. If non-default Parameters are to be used, they can be provided in the parameters argument.

Constrain the new vector using the requested adjoint rather than primal constraints if is_adjoint is non-negative.

Definition at line 1099 of file system_projection.C.

References libMesh::NumericVector< T >::close(), libMesh::FEMFunctionBase< Output >::component(), libMesh::FEType::family, libMesh::Utility::iota(), libMesh::libmesh_assert(), libMesh::libmesh_ignore(), libMesh::make_range(), n_vars, libMesh::NODEELEM, libMesh::FEMContext::pre_fe_reinit(), libMesh::RATIONAL_BERNSTEIN, libMesh::SCALAR, libMesh::DofMap::SCALAR_dof_indices(), libMesh::NumericVector< T >::set(), and libMesh::Variable::type().

1103 {
1104  LOG_SCOPE ("project_fem_vector()", "System");
1105 
1106  libmesh_assert (f);
1107 
1108  ConstElemRange active_local_range
1109  (this->get_mesh().active_local_elements_begin(),
1110  this->get_mesh().active_local_elements_end() );
1111 
1112  VectorSetAction<Number> setter(new_vector);
1113 
1114  const unsigned int n_variables = this->n_vars();
1115 
1116  std::vector<unsigned int> vars(n_variables);
1117  std::iota(vars.begin(), vars.end(), 0);
1118 
1119  // Use a typedef to make the calling sequence for parallel_for() a bit more readable
1120  typedef
1121  GenericProjector<FEMFunctionWrapper<Number>, FEMFunctionWrapper<Gradient>,
1122  Number, VectorSetAction<Number>> FEMProjector;
1123 
1124  FEMFunctionWrapper<Number> fw(*f);
1125 
1126  if (g)
1127  {
1128  FEMFunctionWrapper<Gradient> gw(*g);
1129 
1130  FEMProjector projector(*this, fw, &gw, setter, vars);
1131  projector.project(active_local_range);
1132  }
1133  else
1134  {
1135  FEMProjector projector(*this, fw, nullptr, setter, vars);
1136  projector.project(active_local_range);
1137  }
1138 
1139  // Also, load values into the SCALAR dofs
1140  // Note: We assume that all SCALAR dofs are on the
1141  // processor with highest ID
1142  if (this->processor_id() == (this->n_processors()-1))
1143  {
1144  // FIXME: Do we want to first check for SCALAR vars before building this? [PB]
1145  FEMContext context( *this );
1146 
1147  const DofMap & dof_map = this->get_dof_map();
1148  for (auto var : make_range(this->n_vars()))
1149  if (this->variable(var).type().family == SCALAR)
1150  {
1151  // FIXME: We reinit with an arbitrary element in case the user
1152  // doesn't override FEMFunctionBase::component. Is there
1153  // any use case we're missing? [PB]
1154  context.pre_fe_reinit(*this, *(this->get_mesh().active_local_elements_begin()));
1155 
1156  std::vector<dof_id_type> SCALAR_indices;
1157  dof_map.SCALAR_dof_indices (SCALAR_indices, var);
1158  const unsigned int n_SCALAR_dofs =
1159  cast_int<unsigned int>(SCALAR_indices.size());
1160 
1161  for (unsigned int i=0; i<n_SCALAR_dofs; i++)
1162  {
1163  const dof_id_type global_index = SCALAR_indices[i];
1164  const unsigned int component_index =
1165  this->variable_scalar_number(var,i);
1166 
1167  new_vector.set(global_index, f->component(context, component_index, Point(), this->time));
1168  }
1169  }
1170  }
1171 
1172  new_vector.close();
1173 
1174  // Look for spline bases, in which case we need to backtrack
1175  // to calculate the spline DoF values.
1176  std::vector<const Variable *> rational_vars;
1177  for (auto varnum : vars)
1178  {
1179  const Variable & var = this->get_dof_map().variable(varnum);
1180  if (var.type().family == RATIONAL_BERNSTEIN)
1181  rational_vars.push_back(&var);
1182  }
1183 
1184  // Okay, but are we really using any *spline* bases, or just
1185  // unconstrained rational bases?
1186  bool using_spline_bases = false;
1187  if (!rational_vars.empty())
1188  {
1189  // Look for a spline node: a NodeElem with a rational variable
1190  // on it.
1191  for (auto & elem : active_local_range)
1192  if (elem->type() == NODEELEM)
1193  for (auto rational_var : rational_vars)
1194  if (rational_var->active_on_subdomain(elem->subdomain_id()))
1195  {
1196  using_spline_bases = true;
1197  goto checked_on_splines;
1198  }
1199  }
1200 
1201 checked_on_splines:
1202 
1203  // Not every processor may have a NodeElem, especially while
1204  // we're not partitioning them efficiently yet.
1205  this->comm().max(using_spline_bases);
1206 
1207  if (using_spline_bases)
1208  this->solve_for_unconstrained_dofs(new_vector, is_adjoint);
1209 
1210 #ifdef LIBMESH_ENABLE_CONSTRAINTS
1211  if (is_adjoint == -1)
1212  this->get_dof_map().enforce_constraints_exactly(*this, &new_vector);
1213  else if (is_adjoint >= 0)
1215  is_adjoint);
1216 #else
1217  libmesh_ignore(is_adjoint);
1218 #endif
1219 }
Real time
For time-dependent problems, this is the time t at the beginning of the current timestep.
Definition: system.h:1595
unsigned int variable_scalar_number(std::string_view var, unsigned int component) const
Definition: system.h:2408
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.h:2377
const Parallel::Communicator & comm() const
const MeshBase & get_mesh() const
Definition: system.h:2277
void iota(ForwardIter first, ForwardIter last, T value)
Utility::iota was created back when std::iota was just an SGI STL extension.
Definition: utility.h:229
StoredRange< MeshBase::const_element_iterator, const Elem * > ConstElemRange
Definition: elem_range.h:34
void enforce_adjoint_constraints_exactly(NumericVector< Number > &v, unsigned int q) const
Heterogeneously constrains the numeric vector v, which represents an adjoint solution defined on the ...
Definition: dof_map.h:2278
processor_id_type n_processors() const
void libmesh_ignore(const Args &...)
const Variable & variable(const unsigned int c) const
Definition: dof_map.h:2114
libmesh_assert(ctx)
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
void max(const T &r, T &o, Request &req) const
virtual Output component(const FEMContext &, unsigned int i, const Point &p, Real time=0.)
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
virtual void set(const numeric_index_type i, const T value)=0
Sets v(i) = value.
unsigned int n_vars() const
Definition: system.h:2349
processor_id_type processor_id() const
const DofMap & get_dof_map() const
Definition: system.h:2293
void solve_for_unconstrained_dofs(NumericVector< Number > &, int is_adjoint=-1) const
uint8_t dof_id_type
Definition: id_types.h:67
void enforce_constraints_exactly(const System &system, NumericVector< Number > *v=nullptr, bool homogeneous=false) const
Constrains the numeric vector v, which represents a solution defined on the mesh. ...
Definition: dof_map.h:2274

◆ project_vector() [3/5]

void libMesh::System::project_vector ( ValueFunctionPointer  fptr,
GradientFunctionPointer  gptr,
const Parameters parameters,
NumericVector< Number > &  new_vector,
int  is_adjoint = -1 
) const
inherited

Projects arbitrary functions onto a vector of degree of freedom values for the current system.

This method projects an arbitrary function via L2 projections and nodal interpolations on each element.

The function value fptr and its gradient gptr are represented by function pointers. A gradient gptr is only required/used for projecting onto finite element spaces with continuous derivatives.

Constrain the new vector using the requested adjoint rather than primal constraints if is_adjoint is non-negative.

Definition at line 1058 of file system_projection.C.

References fptr(), and gptr().

1063 {
1064  WrappedFunction<Number> f(*this, fptr, &parameters);
1065  WrappedFunction<Gradient> g(*this, gptr, &parameters);
1066  this->project_vector(new_vector, &f, &g, is_adjoint);
1067 }
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:80
Gradient gptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:95
void project_vector(NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1) const
Projects arbitrary functions onto a vector of degree of freedom values for the current system...

◆ project_vector() [4/5]

void libMesh::System::project_vector ( NumericVector< Number > &  vector,
int  is_adjoint = -1 
) const
protectedinherited

Projects the vector defined on the old mesh onto the new mesh.

Constrain the new vector using the requested adjoint rather than primal constraints if is_adjoint is non-negative.

Definition at line 247 of file system_projection.C.

References libMesh::NumericVector< T >::clone().

249 {
250  // Create a copy of the vector, which currently
251  // contains the old data.
252  std::unique_ptr<NumericVector<Number>>
253  old_vector (vector.clone());
254 
255  // Project the old vector to the new vector
256  this->project_vector (*old_vector, vector, is_adjoint);
257 }
virtual std::unique_ptr< NumericVector< T > > clone() const =0
void project_vector(NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1) const
Projects arbitrary functions onto a vector of degree of freedom values for the current system...

◆ project_vector() [5/5]

void libMesh::System::project_vector ( const NumericVector< Number > &  old_v,
NumericVector< Number > &  new_v,
int  is_adjoint = -1 
) const
protectedinherited

Projects the vector defined on the old mesh onto the new mesh.

This method projects the vector via L2 projections or nodal interpolations on each element.

The original vector is unchanged and the new vector is passed through the second argument.

Constrain the new vector using the requested adjoint rather than primal constraints if is_adjoint is non-negative.

This method projects a solution from an old mesh to a current, refined mesh. The input vector old_v gives the solution on the old mesh, while the new_v gives the solution (to be computed) on the new mesh.

Definition at line 265 of file system_projection.C.

References libMesh::NumericVector< T >::clear(), libMesh::NumericVector< T >::close(), libMesh::NumericVector< T >::get(), libMesh::GHOSTED, libMesh::index_range(), libMesh::NumericVector< T >::init(), libMesh::Utility::iota(), libMesh::libmesh_assert(), libMesh::libmesh_ignore(), libMesh::NumericVector< T >::local_size(), libMesh::NumericVector< T >::localize(), libMesh::make_range(), n_vars, libMesh::PARALLEL, libMesh::Threads::parallel_reduce(), libMesh::SCALAR, libMesh::DofMap::SCALAR_dof_indices(), libMesh::BuildProjectionList::send_list, libMesh::SERIAL, libMesh::NumericVector< T >::set(), libMesh::NumericVector< T >::size(), libMesh::NumericVector< T >::type(), libMesh::TYPE_SCALAR, and libMesh::BuildProjectionList::unique().

268 {
269  LOG_SCOPE ("project_vector(old,new)", "System");
270 
277  new_v.clear();
278 
279 #ifdef LIBMESH_ENABLE_AMR
280 
281  // Resize the new vector and get a serial version.
282  NumericVector<Number> * new_vector_ptr = nullptr;
283  std::unique_ptr<NumericVector<Number>> new_vector_built;
284  NumericVector<Number> * local_old_vector;
285  std::unique_ptr<NumericVector<Number>> local_old_vector_built;
286  const NumericVector<Number> * old_vector_ptr = nullptr;
287 
288  ConstElemRange active_local_elem_range
289  (this->get_mesh().active_local_elements_begin(),
290  this->get_mesh().active_local_elements_end());
291 
292  // If the old vector was uniprocessor, make the new
293  // vector uniprocessor
294  if (old_v.type() == SERIAL)
295  {
296  new_v.init (this->n_dofs(), false, SERIAL);
297  new_vector_ptr = &new_v;
298  old_vector_ptr = &old_v;
299  }
300 
301  // Otherwise it is a parallel, distributed vector, which
302  // we need to localize.
303  else if (old_v.type() == PARALLEL)
304  {
305  // Build a send list for efficient localization
306  BuildProjectionList projection_list(*this);
307  Threads::parallel_reduce (active_local_elem_range,
308  projection_list);
309 
310  // Create a sorted, unique send_list
311  projection_list.unique();
312 
313  new_v.init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
314  new_vector_built = NumericVector<Number>::build(this->comm());
315  local_old_vector_built = NumericVector<Number>::build(this->comm());
316  new_vector_ptr = new_vector_built.get();
317  local_old_vector = local_old_vector_built.get();
318  new_vector_ptr->init(this->n_dofs(), this->n_local_dofs(),
319  this->get_dof_map().get_send_list(), false,
320  GHOSTED);
321  local_old_vector->init(old_v.size(), old_v.local_size(),
322  projection_list.send_list, false, GHOSTED);
323  old_v.localize(*local_old_vector, projection_list.send_list);
324  local_old_vector->close();
325  old_vector_ptr = local_old_vector;
326  }
327  else if (old_v.type() == GHOSTED)
328  {
329  // Build a send list for efficient localization
330  BuildProjectionList projection_list(*this);
331  Threads::parallel_reduce (active_local_elem_range,
332  projection_list);
333 
334  // Create a sorted, unique send_list
335  projection_list.unique();
336 
337  new_v.init (this->n_dofs(), this->n_local_dofs(),
338  this->get_dof_map().get_send_list(), false, GHOSTED);
339 
340  local_old_vector_built = NumericVector<Number>::build(this->comm());
341  new_vector_ptr = &new_v;
342  local_old_vector = local_old_vector_built.get();
343  local_old_vector->init(old_v.size(), old_v.local_size(),
344  projection_list.send_list, false, GHOSTED);
345  old_v.localize(*local_old_vector, projection_list.send_list);
346  local_old_vector->close();
347  old_vector_ptr = local_old_vector;
348  }
349  else // unknown old_v.type()
350  libmesh_error_msg("ERROR: Unknown old_v.type() == " << old_v.type());
351 
352  // Note that the above will have zeroed the new_vector.
353  // Just to be sure, assert that new_vector_ptr and old_vector_ptr
354  // were successfully set before trying to deref them.
355  libmesh_assert(new_vector_ptr);
356  libmesh_assert(old_vector_ptr);
357 
358  NumericVector<Number> & new_vector = *new_vector_ptr;
359  const NumericVector<Number> & old_vector = *old_vector_ptr;
360 
361  const unsigned int n_variables = this->n_vars();
362 
363  if (n_variables)
364  {
365  std::vector<unsigned int> vars(n_variables);
366  std::iota(vars.begin(), vars.end(), 0);
367  std::vector<unsigned int> regular_vars, vector_vars;
368  for (auto var : vars)
369  {
371  regular_vars.push_back(var);
372  else
373  vector_vars.push_back(var);
374  }
375 
376  // Use a typedef to make the calling sequence for parallel_for() a bit more readable
377  typedef
378  GenericProjector<OldSolutionValue<Number, &FEMContext::point_value>,
379  OldSolutionValue<Gradient, &FEMContext::point_gradient>,
380  Number, VectorSetAction<Number>> FEMProjector;
381 
382  OldSolutionValue<Number, &FEMContext::point_value> f(*this, old_vector, &regular_vars);
383  OldSolutionValue<Gradient, &FEMContext::point_gradient> g(*this, old_vector, &regular_vars);
384  VectorSetAction<Number> setter(new_vector);
385 
386  FEMProjector projector(*this, f, &g, setter, regular_vars);
387  projector.project(active_local_elem_range);
388 
389  typedef
390  GenericProjector<OldSolutionValue<Gradient, &FEMContext::point_value>,
391  OldSolutionValue<Tensor, &FEMContext::point_gradient>,
392  Gradient, VectorSetAction<Number>> FEMVectorProjector;
393 
394  OldSolutionValue<Gradient, &FEMContext::point_value> f_vector(*this, old_vector, &vector_vars);
395  OldSolutionValue<Tensor, &FEMContext::point_gradient> g_vector(*this, old_vector, &vector_vars);
396 
397  FEMVectorProjector vector_projector(*this, f_vector, &g_vector, setter, vector_vars);
398  vector_projector.project(active_local_elem_range);
399 
400  // Copy the SCALAR dofs from old_vector to new_vector
401  // Note: We assume that all SCALAR dofs are on the
402  // processor with highest ID
403  if (this->processor_id() == (this->n_processors()-1))
404  {
405  const DofMap & dof_map = this->get_dof_map();
406  for (auto var : make_range(this->n_vars()))
407  if (this->variable(var).type().family == SCALAR)
408  {
409  // We can just map SCALAR dofs directly across
410  std::vector<dof_id_type> new_SCALAR_indices, old_SCALAR_indices;
411  dof_map.SCALAR_dof_indices (new_SCALAR_indices, var, false);
412  dof_map.SCALAR_dof_indices (old_SCALAR_indices, var, true);
413  for (auto i : index_range(new_SCALAR_indices))
414  new_vector.set(new_SCALAR_indices[i], old_vector(old_SCALAR_indices[i]));
415  }
416  }
417  }
418 
419  new_vector.close();
420 
421  // If the old vector was serial, we probably need to send our values
422  // to other processors
423  //
424  // FIXME: I'm not sure how to make a NumericVector do that without
425  // creating a temporary parallel vector to use localize! - RHS
426  if (old_v.type() == SERIAL)
427  {
428  std::unique_ptr<NumericVector<Number>> dist_v = NumericVector<Number>::build(this->comm());
429  dist_v->init(this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
430  dist_v->close();
431 
432  for (auto i : make_range(dist_v->size()))
433  if (new_vector(i) != 0.0)
434  dist_v->set(i, new_vector(i));
435 
436  dist_v->close();
437 
438  dist_v->localize (new_v, this->get_dof_map().get_send_list());
439  new_v.close();
440  }
441  // If the old vector was parallel, we need to update it
442  // and free the localized copies
443  else if (old_v.type() == PARALLEL)
444  {
445  // We may have to set dof values that this processor doesn't
446  // own in certain special cases, like LAGRANGE FIRST or
447  // HERMITE THIRD elements on second-order meshes?
448  new_v = new_vector;
449  new_v.close();
450  }
451 
452 
453  // Apply constraints only if we we are asked to
454  if(this->project_with_constraints)
455  {
456  if (is_adjoint == -1)
457  {
458  this->get_dof_map().enforce_constraints_exactly(*this, &new_v);
459  }
460  else if (is_adjoint >= 0)
461  {
463  is_adjoint);
464  }
465  }
466 #else
467 
468  // AMR is disabled: simply copy the vector
469  new_v = old_v;
470 
471  libmesh_ignore(is_adjoint);
472 
473 #endif // #ifdef LIBMESH_ENABLE_AMR
474 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.h:2377
virtual void get(const std::vector< numeric_index_type > &index, T *values) const
Access multiple components at once.
virtual numeric_index_type size() const =0
static FEFieldType field_type(const FEType &fe_type)
const Parallel::Communicator & comm() const
dof_id_type n_local_dofs() const
Definition: system.C:150
const MeshBase & get_mesh() const
Definition: system.h:2277
virtual void init(const numeric_index_type n, const numeric_index_type n_local, const bool fast=false, const ParallelType ptype=AUTOMATIC)=0
Change the dimension of the vector to n.
void iota(ForwardIter first, ForwardIter last, T value)
Utility::iota was created back when std::iota was just an SGI STL extension.
Definition: utility.h:229
dof_id_type n_dofs() const
Definition: system.C:113
StoredRange< MeshBase::const_element_iterator, const Elem * > ConstElemRange
Definition: elem_range.h:34
void enforce_adjoint_constraints_exactly(NumericVector< Number > &v, unsigned int q) const
Heterogeneously constrains the numeric vector v, which represents an adjoint solution defined on the ...
Definition: dof_map.h:2278
processor_id_type n_processors() const
void libmesh_ignore(const Args &...)
NumberVectorValue Gradient
bool project_with_constraints
Do we want to apply constraints while projecting vectors ?
Definition: system.h:2253
libmesh_assert(ctx)
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package())
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
ParallelType type() const
const FEType & variable_type(const unsigned int i) const
Definition: system.h:2427
virtual numeric_index_type local_size() const =0
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
void parallel_reduce(const Range &range, Body &body)
Execute the provided reduction operation in parallel on the specified range.
Definition: threads_none.h:101
virtual void clear()
Restores the NumericVector<T> to a pristine state.
unsigned int n_vars() const
Definition: system.h:2349
processor_id_type processor_id() const
const DofMap & get_dof_map() const
Definition: system.h:2293
template class LIBMESH_EXPORT NumericVector< Number >
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:111
void enforce_constraints_exactly(const System &system, NumericVector< Number > *v=nullptr, bool homogeneous=false) const
Constrains the numeric vector v, which represents a solution defined on the mesh. ...
Definition: dof_map.h:2274
virtual void localize(std::vector< T > &v_local) const =0
Creates a copy of the global vector in the local vector v_local.

◆ projection_matrix()

void libMesh::System::projection_matrix ( SparseMatrix< Number > &  proj_mat) const
inherited

This method creates a projection matrix which corresponds to the operation of project_vector between old and new solution spaces.

Heterogeneous Dirichlet boundary conditions are not taken into account here; if this matrix is used for prolongation (mesh refinement) on a side with a heterogeneous BC, the newly created degrees of freedom on that side will still match the coarse grid approximation of the BC, not the fine grid approximation.

Definition at line 952 of file system_projection.C.

References libMesh::Utility::iota(), libMesh::make_range(), n_vars, libMesh::SCALAR, libMesh::DofMap::SCALAR_dof_indices(), and libMesh::SparseMatrix< T >::set().

Referenced by libMesh::PetscDMWrapper::init_and_attach_petscdm(), SystemsTest::testProjectMatrix1D(), SystemsTest::testProjectMatrix2D(), and SystemsTest::testProjectMatrix3D().

953 {
954  LOG_SCOPE ("projection_matrix()", "System");
955 
956  const unsigned int n_variables = this->n_vars();
957 
958  if (n_variables)
959  {
960  ConstElemRange active_local_elem_range
961  (this->get_mesh().active_local_elements_begin(),
962  this->get_mesh().active_local_elements_end());
963 
964  std::vector<unsigned int> vars(n_variables);
965  std::iota(vars.begin(), vars.end(), 0);
966 
967  // Use a typedef to make the calling sequence for parallel_for() a bit more readable
968  typedef OldSolutionCoefs<Real, &FEMContext::point_value> OldSolutionValueCoefs;
969  typedef OldSolutionCoefs<RealGradient, &FEMContext::point_gradient> OldSolutionGradientCoefs;
970 
971  typedef
972  GenericProjector<OldSolutionValueCoefs,
973  OldSolutionGradientCoefs,
974  DynamicSparseNumberArray<Real,dof_id_type>,
975  MatrixFillAction<Real, Number> > ProjMatFiller;
976 
977  OldSolutionValueCoefs f(*this, &vars);
978  OldSolutionGradientCoefs g(*this, &vars);
979  MatrixFillAction<Real, Number> setter(proj_mat);
980 
981  ProjMatFiller mat_filler(*this, f, &g, setter, vars);
982  mat_filler.project(active_local_elem_range);
983 
984  // Set the SCALAR dof transfer entries too.
985  // Note: We assume that all SCALAR dofs are on the
986  // processor with highest ID
987  if (this->processor_id() == (this->n_processors()-1))
988  {
989  const DofMap & dof_map = this->get_dof_map();
990  for (auto var : make_range(this->n_vars()))
991  if (this->variable(var).type().family == SCALAR)
992  {
993  // We can just map SCALAR dofs directly across
994  std::vector<dof_id_type> new_SCALAR_indices, old_SCALAR_indices;
995  dof_map.SCALAR_dof_indices (new_SCALAR_indices, var, false);
996  dof_map.SCALAR_dof_indices (old_SCALAR_indices, var, true);
997  const unsigned int new_n_dofs =
998  cast_int<unsigned int>(new_SCALAR_indices.size());
999 
1000  for (unsigned int i=0; i<new_n_dofs; i++)
1001  {
1002  proj_mat.set( new_SCALAR_indices[i],
1003  old_SCALAR_indices[i], 1);
1004  }
1005  }
1006  }
1007  }
1008 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.h:2377
const MeshBase & get_mesh() const
Definition: system.h:2277
void iota(ForwardIter first, ForwardIter last, T value)
Utility::iota was created back when std::iota was just an SGI STL extension.
Definition: utility.h:229
StoredRange< MeshBase::const_element_iterator, const Elem * > ConstElemRange
Definition: elem_range.h:34
virtual void set(const numeric_index_type i, const numeric_index_type j, const T value)=0
Set the element (i,j) to value.
processor_id_type n_processors() const
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
unsigned int n_vars() const
Definition: system.h:2349
processor_id_type processor_id() const
const DofMap & get_dof_map() const
Definition: system.h:2293

◆ prolong_vectors()

void libMesh::System::prolong_vectors ( )
virtualinherited

Prolong vectors after the mesh has refined.

Definition at line 436 of file system.C.

References libMesh::System::restrict_vectors().

Referenced by libMesh::EquationSystems::reinit_solutions().

437 {
438 #ifdef LIBMESH_ENABLE_AMR
439  // Currently project_vector handles both restriction and prolongation
440  this->restrict_vectors();
441 #endif
442 }
virtual void restrict_vectors()
Restrict vectors after the mesh has coarsened.
Definition: system.C:378

◆ push_physics()

void libMesh::DifferentiableSystem::push_physics ( DifferentiablePhysics new_physics)
inherited

Push a clone of a new physics object onto our stack, overriding the current physics until the new physics is popped off again (or until something else is pushed on top of it).

Definition at line 397 of file diff_system.C.

References libMesh::DifferentiableSystem::_diff_physics, libMesh::DifferentiablePhysics::clone_physics(), and libMesh::ImplicitSystem::disable_cache().

Referenced by main().

398 {
399  this->_diff_physics.push(new_physics.clone_physics());
400 
401  // If the physics has been changed, we will reassemble
402  // the matrix from scratch before doing an adjoint solve
403  // rather than just transposing
404  this->disable_cache();
405 }
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.
Definition: diff_system.h:440
virtual void disable_cache() override
Avoids use of any cached data that might affect any solve result.

◆ qoi_parameter_hessian()

void libMesh::ImplicitSystem::qoi_parameter_hessian ( const QoISet qoi_indices,
const ParameterVector parameters,
SensitivityData hessian 
)
overridevirtualinherited

For each of the system's quantities of interest q in qoi[qoi_indices], and for a vector of parameters p, the parameter sensitivity Hessian H_ij is defined as H_ij = (d^2 q)/(d p_i d p_j) This Hessian is the output of this method, where for each q_i, H_jk is stored in hessian.second_derivative(i,j,k).

Note that in some cases only current_local_solution is used during assembly, and, therefore, if solution has been altered without update() being called, then the user must call update() before calling this function.

Reimplemented from libMesh::System.

Definition at line 895 of file implicit_system.C.

References libMesh::ImplicitSystem::adjoint_solve(), libMesh::SensitivityData::allocate_hessian_data(), libMesh::ExplicitSystem::assemble_qoi(), libMesh::ExplicitSystem::assemble_qoi_derivative(), libMesh::ImplicitSystem::assembly(), libMesh::NumericVector< T >::close(), libMesh::SparseMatrix< T >::close(), libMesh::NumericVector< T >::dot(), libMesh::System::get_adjoint_rhs(), libMesh::System::get_adjoint_solution(), libMesh::System::get_qoi_value(), libMesh::System::get_qoi_values(), libMesh::System::get_sensitivity_solution(), libMesh::QoISet::has_index(), libMesh::System::is_adjoint_already_solved(), libMesh::ImplicitSystem::matrix, libMesh::System::n_qois(), libMesh::Real, libMesh::ExplicitSystem::rhs, libMesh::SensitivityData::second_derivative(), libMesh::ImplicitSystem::sensitivity_solve(), libMesh::ParameterVector::size(), libMesh::System::solution, libMesh::TOLERANCE, libMesh::System::update(), and libMesh::SparseMatrix< T >::vector_mult().

898 {
899  // We currently get partial derivatives via finite differencing
900  const Real delta_p = TOLERANCE;
901 
902  ParameterVector & parameters =
903  const_cast<ParameterVector &>(parameters_in);
904 
905  // We'll use one temporary vector for matrix-vector-vector products
906  std::unique_ptr<NumericVector<Number>> tempvec = this->solution->zero_clone();
907 
908  // And another temporary vector to hold a copy of the true solution
909  // so we can safely perturb this->solution.
910  std::unique_ptr<NumericVector<Number>> oldsolution = this->solution->clone();
911 
912  const unsigned int Np = cast_int<unsigned int>
913  (parameters.size());
914  const unsigned int Nq = this->n_qois();
915 
916  // For each quantity of interest q, the parameter sensitivity
917  // Hessian is defined as q''_{kl} = {d^2 q}/{d p_k d p_l}.
918  //
919  // We calculate it from values and partial derivatives of the
920  // quantity of interest function Q, solution u, adjoint solution z,
921  // and residual R, as:
922  //
923  // q''_{kl} =
924  // Q''_{kl} + Q''_{uk}(u)*u'_l + Q''_{ul}(u) * u'_k +
925  // Q''_{uu}(u)*u'_k*u'_l -
926  // R''_{kl}(u,z) -
927  // R''_{uk}(u,z)*u'_l - R''_{ul}(u,z)*u'_k -
928  // R''_{uu}(u,z)*u'_k*u'_l
929  //
930  // See the adjoints model document for more details.
931 
932  // We first do an adjoint solve to get z for each quantity of
933  // interest
934  // if we haven't already or dont have an initial condition for the adjoint
935  if (!this->is_adjoint_already_solved())
936  {
937  this->adjoint_solve(qoi_indices);
938  }
939 
940  // And a sensitivity solve to get u_k for each parameter
941  this->sensitivity_solve(parameters);
942 
943  // Get ready to fill in second derivatives:
944  sensitivities.allocate_hessian_data(qoi_indices, *this, parameters);
945 
946  for (unsigned int k=0; k != Np; ++k)
947  {
948  Number old_parameterk = *parameters[k];
949 
950  // The Hessian is symmetric, so we just calculate the lower
951  // triangle and the diagonal, and we get the upper triangle from
952  // the transpose of the lower
953 
954  for (unsigned int l=0; l != k+1; ++l)
955  {
956  // The second partial derivatives with respect to parameters
957  // are all calculated via a central finite difference
958  // stencil:
959  // F''_{kl} ~= (F(p+dp*e_k+dp*e_l) - F(p+dp*e_k-dp*e_l) -
960  // F(p-dp*e_k+dp*e_l) + F(p-dp*e_k-dp*e_l))/(4*dp^2)
961  // We will add Q''_{kl}(u) and subtract R''_{kl}(u,z) at the
962  // same time.
963  //
964  // We have to be careful with the perturbations to handle
965  // the k=l case
966 
967  Number old_parameterl = *parameters[l];
968 
969  *parameters[k] += delta_p;
970  *parameters[l] += delta_p;
971  this->assemble_qoi(qoi_indices);
972  this->assembly(true, false, true);
973  this->rhs->close();
974  std::vector<Number> partial2q_term = this->get_qoi_values();
975  std::vector<Number> partial2R_term(this->n_qois());
976  for (unsigned int i=0; i != Nq; ++i)
977  if (qoi_indices.has_index(i))
978  partial2R_term[i] = this->rhs->dot(this->get_adjoint_solution(i));
979 
980  *parameters[l] -= 2.*delta_p;
981  this->assemble_qoi(qoi_indices);
982  this->assembly(true, false, true);
983  this->rhs->close();
984  for (unsigned int i=0; i != Nq; ++i)
985  if (qoi_indices.has_index(i))
986  {
987  partial2q_term[i] -= this->get_qoi_value(i);
988  partial2R_term[i] -= this->rhs->dot(this->get_adjoint_solution(i));
989  }
990 
991  *parameters[k] -= 2.*delta_p;
992  this->assemble_qoi(qoi_indices);
993  this->assembly(true, false, true);
994  this->rhs->close();
995  for (unsigned int i=0; i != Nq; ++i)
996  if (qoi_indices.has_index(i))
997  {
998  partial2q_term[i] += this->get_qoi_value(i);
999  partial2R_term[i] += this->rhs->dot(this->get_adjoint_solution(i));
1000  }
1001 
1002  *parameters[l] += 2.*delta_p;
1003  this->assemble_qoi(qoi_indices);
1004  this->assembly(true, false, true);
1005  this->rhs->close();
1006  for (unsigned int i=0; i != Nq; ++i)
1007  if (qoi_indices.has_index(i))
1008  {
1009  partial2q_term[i] -= this->get_qoi_value(i);
1010  partial2R_term[i] -= this->rhs->dot(this->get_adjoint_solution(i));
1011  partial2q_term[i] /= (4. * delta_p * delta_p);
1012  partial2R_term[i] /= (4. * delta_p * delta_p);
1013  }
1014 
1015  for (unsigned int i=0; i != Nq; ++i)
1016  if (qoi_indices.has_index(i))
1017  {
1018  Number current_terms = partial2q_term[i] - partial2R_term[i];
1019  sensitivities.second_derivative(i,k,l) += current_terms;
1020  if (k != l)
1021  sensitivities.second_derivative(i,l,k) += current_terms;
1022  }
1023 
1024  // Don't leave the parameters perturbed
1025  *parameters[l] = old_parameterl;
1026  *parameters[k] = old_parameterk;
1027  }
1028 
1029  // We get (partial q / partial u) and
1030  // (partial R / partial u) from the user, but centrally
1031  // difference to get q_uk and R_uk terms:
1032  // (partial^2 q / partial u partial k)
1033  // q_uk*u'_l = (q_u(p+dp*e_k)*u'_l - q_u(p-dp*e_k)*u'_l)/(2*dp)
1034  // R_uk*z*u'_l = (R_u(p+dp*e_k)*z*u'_l - R_u(p-dp*e_k)*z*u'_l)/(2*dp)
1035  //
1036  // To avoid creating Nq temporary vectors, we add these
1037  // subterms to the sensitivities output one by one.
1038  //
1039  // FIXME: this is probably a bad order of operations for
1040  // controlling floating point error.
1041 
1042  *parameters[k] = old_parameterk + delta_p;
1043  this->assembly(false, true);
1044  this->matrix->close();
1045  this->assemble_qoi_derivative(qoi_indices,
1046  /* include_liftfunc = */ true,
1047  /* apply_constraints = */ false);
1048 
1049  for (unsigned int l=0; l != Np; ++l)
1050  {
1051  this->matrix->vector_mult(*tempvec, this->get_sensitivity_solution(l));
1052  for (unsigned int i=0; i != Nq; ++i)
1053  if (qoi_indices.has_index(i))
1054  {
1055  this->get_adjoint_rhs(i).close();
1056  Number current_terms =
1057  (this->get_adjoint_rhs(i).dot(this->get_sensitivity_solution(l)) -
1058  tempvec->dot(this->get_adjoint_solution(i))) / (2.*delta_p);
1059  sensitivities.second_derivative(i,k,l) += current_terms;
1060 
1061  // We use the _uk terms twice; symmetry lets us reuse
1062  // these calculations for the _ul terms.
1063 
1064  sensitivities.second_derivative(i,l,k) += current_terms;
1065  }
1066  }
1067 
1068  *parameters[k] = old_parameterk - delta_p;
1069  this->assembly(false, true);
1070  this->matrix->close();
1071  this->assemble_qoi_derivative(qoi_indices,
1072  /* include_liftfunc = */ true,
1073  /* apply_constraints = */ false);
1074 
1075  for (unsigned int l=0; l != Np; ++l)
1076  {
1077  this->matrix->vector_mult(*tempvec, this->get_sensitivity_solution(l));
1078  for (unsigned int i=0; i != Nq; ++i)
1079  if (qoi_indices.has_index(i))
1080  {
1081  this->get_adjoint_rhs(i).close();
1082  Number current_terms =
1083  (-this->get_adjoint_rhs(i).dot(this->get_sensitivity_solution(l)) +
1084  tempvec->dot(this->get_adjoint_solution(i))) / (2.*delta_p);
1085  sensitivities.second_derivative(i,k,l) += current_terms;
1086 
1087  // We use the _uk terms twice; symmetry lets us reuse
1088  // these calculations for the _ul terms.
1089 
1090  sensitivities.second_derivative(i,l,k) += current_terms;
1091  }
1092  }
1093 
1094  // Don't leave the parameter perturbed
1095  *parameters[k] = old_parameterk;
1096 
1097  // Our last remaining terms are -R_uu(u,z)*u_k*u_l and
1098  // Q_uu(u)*u_k*u_l
1099  //
1100  // We take directional central finite differences of R_u and Q_u
1101  // to approximate these terms, e.g.:
1102  //
1103  // Q_uu(u)*u_k ~= (Q_u(u+dp*u_k) - Q_u(u-dp*u_k))/(2*dp)
1104 
1105  *this->solution = this->get_sensitivity_solution(k);
1106  *this->solution *= delta_p;
1107  *this->solution += *oldsolution;
1108 
1109  // We've modified solution, so we need to update before calling
1110  // assembly since assembly may only use current_local_solution
1111  this->update();
1112  this->assembly(false, true);
1113  this->matrix->close();
1114  this->assemble_qoi_derivative(qoi_indices,
1115  /* include_liftfunc = */ true,
1116  /* apply_constraints = */ false);
1117 
1118  // The Hessian is symmetric, so we just calculate the lower
1119  // triangle and the diagonal, and we get the upper triangle from
1120  // the transpose of the lower
1121  //
1122  // Note that, because we took the directional finite difference
1123  // with respect to k and not l, we've added an O(delta_p^2)
1124  // error to any permutational symmetry in the Hessian...
1125  for (unsigned int l=0; l != k+1; ++l)
1126  {
1127  this->matrix->vector_mult(*tempvec, this->get_sensitivity_solution(l));
1128  for (unsigned int i=0; i != Nq; ++i)
1129  if (qoi_indices.has_index(i))
1130  {
1131  this->get_adjoint_rhs(i).close();
1132  Number current_terms =
1133  (this->get_adjoint_rhs(i).dot(this->get_sensitivity_solution(l)) -
1134  tempvec->dot(this->get_adjoint_solution(i))) / (2.*delta_p);
1135  sensitivities.second_derivative(i,k,l) += current_terms;
1136  if (k != l)
1137  sensitivities.second_derivative(i,l,k) += current_terms;
1138  }
1139  }
1140 
1141  *this->solution = this->get_sensitivity_solution(k);
1142  *this->solution *= -delta_p;
1143  *this->solution += *oldsolution;
1144 
1145  // We've modified solution, so we need to update before calling
1146  // assembly since assembly may only use current_local_solution
1147  this->update();
1148  this->assembly(false, true);
1149  this->matrix->close();
1150  this->assemble_qoi_derivative(qoi_indices,
1151  /* include_liftfunc = */ true,
1152  /* apply_constraints = */ false);
1153 
1154  for (unsigned int l=0; l != k+1; ++l)
1155  {
1156  this->matrix->vector_mult(*tempvec, this->get_sensitivity_solution(l));
1157  for (unsigned int i=0; i != Nq; ++i)
1158  if (qoi_indices.has_index(i))
1159  {
1160  this->get_adjoint_rhs(i).close();
1161  Number current_terms =
1162  (-this->get_adjoint_rhs(i).dot(this->get_sensitivity_solution(l)) +
1163  tempvec->dot(this->get_adjoint_solution(i))) / (2.*delta_p);
1164  sensitivities.second_derivative(i,k,l) += current_terms;
1165  if (k != l)
1166  sensitivities.second_derivative(i,l,k) += current_terms;
1167  }
1168  }
1169 
1170  // Don't leave the solution perturbed
1171  *this->solution = *oldsolution;
1172  }
1173 
1174  // All parameters have been reset.
1175  // Don't leave the qoi or system changed - principle of least
1176  // surprise.
1177  // We've modified solution, so we need to update before calling
1178  // assembly since assembly may only use current_local_solution
1179  this->update();
1180  this->assembly(true, true);
1181  this->rhs->close();
1182  this->matrix->close();
1183  this->assemble_qoi(qoi_indices);
1184 }
static constexpr Real TOLERANCE
void vector_mult(NumericVector< T > &dest, const NumericVector< T > &arg) const
Multiplies the matrix by the NumericVector arg and stores the result in NumericVector dest...
Number get_qoi_value(unsigned int qoi_index) const
Definition: system.C:2334
unsigned int n_qois() const
Number of currently active quantities of interest.
Definition: system.h:2516
NumericVector< Number > & get_sensitivity_solution(unsigned int i=0)
Definition: system.C:1140
NumericVector< Number > * rhs
The system matrix.
virtual std::pair< unsigned int, Real > sensitivity_solve(const ParameterVector &parameters) override
Assembles & solves the linear system(s) (dR/du)*u_p = -dR/dp, for those parameters contained within p...
virtual T dot(const NumericVector< T > &v) const =0
virtual std::pair< unsigned int, Real > adjoint_solve(const QoISet &qoi_indices=QoISet()) override
Assembles & solves the linear system (dR/du)^T*z = dq/du, for those quantities of interest q specifie...
virtual void assembly(bool, bool, bool=false, bool=false)
Assembles a residual in rhs and/or a jacobian in matrix, as requested.
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
bool is_adjoint_already_solved() const
Accessor for the adjoint_already_solved boolean.
Definition: system.h:406
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
virtual void update()
Update the local values to reflect the solution on neighboring processors.
Definition: system.C:493
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
SparseMatrix< Number > * matrix
The system matrix.
virtual void assemble_qoi(const QoISet &qoi_indices=QoISet()) override
Prepares qoi for quantity of interest assembly, then calls user qoi function.
virtual void assemble_qoi_derivative(const QoISet &qoi_indices=QoISet(), bool include_liftfunc=true, bool apply_constraints=true) override
Prepares adjoint_rhs for quantity of interest derivative assembly, then calls user qoi derivative fun...
NumericVector< Number > & get_adjoint_solution(unsigned int i=0)
Definition: system.C:1193
std::vector< Number > get_qoi_values() const
Returns a copy of qoi, not a reference.
Definition: system.C:2341
NumericVector< Number > & get_adjoint_rhs(unsigned int i=0)
Definition: system.C:1255

◆ qoi_parameter_hessian_vector_product()

void libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product ( const QoISet qoi_indices,
const ParameterVector parameters,
const ParameterVector vector,
SensitivityData product 
)
overridevirtualinherited

For each of the system's quantities of interest q in qoi[qoi_indices], and for a vector of parameters p, the parameter sensitivity Hessian H_ij is defined as H_ij = (d^2 q)/(d p_i d p_j) The Hessian-vector product, for a vector v_k in parameter space, is S_j = H_jk v_k This product is the output of this method, where for each q_i, S_j is stored in sensitivities[i][j].

Reimplemented from libMesh::System.

Definition at line 690 of file implicit_system.C.

References libMesh::ImplicitSystem::adjoint_solve(), libMesh::SensitivityData::allocate_data(), libMesh::ExplicitSystem::assemble_qoi(), libMesh::ExplicitSystem::assemble_qoi_derivative(), libMesh::ImplicitSystem::assembly(), libMesh::NumericVector< T >::close(), libMesh::SparseMatrix< T >::close(), libMesh::ParameterVector::deep_copy(), libMesh::NumericVector< T >::dot(), libMesh::System::get_adjoint_rhs(), libMesh::System::get_adjoint_solution(), libMesh::System::get_qoi_value(), libMesh::System::get_qoi_values(), libMesh::System::get_weighted_sensitivity_adjoint_solution(), libMesh::System::get_weighted_sensitivity_solution(), libMesh::QoISet::has_index(), libMesh::System::is_adjoint_already_solved(), libMesh::ImplicitSystem::matrix, libMesh::System::n_qois(), libMesh::Real, libMesh::ExplicitSystem::rhs, libMesh::ParameterVector::size(), libMesh::System::solution, libMesh::TOLERANCE, libMesh::ParameterVector::value_copy(), libMesh::SparseMatrix< T >::vector_mult(), libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve(), and libMesh::ImplicitSystem::weighted_sensitivity_solve().

694 {
695  // We currently get partial derivatives via finite differencing
696  const Real delta_p = TOLERANCE;
697 
698  ParameterVector & parameters =
699  const_cast<ParameterVector &>(parameters_in);
700 
701  // We'll use a single temporary vector for matrix-vector-vector products
702  std::unique_ptr<NumericVector<Number>> tempvec = this->solution->zero_clone();
703 
704  const unsigned int Np = cast_int<unsigned int>
705  (parameters.size());
706  const unsigned int Nq = this->n_qois();
707 
708  // For each quantity of interest q, the parameter sensitivity
709  // Hessian is defined as q''_{kl} = {d^2 q}/{d p_k d p_l}.
710  // Given a vector of parameter perturbation weights w_l, this
711  // function evaluates the hessian-vector product sum_l(q''_{kl}*w_l)
712  //
713  // We calculate it from values and partial derivatives of the
714  // quantity of interest function Q, solution u, adjoint solution z,
715  // parameter sensitivity adjoint solutions z^l, and residual R, as:
716  //
717  // sum_l(q''_{kl}*w_l) =
718  // sum_l(w_l * Q''_{kl}) + Q''_{uk}(u)*(sum_l(w_l u'_l)) -
719  // R'_k(u, sum_l(w_l*z^l)) - R'_{uk}(u,z)*(sum_l(w_l u'_l) -
720  // sum_l(w_l*R''_{kl}(u,z))
721  //
722  // See the adjoints model document for more details.
723 
724  // We first do an adjoint solve to get z for each quantity of
725  // interest
726  // if we haven't already or dont have an initial condition for the adjoint
727  if (!this->is_adjoint_already_solved())
728  {
729  this->adjoint_solve(qoi_indices);
730  }
731 
732  // Get ready to fill in sensitivities:
733  sensitivities.allocate_data(qoi_indices, *this, parameters);
734 
735  // We can't solve for all the solution sensitivities u'_l or for all
736  // of the parameter sensitivity adjoint solutions z^l without
737  // requiring O(Nq*Np) linear solves. So we'll solve directly for their
738  // weighted sum - this is just O(Nq) solves.
739 
740  // First solve for sum_l(w_l u'_l).
741  this->weighted_sensitivity_solve(parameters, vector);
742 
743  // Then solve for sum_l(w_l z^l).
744  this->weighted_sensitivity_adjoint_solve(parameters, vector, qoi_indices);
745 
746  for (unsigned int k=0; k != Np; ++k)
747  {
748  // We approximate sum_l(w_l * Q''_{kl}) with a central
749  // differencing perturbation:
750  // sum_l(w_l * Q''_{kl}) ~=
751  // (Q(p + dp*w_l*e_l + dp*e_k) - Q(p - dp*w_l*e_l + dp*e_k) -
752  // Q(p + dp*w_l*e_l - dp*e_k) + Q(p - dp*w_l*e_l - dp*e_k))/(4*dp^2)
753 
754  // The sum(w_l*R''_kl) term requires the same sort of perturbation,
755  // and so we subtract it in at the same time:
756  // sum_l(w_l * R''_{kl}) ~=
757  // (R(p + dp*w_l*e_l + dp*e_k) - R(p - dp*w_l*e_l + dp*e_k) -
758  // R(p + dp*w_l*e_l - dp*e_k) + R(p - dp*w_l*e_l - dp*e_k))/(4*dp^2)
759 
760  ParameterVector oldparameters, parameterperturbation;
761  parameters.deep_copy(oldparameters);
762  vector.deep_copy(parameterperturbation);
763  parameterperturbation *= delta_p;
764  parameters += parameterperturbation;
765 
766  Number old_parameter = *parameters[k];
767 
768  *parameters[k] = old_parameter + delta_p;
769  this->assemble_qoi(qoi_indices);
770  this->assembly(true, false, true);
771  this->rhs->close();
772  std::vector<Number> partial2q_term = this->get_qoi_values();
773  std::vector<Number> partial2R_term(this->n_qois());
774  for (unsigned int i=0; i != Nq; ++i)
775  if (qoi_indices.has_index(i))
776  partial2R_term[i] = this->rhs->dot(this->get_adjoint_solution(i));
777 
778  *parameters[k] = old_parameter - delta_p;
779  this->assemble_qoi(qoi_indices);
780  this->assembly(true, false, true);
781  this->rhs->close();
782  for (unsigned int i=0; i != Nq; ++i)
783  if (qoi_indices.has_index(i))
784  {
785  partial2q_term[i] -= this->get_qoi_value(i);
786  partial2R_term[i] -= this->rhs->dot(this->get_adjoint_solution(i));
787  }
788 
789  oldparameters.value_copy(parameters);
790  parameterperturbation *= -1.0;
791  parameters += parameterperturbation;
792 
793  // Re-center old_parameter, which may be affected by vector
794  old_parameter = *parameters[k];
795 
796  *parameters[k] = old_parameter + delta_p;
797  this->assemble_qoi(qoi_indices);
798  this->assembly(true, false, true);
799  this->rhs->close();
800  for (unsigned int i=0; i != Nq; ++i)
801  if (qoi_indices.has_index(i))
802  {
803  partial2q_term[i] -= this->get_qoi_value(i);
804  partial2R_term[i] -= this->rhs->dot(this->get_adjoint_solution(i));
805  }
806 
807  *parameters[k] = old_parameter - delta_p;
808  this->assemble_qoi(qoi_indices);
809  this->assembly(true, false, true);
810  this->rhs->close();
811  for (unsigned int i=0; i != Nq; ++i)
812  if (qoi_indices.has_index(i))
813  {
814  partial2q_term[i] += this->get_qoi_value(i);
815  partial2R_term[i] += this->rhs->dot(this->get_adjoint_solution(i));
816  }
817 
818  for (unsigned int i=0; i != Nq; ++i)
819  if (qoi_indices.has_index(i))
820  {
821  partial2q_term[i] /= (4. * delta_p * delta_p);
822  partial2R_term[i] /= (4. * delta_p * delta_p);
823  }
824 
825  for (unsigned int i=0; i != Nq; ++i)
826  if (qoi_indices.has_index(i))
827  sensitivities[i][k] = partial2q_term[i] - partial2R_term[i];
828 
829  // We get (partial q / partial u), R, and
830  // (partial R / partial u) from the user, but centrally
831  // difference to get q_uk, R_k, and R_uk terms:
832  // (partial R / partial k)
833  // R_k*sum(w_l*z^l) = (R(p+dp*e_k)*sum(w_l*z^l) - R(p-dp*e_k)*sum(w_l*z^l))/(2*dp)
834  // (partial^2 q / partial u partial k)
835  // q_uk = (q_u(p+dp*e_k) - q_u(p-dp*e_k))/(2*dp)
836  // (partial^2 R / partial u partial k)
837  // R_uk*z*sum(w_l*u'_l) = (R_u(p+dp*e_k)*z*sum(w_l*u'_l) - R_u(p-dp*e_k)*z*sum(w_l*u'_l))/(2*dp)
838 
839  // To avoid creating Nq temporary vectors for q_uk or R_uk, we add
840  // subterms to the sensitivities output one by one.
841  //
842  // FIXME: this is probably a bad order of operations for
843  // controlling floating point error.
844 
845  *parameters[k] = old_parameter + delta_p;
846  this->assembly(true, true);
847  this->rhs->close();
848  this->matrix->close();
849  this->assemble_qoi_derivative(qoi_indices,
850  /* include_liftfunc = */ true,
851  /* apply_constraints = */ false);
852 
853  this->matrix->vector_mult(*tempvec, this->get_weighted_sensitivity_solution());
854 
855  for (unsigned int i=0; i != Nq; ++i)
856  if (qoi_indices.has_index(i))
857  {
858  this->get_adjoint_rhs(i).close();
859  sensitivities[i][k] += (this->get_adjoint_rhs(i).dot(this->get_weighted_sensitivity_solution()) -
861  this->get_adjoint_solution(i).dot(*tempvec)) / (2.*delta_p);
862  }
863 
864  *parameters[k] = old_parameter - delta_p;
865  this->assembly(true, true);
866  this->rhs->close();
867  this->matrix->close();
868  this->assemble_qoi_derivative(qoi_indices,
869  /* include_liftfunc = */ true,
870  /* apply_constraints = */ false);
871 
872  this->matrix->vector_mult(*tempvec, this->get_weighted_sensitivity_solution());
873 
874  for (unsigned int i=0; i != Nq; ++i)
875  if (qoi_indices.has_index(i))
876  {
877  this->get_adjoint_rhs(i).close();
878  sensitivities[i][k] += (-this->get_adjoint_rhs(i).dot(this->get_weighted_sensitivity_solution()) +
880  this->get_adjoint_solution(i).dot(*tempvec)) / (2.*delta_p);
881  }
882  }
883 
884  // All parameters have been reset.
885  // Don't leave the qoi or system changed - principle of least
886  // surprise.
887  this->assembly(true, true);
888  this->rhs->close();
889  this->matrix->close();
890  this->assemble_qoi(qoi_indices);
891 }
static constexpr Real TOLERANCE
void vector_mult(NumericVector< T > &dest, const NumericVector< T > &arg) const
Multiplies the matrix by the NumericVector arg and stores the result in NumericVector dest...
Number get_qoi_value(unsigned int qoi_index) const
Definition: system.C:2334
unsigned int n_qois() const
Number of currently active quantities of interest.
Definition: system.h:2516
virtual std::pair< unsigned int, Real > weighted_sensitivity_solve(const ParameterVector &parameters, const ParameterVector &weights) override
Assembles & solves the linear system(s) (dR/du)*u_w = sum(w_p*-dR/dp), for those parameters p contain...
NumericVector< Number > * rhs
The system matrix.
virtual T dot(const NumericVector< T > &v) const =0
virtual std::pair< unsigned int, Real > adjoint_solve(const QoISet &qoi_indices=QoISet()) override
Assembles & solves the linear system (dR/du)^T*z = dq/du, for those quantities of interest q specifie...
NumericVector< Number > & get_weighted_sensitivity_solution()
Definition: system.C:1167
virtual void assembly(bool, bool, bool=false, bool=false)
Assembles a residual in rhs and/or a jacobian in matrix, as requested.
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
bool is_adjoint_already_solved() const
Accessor for the adjoint_already_solved boolean.
Definition: system.h:406
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
SparseMatrix< Number > * matrix
The system matrix.
virtual void assemble_qoi(const QoISet &qoi_indices=QoISet()) override
Prepares qoi for quantity of interest assembly, then calls user qoi function.
virtual void assemble_qoi_derivative(const QoISet &qoi_indices=QoISet(), bool include_liftfunc=true, bool apply_constraints=true) override
Prepares adjoint_rhs for quantity of interest derivative assembly, then calls user qoi derivative fun...
NumericVector< Number > & get_adjoint_solution(unsigned int i=0)
Definition: system.C:1193
virtual std::pair< unsigned int, Real > weighted_sensitivity_adjoint_solve(const ParameterVector &parameters, const ParameterVector &weights, const QoISet &qoi_indices=QoISet()) override
Assembles & solves the linear system(s) (dR/du)^T*z_w = sum(w_p*(d^2q/dudp - d^2R/dudp*z)), for those parameters p contained within parameters, weighted by the values w_p found within weights.
NumericVector< Number > & get_weighted_sensitivity_adjoint_solution(unsigned int i=0)
Definition: system.C:1225
std::vector< Number > get_qoi_values() const
Returns a copy of qoi, not a reference.
Definition: system.C:2341
NumericVector< Number > & get_adjoint_rhs(unsigned int i=0)
Definition: system.C:1255

◆ qoi_parameter_sensitivity()

void libMesh::System::qoi_parameter_sensitivity ( const QoISet qoi_indices,
const ParameterVector parameters,
SensitivityData sensitivities 
)
virtualinherited

Solves for the derivative of each of the system's quantities of interest q in qoi[qoi_indices] with respect to each parameter in parameters, placing the result for qoi i and parameter j into sensitivities[i][j].

Note
parameters is a const vector, not a vector-of-const; parameter values in this vector need to be mutable for finite differencing to work.

Automatically chooses the forward method for problems with more quantities of interest than parameters, or the adjoint method otherwise.

This method is only usable in derived classes which override an implementation.

Definition at line 585 of file system.C.

References libMesh::System::adjoint_qoi_parameter_sensitivity(), libMesh::System::forward_qoi_parameter_sensitivity(), libMesh::ParameterVector::size(), and libMesh::QoISet::size().

588 {
589  // Forward sensitivities are more efficient for Nq > Np
590  if (qoi_indices.size(*this) > parameters.size())
591  forward_qoi_parameter_sensitivity(qoi_indices, parameters, sensitivities);
592  // Adjoint sensitivities are more efficient for Np > Nq,
593  // and an adjoint may be more reusable than a forward
594  // solution sensitivity in the Np == Nq case.
595  else
596  adjoint_qoi_parameter_sensitivity(qoi_indices, parameters, sensitivities);
597 }
virtual void forward_qoi_parameter_sensitivity(const QoISet &qoi_indices, const ParameterVector &parameters, SensitivityData &sensitivities)
Solves for parameter sensitivities using the forward method.
Definition: system.h:2567
virtual void adjoint_qoi_parameter_sensitivity(const QoISet &qoi_indices, const ParameterVector &parameters, SensitivityData &sensitivities)
Solves for parameter sensitivities using the adjoint method.
Definition: system.h:2558

◆ re_update()

void libMesh::System::re_update ( )
virtualinherited

Re-update the local values when the mesh has changed.

This method takes the data updated by update() and makes it up-to-date on the current mesh.

Reimplemented in libMesh::TransientSystem< RBConstruction >.

Definition at line 516 of file system.C.

References libMesh::System::current_local_solution, libMesh::System::get_dof_map(), libMesh::DofMap::get_send_list(), libMesh::System::n_vars(), and libMesh::System::solution.

517 {
518  parallel_object_only();
519 
520  // If this system is empty... don't do anything!
521  if (!this->n_vars())
522  return;
523 
524  const std::vector<dof_id_type> & send_list = this->get_dof_map().get_send_list ();
525 
526  // Check sizes
527  libmesh_assert_equal_to (current_local_solution->size(), solution->size());
528  // Not true with ghosted vectors
529  // libmesh_assert_equal_to (current_local_solution->local_size(), solution->size());
530  // libmesh_assert (!send_list.empty());
531  libmesh_assert_less_equal (send_list.size(), solution->size());
532 
533  // Create current_local_solution from solution. This will
534  // put a local copy of solution into current_local_solution.
535  solution->localize (*current_local_solution, send_list);
536 }
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1585
unsigned int n_vars() const
Definition: system.h:2349
const DofMap & get_dof_map() const
Definition: system.h:2293
const std::vector< dof_id_type > & get_send_list() const
Definition: dof_map.h:511

◆ read_header()

void libMesh::System::read_header ( Xdr io,
std::string_view  version,
const bool  read_header = true,
const bool  read_additional_data = true,
const bool  read_legacy_format = false 
)
inherited

Reads the basic data header for this System.

Definition at line 97 of file system_io.C.

References libMesh::System::_additional_data_written, libMesh::System::_written_var_indices, libMesh::System::add_variable(), libMesh::System::add_vector(), TIMPI::Communicator::broadcast(), libMesh::System::clear(), libMesh::ParallelObject::comm(), libMesh::Xdr::data(), libMesh::FEType::family, libMesh::System::get_mesh(), libMesh::OrderWrapper::get_order(), libMesh::FEType::inf_map, libMesh::libmesh_assert(), libMesh::MeshBase::mesh_dimension(), libMesh::MONOMIAL, libMesh::on_command_line(), libMesh::FEType::order, libMesh::out, libMesh::ParallelObject::processor_id(), libMesh::FEType::radial_family, libMesh::FEType::radial_order, libMesh::Xdr::reading(), libMesh::System::variable_number(), libMesh::Xdr::version(), and libMesh::XYZ.

Referenced by libMesh::EquationSystems::read(), and libMesh::RBEvaluation::read_in_vectors_from_multiple_files().

102 {
103  // This method implements the input of a
104  // System object, embedded in the output of
105  // an EquationSystems<T_sys>. This warrants some
106  // documentation. The output file essentially
107  // consists of 5 sections:
108  //
109  // for this system
110  //
111  // 5.) The number of variables in the system (unsigned int)
112  //
113  // for each variable in the system
114  //
115  // 6.) The name of the variable (string)
116  //
117  // 6.1.) Variable subdomains
118  //
119  // 7.) Combined in an FEType:
120  // - The approximation order(s) of the variable
121  // (Order Enum, cast to int/s)
122  // - The finite element family/ies of the variable
123  // (FEFamily Enum, cast to int/s)
124  //
125  // end variable loop
126  //
127  // 8.) The number of additional vectors (unsigned int),
128  //
129  // for each additional vector in the system object
130  //
131  // 9.) the name of the additional vector (string)
132  //
133  // end system
134  libmesh_assert (io.reading());
135 
136  // Possibly clear data structures and start from scratch.
137  if (read_header_in)
138  this->clear ();
139 
140  // Figure out if we need to read infinite element information.
141  // This will be true if the version string contains " with infinite elements"
142  const bool read_ifem_info =
143  (version.rfind(" with infinite elements") < version.size()) ||
144  libMesh::on_command_line ("--read-ifem-systems");
145 
146 
147  {
148  // 5.)
149  // Read the number of variables in the system
150  unsigned int nv=0;
151  if (this->processor_id() == 0)
152  io.data (nv);
153  this->comm().broadcast(nv);
154 
155  _written_var_indices.clear();
156  _written_var_indices.resize(nv, 0);
157 
158  for (unsigned int var=0; var<nv; var++)
159  {
160  // 6.)
161  // Read the name of the var-th variable
162  std::string var_name;
163  if (this->processor_id() == 0)
164  io.data (var_name);
165  this->comm().broadcast(var_name);
166 
167  // 6.1.)
168  std::set<subdomain_id_type> domains;
169  if (io.version() >= LIBMESH_VERSION_ID(0,7,2))
170  {
171  std::vector<subdomain_id_type> domain_array;
172  if (this->processor_id() == 0)
173  io.data (domain_array);
174  for (const auto & id : domain_array)
175  domains.insert(id);
176  }
177  this->comm().broadcast(domains);
178 
179  // 7.)
180  // Read the approximation order(s) of the var-th variable
181  int order=0;
182  if (this->processor_id() == 0)
183  io.data (order);
184  this->comm().broadcast(order);
185 
186 
187  // do the same for infinite element radial_order
188  int rad_order=0;
189  if (read_ifem_info)
190  {
191  if (this->processor_id() == 0)
192  io.data(rad_order);
193  this->comm().broadcast(rad_order);
194  }
195 
196  // Read the finite element type of the var-th variable
197  int fam=0;
198  if (this->processor_id() == 0)
199  io.data (fam);
200  this->comm().broadcast(fam);
201  FEType type;
202  type.order = static_cast<Order>(order);
203  type.family = static_cast<FEFamily>(fam);
204 
205  // Check for incompatibilities. The shape function indexing was
206  // changed for the monomial and xyz finite element families to
207  // simplify extension to arbitrary p. The consequence is that
208  // old restart files will not be read correctly. This is expected
209  // to be an unlikely occurrence, but catch it anyway.
210  if (read_legacy_format)
211  if ((type.family == MONOMIAL || type.family == XYZ) &&
212  ((type.order.get_order() > 2 && this->get_mesh().mesh_dimension() == 2) ||
213  (type.order.get_order() > 1 && this->get_mesh().mesh_dimension() == 3)))
214  {
215  libmesh_here();
216  libMesh::out << "*****************************************************************\n"
217  << "* WARNING: reading a potentially incompatible restart file!!! *\n"
218  << "* contact libmesh-users@lists.sourceforge.net for more details *\n"
219  << "*****************************************************************"
220  << std::endl;
221  }
222 
223  // Read additional information for infinite elements
224  int radial_fam=0;
225  int i_map=0;
226  if (read_ifem_info)
227  {
228  if (this->processor_id() == 0)
229  io.data (radial_fam);
230  this->comm().broadcast(radial_fam);
231  if (this->processor_id() == 0)
232  io.data (i_map);
233  this->comm().broadcast(i_map);
234  }
235 
236 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
237 
238  type.radial_order = static_cast<Order>(rad_order);
239  type.radial_family = static_cast<FEFamily>(radial_fam);
240  type.inf_map = static_cast<InfMapType>(i_map);
241 
242 #endif
243 
244  if (read_header_in)
245  {
246  if (domains.empty())
247  _written_var_indices[var] = this->add_variable (var_name, type);
248  else
249  _written_var_indices[var] = this->add_variable (var_name, type, &domains);
250  }
251  else
252  _written_var_indices[var] = this->variable_number(var_name);
253  }
254  }
255 
256  // 8.)
257  // Read the number of additional vectors.
258  unsigned int nvecs=0;
259  if (this->processor_id() == 0)
260  io.data (nvecs);
261  this->comm().broadcast(nvecs);
262 
263  // If nvecs > 0, this means that write_additional_data
264  // was true when this file was written. We will need to
265  // make use of this fact later.
266  this->_additional_data_written = nvecs;
267 
268  for (unsigned int vec=0; vec<nvecs; vec++)
269  {
270  // 9.)
271  // Read the name of the vec-th additional vector
272  std::string vec_name;
273  if (this->processor_id() == 0)
274  io.data (vec_name);
275  this->comm().broadcast(vec_name);
276  if (io.version() >= LIBMESH_VERSION_ID(1,7,0))
277  {
278  int vec_projection = 0;
279  if (this->processor_id() == 0)
280  io.data (vec_projection);
281  this->comm().broadcast(vec_projection);
282  int vec_type;
283  if (this->processor_id() == 0)
284  io.data (vec_type);
285  this->comm().broadcast(vec_type);
286 
287  if (read_additional_data)
288  this->add_vector(vec_name, bool(vec_projection), ParallelType(vec_type));
289  }
290  else if (read_additional_data)
291  // Systems now can handle adding post-initialization vectors
292  // libmesh_assert(this->_can_add_vectors);
293  // Some systems may have added their own vectors already
294  // libmesh_assert_equal_to (this->_vectors.count(vec_name), 0);
295  this->add_vector(vec_name);
296  }
297 }
virtual void clear()
Clear all the data structures associated with the system.
Definition: system.C:168
Order
defines an enum for polynomial orders.
Definition: enum_order.h:40
const Parallel::Communicator & comm() const
NumericVector< Number > & add_vector(std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Adds the additional vector vec_name to this system.
Definition: system.C:751
const MeshBase & get_mesh() const
Definition: system.h:2277
unsigned int variable_number(std::string_view var) const
Definition: system.C:1557
libmesh_assert(ctx)
unsigned int _additional_data_written
This flag is used only when reading in a system from file.
Definition: system.h:2223
unsigned int add_variable(std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variable var to the list of variables for this system.
Definition: system.C:1305
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
InfMapType
defines an enum for the types of coordinate mappings available in infinite elements.
OStreamProxy out
unsigned int mesh_dimension() const
Definition: mesh_base.C:324
bool on_command_line(std::string arg)
Definition: libmesh.C:924
FEFamily
defines an enum for finite element families.
processor_id_type processor_id() const
std::vector< unsigned int > _written_var_indices
This vector is used only when reading in a system from file.
Definition: system.h:2235
ParallelType
Defines an enum for parallel data structure types.

◆ read_legacy_data()

void libMesh::System::read_legacy_data ( Xdr io,
const bool  read_additional_data = true 
)
inherited

Reads additional data, namely vectors, for this System.

Definition at line 302 of file system_io.C.

References libMesh::System::_additional_data_written, libMesh::System::_vectors, libMesh::System::_written_var_indices, TIMPI::Communicator::broadcast(), libMesh::ParallelObject::comm(), libMesh::Xdr::data(), libMesh::System::get_mesh(), libMesh::DofObject::invalid_id, libMesh::libmesh_assert(), libMesh::make_range(), libMesh::System::n_dofs(), libMesh::System::n_vars(), libMesh::System::number(), libMesh::ParallelObject::processor_id(), libMesh::Xdr::reading(), libMesh::System::solution, and libMesh::zero.

304 {
305  libmesh_deprecated();
306 
307  // This method implements the output of the vectors
308  // contained in this System object, embedded in the
309  // output of an EquationSystems<T_sys>.
310  //
311  // 10.) The global solution vector, re-ordered to be node-major
312  // (More on this later.)
313  //
314  // for each additional vector in the object
315  //
316  // 11.) The global additional vector, re-ordered to be
317  // node-major (More on this later.)
318  libmesh_assert (io.reading());
319 
320  // directly-read and reordered buffers, declared here for reuse
321  // without heap juggling.
322  std::vector<Number> global_vector;
323  std::vector<Number> reordered_vector;
324 
325  auto reorder_vector_into =
326  [this, &global_vector, &reordered_vector]
327  (NumericVector<Number> & vec)
328  {
329  this->comm().broadcast(global_vector);
330 
331  // If we have been reading multiple vectors, they should all be
332  // the same size.
333  libmesh_assert (reordered_vector.empty() ||
334  reordered_vector.size() == global_vector.size());
335 
336  // Remember that the stored vector is node-major.
337  // We need to put it into whatever application-specific
338  // ordering we may have using the dof_map.
339  reordered_vector.resize(global_vector.size());
340 
341  //libMesh::out << "global_vector.size()=" << global_vector.size() << std::endl;
342  //libMesh::out << "this->n_dofs()=" << this->n_dofs() << std::endl;
343 
344  libmesh_assert_equal_to (global_vector.size(), this->n_dofs());
345 
346  dof_id_type cnt=0;
347 
348  const unsigned int sys = this->number();
349  const unsigned int nv = cast_int<unsigned int>
350  (this->_written_var_indices.size());
351  libmesh_assert_less_equal (nv, this->n_vars());
352 
353  for (unsigned int data_var=0; data_var<nv; data_var++)
354  {
355  const unsigned int var = _written_var_indices[data_var];
356 
357  // First reorder the nodal DOF values
358  for (auto & node : this->get_mesh().node_ptr_range())
359  for (auto index : make_range(node->n_comp(sys,var)))
360  {
361  libmesh_assert_not_equal_to (node->dof_number(sys, var, index),
363 
364  libmesh_assert_less (cnt, global_vector.size());
365 
366  reordered_vector[node->dof_number(sys, var, index)] =
367  global_vector[cnt++];
368  }
369 
370  // Then reorder the element DOF values
371  for (auto & elem : this->get_mesh().active_element_ptr_range())
372  for (auto index : make_range(elem->n_comp(sys,var)))
373  {
374  libmesh_assert_not_equal_to (elem->dof_number(sys, var, index),
376 
377  libmesh_assert_less (cnt, global_vector.size());
378 
379  reordered_vector[elem->dof_number(sys, var, index)] =
380  global_vector[cnt++];
381  }
382  }
383 
384  // use the overloaded operator=(std::vector) to assign the values
385  vec = reordered_vector;
386  };
387 
388  // 10.)
389  // Read and set the solution vector
390  if (this->processor_id() == 0)
391  io.data (global_vector);
392  reorder_vector_into(*(this->solution));
393 
394  // For each additional vector, simply go through the list.
395  // ONLY attempt to do this IF additional data was actually
396  // written to the file for this system (controlled by the
397  // _additional_data_written flag).
398  if (this->_additional_data_written)
399  {
400  const std::size_t nvecs = this->_vectors.size();
401 
402  // If the number of additional vectors written is non-zero, and
403  // the number of additional vectors we have is non-zero, and
404  // they don't match, then something is wrong and we can't be
405  // sure we're reading data into the correct places.
406  if (read_additional_data && nvecs &&
407  nvecs != this->_additional_data_written)
408  libmesh_error_msg
409  ("Additional vectors in file do not match system");
410 
411  auto pos = this->_vectors.begin();
412 
413  for (std::size_t i = 0; i != this->_additional_data_written; ++i)
414  {
415  // 11.)
416  // Read the values of the vec-th additional vector.
417  // Prior do _not_ clear, but fill with zero, since the
418  // additional vectors _have_ to have the same size
419  // as the solution vector
420  std::fill (global_vector.begin(), global_vector.end(), libMesh::zero);
421 
422  if (this->processor_id() == 0)
423  io.data (global_vector);
424 
425  // If read_additional_data==true and we have additional vectors,
426  // then we will keep this vector data; otherwise we are going to
427  // throw it away.
428  if (read_additional_data && nvecs)
429  {
430  std::fill (reordered_vector.begin(),
431  reordered_vector.end(),
432  libMesh::zero);
433 
434  reorder_vector_into(*(pos->second));
435  }
436 
437  // If we've got vectors then we need to be iterating through
438  // those too
439  if (pos != this->_vectors.end())
440  ++pos;
441  }
442  } // end if (_additional_data_written)
443 }
const Parallel::Communicator & comm() const
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
const Number zero
.
Definition: libmesh.h:280
const MeshBase & get_mesh() const
Definition: system.h:2277
dof_id_type n_dofs() const
Definition: system.C:113
unsigned int number() const
Definition: system.h:2269
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
libmesh_assert(ctx)
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:477
unsigned int _additional_data_written
This flag is used only when reading in a system from file.
Definition: system.h:2223
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
unsigned int n_vars() const
Definition: system.h:2349
processor_id_type processor_id() const
template class LIBMESH_EXPORT NumericVector< Number >
std::vector< unsigned int > _written_var_indices
This vector is used only when reading in a system from file.
Definition: system.h:2235
uint8_t dof_id_type
Definition: id_types.h:67

◆ read_parallel_data() [1/2]

template<typename InValType >
void libMesh::System::read_parallel_data ( Xdr io,
const bool  read_additional_data 
)
inherited

Reads additional data, namely vectors, for this System.

This method may safely be called on a distributed-memory mesh. This method will read an individual file for each processor in the simulation where the local solution components for that processor are stored.

This method implements the output of the vectors contained in this System object, embedded in the output of an EquationSystems<T_sys>.

9.) The global solution vector, re-ordered to be node-major (More on this later.)

for each additional vector in the object

10.) The global additional vector, re-ordered to be node-major (More on this later.)

Note that the actual IO is handled through the Xdr class (to be renamed later?) which provides a uniform interface to both the XDR (eXternal Data Representation) interface and standard ASCII output. Thus this one section of code will read XDR or ASCII files with no changes.

Definition at line 449 of file system_io.C.

References libMesh::System::_additional_data_written, libMesh::System::_vectors, libMesh::System::_written_var_indices, libMesh::Xdr::data(), libMesh::FEType::family, libMesh::System::get_dof_map(), libMesh::System::get_mesh(), libMesh::DofObject::invalid_id, libMesh::Xdr::is_open(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::ParallelObject::n_processors(), libMesh::System::n_vars(), libMesh::System::number(), libMesh::ParallelObject::processor_id(), libMesh::Xdr::reading(), libMesh::SCALAR, libMesh::DofMap::SCALAR_dof_indices(), libMesh::System::solution, libMesh::Variable::type(), and libMesh::System::variable().

451 {
471  // PerfLog pl("IO Performance",false);
472  // pl.push("read_parallel_data");
473  dof_id_type total_read_size = 0;
474 
475  libmesh_assert (io.reading());
476  libmesh_assert (io.is_open());
477 
478  // build the ordered nodes and element maps.
479  // when writing/reading parallel files we need to iterate
480  // over our nodes/elements in order of increasing global id().
481  // however, this is not guaranteed to be ordering we obtain
482  // by using the node_iterators/element_iterators directly.
483  // so build a set, sorted by id(), that provides the ordering.
484  // further, for memory economy build the set but then transfer
485  // its contents to vectors, which will be sorted.
486  std::vector<const DofObject *> ordered_nodes, ordered_elements;
487  {
488  std::set<const DofObject *, CompareDofObjectsByID>
489  ordered_nodes_set (this->get_mesh().local_nodes_begin(),
490  this->get_mesh().local_nodes_end());
491 
492  ordered_nodes.insert(ordered_nodes.end(),
493  ordered_nodes_set.begin(),
494  ordered_nodes_set.end());
495  }
496  {
497  std::set<const DofObject *, CompareDofObjectsByID>
498  ordered_elements_set (this->get_mesh().local_elements_begin(),
499  this->get_mesh().local_elements_end());
500 
501  ordered_elements.insert(ordered_elements.end(),
502  ordered_elements_set.begin(),
503  ordered_elements_set.end());
504  }
505 
506  // std::vector<Number> io_buffer;
507  std::vector<InValType> io_buffer;
508 
509  // 9.)
510  //
511  // Actually read the solution components
512  // for the ith system to disk
513  io.data(io_buffer);
514 
515  total_read_size += cast_int<dof_id_type>(io_buffer.size());
516 
517  const unsigned int sys_num = this->number();
518  const unsigned int nv = cast_int<unsigned int>
519  (this->_written_var_indices.size());
520  libmesh_assert_less_equal (nv, this->n_vars());
521 
522  dof_id_type cnt=0;
523 
524  // Loop over each non-SCALAR variable and each node, and read out the value.
525  for (unsigned int data_var=0; data_var<nv; data_var++)
526  {
527  const unsigned int var = _written_var_indices[data_var];
528  if (this->variable(var).type().family != SCALAR)
529  {
530  // First read the node DOF values
531  for (const auto & node : ordered_nodes)
532  for (auto comp : make_range(node->n_comp(sys_num,var)))
533  {
534  libmesh_assert_not_equal_to (node->dof_number(sys_num, var, comp),
536  libmesh_assert_less (cnt, io_buffer.size());
537  this->solution->set(node->dof_number(sys_num, var, comp), io_buffer[cnt++]);
538  }
539 
540  // Then read the element DOF values
541  for (const auto & elem : ordered_elements)
542  for (auto comp : make_range(elem->n_comp(sys_num,var)))
543  {
544  libmesh_assert_not_equal_to (elem->dof_number(sys_num, var, comp),
546  libmesh_assert_less (cnt, io_buffer.size());
547  this->solution->set(elem->dof_number(sys_num, var, comp), io_buffer[cnt++]);
548  }
549  }
550  }
551 
552  // Finally, read the SCALAR variables on the last processor
553  for (unsigned int data_var=0; data_var<nv; data_var++)
554  {
555  const unsigned int var = _written_var_indices[data_var];
556  if (this->variable(var).type().family == SCALAR)
557  {
558  if (this->processor_id() == (this->n_processors()-1))
559  {
560  const DofMap & dof_map = this->get_dof_map();
561  std::vector<dof_id_type> SCALAR_dofs;
562  dof_map.SCALAR_dof_indices(SCALAR_dofs, var);
563 
564  for (auto dof : SCALAR_dofs)
565  this->solution->set(dof, io_buffer[cnt++]);
566  }
567  }
568  }
569 
570  // And we're done setting solution entries
571  this->solution->close();
572 
573  // For each additional vector, simply go through the list.
574  // ONLY attempt to do this IF additional data was actually
575  // written to the file for this system (controlled by the
576  // _additional_data_written flag).
577  if (this->_additional_data_written)
578  {
579  const std::size_t nvecs = this->_vectors.size();
580 
581  // If the number of additional vectors written is non-zero, and
582  // the number of additional vectors we have is non-zero, and
583  // they don't match, then something is wrong and we can't be
584  // sure we're reading data into the correct places.
585  if (read_additional_data && nvecs &&
586  nvecs != this->_additional_data_written)
587  libmesh_error_msg
588  ("Additional vectors in file do not match system");
589 
590  auto pos = _vectors.begin();
591 
592  for (std::size_t i = 0; i != this->_additional_data_written; ++i)
593  {
594  cnt=0;
595  io_buffer.clear();
596 
597  // 10.)
598  //
599  // Actually read the additional vector components
600  // for the ith system from disk
601  io.data(io_buffer);
602 
603  total_read_size += cast_int<dof_id_type>(io_buffer.size());
604 
605  // If read_additional_data==true and we have additional vectors,
606  // then we will keep this vector data; otherwise we are going to
607  // throw it away.
608  if (read_additional_data && nvecs)
609  {
610  // Loop over each non-SCALAR variable and each node, and read out the value.
611  for (unsigned int data_var=0; data_var<nv; data_var++)
612  {
613  const unsigned int var = _written_var_indices[data_var];
614  if (this->variable(var).type().family != SCALAR)
615  {
616  // First read the node DOF values
617  for (const auto & node : ordered_nodes)
618  for (auto comp : make_range(node->n_comp(sys_num,var)))
619  {
620  libmesh_assert_not_equal_to (node->dof_number(sys_num, var, comp),
622  libmesh_assert_less (cnt, io_buffer.size());
623  pos->second->set(node->dof_number(sys_num, var, comp), io_buffer[cnt++]);
624  }
625 
626  // Then read the element DOF values
627  for (const auto & elem : ordered_elements)
628  for (auto comp : make_range(elem->n_comp(sys_num,var)))
629  {
630  libmesh_assert_not_equal_to (elem->dof_number(sys_num, var, comp),
632  libmesh_assert_less (cnt, io_buffer.size());
633  pos->second->set(elem->dof_number(sys_num, var, comp), io_buffer[cnt++]);
634  }
635  }
636  }
637 
638  // Finally, read the SCALAR variables on the last processor
639  for (unsigned int data_var=0; data_var<nv; data_var++)
640  {
641  const unsigned int var = _written_var_indices[data_var];
642  if (this->variable(var).type().family == SCALAR)
643  {
644  if (this->processor_id() == (this->n_processors()-1))
645  {
646  const DofMap & dof_map = this->get_dof_map();
647  std::vector<dof_id_type> SCALAR_dofs;
648  dof_map.SCALAR_dof_indices(SCALAR_dofs, var);
649 
650  for (auto dof : SCALAR_dofs)
651  pos->second->set(dof, io_buffer[cnt++]);
652  }
653  }
654  }
655 
656  // And we're done setting entries for this variable
657  pos->second->close();
658  }
659 
660  // If we've got vectors then we need to be iterating through
661  // those too
662  if (pos != this->_vectors.end())
663  ++pos;
664  }
665  }
666 
667  // const Real
668  // dt = pl.get_elapsed_time(),
669  // rate = total_read_size*sizeof(Number)/dt;
670 
671  // libMesh::err << "Read " << total_read_size << " \"Number\" values\n"
672  // << " Elapsed time = " << dt << '\n'
673  // << " Rate = " << rate/1.e6 << "(MB/sec)\n\n";
674 
675  // pl.pop("read_parallel_data");
676 }
FEFamily family
The type of finite element.
Definition: fe_type.h:207
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.h:2377
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
const MeshBase & get_mesh() const
Definition: system.h:2277
processor_id_type n_processors() const
unsigned int number() const
Definition: system.h:2269
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
libmesh_assert(ctx)
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:477
unsigned int _additional_data_written
This flag is used only when reading in a system from file.
Definition: system.h:2223
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
unsigned int n_vars() const
Definition: system.h:2349
processor_id_type processor_id() const
const DofMap & get_dof_map() const
Definition: system.h:2293
std::vector< unsigned int > _written_var_indices
This vector is used only when reading in a system from file.
Definition: system.h:2235
uint8_t dof_id_type
Definition: id_types.h:67
const FEType & type() const
Definition: variable.h:140

◆ read_parallel_data() [2/2]

template LIBMESH_EXPORT void libMesh::System::read_parallel_data< Real > ( Xdr io,
const bool  read_additional_data 
)
inlineinherited

Non-templated version for backward compatibility.

Reads additional data, namely vectors, for this System. This method may safely be called on a distributed-memory mesh. This method will read an individual file for each processor in the simulation where the local solution components for that processor are stored.

Definition at line 1333 of file system.h.

1335  { read_parallel_data<Number>(io, read_additional_data); }

◆ read_serialized_data() [1/2]

template<typename InValType >
void libMesh::System::read_serialized_data ( Xdr io,
const bool  read_additional_data = true 
)
inherited

Reads additional data, namely vectors, for this System.

This method may safely be called on a distributed-memory mesh.

Definition at line 680 of file system_io.C.

References libMesh::System::_additional_data_written, libMesh::System::_vectors, libMesh::ParallelObject::processor_id(), and libMesh::System::solution.

Referenced by libMesh::TransientRBConstruction::initialize_truth(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), and libMesh::RBConstruction::read_riesz_representors_from_files().

682 {
683  // This method implements the input of the vectors
684  // contained in this System object, embedded in the
685  // output of an EquationSystems<T_sys>.
686  //
687  // 10.) The global solution vector, re-ordered to be node-major
688  // (More on this later.)
689  //
690  // for each additional vector in the object
691  //
692  // 11.) The global additional vector, re-ordered to be
693  // node-major (More on this later.)
694  parallel_object_only();
695  std::string comment;
696 
697  // PerfLog pl("IO Performance",false);
698  // pl.push("read_serialized_data");
699  // std::size_t total_read_size = 0;
700 
701  // 10.)
702  // Read the global solution vector
703  {
704  // total_read_size +=
705  this->read_serialized_vector<InValType>(io, this->solution.get());
706 
707  // get the comment
708  if (this->processor_id() == 0)
709  io.comment (comment);
710  }
711 
712  // 11.)
713  // Only read additional vectors if data is available, and only use
714  // that data to fill our vectors if the user requested it.
715  if (this->_additional_data_written)
716  {
717  const std::size_t nvecs = this->_vectors.size();
718 
719  // If the number of additional vectors written is non-zero, and
720  // the number of additional vectors we have is non-zero, and
721  // they don't match, then we can't read additional vectors
722  // and be sure we're reading data into the correct places.
723  if (read_additional_data && nvecs &&
724  nvecs != this->_additional_data_written)
725  libmesh_error_msg
726  ("Additional vectors in file do not match system");
727 
728  auto pos = _vectors.begin();
729 
730  for (std::size_t i = 0; i != this->_additional_data_written; ++i)
731  {
732  // Read data, but only put it into a vector if we've been
733  // asked to and if we have a corresponding vector to read.
734 
735  // total_read_size +=
736  this->read_serialized_vector<InValType>
737  (io, (read_additional_data && nvecs) ? pos->second.get() : nullptr);
738 
739  // get the comment
740  if (this->processor_id() == 0)
741  io.comment (comment);
742 
743 
744  // If we've got vectors then we need to be iterating through
745  // those too
746  if (pos != this->_vectors.end())
747  ++pos;
748  }
749  }
750 
751  // const Real
752  // dt = pl.get_elapsed_time(),
753  // rate = total_read_size*sizeof(Number)/dt;
754 
755  // libMesh::out << "Read " << total_read_size << " \"Number\" values\n"
756  // << " Elapsed time = " << dt << '\n'
757  // << " Rate = " << rate/1.e6 << "(MB/sec)\n\n";
758 
759  // pl.pop("read_serialized_data");
760 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
unsigned int _additional_data_written
This flag is used only when reading in a system from file.
Definition: system.h:2223
processor_id_type processor_id() const

◆ read_serialized_data() [2/2]

template LIBMESH_EXPORT void libMesh::System::read_serialized_data< Real > ( Xdr io,
const bool  read_additional_data = true 
)
inlineinherited

Non-templated version for backward compatibility.

Reads additional data, namely vectors, for this System. This method may safely be called on a distributed-memory mesh.

Definition at line 1291 of file system.h.

1293  { read_serialized_data<Number>(io, read_additional_data); }

◆ read_serialized_vectors() [1/2]

template<typename InValType >
std::size_t libMesh::System::read_serialized_vectors ( Xdr io,
const std::vector< NumericVector< Number > *> &  vectors 
) const
inherited

Read a number of identically distributed vectors.

This method allows for optimization for the multiple vector case by only communicating the metadata once.

Definition at line 2165 of file system_io.C.

References libMesh::Xdr::data(), libMesh::System::get_mesh(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::MeshTools::n_elem(), libMesh::MeshBase::n_elem(), n_nodes, libMesh::MeshBase::n_nodes(), libMesh::System::n_vars(), libMesh::ParallelObject::processor_id(), libMesh::System::read_SCALAR_dofs(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::Xdr::reading(), libMesh::SCALAR, and libMesh::System::variable().

Referenced by libMesh::RBEvaluation::read_in_vectors_from_multiple_files().

2167 {
2168  parallel_object_only();
2169 
2170  // Error checking
2171  // #ifndef NDEBUG
2172  // // In parallel we better be reading a parallel vector -- if not
2173  // // we will not set all of its components below!!
2174  // if (this->n_processors() > 1)
2175  // {
2176  // libmesh_assert (vec.type() == PARALLEL ||
2177  // vec.type() == GHOSTED);
2178  // }
2179  // #endif
2180 
2181  libmesh_assert (io.reading());
2182 
2183  if (this->processor_id() == 0)
2184  {
2185  // sizes
2186  unsigned int num_vecs=0;
2187  dof_id_type vector_length=0;
2188 
2189  // Get the number of vectors
2190  io.data(num_vecs);
2191  // Get the buffer size
2192  io.data(vector_length);
2193 
2194  libmesh_error_msg_if (num_vecs != vectors.size(), "Unexpected value of num_vecs");
2195 
2196  if (num_vecs != 0)
2197  {
2198  libmesh_error_msg_if (vectors[0] == nullptr, "vectors[0] should not be null");
2199  libmesh_error_msg_if (vectors[0]->size() != vector_length, "Inconsistent vector sizes");
2200  }
2201  }
2202 
2203  // no need to actually communicate these.
2204  // this->comm().broadcast(num_vecs);
2205  // this->comm().broadcast(vector_length);
2206 
2207  // Cache these - they are not free!
2208  const dof_id_type
2209  n_nodes = this->get_mesh().n_nodes(),
2210  n_elem = this->get_mesh().n_elem();
2211 
2212  std::size_t read_length = 0;
2213 
2214  //---------------------------------
2215  // Collect the values for all nodes
2216  read_length +=
2217  this->read_serialized_blocked_dof_objects (n_nodes,
2218  this->get_mesh().local_nodes_begin(),
2219  this->get_mesh().local_nodes_end(),
2220  InValType(),
2221  io,
2222  vectors);
2223 
2224  //------------------------------------
2225  // Collect the values for all elements
2226  read_length +=
2228  this->get_mesh().local_elements_begin(),
2229  this->get_mesh().local_elements_end(),
2230  InValType(),
2231  io,
2232  vectors);
2233 
2234  //-------------------------------------------
2235  // Finally loop over all the SCALAR variables
2236  for (NumericVector<Number> * vec : vectors)
2237  for (auto var : make_range(this->n_vars()))
2238  if (this->variable(var).type().family == SCALAR)
2239  {
2240  libmesh_assert_not_equal_to (vec, 0);
2241 
2242  read_length +=
2243  this->read_SCALAR_dofs (var, io, vec);
2244  }
2245 
2246  //---------------------------------------
2247  // last step - must close all the vectors
2248  for (NumericVector<Number> * vec : vectors)
2249  {
2250  libmesh_assert_not_equal_to (vec, 0);
2251  vec->close();
2252  }
2253 
2254  return read_length;
2255 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.h:2377
dof_id_type n_elem(const MeshBase::const_element_iterator &begin, const MeshBase::const_element_iterator &end)
Count up the number of elements of a specific type (as defined by an iterator range).
Definition: mesh_tools.C:850
std::size_t read_serialized_blocked_dof_objects(const dof_id_type n_objects, const iterator_type begin, const iterator_type end, const InValType dummy, Xdr &io, const std::vector< NumericVector< Number > *> &vecs, const unsigned int var_to_read=libMesh::invalid_uint) const
Reads an input vector from the stream io and assigns the values to a set of DofObjects.
Definition: system_io.C:765
const MeshBase & get_mesh() const
Definition: system.h:2277
const dof_id_type n_nodes
Definition: tecplot_io.C:67
libmesh_assert(ctx)
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
unsigned int read_SCALAR_dofs(const unsigned int var, Xdr &io, NumericVector< Number > *vec) const
Reads the SCALAR dofs from the stream io and assigns the values to the appropriate entries of vec...
Definition: system_io.C:1089
unsigned int n_vars() const
Definition: system.h:2349
virtual dof_id_type n_elem() const =0
processor_id_type processor_id() const
template class LIBMESH_EXPORT NumericVector< Number >
virtual dof_id_type n_nodes() const =0
uint8_t dof_id_type
Definition: id_types.h:67

◆ read_serialized_vectors() [2/2]

template LIBMESH_EXPORT std::size_t libMesh::System::read_serialized_vectors< Real > ( Xdr io,
const std::vector< NumericVector< Number > *> &  vectors 
) const
inlineinherited

Non-templated version for backward compatibility.

Read a number of identically distributed vectors. This method allows for optimization for the multiple vector case by only communicating the metadata once.

Definition at line 1311 of file system.h.

1313  { return read_serialized_vectors<Number>(io, vectors); }

◆ reinit()

void libMesh::DifferentiableSystem::reinit ( )
overridevirtualinherited

Reinitializes the member data fields associated with the system, so that, e.g., assemble() may be used.

Reimplemented from libMesh::System.

Definition at line 82 of file diff_system.C.

References libMesh::libmesh_assert(), libMesh::System::reinit(), and libMesh::DifferentiableSystem::time_solver.

83 {
85 
87  libmesh_assert_equal_to (&(time_solver->system()), this);
88 
89  time_solver->reinit();
90 }
virtual void reinit()
Reinitializes degrees of freedom and other required data on the current mesh.
Definition: system.C:446
std::unique_ptr< TimeSolver > time_solver
A pointer to the solver object we&#39;re going to use.
Definition: diff_system.h:251
libmesh_assert(ctx)

◆ reinit_constraints()

void libMesh::System::reinit_constraints ( )
virtualinherited

Reinitializes the constraints for this system.

Definition at line 480 of file system.C.

References libMesh::System::_mesh, libMesh::DofMap::create_dof_constraints(), libMesh::System::get_dof_map(), libMesh::DofMap::prepare_send_list(), libMesh::DofMap::process_constraints(), libMesh::System::time, and libMesh::System::user_constrain().

Referenced by libMesh::EquationSystems::allgather(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::System::init_data(), and libMesh::EquationSystems::reinit_solutions().

481 {
482  parallel_object_only();
483 
484 #ifdef LIBMESH_ENABLE_CONSTRAINTS
486  user_constrain();
488 #endif
490 }
Real time
For time-dependent problems, this is the time t at the beginning of the current timestep.
Definition: system.h:1595
void process_constraints(MeshBase &)
Postprocesses any constrained degrees of freedom to be constrained only in terms of unconstrained dof...
void create_dof_constraints(const MeshBase &, Real time=0)
Rebuilds the raw degree of freedom and DofObject constraints, based on attached DirichletBoundary obj...
void prepare_send_list()
Takes the _send_list vector (which may have duplicate entries) and sorts it.
Definition: dof_map.C:1692
virtual void user_constrain()
Calls user&#39;s attached constraint function, or is overridden by the user in derived classes...
Definition: system.C:2273
const DofMap & get_dof_map() const
Definition: system.h:2293
MeshBase & _mesh
Constant reference to the mesh data structure used for the simulation.
Definition: system.h:2125

◆ reinit_mesh()

void libMesh::System::reinit_mesh ( )
virtualinherited

Reinitializes the system with a new mesh.

Definition at line 304 of file system.C.

References libMesh::System::_basic_system_only, libMesh::System::init_data(), libMesh::System::n_vars(), and libMesh::System::user_initialization().

305 {
306  parallel_object_only();
307 
308  // First initialize any required data:
309  // either only the basic System data
310  if (_basic_system_only)
312  // or all the derived class' data too
313  else
314  this->init_data();
315 
316  // If no variables have been added to this system
317  // don't do anything
318  if (!this->n_vars())
319  return;
320 
321  // Then call the user-provided initialization function
322  this->user_initialization();
323 
324 }
bool _basic_system_only
Holds true if the components of more advanced system types (e.g.
Definition: system.h:2204
virtual void init_data()
Initializes the data for the system.
Definition: system.C:216
virtual void user_initialization()
Calls user&#39;s attached initialization function, or is overridden by the user in derived classes...
Definition: system.C:2245
unsigned int n_vars() const
Definition: system.h:2349

◆ release_linear_solver()

void libMesh::ImplicitSystem::release_linear_solver ( LinearSolver< Number > *  ) const
virtualinherited

Currently a no-op.

Definition at line 1218 of file implicit_system.C.

1219 {
1220  // This function was originally paired with get_linear_solver()
1221  // calls when that returned a dumb pointer which needed to be
1222  // cleaned up. Since get_linear_solver() now just returns a pointer
1223  // to a LinearSolver object managed by this class, this function no
1224  // longer needs to do any cleanup.
1225  libmesh_deprecated();
1226 }

◆ remove_matrix()

void libMesh::System::remove_matrix ( std::string_view  mat_name)
inherited

Removes the additional matrix mat_name from this system.

Definition at line 1032 of file system.C.

References libMesh::System::_matrices.

1033 {
1034  parallel_object_only(); // Not strictly needed, but the only safe way to keep in sync
1035 
1036  matrices_iterator pos = _matrices.find(mat_name);
1037 
1038  // Return if the matrix does not exist
1039  if (pos == _matrices.end())
1040  return;
1041 
1042  _matrices.erase(pos); // erase()'d entries are destroyed
1043 }
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> >::iterator matrices_iterator
Matrix iterator typedefs.
Definition: system.h:1809
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2181

◆ remove_vector()

void libMesh::System::remove_vector ( std::string_view  vec_name)
inherited

Removes the additional vector vec_name from this system.

Definition at line 846 of file system.C.

References libMesh::System::_vector_is_adjoint, libMesh::System::_vector_projections, libMesh::System::_vectors, and libMesh::libmesh_assert().

Referenced by libMesh::AdjointRefinementEstimator::estimate_error(), and libMesh::UnsteadySolver::integrate_adjoint_sensitivity().

847 {
848  parallel_object_only(); // Not strictly needed, but the only safe way to keep in sync
849 
850  vectors_iterator pos = _vectors.find(vec_name);
851 
852  //Return if the vector does not exist
853  if (pos == _vectors.end())
854  return;
855 
856  _vectors.erase(pos);
857  auto proj_it = _vector_projections.find(vec_name);
858  libmesh_assert(proj_it != _vector_projections.end());
859  _vector_projections.erase(proj_it);
860 
861  auto adj_it = _vector_is_adjoint.find(vec_name);
862  libmesh_assert(adj_it != _vector_is_adjoint.end());
863  _vector_is_adjoint.erase(adj_it);
864 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> >::iterator vectors_iterator
Vector iterator typedefs.
Definition: system.h:766
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
std::map< std::string, int, std::less<> > _vector_is_adjoint
Holds non-negative if a vector by that name should be projected using adjoint constraints/BCs, -1 if primal.
Definition: system.h:2176
libmesh_assert(ctx)
std::map< std::string, bool, std::less<> > _vector_projections
Holds true if a vector by that name should be projected onto a changed grid, false if it should be ze...
Definition: system.h:2170

◆ request_matrix() [1/2]

const SparseMatrix< Number > * libMesh::System::request_matrix ( std::string_view  mat_name) const
inherited
Returns
A const pointer to this system's additional matrix named mat_name, or nullptr if no matrix by that name exists.

Definition at line 1047 of file system.C.

References libMesh::System::_matrices.

Referenced by libMesh::EigenSystem::has_matrix_A(), libMesh::EigenSystem::has_matrix_B(), libMesh::EigenSystem::has_precond_matrix(), libMesh::ImplicitSystem::sensitivity_solve(), libMesh::NewtonSolver::solve(), and libMesh::LinearImplicitSystem::solve().

1048 {
1049  // Make sure the matrix exists
1050  const_matrices_iterator pos = _matrices.find(mat_name);
1051 
1052  if (pos == _matrices.end())
1053  return nullptr;
1054 
1055  return pos->second.get();
1056 }
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> >::const_iterator const_matrices_iterator
Definition: system.h:1810
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2181

◆ request_matrix() [2/2]

SparseMatrix< Number > * libMesh::System::request_matrix ( std::string_view  mat_name)
inherited
Returns
A writable pointer to this system's additional matrix named mat_name, or nullptr if no matrix by that name exists.

Definition at line 1060 of file system.C.

References libMesh::System::_matrices.

1061 {
1062  // Make sure the matrix exists
1063  matrices_iterator pos = _matrices.find(mat_name);
1064 
1065  if (pos == _matrices.end())
1066  return nullptr;
1067 
1068  return pos->second.get();
1069 }
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> >::iterator matrices_iterator
Matrix iterator typedefs.
Definition: system.h:1809
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2181

◆ request_vector() [1/4]

const NumericVector< Number > * libMesh::System::request_vector ( std::string_view  vec_name) const
inherited
Returns
A const pointer to the vector if this System has a vector associated with the given name, nullptr otherwise.

Definition at line 866 of file system.C.

References libMesh::System::_vectors.

Referenced by libMesh::UniformRefinementEstimator::_estimate_error().

867 {
868  const_vectors_iterator pos = _vectors.find(vec_name);
869 
870  if (pos == _vectors.end())
871  return nullptr;
872 
873  return pos->second.get();
874 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> >::const_iterator const_vectors_iterator
Definition: system.h:767

◆ request_vector() [2/4]

NumericVector< Number > * libMesh::System::request_vector ( std::string_view  vec_name)
inherited
Returns
A pointer to the vector if this System has a vector associated with the given name, nullptr otherwise.

Definition at line 878 of file system.C.

References libMesh::System::_vectors.

879 {
880  vectors_iterator pos = _vectors.find(vec_name);
881 
882  if (pos == _vectors.end())
883  return nullptr;
884 
885  return pos->second.get();
886 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> >::iterator vectors_iterator
Vector iterator typedefs.
Definition: system.h:766
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164

◆ request_vector() [3/4]

const NumericVector< Number > * libMesh::System::request_vector ( const unsigned int  vec_num) const
inherited
Returns
A const pointer to this system's additional vector number vec_num (where the vectors are counted starting with 0), or nullptr if the system has no such vector.

Definition at line 890 of file system.C.

References libMesh::System::_vectors, and libMesh::System::vectors_begin().

891 {
892  // If we don't have that many vectors, return nullptr
893  if (vec_num >= _vectors.size())
894  return nullptr;
895 
896  // Otherwise return a pointer to the vec_num'th vector
897  auto it = vectors_begin();
898  std::advance(it, vec_num);
899  return it->second.get();
900 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
vectors_iterator vectors_begin()
Beginning of vectors container.
Definition: system.h:2483

◆ request_vector() [4/4]

NumericVector< Number > * libMesh::System::request_vector ( const unsigned int  vec_num)
inherited
Returns
A writable pointer to this system's additional vector number vec_num (where the vectors are counted starting with 0), or nullptr if the system has no such vector.

Definition at line 904 of file system.C.

References libMesh::System::_vectors, and libMesh::System::vectors_begin().

905 {
906  // If we don't have that many vectors, return nullptr
907  if (vec_num >= _vectors.size())
908  return nullptr;
909 
910  // Otherwise return a pointer to the vec_num'th vector
911  auto it = vectors_begin();
912  std::advance(it, vec_num);
913  return it->second.get();
914 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
vectors_iterator vectors_begin()
Beginning of vectors container.
Definition: system.h:2483

◆ restrict_solve_to()

void libMesh::System::restrict_solve_to ( const SystemSubset subset,
const SubsetSolveMode  subset_solve_mode = SUBSET_ZERO 
)
virtualinherited

After calling this method, any solve will be restricted to the given subdomain.

To disable this mode, call this method with subset being a nullptr.

Reimplemented in libMesh::LinearImplicitSystem.

Definition at line 540 of file system.C.

542 {
543  if (subset != nullptr)
544  libmesh_not_implemented();
545 }

◆ restrict_vectors()

void libMesh::System::restrict_vectors ( )
virtualinherited

Restrict vectors after the mesh has coarsened.

Definition at line 378 of file system.C.

References libMesh::System::_dof_map, libMesh::System::_solution_projection, libMesh::System::_vector_projections, libMesh::System::_vectors, libMesh::System::current_local_solution, libMesh::NumericVector< T >::get(), libMesh::GHOSTED, libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), libMesh::PARALLEL, libMesh::System::project_vector(), libMesh::System::solution, and libMesh::System::vector_is_adjoint().

Referenced by libMesh::System::prolong_vectors(), and libMesh::EquationSystems::reinit_solutions().

379 {
380  parallel_object_only();
381 
382 #ifdef LIBMESH_ENABLE_AMR
383  // Restrict the _vectors on the coarsened cells
384  for (auto & [vec_name, vec] : _vectors)
385  {
386  NumericVector<Number> * v = vec.get();
387 
388  if (_vector_projections[vec_name])
389  {
390  this->project_vector (*v, this->vector_is_adjoint(vec_name));
391  }
392  else
393  {
394  const ParallelType type = vec->type();
395 
396  if (type == GHOSTED)
397  {
398 #ifdef LIBMESH_ENABLE_GHOSTED
399  vec->init (this->n_dofs(), this->n_local_dofs(),
400  _dof_map->get_send_list(), /*fast=*/false,
401  GHOSTED);
402 #else
403  libmesh_error_msg("Cannot initialize ghosted vectors when they are not enabled.");
404 #endif
405  }
406  else
407  vec->init (this->n_dofs(), this->n_local_dofs(), false, type);
408  }
409  }
410 
411  const std::vector<dof_id_type> & send_list = _dof_map->get_send_list ();
412 
413  // Restrict the solution on the coarsened cells
415  this->project_vector (*solution);
416  // Or at least make sure the solution vector is the correct size
417  else
418  solution->init (this->n_dofs(), this->n_local_dofs(), true, PARALLEL);
419 
420 #ifdef LIBMESH_ENABLE_GHOSTED
421  current_local_solution->init(this->n_dofs(),
422  this->n_local_dofs(), send_list,
423  false, GHOSTED);
424 #else
425  current_local_solution->init(this->n_dofs());
426 #endif
427 
429  solution->localize (*current_local_solution, send_list);
430 
431 #endif // LIBMESH_ENABLE_AMR
432 }
int vector_is_adjoint(std::string_view vec_name) const
Definition: system.C:1120
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2113
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
dof_id_type n_local_dofs() const
Definition: system.C:150
dof_id_type n_dofs() const
Definition: system.C:113
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
bool _solution_projection
Holds true if the solution vector should be projected onto a changed grid, false if it should be zero...
Definition: system.h:2198
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1585
void project_vector(NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1) const
Projects arbitrary functions onto a vector of degree of freedom values for the current system...
template class LIBMESH_EXPORT NumericVector< Number >
std::map< std::string, bool, std::less<> > _vector_projections
Holds true if a vector by that name should be projected onto a changed grid, false if it should be ze...
Definition: system.h:2170
ParallelType
Defines an enum for parallel data structure types.

◆ sensitivity_solve()

std::pair< unsigned int, Real > libMesh::ImplicitSystem::sensitivity_solve ( const ParameterVector parameters)
overridevirtualinherited

Assembles & solves the linear system(s) (dR/du)*u_p = -dR/dp, for those parameters contained within parameters.

Returns
A pair with the total number of linear iterations performed and the (sum of the) final residual norms

Reimplemented from libMesh::System.

Definition at line 113 of file implicit_system.C.

References libMesh::System::add_sensitivity_solution(), libMesh::System::assemble_before_solve, libMesh::ImplicitSystem::assemble_residual_derivatives(), libMesh::ImplicitSystem::assembly(), libMesh::SparseMatrix< T >::close(), libMesh::DofMap::enforce_constraints_exactly(), libMesh::System::get_dof_map(), libMesh::ImplicitSystem::get_linear_solve_parameters(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::System::get_sensitivity_rhs(), libMesh::System::get_sensitivity_solution(), libMesh::make_range(), libMesh::ImplicitSystem::matrix, libMesh::System::request_matrix(), libMesh::ParameterVector::size(), and libMesh::LinearSolver< T >::solve().

Referenced by libMesh::ImplicitSystem::forward_qoi_parameter_sensitivity(), and libMesh::ImplicitSystem::qoi_parameter_hessian().

114 {
115  // Log how long the linear solve takes.
116  LOG_SCOPE("sensitivity_solve()", "ImplicitSystem");
117 
118  // The forward system should now already be solved.
119  // Now assemble the corresponding sensitivity system.
120 
121  if (this->assemble_before_solve)
122  {
123  // Build the Jacobian
124  this->assembly(false, true);
125  this->matrix->close();
126 
127  // Reset and build the RHS from the residual derivatives
128  this->assemble_residual_derivatives(parameters);
129  }
130 
131  // The sensitivity problem is linear
132  LinearSolver<Number> * solver = this->get_linear_solver();
133 
134  // Our iteration counts and residuals will be sums of the individual
135  // results
136  std::pair<unsigned int, Real> solver_params =
138  std::pair<unsigned int, Real> totalrval = std::make_pair(0,0.0);
139 
140  // Solve the linear system.
141  SparseMatrix<Number> * pc = this->request_matrix("Preconditioner");
142  for (auto p : make_range(parameters.size()))
143  {
144  std::pair<unsigned int, Real> rval =
145  solver->solve (*matrix, pc,
146  this->add_sensitivity_solution(p),
147  this->get_sensitivity_rhs(p),
148  double(solver_params.second),
149  solver_params.first);
150 
151  totalrval.first += rval.first;
152  totalrval.second += rval.second;
153  }
154 
155  // The linear solver may not have fit our constraints exactly
156 #ifdef LIBMESH_ENABLE_CONSTRAINTS
157  for (auto p : make_range(parameters.size()))
159  (*this, &this->get_sensitivity_solution(p),
160  /* homogeneous = */ true);
161 #endif
162 
163  return totalrval;
164 }
virtual std::pair< unsigned int, Real > get_linear_solve_parameters() const
NumericVector< Number > & get_sensitivity_solution(unsigned int i=0)
Definition: system.C:1140
NumericVector< Number > & get_sensitivity_rhs(unsigned int i=0)
Definition: system.C:1285
virtual LinearSolver< Number > * get_linear_solver() const
const SparseMatrix< Number > * request_matrix(std::string_view mat_name) const
Definition: system.C:1047
virtual void assembly(bool, bool, bool=false, bool=false)
Assembles a residual in rhs and/or a jacobian in matrix, as requested.
template class LIBMESH_EXPORT LinearSolver< Number >
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
template class LIBMESH_EXPORT SparseMatrix< Number >
SparseMatrix< Number > * matrix
The system matrix.
virtual void assemble_residual_derivatives(const ParameterVector &parameters) override
Residual parameter derivative function.
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
NumericVector< Number > & add_sensitivity_solution(unsigned int i=0)
Definition: system.C:1130
bool assemble_before_solve
Flag which tells the system to whether or not to call the user assembly function during each call to ...
Definition: system.h:1527
const DofMap & get_dof_map() const
Definition: system.h:2293
void enforce_constraints_exactly(const System &system, NumericVector< Number > *v=nullptr, bool homogeneous=false) const
Constrains the numeric vector v, which represents a solution defined on the mesh. ...
Definition: dof_map.h:2274

◆ set_adjoint_already_solved()

void libMesh::System::set_adjoint_already_solved ( bool  setting)
inlineinherited

Setter for the adjoint_already_solved boolean.

Definition at line 412 of file system.h.

References libMesh::System::adjoint_already_solved.

Referenced by main().

413  { adjoint_already_solved = setting;}
bool adjoint_already_solved
Has the adjoint problem already been solved? If the user sets adjoint_already_solved to true...
Definition: system.h:2242

◆ set_basic_system_only()

void libMesh::System::set_basic_system_only ( )
inlineinherited

Sets the system to be "basic only": i.e.

advanced system components such as ImplicitSystem matrices may not be initialized. This is useful for efficiency in certain utility programs that never use System::solve(). This method must be called after the System or derived class is created but before it is initialized; e.g. from within EquationSystems::read()

Definition at line 2341 of file system.h.

References libMesh::System::_basic_system_only.

Referenced by libMesh::EquationSystems::read().

2342 {
2343  _basic_system_only = true;
2344 }
bool _basic_system_only
Holds true if the components of more advanced system types (e.g.
Definition: system.h:2204

◆ set_constrain_in_solver()

void libMesh::DifferentiableSystem::set_constrain_in_solver ( bool  enable)
virtualinherited

set_constrain_in_solver to false to apply constraints only via residual terms in the systems to be solved.

Definition at line 422 of file diff_system.C.

References libMesh::DifferentiableSystem::_constrain_in_solver, and libMesh::DifferentiableSystem::time_solver.

Referenced by main(), and set_system_parameters().

423 {
424  _constrain_in_solver = enable;
425  this->time_solver->diff_solver()->set_exact_constraint_enforcement(enable);
426 }
bool _constrain_in_solver
_constrain_in_solver defaults to true; if false then we apply constraints only via residual terms in ...
Definition: diff_system.h:430
std::unique_ptr< TimeSolver > time_solver
A pointer to the solver object we&#39;re going to use.
Definition: diff_system.h:251

◆ set_mesh_system()

void libMesh::DifferentiablePhysics::set_mesh_system ( System sys)
inlinevirtualinherited

Tells the DifferentiablePhysics that system sys contains the isoparametric Lagrangian variables which correspond to the coordinates of mesh nodes, in problems where the mesh itself is expected to move in time.

The system with mesh coordinate data (which may be this system itself, for fully coupled moving mesh problems) is currently assumed to have new (end of time step) mesh coordinates stored in solution, old (beginning of time step) mesh coordinates stored in _old_nonlinear_solution, and constant velocity motion during each time step.

Activating this function ensures that local (but not neighbor!) element geometry is correctly repositioned when evaluating element residuals.

Currently sys must be *this for a tightly coupled moving mesh problem or nullptr to stop mesh movement; loosely coupled moving mesh problems are not implemented.

This code is experimental. "Trust but verify, and not in that order"

Definition at line 569 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_mesh_sys.

Referenced by SolidSystem::init_data().

570 {
571  // For now we assume that we're doing fully coupled mesh motion
572  // if (sys && sys != this)
573  // libmesh_not_implemented();
574 
575  // For the foreseeable future we'll assume that we keep these
576  // Systems in the same EquationSystems
577  // libmesh_assert_equal_to (&this->get_equation_systems(),
578  // &sys->get_equation_systems());
579 
580  // And for the immediate future this code may not even work
581  libmesh_experimental();
582 
583  _mesh_sys = sys;
584 }
System * _mesh_sys
System from which to acquire moving mesh information.
Definition: diff_physics.h:531

◆ set_mesh_x_var()

void libMesh::DifferentiablePhysics::set_mesh_x_var ( unsigned int  var)
inlinevirtualinherited

Tells the DifferentiablePhysics that variable var from the mesh system should be used to update the x coordinate of mesh nodes, in problems where the mesh itself is expected to move in time.

The system with mesh coordinate data (which may be this system itself, for fully coupled moving mesh problems) is currently assumed to have new (end of time step) mesh coordinates stored in solution, old (beginning of time step) mesh coordinates stored in _old_nonlinear_solution, and constant velocity motion during each time step.

Activating this function ensures that local (but not neighbor!) element geometry is correctly repositioned when evaluating element residuals.

Definition at line 589 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_mesh_x_var.

Referenced by SolidSystem::init_data().

590 {
591  _mesh_x_var = var;
592 }
unsigned int _mesh_x_var
Variables from which to acquire moving mesh information.
Definition: diff_physics.h:536

◆ set_mesh_y_var()

void libMesh::DifferentiablePhysics::set_mesh_y_var ( unsigned int  var)
inlinevirtualinherited

Tells the DifferentiablePhysics that variable var from the mesh system should be used to update the y coordinate of mesh nodes.

Definition at line 597 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_mesh_y_var.

Referenced by SolidSystem::init_data().

598 {
599  _mesh_y_var = var;
600 }

◆ set_mesh_z_var()

void libMesh::DifferentiablePhysics::set_mesh_z_var ( unsigned int  var)
inlinevirtualinherited

Tells the DifferentiablePhysics that variable var from the mesh system should be used to update the z coordinate of mesh nodes.

Definition at line 605 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_mesh_z_var.

Referenced by SolidSystem::init_data().

606 {
607  _mesh_z_var = var;
608 }

◆ set_numerical_jacobian_h_for_var()

void FEMSystem::set_numerical_jacobian_h_for_var ( unsigned int  var_num,
Real  new_h 
)
inlineinherited

Definition at line 275 of file fem_system.h.

References libMesh::FEMSystem::_numerical_jacobian_h_for_var, and libMesh::Real.

277 {
278  if (_numerical_jacobian_h_for_var.size() <= var_num)
279  _numerical_jacobian_h_for_var.resize(var_num+1,Real(0));
280 
281  libmesh_assert_greater(new_h, Real(0));
282 
283  _numerical_jacobian_h_for_var[var_num] = new_h;
284 }
std::vector< Real > _numerical_jacobian_h_for_var
Definition: fem_system.h:258
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ set_project_with_constraints()

void libMesh::System::set_project_with_constraints ( bool  _project_with_constraints)
inlineinherited

Definition at line 1780 of file system.h.

References libMesh::System::project_with_constraints.

Referenced by libMesh::AdjointRefinementEstimator::estimate_error().

1781  {
1782  project_with_constraints = _project_with_constraints;
1783  }
bool project_with_constraints
Do we want to apply constraints while projecting vectors ?
Definition: system.h:2253

◆ set_qoi() [1/2]

void libMesh::System::set_qoi ( unsigned int  qoi_index,
Number  qoi_value 
)
inherited

Definition at line 2326 of file system.C.

References libMesh::libmesh_assert(), and libMesh::System::qoi.

Referenced by libMesh::ExplicitSystem::assemble_qoi(), libMesh::FEMSystem::assemble_qoi(), libMesh::Euler2Solver::integrate_qoi_timestep(), libMesh::TwostepTimeSolver::integrate_qoi_timestep(), and libMesh::EulerSolver::integrate_qoi_timestep().

2327 {
2328  libmesh_assert(qoi_index < qoi.size());
2329 
2330  qoi[qoi_index] = qoi_value;
2331 }
std::vector< Number > qoi
Values of the quantities of interest.
Definition: system.h:1611
libmesh_assert(ctx)

◆ set_qoi() [2/2]

void libMesh::System::set_qoi ( std::vector< Number new_qoi)
inherited

Definition at line 2347 of file system.C.

References libMesh::System::qoi.

2348 {
2349  libmesh_assert_equal_to(this->qoi.size(), new_qoi.size());
2350  this->qoi = std::move(new_qoi);
2351 }
std::vector< Number > qoi
Values of the quantities of interest.
Definition: system.h:1611

◆ set_qoi_error_estimate()

void libMesh::System::set_qoi_error_estimate ( unsigned int  qoi_index,
Number  qoi_error_estimate 
)
inherited

Definition at line 2354 of file system.C.

References libMesh::libmesh_assert(), and libMesh::System::qoi_error_estimates.

Referenced by libMesh::Euler2Solver::integrate_adjoint_refinement_error_estimate(), libMesh::TwostepTimeSolver::integrate_adjoint_refinement_error_estimate(), and libMesh::EulerSolver::integrate_adjoint_refinement_error_estimate().

2355 {
2356  libmesh_assert(qoi_index < qoi_error_estimates.size());
2357 
2358  qoi_error_estimates[qoi_index] = qoi_error_estimate;
2359 }
libmesh_assert(ctx)
std::vector< Number > qoi_error_estimates
Vector to hold error estimates for qois, either from a steady state calculation, or from a single uns...
Definition: system.h:1619

◆ set_tf()

void HeatSystem::set_tf ( Real  val)
inline

Definition at line 71 of file heatsystem.h.

72  {
73  tf = val;
74  }

◆ set_time_solver()

void libMesh::DifferentiableSystem::set_time_solver ( std::unique_ptr< TimeSolver _time_solver)
inlineinherited

Sets the time_solver FIXME: This code is a little dangerous as it transfers ownership from the TimeSolver creator to this class.

The user must no longer access his original TimeSolver object after calling this function.

Definition at line 259 of file diff_system.h.

References libMesh::DifferentiableSystem::time_solver.

260  {
261  time_solver.reset(_time_solver.release());
262  }
std::unique_ptr< TimeSolver > time_solver
A pointer to the solver object we&#39;re going to use.
Definition: diff_system.h:251

◆ set_vector_as_adjoint()

void libMesh::System::set_vector_as_adjoint ( const std::string &  vec_name,
int  qoi_num 
)
inherited

Allows one to set the QoI index controlling whether the vector identified by vec_name represents a solution from the adjoint (qoi_num >= 0) or primal (qoi_num == -1) space.

This becomes significant if those spaces have differing heterogeneous Dirichlet constraints.

qoi_num == -2 can be used to indicate a vector which should not be affected by constraints during projection operations.

Definition at line 1107 of file system.C.

References libMesh::System::_vector_is_adjoint.

Referenced by libMesh::System::add_adjoint_solution(), and libMesh::System::add_weighted_sensitivity_adjoint_solution().

1109 {
1110  parallel_object_only(); // Not strictly needed, but the only safe way to keep in sync
1111 
1112  // We reserve -1 for vectors which get primal constraints, -2 for
1113  // vectors which get no constraints
1114  libmesh_assert_greater_equal(qoi_num, -2);
1115  _vector_is_adjoint[vec_name] = qoi_num;
1116 }
std::map< std::string, int, std::less<> > _vector_is_adjoint
Holds non-negative if a vector by that name should be projected using adjoint constraints/BCs, -1 if primal.
Definition: system.h:2176

◆ set_vector_preservation()

void libMesh::System::set_vector_preservation ( const std::string &  vec_name,
bool  preserve 
)
inherited

Allows one to set the boolean controlling whether the vector identified by vec_name should be "preserved": projected to new meshes, saved, etc.

Definition at line 1087 of file system.C.

References libMesh::System::_vector_projections.

Referenced by libMesh::AdjointRefinementEstimator::estimate_error(), and main().

1089 {
1090  parallel_object_only(); // Not strictly needed, but the only safe way to keep in sync
1091 
1092  _vector_projections[vec_name] = preserve;
1093 }
std::map< std::string, bool, std::less<> > _vector_projections
Holds true if a vector by that name should be projected onto a changed grid, false if it should be ze...
Definition: system.h:2170

◆ side_constraint()

virtual bool libMesh::DifferentiablePhysics::side_constraint ( bool  request_jacobian,
DiffContext  
)
inlinevirtualinherited

Adds the constraint contribution on side of elem to elem_residual.

If this method receives request_jacobian = true, then it should compute elem_jacobian and return true if possible. If elem_jacobian has not been computed then the method should return false.

Users may need to reimplement this for their particular PDE depending on the boundary conditions.

To implement a weak form of the constraint 0 = G(u), the user should examine u = elem_solution and add (G(u), phi_i) boundary integral contributions to elem_residual in side_constraint().

Reimplemented in LaplaceSystem, LaplaceSystem, LaplaceSystem, and NavierSystem.

Definition at line 195 of file diff_physics.h.

Referenced by libMesh::EulerSolver::side_residual(), libMesh::SteadySolver::side_residual(), libMesh::Euler2Solver::side_residual(), libMesh::EigenTimeSolver::side_residual(), and libMesh::NewmarkSolver::side_residual().

197  {
198  return request_jacobian;
199  }

◆ side_damping_residual()

virtual bool libMesh::DifferentiablePhysics::side_damping_residual ( bool  request_jacobian,
DiffContext  
)
inlinevirtualinherited

Subtracts a damping vector contribution on side of elem from elem_residual.

If this method receives request_jacobian = true, then it should compute elem_jacobian and return true if possible. If elem_jacobian has not been computed then the method should return false.

For most problems, the default implementation of "do nothing" is correct; users with boundary conditions including first time derivatives may need to reimplement this themselves.

Definition at line 378 of file diff_physics.h.

Referenced by libMesh::EulerSolver::side_residual(), libMesh::Euler2Solver::side_residual(), and libMesh::NewmarkSolver::side_residual().

380  {
381  return request_jacobian;
382  }

◆ side_mass_residual()

virtual bool libMesh::DifferentiablePhysics::side_mass_residual ( bool  request_jacobian,
DiffContext  
)
inlinevirtualinherited

Subtracts a mass vector contribution on side of elem from elem_residual.

If this method receives request_jacobian = true, then it should compute elem_jacobian and return true if possible. If elem_jacobian has not been computed then the method should return false.

For most problems, the default implementation of "do nothing" is correct; users with boundary conditions including time derivatives may need to reimplement this themselves.

Definition at line 320 of file diff_physics.h.

Referenced by libMesh::EulerSolver::side_residual(), libMesh::Euler2Solver::side_residual(), libMesh::EigenTimeSolver::side_residual(), and libMesh::NewmarkSolver::side_residual().

322  {
323  return request_jacobian;
324  }

◆ side_postprocess()

virtual void libMesh::DifferentiableSystem::side_postprocess ( DiffContext )
inlinevirtualinherited

Does any work that needs to be done on side of elem in a postprocessing loop.

Reimplemented in LaplaceSystem, and LaplaceSystem.

Definition at line 305 of file diff_system.h.

305 {}

◆ side_qoi()

virtual void libMesh::DifferentiableQoI::side_qoi ( DiffContext ,
const QoISet  
)
inlinevirtualinherited

Does any work that needs to be done on side of elem in a quantity of interest assembly loop, outputting to elem_qoi.

Only qois included in the supplied QoISet need to be assembled.

Reimplemented in CoupledSystemQoI.

Definition at line 147 of file diff_qoi.h.

149  {}

◆ side_qoi_derivative()

virtual void libMesh::DifferentiableQoI::side_qoi_derivative ( DiffContext ,
const QoISet  
)
inlinevirtualinherited

Does any work that needs to be done on side of elem in a quantity of interest derivative assembly loop, outputting to elem_qoi_derivative.

Only qois included in the supplied QoISet need their derivatives assembled.

Reimplemented in LaplaceSystem, LaplaceSystem, and CoupledSystemQoI.

Definition at line 159 of file diff_qoi.h.

161  {}

◆ side_time_derivative()

virtual bool libMesh::DifferentiablePhysics::side_time_derivative ( bool  request_jacobian,
DiffContext  
)
inlinevirtualinherited

Adds the time derivative contribution on side of elem to elem_residual.

If this method receives request_jacobian = true, then it should compute elem_jacobian and return true if possible. If elem_jacobian has not been computed then the method should return false.

Users may need to reimplement this for their particular PDE depending on the boundary conditions.

To implement a weak form of the source term du/dt = F(u) on sides, such as might arise in a flux boundary condition, the user should examine u = elem_solution and add (F(u), phi_i) boundary integral contributions to elem_residual in side_constraint().

Reimplemented in ElasticitySystem, ElasticitySystem, CurlCurlSystem, CurlCurlSystem, and SolidSystem.

Definition at line 174 of file diff_physics.h.

Referenced by libMesh::EulerSolver::side_residual(), libMesh::SteadySolver::side_residual(), libMesh::Euler2Solver::side_residual(), libMesh::EigenTimeSolver::side_residual(), and libMesh::NewmarkSolver::side_residual().

176  {
177  return request_jacobian;
178  }

◆ solve()

void FEMSystem::solve ( )
overridevirtualinherited

Invokes the solver associated with the system.

For steady state solvers, this will find a root x where F(x) = 0. For transient solvers, this will integrate dx/dt = F(x).

For moving mesh systems, this also translates the mesh to the solution position.

Reimplemented from libMesh::DifferentiableSystem.

Reimplemented in libMesh::ContinuationSystem.

Definition at line 1076 of file fem_system.C.

References libMesh::FEMSystem::mesh_position_set(), and libMesh::DifferentiableSystem::solve().

Referenced by main().

1077 {
1078  // We are solving the primal problem
1079  Parent::solve();
1080 
1081  // On a moving mesh we want the mesh to reflect the new solution
1082  this->mesh_position_set();
1083 }
void mesh_position_set()
Tells the FEMSystem to set the mesh nodal coordinates which should correspond to degree of freedom co...
Definition: fem_system.C:1087
virtual void solve() override
Invokes the solver associated with the system.
Definition: diff_system.C:138

◆ solve_for_unconstrained_dofs()

void libMesh::System::solve_for_unconstrained_dofs ( NumericVector< Number > &  vec,
int  is_adjoint = -1 
) const
protectedinherited

Definition at line 2032 of file system_projection.C.

References libMesh::DofMap::build_sparsity(), libMesh::DofMap::computed_sparsity_already(), libMesh::DofMap::end_dof(), libMesh::DofMap::first_dof(), libMesh::NumericVector< T >::get(), libMesh::DofMap::heterogenously_constrain_element_matrix_and_vector(), libMesh::DofMap::is_constrained_dof(), libMesh::NumericVector< T >::local_size(), libMesh::DofMap::n_dofs(), libMesh::DofMap::n_local_dofs(), libMesh::PARALLEL, libMesh::Real, libMesh::NumericVector< T >::size(), and libMesh::DofMap::update_sparsity_pattern().

2034 {
2035  const DofMap & dof_map = this->get_dof_map();
2036 
2037  std::unique_ptr<SparseMatrix<Number>> mat =
2039 
2040  std::unique_ptr<SparsityPattern::Build> sp;
2041 
2042  if (dof_map.computed_sparsity_already())
2043  dof_map.update_sparsity_pattern(*mat);
2044  else
2045  {
2046  mat->attach_dof_map(dof_map);
2047  sp = dof_map.build_sparsity(this->get_mesh());
2048  mat->attach_sparsity_pattern(*sp);
2049  }
2050 
2051  mat->init();
2052 
2053  libmesh_assert_equal_to(vec.size(), dof_map.n_dofs());
2054  libmesh_assert_equal_to(vec.local_size(), dof_map.n_local_dofs());
2055 
2056  std::unique_ptr<NumericVector<Number>> rhs =
2058 
2059  rhs->init(dof_map.n_dofs(), dof_map.n_local_dofs(), false,
2060  PARALLEL);
2061 
2062  // Here we start with the unconstrained (and indeterminate) linear
2063  // system, K*u = f, where K is the identity matrix for constrained
2064  // DoFs and 0 elsewhere, and f is the current solution values for
2065  // constrained DoFs and 0 elsewhere.
2066  // We then apply the usual heterogeneous constraint matrix C and
2067  // offset h, where u = C*x + h,
2068  // to get C^T*K*C*x = C^T*f - C^T*K*h
2069  // - a constrained and no-longer-singular system that finds the
2070  // closest approximation for the unconstrained degrees of freedom.
2071  //
2072  // Here, though "closest" is in an algebraic sense; we're
2073  // effectively using a pseudoinverse that optimizes in a
2074  // discretization-dependent norm. That only seems to give ~0.1%
2075  // excess error even in coarse unit test cases, but at some point it
2076  // might be reasonable to weight K and f properly.
2077 
2078  for (dof_id_type d : IntRange<dof_id_type>(dof_map.first_dof(),
2079  dof_map.end_dof()))
2080  {
2081  if (dof_map.is_constrained_dof(d))
2082  {
2083  DenseMatrix<Number> K(1,1);
2084  DenseVector<Number> F(1);
2085  std::vector<dof_id_type> dof_indices(1, d);
2086  K(0,0) = 1;
2087  F(0) = (*this->solution)(d);
2088  dof_map.heterogenously_constrain_element_matrix_and_vector
2089  (K, F, dof_indices, false, is_adjoint);
2090  mat->add_matrix(K, dof_indices);
2091  rhs->add_vector(F, dof_indices);
2092  }
2093  }
2094 
2095  std::unique_ptr<LinearSolver<Number>> linear_solver =
2097 
2098  linear_solver->solve(*mat, vec, *rhs,
2099  double(this->get_equation_systems().parameters.get<Real>("linear solver tolerance")),
2100  this->get_equation_systems().parameters.get<unsigned int>("linear solver maximum iterations"));
2101 }
static std::unique_ptr< LinearSolver< T > > build(const libMesh::Parallel::Communicator &comm_in, const SolverPackage solver_package=libMesh::default_solver_package())
Builds a LinearSolver using the linear solver package specified by solver_package.
Definition: linear_solver.C:59
virtual numeric_index_type size() const =0
const EquationSystems & get_equation_systems() const
Definition: system.h:730
const Parallel::Communicator & comm() const
const MeshBase & get_mesh() const
Definition: system.h:2277
static std::unique_ptr< SparseMatrix< T > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package(), const MatrixBuildType matrix_build_type=MatrixBuildType::AUTOMATIC)
Builds a SparseMatrix<T> using the linear solver package specified by solver_package.
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package())
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual numeric_index_type local_size() const =0
const DofMap & get_dof_map() const
Definition: system.h:2293
uint8_t dof_id_type
Definition: id_types.h:67

◆ swap_physics()

void libMesh::DifferentiableSystem::swap_physics ( DifferentiablePhysics *&  swap_physics)
inherited

Swap current physics object with external object.

This is deprecated.

Definition at line 349 of file diff_system.C.

References libMesh::DifferentiableSystem::_diff_physics, libMesh::ImplicitSystem::disable_cache(), and libMesh::libmesh_assert().

350 {
351  // This isn't safe if users aren't very careful about memory
352  // management and they don't (or aren't able to due to an exception)
353  // swap back.
354  libmesh_deprecated();
355 
356  // A mess of code for backwards compatibility
357  if (this->_diff_physics.empty())
358  {
359  // Swap-something-else-for-self
360  std::unique_ptr<DifferentiablePhysics> scary_hack(swap_physics);
361  this->_diff_physics.push(std::move(scary_hack));
362  swap_physics = this;
363  }
364  else if (swap_physics == this)
365  {
366  // The user must be cleaning up after a previous
367  // swap-something-else-for-self
368  libmesh_assert(!this->_diff_physics.empty());
369 
370  // So we don't want to delete what got swapped in, but we do
371  // want to put it back into their pointer
372  DifferentiablePhysics * old_p = this->_diff_physics.top().release();
373  this->_diff_physics.pop();
374  swap_physics = old_p;
375 
376  // And if the user is doing anything more sophisticated than
377  // that then the user is sophisticated enough to upgrade to
378  // push/pop.
379  libmesh_assert(this->_diff_physics.empty());
380  }
381  else
382  {
383  // Swapping one external physics for another
384  DifferentiablePhysics * old_p = this->_diff_physics.top().release();
385  std::swap(old_p, swap_physics);
386  this->_diff_physics.top().reset(old_p);
387  }
388 
389  // If the physics has been swapped, we will reassemble
390  // the matrix from scratch before doing an adjoint solve
391  // rather than just transposing
392  this->disable_cache();
393 }
void swap_physics(DifferentiablePhysics *&swap_physics)
Swap current physics object with external object.
Definition: diff_system.C:349
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.
Definition: diff_system.h:440
libmesh_assert(ctx)
DifferentiablePhysics()
Constructor.
Definition: diff_physics.h:84
virtual void disable_cache() override
Avoids use of any cached data that might affect any solve result.

◆ system()

sys_type& libMesh::ImplicitSystem::system ( )
inlineinherited
Returns
A reference to *this.

Definition at line 86 of file implicit_system.h.

86 { return *this; }

◆ system_type()

virtual std::string libMesh::ImplicitSystem::system_type ( ) const
inlineoverridevirtualinherited
Returns
"Implicit". Helps in identifying the system type in an equation system file.

Reimplemented from libMesh::ExplicitSystem.

Reimplemented in libMesh::NonlinearImplicitSystem, libMesh::OptimizationSystem, libMesh::LinearImplicitSystem, libMesh::RBConstruction, libMesh::FrequencySystem, libMesh::TransientSystem< RBConstruction >, libMesh::NewmarkSystem, and SolidSystem.

Definition at line 116 of file implicit_system.h.

116 { return "Implicit"; }

◆ thread_join()

void libMesh::DifferentiableQoI::thread_join ( std::vector< Number > &  qoi,
const std::vector< Number > &  other_qoi,
const QoISet qoi_indices 
)
virtualinherited

Method to combine thread-local qois.

By default, simply sums thread qois.

Definition at line 33 of file diff_qoi.C.

References libMesh::index_range().

36 {
37  for (auto i : index_range(qoi))
38  qoi[i] += other_qoi[i];
39 }
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:111

◆ time_evolving()

void libMesh::DifferentiablePhysics::time_evolving ( unsigned int  var,
unsigned int  order 
)
virtualinherited

Tells the DiffSystem that variable var is evolving with respect to time.

In general, the user's init() function should call time_evolving() with order 1 for any variables which behave like du/dt = F(u), with order 2 for any variables that behave like d^2u/dt^2 = F(u), and should not call time_evolving() for any variables which behave like 0 = G(u).

Most derived systems will not have to reimplement this function; however any system which reimplements mass_residual() may have to reimplement time_evolving() to prepare data structures.

Definition at line 41 of file diff_physics.C.

References libMesh::DifferentiablePhysics::_first_order_vars, libMesh::DifferentiablePhysics::_second_order_vars, and libMesh::DifferentiablePhysics::_time_evolving.

Referenced by libMesh::DifferentiableSystem::add_second_order_dot_vars(), SigmaPhysics::init_data(), CurlCurlSystem::init_data(), and init_data().

43 {
44  libmesh_error_msg_if(order != 1 && order != 2, "Input order must be 1 or 2!");
45 
46  if (_time_evolving.size() <= var)
47  _time_evolving.resize(var+1, 0);
48 
49  _time_evolving[var] = order;
50 
51  if (order == 1)
52  _first_order_vars.insert(var);
53  else
54  _second_order_vars.insert(var);
55 }
std::set< unsigned int > _second_order_vars
Variable indices for those variables that are second order in time.
Definition: diff_physics.h:553
std::set< unsigned int > _first_order_vars
Variable indices for those variables that are first order in time.
Definition: diff_physics.h:548
std::vector< unsigned int > _time_evolving
Stores unsigned int to tell us which variables are evolving as first order in time (1)...
Definition: diff_physics.h:543

◆ update()

void libMesh::System::update ( )
virtualinherited

Update the local values to reflect the solution on neighboring processors.

Reimplemented in SolidSystem.

Definition at line 493 of file system.C.

References libMesh::System::_dof_map, libMesh::System::current_local_solution, libMesh::libmesh_assert(), and libMesh::System::solution.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::UniformRefinementEstimator::_estimate_error(), HDGProblem::assemble(), libMesh::FEMSystem::assemble_qoi(), libMesh::FEMSystem::assemble_qoi_derivative(), libMesh::NonlinearImplicitSystem::assembly(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::NewmarkSolver::compute_initial_accel(), compute_stresses(), LinearElasticityWithContact::compute_stresses(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), libMesh::Problem_Interface::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::GMVIO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), DMlibMeshFunction(), DMlibMeshJacobian(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::CondensedEigenSystem::get_eigenpair(), libMesh::TransientRBConstruction::initialize_truth(), libMesh::Euler2Solver::integrate_adjoint_refinement_error_estimate(), libMesh::EulerSolver::integrate_adjoint_refinement_error_estimate(), libMesh::libmesh_petsc_snes_fd_residual(), libMesh::libmesh_petsc_snes_jacobian(), libMesh::libmesh_petsc_snes_mffd_residual(), libMesh::libmesh_petsc_snes_residual(), libMesh::libmesh_petsc_snes_residual_helper(), libMesh::NewtonSolver::line_search(), libMesh::RBConstruction::load_basis_function(), libMesh::TransientRBConstruction::load_rb_solution(), libMesh::RBConstruction::load_rb_solution(), main(), libMesh::FEMSystem::mesh_position_get(), perturb_accumulate_residuals(), libMesh::FEMSystem::postprocess(), libMesh::ImplicitSystem::qoi_parameter_hessian(), libMesh::MemorySolutionHistory::retrieve(), libMesh::FileSolutionHistory::retrieve(), libMesh::NewtonSolver::solve(), libMesh::ExplicitSystem::solve(), libMesh::LinearImplicitSystem::solve(), libMesh::OptimizationSystem::solve(), libMesh::NonlinearImplicitSystem::solve(), libMesh::RBConstruction::solve_for_matrix_and_rhs(), libMesh::MeshFunctionSolutionTransfer::transfer(), and libMesh::DirectSolutionTransfer::transfer().

494 {
495  parallel_object_only();
496 
497  libmesh_assert(solution->closed());
498 
499  const std::vector<dof_id_type> & send_list = _dof_map->get_send_list ();
500 
501  // Check sizes
502  libmesh_assert_equal_to (current_local_solution->size(), solution->size());
503  // More processors than elements => empty send_list
504  // libmesh_assert (!send_list.empty());
505  libmesh_assert_less_equal (send_list.size(), solution->size());
506 
507  // Create current_local_solution from solution. This will
508  // put a local copy of solution into current_local_solution.
509  // Only the necessary values (specified by the send_list)
510  // are copied to minimize communication
511  solution->localize (*current_local_solution, send_list);
512 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2113
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
libmesh_assert(ctx)
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1585

◆ update_global_solution() [1/2]

void libMesh::System::update_global_solution ( std::vector< Number > &  global_soln) const
inherited

Fill the input vector global_soln so that it contains the global solution on all processors.

Requires communication with all other processors.

Definition at line 728 of file system.C.

References libMesh::System::solution.

Referenced by libMesh::ExactSolution::_compute_error(), libMesh::ExactErrorEstimator::estimate_error(), main(), and libMesh::InterMeshProjection::project_system_vectors().

729 {
730  parallel_object_only();
731 
732  global_soln.resize (solution->size());
733 
734  solution->localize (global_soln);
735 }
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573

◆ update_global_solution() [2/2]

void libMesh::System::update_global_solution ( std::vector< Number > &  global_soln,
const processor_id_type  dest_proc 
) const
inherited

Fill the input vector global_soln so that it contains the global solution on processor dest_proc.

Requires communication with all other processors.

Definition at line 739 of file system.C.

References libMesh::System::solution.

741 {
742  parallel_object_only();
743 
744  global_soln.resize (solution->size());
745 
746  solution->localize_to_one (global_soln, dest_proc);
747 }
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573

◆ user_assembly()

void libMesh::System::user_assembly ( )
virtualinherited

Calls user's attached assembly function, or is overridden by the user in derived classes.

Definition at line 2259 of file system.C.

References libMesh::System::_assemble_system_function, libMesh::System::_assemble_system_object, libMesh::System::_equation_systems, libMesh::System::Assembly::assemble(), and libMesh::System::name().

Referenced by libMesh::System::assemble().

2260 {
2261  // Call the user-provided assembly function,
2262  // if it was provided
2263  if (_assemble_system_function != nullptr)
2265 
2266  // ...or the user-provided assembly object.
2267  else if (_assemble_system_object != nullptr)
2269 }
Assembly * _assemble_system_object
Object that assembles the system.
Definition: system.h:2070
virtual void assemble()=0
Assembly function.
EquationSystems & _equation_systems
Constant reference to the EquationSystems object used for the simulation.
Definition: system.h:2119
const std::string & name() const
Definition: system.h:2261
void(* _assemble_system_function)(EquationSystems &es, const std::string &name)
Function that assembles the system.
Definition: system.h:2064

◆ user_constrain()

void libMesh::System::user_constrain ( )
virtualinherited

Calls user's attached constraint function, or is overridden by the user in derived classes.

Definition at line 2273 of file system.C.

References libMesh::System::_constrain_system_function, libMesh::System::_constrain_system_object, libMesh::System::_equation_systems, libMesh::System::Constraint::constrain(), and libMesh::System::name().

Referenced by libMesh::System::reinit_constraints().

2274 {
2275  // Call the user-provided constraint function,
2276  // if it was provided
2277  if (_constrain_system_function!= nullptr)
2279 
2280  // ...or the user-provided constraint object.
2281  else if (_constrain_system_object != nullptr)
2283 }
void(* _constrain_system_function)(EquationSystems &es, const std::string &name)
Function to impose constraints.
Definition: system.h:2075
Constraint * _constrain_system_object
Object that constrains the system.
Definition: system.h:2081
EquationSystems & _equation_systems
Constant reference to the EquationSystems object used for the simulation.
Definition: system.h:2119
virtual void constrain()=0
Constraint function.
const std::string & name() const
Definition: system.h:2261

◆ user_initialization()

void libMesh::System::user_initialization ( )
virtualinherited

Calls user's attached initialization function, or is overridden by the user in derived classes.

Definition at line 2245 of file system.C.

References libMesh::System::_equation_systems, libMesh::System::_init_system_function, libMesh::System::_init_system_object, libMesh::System::Initialization::initialize(), and libMesh::System::name().

Referenced by libMesh::System::init(), libMesh::NewmarkSystem::initial_conditions(), and libMesh::System::reinit_mesh().

2246 {
2247  // Call the user-provided initialization function,
2248  // if it was provided
2249  if (_init_system_function != nullptr)
2250  this->_init_system_function (_equation_systems, this->name());
2251 
2252  // ...or the user-provided initialization object.
2253  else if (_init_system_object != nullptr)
2255 }
virtual void initialize()=0
Initialization function.
Initialization * _init_system_object
Object that initializes the system.
Definition: system.h:2059
void(* _init_system_function)(EquationSystems &es, const std::string &name)
Function that initializes the system.
Definition: system.h:2053
EquationSystems & _equation_systems
Constant reference to the EquationSystems object used for the simulation.
Definition: system.h:2119
const std::string & name() const
Definition: system.h:2261

◆ user_QOI()

void libMesh::System::user_QOI ( const QoISet qoi_indices)
virtualinherited

Calls user's attached quantity of interest function, or is overridden by the user in derived classes.

Definition at line 2287 of file system.C.

References libMesh::System::_equation_systems, libMesh::System::_qoi_evaluate_function, libMesh::System::_qoi_evaluate_object, libMesh::System::name(), and libMesh::System::QOI::qoi().

Referenced by libMesh::System::assemble_qoi().

2288 {
2289  // Call the user-provided quantity of interest function,
2290  // if it was provided
2291  if (_qoi_evaluate_function != nullptr)
2292  this->_qoi_evaluate_function(_equation_systems, this->name(), qoi_indices);
2293 
2294  // ...or the user-provided QOI function object.
2295  else if (_qoi_evaluate_object != nullptr)
2296  this->_qoi_evaluate_object->qoi(qoi_indices);
2297 }
void(* _qoi_evaluate_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices)
Function to evaluate quantity of interest.
Definition: system.h:2086
virtual void qoi(const QoISet &qoi_indices)=0
Quantity of interest function.
QOI * _qoi_evaluate_object
Object to compute quantities of interest.
Definition: system.h:2093
EquationSystems & _equation_systems
Constant reference to the EquationSystems object used for the simulation.
Definition: system.h:2119
const std::string & name() const
Definition: system.h:2261

◆ user_QOI_derivative()

void libMesh::System::user_QOI_derivative ( const QoISet qoi_indices = QoISet(),
bool  include_liftfunc = true,
bool  apply_constraints = true 
)
virtualinherited

Calls user's attached quantity of interest derivative function, or is overridden by the user in derived classes.

Definition at line 2301 of file system.C.

References libMesh::System::_equation_systems, libMesh::System::_qoi_evaluate_derivative_function, libMesh::System::_qoi_evaluate_derivative_object, libMesh::System::name(), and libMesh::System::QOIDerivative::qoi_derivative().

Referenced by libMesh::System::assemble_qoi_derivative().

2304 {
2305  // Call the user-provided quantity of interest derivative,
2306  // if it was provided
2307  if (_qoi_evaluate_derivative_function != nullptr)
2309  (_equation_systems, this->name(), qoi_indices, include_liftfunc,
2310  apply_constraints);
2311 
2312  // ...or the user-provided QOI derivative function object.
2313  else if (_qoi_evaluate_derivative_object != nullptr)
2315  (qoi_indices, include_liftfunc, apply_constraints);
2316 }
QOIDerivative * _qoi_evaluate_derivative_object
Object to compute derivatives of quantities of interest.
Definition: system.h:2107
virtual void qoi_derivative(const QoISet &qoi_indices, bool include_liftfunc, bool apply_constraints)=0
Quantity of interest derivative function.
EquationSystems & _equation_systems
Constant reference to the EquationSystems object used for the simulation.
Definition: system.h:2119
const std::string & name() const
Definition: system.h:2261
void(* _qoi_evaluate_derivative_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices, bool include_liftfunc, bool apply_constraints)
Function to evaluate quantity of interest derivative.
Definition: system.h:2098

◆ variable()

const Variable & libMesh::System::variable ( unsigned int  var) const
inlineinherited

Return a constant reference to Variable var.

Definition at line 2377 of file system.h.

References libMesh::System::_variables.

Referenced by libMesh::ExactSolution::_compute_error(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DifferentiableSystem::add_second_order_dot_vars(), libMesh::System::add_variable(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::FirstOrderUnsteadySolver::compute_second_order_eqns(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::DifferentiableSystem::have_first_order_scalar_vars(), libMesh::DifferentiableSystem::have_second_order_scalar_vars(), main(), libMesh::DifferentiablePhysics::nonlocal_mass_residual(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SortAndCopy::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectEdges::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectSides::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectInteriors::operator()(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::System::read_parallel_data(), libMesh::System::read_SCALAR_dofs(), libMesh::System::read_serialized_vector(), libMesh::System::read_serialized_vectors(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::System::write_header(), libMesh::Nemesis_IO_Helper::write_nodal_solution(), libMesh::System::write_parallel_data(), libMesh::System::write_serialized_vector(), and libMesh::System::write_serialized_vectors().

2378 {
2379  libmesh_assert_less (i, _variables.size());
2380 
2381  return _variables[i];
2382 }
std::vector< Variable > _variables
The Variable in this System.
Definition: system.h:2140

◆ variable_group()

const VariableGroup & libMesh::System::variable_group ( unsigned int  vg) const
inlineinherited

Return a constant reference to VariableGroup vg.

Definition at line 2387 of file system.h.

References libMesh::System::_variable_groups.

Referenced by libMesh::FEMSystem::assembly(), libMesh::System::get_info(), and libMesh::System::init_data().

2388 {
2389  libmesh_assert_less (vg, _variable_groups.size());
2390 
2391  return _variable_groups[vg];
2392 }
std::vector< VariableGroup > _variable_groups
The VariableGroup in this System.
Definition: system.h:2145

◆ variable_name()

const std::string & libMesh::System::variable_name ( const unsigned int  i) const
inlineinherited

◆ variable_number()

unsigned int libMesh::System::variable_number ( std::string_view  var) const
inherited
Returns
The variable number associated with the user-specified variable named var.

Definition at line 1557 of file system.C.

References libMesh::System::_variable_numbers, libMesh::System::_variables, and libMesh::System::name().

Referenced by libMesh::ExactSolution::_compute_error(), alternative_fe_assembly(), LinearElasticity::assemble(), HDGProblem::assemble(), AssembleOptimization::assemble_A_and_F(), assemble_divgrad(), assemble_elasticity(), assemble_matrix_and_rhs(), assemble_shell(), assemble_stokes(), compute_enriched_soln(), compute_stresses(), LinearElasticityWithContact::compute_stresses(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::GMVIO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::ExactErrorEstimator::estimate_error(), fe_assembly(), libMesh::ExactErrorEstimator::find_squared_element_error(), CoupledSystemQoI::init_context(), LargeDeformationElasticity::jacobian(), line_print(), main(), LinearElasticityWithContact::move_mesh(), libMesh::System::read_header(), LargeDeformationElasticity::residual(), LinearElasticityWithContact::residual_and_jacobian(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), OverlappingTestBase::setup_coupling_matrix(), libMesh::DTKAdapter::update_variable_values(), libMesh::System::variable_scalar_number(), libMesh::System::variable_type(), libMesh::EnsightIO::write_scalar_ascii(), and libMesh::EnsightIO::write_vector_ascii().

1558 {
1559  auto var_num = libmesh_map_find(_variable_numbers, var);
1560  libmesh_assert_equal_to (_variables[var_num].name(), var);
1561  return var_num;
1562 }
std::vector< Variable > _variables
The Variable in this System.
Definition: system.h:2140
std::map< std::string, unsigned int, std::less<> > _variable_numbers
The variable numbers corresponding to user-specified names, useful for name-based lookups...
Definition: system.h:2151
const std::string & name() const
Definition: system.h:2261

◆ variable_scalar_number() [1/2]

unsigned int libMesh::System::variable_scalar_number ( std::string_view  var,
unsigned int  component 
) const
inlineinherited
Returns
An index, starting from 0 for the first component of the first variable, and incrementing for each component of each (potentially vector-valued) variable in the system in order. For systems with only scalar-valued variables, this will be the same as variable_number(var)

Irony: currently our only non-scalar-valued variable type is SCALAR.

Definition at line 2408 of file system.h.

References libMesh::System::variable_number().

Referenced by libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::ExactErrorEstimator::find_squared_element_error(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectEdges::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectSides::operator()(), and libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectInteriors::operator()().

2410 {
2411  return variable_scalar_number(this->variable_number(var), component);
2412 }
unsigned int variable_scalar_number(std::string_view var, unsigned int component) const
Definition: system.h:2408
unsigned int variable_number(std::string_view var) const
Definition: system.C:1557

◆ variable_scalar_number() [2/2]

unsigned int libMesh::System::variable_scalar_number ( unsigned int  var_num,
unsigned int  component 
) const
inlineinherited
Returns
An index, starting from 0 for the first component of the first variable, and incrementing for each component of each (potentially vector-valued) variable in the system in order. For systems with only scalar-valued variables, this will be the same as var_num

Irony: currently our only non-scalar-valued variable type is SCALAR.

Definition at line 2418 of file system.h.

References libMesh::System::_variables.

2420 {
2421  return _variables[var_num].first_scalar_number() + component;
2422 }
std::vector< Variable > _variables
The Variable in this System.
Definition: system.h:2140

◆ variable_type() [1/2]

const FEType & libMesh::System::variable_type ( const unsigned int  i) const
inlineinherited

◆ variable_type() [2/2]

const FEType & libMesh::System::variable_type ( std::string_view  var) const
inlineinherited
Returns
The finite element type for variable var.

Definition at line 2437 of file system.h.

References libMesh::System::_variables, and libMesh::System::variable_number().

2438 {
2439  return _variables[this->variable_number(var)].type();
2440 }
std::vector< Variable > _variables
The Variable in this System.
Definition: system.h:2140
unsigned int variable_number(std::string_view var) const
Definition: system.C:1557

◆ vector_is_adjoint()

int libMesh::System::vector_is_adjoint ( std::string_view  vec_name) const
inherited
Returns
The integer describing whether the vector identified by vec_name represents a solution from an adjoint (non-negative) or the primal (-1) space.

Definition at line 1120 of file system.C.

References libMesh::System::_vector_is_adjoint, and libMesh::libmesh_assert().

Referenced by libMesh::InterMeshProjection::project_system_vectors(), and libMesh::System::restrict_vectors().

1121 {
1122  libmesh_assert(_vector_is_adjoint.find(vec_name) !=
1123  _vector_is_adjoint.end());
1124 
1125  return _vector_is_adjoint.find(vec_name)->second;
1126 }
std::map< std::string, int, std::less<> > _vector_is_adjoint
Holds non-negative if a vector by that name should be projected using adjoint constraints/BCs, -1 if primal.
Definition: system.h:2176
libmesh_assert(ctx)

◆ vector_name() [1/2]

const std::string & libMesh::System::vector_name ( const unsigned int  vec_num) const
inherited
Returns
The name of this system's additional vector number vec_num (where the vectors are counted starting with 0).

Definition at line 958 of file system.C.

References libMesh::System::_vectors, and libMesh::System::vectors_begin().

Referenced by libMesh::AdjointRefinementEstimator::estimate_error(), and main().

959 {
960  // If we don't have that many vectors, throw an error
961  libmesh_assert_less(vec_num, _vectors.size());
962 
963  // Otherwise return a reference to the vec_num'th vector name
964  auto it = vectors_begin();
965  std::advance(it, vec_num);
966  return it->first;
967 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
vectors_iterator vectors_begin()
Beginning of vectors container.
Definition: system.h:2483

◆ vector_name() [2/2]

const std::string & libMesh::System::vector_name ( const NumericVector< Number > &  vec_reference) const
inherited
Returns
The name of a system vector, given a reference to that vector

Definition at line 969 of file system.C.

References libMesh::System::_vectors, libMesh::NumericVector< T >::get(), libMesh::libmesh_assert(), libMesh::System::vectors_begin(), and libMesh::System::vectors_end().

970 {
971  // Linear search for a vector whose pointer matches vec_reference
972  auto it = std::find_if(vectors_begin(), vectors_end(),
973  [&vec_reference](const decltype(_vectors)::value_type & pr)
974  { return &vec_reference == pr.second.get(); });
975 
976  // Before returning, make sure we didn't loop till the end and not find any match
977  libmesh_assert (it != vectors_end());
978 
979  // Return the string associated with the current vector
980  return it->first;
981 }
vectors_iterator vectors_end()
End of vectors container.
Definition: system.h:2495
virtual void get(const std::vector< numeric_index_type > &index, T *values) const
Access multiple components at once.
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
vectors_iterator vectors_begin()
Beginning of vectors container.
Definition: system.h:2483
libmesh_assert(ctx)

◆ vector_preservation()

bool libMesh::System::vector_preservation ( std::string_view  vec_name) const
inherited
Returns
The boolean describing whether the vector identified by vec_name should be "preserved": projected to new meshes, saved, etc.

Definition at line 1097 of file system.C.

References libMesh::System::_vector_projections.

Referenced by libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::MemoryHistoryData::store_vectors(), SystemsTest::testAddVectorProjChange(), SystemsTest::testAddVectorTypeChange(), and SystemsTest::testPostInitAddVectorTypeChange().

1098 {
1099  if (_vector_projections.find(vec_name) == _vector_projections.end())
1100  return false;
1101 
1102  return _vector_projections.find(vec_name)->second;
1103 }
std::map< std::string, bool, std::less<> > _vector_projections
Holds true if a vector by that name should be projected onto a changed grid, false if it should be ze...
Definition: system.h:2170

◆ vectors_begin() [1/2]

System::vectors_iterator libMesh::System::vectors_begin ( )
inlineinherited

Beginning of vectors container.

Definition at line 2483 of file system.h.

References libMesh::System::_vectors.

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::System::get_vector(), libMesh::InterMeshProjection::project_system_vectors(), libMesh::System::request_vector(), libMesh::MemoryHistoryData::store_vectors(), and libMesh::System::vector_name().

2484 {
2485  return _vectors.begin();
2486 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164

◆ vectors_begin() [2/2]

System::const_vectors_iterator libMesh::System::vectors_begin ( ) const
inlineinherited

Beginning of vectors container.

Definition at line 2489 of file system.h.

References libMesh::System::_vectors.

2490 {
2491  return _vectors.begin();
2492 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164

◆ vectors_end() [1/2]

System::vectors_iterator libMesh::System::vectors_end ( )
inlineinherited

End of vectors container.

Definition at line 2495 of file system.h.

References libMesh::System::_vectors.

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::InterMeshProjection::project_system_vectors(), libMesh::MemoryHistoryData::store_vectors(), and libMesh::System::vector_name().

2496 {
2497  return _vectors.end();
2498 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164

◆ vectors_end() [2/2]

System::const_vectors_iterator libMesh::System::vectors_end ( ) const
inlineinherited

End of vectors container.

Definition at line 2501 of file system.h.

References libMesh::System::_vectors.

2502 {
2503  return _vectors.end();
2504 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164

◆ weighted_sensitivity_adjoint_solve()

std::pair< unsigned int, Real > libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve ( const ParameterVector parameters,
const ParameterVector weights,
const QoISet qoi_indices = QoISet() 
)
overridevirtualinherited

Assembles & solves the linear system(s) (dR/du)^T*z_w = sum(w_p*(d^2q/dudp - d^2R/dudp*z)), for those parameters p contained within parameters, weighted by the values w_p found within weights.

Assumes that adjoint_solve has already calculated z for each qoi in qoi_indices.

Returns
A pair with the total number of linear iterations performed and the (sum of the) final residual norms

Reimplemented from libMesh::System.

Definition at line 220 of file implicit_system.C.

References libMesh::System::add_weighted_sensitivity_adjoint_solution(), libMesh::ExplicitSystem::assemble_qoi_derivative(), libMesh::ImplicitSystem::assembly(), libMesh::NumericVector< T >::close(), libMesh::SparseMatrix< T >::close(), libMesh::ParameterVector::deep_copy(), libMesh::DofMap::enforce_constraints_exactly(), libMesh::System::get_adjoint_rhs(), libMesh::System::get_adjoint_solution(), libMesh::System::get_dof_map(), libMesh::ImplicitSystem::get_linear_solve_parameters(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::SparseMatrix< T >::get_transpose(), libMesh::System::get_weighted_sensitivity_adjoint_solution(), libMesh::DofMap::has_adjoint_dirichlet_boundaries(), libMesh::QoISet::has_index(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::ImplicitSystem::matrix, libMesh::System::n_qois(), libMesh::Real, libMesh::ExplicitSystem::rhs, libMesh::LinearSolver< T >::solve(), libMesh::TOLERANCE, libMesh::ParameterVector::value_copy(), libMesh::SparseMatrix< T >::vector_mult_add(), and libMesh::NumericVector< T >::zero_clone().

Referenced by libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product().

223 {
224  // Log how long the linear solve takes.
225  LOG_SCOPE("weighted_sensitivity_adjoint_solve()", "ImplicitSystem");
226 
227  // We currently get partial derivatives via central differencing
228  const Real delta_p = TOLERANCE;
229 
230  ParameterVector & parameters =
231  const_cast<ParameterVector &>(parameters_in);
232 
233  // The forward system should now already be solved.
234  // The adjoint system should now already be solved.
235  // Now we're assembling a weighted sum of adjoint-adjoint systems:
236  //
237  // dR/du (u, sum_l(w_l*z^l)) = sum_l(w_l*(Q''_ul - R''_ul (u, z)))
238 
239  // FIXME: The derivation here does not yet take adjoint boundary
240  // conditions into account.
241 #ifdef LIBMESH_ENABLE_DIRICHLET
242  for (auto i : make_range(this->n_qois()))
243  if (qoi_indices.has_index(i))
245 #endif
246 
247  // We'll assemble the rhs first, because the R'' term will require
248  // perturbing the jacobian
249 
250  // We'll use temporary rhs vectors, because we haven't (yet) found
251  // any good reasons why users might want to save these:
252 
253  std::vector<std::unique_ptr<NumericVector<Number>>> temprhs(this->n_qois());
254  for (auto i : make_range(this->n_qois()))
255  if (qoi_indices.has_index(i))
256  temprhs[i] = this->rhs->zero_clone();
257 
258  // We approximate the _l partial derivatives via a central
259  // differencing perturbation in the w_l direction:
260  //
261  // sum_l(w_l*v_l) ~= (v(p + dp*w_l*e_l) - v(p - dp*w_l*e_l))/(2*dp)
262 
263  // PETSc doesn't implement SGEMX, so neither does NumericVector,
264  // so we want to avoid calculating f -= R'*z. We'll thus evaluate
265  // the above equation by first adding -v(p+dp...), then multiplying
266  // the intermediate result vectors by -1, then adding -v(p-dp...),
267  // then finally dividing by 2*dp.
268 
269  ParameterVector oldparameters, parameterperturbation;
270  parameters.deep_copy(oldparameters);
271  weights.deep_copy(parameterperturbation);
272  parameterperturbation *= delta_p;
273  parameters += parameterperturbation;
274 
275  this->assembly(false, true);
276  this->matrix->close();
277 
278  // Take the discrete adjoint, so that we can calculate R_u(u,z) with
279  // a matrix-vector product of R_u and z.
281 
282  this->assemble_qoi_derivative(qoi_indices,
283  /* include_liftfunc = */ false,
284  /* apply_constraints = */ true);
285  for (auto i : make_range(this->n_qois()))
286  if (qoi_indices.has_index(i))
287  {
288  this->get_adjoint_rhs(i).close();
289  *(temprhs[i]) -= this->get_adjoint_rhs(i);
290  this->matrix->vector_mult_add(*(temprhs[i]), this->get_adjoint_solution(i));
291  *(temprhs[i]) *= -1.0;
292  }
293 
294  oldparameters.value_copy(parameters);
295  parameterperturbation *= -1.0;
296  parameters += parameterperturbation;
297 
298  this->assembly(false, true);
299  this->matrix->close();
301 
302  this->assemble_qoi_derivative(qoi_indices,
303  /* include_liftfunc = */ false,
304  /* apply_constraints = */ true);
305  for (auto i : make_range(this->n_qois()))
306  if (qoi_indices.has_index(i))
307  {
308  this->get_adjoint_rhs(i).close();
309  *(temprhs[i]) -= this->get_adjoint_rhs(i);
310  this->matrix->vector_mult_add(*(temprhs[i]), this->get_adjoint_solution(i));
311  *(temprhs[i]) /= (2.0*delta_p);
312  }
313 
314  // Finally, assemble the jacobian at the non-perturbed parameter
315  // values. Ignore assemble_before_solve; if we had a good
316  // non-perturbed matrix before we've already overwritten it.
317  oldparameters.value_copy(parameters);
318 
319  // if (this->assemble_before_solve)
320  {
321  // Build the Jacobian
322  this->assembly(false, true);
323  this->matrix->close();
324 
325  // Take the discrete adjoint
327  }
328 
329  // The weighted adjoint-adjoint problem is linear
330  LinearSolver<Number> * solver = this->get_linear_solver();
331 
332  // Our iteration counts and residuals will be sums of the individual
333  // results
334  std::pair<unsigned int, Real> solver_params =
336  std::pair<unsigned int, Real> totalrval = std::make_pair(0,0.0);
337 
338  for (auto i : make_range(this->n_qois()))
339  if (qoi_indices.has_index(i))
340  {
341  const std::pair<unsigned int, Real> rval =
342  solver->solve (*matrix, this->add_weighted_sensitivity_adjoint_solution(i),
343  *(temprhs[i]),
344  double(solver_params.second),
345  solver_params.first);
346 
347  totalrval.first += rval.first;
348  totalrval.second += rval.second;
349  }
350 
351  // The linear solver may not have fit our constraints exactly
352 #ifdef LIBMESH_ENABLE_CONSTRAINTS
353  for (auto i : make_range(this->n_qois()))
354  if (qoi_indices.has_index(i))
357  /* homogeneous = */ true);
358 #endif
359 
360  return totalrval;
361 }
static constexpr Real TOLERANCE
virtual std::pair< unsigned int, Real > get_linear_solve_parameters() const
unsigned int n_qois() const
Number of currently active quantities of interest.
Definition: system.h:2516
virtual std::unique_ptr< NumericVector< T > > zero_clone() const =0
NumericVector< Number > * rhs
The system matrix.
virtual LinearSolver< Number > * get_linear_solver() const
NumericVector< Number > & add_weighted_sensitivity_adjoint_solution(unsigned int i=0)
Definition: system.C:1213
virtual void assembly(bool, bool, bool=false, bool=false)
Assembles a residual in rhs and/or a jacobian in matrix, as requested.
bool has_adjoint_dirichlet_boundaries(unsigned int q) const
libmesh_assert(ctx)
template class LIBMESH_EXPORT LinearSolver< Number >
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void vector_mult_add(NumericVector< T > &dest, const NumericVector< T > &arg) const
Multiplies the matrix by the NumericVector arg and adds the result to the NumericVector dest...
SparseMatrix< Number > * matrix
The system matrix.
virtual void get_transpose(SparseMatrix< T > &dest) const =0
Copies the transpose of the matrix into dest, which may be *this.
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
virtual void assemble_qoi_derivative(const QoISet &qoi_indices=QoISet(), bool include_liftfunc=true, bool apply_constraints=true) override
Prepares adjoint_rhs for quantity of interest derivative assembly, then calls user qoi derivative fun...
NumericVector< Number > & get_adjoint_solution(unsigned int i=0)
Definition: system.C:1193
const DofMap & get_dof_map() const
Definition: system.h:2293
NumericVector< Number > & get_weighted_sensitivity_adjoint_solution(unsigned int i=0)
Definition: system.C:1225
void enforce_constraints_exactly(const System &system, NumericVector< Number > *v=nullptr, bool homogeneous=false) const
Constrains the numeric vector v, which represents a solution defined on the mesh. ...
Definition: dof_map.h:2274
NumericVector< Number > & get_adjoint_rhs(unsigned int i=0)
Definition: system.C:1255

◆ weighted_sensitivity_solve()

std::pair< unsigned int, Real > libMesh::ImplicitSystem::weighted_sensitivity_solve ( const ParameterVector parameters,
const ParameterVector weights 
)
overridevirtualinherited

Assembles & solves the linear system(s) (dR/du)*u_w = sum(w_p*-dR/dp), for those parameters p contained within parameters weighted by the values w_p found within weights.

Returns
A pair with the total number of linear iterations performed and the (sum of the) final residual norms

Reimplemented from libMesh::System.

Definition at line 366 of file implicit_system.C.

References libMesh::System::add_weighted_sensitivity_solution(), libMesh::ImplicitSystem::assembly(), libMesh::NumericVector< T >::clone(), libMesh::NumericVector< T >::close(), libMesh::SparseMatrix< T >::close(), libMesh::ParameterVector::deep_copy(), libMesh::DofMap::enforce_constraints_exactly(), libMesh::System::get_dof_map(), libMesh::ImplicitSystem::get_linear_solve_parameters(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::System::get_weighted_sensitivity_solution(), libMesh::ImplicitSystem::matrix, libMesh::Real, libMesh::ExplicitSystem::rhs, libMesh::LinearSolver< T >::solve(), libMesh::TOLERANCE, and libMesh::ParameterVector::value_copy().

Referenced by libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product().

368 {
369  // Log how long the linear solve takes.
370  LOG_SCOPE("weighted_sensitivity_solve()", "ImplicitSystem");
371 
372  // We currently get partial derivatives via central differencing
373  const Real delta_p = TOLERANCE;
374 
375  ParameterVector & parameters =
376  const_cast<ParameterVector &>(parameters_in);
377 
378  // The forward system should now already be solved.
379 
380  // Now we're assembling a weighted sum of sensitivity systems:
381  //
382  // dR/du (u, v)(sum(w_l*u'_l)) = -sum_l(w_l*R'_l (u, v)) forall v
383 
384  // We'll assemble the rhs first, because the R' term will require
385  // perturbing the system, and some applications may not be able to
386  // assemble a perturbed residual without simultaneously constructing
387  // a perturbed jacobian.
388 
389  // We approximate the _l partial derivatives via a central
390  // differencing perturbation in the w_l direction:
391  //
392  // sum_l(w_l*v_l) ~= (v(p + dp*w_l*e_l) - v(p - dp*w_l*e_l))/(2*dp)
393 
394  ParameterVector oldparameters, parameterperturbation;
395  parameters.deep_copy(oldparameters);
396  weights.deep_copy(parameterperturbation);
397  parameterperturbation *= delta_p;
398  parameters += parameterperturbation;
399 
400  this->assembly(true, false, true);
401  this->rhs->close();
402 
403  std::unique_ptr<NumericVector<Number>> temprhs = this->rhs->clone();
404 
405  oldparameters.value_copy(parameters);
406  parameterperturbation *= -1.0;
407  parameters += parameterperturbation;
408 
409  this->assembly(true, false, true);
410  this->rhs->close();
411 
412  *temprhs -= *(this->rhs);
413  *temprhs /= (2.0*delta_p);
414 
415  // Finally, assemble the jacobian at the non-perturbed parameter
416  // values
417  oldparameters.value_copy(parameters);
418 
419  // Build the Jacobian
420  this->assembly(false, true);
421  this->matrix->close();
422 
423  // The weighted sensitivity problem is linear
424  LinearSolver<Number> * solver = this->get_linear_solver();
425 
426  std::pair<unsigned int, Real> solver_params =
428 
429  const std::pair<unsigned int, Real> rval =
430  solver->solve (*matrix, this->add_weighted_sensitivity_solution(),
431  *temprhs,
432  double(solver_params.second),
433  solver_params.first);
434 
435  // The linear solver may not have fit our constraints exactly
436 #ifdef LIBMESH_ENABLE_CONSTRAINTS
438  (*this, &this->get_weighted_sensitivity_solution(),
439  /* homogeneous = */ true);
440 #endif
441 
442  return rval;
443 }
static constexpr Real TOLERANCE
virtual std::pair< unsigned int, Real > get_linear_solve_parameters() const
NumericVector< Number > * rhs
The system matrix.
virtual std::unique_ptr< NumericVector< T > > clone() const =0
virtual LinearSolver< Number > * get_linear_solver() const
NumericVector< Number > & add_weighted_sensitivity_solution()
Definition: system.C:1160
NumericVector< Number > & get_weighted_sensitivity_solution()
Definition: system.C:1167
virtual void assembly(bool, bool, bool=false, bool=false)
Assembles a residual in rhs and/or a jacobian in matrix, as requested.
template class LIBMESH_EXPORT LinearSolver< Number >
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
SparseMatrix< Number > * matrix
The system matrix.
const DofMap & get_dof_map() const
Definition: system.h:2293
void enforce_constraints_exactly(const System &system, NumericVector< Number > *v=nullptr, bool homogeneous=false) const
Constrains the numeric vector v, which represents a solution defined on the mesh. ...
Definition: dof_map.h:2274

◆ write_header()

void libMesh::System::write_header ( Xdr io,
std::string_view  version,
const bool  write_additional_data 
) const
inherited

Writes the basic data header for this System.

This method implements the output of a System object, embedded in the output of an EquationSystems<T_sys>. This warrants some documentation. The output of this part consists of 5 sections:

for this system

5.) The number of variables in the system (unsigned int)

for each variable in the system

6.) The name of the variable (string)

6.1.) subdomain where the variable lives

7.) Combined in an FEType:

  • The approximation order(s) of the variable (Order Enum, cast to int/s)
  • The finite element family/ies of the variable (FEFamily Enum, cast to int/s)

end variable loop

8.) The number of additional vectors (unsigned int),

for each additional vector in the system object

9.) the name of the additional vector (string)

end system

Definition at line 1267 of file system_io.C.

References libMesh::System::_vector_projections, libMesh::System::_vectors, libMesh::Variable::active_subdomains(), libMesh::Xdr::data(), libMesh::FEType::family, libMesh::System::get_mesh(), libMesh::FEType::inf_map, libMesh::libmesh_assert(), libMesh::make_range(), libMesh::System::n_vars(), libMesh::System::n_vectors(), libMesh::System::name(), libMesh::FEType::order, libMesh::ParallelObject::processor_id(), libMesh::FEType::radial_family, libMesh::FEType::radial_order, libMesh::System::variable(), libMesh::System::variable_name(), libMesh::System::variable_type(), and libMesh::Xdr::writing().

Referenced by libMesh::RBEvaluation::write_out_vectors().

1270 {
1304  libmesh_assert (io.writing());
1305 
1306 
1307  // Only write the header information
1308  // if we are processor 0.
1309  if (this->get_mesh().processor_id() != 0)
1310  return;
1311 
1312  std::string comment;
1313 
1314  // 5.)
1315  // Write the number of variables in the system
1316 
1317  {
1318  // set up the comment
1319  comment = "# No. of Variables in System \"";
1320  comment += this->name();
1321  comment += "\"";
1322 
1323  unsigned int nv = this->n_vars();
1324  io.data (nv, comment);
1325  }
1326 
1327 
1328  for (auto var : make_range(this->n_vars()))
1329  {
1330  // 6.)
1331  // Write the name of the var-th variable
1332  {
1333  // set up the comment
1334  comment = "# Name, Variable No. ";
1335  comment += std::to_string(var);
1336  comment += ", System \"";
1337  comment += this->name();
1338  comment += "\"";
1339 
1340  std::string var_name = this->variable_name(var);
1341  io.data (var_name, comment);
1342  }
1343 
1344  // 6.1.) Variable subdomains
1345  {
1346  // set up the comment
1347  comment = "# Subdomains, Variable \"";
1348  comment += this->variable_name(var);
1349  comment += "\", System \"";
1350  comment += this->name();
1351  comment += "\"";
1352 
1353  const std::set<subdomain_id_type> & domains = this->variable(var).active_subdomains();
1354  std::vector<subdomain_id_type> domain_array;
1355  domain_array.assign(domains.begin(), domains.end());
1356  io.data (domain_array, comment);
1357  }
1358 
1359  // 7.)
1360  // Write the approximation order of the var-th variable
1361  // in this system
1362  {
1363  // set up the comment
1364  comment = "# Approximation Order, Variable \"";
1365  comment += this->variable_name(var);
1366  comment += "\", System \"";
1367  comment += this->name();
1368  comment += "\"";
1369 
1370  int order = static_cast<int>(this->variable_type(var).order);
1371  io.data (order, comment);
1372  }
1373 
1374 
1375 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
1376 
1377  // do the same for radial_order
1378  {
1379  comment = "# Radial Approximation Order, Variable \"";
1380  comment += this->variable_name(var);
1381  comment += "\", System \"";
1382  comment += this->name();
1383  comment += "\"";
1384 
1385  int rad_order = static_cast<int>(this->variable_type(var).radial_order);
1386  io.data (rad_order, comment);
1387  }
1388 
1389 #endif
1390 
1391  // Write the Finite Element type of the var-th variable
1392  // in this System
1393  {
1394  // set up the comment
1395  comment = "# FE Family, Variable \"";
1396  comment += this->variable_name(var);
1397  comment += "\", System \"";
1398  comment += this->name();
1399  comment += "\"";
1400 
1401  const FEType & type = this->variable_type(var);
1402  int fam = static_cast<int>(type.family);
1403  io.data (fam, comment);
1404 
1405 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
1406 
1407  comment = "# Radial FE Family, Variable \"";
1408  comment += this->variable_name(var);
1409  comment += "\", System \"";
1410  comment += this->name();
1411  comment += "\"";
1412 
1413  int radial_fam = static_cast<int>(type.radial_family);
1414  io.data (radial_fam, comment);
1415 
1416  comment = "# Infinite Mapping Type, Variable \"";
1417  comment += this->variable_name(var);
1418  comment += "\", System \"";
1419  comment += this->name();
1420  comment += "\"";
1421 
1422  int i_map = static_cast<int>(type.inf_map);
1423  io.data (i_map, comment);
1424 #endif
1425  }
1426  } // end of the variable loop
1427 
1428  // 8.)
1429  // Write the number of additional vectors in the System.
1430  // If write_additional_data==false, then write zero for
1431  // the number of additional vectors.
1432  {
1433  {
1434  // set up the comment
1435  comment = "# No. of Additional Vectors, System \"";
1436  comment += this->name();
1437  comment += "\"";
1438 
1439  unsigned int nvecs = write_additional_data ? this->n_vectors () : 0;
1440  io.data (nvecs, comment);
1441  }
1442 
1443  if (write_additional_data)
1444  {
1445  unsigned int cnt=0;
1446  for (const auto & [vec_name, vec] : _vectors)
1447  {
1448  // 9.)
1449  // write the name of the cnt-th additional vector
1450  const std::string dth_vector = std::to_string(cnt++)+"th vector";
1451  comment = "# Name of " + dth_vector;
1452  std::string nonconst_vec_name = vec_name; // Stupid XDR API
1453 
1454  io.data (nonconst_vec_name, comment);
1455  int vec_projection = _vector_projections.at(vec_name);
1456  comment = "# Whether to do projections for " + dth_vector;
1457  io.data (vec_projection, comment);
1458  int vec_type = vec->type();
1459  comment = "# Parallel type of " + dth_vector;
1460  io.data (vec_type, comment);
1461  }
1462  }
1463  }
1464 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.h:2377
OrderWrapper radial_order
The approximation order in radial direction of the infinite element.
Definition: fe_type.h:240
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
OrderWrapper order
The approximation order of the element.
Definition: fe_type.h:201
const MeshBase & get_mesh() const
Definition: system.h:2277
const std::set< subdomain_id_type > & active_subdomains() const
Definition: variable.h:171
unsigned int n_vectors() const
Definition: system.h:2477
libmesh_assert(ctx)
const std::string & variable_name(const unsigned int i) const
Definition: system.h:2397
const FEType & variable_type(const unsigned int i) const
Definition: system.h:2427
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
const std::string & name() const
Definition: system.h:2261
unsigned int n_vars() const
Definition: system.h:2349
processor_id_type processor_id() const
std::map< std::string, bool, std::less<> > _vector_projections
Holds true if a vector by that name should be projected onto a changed grid, false if it should be ze...
Definition: system.h:2170

◆ write_parallel_data()

void libMesh::System::write_parallel_data ( Xdr io,
const bool  write_additional_data 
) const
inherited

Writes additional data, namely vectors, for this System.

This method may safely be called on a distributed-memory mesh. This method will create an individual file for each processor in the simulation where the local solution components for that processor will be stored.

This method implements the output of the vectors contained in this System object, embedded in the output of an EquationSystems<T_sys>.

9.) The global solution vector, re-ordered to be node-major (More on this later.)

for each additional vector in the object

10.) The global additional vector, re-ordered to be node-major (More on this later.)

Note that the actual IO is handled through the Xdr class (to be renamed later?) which provides a uniform interface to both the XDR (eXternal Data Representation) interface and standard ASCII output. Thus this one section of code will read XDR or ASCII files with no changes.

Definition at line 1468 of file system_io.C.

References libMesh::System::_vectors, libMesh::Xdr::data(), libMesh::FEType::family, libMesh::System::get_dof_map(), libMesh::System::get_mesh(), libMesh::DofObject::invalid_id, libMesh::libmesh_assert(), libMesh::make_range(), libMesh::ParallelObject::n_processors(), libMesh::System::n_vars(), libMesh::System::name(), libMesh::System::number(), libMesh::ParallelObject::processor_id(), libMesh::SCALAR, libMesh::DofMap::SCALAR_dof_indices(), libMesh::System::solution, libMesh::Variable::type(), libMesh::System::variable(), and libMesh::Xdr::writing().

1470 {
1490  // PerfLog pl("IO Performance",false);
1491  // pl.push("write_parallel_data");
1492  // std::size_t total_written_size = 0;
1493 
1494  std::string comment;
1495 
1496  libmesh_assert (io.writing());
1497 
1498  std::vector<Number> io_buffer; io_buffer.reserve(this->solution->local_size());
1499 
1500  // build the ordered nodes and element maps.
1501  // when writing/reading parallel files we need to iterate
1502  // over our nodes/elements in order of increasing global id().
1503  // however, this is not guaranteed to be ordering we obtain
1504  // by using the node_iterators/element_iterators directly.
1505  // so build a set, sorted by id(), that provides the ordering.
1506  // further, for memory economy build the set but then transfer
1507  // its contents to vectors, which will be sorted.
1508  std::vector<const DofObject *> ordered_nodes, ordered_elements;
1509  {
1510  std::set<const DofObject *, CompareDofObjectsByID>
1511  ordered_nodes_set (this->get_mesh().local_nodes_begin(),
1512  this->get_mesh().local_nodes_end());
1513 
1514  ordered_nodes.insert(ordered_nodes.end(),
1515  ordered_nodes_set.begin(),
1516  ordered_nodes_set.end());
1517  }
1518  {
1519  std::set<const DofObject *, CompareDofObjectsByID>
1520  ordered_elements_set (this->get_mesh().local_elements_begin(),
1521  this->get_mesh().local_elements_end());
1522 
1523  ordered_elements.insert(ordered_elements.end(),
1524  ordered_elements_set.begin(),
1525  ordered_elements_set.end());
1526  }
1527 
1528  const unsigned int sys_num = this->number();
1529  const unsigned int nv = this->n_vars();
1530 
1531  // Loop over each non-SCALAR variable and each node, and write out the value.
1532  for (unsigned int var=0; var<nv; var++)
1533  if (this->variable(var).type().family != SCALAR)
1534  {
1535  // First write the node DOF values
1536  for (const auto & node : ordered_nodes)
1537  for (auto comp : make_range(node->n_comp(sys_num,var)))
1538  {
1539  libmesh_assert_not_equal_to (node->dof_number(sys_num, var, comp),
1541 
1542  io_buffer.push_back((*this->solution)(node->dof_number(sys_num, var, comp)));
1543  }
1544 
1545  // Then write the element DOF values
1546  for (const auto & elem : ordered_elements)
1547  for (auto comp : make_range(elem->n_comp(sys_num,var)))
1548  {
1549  libmesh_assert_not_equal_to (elem->dof_number(sys_num, var, comp),
1551 
1552  io_buffer.push_back((*this->solution)(elem->dof_number(sys_num, var, comp)));
1553  }
1554  }
1555 
1556  // Finally, write the SCALAR data on the last processor
1557  for (auto var : make_range(this->n_vars()))
1558  if (this->variable(var).type().family == SCALAR)
1559  {
1560  if (this->processor_id() == (this->n_processors()-1))
1561  {
1562  const DofMap & dof_map = this->get_dof_map();
1563  std::vector<dof_id_type> SCALAR_dofs;
1564  dof_map.SCALAR_dof_indices(SCALAR_dofs, var);
1565 
1566  for (auto dof : SCALAR_dofs)
1567  io_buffer.push_back((*this->solution)(dof));
1568  }
1569  }
1570 
1571  // 9.)
1572  //
1573  // Actually write the reordered solution vector
1574  // for the ith system to disk
1575 
1576  // set up the comment
1577  {
1578  comment = "# System \"";
1579  comment += this->name();
1580  comment += "\" Solution Vector";
1581  }
1582 
1583  io.data (io_buffer, comment);
1584 
1585  // total_written_size += io_buffer.size();
1586 
1587  // Only write additional vectors if wanted
1588  if (write_additional_data)
1589  {
1590  for (auto & [vec_name, vec] : _vectors)
1591  {
1592  io_buffer.clear();
1593  io_buffer.reserve(vec->local_size());
1594 
1595  // Loop over each non-SCALAR variable and each node, and write out the value.
1596  for (unsigned int var=0; var<nv; var++)
1597  if (this->variable(var).type().family != SCALAR)
1598  {
1599  // First write the node DOF values
1600  for (const auto & node : ordered_nodes)
1601  for (auto comp : make_range(node->n_comp(sys_num,var)))
1602  {
1603  libmesh_assert_not_equal_to (node->dof_number(sys_num, var, comp),
1605 
1606  io_buffer.push_back((*vec)(node->dof_number(sys_num, var, comp)));
1607  }
1608 
1609  // Then write the element DOF values
1610  for (const auto & elem : ordered_elements)
1611  for (auto comp : make_range(elem->n_comp(sys_num,var)))
1612  {
1613  libmesh_assert_not_equal_to (elem->dof_number(sys_num, var, comp),
1615 
1616  io_buffer.push_back((*vec)(elem->dof_number(sys_num, var, comp)));
1617  }
1618  }
1619 
1620  // Finally, write the SCALAR data on the last processor
1621  for (auto var : make_range(this->n_vars()))
1622  if (this->variable(var).type().family == SCALAR)
1623  {
1624  if (this->processor_id() == (this->n_processors()-1))
1625  {
1626  const DofMap & dof_map = this->get_dof_map();
1627  std::vector<dof_id_type> SCALAR_dofs;
1628  dof_map.SCALAR_dof_indices(SCALAR_dofs, var);
1629 
1630  for (auto dof : SCALAR_dofs)
1631  io_buffer.push_back((*vec)(dof));
1632  }
1633  }
1634 
1635  // 10.)
1636  //
1637  // Actually write the reordered additional vector
1638  // for this system to disk
1639 
1640  // set up the comment
1641  {
1642  comment = "# System \"";
1643  comment += this->name();
1644  comment += "\" Additional Vector \"";
1645  comment += vec_name;
1646  comment += "\"";
1647  }
1648 
1649  io.data (io_buffer, comment);
1650 
1651  // total_written_size += io_buffer.size();
1652  }
1653  }
1654 
1655  // const Real
1656  // dt = pl.get_elapsed_time(),
1657  // rate = total_written_size*sizeof(Number)/dt;
1658 
1659  // libMesh::err << "Write " << total_written_size << " \"Number\" values\n"
1660  // << " Elapsed time = " << dt << '\n'
1661  // << " Rate = " << rate/1.e6 << "(MB/sec)\n\n";
1662 
1663  // pl.pop("write_parallel_data");
1664 }
FEFamily family
The type of finite element.
Definition: fe_type.h:207
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.h:2377
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
const MeshBase & get_mesh() const
Definition: system.h:2277
processor_id_type n_processors() const
unsigned int number() const
Definition: system.h:2269
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
libmesh_assert(ctx)
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:477
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
const std::string & name() const
Definition: system.h:2261
unsigned int n_vars() const
Definition: system.h:2349
processor_id_type processor_id() const
const DofMap & get_dof_map() const
Definition: system.h:2293
const FEType & type() const
Definition: variable.h:140

◆ write_serialized_data()

void libMesh::System::write_serialized_data ( Xdr io,
const bool  write_additional_data = true 
) const
inherited

Writes additional data, namely vectors, for this System.

This method may safely be called on a distributed-memory mesh.

This method implements the output of the vectors contained in this System object, embedded in the output of an EquationSystems<T_sys>.

9.) The global solution vector, re-ordered to be node-major (More on this later.)

for each additional vector in the object

10.) The global additional vector, re-ordered to be node-major (More on this later.)

Definition at line 1668 of file system_io.C.

References libMesh::System::_vectors, libMesh::Xdr::comment(), libMesh::System::name(), libMesh::ParallelObject::processor_id(), libMesh::System::solution, and libMesh::System::write_serialized_vector().

Referenced by libMesh::TransientRBConstruction::write_riesz_representors_to_files(), and libMesh::RBConstruction::write_riesz_representors_to_files().

1670 {
1684  parallel_object_only();
1685  std::string comment;
1686 
1687  // PerfLog pl("IO Performance",false);
1688  // pl.push("write_serialized_data");
1689  // std::size_t total_written_size = 0;
1690 
1691  // total_written_size +=
1692  this->write_serialized_vector(io, *this->solution);
1693 
1694  // set up the comment
1695  if (this->processor_id() == 0)
1696  {
1697  comment = "# System \"";
1698  comment += this->name();
1699  comment += "\" Solution Vector";
1700 
1701  io.comment (comment);
1702  }
1703 
1704  // Only write additional vectors if wanted
1705  if (write_additional_data)
1706  {
1707  for (auto & pair : this->_vectors)
1708  {
1709  // total_written_size +=
1710  this->write_serialized_vector(io, *pair.second);
1711 
1712  // set up the comment
1713  if (this->processor_id() == 0)
1714  {
1715  comment = "# System \"";
1716  comment += this->name();
1717  comment += "\" Additional Vector \"";
1718  comment += pair.first;
1719  comment += "\"";
1720  io.comment (comment);
1721  }
1722  }
1723  }
1724 
1725  // const Real
1726  // dt = pl.get_elapsed_time(),
1727  // rate = total_written_size*sizeof(Number)/dt;
1728 
1729  // libMesh::out << "Write " << total_written_size << " \"Number\" values\n"
1730  // << " Elapsed time = " << dt << '\n'
1731  // << " Rate = " << rate/1.e6 << "(MB/sec)\n\n";
1732 
1733  // pl.pop("write_serialized_data");
1734 
1735 
1736 
1737 
1738  // // test the new method
1739  // {
1740  // std::vector<std::string> names;
1741  // std::vector<NumericVector<Number> *> vectors_to_write;
1742 
1743  // names.push_back("Solution Vector");
1744  // vectors_to_write.push_back(this->solution.get());
1745 
1746  // // Only write additional vectors if wanted
1747  // if (write_additional_data)
1748  // {
1749  // std::map<std::string, NumericVector<Number> *>::const_iterator
1750  // pos = _vectors.begin();
1751 
1752  // for (; pos != this->_vectors.end(); ++pos)
1753  // {
1754  // names.push_back("Additional Vector " + pos->first);
1755  // vectors_to_write.push_back(pos->second);
1756  // }
1757  // }
1758 
1759  // total_written_size =
1760  // this->write_serialized_vectors (io, names, vectors_to_write);
1761 
1762  // const Real
1763  // dt2 = pl.get_elapsed_time(),
1764  // rate2 = total_written_size*sizeof(Number)/(dt2-dt);
1765 
1766  // libMesh::out << "Write (new) " << total_written_size << " \"Number\" values\n"
1767  // << " Elapsed time = " << (dt2-dt) << '\n'
1768  // << " Rate = " << rate2/1.e6 << "(MB/sec)\n\n";
1769 
1770  // }
1771 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2164
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
const std::string & name() const
Definition: system.h:2261
processor_id_type processor_id() const
dof_id_type write_serialized_vector(Xdr &io, const NumericVector< Number > &vec) const
Writes a vector for this System.
Definition: system_io.C:2118

◆ write_serialized_vectors()

std::size_t libMesh::System::write_serialized_vectors ( Xdr io,
const std::vector< const NumericVector< Number > *> &  vectors 
) const
inherited

Serialize & write a number of identically distributed vectors.

This method allows for optimization for the multiple vector case by only communicating the metadata once.

Definition at line 2259 of file system_io.C.

References libMesh::Xdr::data(), libMesh::System::get_mesh(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::MeshTools::n_elem(), libMesh::MeshBase::n_elem(), n_nodes, libMesh::MeshBase::n_nodes(), libMesh::System::n_vars(), libMesh::ParallelObject::processor_id(), libMesh::SCALAR, libMesh::System::variable(), libMesh::System::write_SCALAR_dofs(), libMesh::System::write_serialized_blocked_dof_objects(), and libMesh::Xdr::writing().

Referenced by libMesh::RBEvaluation::write_out_vectors().

2261 {
2262  parallel_object_only();
2263 
2264  libmesh_assert (io.writing());
2265 
2266  // Cache these - they are not free!
2267  const dof_id_type
2268  n_nodes = this->get_mesh().n_nodes(),
2269  n_elem = this->get_mesh().n_elem();
2270 
2271  std::size_t written_length = 0;
2272 
2273  if (this->processor_id() == 0)
2274  {
2275  unsigned int
2276  n_vec = cast_int<unsigned int>(vectors.size());
2277  dof_id_type
2278  vec_size = vectors.empty() ? 0 : vectors[0]->size();
2279  // Set the number of vectors
2280  io.data(n_vec, "# number of vectors");
2281  // Set the buffer size
2282  io.data(vec_size, "# vector length");
2283  }
2284 
2285  //---------------------------------
2286  // Collect the values for all nodes
2287  written_length +=
2288  this->write_serialized_blocked_dof_objects (vectors,
2289  n_nodes,
2290  this->get_mesh().local_nodes_begin(),
2291  this->get_mesh().local_nodes_end(),
2292  io);
2293 
2294  //------------------------------------
2295  // Collect the values for all elements
2296  written_length +=
2297  this->write_serialized_blocked_dof_objects (vectors,
2298  n_elem,
2299  this->get_mesh().local_elements_begin(),
2300  this->get_mesh().local_elements_end(),
2301  io);
2302 
2303  //-------------------------------------------
2304  // Finally loop over all the SCALAR variables
2305  for (const NumericVector<Number> * vec : vectors)
2306  for (auto var : make_range(this->n_vars()))
2307  if (this->variable(var).type().family == SCALAR)
2308  {
2309  libmesh_assert_not_equal_to (vec, 0);
2310 
2311  written_length +=
2312  this->write_SCALAR_dofs (*vec, var, io);
2313  }
2314 
2315  return written_length;
2316 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.h:2377
dof_id_type n_elem(const MeshBase::const_element_iterator &begin, const MeshBase::const_element_iterator &end)
Count up the number of elements of a specific type (as defined by an iterator range).
Definition: mesh_tools.C:850
unsigned int write_SCALAR_dofs(const NumericVector< Number > &vec, const unsigned int var, Xdr &io) const
Writes the SCALAR dofs associated with var to the stream io.
Definition: system_io.C:2062
const MeshBase & get_mesh() const
Definition: system.h:2277
const dof_id_type n_nodes
Definition: tecplot_io.C:67
libmesh_assert(ctx)
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
unsigned int n_vars() const
Definition: system.h:2349
virtual dof_id_type n_elem() const =0
processor_id_type processor_id() const
template class LIBMESH_EXPORT NumericVector< Number >
virtual dof_id_type n_nodes() const =0
std::size_t write_serialized_blocked_dof_objects(const std::vector< const NumericVector< Number > *> &vecs, const dof_id_type n_objects, const iterator_type begin, const iterator_type end, Xdr &io, const unsigned int var_to_write=libMesh::invalid_uint) const
Writes an output vector to the stream io for a set of DofObjects.
Definition: system_io.C:1776
uint8_t dof_id_type
Definition: id_types.h:67

◆ zero_variable()

void libMesh::System::zero_variable ( NumericVector< Number > &  v,
unsigned int  var_num 
) const
inherited

Zeroes all dofs in v that correspond to variable number var_num.

Definition at line 1616 of file system.C.

References libMesh::System::get_mesh(), mesh, libMesh::System::n_vars(), libMesh::System::number(), and libMesh::NumericVector< T >::set().

1618 {
1619  /* Make sure the call makes sense. */
1620  libmesh_assert_less (var_num, this->n_vars());
1621 
1622  /* Get a reference to the mesh. */
1623  const MeshBase & mesh = this->get_mesh();
1624 
1625  /* Check which system we are. */
1626  const unsigned int sys_num = this->number();
1627 
1628  // Loop over nodes.
1629  for (const auto & node : mesh.local_node_ptr_range())
1630  {
1631  unsigned int n_comp = node->n_comp(sys_num,var_num);
1632  for (unsigned int i=0; i<n_comp; i++)
1633  {
1634  const dof_id_type index = node->dof_number(sys_num,var_num,i);
1635  v.set(index,0.0);
1636  }
1637  }
1638 
1639  // Loop over elements.
1640  for (const auto & elem : mesh.active_local_element_ptr_range())
1641  {
1642  unsigned int n_comp = elem->n_comp(sys_num,var_num);
1643  for (unsigned int i=0; i<n_comp; i++)
1644  {
1645  const dof_id_type index = elem->dof_number(sys_num,var_num,i);
1646  v.set(index,0.0);
1647  }
1648  }
1649 }
MeshBase & mesh
const MeshBase & get_mesh() const
Definition: system.h:2277
unsigned int number() const
Definition: system.h:2269
virtual void set(const numeric_index_type i, const T value)=0
Sets v(i) = value.
unsigned int n_vars() const
Definition: system.h:2349
uint8_t dof_id_type
Definition: id_types.h:67

Member Data Documentation

◆ _analytic_jacobians

bool HeatSystem::_analytic_jacobians
protected

Definition at line 136 of file heatsystem.h.

Referenced by element_time_derivative(), and init_data().

◆ _averaged_model

bool HeatSystem::_averaged_model
protected

Definition at line 86 of file heatsystem.h.

◆ _communicator

const Parallel::Communicator& libMesh::ParallelObject::_communicator
protectedinherited

◆ _constrain_in_solver

bool libMesh::DifferentiableSystem::_constrain_in_solver
protectedinherited

_constrain_in_solver defaults to true; if false then we apply constraints only via residual terms in the systems to be solved.

Definition at line 430 of file diff_system.h.

Referenced by libMesh::DifferentiableSystem::get_constrain_in_solver(), and libMesh::DifferentiableSystem::set_constrain_in_solver().

◆ _counts

ReferenceCounter::Counts libMesh::ReferenceCounter::_counts
staticprotectedinherited

Actually holds the data.

Definition at line 124 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::get_info().

◆ _enable_print_counter

bool libMesh::ReferenceCounter::_enable_print_counter = true
staticprotectedinherited

Flag to control whether reference count information is printed when print_info is called.

Definition at line 143 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::disable_print_counter_info(), libMesh::ReferenceCounter::enable_print_counter_info(), and libMesh::ReferenceCounter::print_info().

◆ _fe_family

std::string HeatSystem::_fe_family
protected

Definition at line 129 of file heatsystem.h.

Referenced by fe_family(), and init_data().

◆ _fe_order

unsigned int HeatSystem::_fe_order
protected

Definition at line 130 of file heatsystem.h.

Referenced by fe_order(), and init_data().

◆ _first_order_vars

std::set<unsigned int> libMesh::DifferentiablePhysics::_first_order_vars
protectedinherited

◆ _k [1/2]

libMesh::Real HeatSystem::_k[4]
protected

Definition at line 40 of file heatsystem.h.

◆ _k [2/2]

Real HeatSystem::_k
protected

Definition at line 120 of file heatsystem.h.

Referenced by HeatSystem(), and init_data().

◆ _mesh_sys

System* libMesh::DifferentiablePhysics::_mesh_sys
protectedinherited

◆ _mesh_x_var

unsigned int libMesh::DifferentiablePhysics::_mesh_x_var
protectedinherited

◆ _mesh_y_var

unsigned int libMesh::DifferentiablePhysics::_mesh_y_var
protectedinherited

◆ _mesh_z_var

unsigned int libMesh::DifferentiablePhysics::_mesh_z_var
protectedinherited

◆ _mutex

Threads::spin_mutex libMesh::ReferenceCounter::_mutex
staticprotectedinherited

Mutual exclusion object to enable thread-safe reference counting.

Definition at line 137 of file reference_counter.h.

◆ _n_objects

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

The number of objects.

Print the reference count information when the number returns to 0.

Definition at line 132 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::n_objects(), libMesh::ReferenceCounter::ReferenceCounter(), and libMesh::ReferenceCounter::~ReferenceCounter().

◆ _second_order_dot_vars

std::map<unsigned int,unsigned int> libMesh::DifferentiablePhysics::_second_order_dot_vars
protectedinherited

If the user adds any second order variables, then we need to also cache the map to their corresponding dot variable that will be added by this TimeSolver class.

Definition at line 560 of file diff_physics.h.

Referenced by libMesh::DifferentiableSystem::add_second_order_dot_vars(), and libMesh::DifferentiableSystem::get_second_order_dot_var().

◆ _second_order_vars

std::set<unsigned int> libMesh::DifferentiablePhysics::_second_order_vars
protectedinherited

◆ _time_evolving

std::vector<unsigned int> libMesh::DifferentiablePhysics::_time_evolving
protectedinherited

Stores unsigned int to tell us which variables are evolving as first order in time (1), second order in time (2), or are not time evolving (0).

Definition at line 543 of file diff_physics.h.

Referenced by libMesh::DifferentiablePhysics::clear_physics(), libMesh::DifferentiablePhysics::init_physics(), libMesh::DifferentiablePhysics::is_time_evolving(), and libMesh::DifferentiablePhysics::time_evolving().

◆ assemble_before_solve

bool libMesh::System::assemble_before_solve
inherited

Flag which tells the system to whether or not to call the user assembly function during each call to solve().

By default, every call to solve() begins with a call to the user assemble, so this flag is true. (For explicit systems, "solving" the system occurs during the assembly step, so this flag is always true for explicit systems.)

You will only want to set this to false if you need direct control over when the system is assembled, and are willing to track the state of its assembly yourself. An example of such a case is an implicit system with multiple right hand sides. In this instance, a single assembly would likely be followed with multiple calls to solve.

The frequency system and Newmark system have their own versions of this flag, called _finished_assemble, which might be able to be replaced with this more general concept.

Definition at line 1527 of file system.h.

Referenced by libMesh::ImplicitSystem::adjoint_solve(), libMesh::ImplicitSystem::disable_cache(), libMesh::System::disable_cache(), main(), libMesh::RBConstruction::RBConstruction(), libMesh::RBSCMConstruction::RBSCMConstruction(), libMesh::ImplicitSystem::sensitivity_solve(), libMesh::EigenSystem::solve(), libMesh::CondensedEigenSystem::solve(), and libMesh::LinearImplicitSystem::solve().

◆ assemble_qoi_elements

bool libMesh::DifferentiableQoI::assemble_qoi_elements
inherited

If assemble_qoi_elements is false (it is true by default), the assembly loop for a quantity of interest or its derivatives will skip computing on mesh elements, and will only compute on mesh sides.

Definition at line 115 of file diff_qoi.h.

◆ assemble_qoi_internal_sides

bool libMesh::DifferentiableQoI::assemble_qoi_internal_sides
inherited

If assemble_qoi_internal_sides is true (it is false by default), the assembly loop for a quantity of interest or its derivatives will loop over element sides which do not fall on domain boundaries.

Definition at line 107 of file diff_qoi.h.

◆ assemble_qoi_sides

bool libMesh::DifferentiableQoI::assemble_qoi_sides
inherited

If assemble_qoi_sides is true (it is false by default), the assembly loop for a quantity of interest or its derivatives will loop over domain boundary sides.

To add domain interior sides, also set assemble_qoi_internal_sides to true.

Definition at line 99 of file diff_qoi.h.

Referenced by main().

◆ compute_internal_sides

bool libMesh::DifferentiablePhysics::compute_internal_sides
inherited

compute_internal_sides is false by default, indicating that side_* computations will only be done on boundary sides.

If compute_internal_sides is true, computations will be done on sides between elements as well.

Definition at line 156 of file diff_physics.h.

◆ computed_QoI

Number HeatSystem::computed_QoI[1]
protected

Definition at line 126 of file heatsystem.h.

◆ current_local_solution

std::unique_ptr<NumericVector<Number> > libMesh::System::current_local_solution
inherited

All the values I need to compute my contribution to the simulation at hand.

Think of this as the current solution with any ghost values needed from other processors. This vector is necessarily larger than the solution vector in the case of a parallel simulation. The update() member is used to synchronize the contents of the solution and current_local_solution vectors.

Definition at line 1585 of file system.h.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::UniformRefinementEstimator::_estimate_error(), alternative_fe_assembly(), HDGProblem::assemble(), libMesh::NonlinearImplicitSystem::assembly(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::System::clear(), libMesh::Problem_Interface::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), libMesh::System::current_solution(), DMlibMeshFunction(), DMlibMeshJacobian(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), fe_assembly(), libMesh::System::init_data(), libMesh::libmesh_petsc_snes_fd_residual(), libMesh::libmesh_petsc_snes_jacobian(), libMesh::libmesh_petsc_snes_mffd_residual(), libMesh::libmesh_petsc_snes_residual(), libMesh::libmesh_petsc_snes_residual_helper(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::FEMContext::pre_fe_reinit(), libMesh::RBEIMEvaluation::project_qp_data_map_onto_system(), libMesh::System::re_update(), libMesh::System::reinit(), libMesh::System::restrict_vectors(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), SolidSystem::save_initial_mesh(), libMesh::RBConstruction::set_context_solution_vec(), setup(), MeshFunctionTest::test_subdomain_id_sets(), MeshInputTest::testCopyElementVectorImpl(), libMesh::BoundaryVolumeSolutionTransfer::transfer_boundary_volume(), libMesh::TransientRBConstruction::truth_assembly(), libMesh::TransientRBConstruction::truth_solve(), libMesh::System::update(), libMesh::Nemesis_IO_Helper::write_element_values(), and libMesh::Nemesis_IO_Helper::write_nodal_solution().

◆ deltat

Real libMesh::DifferentiableSystem::deltat
inherited

◆ deltat_vector

std::vector<Number> HeatSystem::deltat_vector
protected

Definition at line 143 of file heatsystem.h.

Referenced by perturb_accumulate_residuals().

◆ dp

Number HeatSystem::dp
protected

Definition at line 146 of file heatsystem.h.

Referenced by perturb_accumulate_residuals().

◆ extra_quadrature_order

int libMesh::System::extra_quadrature_order
inherited

A member int that can be employed to indicate increased or reduced quadrature order.

Note
For FEMSystem users, by default, when calling the user-defined residual functions, the FEMSystem will first set up an appropriate FEType::default_quadrature_rule() object for performing the integration. This rule will integrate elements of order up to 2*p+1 exactly (where p is the sum of the base FEType and local p refinement levels), but if additional (or reduced) quadrature accuracy is desired then this extra_quadrature_order (default 0) will be added.

Definition at line 1558 of file system.h.

Referenced by CurlCurlSystem::init_data(), and set_system_parameters().

◆ fe_reinit_during_postprocess

bool libMesh::FEMSystem::fe_reinit_during_postprocess
inherited

If fe_reinit_during_postprocess is true (it is true by default), FE objects will be reinit()ed with their default quadrature rules.

If false, FE objects will need to be reinit()ed by the user or will be in an undefined state.

Definition at line 176 of file fem_system.h.

◆ final_sensitivity

Number HeatSystem::final_sensitivity
protected

Definition at line 149 of file heatsystem.h.

◆ linear_solver

std::unique_ptr<LinearSolver<Number> > libMesh::ImplicitSystem::linear_solver
mutableinherited

◆ matrix

SparseMatrix<Number>* libMesh::ImplicitSystem::matrix
inherited

The system matrix.

Implicit systems are characterized by the need to solve the linear system Ax=b. This is the system matrix A.

Public access to this member variable will be deprecated in the future! Use get_system_matrix() instead.

Definition at line 319 of file implicit_system.h.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), add_M_C_K_helmholtz(), libMesh::ImplicitSystem::add_matrices(), libMesh::ImplicitSystem::adjoint_solve(), libMesh::ImplicitSystem::assemble(), assemble_func(), libMesh::FEMSystem::assembly(), libMesh::LinearImplicitSystem::assembly(), libMesh::NonlinearImplicitSystem::assembly(), libMesh::ImplicitSystem::clear(), libMesh::NewmarkSystem::compute_matrix(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::ContinuationSystem::continuation_solve(), DMCreateMatrix_libMesh(), DMlibMeshJacobian(), libMesh::RBConstruction::enrich_basis_from_rhs_terms(), fill_dirichlet_bc(), libMesh::ImplicitSystem::forward_qoi_parameter_sensitivity(), libMesh::ImplicitSystem::get_system_matrix(), main(), periodic_bc_test_poisson(), libMesh::ImplicitSystem::qoi_parameter_hessian(), libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product(), libMesh::ImplicitSystem::sensitivity_solve(), libMesh::NewtonSolver::solve(), libMesh::PetscDiffSolver::solve(), libMesh::NoxNonlinearSolver< Number >::solve(), libMesh::EigenTimeSolver::solve(), libMesh::FrequencySystem::solve(), libMesh::LinearImplicitSystem::solve(), libMesh::NonlinearImplicitSystem::solve(), libMesh::ContinuationSystem::solve_tangent(), libMesh::TransientRBConstruction::truth_assembly(), libMesh::RBConstruction::truth_assembly(), libMesh::TransientRBConstruction::truth_solve(), libMesh::RBConstruction::truth_solve(), libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve(), and libMesh::ImplicitSystem::weighted_sensitivity_solve().

◆ numerical_jacobian_h

Real libMesh::FEMSystem::numerical_jacobian_h
inherited

If calculating numeric jacobians is required, the FEMSystem will perturb each solution vector entry by numerical_jacobian_h when calculating finite differences.

This defaults to the libMesh TOLERANCE but can be set manually.

For ALE terms, the FEMSystem will perturb each mesh point in an element by numerical_jacobian_h * Elem::hmin()

Definition at line 187 of file fem_system.h.

Referenced by libMesh::FEMSystem::numerical_jacobian(), libMesh::FEMSystem::numerical_jacobian_h_for_var(), and set_system_parameters().

◆ parameter_vector

ParameterVector HeatSystem::parameter_vector
protected

Definition at line 117 of file heatsystem.h.

◆ parameters

std::vector< Number > HeatSystem::parameters
protected

Definition at line 113 of file heatsystem.h.

Referenced by element_time_derivative(), and init_data().

◆ postprocess_sides

bool libMesh::DifferentiableSystem::postprocess_sides
inherited

If postprocess_sides is true (it is false by default), the postprocessing loop will loop over all sides as well as all elements.

Definition at line 332 of file diff_system.h.

Referenced by main().

◆ print_element_jacobians

bool libMesh::DifferentiableSystem::print_element_jacobians
inherited

Set print_element_jacobians to true to print each J_elem contribution.

Definition at line 379 of file diff_system.h.

Referenced by CurlCurlSystem::init_data(), main(), and set_system_parameters().

◆ print_element_residuals

bool libMesh::DifferentiableSystem::print_element_residuals
inherited

Set print_element_residuals to true to print each R_elem contribution.

Definition at line 374 of file diff_system.h.

Referenced by main(), and set_system_parameters().

◆ print_element_solutions

bool libMesh::DifferentiableSystem::print_element_solutions
inherited

Set print_element_solutions to true to print each U_elem input.

Definition at line 369 of file diff_system.h.

Referenced by main().

◆ print_jacobian_norms

bool libMesh::DifferentiableSystem::print_jacobian_norms
inherited

Set print_jacobian_norms to true to print |J| whenever it is assembled.

Definition at line 359 of file diff_system.h.

Referenced by libMesh::FEMSystem::assembly(), main(), and set_system_parameters().

◆ print_jacobians

bool libMesh::DifferentiableSystem::print_jacobians
inherited

Set print_jacobians to true to print J whenever it is assembled.

Definition at line 364 of file diff_system.h.

Referenced by libMesh::FEMSystem::assembly(), CurlCurlSystem::init_data(), main(), and set_system_parameters().

◆ print_residual_norms

bool libMesh::DifferentiableSystem::print_residual_norms
inherited

Set print_residual_norms to true to print |F| whenever it is assembled.

Definition at line 349 of file diff_system.h.

Referenced by libMesh::FEMSystem::assembly(), main(), and set_system_parameters().

◆ print_residuals

bool libMesh::DifferentiableSystem::print_residuals
inherited

Set print_residuals to true to print F whenever it is assembled.

Definition at line 354 of file diff_system.h.

Referenced by libMesh::FEMSystem::assembly(), main(), and set_system_parameters().

◆ print_solution_norms

bool libMesh::DifferentiableSystem::print_solution_norms
inherited

Set print_residual_norms to true to print |U| whenever it is used in an assembly() call.

Definition at line 338 of file diff_system.h.

Referenced by libMesh::FEMSystem::assembly(), main(), and set_system_parameters().

◆ print_solutions

bool libMesh::DifferentiableSystem::print_solutions
inherited

Set print_solutions to true to print U whenever it is used in an assembly() call.

Definition at line 344 of file diff_system.h.

Referenced by libMesh::FEMSystem::assembly(), main(), and set_system_parameters().

◆ QoI_time_instant

std::vector<Real> HeatSystem::QoI_time_instant

Definition at line 47 of file heatsystem.h.

◆ R_minus_dp

std::vector<Number> HeatSystem::R_minus_dp
protected

Definition at line 140 of file heatsystem.h.

Referenced by perturb_accumulate_residuals().

◆ R_plus_dp

std::vector<Number> HeatSystem::R_plus_dp
protected

Definition at line 139 of file heatsystem.h.

Referenced by perturb_accumulate_residuals().

◆ rhs

NumericVector<Number>* libMesh::ExplicitSystem::rhs
inherited

The system matrix.

Implicit systems are characterized by the need to solve the linear system Ax=b. This is the right-hand-side vector b.

Definition at line 124 of file explicit_system.h.

Referenced by libMesh::__libmesh_petsc_diff_solver_residual(), add_M_C_K_helmholtz(), libMesh::ExplicitSystem::add_system_rhs(), assemble(), libMesh::ImplicitSystem::assemble(), LinearElasticity::assemble(), assemble_1D(), assemble_biharmonic(), assemble_divgrad(), assemble_elasticity(), assemble_ellipticdg(), assemble_func(), assemble_laplace(), assemble_matrix_and_rhs(), assemble_poisson(), libMesh::ImplicitSystem::assemble_residual_derivatives(), assemble_shell(), assemble_stokes(), assemble_wave(), libMesh::FEMSystem::assembly(), libMesh::LinearImplicitSystem::assembly(), libMesh::NonlinearImplicitSystem::assembly(), assembly_with_dg_fem_context(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::Problem_Interface::computeF(), libMesh::ContinuationSystem::continuation_solve(), DMlibMeshFunction(), libMesh::RBConstruction::enrich_basis_from_rhs_terms(), fill_dirichlet_bc(), libMesh::ImplicitSystem::forward_qoi_parameter_sensitivity(), libMesh::NewtonSolver::line_search(), periodic_bc_test_poisson(), perturb_accumulate_residuals(), libMesh::ImplicitSystem::qoi_parameter_hessian(), libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product(), libMesh::NewtonSolver::solve(), libMesh::PetscDiffSolver::solve(), libMesh::FrequencySystem::solve(), libMesh::LinearImplicitSystem::solve(), libMesh::NonlinearImplicitSystem::solve(), libMesh::ContinuationSystem::solve_tangent(), libMesh::TransientRBConstruction::truth_assembly(), libMesh::RBConstruction::truth_assembly(), libMesh::TransientRBConstruction::truth_solve(), libMesh::RBConstruction::truth_solve(), libMesh::TransientRBConstruction::update_residual_terms(), libMesh::RBConstruction::update_residual_terms(), libMesh::NewmarkSystem::update_rhs(), libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve(), and libMesh::ImplicitSystem::weighted_sensitivity_solve().

◆ solution

std::unique_ptr<NumericVector<Number> > libMesh::System::solution
inherited

Data structure to hold solution values.

Definition at line 1573 of file system.h.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::TransientRBConstruction::add_IC_to_RB_space(), libMesh::NewmarkSolver::advance_timestep(), libMesh::AdaptiveTimeSolver::advance_timestep(), libMesh::UnsteadySolver::advance_timestep(), libMesh::ContinuationSystem::apply_predictor(), HDGProblem::assemble(), libMesh::TransientRBConstruction::assemble_affine_expansion(), libMesh::FEMSystem::assembly(), libMesh::LinearImplicitSystem::assembly(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::RBConstruction::check_if_zero_truth_solve(), libMesh::System::clear(), libMesh::System::compare(), compute_enriched_soln(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::NewmarkSolver::compute_initial_accel(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), compute_stresses(), LinearElasticityWithContact::compute_stresses(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), libMesh::Problem_Interface::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), libMesh::ContinuationSystem::continuation_solve(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::GMVIO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), DMCreateGlobalVector_libMesh(), DMlibMeshFunction(), DMlibMeshJacobian(), libMesh::UnsteadySolver::du(), libMesh::RBConstruction::enrich_RB_space(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::AdjointResidualErrorEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::RBSCMConstruction::evaluate_stability_constant(), libMesh::EigenSystem::get_eigenpair(), libMesh::CondensedEigenSystem::get_eigenpair(), LinearElasticityWithContact::get_least_and_max_gap_function(), libMesh::System::init_data(), libMesh::ContinuationSystem::initialize_tangent(), libMesh::TransientRBConstruction::initialize_truth(), libMesh::libmesh_petsc_snes_fd_residual(), libMesh::libmesh_petsc_snes_jacobian(), libMesh::libmesh_petsc_snes_mffd_residual(), libMesh::libmesh_petsc_snes_residual(), libMesh::libmesh_petsc_snes_residual_helper(), libMesh::RBConstruction::load_basis_function(), libMesh::TransientRBConstruction::load_rb_solution(), libMesh::RBConstruction::load_rb_solution(), main(), libMesh::DofMap::max_constraint_error(), libMesh::FEMSystem::mesh_position_get(), libMesh::ErrorVector::plot_error(), libMesh::RBConstruction::print_basis_function_orthogonality(), libMesh::RBEIMEvaluation::project_qp_data_map_onto_system(), libMesh::InterMeshProjection::project_system_vectors(), libMesh::ImplicitSystem::qoi_parameter_hessian(), libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product(), libMesh::System::re_update(), libMesh::System::read_legacy_data(), libMesh::System::read_parallel_data(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::System::read_serialized_data(), libMesh::System::reinit(), libMesh::System::restrict_vectors(), libMesh::MemoryHistoryData::retrieve_vectors(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), libMesh::ContinuationSystem::save_current_solution(), libMesh::TransientRBConstruction::set_error_temporal_data(), setup(), WriteVecAndScalar::setupTests(), libMesh::TwostepTimeSolver::solve(), libMesh::NewtonSolver::solve(), libMesh::PetscDiffSolver::solve(), libMesh::FrequencySystem::solve(), libMesh::LinearImplicitSystem::solve(), libMesh::NonlinearImplicitSystem::solve(), libMesh::RBConstruction::solve_for_matrix_and_rhs(), libMesh::ContinuationSystem::solve_tangent(), libMesh::MemoryHistoryData::store_vectors(), ConstraintOperatorTest::test1DCoarseningOperator(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), SystemsTest::testBoundaryProjectCube(), SystemsTest::testDofCouplingWithVarGroups(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), SystemsTest::testPostInitAddVector(), SystemsTest::testProjectCubeWithMeshFunction(), MeshInputTest::testProjectionRegression(), WriteVecAndScalar::testSolution(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::DirectSolutionTransfer::transfer(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::BoundaryVolumeSolutionTransfer::transfer_boundary_volume(), libMesh::BoundaryVolumeSolutionTransfer::transfer_volume_boundary(), libMesh::TransientRBConstruction::truth_solve(), libMesh::RBConstruction::truth_solve(), libMesh::System::update(), libMesh::System::update_global_solution(), libMesh::TransientRBConstruction::update_RB_initial_condition_all_N(), libMesh::TransientRBConstruction::update_residual_terms(), libMesh::RBConstruction::update_residual_terms(), libMesh::ContinuationSystem::update_solution(), libMesh::NewmarkSystem::update_u_v_a(), libMesh::DTKAdapter::update_variable_values(), libMesh::RBEIMEvaluation::write_out_projected_basis_functions(), libMesh::System::write_parallel_data(), libMesh::TransientRBConstruction::write_riesz_representors_to_files(), libMesh::RBConstruction::write_riesz_representors_to_files(), and libMesh::System::write_serialized_data().

◆ T_var

unsigned int HeatSystem::T_var
protected

Definition at line 133 of file heatsystem.h.

Referenced by init_data().

◆ tf

Real HeatSystem::tf
protected

Definition at line 123 of file heatsystem.h.

◆ time

Real libMesh::System::time
inherited

For time-dependent problems, this is the time t at the beginning of the current timestep.

Note
For DifferentiableSystem users: do not access this time during an assembly! Use the DiffContext::time value instead to get correct results.

Definition at line 1595 of file system.h.

Referenced by libMesh::AdaptiveTimeSolver::adjoint_advance_timestep(), libMesh::UnsteadySolver::adjoint_advance_timestep(), libMesh::TwostepTimeSolver::adjoint_solve(), libMesh::AdaptiveTimeSolver::advance_timestep(), libMesh::UnsteadySolver::advance_timestep(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubProjector::construct_projection(), element_qoi(), fill_dirichlet_bc(), libMesh::ExactErrorEstimator::find_squared_element_error(), initialize(), libMesh::Euler2Solver::integrate_adjoint_refinement_error_estimate(), libMesh::EulerSolver::integrate_adjoint_refinement_error_estimate(), libMesh::UnsteadySolver::integrate_adjoint_sensitivity(), libMesh::Euler2Solver::integrate_qoi_timestep(), libMesh::EulerSolver::integrate_qoi_timestep(), main(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectEdges::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectSides::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectInteriors::operator()(), libMesh::System::reinit_constraints(), libMesh::UnsteadySolver::retrieve_timestep(), and libMesh::TwostepTimeSolver::solve().

◆ time_solver

std::unique_ptr<TimeSolver> libMesh::DifferentiableSystem::time_solver
inherited

◆ use_fixed_solution

bool libMesh::System::use_fixed_solution
inherited

A boolean to be set to true by systems using elem_fixed_solution, for optional use by e.g.

stabilized methods. False by default.

Note
For FEMSystem users, if this variable is set to true, it must be before init_data() is called.

Definition at line 1543 of file system.h.

Referenced by libMesh::EulerSolver::_general_residual(), libMesh::Euler2Solver::_general_residual(), libMesh::SteadySolver::_general_residual(), libMesh::NewmarkSolver::_general_residual(), libMesh::DifferentiableSystem::clear(), libMesh::DiffContext::DiffContext(), and libMesh::FEMContext::pre_fe_reinit().

◆ verify_analytic_jacobians

Real libMesh::FEMSystem::verify_analytic_jacobians
inherited

If verify_analytic_jacobian is equal to zero (as it is by default), no numeric jacobians will be calculated unless an overridden element_time_derivative(), element_constraint(), side_time_derivative(), or side_constraint() function cannot provide an analytic jacobian upon request.

If verify_analytic_jacobian is equal to the positive value tol, then any time a full analytic element jacobian can be calculated it will be tested against a numerical jacobian on the same element, and the program will abort if the relative error (in matrix l1 norms) exceeds tol.

Definition at line 215 of file fem_system.h.

Referenced by libMesh::FEMSystem::assembly(), CurlCurlSystem::init_data(), and set_system_parameters().

◆ zero_out_matrix_and_rhs

bool libMesh::ImplicitSystem::zero_out_matrix_and_rhs
inherited

By default, the system will zero out the matrix and the right hand side.

If this flag is false, it is the responsibility of the client code to take care of setting these to zero before assembly begins

Definition at line 326 of file implicit_system.h.

Referenced by libMesh::ImplicitSystem::assemble().


The documentation for this class was generated from the following files: