libMesh::ContinuationSystem Class Reference

#include <continuation_system.h>

Inheritance diagram for libMesh::ContinuationSystem:

Public Types

enum  Predictor { Euler, AB2, Invalid_Predictor }
 
typedef ContinuationSystem sys_type
 
typedef FEMSystem Parent
 
typedef bool(TimeSolver::* TimeSolverResPtr) (bool, DiffContext &)
 
typedef std::map< std::string, SparseMatrix< Number > * >::iterator matrices_iterator
 
typedef std::map< std::string, SparseMatrix< Number > * >::const_iterator const_matrices_iterator
 
typedef std::map< std::string, NumericVector< Number > * >::iterator vectors_iterator
 
typedef std::map< std::string, NumericVector< Number > * >::const_iterator const_vectors_iterator
 

Public Member Functions

 ContinuationSystem (EquationSystems &es, const std::string &name, const unsigned int number)
 
virtual ~ContinuationSystem ()
 
virtual void clear () libmesh_override
 
virtual void solve () libmesh_override
 
void continuation_solve ()
 
void advance_arcstep ()
 
void set_max_arclength_stepsize (Real maxds)
 
void save_current_solution ()
 
virtual void assembly (bool get_residual, bool get_jacobian, bool apply_heterogeneous_constraints=false) libmesh_override
 
void mesh_position_get ()
 
void mesh_position_set ()
 
virtual UniquePtr< DiffContextbuild_context () libmesh_override
 
virtual void init_context (DiffContext &) libmesh_override
 
virtual void postprocess () libmesh_override
 
virtual void assemble_qoi (const QoISet &indices=QoISet()) libmesh_override
 
virtual void assemble_qoi_derivative (const QoISet &qoi_indices=QoISet(), bool include_liftfunc=true, bool apply_constraints=true) libmesh_override
 
Real numerical_jacobian_h_for_var (unsigned int var_num) const
 
void set_numerical_jacobian_h_for_var (unsigned int var_num, Real new_h)
 
void numerical_jacobian (TimeSolverResPtr res, FEMContext &context) const
 
void numerical_elem_jacobian (FEMContext &context) const
 
void numerical_side_jacobian (FEMContext &context) const
 
void numerical_nonlocal_jacobian (FEMContext &context) const
 
virtual void reinit () libmesh_override
 
virtual void assemble () libmesh_override
 
virtual LinearSolver< Number > * get_linear_solver () const libmesh_override
 
virtual std::pair< unsigned int, Realget_linear_solve_parameters () const libmesh_override
 
virtual void release_linear_solver (LinearSolver< Number > *) const libmesh_override
 
virtual std::pair< unsigned int, Realadjoint_solve (const QoISet &qoi_indices=QoISet()) libmesh_override
 
virtual UniquePtr< DifferentiablePhysicsclone_physics () libmesh_override
 
virtual UniquePtr< DifferentiableQoIclone () libmesh_override
 
const DifferentiablePhysicsget_physics () const
 
DifferentiablePhysicsget_physics ()
 
void attach_physics (DifferentiablePhysics *physics_in)
 
const DifferentiableQoIget_qoi () const
 
DifferentiableQoIget_qoi ()
 
void attach_qoi (DifferentiableQoI *qoi_in)
 
void set_time_solver (UniquePtr< TimeSolver > _time_solver)
 
TimeSolverget_time_solver ()
 
const TimeSolverget_time_solver () const
 
virtual void element_postprocess (DiffContext &)
 
virtual void side_postprocess (DiffContext &)
 
unsigned int get_second_order_dot_var (unsigned int var) const
 
bool have_first_order_scalar_vars () const
 
bool have_second_order_scalar_vars () const
 
sys_typesystem ()
 
virtual void disable_cache () libmesh_override
 
virtual std::string system_type () const libmesh_override
 
virtual void assemble_residual_derivatives (const ParameterVector &parameters) libmesh_override
 
virtual std::pair< unsigned int, Realsensitivity_solve (const ParameterVector &parameters) libmesh_override
 
virtual std::pair< unsigned int, Realweighted_sensitivity_solve (const ParameterVector &parameters, const ParameterVector &weights) libmesh_override
 
virtual std::pair< unsigned int, Realweighted_sensitivity_adjoint_solve (const ParameterVector &parameters, const ParameterVector &weights, const QoISet &qoi_indices=QoISet()) libmesh_override
 
virtual void adjoint_qoi_parameter_sensitivity (const QoISet &qoi_indices, const ParameterVector &parameters, SensitivityData &sensitivities) libmesh_override
 
virtual void forward_qoi_parameter_sensitivity (const QoISet &qoi_indices, const ParameterVector &parameters, SensitivityData &sensitivities) libmesh_override
 
virtual void qoi_parameter_hessian (const QoISet &qoi_indices, const ParameterVector &parameters, SensitivityData &hessian) libmesh_override
 
virtual void qoi_parameter_hessian_vector_product (const QoISet &qoi_indices, const ParameterVector &parameters, const ParameterVector &vector, SensitivityData &product) libmesh_override
 
SparseMatrix< Number > & add_matrix (const std::string &mat_name)
 
bool have_matrix (const std::string &mat_name) const
 
const SparseMatrix< Number > * request_matrix (const std::string &mat_name) const
 
SparseMatrix< Number > * request_matrix (const std::string &mat_name)
 
const SparseMatrix< Number > & get_matrix (const std::string &mat_name) const
 
SparseMatrix< Number > & get_matrix (const std::string &mat_name)
 
virtual unsigned int n_matrices () const libmesh_override
 
void init ()
 
virtual void reinit_constraints ()
 
bool is_initialized ()
 
virtual void update ()
 
virtual void restrict_solve_to (const SystemSubset *subset, const SubsetSolveMode subset_solve_mode=SUBSET_ZERO)
 
bool is_adjoint_already_solved () const
 
void set_adjoint_already_solved (bool setting)
 
virtual void qoi_parameter_sensitivity (const QoISet &qoi_indices, const ParameterVector &parameters, SensitivityData &sensitivities)
 
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=libmesh_nullptr) const
 
void project_solution (FEMFunctionBase< Number > *f, FEMFunctionBase< Gradient > *g=libmesh_nullptr) const
 
void project_solution (Number fptr(const Point &p, const Parameters &parameters, const std::string &sys_name, const std::string &unknown_name), Gradient gptr(const Point &p, const Parameters &parameters, const std::string &sys_name, const std::string &unknown_name), const Parameters &parameters) const
 
void project_vector (NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=libmesh_nullptr, int is_adjoint=-1) const
 
void project_vector (NumericVector< Number > &new_vector, FEMFunctionBase< Number > *f, FEMFunctionBase< Gradient > *g=libmesh_nullptr, int is_adjoint=-1) const
 
void project_vector (Number fptr(const Point &p, const Parameters &parameters, const std::string &sys_name, const std::string &unknown_name), Gradient gptr(const Point &p, const Parameters &parameters, const std::string &sys_name, const std::string &unknown_name), const Parameters &parameters, NumericVector< Number > &new_vector, int is_adjoint=-1) const
 
void boundary_project_solution (const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, FunctionBase< Number > *f, FunctionBase< Gradient > *g=libmesh_nullptr)
 
void boundary_project_solution (const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, Number fptr(const Point &p, const Parameters &parameters, const std::string &sys_name, const std::string &unknown_name), Gradient gptr(const Point &p, const Parameters &parameters, const std::string &sys_name, const std::string &unknown_name), const Parameters &parameters)
 
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=libmesh_nullptr, int is_adjoint=-1) const
 
void boundary_project_vector (const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, Number fptr(const Point &p, const Parameters &parameters, const std::string &sys_name, const std::string &unknown_name), Gradient gptr(const Point &p, const Parameters &parameters, const std::string &sys_name, const std::string &unknown_name), const Parameters &parameters, NumericVector< Number > &new_vector, int is_adjoint=-1) const
 
unsigned int number () const
 
void update_global_solution (std::vector< Number > &global_soln) const
 
void update_global_solution (std::vector< Number > &global_soln, const processor_id_type dest_proc) const
 
const MeshBaseget_mesh () const
 
MeshBaseget_mesh ()
 
const DofMapget_dof_map () const
 
DofMapget_dof_map ()
 
const EquationSystemsget_equation_systems () const
 
EquationSystemsget_equation_systems ()
 
bool active () const
 
void activate ()
 
void deactivate ()
 
void set_basic_system_only ()
 
vectors_iterator vectors_begin ()
 
const_vectors_iterator vectors_begin () const
 
vectors_iterator vectors_end ()
 
const_vectors_iterator vectors_end () const
 
NumericVector< Number > & add_vector (const std::string &vec_name, const bool projections=true, const ParallelType type=PARALLEL)
 
void remove_vector (const std::string &vec_name)
 
bool & project_solution_on_reinit (void)
 
bool have_vector (const std::string &vec_name) const
 
const NumericVector< Number > * request_vector (const std::string &vec_name) const
 
NumericVector< Number > * request_vector (const std::string &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 (const std::string &vec_name) const
 
NumericVector< Number > & get_vector (const std::string &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)
 
int vector_is_adjoint (const std::string &vec_name) const
 
void set_vector_preservation (const std::string &vec_name, bool preserve)
 
bool vector_preservation (const std::string &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_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 (const std::string &var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=libmesh_nullptr)
 
unsigned int add_variable (const std::string &var, const Order order=FIRST, const FEFamily=LAGRANGE, const std::set< subdomain_id_type > *const active_subdomains=libmesh_nullptr)
 
unsigned int add_variables (const std::vector< std::string > &vars, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=libmesh_nullptr)
 
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=libmesh_nullptr)
 
const Variablevariable (unsigned int var) const
 
const VariableGroupvariable_group (unsigned int vg) const
 
bool has_variable (const std::string &var) const
 
const std::string & variable_name (const unsigned int i) const
 
unsigned short int variable_number (const std::string &var) const
 
void get_all_variable_numbers (std::vector< unsigned int > &all_variable_numbers) const
 
unsigned int variable_scalar_number (const std::string &var, unsigned int component) const
 
unsigned int variable_scalar_number (unsigned int var_num, unsigned int component) const
 
const FETypevariable_type (const unsigned int i) const
 
const FETypevariable_type (const std::string &var) const
 
bool identify_variable_groups () const
 
void identify_variable_groups (const bool)
 
Real calculate_norm (const NumericVector< Number > &v, unsigned int var, FEMNormType norm_type, std::set< unsigned int > *skip_dimensions=libmesh_nullptr) const
 
Real calculate_norm (const NumericVector< Number > &v, const SystemNorm &norm, std::set< unsigned int > *skip_dimensions=libmesh_nullptr) const
 
void read_header (Xdr &io, const std::string &version, const bool read_header=true, const bool read_additional_data=true, const bool read_legacy_format=false)
 
void read_legacy_data (Xdr &io, const bool read_additional_data=true)
 
template<typename ValType >
void read_serialized_data (Xdr &io, const bool read_additional_data=true)
 
void read_serialized_data (Xdr &io, const bool read_additional_data=true)
 
template<typename InValType >
std::size_t read_serialized_vectors (Xdr &io, const std::vector< NumericVector< Number > * > &vectors) const
 
std::size_t read_serialized_vectors (Xdr &io, const std::vector< NumericVector< Number > * > &vectors) const
 
template<typename InValType >
void read_parallel_data (Xdr &io, const bool read_additional_data)
 
void read_parallel_data (Xdr &io, const bool read_additional_data)
 
void write_header (Xdr &io, const std::string &version, const bool write_additional_data) const
 
void write_serialized_data (Xdr &io, const bool write_additional_data=true) const
 
std::size_t write_serialized_vectors (Xdr &io, const std::vector< const NumericVector< Number > * > &vectors) const
 
void write_parallel_data (Xdr &io, const bool write_additional_data) const
 
std::string get_info () const
 
void attach_init_function (void fptr(EquationSystems &es, const std::string &name))
 
void attach_init_object (Initialization &init)
 
void attach_assemble_function (void fptr(EquationSystems &es, const std::string &name))
 
void attach_assemble_object (Assembly &assemble)
 
void attach_constraint_function (void fptr(EquationSystems &es, const std::string &name))
 
void attach_constraint_object (Constraint &constrain)
 
void attach_QOI_function (void fptr(EquationSystems &es, const std::string &name, const QoISet &qoi_indices))
 
void attach_QOI_object (QOI &qoi)
 
void attach_QOI_derivative (void fptr(EquationSystems &es, const std::string &name, const QoISet &qoi_indices, bool include_liftfunc, bool apply_constraints))
 
void attach_QOI_derivative_object (QOIDerivative &qoi_derivative)
 
virtual void user_initialization ()
 
virtual void user_assembly ()
 
virtual void user_constrain ()
 
virtual void user_QOI (const QoISet &qoi_indices)
 
virtual void user_QOI_derivative (const QoISet &qoi_indices=QoISet(), bool include_liftfunc=true, bool apply_constraints=true)
 
virtual void re_update ()
 
virtual void restrict_vectors ()
 
virtual void prolong_vectors ()
 
Number current_solution (const dof_id_type global_dof_number) const
 
Number point_value (unsigned int var, const Point &p, const bool insist_on_success=true) const
 
Number point_value (unsigned int var, const Point &p, const Elem &e) const
 
Number point_value (unsigned int var, const Point &p, const Elem *e) const
 
Gradient point_gradient (unsigned int var, const Point &p, const bool insist_on_success=true) const
 
Gradient point_gradient (unsigned int var, const Point &p, const Elem &e) const
 
Gradient point_gradient (unsigned int var, const Point &p, const Elem *e) const
 
Tensor point_hessian (unsigned int var, const Point &p, const bool insist_on_success=true) const
 
Tensor point_hessian (unsigned int var, const Point &p, const Elem &e) const
 
Tensor point_hessian (unsigned int var, const Point &p, const Elem *e) const
 
void local_dof_indices (const unsigned int var, std::set< dof_id_type > &var_indices) const
 
void zero_variable (NumericVector< Number > &v, unsigned int var_num) const
 
bool & hide_output ()
 
const Parallel::Communicatorcomm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 
virtual void clear_physics ()
 
virtual void init_physics (const System &sys)
 
virtual bool element_time_derivative (bool request_jacobian, DiffContext &)
 
virtual bool element_constraint (bool request_jacobian, DiffContext &)
 
virtual bool side_time_derivative (bool request_jacobian, DiffContext &)
 
virtual bool side_constraint (bool request_jacobian, DiffContext &)
 
virtual bool nonlocal_time_derivative (bool request_jacobian, DiffContext &)
 
virtual bool nonlocal_constraint (bool request_jacobian, DiffContext &)
 
virtual void time_evolving (unsigned int var)
 
virtual void time_evolving (unsigned int var, unsigned int order)
 
bool is_time_evolving (unsigned int var) const
 
virtual bool eulerian_residual (bool request_jacobian, DiffContext &)
 
virtual bool eulerian_residual (bool request_jacobian, DiffContext &context) libmesh_override
 
virtual bool mass_residual (bool request_jacobian, DiffContext &)
 
virtual bool mass_residual (bool request_jacobian, DiffContext &) libmesh_override
 
virtual bool side_mass_residual (bool request_jacobian, DiffContext &)
 
virtual bool nonlocal_mass_residual (bool request_jacobian, DiffContext &c)
 
virtual bool damping_residual (bool request_jacobian, DiffContext &)
 
virtual bool side_damping_residual (bool request_jacobian, DiffContext &)
 
virtual bool nonlocal_damping_residual (bool request_jacobian, DiffContext &)
 
virtual void set_mesh_system (System *sys)
 
const Systemget_mesh_system () const
 
Systemget_mesh_system ()
 
virtual void set_mesh_x_var (unsigned int var)
 
unsigned int get_mesh_x_var () const
 
virtual void set_mesh_y_var (unsigned int var)
 
unsigned int get_mesh_y_var () const
 
virtual void set_mesh_z_var (unsigned int var)
 
unsigned int get_mesh_z_var () const
 
bool _eulerian_time_deriv (bool request_jacobian, DiffContext &)
 
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 > &)
 
virtual void clear_qoi ()
 
virtual void element_qoi (DiffContext &, const QoISet &)
 
virtual void element_qoi_derivative (DiffContext &, const QoISet &)
 
virtual void side_qoi (DiffContext &, const QoISet &)
 
virtual void side_qoi_derivative (DiffContext &, const QoISet &)
 
virtual void thread_join (std::vector< Number > &qoi, const std::vector< Number > &other_qoi, const QoISet &qoi_indices)
 
virtual void parallel_op (const Parallel::Communicator &communicator, std::vector< Number > &sys_qoi, std::vector< Number > &local_qoi, const QoISet &qoi_indices)
 

Static Public Member Functions

static std::string get_info ()
 
static void print_info (std::ostream &out=libMesh::out)
 
static unsigned int n_objects ()
 
static void enable_print_counter_info ()
 
static void disable_print_counter_info ()
 

Public Attributes

Realcontinuation_parameter
 
bool quiet
 
Real continuation_parameter_tolerance
 
Real solution_tolerance
 
Real initial_newton_tolerance
 
Real old_continuation_parameter
 
Real min_continuation_parameter
 
Real max_continuation_parameter
 
Real Theta
 
Real Theta_LOCA
 
unsigned int n_backtrack_steps
 
unsigned int n_arclength_reductions
 
Real ds_min
 
Predictor predictor
 
Real newton_stepgrowth_aggressiveness
 
bool newton_progress_check
 
bool fe_reinit_during_postprocess
 
Real numerical_jacobian_h
 
Real verify_analytic_jacobians
 
UniquePtr< TimeSolvertime_solver
 
Real deltat
 
bool postprocess_sides
 
bool print_solution_norms
 
bool print_solutions
 
bool print_residual_norms
 
bool print_residuals
 
bool print_jacobian_norms
 
bool print_jacobians
 
bool print_element_solutions
 
bool print_element_residuals
 
bool print_element_jacobians
 
SparseMatrix< Number > * matrix
 
bool zero_out_matrix_and_rhs
 
NumericVector< Number > * rhs
 
bool assemble_before_solve
 
bool use_fixed_solution
 
int extra_quadrature_order
 
UniquePtr< NumericVector< Number > > solution
 
UniquePtr< NumericVector< Number > > current_local_solution
 
Real time
 
std::vector< Numberqoi
 
bool compute_internal_sides
 
bool assemble_qoi_sides
 
bool assemble_qoi_internal_sides
 
bool assemble_qoi_elements
 

Protected Types

enum  RHS_Mode { Residual, G_Lambda }
 
typedef std::map< std::string, std::pair< unsigned int, unsigned int > > Counts
 

Protected Member Functions

virtual void init_data () libmesh_override
 
void add_second_order_dot_vars ()
 
void add_dot_var_dirichlet_bcs (unsigned int var_idx, unsigned int dot_var_idx)
 
virtual void init_matrices ()
 
void project_vector (NumericVector< Number > &, int is_adjoint=-1) const
 
void project_vector (const NumericVector< Number > &, NumericVector< Number > &, int is_adjoint=-1) const
 
void increment_constructor_count (const std::string &name)
 
void increment_destructor_count (const std::string &name)
 

Protected Attributes

RHS_Mode rhs_mode
 
DifferentiablePhysics_diff_physics
 
DifferentiableQoIdiff_qoi
 
const Parallel::Communicator_communicator
 
System_mesh_sys
 
unsigned int _mesh_x_var
 
unsigned int _mesh_y_var
 
unsigned int _mesh_z_var
 
std::vector< unsigned int > _time_evolving
 
std::set< unsigned int > _first_order_vars
 
std::set< unsigned int > _second_order_vars
 
std::map< unsigned int, unsigned int > _second_order_dot_vars
 

Static Protected Attributes

static Counts _counts
 
static Threads::atomic< unsigned int > _n_objects
 
static Threads::spin_mutex _mutex
 
static bool _enable_print_counter = true
 

Private Member Functions

void initialize_tangent ()
 
void solve_tangent ()
 
void update_solution ()
 
void set_Theta ()
 
void set_Theta_LOCA ()
 
void apply_predictor ()
 

Private Attributes

NumericVector< Number > * du_ds
 
NumericVector< Number > * previous_du_ds
 
NumericVector< Number > * previous_u
 
NumericVector< Number > * y
 
NumericVector< Number > * y_old
 
NumericVector< Number > * z
 
NumericVector< Number > * delta_u
 
UniquePtr< LinearSolver< Number > > linear_solver
 
bool tangent_initialized
 
NewtonSolvernewton_solver
 
Real dlambda_ds
 
Real ds
 
Real ds_current
 
Real previous_dlambda_ds
 
Real previous_ds
 
unsigned int newton_step
 

Detailed Description

This class inherits from the FEMSystem. It can be used to do arclength continuation. Most of the ideas and the notation here come from HB Keller's 1977 paper:

* @InProceedings{Kell-1977,
*   author    = {H.~B.~Keller},
*   title     = {{Numerical solution of bifurcation and nonlinear eigenvalue problems}},
*   booktitle = {Applications of Bifurcation Theory, P.~H.~Rabinowitz (ed.)},
*   year      = 1977,
*   publisher = {Academic Press},
*   pages     = {359--389},
*   notes     = {QA 3 U45 No.\ 38 (PMA)}
* }
* 
Author
John W. Peterson
Date
2007

Definition at line 55 of file continuation_system.h.

Member Typedef Documentation

typedef std::map<std::string, SparseMatrix<Number> *>::const_iterator libMesh::ImplicitSystem::const_matrices_iterator
inherited

Definition at line 281 of file implicit_system.h.

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

Definition at line 748 of file system.h.

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 110 of file reference_counter.h.

typedef std::map<std::string, SparseMatrix<Number> *>::iterator libMesh::ImplicitSystem::matrices_iterator
inherited

Matrix iterator typedefs.

Definition at line 280 of file implicit_system.h.

The type of the parent.

Definition at line 79 of file continuation_system.h.

The type of system.

Definition at line 74 of file continuation_system.h.

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

Syntax sugar to make numerical_jacobian() declaration easier.

Definition at line 206 of file fem_system.h.

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

Vector iterator typedefs.

Definition at line 747 of file system.h.

Member Enumeration Documentation

The code provides the ability to select from different predictor schemes for getting the initial guess for the solution at the next point on the solution arc.

Enumerator
Euler 

First-order Euler predictor

AB2 

Second-order explicit Adams-Bashforth predictor

Invalid_Predictor 

Invalid predictor

Definition at line 221 of file continuation_system.h.

There are (so far) two different vectors which may be assembled using the assembly routine: 1.) The Residual = the normal PDE weighted residual 2.) G_Lambda = the derivative wrt the parameter lambda of the PDE weighted residual

It is up to the derived class to handle writing separate assembly code for the different cases. Usually something like: switch (rhs_mode) { case Residual: { Fu(i) += ... // normal PDE residual break; }

case G_Lambda: { Fu(i) += ... // derivative wrt control parameter break; }

Enumerator
Residual 
G_Lambda 

Definition at line 286 of file continuation_system.h.

Constructor & Destructor Documentation

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

Constructor. Optionally initializes required data structures.

Definition at line 29 of file continuation_system.C.

References linear_solver, libMesh::System::name(), and libMesh::on_command_line().

31  :
32  Parent(es, name_in, number_in),
34  quiet(true),
36  solution_tolerance(1.e-6),
41  Theta(1.),
42  Theta_LOCA(1.),
45  ds_min(1.e-8),
51  tangent_initialized(false),
53  dlambda_ds(0.707),
54  ds(0.1),
55  ds_current(0.1),
57  previous_ds(0.),
58  newton_step(0)
59 {
60  // Warn about using untested code
61  libmesh_experimental();
62 
63  if (libMesh::on_command_line("--solver_system_names"))
64  linear_solver->init((this->name()+"_").c_str());
65  else
66  linear_solver->init();
67 }
UniquePtr< LinearSolver< Number > > linear_solver
static UniquePtr< LinearSolver< Number > > build(const libMesh::Parallel::Communicator &comm_in, const SolverPackage solver_package=libMesh::default_solver_package())
const class libmesh_nullptr_t libmesh_nullptr
const std::string & name() const
Definition: system.h:1987
bool on_command_line(const std::string &arg)
Definition: libmesh.C:914
libMesh::ContinuationSystem::~ContinuationSystem ( )
virtual

Destructor.

Definition at line 72 of file continuation_system.C.

References clear().

73 {
74  this->clear();
75 }
virtual void clear() libmesh_override

Member Function Documentation

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

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

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

void libMesh::System::activate ( )
inlineinherited

Activates the system. Only active systems are solved.

Definition at line 2043 of file system.h.

References libMesh::System::_active.

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

2044 {
2045  _active = true;
2046 }
bool libMesh::System::active ( ) const
inlineinherited
Returns
true if the system is active, false otherwise. An active system will be solved.

Definition at line 2035 of file system.h.

References libMesh::System::_active.

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

2036 {
2037  return _active;
2038 }
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 1035 of file system.C.

References libMesh::System::add_vector().

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

1036 {
1037  std::ostringstream adjoint_rhs_name;
1038  adjoint_rhs_name << "adjoint_rhs" << i;
1039 
1040  return this->add_vector(adjoint_rhs_name.str(), false);
1041 }
NumericVector< Number > & add_vector(const std::string &vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Definition: system.C:676
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 971 of file system.C.

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

Referenced by libMesh::ImplicitSystem::adjoint_solve(), and libMesh::System::project_solution_on_reinit().

972 {
973  std::ostringstream adjoint_name;
974  adjoint_name << "adjoint_solution" << i;
975 
976  NumericVector<Number> & returnval = this->add_vector(adjoint_name.str());
977  this->set_vector_as_adjoint(adjoint_name.str(), i);
978  return returnval;
979 }
void set_vector_as_adjoint(const std::string &vec_name, int qoi_num)
Definition: system.C:899
NumericVector< Number > & add_vector(const std::string &vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Definition: system.C:676
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 DirchletBoundary 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 226 of file diff_system.C.

References libMesh::DofMap::add_dirichlet_boundary(), libMesh::DirichletBoundary::b, libMesh::DirichletBoundary::f, libMesh::DirichletBoundary::f_fem, libMesh::DofMap::get_dirichlet_boundaries(), libMesh::System::get_dof_map(), libMesh::libmesh_assert(), and libMesh::DirichletBoundary::variables.

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

228 {
229  // We're assuming that there could be a lot more variables than
230  // boundary conditions, so we search each of the boundary conditions
231  // for this variable rather than looping over boundary conditions
232  // in a separate loop and searching through all the variables.
233  const DirichletBoundaries * all_dbcs =
235 
236  if( all_dbcs )
237  {
238  // We need to cache the DBCs to be added so that we add them
239  // after looping over the existing DBCs. Otherwise, we're polluting
240  // the thing we're looping over.
241  std::vector<DirichletBoundary*> new_dbcs;
242 
243  DirichletBoundaries::const_iterator dbc_it = all_dbcs->begin();
244  for( ; dbc_it != all_dbcs->end(); ++dbc_it )
245  {
246  libmesh_assert(*dbc_it);
247  DirichletBoundary & dbc = *(*dbc_it);
248 
249  // Look for second order variable in the current
250  // DirichletBoundary object
251  std::vector<unsigned int>::const_iterator dbc_var_it =
252  std::find( dbc.variables.begin(), dbc.variables.end(), var_idx );
253 
254  // If we found it, then we also need to add it's corresponding
255  // "dot" variable to a DirichletBoundary
256  std::vector<unsigned int> vars_to_add;
257  if( dbc_var_it != dbc.variables.end() )
258  vars_to_add.push_back(dot_var_idx);
259 
260  if( !vars_to_add.empty() )
261  {
262  // We need to check if the boundary condition is time-dependent.
263  // Currently, we cannot automatically differentiate w.r.t. time
264  // so if the user supplies a time-dependent Dirichlet BC, then
265  // we can't automatically support the Dirichlet BC for the
266  // "velocity" boundary condition, so we error. Otherwise,
267  // the "velocity boundary condition will just be zero.
268  bool is_time_evolving_bc = false;
269  if( dbc.f )
270  is_time_evolving_bc = dbc.f->is_time_dependent();
271  else if( dbc.f_fem )
272  // We it's a FEMFunctionBase object, it will be implictly
273  // time-dependent since it is assumed to depend on the solution.
274  is_time_evolving_bc = true;
275  else
276  libmesh_error_msg("Could not find valid boundary function!");
277 
278  if( is_time_evolving_bc )
279  libmesh_error_msg("Cannot currently support time-dependent Dirichlet BC for dot variables!");
280 
281 
282  DirichletBoundary * new_dbc;
283 
284  if( dbc.f )
285  {
286  ZeroFunction<Number> zf;
287 
288  new_dbc = new DirichletBoundary(dbc.b, vars_to_add, zf);
289  }
290  else
291  libmesh_error();
292 
293  new_dbcs.push_back(new_dbc);
294  }
295  }
296 
297  // Now add the new DBCs for the "dot" vars to the DofMap
298  std::vector<DirichletBoundary*>::iterator new_dbc_it =
299  new_dbcs.begin();
300 
301  for( ; new_dbc_it != new_dbcs.end(); ++new_dbc_it )
302  {
303  const DirichletBoundary & dbc = *(*new_dbc_it);
304  this->get_dof_map().add_dirichlet_boundary(dbc);
305  delete *new_dbc_it;
306  }
307 
308  } // if(all_dbcs)
309 }
libmesh_assert(j)
const DofMap & get_dof_map() const
Definition: system.h:2019
const DirichletBoundaries * get_dirichlet_boundaries() const
Definition: dof_map.h:1114
void add_dirichlet_boundary(const DirichletBoundary &dirichlet_boundary)
SparseMatrix< Number > & libMesh::ImplicitSystem::add_matrix ( const std::string &  mat_name)
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.

Definition at line 209 of file implicit_system.C.

References libMesh::ImplicitSystem::_can_add_matrices, libMesh::ImplicitSystem::_matrices, libMesh::SparseMatrix< T >::build(), libMesh::ParallelObject::comm(), and libMesh::ImplicitSystem::have_matrix().

Referenced by libMesh::ImplicitSystem::add_system_matrix(), libMesh::EigenTimeSolver::init(), and libMesh::NewmarkSystem::NewmarkSystem().

210 {
211  // only add matrices before initializing...
212  if (!_can_add_matrices)
213  libmesh_error_msg("ERROR: Too late. Cannot add matrices to the system after initialization"
214  << "\n any more. You should have done this earlier.");
215 
216  // Return the matrix if it is already there.
217  if (this->have_matrix(mat_name))
218  return *(_matrices[mat_name]);
219 
220  // Otherwise build the matrix and return it.
221  SparseMatrix<Number> * buf = SparseMatrix<Number>::build(this->comm()).release();
222  _matrices.insert (std::make_pair (mat_name, buf));
223 
224  return *buf;
225 }
static UniquePtr< SparseMatrix< T > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package())
std::map< std::string, SparseMatrix< Number > * > _matrices
bool have_matrix(const std::string &mat_name) const
const Parallel::Communicator & comm() const
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 196 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().

197 {
198  const std::set<unsigned int> & second_order_vars = this->get_second_order_vars();
199  if( !second_order_vars.empty() )
200  {
201  for( std::set<unsigned int>::const_iterator var_it = second_order_vars.begin();
202  var_it != second_order_vars.end(); ++var_it )
203  {
204  const Variable & var = this->variable(*var_it);
205  std::string new_var_name = std::string("dot_")+var.name();
206 
207  unsigned int v_var_idx;
208 
209  if( var.active_subdomains().empty() )
210  v_var_idx = this->add_variable( new_var_name, var.type() );
211  else
212  v_var_idx = this->add_variable( new_var_name, var.type(), &var.active_subdomains() );
213 
214  _second_order_dot_vars.insert( std::pair<unsigned int,unsigned int>(*var_it,v_var_idx) );
215 
216  // The new velocities are time evolving variables of first order
217  this->time_evolving( v_var_idx, 1 );
218 
219  // And if there are any boundary conditions set on the second order
220  // variable, we also need to set it on its velocity variable.
221  this->add_dot_var_dirichlet_bcs( *var_it, v_var_idx );
222  }
223  }
224 }
const std::set< unsigned int > & get_second_order_vars() const
Definition: diff_physics.h:528
unsigned int add_variable(const std::string &var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=libmesh_nullptr)
Definition: system.C:1095
void add_dot_var_dirichlet_bcs(unsigned int var_idx, unsigned int dot_var_idx)
Definition: diff_system.C:226
std::map< unsigned int, unsigned int > _second_order_dot_vars
Definition: diff_physics.h:569
const Variable & variable(unsigned int var) const
Definition: system.h:2103
virtual void time_evolving(unsigned int var)
Definition: diff_physics.h:248
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 1065 of file system.C.

References libMesh::System::add_vector().

Referenced by libMesh::ImplicitSystem::assemble_residual_derivatives(), and libMesh::System::project_solution_on_reinit().

1066 {
1067  std::ostringstream sensitivity_rhs_name;
1068  sensitivity_rhs_name << "sensitivity_rhs" << i;
1069 
1070  return this->add_vector(sensitivity_rhs_name.str(), false);
1071 }
NumericVector< Number > & add_vector(const std::string &vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Definition: system.C:676
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 920 of file system.C.

References libMesh::System::add_vector().

Referenced by libMesh::System::project_solution_on_reinit(), and libMesh::ImplicitSystem::sensitivity_solve().

921 {
922  std::ostringstream sensitivity_name;
923  sensitivity_name << "sensitivity_solution" << i;
924 
925  return this->add_vector(sensitivity_name.str());
926 }
NumericVector< Number > & add_vector(const std::string &vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Definition: system.C:676
unsigned int libMesh::System::add_variable ( const std::string &  var,
const FEType type,
const std::set< subdomain_id_type > *const  active_subdomains = libmesh_nullptr 
)
inherited

Adds the variable var to the list of variables for this system. Returns the index number for the new variable.

Definition at line 1095 of file system.C.

References libMesh::System::_variable_groups, libMesh::System::_variable_numbers, libMesh::System::_variables, libMesh::System::add_variables(), libMesh::VariableGroup::append(), libMesh::System::identify_variable_groups(), libMesh::System::is_initialized(), libMesh::libmesh_assert(), libmesh_nullptr, libMesh::System::n_variable_groups(), libMesh::System::n_vars(), libMesh::System::number(), libMesh::System::variable_name(), and libMesh::System::variable_type().

Referenced by libMesh::DifferentiableSystem::add_second_order_dot_vars(), libMesh::System::add_variable(), libMesh::ErrorVector::plot_error(), and libMesh::System::project_solution_on_reinit().

1098 {
1099  libmesh_assert(!this->is_initialized());
1100 
1101  // Make sure the variable isn't there already
1102  // or if it is, that it's the type we want
1103  for (unsigned int v=0; v<this->n_vars(); v++)
1104  if (this->variable_name(v) == var)
1105  {
1106  if (this->variable_type(v) == type)
1107  return _variables[v].number();
1108 
1109  libmesh_error_msg("ERROR: incompatible variable " << var << " has already been added for this system!");
1110  }
1111 
1112  // Optimize for VariableGroups here - if the user is adding multiple
1113  // variables of the same FEType and subdomain restriction, catch
1114  // that here and add them as members of the same VariableGroup.
1115  //
1116  // start by setting this flag to whatever the user has requested
1117  // and then consider the conditions which should negate it.
1118  bool should_be_in_vg = this->identify_variable_groups();
1119 
1120  // No variable groups, nothing to add to
1121  if (!this->n_variable_groups())
1122  should_be_in_vg = false;
1123 
1124  else
1125  {
1126  VariableGroup & vg(_variable_groups.back());
1127 
1128  // get a pointer to their subdomain restriction, if any.
1129  const std::set<subdomain_id_type> * const
1130  their_active_subdomains (vg.implicitly_active() ?
1131  libmesh_nullptr : &vg.active_subdomains());
1132 
1133  // Different types?
1134  if (vg.type() != type)
1135  should_be_in_vg = false;
1136 
1137  // they are restricted, we aren't?
1138  if (their_active_subdomains && !active_subdomains)
1139  should_be_in_vg = false;
1140 
1141  // they aren't restriced, we are?
1142  if (!their_active_subdomains && active_subdomains)
1143  should_be_in_vg = false;
1144 
1145  if (their_active_subdomains && active_subdomains)
1146  // restricted to different sets?
1147  if (*their_active_subdomains != *active_subdomains)
1148  should_be_in_vg = false;
1149 
1150  // OK, after all that, append the variable to the vg if none of the conditions
1151  // were violated
1152  if (should_be_in_vg)
1153  {
1154  const unsigned short curr_n_vars = cast_int<unsigned short>
1155  (this->n_vars());
1156 
1157  vg.append (var);
1158 
1159  _variables.push_back(vg(vg.n_variables()-1));
1160  _variable_numbers[var] = curr_n_vars;
1161  return curr_n_vars;
1162  }
1163  }
1164 
1165  // otherwise, fall back to adding a single variable group
1166  return this->add_variables (std::vector<std::string>(1, var),
1167  type,
1168  active_subdomains);
1169 }
std::map< std::string, unsigned short int > _variable_numbers
Definition: system.h:1892
const std::string & variable_name(const unsigned int i) const
Definition: system.h:2123
const class libmesh_nullptr_t libmesh_nullptr
std::vector< Variable > _variables
Definition: system.h:1881
const FEType & variable_type(const unsigned int i) const
Definition: system.h:2153
libmesh_assert(j)
unsigned int n_variable_groups() const
Definition: system.h:2083
std::vector< VariableGroup > _variable_groups
Definition: system.h:1886
bool is_initialized()
Definition: system.h:2059
bool identify_variable_groups() const
Definition: system.h:2171
unsigned int number() const
Definition: system.h:1995
unsigned int add_variables(const std::vector< std::string > &vars, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=libmesh_nullptr)
Definition: system.C:1185
unsigned int n_vars() const
Definition: system.h:2075
unsigned int libMesh::System::add_variable ( const std::string &  var,
const Order  order = FIRST,
const FEFamily  family = LAGRANGE,
const std::set< subdomain_id_type > *const  active_subdomains = libmesh_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.

Definition at line 1173 of file system.C.

References libMesh::System::add_variable().

1177 {
1178  return this->add_variable(var,
1179  FEType(order, family),
1180  active_subdomains);
1181 }
unsigned int add_variable(const std::string &var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=libmesh_nullptr)
Definition: system.C:1095
unsigned int libMesh::System::add_variables ( const std::vector< std::string > &  vars,
const FEType type,
const std::set< subdomain_id_type > *const  active_subdomains = libmesh_nullptr 
)
inherited

Adds the variable var to the list of variables for this system. Returns the index number for the new variable.

Definition at line 1185 of file system.C.

References libMesh::System::_variable_groups, libMesh::System::_variable_numbers, libMesh::System::_variables, libMesh::System::is_initialized(), libMesh::libmesh_assert(), libmesh_nullptr, libMesh::System::n_components(), libMesh::System::n_vars(), libMesh::System::number(), libMesh::System::variable_name(), and libMesh::System::variable_type().

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

1188 {
1189  libmesh_assert(!this->is_initialized());
1190 
1191  // Make sure the variable isn't there already
1192  // or if it is, that it's the type we want
1193  for (std::size_t ov=0; ov<vars.size(); ov++)
1194  for (unsigned int v=0; v<this->n_vars(); v++)
1195  if (this->variable_name(v) == vars[ov])
1196  {
1197  if (this->variable_type(v) == type)
1198  return _variables[v].number();
1199 
1200  libmesh_error_msg("ERROR: incompatible variable " << vars[ov] << " has already been added for this system!");
1201  }
1202 
1203  const unsigned short curr_n_vars = cast_int<unsigned short>
1204  (this->n_vars());
1205 
1206  const unsigned int next_first_component = this->n_components();
1207 
1208  // Add the variable group to the list
1209  _variable_groups.push_back((active_subdomains == libmesh_nullptr) ?
1210  VariableGroup(this, vars, curr_n_vars,
1211  next_first_component, type) :
1212  VariableGroup(this, vars, curr_n_vars,
1213  next_first_component, type, *active_subdomains));
1214 
1215  const VariableGroup & vg (_variable_groups.back());
1216 
1217  // Add each component of the group individually
1218  for (std::size_t v=0; v<vars.size(); v++)
1219  {
1220  _variables.push_back (vg(v));
1221  _variable_numbers[vars[v]] = cast_int<unsigned short>
1222  (curr_n_vars+v);
1223  }
1224 
1225  libmesh_assert_equal_to ((curr_n_vars+vars.size()), this->n_vars());
1226 
1227  // BSK - Defer this now to System::init_data() so we can detect
1228  // VariableGroups 12/28/2012
1229  // // Add the variable group to the _dof_map
1230  // _dof_map->add_variable_group (vg);
1231 
1232  // Return the number of the new variable
1233  return cast_int<unsigned int>(curr_n_vars+vars.size()-1);
1234 }
std::map< std::string, unsigned short int > _variable_numbers
Definition: system.h:1892
const std::string & variable_name(const unsigned int i) const
Definition: system.h:2123
const class libmesh_nullptr_t libmesh_nullptr
std::vector< Variable > _variables
Definition: system.h:1881
const FEType & variable_type(const unsigned int i) const
Definition: system.h:2153
libmesh_assert(j)
unsigned int n_components() const
Definition: system.h:2091
std::vector< VariableGroup > _variable_groups
Definition: system.h:1886
bool is_initialized()
Definition: system.h:2059
unsigned int number() const
Definition: system.h:1995
unsigned int n_vars() const
Definition: system.h:2075
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 = libmesh_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.

Definition at line 1238 of file system.C.

References libMesh::System::add_variables().

1242 {
1243  return this->add_variables(vars,
1244  FEType(order, family),
1245  active_subdomains);
1246 }
unsigned int add_variables(const std::vector< std::string > &vars, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=libmesh_nullptr)
Definition: system.C:1185
NumericVector< Number > & libMesh::System::add_vector ( const std::string &  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 inititialized 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

Definition at line 676 of file system.C.

References libMesh::System::_dof_map, libMesh::System::_is_initialized, libMesh::System::_vector_is_adjoint, libMesh::System::_vector_projections, libMesh::System::_vector_types, libMesh::System::_vectors, libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), libMesh::GHOSTED, libMesh::System::have_vector(), libMesh::NumericVector< T >::init(), libMesh::System::n_dofs(), and libMesh::System::n_local_dofs().

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(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::SecondOrderUnsteadySolver::init(), libMesh::UnsteadySolver::init(), libMesh::OptimizationSystem::init_data(), init_data(), libMesh::NewmarkSystem::NewmarkSystem(), libMesh::FrequencySystem::set_frequencies(), libMesh::FrequencySystem::set_frequencies_by_range(), and libMesh::FrequencySystem::set_frequencies_by_steps().

679 {
680  // Return the vector if it is already there.
681  if (this->have_vector(vec_name))
682  return *(_vectors[vec_name]);
683 
684  // Otherwise build the vector
685  NumericVector<Number> * buf = NumericVector<Number>::build(this->comm()).release();
686  _vectors.insert (std::make_pair (vec_name, buf));
687  _vector_projections.insert (std::make_pair (vec_name, projections));
688 
689  _vector_types.insert (std::make_pair (vec_name, type));
690 
691  // Vectors are primal by default
692  _vector_is_adjoint.insert (std::make_pair (vec_name, -1));
693 
694  // Initialize it if necessary
695  if (_is_initialized)
696  {
697  if(type == GHOSTED)
698  {
699 #ifdef LIBMESH_ENABLE_GHOSTED
700  buf->init (this->n_dofs(), this->n_local_dofs(),
701  _dof_map->get_send_list(), false,
702  GHOSTED);
703 #else
704  libmesh_error_msg("Cannot initialize ghosted vectors when they are not enabled.");
705 #endif
706  }
707  else
708  buf->init (this->n_dofs(), this->n_local_dofs(), false, type);
709  }
710 
711  return *buf;
712 }
std::map< std::string, ParallelType > _vector_types
Definition: system.h:1922
bool _is_initialized
Definition: system.h:1941
UniquePtr< DofMap > _dof_map
Definition: system.h:1854
static UniquePtr< NumericVector< T > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package())
bool have_vector(const std::string &vec_name) const
Definition: system.h:2195
std::map< std::string, int > _vector_is_adjoint
Definition: system.h:1917
dof_id_type n_local_dofs() const
Definition: system.C:180
std::map< std::string, NumericVector< Number > * > _vectors
Definition: system.h:1905
const Parallel::Communicator & comm() const
std::map< std::string, bool > _vector_projections
Definition: system.h:1911
dof_id_type n_dofs() const
Definition: system.C:143
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 1003 of file system.C.

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

Referenced by libMesh::System::project_solution_on_reinit(), and libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve().

1004 {
1005  std::ostringstream adjoint_name;
1006  adjoint_name << "weighted_sensitivity_adjoint_solution" << i;
1007 
1008  NumericVector<Number> & returnval = this->add_vector(adjoint_name.str());
1009  this->set_vector_as_adjoint(adjoint_name.str(), i);
1010  return returnval;
1011 }
void set_vector_as_adjoint(const std::string &vec_name, int qoi_num)
Definition: system.C:899
NumericVector< Number > & add_vector(const std::string &vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Definition: system.C:676
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 950 of file system.C.

References libMesh::System::add_vector().

Referenced by libMesh::System::project_solution_on_reinit(), and libMesh::ImplicitSystem::weighted_sensitivity_solve().

951 {
952  return this->add_vector("weighted_sensitivity_solution");
953 }
NumericVector< Number > & add_vector(const std::string &vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Definition: system.C:676
void libMesh::ImplicitSystem::adjoint_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].

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 693 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_sensitivity_rhs(), libMesh::QoISet::has_index(), libMesh::System::is_adjoint_already_solved(), std::max(), libMesh::System::qoi, libMesh::Real, libMesh::ParameterVector::size(), and libMesh::TOLERANCE.

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

696 {
697  ParameterVector & parameters =
698  const_cast<ParameterVector &>(parameters_in);
699 
700  const unsigned int Np = cast_int<unsigned int>
701  (parameters.size());
702  const unsigned int Nq = cast_int<unsigned int>
703  (qoi.size());
704 
705  // An introduction to the problem:
706  //
707  // Residual R(u(p),p) = 0
708  // partial R / partial u = J = system matrix
709  //
710  // This implies that:
711  // d/dp(R) = 0
712  // (partial R / partial p) +
713  // (partial R / partial u) * (partial u / partial p) = 0
714 
715  // We first do an adjoint solve:
716  // J^T * z = (partial q / partial u)
717  // if we havent already or dont have an initial condition for the adjoint
718  if (!this->is_adjoint_already_solved())
719  {
720  this->adjoint_solve(qoi_indices);
721  }
722 
723  this->assemble_residual_derivatives(parameters_in);
724 
725  // Get ready to fill in senstivities:
726  sensitivities.allocate_data(qoi_indices, *this, parameters);
727 
728  // We use the identities:
729  // dq/dp = (partial q / partial p) + (partial q / partial u) *
730  // (partial u / partial p)
731  // dq/dp = (partial q / partial p) + (J^T * z) *
732  // (partial u / partial p)
733  // dq/dp = (partial q / partial p) + z * J *
734  // (partial u / partial p)
735 
736  // Leading to our final formula:
737  // dq/dp = (partial q / partial p) - z * (partial R / partial p)
738 
739  // In the case of adjoints with heterogenous Dirichlet boundary
740  // function phi, where
741  // q := S(u) - R(u,phi)
742  // the final formula works out to:
743  // dq/dp = (partial S / partial p) - z * (partial R / partial p)
744  // Because we currently have no direct access to
745  // (partial S / partial p), we use the identity
746  // (partial S / partial p) = (partial q / partial p) +
747  // phi * (partial R / partial p)
748  // to derive an equivalent equation:
749  // dq/dp = (partial q / partial p) - (z-phi) * (partial R / partial p)
750 
751  // Since z-phi degrees of freedom are zero for constrained indices,
752  // we can use the same constrained -(partial R / partial p) that we
753  // use for forward sensitivity solves, taking into account the
754  // differing sign convention.
755  //
756  // Since that vector is constrained, its constrained indices are
757  // zero, so its product with phi is zero, so we can neglect the
758  // evaluation of phi terms.
759 
760  for (unsigned int j=0; j != Np; ++j)
761  {
762  // We currently get partial derivatives via central differencing
763 
764  // (partial q / partial p) ~= (q(p+dp)-q(p-dp))/(2*dp)
765  // (partial R / partial p) ~= (rhs(p+dp) - rhs(p-dp))/(2*dp)
766 
767  Number old_parameter = *parameters[j];
768 
769  const Real delta_p =
770  TOLERANCE * std::max(std::abs(old_parameter), 1e-3);
771 
772  *parameters[j] = old_parameter - delta_p;
773  this->assemble_qoi(qoi_indices);
774  std::vector<Number> qoi_minus = this->qoi;
775 
776  NumericVector<Number> & neg_partialR_partialp = this->get_sensitivity_rhs(j);
777 
778  *parameters[j] = old_parameter + delta_p;
779  this->assemble_qoi(qoi_indices);
780  std::vector<Number> & qoi_plus = this->qoi;
781 
782  std::vector<Number> partialq_partialp(Nq, 0);
783  for (unsigned int i=0; i != Nq; ++i)
784  if (qoi_indices.has_index(i))
785  partialq_partialp[i] = (qoi_plus[i] - qoi_minus[i]) / (2.*delta_p);
786 
787  // Don't leave the parameter changed
788  *parameters[j] = old_parameter;
789 
790  for (unsigned int i=0; i != Nq; ++i)
791  if (qoi_indices.has_index(i))
792  sensitivities[i][j] = partialq_partialp[i] +
793  neg_partialR_partialp.dot(this->get_adjoint_solution(i));
794  }
795 
796  // All parameters have been reset.
797  // Reset the original qoi.
798 
799  this->assemble_qoi(qoi_indices);
800 }
double abs(double a)
virtual std::pair< unsigned int, Real > adjoint_solve(const QoISet &qoi_indices=QoISet()) libmesh_override
NumericVector< Number > & get_sensitivity_rhs(unsigned int i=0)
Definition: system.C:1075
static const Real TOLERANCE
long double max(long double a, double b)
std::vector< Number > qoi
Definition: system.h:1543
bool is_adjoint_already_solved() const
Definition: system.h:371
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual void assemble_qoi(const QoISet &qoi_indices=QoISet()) libmesh_override
virtual void assemble_residual_derivatives(const ParameterVector &parameters) libmesh_override
std::pair< unsigned int, Real > libMesh::DifferentiableSystem::adjoint_solve ( const QoISet qoi_indices = QoISet())
virtualinherited

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 162 of file diff_system.C.

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

163 {
164  // Get the time solver object associated with the system, and tell it that
165  // we are solving the adjoint problem
166  this->get_time_solver().set_is_adjoint(true);
167 
168  return this->ImplicitSystem::adjoint_solve(qoi_indices);
169 }
virtual std::pair< unsigned int, Real > adjoint_solve(const QoISet &qoi_indices=QoISet()) libmesh_override
void set_is_adjoint(bool _is_adjoint_value)
Definition: time_solver.h:238
TimeSolver & get_time_solver()
Definition: diff_system.h:391
void libMesh::ContinuationSystem::advance_arcstep ( )

Call this function after a continuation solve to compute the tangent and get the next initial guess.

Definition at line 936 of file continuation_system.C.

References solve_tangent(), and update_solution().

937 {
938  // Solve for the updated tangent du1/ds, d(lambda1)/ds
939  solve_tangent();
940 
941  // Advance the solution and the parameter to the next value.
942  update_solution();
943 }
void libMesh::ContinuationSystem::apply_predictor ( )
private

Applies the predictor to the current solution to get a guess for the next solution.

Definition at line 1375 of file continuation_system.C.

References AB2, continuation_parameter, dlambda_ds, ds_current, du_ds, Euler, predictor, previous_dlambda_ds, previous_ds, previous_du_ds, libMesh::Real, and libMesh::System::solution.

Referenced by continuation_solve(), and update_solution().

1376 {
1377  if (predictor == Euler)
1378  {
1379  // 1.) Euler Predictor
1380  // Predict next the solution
1381  solution->add(ds_current, *du_ds);
1382  solution->close();
1383 
1384  // Predict next parameter value
1386  }
1387 
1388 
1389  else if (predictor == AB2)
1390  {
1391  // 2.) 2nd-order explicit AB predictor
1392  libmesh_assert_not_equal_to (previous_ds, 0.0);
1393  const Real stepratio = ds_current/previous_ds;
1394 
1395  // Build up next solution value.
1396  solution->add( 0.5*ds_current*(2.+stepratio), *du_ds);
1397  solution->add(-0.5*ds_current*stepratio , *previous_du_ds);
1398  solution->close();
1399 
1400  // Next parameter value
1402  0.5*ds_current*((2.+stepratio)*dlambda_ds -
1403  stepratio*previous_dlambda_ds);
1404  }
1405 
1406  else
1407  libmesh_error_msg("Unknown predictor!");
1408 }
NumericVector< Number > * previous_du_ds
NumericVector< Number > * du_ds
UniquePtr< NumericVector< Number > > solution
Definition: system.h:1512
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void libMesh::DifferentiableSystem::assemble ( )
virtualinherited

Prepares matrix and rhs for matrix assembly. Users should not reimplement this

Reimplemented from libMesh::ImplicitSystem.

Definition at line 143 of file diff_system.C.

References libMesh::DifferentiableSystem::assembly().

144 {
145  this->assembly(true, true);
146 }
virtual void assembly(bool get_residual, bool get_jacobian, bool apply_heterogeneous_constraints=false) libmesh_override=0
void libMesh::FEMSystem::assemble_qoi ( const QoISet indices = QoISet())
virtualinherited

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 1119 of file fem_system.C.

References libMesh::MeshBase::active_local_elements_begin(), libMesh::MeshBase::active_local_elements_end(), libMesh::ParallelObject::comm(), libMesh::DifferentiableSystem::diff_qoi, libMesh::System::get_mesh(), libMesh::QoISet::has_index(), mesh, libMesh::DifferentiableQoI::parallel_op(), libMesh::Threads::parallel_reduce(), libMesh::System::qoi, libMesh::StoredRange< iterator_type, object_type >::reset(), and libMesh::System::update().

1120 {
1121  LOG_SCOPE("assemble_qoi()", "FEMSystem");
1122 
1123  const MeshBase & mesh = this->get_mesh();
1124 
1125  this->update();
1126 
1127  const unsigned int Nq = cast_int<unsigned int>(qoi.size());
1128 
1129  // the quantity of interest is assumed to be a sum of element and
1130  // side terms
1131  for (unsigned int i=0; i != Nq; ++i)
1132  if (qoi_indices.has_index(i))
1133  qoi[i] = 0;
1134 
1135  // Create a non-temporary qoi_contributions object, so we can query
1136  // its results after the reduction
1137  QoIContributions qoi_contributions(*this, *(this->diff_qoi), qoi_indices);
1138 
1139  // Loop over every active mesh element on this processor
1140  Threads::parallel_reduce(elem_range.reset(mesh.active_local_elements_begin(),
1141  mesh.active_local_elements_end()),
1142  qoi_contributions);
1143 
1144  this->diff_qoi->parallel_op( this->comm(), this->qoi, qoi_contributions.qoi, qoi_indices );
1145 }
MeshBase & mesh
Base class for Mesh.
Definition: mesh_base.h:67
DifferentiableQoI * diff_qoi
Definition: diff_system.h:354
virtual void parallel_op(const Parallel::Communicator &communicator, std::vector< Number > &sys_qoi, std::vector< Number > &local_qoi, const QoISet &qoi_indices)
const MeshBase & get_mesh() const
Definition: system.h:2003
std::vector< Number > qoi
Definition: system.h:1543
virtual element_iterator active_local_elements_begin()=0
virtual void update()
Definition: system.C:420
const Parallel::Communicator & comm() const
void parallel_reduce(const Range &range, Body &body)
Definition: threads_none.h:101
virtual element_iterator active_local_elements_end()=0
void libMesh::FEMSystem::assemble_qoi_derivative ( const QoISet qoi_indices = QoISet(),
bool  include_liftfunc = true,
bool  apply_constraints = true 
)
virtualinherited

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 1149 of file fem_system.C.

References libMesh::MeshBase::active_local_elements_begin(), libMesh::MeshBase::active_local_elements_end(), libMesh::System::add_adjoint_rhs(), libMesh::DifferentiableSystem::diff_qoi, libMesh::System::get_mesh(), libMesh::QoISet::has_index(), mesh, libMesh::Threads::parallel_for(), libMesh::System::qoi, libMesh::StoredRange< iterator_type, object_type >::reset(), libMesh::System::update(), and libMesh::NumericVector< T >::zero().

1152 {
1153  LOG_SCOPE("assemble_qoi_derivative()", "FEMSystem");
1154 
1155  const MeshBase & mesh = this->get_mesh();
1156 
1157  this->update();
1158 
1159  // The quantity of interest derivative assembly accumulates on
1160  // initially zero vectors
1161  for (std::size_t i=0; i != qoi.size(); ++i)
1162  if (qoi_indices.has_index(i))
1163  this->add_adjoint_rhs(i).zero();
1164 
1165  // Loop over every active mesh element on this processor
1166  Threads::parallel_for(elem_range.reset(mesh.active_local_elements_begin(),
1167  mesh.active_local_elements_end()),
1168  QoIDerivativeContributions(*this, qoi_indices,
1169  *(this->diff_qoi),
1170  include_liftfunc,
1171  apply_constraints));
1172 }
void parallel_for(const Range &range, const Body &body)
Definition: threads_none.h:73
MeshBase & mesh
Base class for Mesh.
Definition: mesh_base.h:67
virtual void zero()=0
DifferentiableQoI * diff_qoi
Definition: diff_system.h:354
const MeshBase & get_mesh() const
Definition: system.h:2003
std::vector< Number > qoi
Definition: system.h:1543
virtual element_iterator active_local_elements_begin()=0
NumericVector< Number > & add_adjoint_rhs(unsigned int i=0)
Definition: system.C:1035
virtual void update()
Definition: system.C:420
virtual element_iterator active_local_elements_end()=0
bool has_index(unsigned int) const
Definition: qoi_set.h:221
void libMesh::ImplicitSystem::assemble_residual_derivatives ( const ParameterVector parameters)
virtualinherited

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 overloaded in derived classes.

Reimplemented from libMesh::System.

Definition at line 650 of file implicit_system.C.

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

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

651 {
652  ParameterVector & parameters =
653  const_cast<ParameterVector &>(parameters_in);
654 
655  const unsigned int Np = cast_int<unsigned int>
656  (parameters.size());
657 
658  for (unsigned int p=0; p != Np; ++p)
659  {
660  NumericVector<Number> & sensitivity_rhs = this->add_sensitivity_rhs(p);
661 
662  // Approximate -(partial R / partial p) by
663  // (R(p-dp) - R(p+dp)) / (2*dp)
664 
665  Number old_parameter = *parameters[p];
666 
667  const Real delta_p =
668  TOLERANCE * std::max(std::abs(old_parameter), 1e-3);
669 
670  *parameters[p] -= delta_p;
671 
672  // this->assembly(true, false, true);
673  this->assembly(true, false, false);
674  this->rhs->close();
675  sensitivity_rhs = *this->rhs;
676 
677  *parameters[p] = old_parameter + delta_p;
678 
679  // this->assembly(true, false, true);
680  this->assembly(true, false, false);
681  this->rhs->close();
682 
683  sensitivity_rhs -= *this->rhs;
684  sensitivity_rhs /= (2*delta_p);
685  sensitivity_rhs.close();
686 
687  *parameters[p] = old_parameter;
688  }
689 }
double abs(double a)
NumericVector< Number > * rhs
NumericVector< Number > & add_sensitivity_rhs(unsigned int i=0)
Definition: system.C:1065
static const Real TOLERANCE
long double max(long double a, double b)
virtual void close()=0
virtual void assembly(bool, bool, bool=false)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void libMesh::FEMSystem::assembly ( bool  get_residual,
bool  get_jacobian,
bool  apply_heterogeneous_constraints = false 
)
virtualinherited

Prepares matrix or rhs for matrix assembly. Users may reimplement this to add pre- or post-assembly code before or after calling FEMSystem::assembly()

Implements libMesh::DifferentiableSystem.

Definition at line 845 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_nullptr, libMesh::ImplicitSystem::matrix, std::max(), 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::update(), libMesh::System::variable_group(), libMesh::FEMSystem::verify_analytic_jacobians, libMesh::DenseMatrix< T >::zero(), libMesh::NumericVector< T >::zero(), and libMesh::SparseMatrix< T >::zero().

Referenced by continuation_solve(), and solve_tangent().

847 {
848  libmesh_assert(get_residual || get_jacobian);
849  std::string log_name;
850  if (get_residual && get_jacobian)
851  log_name = "assembly()";
852  else if (get_residual)
853  log_name = "assembly(get_residual)";
854  else
855  log_name = "assembly(get_jacobian)";
856 
857  LOG_SCOPE(log_name.c_str(), "FEMSystem");
858 
859  const MeshBase & mesh = this->get_mesh();
860 
861  // this->get_vector("_nonlinear_solution").localize
862  // (*current_local_nonlinear_solution,
863  // dof_map.get_send_list());
864  this->update();
865 
867  {
868  // this->get_vector("_nonlinear_solution").close();
869  this->solution->close();
870 
871  std::streamsize old_precision = libMesh::out.precision();
873  libMesh::out << "|U| = "
874  // << this->get_vector("_nonlinear_solution").l1_norm()
875  << this->solution->l1_norm()
876  << std::endl;
877  libMesh::out.precision(old_precision);
878  }
879  if (print_solutions)
880  {
881  std::streamsize old_precision = libMesh::out.precision();
883  // libMesh::out << "U = [" << this->get_vector("_nonlinear_solution")
884  libMesh::out << "U = [" << *(this->solution)
885  << "];" << std::endl;
886  libMesh::out.precision(old_precision);
887  }
888 
889  // Is this definitely necessary? [RHS]
890  // Yes. [RHS 2012]
891  if (get_jacobian)
892  matrix->zero();
893  if (get_residual)
894  rhs->zero();
895 
896  // Stupid C++ lets you set *Real* verify_analytic_jacobians = true!
897  if (verify_analytic_jacobians > 0.5)
898  {
899  libMesh::err << "WARNING! verify_analytic_jacobians was set "
900  << "to absurdly large value of "
901  << verify_analytic_jacobians << std::endl;
902  libMesh::err << "Resetting to 1e-6!" << std::endl;
904  }
905 
906  // In time-dependent problems, the nonlinear function we're trying
907  // to solve at each timestep may depend on the particular solver
908  // we're using
910 
911  // Build the residual and jacobian contributions on every active
912  // mesh element on this processor
914  (elem_range.reset(mesh.active_local_elements_begin(),
915  mesh.active_local_elements_end()),
916  AssemblyContributions(*this, get_residual, get_jacobian,
917  apply_heterogeneous_constraints));
918 
919  // Check and see if we have SCALAR variables
920  bool have_scalar = false;
921  for(unsigned int i=0; i != this->n_variable_groups(); ++i)
922  {
923  if( this->variable_group(i).type().family == SCALAR )
924  {
925  have_scalar = true;
926  break;
927  }
928  }
929 
930  // SCALAR dofs are stored on the last processor, so we'll evaluate
931  // their equation terms there and only if we have a SCALAR variable
932  if ( this->processor_id() == (this->n_processors()-1) && have_scalar )
933  {
935  FEMContext & _femcontext = cast_ref<FEMContext &>(*con);
936  this->init_context(_femcontext);
937  _femcontext.pre_fe_reinit(*this, libmesh_nullptr);
938 
939  bool jacobian_computed =
940  this->time_solver->nonlocal_residual(get_jacobian, _femcontext);
941 
942  // Nonlocal residuals are likely to be length 0, in which case we
943  // don't need to do any more. And we shouldn't try to do any
944  // more; lots of DenseVector/DenseMatrix code assumes rank>0.
945  if (_femcontext.get_elem_residual().size())
946  {
947  // Compute a numeric jacobian if we have to
948  if (get_jacobian && !jacobian_computed)
949  {
950  // Make sure we didn't compute a jacobian and lie about it
951  libmesh_assert_equal_to (_femcontext.get_elem_jacobian().l1_norm(), 0.0);
952  // Logging of numerical jacobians is done separately
953  this->numerical_nonlocal_jacobian(_femcontext);
954  }
955 
956  // Compute a numeric jacobian if we're asked to verify the
957  // analytic jacobian we got
958  if (get_jacobian && jacobian_computed &&
959  this->verify_analytic_jacobians != 0.0)
960  {
961  DenseMatrix<Number> analytic_jacobian(_femcontext.get_elem_jacobian());
962 
963  _femcontext.get_elem_jacobian().zero();
964  // Logging of numerical jacobians is done separately
965  this->numerical_nonlocal_jacobian(_femcontext);
966 
967  Real analytic_norm = analytic_jacobian.l1_norm();
968  Real numerical_norm = _femcontext.get_elem_jacobian().l1_norm();
969 
970  // If we can continue, we'll probably prefer the analytic jacobian
971  analytic_jacobian.swap(_femcontext.get_elem_jacobian());
972 
973  // The matrix "analytic_jacobian" will now hold the error matrix
974  analytic_jacobian.add(-1.0, _femcontext.get_elem_jacobian());
975  Real error_norm = analytic_jacobian.l1_norm();
976 
977  Real relative_error = error_norm /
978  std::max(analytic_norm, numerical_norm);
979 
980  if (relative_error > this->verify_analytic_jacobians)
981  {
982  libMesh::err << "Relative error " << relative_error
983  << " detected in analytic jacobian on nonlocal dofs!"
984  << std::endl;
985 
986  std::streamsize old_precision = libMesh::out.precision();
988  libMesh::out << "J_analytic nonlocal = "
989  << _femcontext.get_elem_jacobian() << std::endl;
990  analytic_jacobian.add(1.0, _femcontext.get_elem_jacobian());
991  libMesh::out << "J_numeric nonlocal = "
992  << analytic_jacobian << std::endl;
993 
994  libMesh::out.precision(old_precision);
995 
996  libmesh_error_msg("Relative error too large, exiting!");
997  }
998  }
999 
1000  add_element_system
1001  (*this, get_residual, get_jacobian,
1002  apply_heterogeneous_constraints, _femcontext);
1003  }
1004  }
1005 
1006  if (get_residual && (print_residual_norms || print_residuals))
1007  this->rhs->close();
1008  if (get_residual && print_residual_norms)
1009  {
1010  std::streamsize old_precision = libMesh::out.precision();
1011  libMesh::out.precision(16);
1012  libMesh::out << "|F| = " << this->rhs->l1_norm() << std::endl;
1013  libMesh::out.precision(old_precision);
1014  }
1015  if (get_residual && print_residuals)
1016  {
1017  std::streamsize old_precision = libMesh::out.precision();
1018  libMesh::out.precision(16);
1019  libMesh::out << "F = [" << *(this->rhs) << "];" << std::endl;
1020  libMesh::out.precision(old_precision);
1021  }
1022 
1023  if (get_jacobian && (print_jacobian_norms || print_jacobians))
1024  this->matrix->close();
1025  if (get_jacobian && print_jacobian_norms)
1026  {
1027  std::streamsize old_precision = libMesh::out.precision();
1028  libMesh::out.precision(16);
1029  libMesh::out << "|J| = " << this->matrix->l1_norm() << std::endl;
1030  libMesh::out.precision(old_precision);
1031  }
1032  if (get_jacobian && print_jacobians)
1033  {
1034  std::streamsize old_precision = libMesh::out.precision();
1035  libMesh::out.precision(16);
1036  libMesh::out << "J = [" << *(this->matrix) << "];" << std::endl;
1037  libMesh::out.precision(old_precision);
1038  }
1039 }
FEFamily family
Definition: fe_type.h:206
const FEType & type() const
Definition: variable.h:119
UniquePtr< TimeSolver > time_solver
Definition: diff_system.h:210
void numerical_nonlocal_jacobian(FEMContext &context) const
Definition: fem_system.C:1301
Real verify_analytic_jacobians
Definition: fem_system.h:201
virtual void pre_fe_reinit(const System &, const Elem *e)
Definition: fem_context.C:1561
virtual void zero() libmesh_override
Definition: dense_matrix.h:815
void parallel_for(const Range &range, const Body &body)
Definition: threads_none.h:73
processor_id_type n_processors() const
MeshBase & mesh
Real l1_norm() const
const class libmesh_nullptr_t libmesh_nullptr
NumericVector< Number > * rhs
const VariableGroup & variable_group(unsigned int vg) const
Definition: system.h:2113
const DenseVector< Number > & get_elem_residual() const
Definition: diff_context.h:248
virtual unsigned int size() const libmesh_override
Definition: dense_vector.h:81
virtual Real l1_norm() const =0
long double max(long double a, double b)
Base class for Mesh.
Definition: mesh_base.h:67
virtual void zero()=0
libmesh_assert(j)
std::unique_ptr< T > UniquePtr
Definition: auto_ptr.h:46
const DenseMatrix< Number > & get_elem_jacobian() const
Definition: diff_context.h:282
unsigned int n_variable_groups() const
Definition: system.h:2083
const MeshBase & get_mesh() const
Definition: system.h:2003
virtual void zero()=0
virtual void init_context(DiffContext &) libmesh_override
Definition: fem_system.C:1333
boostcopy::enable_if_c< ScalarTraits< T2 >::value, void >::type add(const T2 factor, const DenseMatrix< T3 > &mat)
Definition: dense_matrix.h:906
UniquePtr< NumericVector< Number > > solution
Definition: system.h:1512
OStreamProxy err(std::cerr)
virtual void close()=0
virtual void update()
Definition: system.C:420
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
SparseMatrix< Number > * matrix
virtual UniquePtr< DiffContext > build_context() libmesh_override
Definition: fem_system.C:1309
virtual void close() const =0
OStreamProxy out(std::cout)
virtual Real l1_norm() const =0
std::streamsize precision() const
processor_id_type processor_id() const
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 1801 of file system.C.

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

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

1803 {
1804  libmesh_assert(fptr);
1805 
1807  {
1808  libmesh_here();
1809  libMesh::out << "WARNING: Cannot specify both assembly function and object!"
1810  << std::endl;
1811 
1813  }
1814 
1816 }
Assembly * _assemble_system_object
Definition: system.h:1811
const class libmesh_nullptr_t libmesh_nullptr
libmesh_assert(j)
void(* _assemble_system_function)(EquationSystems &es, const std::string &name)
Definition: system.h:1805
OStreamProxy out(std::cout)
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 1820 of file system.C.

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

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

1821 {
1823  {
1824  libmesh_here();
1825  libMesh::out << "WARNING: Cannot specify both assembly object and function!"
1826  << std::endl;
1827 
1829  }
1830 
1831  _assemble_system_object = &assemble_in;
1832 }
Assembly * _assemble_system_object
Definition: system.h:1811
const class libmesh_nullptr_t libmesh_nullptr
void(* _assemble_system_function)(EquationSystems &es, const std::string &name)
Definition: system.h:1805
OStreamProxy out(std::cout)
void libMesh::System::attach_constraint_function ( void   fptrEquationSystems &es, const std::string &name)
inherited

Register a user function for imposing constraints.

Definition at line 1836 of file system.C.

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

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

1838 {
1839  libmesh_assert(fptr);
1840 
1842  {
1843  libmesh_here();
1844  libMesh::out << "WARNING: Cannot specify both constraint function and object!"
1845  << std::endl;
1846 
1848  }
1849 
1851 }
void(* _constrain_system_function)(EquationSystems &es, const std::string &name)
Definition: system.h:1816
Constraint * _constrain_system_object
Definition: system.h:1822
const class libmesh_nullptr_t libmesh_nullptr
libmesh_assert(j)
OStreamProxy out(std::cout)
void libMesh::System::attach_constraint_object ( System::Constraint constrain)
inherited

Register a user object for imposing constraints.

Definition at line 1855 of file system.C.

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

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

1856 {
1858  {
1859  libmesh_here();
1860  libMesh::out << "WARNING: Cannot specify both constraint object and function!"
1861  << std::endl;
1862 
1864  }
1865 
1866  _constrain_system_object = &constrain;
1867 }
void(* _constrain_system_function)(EquationSystems &es, const std::string &name)
Definition: system.h:1816
Constraint * _constrain_system_object
Definition: system.h:1822
const class libmesh_nullptr_t libmesh_nullptr
OStreamProxy out(std::cout)
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 1766 of file system.C.

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

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

1768 {
1769  libmesh_assert(fptr);
1770 
1772  {
1773  libmesh_here();
1774  libMesh::out << "WARNING: Cannot specify both initialization function and object!"
1775  << std::endl;
1776 
1778  }
1779 
1780  _init_system_function = fptr;
1781 }
const class libmesh_nullptr_t libmesh_nullptr
libmesh_assert(j)
Initialization * _init_system_object
Definition: system.h:1800
void(* _init_system_function)(EquationSystems &es, const std::string &name)
Definition: system.h:1794
OStreamProxy out(std::cout)
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 1785 of file system.C.

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

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

1786 {
1788  {
1789  libmesh_here();
1790  libMesh::out << "WARNING: Cannot specify both initialization object and function!"
1791  << std::endl;
1792 
1794  }
1795 
1796  _init_system_object = &init_in;
1797 }
const class libmesh_nullptr_t libmesh_nullptr
Initialization * _init_system_object
Definition: system.h:1800
void(* _init_system_function)(EquationSystems &es, const std::string &name)
Definition: system.h:1794
OStreamProxy out(std::cout)
void libMesh::DifferentiableSystem::attach_physics ( DifferentiablePhysics physics_in)
inlineinherited

Attach external Physics object.

Definition at line 180 of file diff_system.h.

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

181  { this->_diff_physics = (physics_in->clone_physics()).release();
182  this->_diff_physics->init_physics(*this);}
DifferentiablePhysics * _diff_physics
Definition: diff_system.h:347
virtual void init_physics(const System &sys)
void libMesh::DifferentiableSystem::attach_qoi ( DifferentiableQoI qoi_in)
inlineinherited

Attach external QoI object.

Definition at line 201 of file diff_system.h.

References libMesh::DifferentiableQoI::clone(), libMesh::DifferentiableSystem::diff_qoi, libMesh::DifferentiableQoI::init_qoi(), and libMesh::System::qoi.

202  { this->diff_qoi = (qoi_in->clone()).release();
203  // User needs to resize qoi system qoi accordingly
204  this->diff_qoi->init_qoi( this->qoi );}
DifferentiableQoI * diff_qoi
Definition: diff_system.h:354
std::vector< Number > qoi
Definition: system.h:1543
virtual void init_qoi(std::vector< Number > &)
Definition: diff_qoi.h:68
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 1907 of file system.C.

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

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

1909 {
1910  libmesh_assert(fptr);
1911 
1913  {
1914  libmesh_here();
1915  libMesh::out << "WARNING: Cannot specify both QOI derivative function and object!"
1916  << std::endl;
1917 
1919  }
1920 
1922 }
const class libmesh_nullptr_t libmesh_nullptr
libmesh_assert(j)
QOIDerivative * _qoi_evaluate_derivative_object
Definition: system.h:1848
OStreamProxy out(std::cout)
void(* _qoi_evaluate_derivative_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices, bool include_liftfunc, bool apply_constraints)
Definition: system.h:1839
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 1926 of file system.C.

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

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

1927 {
1929  {
1930  libmesh_here();
1931  libMesh::out << "WARNING: Cannot specify both QOI derivative object and function!"
1932  << std::endl;
1933 
1935  }
1936 
1937  _qoi_evaluate_derivative_object = &qoi_derivative;
1938 }
const class libmesh_nullptr_t libmesh_nullptr
QOIDerivative * _qoi_evaluate_derivative_object
Definition: system.h:1848
OStreamProxy out(std::cout)
void(* _qoi_evaluate_derivative_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices, bool include_liftfunc, bool apply_constraints)
Definition: system.h:1839
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 1871 of file system.C.

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

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

1874 {
1875  libmesh_assert(fptr);
1876 
1878  {
1879  libmesh_here();
1880  libMesh::out << "WARNING: Cannot specify both QOI function and object!"
1881  << std::endl;
1882 
1884  }
1885 
1886  _qoi_evaluate_function = fptr;
1887 }
const class libmesh_nullptr_t libmesh_nullptr
void(* _qoi_evaluate_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices)
Definition: system.h:1827
libmesh_assert(j)
QOI * _qoi_evaluate_object
Definition: system.h:1834
OStreamProxy out(std::cout)
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 1891 of file system.C.

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

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

1892 {
1894  {
1895  libmesh_here();
1896  libMesh::out << "WARNING: Cannot specify both QOI object and function!"
1897  << std::endl;
1898 
1900  }
1901 
1902  _qoi_evaluate_object = &qoi_in;
1903 }
const class libmesh_nullptr_t libmesh_nullptr
void(* _qoi_evaluate_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices)
Definition: system.h:1827
QOI * _qoi_evaluate_object
Definition: system.h:1834
OStreamProxy out(std::cout)
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 = libmesh_nullptr 
)
inherited

Projects arbitrary boundary functions onto a vector of degree of freedom values for the current system. 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.

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

Definition at line 999 of file system_projection.C.

References libMesh::System::boundary_project_vector().

Referenced by libMesh::System::project_vector(), and libMesh::System::system_type().

1003 {
1004  this->boundary_project_vector(b, variables, *solution, f, g);
1005 
1006  solution->localize(*current_local_solution);
1007 }
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=libmesh_nullptr, int is_adjoint=-1) const
UniquePtr< NumericVector< Number > > current_local_solution
Definition: system.h:1524
UniquePtr< NumericVector< Number > > solution
Definition: system.h:1512
void libMesh::System::boundary_project_solution ( const std::set< boundary_id_type > &  b,
const std::vector< unsigned int > &  variables,
Number   fptrconst Point &p, const Parameters &parameters, const std::string &sys_name, const std::string &unknown_name,
Gradient   gptrconst Point &p, const Parameters &parameters, const std::string &sys_name, const std::string &unknown_name,
const Parameters parameters 
)
inherited

Projects arbitrary boundary functions onto a vector of degree of freedom values for the current system. 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.

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 = libmesh_nullptr,
int  is_adjoint = -1 
) const
inherited

Projects arbitrary boundary functions onto a vector of degree of freedom values for the current system. 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.

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

Definition at line 1041 of file system_projection.C.

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

Referenced by libMesh::System::boundary_project_solution(), and libMesh::System::system_type().

1047 {
1048  LOG_SCOPE ("boundary_project_vector()", "System");
1049 
1051  (ConstElemRange (this->get_mesh().active_local_elements_begin(),
1052  this->get_mesh().active_local_elements_end() ),
1053  BoundaryProjectSolution(b, variables, *this, f, g,
1054  this->get_equation_systems().parameters,
1055  new_vector)
1056  );
1057 
1058  // We don't do SCALAR dofs when just projecting the boundary, so
1059  // we're done here.
1060 
1061  new_vector.close();
1062 
1063 #ifdef LIBMESH_ENABLE_CONSTRAINTS
1064  if (is_adjoint == -1)
1065  this->get_dof_map().enforce_constraints_exactly(*this, &new_vector);
1066  else if (is_adjoint >= 0)
1068  is_adjoint);
1069 #endif
1070 }
void parallel_for(const Range &range, const Body &body)
Definition: threads_none.h:73
StoredRange< MeshBase::const_element_iterator, const Elem * > ConstElemRange
Definition: elem_range.h:34
const MeshBase & get_mesh() const
Definition: system.h:2003
const DofMap & get_dof_map() const
Definition: system.h:2019
void enforce_constraints_exactly(const System &system, NumericVector< Number > *v=libmesh_nullptr, bool homogeneous=false) const
virtual void close()=0
const EquationSystems & get_equation_systems() const
Definition: system.h:711
void enforce_adjoint_constraints_exactly(NumericVector< Number > &v, unsigned int q) const
void libMesh::System::boundary_project_vector ( const std::set< boundary_id_type > &  b,
const std::vector< unsigned int > &  variables,
Number   fptrconst Point &p, const Parameters &parameters, const std::string &sys_name, const std::string &unknown_name,
Gradient   gptrconst Point &p, const Parameters &parameters, const std::string &sys_name, const std::string &unknown_name,
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. 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.

UniquePtr< DiffContext > libMesh::FEMSystem::build_context ( )
virtualinherited

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 1309 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().

1310 {
1311  FEMContext * fc = new FEMContext(*this);
1312 
1313  DifferentiablePhysics * phys = this->get_physics();
1314 
1315  libmesh_assert (phys);
1316 
1317  // If we are solving a moving mesh problem, tell that to the Context
1318  fc->set_mesh_system(phys->get_mesh_system());
1319  fc->set_mesh_x_var(phys->get_mesh_x_var());
1320  fc->set_mesh_y_var(phys->get_mesh_y_var());
1321  fc->set_mesh_z_var(phys->get_mesh_z_var());
1322 
1323  fc->set_deltat_pointer( &deltat );
1324 
1325  // If we are solving the adjoint problem, tell that to the Context
1326  fc->is_adjoint() = this->get_time_solver().is_adjoint();
1327 
1328  return UniquePtr<DiffContext>(fc);
1329 }
bool is_adjoint() const
Definition: time_solver.h:231
void set_mesh_z_var(unsigned int z_var)
Definition: fem_context.h:792
void set_mesh_x_var(unsigned int x_var)
Definition: fem_context.h:764
bool is_adjoint() const
Definition: diff_context.h:453
libmesh_assert(j)
std::unique_ptr< T > UniquePtr
Definition: auto_ptr.h:46
const System * get_mesh_system() const
Definition: diff_physics.h:622
unsigned int get_mesh_x_var() const
Definition: diff_physics.h:634
virtual void set_mesh_system(System *sys)
Definition: fem_context.h:738
const DifferentiablePhysics * get_physics() const
Definition: diff_system.h:167
unsigned int get_mesh_z_var() const
Definition: diff_physics.h:646
unsigned int get_mesh_y_var() const
Definition: diff_physics.h:640
void set_mesh_y_var(unsigned int y_var)
Definition: fem_context.h:778
void set_deltat_pointer(Real *dt)
Definition: diff_context.C:138
TimeSolver & get_time_solver()
Definition: diff_system.h:391
Real libMesh::System::calculate_norm ( const NumericVector< Number > &  v,
unsigned int  var,
FEMNormType  norm_type,
std::set< unsigned int > *  skip_dimensions = libmesh_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 1393 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::AdaptiveTimeSolver::calculate_norm(), libMesh::UnsteadySolver::du(), and libMesh::System::project_solution_on_reinit().

1397 {
1398  //short circuit to save time
1399  if(norm_type == DISCRETE_L1 ||
1400  norm_type == DISCRETE_L2 ||
1401  norm_type == DISCRETE_L_INF)
1402  return discrete_var_norm(v,var,norm_type);
1403 
1404  // Not a discrete norm
1405  std::vector<FEMNormType> norms(this->n_vars(), L2);
1406  std::vector<Real> weights(this->n_vars(), 0.0);
1407  norms[var] = norm_type;
1408  weights[var] = 1.0;
1409  Real val = this->calculate_norm(v, SystemNorm(norms, weights), skip_dimensions);
1410  return val;
1411 }
Real calculate_norm(const NumericVector< Number > &v, unsigned int var, FEMNormType norm_type, std::set< unsigned int > *skip_dimensions=libmesh_nullptr) const
Definition: system.C:1393
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
unsigned int n_vars() const
Definition: system.h:2075
Real discrete_var_norm(const NumericVector< Number > &v, unsigned int var, FEMNormType norm_type) const
Definition: system.C:1374
Real libMesh::System::calculate_norm ( const NumericVector< Number > &  v,
const SystemNorm norm,
std::set< unsigned int > *  skip_dimensions = libmesh_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 1415 of file system.C.

References libMesh::System::_dof_map, libMesh::System::_mesh, std::abs(), libMesh::MeshBase::active_local_elements_begin(), libMesh::MeshBase::active_local_elements_end(), libMesh::TypeVector< T >::add_scaled(), libMesh::TypeTensor< T >::add_scaled(), libMesh::NumericVector< T >::build(), libMesh::FEGenericBase< OutputType >::build(), libMesh::ParallelObject::comm(), libMesh::FEType::default_quadrature_rule(), libMesh::Elem::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::FEGenericBase< OutputType >::get_d2phi(), libMesh::System::get_dof_map(), libMesh::FEGenericBase< OutputType >::get_dphi(), libMesh::FEAbstract::get_JxW(), libMesh::System::get_mesh(), libMesh::FEGenericBase< OutputType >::get_phi(), libMesh::H1, libMesh::H1_SEMINORM, libMesh::H2, libMesh::H2_SEMINORM, libMesh::SystemNorm::is_discrete(), libMesh::L1, libMesh::NumericVector< T >::l1_norm(), libMesh::L2, libMesh::NumericVector< T >::l2_norm(), libMesh::L_INF, libMesh::libmesh_assert(), libmesh_nullptr, libMesh::NumericVector< T >::linfty_norm(), libMesh::NumericVector< T >::localize(), std::max(), libMesh::Parallel::Communicator::max(), libMesh::QBase::n_points(), libMesh::System::n_vars(), libMesh::TypeVector< T >::norm(), libMesh::TypeTensor< T >::norm(), libMesh::TensorTools::norm_sq(), libMesh::TypeVector< T >::norm_sq(), libMesh::TypeTensor< T >::norm_sq(), libMesh::Real, libMesh::FEAbstract::reinit(), libMesh::SERIAL, libMesh::NumericVector< T >::size(), libMesh::Parallel::Communicator::sum(), libMesh::SystemNorm::type(), libMesh::DofMap::variable_type(), libMesh::W1_INF_SEMINORM, libMesh::W2_INF_SEMINORM, libMesh::SystemNorm::weight(), and libMesh::SystemNorm::weight_sq().

1418 {
1419  // This function must be run on all processors at once
1420  parallel_object_only();
1421 
1422  LOG_SCOPE ("calculate_norm()", "System");
1423 
1424  // Zero the norm before summation
1425  Real v_norm = 0.;
1426 
1427  if (norm.is_discrete())
1428  {
1429  //Check to see if all weights are 1.0 and all types are equal
1430  FEMNormType norm_type0 = norm.type(0);
1431  unsigned int check_var = 0;
1432  for (; check_var != this->n_vars(); ++check_var)
1433  if((norm.weight(check_var) != 1.0) || (norm.type(check_var) != norm_type0))
1434  break;
1435 
1436  //All weights were 1.0 so just do the full vector discrete norm
1437  if(check_var == this->n_vars())
1438  {
1439  if(norm_type0 == DISCRETE_L1)
1440  return v.l1_norm();
1441  if(norm_type0 == DISCRETE_L2)
1442  return v.l2_norm();
1443  if(norm_type0 == DISCRETE_L_INF)
1444  return v.linfty_norm();
1445  else
1446  libmesh_error_msg("Invalid norm_type0 = " << norm_type0);
1447  }
1448 
1449  for (unsigned int var=0; var != this->n_vars(); ++var)
1450  {
1451  // Skip any variables we don't need to integrate
1452  if (norm.weight(var) == 0.0)
1453  continue;
1454 
1455  v_norm += norm.weight(var) * discrete_var_norm(v, var, norm.type(var));
1456  }
1457 
1458  return v_norm;
1459  }
1460 
1461  // Localize the potentially parallel vector
1462  UniquePtr<NumericVector<Number> > local_v = NumericVector<Number>::build(this->comm());
1463  local_v->init(v.size(), true, SERIAL);
1464  v.localize (*local_v, _dof_map->get_send_list());
1465 
1466  // I'm not sure how best to mix Hilbert norms on some variables (for
1467  // which we'll want to square then sum then square root) with norms
1468  // like L_inf (for which we'll just want to take an absolute value
1469  // and then sum).
1470  bool using_hilbert_norm = true,
1471  using_nonhilbert_norm = true;
1472 
1473  // Loop over all variables
1474  for (unsigned int var=0; var != this->n_vars(); ++var)
1475  {
1476  // Skip any variables we don't need to integrate
1477  Real norm_weight_sq = norm.weight_sq(var);
1478  if (norm_weight_sq == 0.0)
1479  continue;
1480  Real norm_weight = norm.weight(var);
1481 
1482  // Check for unimplemented norms (rather than just returning 0).
1483  FEMNormType norm_type = norm.type(var);
1484  if((norm_type==H1) ||
1485  (norm_type==H2) ||
1486  (norm_type==L2) ||
1487  (norm_type==H1_SEMINORM) ||
1488  (norm_type==H2_SEMINORM))
1489  {
1490  if (!using_hilbert_norm)
1491  libmesh_not_implemented();
1492  using_nonhilbert_norm = false;
1493  }
1494  else if ((norm_type==L1) ||
1495  (norm_type==L_INF) ||
1496  (norm_type==W1_INF_SEMINORM) ||
1497  (norm_type==W2_INF_SEMINORM))
1498  {
1499  if (!using_nonhilbert_norm)
1500  libmesh_not_implemented();
1501  using_hilbert_norm = false;
1502  }
1503  else
1504  libmesh_not_implemented();
1505 
1506  const FEType & fe_type = this->get_dof_map().variable_type(var);
1507 
1508  // Allow space for dims 0-3, even if we don't use them all
1509  std::vector<FEBase *> fe_ptrs(4,libmesh_nullptr);
1510  std::vector<QBase *> q_rules(4,libmesh_nullptr);
1511 
1512  const std::set<unsigned char> & elem_dims = _mesh.elem_dimensions();
1513 
1514  // Prepare finite elements for each dimension present in the mesh
1515  for (std::set<unsigned char>::const_iterator d_it = elem_dims.begin();
1516  d_it != elem_dims.end(); ++d_it)
1517  {
1518  if (skip_dimensions && skip_dimensions->find(*d_it) != skip_dimensions->end())
1519  continue;
1520 
1521  q_rules[*d_it] =
1522  fe_type.default_quadrature_rule (*d_it).release();
1523 
1524  // Construct finite element object
1525 
1526  fe_ptrs[*d_it] = FEBase::build(*d_it, fe_type).release();
1527 
1528  // Attach quadrature rule to FE object
1529  fe_ptrs[*d_it]->attach_quadrature_rule (q_rules[*d_it]);
1530  }
1531 
1532  std::vector<dof_id_type> dof_indices;
1533 
1534  // Begin the loop over the elements
1535  MeshBase::const_element_iterator el =
1537  const MeshBase::const_element_iterator end_el =
1539 
1540  for ( ; el != end_el; ++el)
1541  {
1542  const Elem * elem = *el;
1543  const unsigned int dim = elem->dim();
1544 
1545  if (skip_dimensions && skip_dimensions->find(dim) != skip_dimensions->end())
1546  continue;
1547 
1548  FEBase * fe = fe_ptrs[dim];
1549  QBase * qrule = q_rules[dim];
1550  libmesh_assert(fe);
1551  libmesh_assert(qrule);
1552 
1553  const std::vector<Real> & JxW = fe->get_JxW();
1554  const std::vector<std::vector<Real> > * phi = libmesh_nullptr;
1555  if (norm_type == H1 ||
1556  norm_type == H2 ||
1557  norm_type == L2 ||
1558  norm_type == L1 ||
1559  norm_type == L_INF)
1560  phi = &(fe->get_phi());
1561 
1562  const std::vector<std::vector<RealGradient> > * dphi = libmesh_nullptr;
1563  if (norm_type == H1 ||
1564  norm_type == H2 ||
1565  norm_type == H1_SEMINORM ||
1566  norm_type == W1_INF_SEMINORM)
1567  dphi = &(fe->get_dphi());
1568 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
1569  const std::vector<std::vector<RealTensor> > * d2phi = libmesh_nullptr;
1570  if (norm_type == H2 ||
1571  norm_type == H2_SEMINORM ||
1572  norm_type == W2_INF_SEMINORM)
1573  d2phi = &(fe->get_d2phi());
1574 #endif
1575 
1576  fe->reinit (elem);
1577 
1578  this->get_dof_map().dof_indices (elem, dof_indices, var);
1579 
1580  const unsigned int n_qp = qrule->n_points();
1581 
1582  const unsigned int n_sf = cast_int<unsigned int>
1583  (dof_indices.size());
1584 
1585  // Begin the loop over the Quadrature points.
1586  for (unsigned int qp=0; qp<n_qp; qp++)
1587  {
1588  if (norm_type == L1)
1589  {
1590  Number u_h = 0.;
1591  for (unsigned int i=0; i != n_sf; ++i)
1592  u_h += (*phi)[i][qp] * (*local_v)(dof_indices[i]);
1593  v_norm += norm_weight *
1594  JxW[qp] * std::abs(u_h);
1595  }
1596 
1597  if (norm_type == L_INF)
1598  {
1599  Number u_h = 0.;
1600  for (unsigned int i=0; i != n_sf; ++i)
1601  u_h += (*phi)[i][qp] * (*local_v)(dof_indices[i]);
1602  v_norm = std::max(v_norm, norm_weight * std::abs(u_h));
1603  }
1604 
1605  if (norm_type == H1 ||
1606  norm_type == H2 ||
1607  norm_type == L2)
1608  {
1609  Number u_h = 0.;
1610  for (unsigned int i=0; i != n_sf; ++i)
1611  u_h += (*phi)[i][qp] * (*local_v)(dof_indices[i]);
1612  v_norm += norm_weight_sq *
1613  JxW[qp] * TensorTools::norm_sq(u_h);
1614  }
1615 
1616  if (norm_type == H1 ||
1617  norm_type == H2 ||
1618  norm_type == H1_SEMINORM)
1619  {
1620  Gradient grad_u_h;
1621  for (unsigned int i=0; i != n_sf; ++i)
1622  grad_u_h.add_scaled((*dphi)[i][qp], (*local_v)(dof_indices[i]));
1623  v_norm += norm_weight_sq *
1624  JxW[qp] * grad_u_h.norm_sq();
1625  }
1626 
1627  if (norm_type == W1_INF_SEMINORM)
1628  {
1629  Gradient grad_u_h;
1630  for (unsigned int i=0; i != n_sf; ++i)
1631  grad_u_h.add_scaled((*dphi)[i][qp], (*local_v)(dof_indices[i]));
1632  v_norm = std::max(v_norm, norm_weight * grad_u_h.norm());
1633  }
1634 
1635 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
1636  if (norm_type == H2 ||
1637  norm_type == H2_SEMINORM)
1638  {
1639  Tensor hess_u_h;
1640  for (unsigned int i=0; i != n_sf; ++i)
1641  hess_u_h.add_scaled((*d2phi)[i][qp], (*local_v)(dof_indices[i]));
1642  v_norm += norm_weight_sq *
1643  JxW[qp] * hess_u_h.norm_sq();
1644  }
1645 
1646  if (norm_type == W2_INF_SEMINORM)
1647  {
1648  Tensor hess_u_h;
1649  for (unsigned int i=0; i != n_sf; ++i)
1650  hess_u_h.add_scaled((*d2phi)[i][qp], (*local_v)(dof_indices[i]));
1651  v_norm = std::max(v_norm, norm_weight * hess_u_h.norm());
1652  }
1653 #endif
1654  }
1655  }
1656 
1657  // Need to delete the FE and quadrature objects to prevent a memory leak
1658  for (std::size_t i=0; i<fe_ptrs.size(); i++)
1659  if (fe_ptrs[i])
1660  delete fe_ptrs[i];
1661 
1662  for (std::size_t i=0; i<q_rules.size(); i++)
1663  if (q_rules[i])
1664  delete q_rules[i];
1665  }
1666 
1667  if (using_hilbert_norm)
1668  {
1669  this->comm().sum(v_norm);
1670  v_norm = std::sqrt(v_norm);
1671  }
1672  else
1673  {
1674  this->comm().max(v_norm);
1675  }
1676 
1677  return v_norm;
1678 }
double abs(double a)
virtual numeric_index_type size() const =0
const FEType & variable_type(const unsigned int c) const
Definition: dof_map.h:1668
void add_scaled(const TypeTensor< T2 > &, const T)
Definition: type_tensor.h:744
void add_scaled(const TypeVector< T2 > &, const T)
Definition: type_vector.h:604
virtual Real l2_norm() const =0
const class libmesh_nullptr_t libmesh_nullptr
virtual Real l1_norm() const =0
long double max(long double a, double b)
UniquePtr< DofMap > _dof_map
Definition: system.h:1854
libmesh_assert(j)
static UniquePtr< NumericVector< T > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package())
const MeshBase & get_mesh() const
Definition: system.h:2003
const DofMap & get_dof_map() const
Definition: system.h:2019
virtual element_iterator active_local_elements_begin()=0
NumberVectorValue Gradient
const std::set< unsigned char > & elem_dimensions() const
Definition: mesh_base.h:184
FEGenericBase< Real > FEBase
virtual Real linfty_norm() const =0
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
NumberTensorValue Tensor
const Parallel::Communicator & comm() const
ParallelType type() const
unsigned int n_vars() const
Definition: system.h:2075
virtual element_iterator active_local_elements_end()=0
MeshBase & _mesh
Definition: system.h:1866
virtual void localize(std::vector< T > &v_local) const =0
Real discrete_var_norm(const NumericVector< Number > &v, unsigned int var, FEMNormType norm_type) const
Definition: system.C:1374
void dof_indices(const Elem *const elem, std::vector< dof_id_type > &di) const
Definition: dof_map.C:2022
static UniquePtr< FEGenericBase > build(const unsigned int dim, const FEType &type)
void libMesh::ContinuationSystem::clear ( )
virtual

Clear all the data structures associated with the system.

Reimplemented from libMesh::DifferentiableSystem.

Definition at line 80 of file continuation_system.C.

References libMesh::DifferentiableSystem::clear().

Referenced by ~ContinuationSystem().

81 {
82  // FIXME: Do anything here, e.g. zero vectors, etc?
83 
84  // Call the Parent's clear function
85  Parent::clear();
86 }
virtual void clear() libmesh_override
Definition: diff_system.C:67
virtual void libMesh::DifferentiablePhysics::clear_physics ( )
virtualinherited

Clear any data structures associated with the physics.

Referenced by libMesh::DifferentiableSystem::clear(), and libMesh::DifferentiablePhysics::DifferentiablePhysics().

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

Clear all the data structures associated with the QoI.

Definition at line 74 of file diff_qoi.h.

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

74 {}
virtual UniquePtr<DifferentiableQoI> libMesh::DifferentiableSystem::clone ( )
inlinevirtualinherited

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

Implements libMesh::DifferentiableQoI.

Definition at line 155 of file diff_system.h.

156  {
157  libmesh_not_implemented();
158  // dummy
159  return UniquePtr<DifferentiableQoI>(this);
160  }
virtual UniquePtr<DifferentiablePhysics> libMesh::DifferentiableSystem::clone_physics ( )
inlinevirtualinherited

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

Implements libMesh::DifferentiablePhysics.

Definition at line 145 of file diff_system.h.

146  {
147  libmesh_not_implemented();
148  // dummy
149  return UniquePtr<DifferentiablePhysics>(this);
150  }
const Parallel::Communicator& libMesh::ParallelObject::comm ( ) const
inlineinherited
Returns
a reference to the Parallel::Communicator object used by this mesh.

Definition at line 87 of file parallel_object.h.

References libMesh::ParallelObject::_communicator.

Referenced by libMesh::__libmesh_petsc_diff_solver_monitor(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::__libmesh_petsc_snes_jacobian(), libMesh::__libmesh_petsc_snes_postcheck(), libMesh::__libmesh_petsc_snes_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::ParmetisPartitioner::_do_repartition(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_get_diagonal(), libMesh::SlepcEigenSolver< T >::_petsc_shell_matrix_get_diagonal(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_mult(), libMesh::SlepcEigenSolver< T >::_petsc_shell_matrix_mult(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_mult_add(), libMesh::EquationSystems::_read_impl(), libMesh::MeshRefinement::_refine_elements(), libMesh::MeshRefinement::_smooth_flags(), libMesh::ImplicitSystem::add_matrix(), libMesh::System::add_vector(), libMesh::EigenSparseLinearSolver< T >::adjoint_solve(), libMesh::UnstructuredMesh::all_second_order(), libMesh::MeshTools::Modification::all_tri(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::FEMSystem::assemble_qoi(), libMesh::MeshCommunication::assign_global_indices(), libMesh::ParmetisPartitioner::assign_partitioning(), libMesh::DofMap::attach_matrix(), libMesh::Parallel::BinSorter< KeyType, IdxType >::binsort(), libMesh::Parallel::Sort< KeyType, IdxType >::binsort(), libMesh::MeshTools::bounding_box(), libMesh::MeshCommunication::broadcast(), libMesh::SparseMatrix< T >::build(), libMesh::MeshTools::Generation::build_extrusion(), libMesh::Parallel::Histogram< KeyType, IdxType >::build_histogram(), libMesh::PetscNonlinearSolver< T >::build_mat_null_space(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::MeshBase::cache_elem_dims(), libMesh::System::calculate_norm(), libMesh::DofMap::check_dirichlet_bcid_consistency(), libMesh::DistributedVector< T >::clone(), libMesh::EigenSparseVector< T >::clone(), libMesh::LaspackVector< T >::clone(), libMesh::EpetraVector< T >::clone(), libMesh::PetscVector< T >::clone(), libMesh::EpetraVector< T >::close(), libMesh::Parallel::Sort< KeyType, IdxType >::communicate_bins(), 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::Problem_Interface::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::MeshRefinement::create_parent_error_vector(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::DofMap::distribute_dofs(), DMlibMeshFunction(), DMlibMeshJacobian(), DMlibMeshSetSystem_libMesh(), DMVariableBounds_libMesh(), libMesh::MeshRefinement::eliminate_unrefined_patches(), libMesh::EpetraVector< T >::EpetraVector(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::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_nelem_target(), libMesh::MeshCommunication::gather(), libMesh::MeshCommunication::gather_neighboring_elements(), libMesh::CondensedEigenSystem::get_eigenpair(), libMesh::DofMap::get_info(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::EquationSystems::get_solution(), libMesh::LocationMap< T >::init(), libMesh::PetscDiffSolver::init(), libMesh::TimeSolver::init(), libMesh::TopologyMap::init(), libMesh::TaoOptimizationSolver< T >::init(), libMesh::PetscNonlinearSolver< T >::init(), libMesh::DistributedVector< T >::init(), libMesh::EpetraVector< T >::init(), libMesh::PetscVector< T >::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::EigenSystem::init_data(), libMesh::EigenSystem::init_matrices(), libMesh::ParmetisPartitioner::initialize(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), 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::MeshRefinement::limit_level_mismatch_at_edge(), libMesh::MeshRefinement::limit_level_mismatch_at_node(), libMesh::MeshRefinement::limit_overrefined_boundary(), libMesh::MeshRefinement::limit_underrefined_boundary(), 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_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::DistributedVector< T >::max(), libMesh::FEMSystem::mesh_position_set(), libMesh::MeshSerializer::MeshSerializer(), libMesh::DistributedVector< T >::min(), libMesh::DistributedMesh::n_active_elem(), libMesh::MeshTools::n_active_levels(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::CondensedEigenSystem::n_global_non_condensed_dofs(), libMesh::MeshTools::n_levels(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::MeshTools::n_p_levels(), libMesh::BoundaryInfo::n_shellface_conds(), 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::MeshTools::paranoid_n_levels(), libMesh::Partitioner::partition(), libMesh::MetisPartitioner::partition_range(), 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::SparseMatrix< T >::print(), libMesh::MeshTools::processor_bounding_box(), libMesh::Nemesis_IO::read(), libMesh::XdrIO::read(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs_helper(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::MeshBase::recalculate_n_partitions(), libMesh::MeshCommunication::redistribute(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::MeshCommunication::send_coarse_ghosts(), libMesh::Partitioner::set_node_processor_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::Partitioner::set_parent_processor_ids(), libMesh::LaplaceMeshSmoother::smooth(), libMesh::Parallel::Sort< KeyType, IdxType >::sort(), libMesh::MeshTools::subdomain_bounding_box(), libMesh::MeshBase::subdomain_ids(), libMesh::BoundaryInfo::sync(), libMesh::Parallel::sync_element_data_by_parent_id(), libMesh::Parallel::sync_node_data_by_element_id(), libMesh::MeshRefinement::test_level_one(), libMesh::MeshRefinement::test_unflagged(), libMesh::MeshTools::total_weight(), libMesh::NameBasedIO::write(), libMesh::XdrIO::write(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::DistributedVector< T >::zero_clone(), libMesh::LaspackVector< T >::zero_clone(), libMesh::EigenSparseVector< T >::zero_clone(), libMesh::EpetraVector< T >::zero_clone(), and libMesh::PetscVector< T >::zero_clone().

88  { return _communicator; }
const Parallel::Communicator & _communicator
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 526 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.

Referenced by libMesh::EquationSystems::compare(), and libMesh::System::set_adjoint_already_solved().

529 {
530  // we do not care for matrices, but for vectors
532  libmesh_assert (other_system._is_initialized);
533 
534  if (verbose)
535  {
536  libMesh::out << " Systems \"" << _sys_name << "\"" << std::endl;
537  libMesh::out << " comparing matrices not supported." << std::endl;
538  libMesh::out << " comparing names...";
539  }
540 
541  // compare the name: 0 means identical
542  const int name_result = _sys_name.compare(other_system.name());
543  if (verbose)
544  {
545  if (name_result == 0)
546  libMesh::out << " identical." << std::endl;
547  else
548  libMesh::out << " names not identical." << std::endl;
549  libMesh::out << " comparing solution vector...";
550  }
551 
552 
553  // compare the solution: -1 means identical
554  const int solu_result = solution->compare (*other_system.solution.get(),
555  threshold);
556 
557  if (verbose)
558  {
559  if (solu_result == -1)
560  libMesh::out << " identical up to threshold." << std::endl;
561  else
562  libMesh::out << " first difference occured at index = "
563  << solu_result << "." << std::endl;
564  }
565 
566 
567  // safety check, whether we handle at least the same number
568  // of vectors
569  std::vector<int> ov_result;
570 
571  if (this->n_vectors() != other_system.n_vectors())
572  {
573  if (verbose)
574  {
575  libMesh::out << " Fatal difference. This system handles "
576  << this->n_vectors() << " add'l vectors," << std::endl
577  << " while the other system handles "
578  << other_system.n_vectors()
579  << " add'l vectors." << std::endl
580  << " Aborting comparison." << std::endl;
581  }
582  return false;
583  }
584  else if (this->n_vectors() == 0)
585  {
586  // there are no additional vectors...
587  ov_result.clear ();
588  }
589  else
590  {
591  // compare other vectors
592  for (const_vectors_iterator pos = _vectors.begin();
593  pos != _vectors.end(); ++pos)
594  {
595  if (verbose)
596  libMesh::out << " comparing vector \""
597  << pos->first << "\" ...";
598 
599  // assume they have the same name
600  const NumericVector<Number> & other_system_vector =
601  other_system.get_vector(pos->first);
602 
603  ov_result.push_back(pos->second->compare (other_system_vector,
604  threshold));
605 
606  if (verbose)
607  {
608  if (ov_result[ov_result.size()-1] == -1)
609  libMesh::out << " identical up to threshold." << std::endl;
610  else
611  libMesh::out << " first difference occured at" << std::endl
612  << " index = " << ov_result[ov_result.size()-1] << "." << std::endl;
613  }
614 
615  }
616 
617  } // finished comparing additional vectors
618 
619 
620  bool overall_result;
621 
622  // sum up the results
623  if ((name_result==0) && (solu_result==-1))
624  {
625  if (ov_result.size()==0)
626  overall_result = true;
627  else
628  {
629  bool ov_identical;
630  unsigned int n = 0;
631  do
632  {
633  ov_identical = (ov_result[n]==-1);
634  n++;
635  }
636  while (ov_identical && n<ov_result.size());
637  overall_result = ov_identical;
638  }
639  }
640  else
641  overall_result = false;
642 
643  if (verbose)
644  {
645  libMesh::out << " finished comparisons, ";
646  if (overall_result)
647  libMesh::out << "found no differences." << std::endl << std::endl;
648  else
649  libMesh::out << "found differences." << std::endl << std::endl;
650  }
651 
652  return overall_result;
653 }
bool _is_initialized
Definition: system.h:1941
std::map< std::string, NumericVector< Number > * >::const_iterator const_vectors_iterator
Definition: system.h:748
libmesh_assert(j)
UniquePtr< NumericVector< Number > > solution
Definition: system.h:1512
std::map< std::string, NumericVector< Number > * > _vectors
Definition: system.h:1905
const std::string _sys_name
Definition: system.h:1871
OStreamProxy out(std::cout)
unsigned int n_vectors() const
Definition: system.h:2203
void libMesh::ContinuationSystem::continuation_solve ( )

Perform a continuation solve of the system. In general, you can only begin the continuation solves after either reading in or solving for two previous values of the control parameter. The prior two solutions are required for starting up the continuation method.

Definition at line 358 of file continuation_system.C.

References std::abs(), libMesh::NumericVector< T >::add(), apply_predictor(), libMesh::FEMSystem::assembly(), libMesh::NumericVector< T >::close(), libMesh::SparseMatrix< T >::close(), continuation_parameter, continuation_parameter_tolerance, delta_u, dlambda_ds, libMesh::NumericVector< T >::dot(), ds_current, du_ds, G_Lambda, initial_newton_tolerance, initialize_tangent(), libMesh::NumericVector< T >::l2_norm(), libMesh::libmesh_real(), linear_solver, libMesh::ImplicitSystem::matrix, max_continuation_parameter, libMesh::DiffSolver::max_linear_iterations, libMesh::DiffSolver::max_nonlinear_iterations, std::min(), min_continuation_parameter, n_arclength_reductions, n_backtrack_steps, newton_progress_check, newton_solver, newton_step, old_continuation_parameter, libMesh::out, std::pow(), libMesh::BasicOStreamProxy< charT, traits >::precision(), previous_u, quiet, libMesh::Real, Residual, libMesh::ExplicitSystem::rhs, rhs_mode, libMesh::NumericVector< T >::scale(), libMesh::BasicOStreamProxy< charT, traits >::setf(), libMesh::System::solution, solution_tolerance, tangent_initialized, Theta, Theta_LOCA, libMesh::DifferentiableSystem::time_solver, libMesh::BasicOStreamProxy< charT, traits >::unsetf(), y, y_old, z, and libMesh::NumericVector< T >::zero().

359 {
360  // Be sure the user has set the continuation parameter pointer
362  libmesh_error_msg("You must set the continuation_parameter pointer " \
363  << "to a member variable of the derived class, preferably in the " \
364  << "Derived class's init_data function. This is how the ContinuationSystem " \
365  << "updates the continuation parameter.");
366 
367  // Use extra precision for all the numbers printed in this function.
368  std::streamsize old_precision = libMesh::out.precision();
370  libMesh::out.setf(std::ios_base::scientific);
371 
372  // We can't start solving the augmented PDE system unless the tangent
373  // vectors have been initialized. This only needs to occur once.
374  if (!tangent_initialized)
376 
377  // Save the old value of -du/dlambda. This will be used after the Newton iterations
378  // to compute the angle between previous tangent vectors. This cosine of this angle is
379  //
380  // tau := abs( (du/d(lambda)_i , du/d(lambda)_{i-1}) / (||du/d(lambda)_i|| * ||du/d(lambda)_{i-1}||) )
381  //
382  // The scaling factor tau (which should vary between 0 and 1) is used to shrink the step-size ds
383  // when we are approaching a turning point. Note that it can only shrink the step size.
384  *y_old = *y;
385 
386  // Set pointer to underlying Newton solver
387  if (!newton_solver)
388  newton_solver = cast_ptr<NewtonSolver *> (this->time_solver->diff_solver().get());
389 
390  // A pair for catching return values from linear system solves.
391  std::pair<unsigned int, Real> rval;
392 
393  // Convergence flag for the entire arcstep
394  bool arcstep_converged = false;
395 
396  // Begin loop over arcstep reductions.
397  for (unsigned int ns=0; ns<n_arclength_reductions; ++ns)
398  {
399  if (!quiet)
400  {
401  libMesh::out << "Current arclength stepsize, ds_current=" << ds_current << std::endl;
402  libMesh::out << "Current parameter value, lambda=" << *continuation_parameter << std::endl;
403  }
404 
405  // Upon exit from the nonlinear loop, the newton_converged flag
406  // will tell us the convergence status of Newton's method.
407  bool newton_converged = false;
408 
409  // The nonlinear residual before *any* nonlinear steps have been taken.
410  Real nonlinear_residual_firststep = 0.;
411 
412  // The nonlinear residual from the current "k" Newton step, before the Newton step
413  Real nonlinear_residual_beforestep = 0.;
414 
415  // The nonlinear residual from the current "k" Newton step, after the Newton step
416  Real nonlinear_residual_afterstep = 0.;
417 
418  // The linear solver tolerance, can be updated dynamically at each Newton step.
419  Real current_linear_tolerance = 0.;
420 
421  // The nonlinear loop
423  {
424  libMesh::out << "\n === Starting Newton step " << newton_step << " ===" << std::endl;
425 
426  // Set the linear system solver tolerance
427  // // 1.) Set the current linear tolerance based as a multiple of the current residual of the system.
428  // const Real residual_multiple = 1.e-4;
429  // Real current_linear_tolerance = residual_multiple*nonlinear_residual_beforestep;
430 
431  // // But if the current residual isn't small, don't let the solver exit with zero iterations!
432  // if (current_linear_tolerance > 1.)
433  // current_linear_tolerance = residual_multiple;
434 
435  // 2.) Set the current linear tolerance based on the method based on technique of Eisenstat & Walker.
436  if (newton_step==0)
437  {
438  // At first step, only try reducing the residual by a small amount
439  current_linear_tolerance = initial_newton_tolerance;//0.01;
440  }
441 
442  else
443  {
444  // The new tolerance is based on the ratio of the most recent tolerances
445  const Real alp=0.5*(1.+std::sqrt(5.));
446  const Real gam=0.9;
447 
448  libmesh_assert_not_equal_to (nonlinear_residual_beforestep, 0.0);
449  libmesh_assert_not_equal_to (nonlinear_residual_afterstep, 0.0);
450 
451  current_linear_tolerance = std::min(gam*std::pow(nonlinear_residual_afterstep/nonlinear_residual_beforestep, alp),
452  current_linear_tolerance*current_linear_tolerance
453  );
454 
455  // Don't let it get ridiculously small!!
456  if (current_linear_tolerance < 1.e-12)
457  current_linear_tolerance = 1.e-12;
458  }
459 
460  if (!quiet)
461  libMesh::out << "Using current_linear_tolerance=" << current_linear_tolerance << std::endl;
462 
463 
464  // Assemble the residual (and Jacobian).
465  rhs_mode = Residual;
466  assembly(true, // Residual
467  true); // Jacobian
468  rhs->close();
469 
470  // Save the current nonlinear residual. We don't need to recompute the residual unless
471  // this is the first step, since it was already computed as part of the convergence check
472  // at the end of the last loop iteration.
473  if (newton_step==0)
474  {
475  nonlinear_residual_beforestep = rhs->l2_norm();
476 
477  // Store the residual before any steps have been taken. This will *not*
478  // be updated at each step, and can be used to see if any progress has
479  // been made from the initial residual at later steps.
480  nonlinear_residual_firststep = nonlinear_residual_beforestep;
481 
482  const Real old_norm_u = solution->l2_norm();
483  libMesh::out << " (before step) ||R||_{L2} = " << nonlinear_residual_beforestep << std::endl;
484  libMesh::out << " (before step) ||R||_{L2}/||u|| = " << nonlinear_residual_beforestep / old_norm_u << std::endl;
485 
486  // In rare cases (very small arcsteps), it's possible that the residual is
487  // already below our absolute linear tolerance.
488  if (nonlinear_residual_beforestep < solution_tolerance)
489  {
490  if (!quiet)
491  libMesh::out << "Initial guess satisfied linear tolerance, exiting with zero Newton iterations!" << std::endl;
492 
493  // Since we go straight from here to the solve of the next tangent, we
494  // have to close the matrix before it can be assembled again.
495  matrix->close();
496  newton_converged=true;
497  break; // out of Newton iterations, with newton_converged=true
498  }
499  }
500 
501  else
502  {
503  nonlinear_residual_beforestep = nonlinear_residual_afterstep;
504  }
505 
506 
507  // Solve the linear system G_u*z = G
508  // Initial guess?
509  z->zero(); // It seems to be extremely important to zero z here, otherwise the solver quits early.
510  z->close();
511 
512  // It's possible that we have selected the current_linear_tolerance so large that
513  // a guess of z=zero yields a linear system residual |Az + R| small enough that the
514  // linear solver exits in zero iterations. If this happens, we will reduce the
515  // current_linear_tolerance until the linear solver does at least 1 iteration.
516  do
517  {
518  rval =
519  linear_solver->solve(*matrix,
520  *z,
521  *rhs,
522  //1.e-12,
523  current_linear_tolerance,
524  newton_solver->max_linear_iterations); // max linear iterations
525 
526  if (rval.first==0)
527  {
528  if (newton_step==0)
529  {
530  libMesh::out << "Repeating initial solve with smaller linear tolerance!" << std::endl;
531  current_linear_tolerance *= initial_newton_tolerance; // reduce the linear tolerance to force the solver to do some work
532  }
533  else
534  // We shouldn't get here ... it means the linear solver did no work on a Newton
535  // step other than the first one. If this happens, we need to think more about our
536  // tolerance selection.
537  libmesh_error_msg("Linear solver did no work!");
538  }
539 
540  } while (rval.first==0);
541 
542 
543  if (!quiet)
544  libMesh::out << " G_u*z = G solver converged at step "
545  << rval.first
546  << " linear tolerance = "
547  << rval.second
548  << "."
549  << std::endl;
550 
551  // Sometimes (I am not sure why) the linear solver exits after zero iterations.
552  // Perhaps it is hitting PETSc's divergence tolerance dtol??? If this occurs,
553  // we should break out of the Newton iteration loop because nothing further is
554  // going to happen... Of course if the tolerance is already small enough after
555  // zero iterations (how can this happen?!) we should not quit.
556  if ((rval.first == 0) && (rval.second > current_linear_tolerance*nonlinear_residual_beforestep))
557  {
558  if (!quiet)
559  libMesh::out << "Linear solver exited in zero iterations!" << std::endl;
560 
561  // Try to find out the reason for convergence/divergence
562  linear_solver->print_converged_reason();
563 
564  break; // out of Newton iterations
565  }
566 
567  // Note: need to scale z by -1 since our code always solves Jx=R
568  // instead of Jx=-R.
569  z->scale(-1.);
570  z->close();
571 
572 
573 
574 
575 
576 
577  // Assemble the G_Lambda vector, skip residual.
578  rhs_mode = G_Lambda;
579 
580  // Assemble both rhs and Jacobian
581  assembly(true, // Residual
582  false); // Jacobian
583 
584  // Not sure if this is really necessary
585  rhs->close();
586  const Real yrhsnorm=rhs->l2_norm();
587  if (yrhsnorm == 0.0)
588  libmesh_error_msg("||G_Lambda|| = 0");
589 
590  // We select a tolerance for the y-system which is based on the inexact Newton
591  // tolerance but scaled by an extra term proportional to the RHS (which is not -> 0 in this case)
592  const Real ysystemtol=current_linear_tolerance*(nonlinear_residual_beforestep/yrhsnorm);
593  if (!quiet)
594  libMesh::out << "ysystemtol=" << ysystemtol << std::endl;
595 
596  // Solve G_u*y = G_{\lambda}
597  // FIXME: Initial guess? This is really a solve for -du/dlambda so we could try
598  // initializing it with the latest approximation to that... du/dlambda ~ du/ds * ds/dlambda
599  //*y = *solution;
600  //y->add(-1., *previous_u);
601  //y->scale(-1. / (*continuation_parameter - old_continuation_parameter)); // Be careful of divide by zero...
602  //y->close();
603 
604  // const unsigned int max_attempts=1;
605  // unsigned int attempt=0;
606  // do
607  // {
608  // if (!quiet)
609  // libMesh::out << "Trying to solve tangent system, attempt " << attempt << std::endl;
610 
611  rval =
612  linear_solver->solve(*matrix,
613  *y,
614  *rhs,
615  //1.e-12,
616  ysystemtol,
617  newton_solver->max_linear_iterations); // max linear iterations
618 
619  if (!quiet)
620  libMesh::out << " G_u*y = G_{lambda} solver converged at step "
621  << rval.first
622  << ", linear tolerance = "
623  << rval.second
624  << "."
625  << std::endl;
626 
627  // Sometimes (I am not sure why) the linear solver exits after zero iterations.
628  // Perhaps it is hitting PETSc's divergence tolerance dtol??? If this occurs,
629  // we should break out of the Newton iteration loop because nothing further is
630  // going to happen...
631  if ((rval.first == 0) && (rval.second > ysystemtol))
632  {
633  if (!quiet)
634  libMesh::out << "Linear solver exited in zero iterations!" << std::endl;
635 
636  break; // out of Newton iterations
637  }
638 
639  // ++attempt;
640  // } while ((attempt<max_attempts) && (rval.first==newton_solver->max_linear_iterations));
641 
642 
643 
644 
645 
646  // Compute N, the residual of the arclength constraint eqn.
647  // Note 1: N(u,lambda,s) := (u-u_{old}, du_ds) + (lambda-lambda_{old}, dlambda_ds) - _ds
648  // We temporarily use the delta_u vector as a temporary vector for this calculation.
649  *delta_u = *solution;
650  delta_u->add(-1., *previous_u);
651 
652  // First part of the arclength constraint
654  const Number N2 = ((*continuation_parameter) - old_continuation_parameter)*dlambda_ds;
655  const Number N3 = ds_current;
656 
657  if (!quiet)
658  {
659  libMesh::out << " N1=" << N1 << std::endl;
660  libMesh::out << " N2=" << N2 << std::endl;
661  libMesh::out << " N3=" << N3 << std::endl;
662  }
663 
664  // The arclength constraint value
665  const Number N = N1+N2-N3;
666 
667  if (!quiet)
668  libMesh::out << " N=" << N << std::endl;
669 
670  const Number duds_dot_z = du_ds->dot(*z);
671  const Number duds_dot_y = du_ds->dot(*y);
672 
673  //libMesh::out << "duds_dot_z=" << duds_dot_z << std::endl;
674  //libMesh::out << "duds_dot_y=" << duds_dot_y << std::endl;
675  //libMesh::out << "dlambda_ds=" << dlambda_ds << std::endl;
676 
677  const Number delta_lambda_numerator = -(N + Theta_LOCA*Theta_LOCA*Theta*duds_dot_z);
678  const Number delta_lambda_denominator = (dlambda_ds - Theta_LOCA*Theta_LOCA*Theta*duds_dot_y);
679 
680  libmesh_assert_not_equal_to (delta_lambda_denominator, 0.0);
681 
682  // Now, we are ready to compute the step delta_lambda
683  const Number delta_lambda_comp = delta_lambda_numerator /
684  delta_lambda_denominator;
685  // Lambda is real-valued
686  const Real delta_lambda = libmesh_real(delta_lambda_comp);
687 
688  // Knowing delta_lambda, we are ready to update delta_u
689  // delta_u = z - delta_lambda*y
690  delta_u->zero();
691  delta_u->add(1., *z);
692  delta_u->add(-delta_lambda, *y);
693  delta_u->close();
694 
695  // Update the system solution and the continuation parameter.
696  solution->add(1., *delta_u);
697  solution->close();
698  *continuation_parameter += delta_lambda;
699 
700  // Did the Newton step actually reduce the residual?
701  rhs_mode = Residual;
702  assembly(true, // Residual
703  false); // Jacobian
704  rhs->close();
705  nonlinear_residual_afterstep = rhs->l2_norm();
706 
707 
708  // In a "normal" Newton step, ||du||/||R|| > 1 since the most recent
709  // step is where you "just were" and the current residual is where
710  // you are now. It can occur that ||du||/||R|| < 1, but these are
711  // likely not good cases to attempt backtracking (?).
712  const Real norm_du_norm_R = delta_u->l2_norm() / nonlinear_residual_afterstep;
713  if (!quiet)
714  libMesh::out << " norm_du_norm_R=" << norm_du_norm_R << std::endl;
715 
716 
717  // Factor to decrease the stepsize by for backtracking
718  Real newton_stepfactor = 1.;
719 
720  const bool attempt_backtracking =
721  (nonlinear_residual_afterstep > solution_tolerance)
722  && (nonlinear_residual_afterstep > nonlinear_residual_beforestep)
723  && (n_backtrack_steps>0)
724  && (norm_du_norm_R > 1.)
725  ;
726 
727  // If residual is not reduced, do Newton back tracking.
728  if (attempt_backtracking)
729  {
730  if (!quiet)
731  libMesh::out << "Newton step did not reduce residual." << std::endl;
732 
733  // back off the previous step.
734  solution->add(-1., *delta_u);
735  solution->close();
736  *continuation_parameter -= delta_lambda;
737 
738  // Backtracking: start cutting the Newton stepsize by halves until
739  // the new residual is actually smaller...
740  for (unsigned int backtrack_step=0; backtrack_step<n_backtrack_steps; ++backtrack_step)
741  {
742  newton_stepfactor *= 0.5;
743 
744  if (!quiet)
745  libMesh::out << "Shrinking step size by " << newton_stepfactor << std::endl;
746 
747  // Take fractional step
748  solution->add(newton_stepfactor, *delta_u);
749  solution->close();
750  *continuation_parameter += newton_stepfactor*delta_lambda;
751 
752  rhs_mode = Residual;
753  assembly(true, // Residual
754  false); // Jacobian
755  rhs->close();
756  nonlinear_residual_afterstep = rhs->l2_norm();
757 
758  if (!quiet)
759  libMesh::out << "At shrink step "
760  << backtrack_step
761  << ", nonlinear_residual_afterstep="
762  << nonlinear_residual_afterstep
763  << std::endl;
764 
765  if (nonlinear_residual_afterstep < nonlinear_residual_beforestep)
766  {
767  if (!quiet)
768  libMesh::out << "Backtracking succeeded!" << std::endl;
769 
770  break; // out of backtracking loop
771  }
772 
773  else
774  {
775  // Back off that step
776  solution->add(-newton_stepfactor, *delta_u);
777  solution->close();
778  *continuation_parameter -= newton_stepfactor*delta_lambda;
779  }
780 
781  // Save a copy of the solution from before the Newton step.
782  //UniquePtr<NumericVector<Number> > prior_iterate = solution->clone();
783  }
784  } // end if (attempte_backtracking)
785 
786 
787  // If we tried backtracking but the residual is still not reduced, print message.
788  if ((attempt_backtracking) && (nonlinear_residual_afterstep > nonlinear_residual_beforestep))
789  {
790  //libMesh::err << "Backtracking failed." << std::endl;
791  libMesh::out << "Backtracking failed." << std::endl;
792 
793  // 1.) Quit, exit program.
794  //libmesh_error_msg("Backtracking failed!");
795 
796  // 2.) Continue with last newton_stepfactor
797  if (newton_step<3)
798  {
799  solution->add(newton_stepfactor, *delta_u);
800  solution->close();
801  *continuation_parameter += newton_stepfactor*delta_lambda;
802  if (!quiet)
803  libMesh::out << "Backtracking could not reduce residual ... continuing anyway!" << std::endl;
804  }
805 
806  // 3.) Break out of Newton iteration loop with newton_converged = false,
807  // reduce the arclength stepsize, and try again.
808  else
809  {
810  break; // out of Newton iteration loop, with newton_converged=false
811  }
812  }
813 
814  // Another type of convergence check: suppose the residual has not been reduced
815  // from its initial value after half of the allowed Newton steps have occurred.
816  // In our experience, this typically means that it isn't going to converge and
817  // we could probably save time by dropping out of the Newton iteration loop and
818  // trying a smaller arcstep.
819  if (this->newton_progress_check)
820  {
821  if ((nonlinear_residual_afterstep > nonlinear_residual_firststep) &&
822  (newton_step+1 > static_cast<unsigned int>(0.5*newton_solver->max_nonlinear_iterations)))
823  {
824  libMesh::out << "Progress check failed: the current residual: "
825  << nonlinear_residual_afterstep
826  << ", is\n"
827  << "larger than the initial residual, and half of the allowed\n"
828  << "number of Newton iterations have elapsed.\n"
829  << "Exiting Newton iterations with converged==false." << std::endl;
830 
831  break; // out of Newton iteration loop, newton_converged = false
832  }
833  }
834 
835  // Safety check: Check the current continuation parameter against user-provided min-allowable parameter value
837  {
838  libMesh::out << "Continuation parameter fell below min-allowable value." << std::endl;
839  break; // out of Newton iteration loop, newton_converged = false
840  }
841 
842  // Safety check: Check the current continuation parameter against user-provided max-allowable parameter value
843  if ( (max_continuation_parameter != 0.0) &&
845  {
846  libMesh::out << "Current continuation parameter value: "
848  << " exceeded max-allowable value."
849  << std::endl;
850  break; // out of Newton iteration loop, newton_converged = false
851  }
852 
853 
854  // Check the convergence of the parameter and the solution. If they are small
855  // enough, we can break out of the Newton iteration loop.
856  const Real norm_delta_u = delta_u->l2_norm();
857  const Real norm_u = solution->l2_norm();
858  libMesh::out << " delta_lambda = " << delta_lambda << std::endl;
859  libMesh::out << " newton_stepfactor*delta_lambda = " << newton_stepfactor*delta_lambda << std::endl;
860  libMesh::out << " lambda_current = " << *continuation_parameter << std::endl;
861  libMesh::out << " ||delta_u|| = " << norm_delta_u << std::endl;
862  libMesh::out << " ||delta_u||/||u|| = " << norm_delta_u / norm_u << std::endl;
863 
864 
865  // Evaluate the residual at the current Newton iterate. We don't want to detect
866  // convergence due to a small Newton step when the residual is still not small.
867  rhs_mode = Residual;
868  assembly(true, // Residual
869  false); // Jacobian
870  rhs->close();
871  const Real norm_residual = rhs->l2_norm();
872  libMesh::out << " ||R||_{L2} = " << norm_residual << std::endl;
873  libMesh::out << " ||R||_{L2}/||u|| = " << norm_residual / norm_u << std::endl;
874 
875 
876  // FIXME: The norm_delta_u tolerance (at least) should be relative.
877  // It doesn't make sense to converge a solution whose size is ~ 10^5 to
878  // a tolerance of 1.e-6. Oh, and we should also probably check the
879  // (relative) size of the residual as well, instead of just the step.
880  if ((std::abs(delta_lambda) < continuation_parameter_tolerance) &&
881  //(norm_delta_u < solution_tolerance) && // This is a *very* strict criterion we can probably skip
882  (norm_residual < solution_tolerance))
883  {
884  if (!quiet)
885  libMesh::out << "Newton iterations converged!" << std::endl;
886 
887  newton_converged = true;
888  break; // out of Newton iterations
889  }
890  } // end nonlinear loop
891 
892  if (!newton_converged)
893  {
894  libMesh::out << "Newton iterations of augmented system did not converge!" << std::endl;
895 
896  // Reduce ds_current, recompute the solution and parameter, and continue to next
897  // arcstep, if there is one.
898  ds_current *= 0.5;
899 
900  // Go back to previous solution and parameter value.
901  *solution = *previous_u;
903 
904  // Compute new predictor with smaller ds
905  apply_predictor();
906  }
907  else
908  {
909  // Set step convergence and break out
910  arcstep_converged=true;
911  break; // out of arclength reduction loop
912  }
913 
914  } // end loop over arclength reductions
915 
916  // Check for convergence of the whole arcstep. If not converged at this
917  // point, we have no choice but to quit.
918  if (!arcstep_converged)
919  libmesh_error_msg("Arcstep failed to converge after max number of reductions! Exiting...");
920 
921  // Print converged solution control parameter and max value.
922  libMesh::out << "lambda_current=" << *continuation_parameter << std::endl;
923  //libMesh::out << "u_max=" << solution->max() << std::endl;
924 
925  // Reset old stream precision and flags.
926  libMesh::out.precision(old_precision);
927  libMesh::out.unsetf(std::ios_base::scientific);
928 
929  // Note: we don't want to go on to the next guess yet, since the user may
930  // want to post-process this data. It's up to the user to call advance_arcstep()
931  // when they are ready to go on.
932 }
T libmesh_real(T a)
double abs(double a)
UniquePtr< TimeSolver > time_solver
Definition: diff_system.h:210
NumericVector< Number > * previous_u
virtual T dot(const NumericVector< T > &) const =0
UniquePtr< LinearSolver< Number > > linear_solver
virtual Real l2_norm() const =0
unsigned int max_nonlinear_iterations
Definition: diff_solver.h:154
NumericVector< Number > * delta_u
NumericVector< Number > * rhs
virtual void zero()=0
virtual void scale(const T factor)=0
NumericVector< Number > * du_ds
NumericVector< Number > * z
unsigned int max_linear_iterations
Definition: diff_solver.h:146
NumericVector< Number > * y_old
NumericVector< Number > * y
void unsetf(std::ios_base::fmtflags mask)
UniquePtr< NumericVector< Number > > solution
Definition: system.h:1512
double pow(double a, int b)
virtual void close()=0
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::ios_base::fmtflags setf(std::ios_base::fmtflags fmtfl)
SparseMatrix< Number > * matrix
virtual void assembly(bool get_residual, bool get_jacobian, bool apply_heterogeneous_constraints=false) libmesh_override
Definition: fem_system.C:845
virtual void close() const =0
virtual void add(const numeric_index_type i, const T value)=0
OStreamProxy out(std::cout)
long double min(long double a, double b)
std::streamsize precision() const
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 187 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(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::HPCoarsenTest::select_refinement(), libMesh::EnsightIO::write_scalar_ascii(), and libMesh::EnsightIO::write_vector_ascii().

188 {
189  // Check the sizes
190  libmesh_assert_less (global_dof_number, _dof_map->n_dofs());
191  libmesh_assert_less (global_dof_number, current_local_solution->size());
192 
193  return (*current_local_solution)(global_dof_number);
194 }
UniquePtr< NumericVector< Number > > current_local_solution
Definition: system.h:1524
UniquePtr< DofMap > _dof_map
Definition: system.h:1854
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.

Definition at line 372 of file diff_physics.h.

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

373  {
374  return request_jacobian;
375  }
void libMesh::System::deactivate ( )
inlineinherited

Deactivates the system. Only active systems are solved.

Definition at line 2051 of file system.h.

References libMesh::System::_active.

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

2052 {
2053  _active = false;
2054 }
void libMesh::ImplicitSystem::disable_cache ( )
virtualinherited

Avoids use of any cached data that might affect any solve result. Should be overloaded in derived systems.

Reimplemented from libMesh::System.

Definition at line 298 of file implicit_system.C.

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

298  {
299  this->assemble_before_solve = true;
300  this->get_linear_solver()->reuse_preconditioner(false);
301 }
virtual LinearSolver< Number > * get_linear_solver() const
virtual void reuse_preconditioner(bool)
bool assemble_before_solve
Definition: system.h:1465
void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited
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().

Definition at line 142 of file diff_physics.h.

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

143  {
144  return request_jacobian;
145  }
virtual void libMesh::DifferentiableSystem::element_postprocess ( DiffContext )
inlinevirtualinherited

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

Definition at line 258 of file diff_system.h.

258 {}
virtual void libMesh::DifferentiableQoI::element_qoi ( DiffContext ,
const QoISet  
)
inlinevirtualinherited

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.

Definition at line 107 of file diff_qoi.h.

109  {}
virtual void libMesh::DifferentiableQoI::element_qoi_derivative ( DiffContext ,
const QoISet  
)
inlinevirtualinherited

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.

Definition at line 119 of file diff_qoi.h.

121  {}
virtual bool libMesh::DifferentiablePhysics::element_time_derivative ( bool  request_jacobian,
DiffContext  
)
inlinevirtualinherited

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().

Definition at line 124 of file diff_physics.h.

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

125  {
126  return request_jacobian;
127  }
void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

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

Definition at line 100 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

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

101 {
102  _enable_print_counter = true;
103  return;
104 }
virtual bool libMesh::FEMPhysics::eulerian_residual ( bool  request_jacobian,
DiffContext context 
)
virtualinherited

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.

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

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.

Definition at line 292 of file diff_physics.h.

293  {
294  return request_jacobian;
295  }
void libMesh::ImplicitSystem::forward_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].

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 804 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_sensitivity_solution(), libMesh::QoISet::has_index(), libMesh::ImplicitSystem::matrix, std::max(), libMesh::System::qoi, libMesh::Real, libMesh::ExplicitSystem::rhs, libMesh::ImplicitSystem::sensitivity_solve(), libMesh::ParameterVector::size(), and libMesh::TOLERANCE.

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

807 {
808  ParameterVector & parameters =
809  const_cast<ParameterVector &>(parameters_in);
810 
811  const unsigned int Np = cast_int<unsigned int>
812  (parameters.size());
813  const unsigned int Nq = cast_int<unsigned int>
814  (qoi.size());
815 
816  // An introduction to the problem:
817  //
818  // Residual R(u(p),p) = 0
819  // partial R / partial u = J = system matrix
820  //
821  // This implies that:
822  // d/dp(R) = 0
823  // (partial R / partial p) +
824  // (partial R / partial u) * (partial u / partial p) = 0
825 
826  // We first solve for (partial u / partial p) for each parameter:
827  // J * (partial u / partial p) = - (partial R / partial p)
828 
829  this->sensitivity_solve(parameters);
830 
831  // Get ready to fill in senstivities:
832  sensitivities.allocate_data(qoi_indices, *this, parameters);
833 
834  // We use the identity:
835  // dq/dp = (partial q / partial p) + (partial q / partial u) *
836  // (partial u / partial p)
837 
838  // We get (partial q / partial u) from the user
839  this->assemble_qoi_derivative(qoi_indices,
840  /* include_liftfunc = */ true,
841  /* apply_constraints = */ false);
842 
843  // We don't need these to be closed() in this function, but libMesh
844  // standard practice is to have them closed() by the time the
845  // function exits
846  for (std::size_t i=0; i != this->qoi.size(); ++i)
847  if (qoi_indices.has_index(i))
848  this->get_adjoint_rhs(i).close();
849 
850  for (unsigned int j=0; j != Np; ++j)
851  {
852  // We currently get partial derivatives via central differencing
853 
854  // (partial q / partial p) ~= (q(p+dp)-q(p-dp))/(2*dp)
855 
856  Number old_parameter = *parameters[j];
857 
858  const Real delta_p =
859  TOLERANCE * std::max(std::abs(old_parameter), 1e-3);
860 
861  *parameters[j] = old_parameter - delta_p;
862  this->assemble_qoi(qoi_indices);
863  std::vector<Number> qoi_minus = this->qoi;
864 
865  *parameters[j] = old_parameter + delta_p;
866  this->assemble_qoi(qoi_indices);
867  std::vector<Number> & qoi_plus = this->qoi;
868 
869  std::vector<Number> partialq_partialp(Nq, 0);
870  for (unsigned int i=0; i != Nq; ++i)
871  if (qoi_indices.has_index(i))
872  partialq_partialp[i] = (qoi_plus[i] - qoi_minus[i]) / (2.*delta_p);
873 
874  // Don't leave the parameter changed
875  *parameters[j] = old_parameter;
876 
877  for (unsigned int i=0; i != Nq; ++i)
878  if (qoi_indices.has_index(i))
879  sensitivities[i][j] = partialq_partialp[i] +
880  this->get_adjoint_rhs(i).dot(this->get_sensitivity_solution(j));
881  }
882 
883  // All parameters have been reset.
884  // We didn't cache the original rhs or matrix for memory reasons,
885  // but we can restore them to a state consistent solution -
886  // principle of least surprise.
887  this->assembly(true, true);
888  this->rhs->close();
889  this->matrix->close();
890  this->assemble_qoi(qoi_indices);
891 }
double abs(double a)
virtual T dot(const NumericVector< T > &) const =0
NumericVector< Number > & get_sensitivity_solution(unsigned int i=0)
Definition: system.C:930
virtual std::pair< unsigned int, Real > sensitivity_solve(const ParameterVector &parameters) libmesh_override
NumericVector< Number > * rhs
static const Real TOLERANCE
long double max(long double a, double b)
virtual void assemble_qoi_derivative(const QoISet &qoi_indices=QoISet(), bool include_liftfunc=true, bool apply_constraints=true) libmesh_override
std::vector< Number > qoi
Definition: system.h:1543
virtual void close()=0
virtual void assembly(bool, bool, bool=false)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
SparseMatrix< Number > * matrix
virtual void assemble_qoi(const QoISet &qoi_indices=QoISet()) libmesh_override
virtual void close() const =0
NumericVector< Number > & get_adjoint_rhs(unsigned int i=0)
Definition: system.C:1045
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 1045 of file system.C.

References libMesh::System::get_vector().

Referenced by libMesh::ImplicitSystem::adjoint_solve(), libMesh::ImplicitSystem::forward_qoi_parameter_sensitivity(), libMesh::System::project_solution_on_reinit(), libMesh::ImplicitSystem::qoi_parameter_hessian(), libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product(), and libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve().

1046 {
1047  std::ostringstream adjoint_rhs_name;
1048  adjoint_rhs_name << "adjoint_rhs" << i;
1049 
1050  return this->get_vector(adjoint_rhs_name.str());
1051 }
const NumericVector< Number > & get_vector(const std::string &vec_name) const
Definition: system.C:788
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 1055 of file system.C.

References libMesh::System::get_vector().

1056 {
1057  std::ostringstream adjoint_rhs_name;
1058  adjoint_rhs_name << "adjoint_rhs" << i;
1059 
1060  return this->get_vector(adjoint_rhs_name.str());
1061 }
const NumericVector< Number > & get_vector(const std::string &vec_name) const
Definition: system.C:788
NumericVector< Number > & libMesh::System::get_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.

Definition at line 983 of file system.C.

References libMesh::System::get_vector().

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::ImplicitSystem::adjoint_solve(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::AdjointResidualErrorEstimator::estimate_error(), libMesh::System::project_solution_on_reinit(), libMesh::ImplicitSystem::qoi_parameter_hessian(), libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product(), and libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve().

984 {
985  std::ostringstream adjoint_name;
986  adjoint_name << "adjoint_solution" << i;
987 
988  return this->get_vector(adjoint_name.str());
989 }
const NumericVector< Number > & get_vector(const std::string &vec_name) const
Definition: system.C:788
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 993 of file system.C.

References libMesh::System::get_vector().

994 {
995  std::ostringstream adjoint_name;
996  adjoint_name << "adjoint_solution" << i;
997 
998  return this->get_vector(adjoint_name.str());
999 }
const NumericVector< Number > & get_vector(const std::string &vec_name) const
Definition: system.C:788
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 1272 of file system.C.

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

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

1273 {
1274  all_variable_numbers.resize(n_vars());
1275 
1276  // Make sure the variable exists
1277  std::map<std::string, unsigned short int>::const_iterator
1278  it = _variable_numbers.begin();
1279  std::map<std::string, unsigned short int>::const_iterator
1280  it_end = _variable_numbers.end();
1281 
1282  unsigned int count = 0;
1283  for( ; it != it_end; ++it)
1284  {
1285  all_variable_numbers[count] = it->second;
1286  count++;
1287  }
1288 }
std::map< std::string, unsigned short int > _variable_numbers
Definition: system.h:1892
unsigned int n_vars() const
Definition: system.h:2075
const DofMap & libMesh::System::get_dof_map ( ) const
inlineinherited
Returns
a constant reference to this system's _dof_map.

Definition at line 2019 of file system.h.

References libMesh::System::_dof_map.

Referenced by libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::__libmesh_petsc_snes_postcheck(), libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::DifferentiableSystem::add_dot_var_dirichlet_bcs(), libMesh::HPCoarsenTest::add_projection(), libMesh::UnsteadySolver::adjoint_advance_timestep(), libMesh::ImplicitSystem::adjoint_solve(), libMesh::NewmarkSolver::advance_timestep(), libMesh::UnsteadySolver::advance_timestep(), libMesh::EquationSystems::allgather(), libMesh::EquationSystems::build_discontinuous_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::System::calculate_norm(), libMesh::Problem_Interface::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), DMCreateDomainDecomposition_libMesh(), DMCreateFieldDecomposition_libMesh(), DMlibMeshFunction(), DMlibMeshJacobian(), DMlibMeshSetSystem_libMesh(), libMesh::DofMap::enforce_constraints_exactly(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::System::get_info(), libMesh::EquationSystems::get_solution(), libMesh::SystemSubsetBySubdomain::init(), libMesh::SecondOrderUnsteadySolver::init_data(), libMesh::UnsteadySolver::init_data(), libMesh::EigenSystem::init_matrices(), libMesh::ImplicitSystem::init_matrices(), libMesh::CondensedEigenSystem::initialize_condensed_dofs(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), libMesh::System::local_dof_indices(), libMesh::DofMap::max_constraint_error(), libMesh::DGFEMContext::neighbor_side_fe_reinit(), libMesh::UnsteadySolver::old_nonlinear_solution(), libMesh::SecondOrderUnsteadySolver::old_solution_accel(), libMesh::SecondOrderUnsteadySolver::old_solution_rate(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::operator()(), libMesh::BuildProjectionList::operator()(), libMesh::BoundaryProjectSolution::operator()(), 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::System::re_update(), libMesh::SecondOrderUnsteadySolver::reinit(), libMesh::UnsteadySolver::reinit(), libMesh::ImplicitSystem::reinit(), libMesh::EigenSystem::reinit(), libMesh::EquationSystems::reinit(), libMesh::System::reinit_constraints(), libMesh::UnsteadySolver::retrieve_timestep(), libMesh::HPCoarsenTest::select_refinement(), libMesh::ImplicitSystem::sensitivity_solve(), libMesh::NewtonSolver::solve(), libMesh::PetscDiffSolver::solve(), libMesh::PetscNonlinearSolver< T >::solve(), libMesh::System::system_type(), libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve(), libMesh::ImplicitSystem::weighted_sensitivity_solve(), libMesh::EnsightIO::write_scalar_ascii(), and libMesh::EnsightIO::write_vector_ascii().

2020 {
2021  return *_dof_map;
2022 }
UniquePtr< DofMap > _dof_map
Definition: system.h:1854
DofMap & libMesh::System::get_dof_map ( )
inlineinherited
Returns
a writeable reference to this system's _dof_map.

Definition at line 2027 of file system.h.

References libMesh::System::_dof_map.

2028 {
2029  return *_dof_map;
2030 }
UniquePtr< DofMap > _dof_map
Definition: system.h:1854
EquationSystems& libMesh::System::get_equation_systems ( )
inlineinherited
Returns
a reference to this system's parent EquationSystems object.

Definition at line 716 of file system.h.

References libMesh::System::_equation_systems, libMesh::System::activate(), libMesh::System::active(), libMesh::System::deactivate(), and libMesh::System::set_basic_system_only().

716 { return _equation_systems; }
EquationSystems & _equation_systems
Definition: system.h:1860
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 515 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_first_order_vars.

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

516  { return _first_order_vars; }
std::set< unsigned int > _first_order_vars
Definition: diff_physics.h:557
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 (Counts::iterator it = _counts.begin();
59  it != _counts.end(); ++it)
60  {
61  const std::string name(it->first);
62  const unsigned int creations = it->second.first;
63  const unsigned int destructions = it->second.second;
64 
65  oss << "| " << name << " reference count information:\n"
66  << "| Creations: " << creations << '\n'
67  << "| Destructions: " << destructions << '\n';
68  }
69 
70  oss << " ---------------------------------------------------------------------------- \n";
71 
72  return oss.str();
73 
74 #else
75 
76  return "";
77 
78 #endif
79 }
std::string name(const ElemQuality q)
Definition: elem_quality.C:39
std::string libMesh::System::get_info ( ) const
inherited
Returns
a string containing information about the system.

Definition at line 1682 of file system.C.

References libMesh::FEType::family, libMesh::System::get_dof_map(), libMesh::DofMap::get_info(), libMesh::FEType::inf_map, 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().

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

1683 {
1684  std::ostringstream oss;
1685 
1686 
1687  const std::string & sys_name = this->name();
1688 
1689  oss << " System #" << this->number() << ", \"" << sys_name << "\"\n"
1690  << " Type \"" << this->system_type() << "\"\n"
1691  << " Variables=";
1692 
1693  for (unsigned int vg=0; vg<this->n_variable_groups(); vg++)
1694  {
1695  const VariableGroup & vg_description (this->variable_group(vg));
1696 
1697  if (vg_description.n_variables() > 1) oss << "{ ";
1698  for (unsigned int vn=0; vn<vg_description.n_variables(); vn++)
1699  oss << "\"" << vg_description.name(vn) << "\" ";
1700  if (vg_description.n_variables() > 1) oss << "} ";
1701  }
1702 
1703  oss << '\n';
1704 
1705  oss << " Finite Element Types=";
1706 #ifndef LIBMESH_ENABLE_INFINITE_ELEMENTS
1707  for (unsigned int vg=0; vg<this->n_variable_groups(); vg++)
1708  oss << "\""
1709  << Utility::enum_to_string<FEFamily>(this->get_dof_map().variable_group(vg).type().family)
1710  << "\" ";
1711 #else
1712  for (unsigned int vg=0; vg<this->n_variable_groups(); vg++)
1713  {
1714  oss << "\""
1715  << Utility::enum_to_string<FEFamily>(this->get_dof_map().variable_group(vg).type().family)
1716  << "\", \""
1717  << Utility::enum_to_string<FEFamily>(this->get_dof_map().variable_group(vg).type().radial_family)
1718  << "\" ";
1719  }
1720 
1721  oss << '\n' << " Infinite Element Mapping=";
1722  for (unsigned int vg=0; vg<this->n_variable_groups(); vg++)
1723  oss << "\""
1724  << Utility::enum_to_string<InfMapType>(this->get_dof_map().variable_group(vg).type().inf_map)
1725  << "\" ";
1726 #endif
1727 
1728  oss << '\n';
1729 
1730  oss << " Approximation Orders=";
1731  for (unsigned int vg=0; vg<this->n_variable_groups(); vg++)
1732  {
1733 #ifndef LIBMESH_ENABLE_INFINITE_ELEMENTS
1734  oss << "\""
1735  << Utility::enum_to_string<Order>(this->get_dof_map().variable_group(vg).type().order)
1736  << "\" ";
1737 #else
1738  oss << "\""
1739  << Utility::enum_to_string<Order>(this->get_dof_map().variable_group(vg).type().order)
1740  << "\", \""
1741  << Utility::enum_to_string<Order>(this->get_dof_map().variable_group(vg).type().radial_order)
1742  << "\" ";
1743 #endif
1744  }
1745 
1746  oss << '\n';
1747 
1748  oss << " n_dofs()=" << this->n_dofs() << '\n';
1749  oss << " n_local_dofs()=" << this->n_local_dofs() << '\n';
1750 #ifdef LIBMESH_ENABLE_CONSTRAINTS
1751  oss << " n_constrained_dofs()=" << this->n_constrained_dofs() << '\n';
1752  oss << " n_local_constrained_dofs()=" << this->n_local_constrained_dofs() << '\n';
1753 #endif
1754 
1755  oss << " " << "n_vectors()=" << this->n_vectors() << '\n';
1756  oss << " " << "n_matrices()=" << this->n_matrices() << '\n';
1757  // oss << " " << "n_additional_matrices()=" << this->n_additional_matrices() << '\n';
1758 
1759  oss << this->get_dof_map().get_info();
1760 
1761  return oss.str();
1762 }
FEFamily family
Definition: fe_type.h:206
dof_id_type n_constrained_dofs() const
Definition: system.C:150
const FEType & type() const
Definition: variable.h:119
std::string get_info() const
Definition: dof_map.C:2781
OrderWrapper radial_order
Definition: fe_type.h:238
OrderWrapper order
Definition: fe_type.h:200
const VariableGroup & variable_group(unsigned int vg) const
Definition: system.h:2113
const VariableGroup & variable_group(const unsigned int c) const
Definition: dof_map.h:1628
const std::string & name() const
Definition: system.h:1987
unsigned int n_variable_groups() const
Definition: system.h:2083
const DofMap & get_dof_map() const
Definition: system.h:2019
InfMapType inf_map
Definition: fe_type.h:259
virtual unsigned int n_matrices() const
Definition: system.h:2209
FEFamily radial_family
Definition: fe_type.h:251
dof_id_type n_local_dofs() const
Definition: system.C:180
virtual std::string system_type() const
Definition: system.h:470
dof_id_type n_local_constrained_dofs() const
Definition: system.C:165
unsigned int number() const
Definition: system.h:1995
dof_id_type n_dofs() const
Definition: system.C:143
unsigned int n_vectors() const
Definition: system.h:2203
std::pair< unsigned int, Real > libMesh::DifferentiableSystem::get_linear_solve_parameters ( ) const
virtualinherited

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 182 of file diff_system.C.

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

183 {
185  libmesh_assert_equal_to (&(time_solver->system()), this);
186  return std::make_pair(this->time_solver->diff_solver()->max_linear_iterations,
187  this->time_solver->diff_solver()->relative_residual_tolerance);
188 }
UniquePtr< TimeSolver > time_solver
Definition: diff_system.h:210
libmesh_assert(j)
LinearSolver< Number > * libMesh::DifferentiableSystem::get_linear_solver ( ) const
virtualinherited

Returns a pointer to a linear solver appropriate for use in adjoint and/or sensitivity solves

Reimplemented from libMesh::ImplicitSystem.

Definition at line 173 of file diff_system.C.

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

174 {
176  libmesh_assert_equal_to (&(time_solver->system()), this);
177  return this->time_solver->linear_solver().get();
178 }
UniquePtr< TimeSolver > time_solver
Definition: diff_system.h:210
libmesh_assert(j)
const SparseMatrix< Number > & libMesh::ImplicitSystem::get_matrix ( const std::string &  mat_name) const
inherited
Returns
a const reference to this system's additional matrix named mat_name. None of these matrices is involved in the solution process. Access is only granted when the matrix is already properly initialized.

Definition at line 255 of file implicit_system.C.

References libMesh::ImplicitSystem::_matrices.

Referenced by libMesh::NewmarkSystem::compute_matrix(), libMesh::EigenTimeSolver::solve(), and libMesh::NewmarkSystem::update_rhs().

256 {
257  // Make sure the matrix exists
258  const_matrices_iterator pos = _matrices.find (mat_name);
259 
260  if (pos == _matrices.end())
261  libmesh_error_msg("ERROR: matrix " << mat_name << " does not exist in this system!");
262 
263  return *(pos->second);
264 }
std::map< std::string, SparseMatrix< Number > * > _matrices
std::map< std::string, SparseMatrix< Number > * >::const_iterator const_matrices_iterator
SparseMatrix< Number > & libMesh::ImplicitSystem::get_matrix ( const std::string &  mat_name)
inherited
Returns
a writeable reference to this system's additional matrix named mat_name. None of these matrices is involved in the solution process. Access is only granted when the matrix is already properly initialized.

Definition at line 268 of file implicit_system.C.

References libMesh::ImplicitSystem::_matrices.

269 {
270  // Make sure the matrix exists
271  matrices_iterator pos = _matrices.find (mat_name);
272 
273  if (pos == _matrices.end())
274  libmesh_error_msg("ERROR: matrix " << mat_name << " does not exist in this system!");
275 
276  return *(pos->second);
277 }
std::map< std::string, SparseMatrix< Number > * > _matrices
std::map< std::string, SparseMatrix< Number > * >::iterator matrices_iterator
const MeshBase & libMesh::System::get_mesh ( ) const
inlineinherited
Returns
a constant reference to this systems's _mesh.

Definition at line 2003 of file system.h.

References libMesh::System::_mesh.

Referenced by libMesh::ExactSolution::_compute_error(), libMesh::HPCoarsenTest::add_projection(), libMesh::FEMSystem::assemble_qoi(), libMesh::FEMSystem::assemble_qoi_derivative(), libMesh::FEMSystem::assembly(), libMesh::System::calculate_norm(), DMCreateDomainDecomposition_libMesh(), DMCreateFieldDecomposition_libMesh(), DMlibMeshSetSystem_libMesh(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::AdjointResidualErrorEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::SystemSubsetBySubdomain::init(), libMesh::System::init_data(), libMesh::EigenSystem::init_matrices(), libMesh::ImplicitSystem::init_matrices(), libMesh::System::local_dof_indices(), libMesh::DofMap::max_constraint_error(), libMesh::FEMSystem::mesh_position_get(), libMesh::FEMSystem::mesh_position_set(), libMesh::BoundaryProjectSolution::operator()(), libMesh::petsc_auto_fieldsplit(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::FEMSystem::postprocess(), libMesh::ImplicitSystem::reinit(), libMesh::EigenSystem::reinit(), libMesh::HPSingularity::select_refinement(), libMesh::HPCoarsenTest::select_refinement(), libMesh::System::system_type(), and libMesh::System::zero_variable().

2004 {
2005  return _mesh;
2006 }
MeshBase & _mesh
Definition: system.h:1866
MeshBase & libMesh::System::get_mesh ( )
inlineinherited
Returns
a reference to this systems's _mesh.

Definition at line 2011 of file system.h.

References libMesh::System::_mesh.

2012 {
2013  return _mesh;
2014 }
MeshBase & _mesh
Definition: system.h:1866
const System * libMesh::DifferentiablePhysics::get_mesh_system ( ) const
inlineinherited

Returns a const reference to the system with variables corresponding to mesh nodal coordinates, or NULL if the mesh is fixed. Useful for ALE calculations.

Definition at line 622 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_mesh_sys.

Referenced by libMesh::FEMSystem::build_context(), and libMesh::DifferentiablePhysics::init_context().

623 {
624  return _mesh_sys;
625 }
System * libMesh::DifferentiablePhysics::get_mesh_system ( )
inlineinherited

Returns a reference to the system with variables corresponding to mesh nodal coordinates, or NULL if the mesh is fixed.

Definition at line 628 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_mesh_sys.

629 {
630  return _mesh_sys;
631 }
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 634 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_mesh_x_var.

Referenced by libMesh::FEMSystem::build_context(), and libMesh::DifferentiablePhysics::init_context().

635 {
636  return _mesh_x_var;
637 }
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 640 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_mesh_y_var.

Referenced by libMesh::FEMSystem::build_context(), and libMesh::DifferentiablePhysics::init_context().

641 {
642  return _mesh_y_var;
643 }
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 646 of file diff_physics.h.

References libMesh::DifferentiablePhysics::_mesh_z_var.

Referenced by libMesh::FEMSystem::build_context(), and libMesh::DifferentiablePhysics::init_context().

647 {
648  return _mesh_z_var;
649 }
const DifferentiablePhysics* libMesh::DifferentiableSystem::get_physics ( ) const
inlineinherited

Returns const reference to DifferentiablePhysics object. Note that if no external Physics object is attached, the default is this.

Definition at line 167 of file diff_system.h.

References libMesh::DifferentiableSystem::_diff_physics.

Referenced by libMesh::FEMSystem::build_context(), and libMesh::FEMSystem::init_context().

168  { return this->_diff_physics; }
DifferentiablePhysics * _diff_physics
Definition: diff_system.h:347
DifferentiablePhysics* libMesh::DifferentiableSystem::get_physics ( )
inlineinherited

Returns reference to DifferentiablePhysics object. Note that if no external Physics object is attached, the default is this.

Definition at line 174 of file diff_system.h.

References