libMesh
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Protected Types | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Static Protected Attributes | Private Attributes | List of all members
libMesh::RBConstruction Class Reference

This class is part of the rbOOmit framework. More...

#include <rb_construction.h>

Inheritance diagram for libMesh::RBConstruction:
[legend]

Public Types

typedef RBConstruction sys_type
 The type of system. More...
 
typedef RBConstructionBase< LinearImplicitSystemParent
 The type of the parent. More...
 
typedef Number(* ValueFunctionPointer) (const Point &p, const Parameters &Parameters, const std::string &sys_name, const std::string &unknown_name)
 Projects arbitrary functions onto the current solution. More...
 
typedef Gradient(* GradientFunctionPointer) (const Point &p, const Parameters &parameters, const std::string &sys_name, const std::string &unknown_name)
 
typedef std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> >::iterator vectors_iterator
 Vector iterator typedefs. More...
 
typedef std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> >::const_iterator const_vectors_iterator
 
typedef std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> >::iterator matrices_iterator
 Matrix iterator typedefs. More...
 
typedef std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> >::const_iterator const_matrices_iterator
 

Public Member Functions

 RBConstruction (EquationSystems &es, const std::string &name, const unsigned int number)
 Constructor. More...
 
 RBConstruction (RBConstruction &&)=default
 Special functions. More...
 
 RBConstruction (const RBConstruction &)=delete
 
RBConstructionoperator= (const RBConstruction &)=delete
 
RBConstructionoperator= (RBConstruction &&)=delete
 
virtual ~RBConstruction ()
 
virtual void solve_for_matrix_and_rhs (LinearSolver< Number > &input_solver, SparseMatrix< Number > &input_matrix, NumericVector< Number > &input_rhs)
 Assembles & solves the linear system A*x=b for the specified matrix input_matrix and right-hand side rhs. More...
 
void set_rb_evaluation (RBEvaluation &rb_eval_in)
 Set the RBEvaluation object. More...
 
RBEvaluationget_rb_evaluation ()
 Get a reference to the RBEvaluation object. More...
 
const RBEvaluationget_rb_evaluation () const
 
bool is_rb_eval_initialized () const
 
RBThetaExpansionget_rb_theta_expansion ()
 Get a reference to the RBThetaExpansion object that that belongs to rb_eval. More...
 
const RBThetaExpansionget_rb_theta_expansion () const
 
void set_rb_assembly_expansion (RBAssemblyExpansion &rb_assembly_expansion_in)
 Set the rb_assembly_expansion object. More...
 
RBAssemblyExpansionget_rb_assembly_expansion ()
 
sys_typesystem ()
 
virtual void clear () override
 Clear all the data structures associated with the system. More...
 
virtual std::string system_type () const override
 
virtual Real truth_solve (int plot_solution)
 Perform a "truth" solve, i.e. More...
 
virtual Real train_reduced_basis (const bool resize_rb_eval_data=true)
 Train the reduced basis. More...
 
Real train_reduced_basis_with_greedy (const bool resize_rb_eval_data)
 Train the reduced basis using the "Greedy algorithm.". More...
 
void enrich_basis_from_rhs_terms (const bool resize_rb_eval_data=true)
 This function computes one basis function for each rhs term. More...
 
void train_reduced_basis_with_POD ()
 Train the reduced basis using Proper Orthogonal Decomposition (POD). More...
 
virtual Real compute_max_error_bound ()
 (i) Compute the a posteriori error bound for each set of parameters in the training set, (ii) set current_parameters to the parameters that maximize the error bound, and (iii) return the maximum error bound. More...
 
const RBParametersget_greedy_parameter (unsigned int i)
 Return the parameters chosen during the i^th step of the Greedy algorithm. More...
 
void set_rel_training_tolerance (Real new_training_tolerance)
 Get/set the relative tolerance for the basis training. More...
 
Real get_rel_training_tolerance () const
 
void set_abs_training_tolerance (Real new_training_tolerance)
 Get/set the absolute tolerance for the basis training. More...
 
Real get_abs_training_tolerance () const
 
void set_normalize_rb_bound_in_greedy (bool normalize_rb_bound_in_greedy_in)
 Get/set the boolean to indicate if we normalize the RB error in the greedy. More...
 
bool get_normalize_rb_bound_in_greedy () const
 
virtual bool is_serial_training_type (const std::string &RB_training_type_in)
 
void set_RB_training_type (const std::string &RB_training_type_in)
 Get/set the string that determines the training type. More...
 
const std::string & get_RB_training_type () const
 
unsigned int get_Nmax () const
 Get/set Nmax, the maximum number of RB functions we are willing to compute. More...
 
virtual void set_Nmax (unsigned int Nmax)
 
virtual void load_basis_function (unsigned int i)
 Load the i^th RB function into the RBConstruction solution vector. More...
 
virtual void load_rb_solution ()
 Load the RB solution from the most recent solve with rb_eval into this system's solution vector. More...
 
Real compute_residual_dual_norm_slow (const unsigned int N)
 The slow (but simple, non-error prone) way to compute the residual dual norm. More...
 
SparseMatrix< Number > * get_inner_product_matrix ()
 Get a pointer to inner_product_matrix. More...
 
const SparseMatrix< Number > * get_inner_product_matrix () const
 
SparseMatrix< Number > * get_non_dirichlet_inner_product_matrix ()
 Get the non-Dirichlet (or more generally no-constraints) version of the inner-product matrix. More...
 
const SparseMatrix< Number > * get_non_dirichlet_inner_product_matrix () const
 
SparseMatrix< Number > * get_non_dirichlet_inner_product_matrix_if_avail ()
 Get the non-Dirichlet inner-product matrix if it's available, otherwise get the inner-product matrix with constraints. More...
 
const SparseMatrix< Number > * get_non_dirichlet_inner_product_matrix_if_avail () const
 
SparseMatrix< Number > * get_Aq (unsigned int q)
 Get a pointer to Aq. More...
 
SparseMatrix< Number > * get_non_dirichlet_Aq (unsigned int q)
 Get a pointer to non_dirichlet_Aq. More...
 
SparseMatrix< Number > * get_non_dirichlet_Aq_if_avail (unsigned int q)
 Get a pointer to non_dirichlet_Aq if it's available, otherwise get Aq. More...
 
virtual void initialize_rb_construction (bool skip_matrix_assembly=false, bool skip_vector_assembly=false)
 Allocate all the data structures necessary for the construction stage of the RB method. More...
 
NumericVector< Number > * get_Fq (unsigned int q)
 Get a pointer to Fq. More...
 
NumericVector< Number > * get_non_dirichlet_Fq (unsigned int q)
 Get a pointer to non-Dirichlet Fq. More...
 
NumericVector< Number > * get_non_dirichlet_Fq_if_avail (unsigned int q)
 Get a pointer to non_dirichlet_Fq if it's available, otherwise get Fq. More...
 
NumericVector< Number > * get_output_vector (unsigned int n, unsigned int q_l)
 Get a pointer to the n^th output. More...
 
NumericVector< Number > * get_non_dirichlet_output_vector (unsigned int n, unsigned int q_l)
 Get a pointer to non-Dirichlet output vector. More...
 
virtual void get_all_matrices (std::map< std::string, SparseMatrix< Number > *> &all_matrices)
 Get a map that stores pointers to all of the matrices. More...
 
virtual void get_all_vectors (std::map< std::string, NumericVector< Number > *> &all_vectors)
 Get a map that stores pointers to all of the vectors. More...
 
virtual void get_output_vectors (std::map< std::string, NumericVector< Number > *> &all_vectors)
 Get a map that stores pointers to all of the vectors. More...
 
virtual void assemble_affine_expansion (bool skip_matrix_assembly, bool skip_vector_assembly)
 Assemble the matrices and vectors for this system. More...
 
void assemble_inner_product_matrix (SparseMatrix< Number > *input_matrix, bool apply_dof_constraints=true)
 Assemble the inner product matrix and store it in input_matrix. More...
 
void assemble_Aq_matrix (unsigned int q, SparseMatrix< Number > *input_matrix, bool apply_dof_constraints=true)
 Assemble the q^th affine matrix and store it in input_matrix. More...
 
void assemble_Fq_vector (unsigned int q, NumericVector< Number > *input_vector, bool apply_dof_constraints=true)
 Assemble the q^th affine vector and store it in input_matrix. More...
 
void add_scaled_Aq (Number scalar, unsigned int q_a, SparseMatrix< Number > *input_matrix, bool symmetrize)
 Add the scaled q^th affine matrix to input_matrix. More...
 
virtual void write_riesz_representors_to_files (const std::string &riesz_representors_dir, const bool write_binary_residual_representors)
 Write out all the Riesz representor data to files. More...
 
virtual void read_riesz_representors_from_files (const std::string &riesz_representors_dir, const bool write_binary_residual_representors)
 Read in all the Riesz representor data from files. More...
 
virtual void recompute_all_residual_terms (const bool compute_inner_products=true)
 This function computes all of the residual representors, can be useful when restarting a basis training computation. More...
 
virtual void process_parameters_file (const std::string &parameters_filename)
 Read in from the file specified by parameters_filename and set the this system's member variables accordingly. More...
 
void set_rb_construction_parameters (unsigned int n_training_samples_in, bool deterministic_training_in, int training_parameters_random_seed_in, bool quiet_mode_in, unsigned int Nmax_in, Real rel_training_tolerance_in, Real abs_training_tolerance_in, bool normalize_rb_error_bound_in_greedy_in, const std::string &RB_training_type_in, const RBParameters &mu_min_in, const RBParameters &mu_max_in, const std::map< std::string, std::vector< Real >> &discrete_parameter_values_in, const std::map< std::string, bool > &log_scaling, std::map< std::string, std::vector< RBParameter >> *training_sample_list=nullptr)
 Set the state of this RBConstruction object based on the arguments to this function. More...
 
virtual void print_info () const
 Print out info that describes the current setup of this RBConstruction. More...
 
void print_basis_function_orthogonality () const
 Print out a matrix that shows the orthogonality of the RB basis functions. More...
 
unsigned int get_delta_N () const
 Get delta_N, the number of basis functions we add to the RB space per iteration of the greedy algorithm. More...
 
void set_inner_product_assembly (ElemAssembly &inner_product_assembly_in)
 Set the rb_assembly_expansion object. More...
 
ElemAssemblyget_inner_product_assembly ()
 
void set_energy_inner_product (const std::vector< Number > &energy_inner_product_coeffs_in)
 Specify the coefficients of the A_q operators to be used in the energy inner-product. More...
 
void zero_constrained_dofs_on_vector (NumericVector< Number > &vector) const
 It is sometimes useful to be able to zero vector entries that correspond to constrained dofs. More...
 
virtual bool check_if_zero_truth_solve () const
 
void set_convergence_assertion_flag (bool flag)
 Setter for the flag determining if convergence should be checked after each solve. More...
 
bool get_preevaluate_thetas_flag () const
 Get/set flag to pre-evaluate the theta functions. More...
 
void set_preevaluate_thetas_flag (bool flag)
 
void set_quiet_mode (bool quiet_mode_in)
 Set the quiet_mode flag. More...
 
bool is_quiet () const
 Is the system in quiet mode? More...
 
void set_normalize_solution_snapshots (bool value)
 Set the boolean option that indicates if we normalization solution snapshots or not. More...
 
numeric_index_type get_n_training_samples () const
 Get the number of global training samples. More...
 
numeric_index_type get_local_n_training_samples () const
 Get the total number of training samples local to this processor. More...
 
numeric_index_type get_first_local_training_index () const
 Get the first local index of the training parameters. More...
 
numeric_index_type get_last_local_training_index () const
 Get the last local index of the training parameters. More...
 
virtual void initialize_training_parameters (const RBParameters &mu_min, const RBParameters &mu_max, const unsigned int n_global_training_samples, const std::map< std::string, bool > &log_param_scale, const bool deterministic=true)
 Initialize the parameter ranges and indicate whether deterministic or random training parameters should be used and whether or not we want the parameters to be scaled logarithmically. More...
 
virtual void load_training_set (const std::map< std::string, std::vector< RBParameter >> &new_training_set)
 Overwrite the training parameters with new_training_set. More...
 
void set_training_parameter_values (const std::string &param_name, const std::vector< RBParameter > &values)
 Overwrite the local training samples for param_name using values. More...
 
void broadcast_parameters (const unsigned int proc_id)
 Broadcasts parameters from processor proc_id to all processors. More...
 
void set_training_random_seed (int seed)
 Set the seed that is used to randomly generate training parameters. More...
 
void set_deterministic_training_parameter_name (const std::string &name)
 In some cases we only want to allow discrete parameter values, instead of parameters that may take any value in a specified interval. More...
 
const std::string & get_deterministic_training_parameter_name () const
 Get the name of the parameter that we will generate deterministic training parameters for. More...
 
virtual void reinit () override
 Reinitializes the member data fields associated with the system, so that, e.g., assemble() may be used. More...
 
virtual void assemble () override
 Prepares matrix and _dof_map for matrix assembly. More...
 
virtual void restrict_solve_to (const SystemSubset *subset, const SubsetSolveMode subset_solve_mode=SUBSET_ZERO) override
 After calling this method, any solve will be limited to the given subset. More...
 
virtual void solve () override
 Assembles & solves the linear system A*x=b. More...
 
virtual LinearSolver< Number > * get_linear_solver () const override
 
virtual void assembly (bool get_residual, bool get_jacobian, bool apply_heterogeneous_constraints=false, bool apply_no_constraints=false) override
 Assembles a residual in rhs and/or a jacobian in matrix, as requested. More...
 
unsigned int n_linear_iterations () const
 
Real final_linear_residual () const
 
void attach_shell_matrix (ShellMatrix< Number > *shell_matrix)
 This function enables the user to provide a shell matrix, i.e. More...
 
void detach_shell_matrix ()
 Detaches a shell matrix. More...
 
ShellMatrix< Number > * get_shell_matrix ()
 
virtual void create_static_condensation () override
 Request that static condensation be performed for this system. More...
 
virtual void disable_cache () override
 Avoids use of any cached data that might affect any solve result. More...
 
virtual std::pair< unsigned int, Realget_linear_solve_parameters () const
 
virtual void assemble_residual_derivatives (const ParameterVector &parameters) override
 Residual parameter derivative function. More...
 
virtual std::pair< unsigned int, Realsensitivity_solve (const ParameterVector &parameters) override
 Assembles & solves the linear system(s) (dR/du)*u_p = -dR/dp, for those parameters contained within parameters. More...
 
virtual std::pair< unsigned int, Realweighted_sensitivity_solve (const ParameterVector &parameters, const ParameterVector &weights) override
 Assembles & solves the linear system(s) (dR/du)*u_w = sum(w_p*-dR/dp), for those parameters p contained within parameters weighted by the values w_p found within weights. More...
 
virtual std::pair< unsigned int, Realadjoint_solve (const QoISet &qoi_indices=QoISet()) override
 Assembles & solves the linear system (dR/du)^T*z = dq/du, for those quantities of interest q specified by qoi_indices. More...
 
virtual std::pair< unsigned int, Realweighted_sensitivity_adjoint_solve (const ParameterVector &parameters, const ParameterVector &weights, const QoISet &qoi_indices=QoISet()) override
 Assembles & solves the linear system(s) (dR/du)^T*z_w = sum(w_p*(d^2q/dudp - d^2R/dudp*z)), for those parameters p contained within parameters, weighted by the values w_p found within weights. More...
 
virtual void adjoint_qoi_parameter_sensitivity (const QoISet &qoi_indices, const ParameterVector &parameters, SensitivityData &sensitivities) override
 Solves for the derivative of each of the system's quantities of interest q in qoi[qoi_indices] with respect to each parameter in parameters, placing the result for qoi i and parameter j into sensitivities[i][j]. More...
 
virtual void forward_qoi_parameter_sensitivity (const QoISet &qoi_indices, const ParameterVector &parameters, SensitivityData &sensitivities) override
 Solves for the derivative of each of the system's quantities of interest q in qoi[qoi_indices] with respect to each parameter in parameters, placing the result for qoi i and parameter j into sensitivities[i][j]. More...
 
virtual void qoi_parameter_hessian (const QoISet &qoi_indices, const ParameterVector &parameters, SensitivityData &hessian) override
 For each of the system's quantities of interest q in qoi[qoi_indices], and for a vector of parameters p, the parameter sensitivity Hessian H_ij is defined as H_ij = (d^2 q)/(d p_i d p_j) This Hessian is the output of this method, where for each q_i, H_jk is stored in hessian.second_derivative(i,j,k). More...
 
virtual void qoi_parameter_hessian_vector_product (const QoISet &qoi_indices, const ParameterVector &parameters, const ParameterVector &vector, SensitivityData &product) override
 For each of the system's quantities of interest q in qoi[qoi_indices], and for a vector of parameters p, the parameter sensitivity Hessian H_ij is defined as H_ij = (d^2 q)/(d p_i d p_j) The Hessian-vector product, for a vector v_k in parameter space, is S_j = H_jk v_k This product is the output of this method, where for each q_i, S_j is stored in sensitivities[i][j]. More...
 
const SparseMatrix< Number > & get_system_matrix () const
 
SparseMatrix< Number > & get_system_matrix ()
 
StaticCondensationget_static_condensation ()
 
virtual void assemble_qoi (const QoISet &qoi_indices=QoISet()) override
 Prepares qoi for quantity of interest assembly, then calls user qoi function. More...
 
virtual void assemble_qoi_derivative (const QoISet &qoi_indices=QoISet(), bool include_liftfunc=true, bool apply_constraints=true) override
 Prepares adjoint_rhs for quantity of interest derivative assembly, then calls user qoi derivative function. More...
 
void init ()
 Initializes degrees of freedom on the current mesh. More...
 
virtual void reinit_constraints ()
 Reinitializes the constraints for this system. More...
 
virtual void reinit_mesh ()
 Reinitializes the system with a new mesh. More...
 
bool is_initialized () const
 
virtual void update ()
 Update the local values to reflect the solution on neighboring processors. More...
 
bool is_adjoint_already_solved () const
 Accessor for the adjoint_already_solved boolean. More...
 
void set_adjoint_already_solved (bool setting)
 Setter for the adjoint_already_solved boolean. More...
 
virtual void qoi_parameter_sensitivity (const QoISet &qoi_indices, const ParameterVector &parameters, SensitivityData &sensitivities)
 Solves for the derivative of each of the system's quantities of interest q in qoi[qoi_indices] with respect to each parameter in parameters, placing the result for qoi i and parameter j into sensitivities[i][j]. More...
 
virtual bool compare (const System &other_system, const Real threshold, const bool verbose) const
 
const std::string & name () const
 
void project_solution (FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, std::optional< ConstElemRange > active_local_range=std::nullopt, std::optional< std::vector< unsigned int >> variable_numbers=std::nullopt) const
 Projects arbitrary functions onto the current solution. More...
 
void project_solution (FEMFunctionBase< Number > *f, FEMFunctionBase< Gradient > *g=nullptr, std::optional< ConstElemRange > active_local_range=std::nullopt, std::optional< std::vector< unsigned int >> variable_numbers=std::nullopt) const
 Projects arbitrary functions onto the current solution. More...
 
void project_solution (ValueFunctionPointer fptr, GradientFunctionPointer gptr, const Parameters &parameters, std::optional< ConstElemRange > active_local_range=std::nullopt, std::optional< std::vector< unsigned int >> variable_numbers=std::nullopt) const
 This method projects an arbitrary function onto the solution via L2 projections and nodal interpolations on each element. More...
 
void project_vector (NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1, std::optional< ConstElemRange > active_local_range=std::nullopt, std::optional< std::vector< unsigned int >> variable_numbers=std::nullopt) const
 Projects arbitrary functions onto a vector of degree of freedom values for the current system. More...
 
void project_vector (NumericVector< Number > &new_vector, FEMFunctionBase< Number > *f, FEMFunctionBase< Gradient > *g=nullptr, int is_adjoint=-1, std::optional< ConstElemRange > active_local_range=std::nullopt, std::optional< std::vector< unsigned int >> variable_numbers=std::nullopt) const
 Projects arbitrary functions onto a vector of degree of freedom values for the current system. More...
 
void project_vector (ValueFunctionPointer fptr, GradientFunctionPointer gptr, const Parameters &parameters, NumericVector< Number > &new_vector, int is_adjoint=-1, std::optional< ConstElemRange > active_local_range=std::nullopt, std::optional< std::vector< unsigned int >> variable_numbers=std::nullopt) const
 Projects arbitrary functions onto a vector of degree of freedom values for the current system. More...
 
void boundary_project_solution (const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, std::optional< ConstElemRange > active_local_range=std::nullopt)
 Projects arbitrary boundary functions onto a vector of degree of freedom values for the current system. More...
 
void boundary_project_solution (const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, ValueFunctionPointer fptr, GradientFunctionPointer gptr, const Parameters &parameters, std::optional< ConstElemRange > active_local_range=std::nullopt)
 Projects arbitrary boundary functions onto a vector of degree of freedom values for the current system. More...
 
void boundary_project_vector (const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1, std::optional< ConstElemRange > active_local_range=std::nullopt) const
 Projects arbitrary boundary functions onto a vector of degree of freedom values for the current system. More...
 
void boundary_project_vector (const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, ValueFunctionPointer fptr, GradientFunctionPointer gptr, const Parameters &parameters, NumericVector< Number > &new_vector, int is_adjoint=-1, std::optional< ConstElemRange > active_local_range=std::nullopt) const
 Projects arbitrary boundary functions onto a vector of degree of freedom values for the current system. More...
 
unsigned int number () const
 
void update_global_solution (std::vector< Number > &global_soln) const
 Fill the input vector global_soln so that it contains the global solution on all processors. More...
 
void update_global_solution (std::vector< Number > &global_soln, const processor_id_type dest_proc) const
 Fill the input vector global_soln so that it contains the global solution on processor dest_proc. More...
 
const 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 ()
 Activates the system. More...
 
void deactivate ()
 Deactivates the system. More...
 
void set_basic_system_only ()
 Sets the system to be "basic only": i.e. More...
 
vectors_iterator vectors_begin ()
 Beginning of vectors container. More...
 
const_vectors_iterator vectors_begin () const
 Beginning of vectors container. More...
 
vectors_iterator vectors_end ()
 End of vectors container. More...
 
const_vectors_iterator vectors_end () const
 End of vectors container. More...
 
matrices_iterator matrices_begin ()
 Beginning of matrices container. More...
 
const_matrices_iterator matrices_begin () const
 Beginning of matrices container. More...
 
matrices_iterator matrices_end ()
 End of matrices container. More...
 
const_matrices_iterator matrices_end () const
 End of matrices container. More...
 
NumericVector< Number > & add_vector (std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
 Adds the additional vector vec_name to this system. More...
 
void remove_vector (std::string_view vec_name)
 Removes the additional vector vec_name from this system. More...
 
bool & project_solution_on_reinit (void)
 Tells the System whether or not to project the solution vector onto new grids when the system is reinitialized. More...
 
bool have_vector (std::string_view vec_name) const
 
const NumericVector< Number > * request_vector (std::string_view vec_name) const
 
NumericVector< Number > * request_vector (std::string_view vec_name)
 
const NumericVector< Number > * request_vector (const unsigned int vec_num) const
 
NumericVector< Number > * request_vector (const unsigned int vec_num)
 
const NumericVector< Number > & get_vector (std::string_view vec_name) const
 
NumericVector< Number > & get_vector (std::string_view vec_name)
 
const NumericVector< Number > & get_vector (const unsigned int vec_num) const
 
NumericVector< Number > & get_vector (const unsigned int vec_num)
 
const std::string & vector_name (const unsigned int vec_num) const
 
const std::string & vector_name (const NumericVector< Number > &vec_reference) const
 
void set_vector_as_adjoint (const std::string &vec_name, int qoi_num)
 Allows one to set the QoI index controlling whether the vector identified by vec_name represents a solution from the adjoint (qoi_num >= 0) or primal (qoi_num == -1) space. More...
 
int vector_is_adjoint (std::string_view vec_name) const
 
void set_vector_preservation (const std::string &vec_name, bool preserve)
 Allows one to set the boolean controlling whether the vector identified by vec_name should be "preserved": projected to new meshes, saved, etc. More...
 
bool vector_preservation (std::string_view vec_name) const
 
NumericVector< Number > & add_adjoint_solution (unsigned int i=0)
 
NumericVector< Number > & get_adjoint_solution (unsigned int i=0)
 
const NumericVector< Number > & get_adjoint_solution (unsigned int i=0) const
 
NumericVector< Number > & add_sensitivity_solution (unsigned int i=0)
 
NumericVector< Number > & get_sensitivity_solution (unsigned int i=0)
 
const NumericVector< Number > & get_sensitivity_solution (unsigned int i=0) const
 
NumericVector< Number > & add_weighted_sensitivity_adjoint_solution (unsigned int i=0)
 
NumericVector< Number > & get_weighted_sensitivity_adjoint_solution (unsigned int i=0)
 
const NumericVector< Number > & get_weighted_sensitivity_adjoint_solution (unsigned int i=0) const
 
NumericVector< Number > & add_weighted_sensitivity_solution ()
 
NumericVector< Number > & get_weighted_sensitivity_solution ()
 
const NumericVector< Number > & get_weighted_sensitivity_solution () const
 
NumericVector< Number > & add_adjoint_rhs (unsigned int i=0)
 
NumericVector< Number > & get_adjoint_rhs (unsigned int i=0)
 
const NumericVector< Number > & get_adjoint_rhs (unsigned int i=0) const
 
NumericVector< Number > & add_sensitivity_rhs (unsigned int i=0)
 
NumericVector< Number > & get_sensitivity_rhs (unsigned int i=0)
 
const NumericVector< Number > & get_sensitivity_rhs (unsigned int i=0) const
 
unsigned int n_vectors () const
 
unsigned int n_matrices () const
 
unsigned int n_vars () const
 
unsigned int n_variable_groups () const
 
unsigned int n_components () const
 
dof_id_type n_dofs () const
 
dof_id_type n_active_dofs () const
 
dof_id_type n_constrained_dofs () const
 
dof_id_type n_local_constrained_dofs () const
 
dof_id_type n_local_dofs () const
 
unsigned int add_variable (std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
 Adds the variable var to the list of variables for this system. More...
 
unsigned int add_variable (std::string_view var, const Order order=FIRST, const FEFamily=LAGRANGE, const std::set< subdomain_id_type > *const active_subdomains=nullptr, const bool p_refinement=true)
 Adds the variable var to the list of variables for this system. More...
 
unsigned int add_variables (const std::vector< std::string > &vars, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
 Adds the variables vars to the list of variables for this system. More...
 
unsigned int add_variables (const std::vector< std::string > &vars, const Order order=FIRST, const FEFamily=LAGRANGE, const std::set< subdomain_id_type > *const active_subdomains=nullptr, const bool p_refinement=true)
 Adds the variable var to the list of variables for this system. More...
 
unsigned int add_variable_array (const std::vector< std::string > &vars, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
 Adds variables vars to the list of variables for this system. More...
 
const Variablevariable (unsigned int var) const
 Return a constant reference to Variable var. More...
 
const VariableGroupvariable_group (unsigned int vg) const
 Return a constant reference to VariableGroup vg. More...
 
bool has_variable (std::string_view var) const
 
const std::string & variable_name (const unsigned int i) const
 
unsigned int variable_number (std::string_view var) const
 
void get_all_variable_numbers (std::vector< unsigned int > &all_variable_numbers) const
 Fills all_variable_numbers with all the variable numbers for the variables that have been added to this system. More...
 
unsigned int variable_scalar_number (std::string_view var, unsigned int component) const
 
unsigned int variable_scalar_number (unsigned int var_num, unsigned int component) const
 
const FETypevariable_type (const unsigned int i) const
 
const FETypevariable_type (std::string_view var) const
 
bool identify_variable_groups () const
 
void identify_variable_groups (const bool)
 Toggle automatic VariableGroup identification. More...
 
Real calculate_norm (const NumericVector< Number > &v, unsigned int var, FEMNormType norm_type, std::set< unsigned int > *skip_dimensions=nullptr) const
 
Real calculate_norm (const NumericVector< Number > &v, const SystemNorm &norm, std::set< unsigned int > *skip_dimensions=nullptr) const
 
void read_header (Xdr &io, std::string_view version, const bool read_header=true, const bool read_additional_data=true, const bool read_legacy_format=false)
 Reads the basic data header for this System. More...
 
template<typename ValType >
void read_serialized_data (Xdr &io, const bool read_additional_data=true)
 Reads additional data, namely vectors, for this System. More...
 
void read_serialized_data (Xdr &io, const bool read_additional_data=true)
 Non-templated version for backward compatibility. More...
 
template<typename InValType >
std::size_t read_serialized_vectors (Xdr &io, const std::vector< NumericVector< Number > *> &vectors) const
 Read a number of identically distributed vectors. More...
 
std::size_t read_serialized_vectors (Xdr &io, const std::vector< NumericVector< Number > *> &vectors) const
 Non-templated version for backward compatibility. More...
 
template<typename InValType >
void read_parallel_data (Xdr &io, const bool read_additional_data)
 Reads additional data, namely vectors, for this System. More...
 
void read_parallel_data (Xdr &io, const bool read_additional_data)
 Non-templated version for backward compatibility. More...
 
void write_header (Xdr &io, std::string_view version, const bool write_additional_data) const
 Writes the basic data header for this System. More...
 
void write_serialized_data (Xdr &io, const bool write_additional_data=true) const
 Writes additional data, namely vectors, for this System. More...
 
std::size_t write_serialized_vectors (Xdr &io, const std::vector< const NumericVector< Number > *> &vectors) const
 Serialize & write a number of identically distributed vectors. More...
 
void write_parallel_data (Xdr &io, const bool write_additional_data) const
 Writes additional data, namely vectors, for this System. More...
 
std::string get_info () const
 
void attach_init_function (void fptr(EquationSystems &es, const std::string &name))
 Register a user function to use in initializing the system. More...
 
void attach_init_object (Initialization &init)
 Register a user class to use to initialize the system. More...
 
void attach_assemble_function (void fptr(EquationSystems &es, const std::string &name))
 Register a user function to use in assembling the system matrix and RHS. More...
 
void attach_assemble_object (Assembly &assemble)
 Register a user object to use in assembling the system matrix and RHS. More...
 
void attach_constraint_function (void fptr(EquationSystems &es, const std::string &name))
 Register a user function for imposing constraints. More...
 
void attach_constraint_object (Constraint &constrain)
 Register a user object for imposing constraints. More...
 
bool has_constraint_object () const
 
Constraintget_constraint_object ()
 Return the user object for imposing constraints. More...
 
void attach_QOI_function (void fptr(EquationSystems &es, const std::string &name, const QoISet &qoi_indices))
 Register a user function for evaluating the quantities of interest, whose values should be placed in System::qoi. More...
 
void attach_QOI_object (QOI &qoi)
 Register a user object for evaluating the quantities of interest, whose values should be placed in System::qoi. More...
 
void attach_QOI_derivative (void fptr(EquationSystems &es, const std::string &name, const QoISet &qoi_indices, bool include_liftfunc, bool apply_constraints))
 Register a user function for evaluating derivatives of a quantity of interest with respect to test functions, whose values should be placed in System::rhs. More...
 
void attach_QOI_derivative_object (QOIDerivative &qoi_derivative)
 Register a user object for evaluating derivatives of a quantity of interest with respect to test functions, whose values should be placed in System::rhs. More...
 
virtual void user_initialization ()
 Calls user's attached initialization function, or is overridden by the user in derived classes. More...
 
virtual void user_assembly ()
 Calls user's attached assembly function, or is overridden by the user in derived classes. More...
 
virtual void user_constrain ()
 Calls user's attached constraint function, or is overridden by the user in derived classes. More...
 
virtual void user_QOI (const QoISet &qoi_indices)
 Calls user's attached quantity of interest function, or is overridden by the user in derived classes. More...
 
virtual void user_QOI_derivative (const QoISet &qoi_indices=QoISet(), bool include_liftfunc=true, bool apply_constraints=true)
 Calls user's attached quantity of interest derivative function, or is overridden by the user in derived classes. More...
 
virtual void re_update ()
 Re-update the local values when the mesh has changed. More...
 
virtual void restrict_vectors ()
 Restrict vectors after the mesh has coarsened. More...
 
virtual void prolong_vectors ()
 Prolong vectors after the mesh has refined. More...
 
Number current_solution (const dof_id_type global_dof_number) const
 
unsigned int n_qois () const
 Number of currently active quantities of interest. More...
 
void init_qois (unsigned int n_qois)
 Accessors for qoi and qoi_error_estimates vectors. More...
 
void set_qoi (unsigned int qoi_index, Number qoi_value)
 
void set_qoi (std::vector< Number > new_qoi)
 
Number get_qoi_value (unsigned int qoi_index) const
 
std::vector< Numberget_qoi_values () const
 Returns a copy of qoi, not a reference. More...
 
void set_qoi_error_estimate (unsigned int qoi_index, Number qoi_error_estimate)
 
Number get_qoi_error_estimate_value (unsigned int qoi_index) const
 
Number point_value (unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
 
Number point_value (unsigned int var, const Point &p, const Elem &e, const NumericVector< Number > *sol=nullptr) const
 
Number point_value (unsigned int var, const Point &p, const Elem *e) const
 Calls the version of point_value() which takes a reference. More...
 
Number point_value (unsigned int var, const Point &p, const NumericVector< Number > *sol) const
 Calls the parallel version of point_value(). More...
 
Gradient point_gradient (unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
 
Gradient point_gradient (unsigned int var, const Point &p, const Elem &e, const NumericVector< Number > *sol=nullptr) const
 
Gradient point_gradient (unsigned int var, const Point &p, const Elem *e) const
 Calls the version of point_gradient() which takes a reference. More...
 
Gradient point_gradient (unsigned int var, const Point &p, const NumericVector< Number > *sol) const
 Calls the parallel version of point_gradient(). More...
 
Tensor point_hessian (unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
 
Tensor point_hessian (unsigned int var, const Point &p, const Elem &e, const NumericVector< Number > *sol=nullptr) const
 
Tensor point_hessian (unsigned int var, const Point &p, const Elem *e) const
 Calls the version of point_hessian() which takes a reference. More...
 
Tensor point_hessian (unsigned int var, const Point &p, const NumericVector< Number > *sol) const
 Calls the parallel version of point_hessian(). More...
 
void local_dof_indices (const unsigned int var, std::set< dof_id_type > &var_indices) const
 Fills the std::set with the degrees of freedom on the local processor corresponding the the variable number passed in. More...
 
void zero_variable (NumericVector< Number > &v, unsigned int var_num) const
 Zeroes all dofs in v that correspond to variable number var_num. More...
 
bool get_project_with_constraints ()
 Setter and getter functions for project_with_constraints boolean. More...
 
void set_project_with_constraints (bool _project_with_constraints)
 
bool & hide_output ()
 
void projection_matrix (SparseMatrix< Number > &proj_mat) const
 This method creates a projection matrix which corresponds to the operation of project_vector between old and new solution spaces. More...
 
SparseMatrix< Number > & add_matrix (std::string_view mat_name, ParallelType type=PARALLEL, MatrixBuildType mat_build_type=MatrixBuildType::AUTOMATIC)
 Adds the additional matrix mat_name to this system. More...
 
template<template< typename > class>
SparseMatrix< Number > & add_matrix (std::string_view mat_name, ParallelType=PARALLEL)
 Adds the additional matrix mat_name to this system. More...
 
SparseMatrix< Number > & add_matrix (std::string_view mat_name, std::unique_ptr< SparseMatrix< Number >> matrix, ParallelType type=PARALLEL)
 Adds the additional matrix mat_name to this system. More...
 
void remove_matrix (std::string_view mat_name)
 Removes the additional matrix mat_name from this system. More...
 
bool have_matrix (std::string_view mat_name) const
 
const SparseMatrix< Number > * request_matrix (std::string_view mat_name) const
 
SparseMatrix< Number > * request_matrix (std::string_view mat_name)
 
const SparseMatrix< Number > & get_matrix (std::string_view mat_name) const
 
SparseMatrix< Number > & get_matrix (std::string_view mat_name)
 
void prefer_hash_table_matrix_assembly (bool preference)
 Sets whether to use hash table matrix assembly if the matrix sub-classes support it. More...
 
void prefix_with_name (bool value)
 Instructs this system to prefix solve options with its name for solvers that leverage prefixes. More...
 
bool prefix_with_name () const
 
std::string prefix () const
 
bool has_static_condensation () const
 
void solve_for_unconstrained_dofs (NumericVector< Number > &, int is_adjoint=-1) const
 
const Parallel::Communicatorcomm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 
void initialize_parameters (const RBParameters &mu_min_in, const RBParameters &mu_max_in, const std::map< std::string, std::vector< Real >> &discrete_parameter_values)
 Initialize the parameter ranges and set current_parameters. More...
 
void initialize_parameters (const RBParametrized &rb_parametrized)
 Initialize the parameter ranges and set current_parameters. More...
 
unsigned int get_n_params () const
 Get the number of parameters. More...
 
unsigned int get_n_continuous_params () const
 Get the number of continuous parameters. More...
 
unsigned int get_n_discrete_params () const
 Get the number of discrete parameters. More...
 
const RBParametersget_parameters () const
 Get the current parameters. More...
 
bool set_parameters (const RBParameters &params)
 Set the current parameters to params The parameters are checked for validity; an error is thrown if the number of parameters or samples is different than expected. More...
 
const RBParametersget_parameters_min () const
 Get an RBParameters object that specifies the minimum allowable value for each parameter. More...
 
const RBParametersget_parameters_max () const
 Get an RBParameters object that specifies the maximum allowable value for each parameter. More...
 
Real get_parameter_min (const std::string &param_name) const
 Get minimum allowable value of parameter param_name. More...
 
Real get_parameter_max (const std::string &param_name) const
 Get maximum allowable value of parameter param_name. More...
 
void print_parameters () const
 Print the current parameters. More...
 
void write_parameter_data_to_files (const std::string &continuous_param_file_name, const std::string &discrete_param_file_name, const bool write_binary_data)
 Write out the parameter ranges to files. More...
 
void read_parameter_data_from_files (const std::string &continuous_param_file_name, const std::string &discrete_param_file_name, const bool read_binary_data)
 Read in the parameter ranges from files. More...
 
bool is_discrete_parameter (const std::string &mu_name) const
 Is parameter mu_name discrete? More...
 
const std::map< std::string, std::vector< Real > > & get_discrete_parameter_values () const
 Get a const reference to the discrete parameter values. More...
 
void print_discrete_parameter_values () const
 Print out all the discrete parameter values. More...
 

Static Public Member Functions

static std::unique_ptr< DirichletBoundarybuild_zero_dirichlet_boundary_object ()
 It's helpful to be able to generate a DirichletBoundary that stores a ZeroFunction in order to impose Dirichlet boundary conditions. More...
 
static std::pair< std::size_t, std::size_t > generate_training_parameters_random (const Parallel::Communicator &communicator, const std::map< std::string, bool > &log_param_scale, std::map< std::string, std::vector< RBParameter >> &local_training_parameters_in, const unsigned int n_global_training_samples_in, const RBParameters &min_parameters, const RBParameters &max_parameters, const int training_parameters_random_seed=-1, const bool serial_training_set=false)
 Static helper function for generating a randomized set of parameters. More...
 
static std::pair< std::size_t, std::size_t > generate_training_parameters_deterministic (const Parallel::Communicator &communicator, const std::map< std::string, bool > &log_param_scale, std::map< std::string, std::vector< RBParameter >> &local_training_parameters_in, const unsigned int n_global_training_samples_in, const RBParameters &min_parameters, const RBParameters &max_parameters, const bool serial_training_set=false)
 Static helper function for generating a deterministic set of parameters. More...
 
static std::string get_info ()
 Gets a string containing the reference information. More...
 
static std::string get_info ()
 Gets a string containing the reference information. More...
 
static void print_info (std::ostream &out_stream=libMesh::out)
 Prints the reference information, by default to libMesh::out. More...
 
static void print_info (std::ostream &out_stream=libMesh::out)
 Prints the reference information, by default to libMesh::out. More...
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects. More...
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects. More...
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info() More...
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info() More...
 
static void disable_print_counter_info ()
 
static void disable_print_counter_info ()
 
static Real get_closest_value (Real value, const std::vector< Real > &list_of_values)
 

Public Attributes

std::vector< Realtraining_error_bounds
 Vector storing the values of the error bound for each parameter in the training set — the parameter giving the largest error bound is chosen for the next snapshot in the Greedy basis training. More...
 
std::unique_ptr< LinearSolver< Number > > inner_product_solver
 We store an extra linear solver object which we can optionally use for solving all systems in which the system matrix is set to inner_product_matrix. More...
 
LinearSolver< Number > * extra_linear_solver
 Also, we store a pointer to an extra linear solver. More...
 
std::unique_ptr< SparseMatrix< Number > > inner_product_matrix
 The inner product matrix. More...
 
std::vector< Numbertruth_outputs
 Vector storing the truth output values from the most recent truth solve. More...
 
std::vector< std::vector< Number > > output_dual_innerprods
 The vector storing the dual norm inner product terms for each output. More...
 
std::vector< std::unique_ptr< NumericVector< Number > > > Fq_representor
 Vector storing the residual representors associated with the right-hand side. More...
 
std::vector< NumberFq_representor_innerprods
 Vectors storing the residual representor inner products to be used in computing the residuals online. More...
 
bool skip_residual_in_train_reduced_basis
 Boolean flag to indicate if we skip residual calculations in train_reduced_basis. More...
 
bool exit_on_repeated_greedy_parameters
 Boolean flag to indicate whether we exit the greedy if we select the same parameters twice in a row. More...
 
bool impose_internal_fluxes
 Boolean flag to indicate whether we impose "fluxes" (i.e. More...
 
bool skip_degenerate_sides
 In some cases meshes are intentionally created with degenerate sides as a way to represent, say, triangles using a hex-only mesh. More...
 
bool compute_RB_inner_product
 Boolean flag to indicate whether we compute the RB_inner_product_matrix. More...
 
bool store_dirichlet_operators
 Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enforced. More...
 
bool store_non_dirichlet_operators
 Boolean flag to indicate whether we store a second copy of each affine operator and vector which does not have Dirichlet bcs enforced. More...
 
bool store_untransformed_basis
 Boolean flag to indicate whether we store a second copy of the basis without constraints or dof transformations applied to it. More...
 
bool use_empty_rb_solve_in_greedy
 A boolean flag to indicate whether or not we initialize the Greedy algorithm by performing rb_solves on the training set with an "empty" (i.e. More...
 
bool Fq_representor_innerprods_computed
 A boolean flag to indicate whether or not the Fq representor norms have already been computed — used to make sure that we don't recompute them unnecessarily. More...
 
SparseMatrix< Number > * matrix
 The system matrix. More...
 
bool zero_out_matrix_and_rhs
 By default, the system will zero out the matrix and the right hand side. More...
 
std::unique_ptr< LinearSolver< Number > > linear_solver
 This class handles all the details of interfacing with various linear algebra packages like PETSc or LASPACK. More...
 
NumericVector< Number > * rhs
 The system matrix. More...
 
Parameters parameters
 Parameters for the system. If a parameter is not provided, it should be retrieved from the EquationSystems. More...
 
bool assemble_before_solve
 Flag which tells the system to whether or not to call the user assembly function during each call to solve(). More...
 
bool use_fixed_solution
 A boolean to be set to true by systems using elem_fixed_solution, for optional use by e.g. More...
 
int extra_quadrature_order
 A member int that can be employed to indicate increased or reduced quadrature order. More...
 
std::unique_ptr< NumericVector< Number > > solution
 Data structure to hold solution values. More...
 
std::unique_ptr< NumericVector< Number > > current_local_solution
 All the values I need to compute my contribution to the simulation at hand. More...
 
Real time
 For time-dependent problems, this is the time t at the beginning of the current timestep. More...
 
bool verbose_mode
 Public boolean to toggle verbose mode. More...
 

Protected Types

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

Protected Member Functions

virtual void allocate_data_structures ()
 Helper function that actually allocates all the data structures required by this class. More...
 
virtual void truth_assembly ()
 Assemble the truth matrix and right-hand side for current_parameters. More...
 
virtual std::unique_ptr< DGFEMContextbuild_context ()
 Builds a DGFEMContext object with enough information to do evaluations on each element. More...
 
virtual SparseMatrix< Number > & get_matrix_for_output_dual_solves ()
 Return the matrix for the output residual dual norm solves. More...
 
virtual bool greedy_termination_test (Real abs_greedy_error, Real initial_greedy_error, int count)
 Function that indicates when to terminate the Greedy basis training. More...
 
void update_greedy_param_list ()
 Update the list of Greedily chosen parameters with current_parameters. More...
 
void add_scaled_matrix_and_vector (Number scalar, ElemAssembly *elem_assembly, SparseMatrix< Number > *input_matrix, NumericVector< Number > *input_vector, bool symmetrize=false, bool apply_dof_constraints=true)
 This function loops over the mesh and applies the specified interior and/or boundary assembly routines, then adds the scaled result to input_matrix and/or input_vector. More...
 
virtual void post_process_elem_matrix_and_vector (DGFEMContext &)
 This function is called from add_scaled_matrix_and_vector() before each element matrix and vector are assembled into their global counterparts. More...
 
virtual void post_process_truth_solution ()
 Similarly, provide an opportunity to post-process the truth solution after the solve is complete. More...
 
virtual void set_context_solution_vec (NumericVector< Number > &vec)
 Set current_local_solution = vec so that we can access vec from FEMContext during assembly. More...
 
virtual void assemble_misc_matrices ()
 Assemble and store all the inner-product matrix, the constraint matrix (for constrained problems) and the mass matrix (for time-dependent problems). More...
 
virtual void assemble_all_affine_operators ()
 Assemble and store all Q_a affine operators as well as the inner-product matrix. More...
 
virtual void assemble_all_affine_vectors ()
 Assemble and store the affine RHS vectors. More...
 
virtual void assemble_all_output_vectors ()
 Assemble and store the output vectors. More...
 
virtual void compute_output_dual_innerprods ()
 Compute and store the dual norm of each output functional. More...
 
virtual void compute_Fq_representor_innerprods (bool compute_inner_products=true)
 Compute the terms that are combined ‘online’ to determine the dual norm of the residual. More...
 
virtual void enrich_RB_space ()
 Add a new basis function to the RB space. More...
 
virtual void update_system ()
 Update the system after enriching the RB space; this calls a series of functions to update the system properly. More...
 
virtual Real get_RB_error_bound ()
 
virtual void update_RB_system_matrices ()
 Compute the reduced basis matrices for the current basis. More...
 
virtual void update_residual_terms (bool compute_inner_products=true)
 Compute the terms that are combined ‘online’ to determine the dual norm of the residual. More...
 
virtual void init_context (FEMContext &)
 Initialize the FEMContext prior to performing an element loop. More...
 
bool get_convergence_assertion_flag () const
 Getter for the flag determining if convergence should be checked after each solve. More...
 
void check_convergence (LinearSolver< Number > &input_solver)
 Check if the linear solver reports convergence. More...
 
unsigned int get_current_training_parameter_index () const
 Get/set the current training parameter index. More...
 
void set_current_training_parameter_index (unsigned int index)
 
const std::vector< Number > & get_evaluated_thetas (unsigned int training_parameter_index) const
 Return the evaluated theta functions at the given training parameter index. More...
 
virtual void preevaluate_thetas ()
 
void reset_preevaluate_thetas_completed ()
 Reset the _preevaluate_thetas_completed flag to false. More...
 
virtual void init_data ()
 Initializes the member data fields associated with the system, so that, e.g., assemble() may be used. More...
 
RBParameters get_params_from_training_set (unsigned int global_index)
 Return the RBParameters in index global_index of the global training set. More...
 
void set_params_from_training_set (unsigned int global_index)
 Set parameters to the RBParameters stored in index global_index of the global training set. More...
 
virtual void set_params_from_training_set_and_broadcast (unsigned int global_index)
 Load the specified training parameter and then broadcast to all processors. More...
 
virtual void add_matrices () override
 Adds the system matrix. More...
 
template<typename T >
void setup_static_condensation_preconditioner (T &solver)
 Sets up the static condensation preconditioner for the supplied solver. More...
 
void project_vector (NumericVector< Number > &, int is_adjoint=-1, std::optional< ConstElemRange > active_local_range=std::nullopt, std::optional< std::vector< unsigned int >> variable_numbers=std::nullopt) const
 Projects the vector defined on the old mesh onto the new mesh. More...
 
void project_vector (const NumericVector< Number > &, NumericVector< Number > &, int is_adjoint=-1, std::optional< ConstElemRange > active_local_range=std::nullopt, std::optional< std::vector< unsigned int >> variable_numbers=std::nullopt) const
 Projects the vector defined on the old mesh onto the new mesh. More...
 
virtual void init_matrices ()
 Initializes the matrices associated with this system. More...
 
bool can_add_matrices () const
 
virtual bool condense_constrained_dofs () const
 Whether this object should condense out constrained degrees of freedom. More...
 
void increment_constructor_count (const std::string &name) noexcept
 Increments the construction counter. More...
 
void increment_constructor_count (const std::string &name) noexcept
 Increments the construction counter. More...
 
void increment_destructor_count (const std::string &name) noexcept
 Increments the destruction counter. More...
 
void increment_destructor_count (const std::string &name) noexcept
 Increments the destruction counter. More...
 

Static Protected Member Functions

static void get_global_max_error_pair (const Parallel::Communicator &communicator, std::pair< numeric_index_type, Real > &error_pair)
 Static function to return the error pair (index,error) that is corresponds to the largest error on all processors. More...
 

Protected Attributes

unsigned int Nmax
 Maximum number of reduced basis functions we are willing to use. More...
 
unsigned int delta_N
 The number of basis functions that we add at each greedy step. More...
 
bool output_dual_innerprods_computed
 A boolean flag to indicate whether or not the output dual norms have already been computed — used to make sure that we don't recompute them unnecessarily. More...
 
bool assert_convergence
 A boolean flag to indicate whether to check for proper convergence after each solve. More...
 
bool quiet_mode
 Flag to indicate whether we print out extra information during the Offline stage. More...
 
bool serial_training_set
 This boolean flag indicates whether or not the training set should be the same on all processors. More...
 
bool _normalize_solution_snapshots
 Set this boolean to true if we want to normalize solution snapshots used in training to have norm of 1. More...
 
std::unique_ptr< NumericVector< Number > > inner_product_storage_vector
 We keep an extra temporary vector that is useful for performing inner products (avoids unnecessary memory allocation/deallocation). More...
 
unsigned int _n_linear_iterations
 The number of linear iterations required to solve the linear system Ax=b. More...
 
Real _final_linear_residual
 The final residual for the linear system Ax=b. More...
 
ShellMatrix< Number > * _shell_matrix
 User supplies shell matrix or nullptr if no shell matrix is used. More...
 
const SystemSubset_subset
 The current subset on which to solve (or nullptr if none). More...
 
SubsetSolveMode _subset_solve_mode
 If restrict-solve-to-subset mode is active, this member decides what happens with the dofs outside the subset. More...
 
const Parallel::Communicator_communicator
 

Static Protected Attributes

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

Private Attributes

RBEvaluationrb_eval
 The current RBEvaluation object we are using to perform the Evaluation stage of the reduced basis method. More...
 
RBAssemblyExpansionrb_assembly_expansion
 This member holds the (parameter independent) assembly functors that define the "affine expansion" of the PDE that we are solving. More...
 
ElemAssemblyinner_product_assembly
 Pointer to inner product assembly. More...
 
bool use_energy_inner_product
 Boolean to indicate whether we're using the energy inner-product. More...
 
std::vector< Numberenergy_inner_product_coeffs
 We may optionally want to use the "energy inner-product" rather than the inner-product assembly specified in inner_product_assembly. More...
 
std::vector< std::unique_ptr< SparseMatrix< Number > > > Aq_vector
 Vector storing the Q_a matrices from the affine expansion. More...
 
std::vector< std::unique_ptr< NumericVector< Number > > > Fq_vector
 Vector storing the Q_f vectors in the affine decomposition of the right-hand side. More...
 
std::vector< std::vector< std::unique_ptr< NumericVector< Number > > > > outputs_vector
 The libMesh vectors that define the output functionals. More...
 
std::vector< std::unique_ptr< SparseMatrix< Number > > > non_dirichlet_Aq_vector
 We may also need a second set of matrices/vectors that do not have the Dirichlet boundary conditions enforced. More...
 
std::vector< std::unique_ptr< NumericVector< Number > > > non_dirichlet_Fq_vector
 
std::vector< std::vector< std::unique_ptr< NumericVector< Number > > > > non_dirichlet_outputs_vector
 
std::unique_ptr< SparseMatrix< Number > > non_dirichlet_inner_product_matrix
 
Real rel_training_tolerance
 Relative and absolute tolerances for training reduced basis using the Greedy scheme. More...
 
Real abs_training_tolerance
 
bool normalize_rb_bound_in_greedy
 This boolean indicates if we normalize the RB error in the greedy using RBEvaluation::get_error_bound_normalization(). More...
 
std::string RB_training_type
 This string indicates the type of training that we will use. More...
 
std::vector< std::unique_ptr< NumericVector< Number > > > _untransformed_basis_functions
 In cases where we have dof transformations such as a change of coordinates at some nodes we need to store an extra set of basis functions which have not had dof transformations applied to them. More...
 
std::unique_ptr< NumericVector< Number > > _untransformed_solution
 We also store a copy of the untransformed solution in order to create _untransformed_basis_functions. More...
 
bool _preevaluate_thetas_flag
 Flag to indicate if we preevaluate the theta functions. More...
 
bool _preevaluate_thetas_completed
 Flag to indicate if the preevaluate_thetas function has been called, since this allows us to avoid calling preevaluate_thetas more than once, which is typically unnecessary. More...
 
unsigned int _current_training_parameter_index
 The current training parameter index during reduced basis training. More...
 
std::vector< std::vector< Number > > _evaluated_thetas
 Storage of evaluated theta functions at a set of parameters. More...
 

Detailed Description

This class is part of the rbOOmit framework.

RBConstruction implements the Construction stage of the certified reduced basis method for steady-state elliptic parametrized PDEs.

Author
David J. Knezevic
Date
2009

Definition at line 53 of file rb_construction.h.

Member Typedef Documentation

◆ const_matrices_iterator

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

Definition at line 830 of file system.h.

◆ const_vectors_iterator

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

Definition at line 804 of file system.h.

◆ Counts [1/2]

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

Data structure to log the information.

The log is identified by the class name.

Definition at line 119 of file reference_counter.h.

◆ Counts [2/2]

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

Data structure to log the information.

The log is identified by the class name.

Definition at line 119 of file reference_counter.h.

◆ GradientFunctionPointer

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

Definition at line 555 of file system.h.

◆ matrices_iterator

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

Matrix iterator typedefs.

Definition at line 829 of file system.h.

◆ Parent

The type of the parent.

Definition at line 130 of file rb_construction.h.

◆ sys_type

The type of system.

Definition at line 79 of file rb_construction.h.

◆ ValueFunctionPointer

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

Projects arbitrary functions onto the current solution.

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

Definition at line 551 of file system.h.

◆ vectors_iterator

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

Vector iterator typedefs.

Definition at line 803 of file system.h.

Constructor & Destructor Documentation

◆ RBConstruction() [1/3]

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

Constructor.

Optionally initializes required data structures.

Definition at line 66 of file rb_construction.C.

References libMesh::System::assemble_before_solve.

69  : Parent(es, name_in, number_in),
71  extra_linear_solver(nullptr),
83  Nmax(0),
84  delta_N(1),
86  assert_convergence(true),
87  rb_eval(nullptr),
88  inner_product_assembly(nullptr),
91  abs_training_tolerance(1.e-12),
93  RB_training_type("Greedy"),
96 {
97  // set assemble_before_solve flag to false
98  // so that we control matrix assembly.
99  assemble_before_solve = false;
100 }
bool store_dirichlet_operators
Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enfor...
bool normalize_rb_bound_in_greedy
This boolean indicates if we normalize the RB error in the greedy using RBEvaluation::get_error_bound...
bool assert_convergence
A boolean flag to indicate whether to check for proper convergence after each solve.
static std::unique_ptr< LinearSolver< Number > > build(const libMesh::Parallel::Communicator &comm_in, const SolverPackage solver_package=libMesh::default_solver_package())
Builds a LinearSolver using the linear solver package specified by solver_package.
Definition: linear_solver.C:59
bool compute_RB_inner_product
Boolean flag to indicate whether we compute the RB_inner_product_matrix.
bool skip_degenerate_sides
In some cases meshes are intentionally created with degenerate sides as a way to represent, say, triangles using a hex-only mesh.
RBConstructionBase< LinearImplicitSystem > Parent
The type of the parent.
std::string RB_training_type
This string indicates the type of training that we will use.
std::unique_ptr< SparseMatrix< Number > > inner_product_matrix
The inner product matrix.
static std::unique_ptr< SparseMatrix< Number > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package(), const MatrixBuildType matrix_build_type=MatrixBuildType::AUTOMATIC)
Builds a SparseMatrix<T> using the linear solver package specified by solver_package.
LinearSolver< Number > * extra_linear_solver
Also, we store a pointer to an extra linear solver.
bool impose_internal_fluxes
Boolean flag to indicate whether we impose "fluxes" (i.e.
bool Fq_representor_innerprods_computed
A boolean flag to indicate whether or not the Fq representor norms have already been computed — used...
bool use_empty_rb_solve_in_greedy
A boolean flag to indicate whether or not we initialize the Greedy algorithm by performing rb_solves ...
bool use_energy_inner_product
Boolean to indicate whether we&#39;re using the energy inner-product.
Real rel_training_tolerance
Relative and absolute tolerances for training reduced basis using the Greedy scheme.
bool store_untransformed_basis
Boolean flag to indicate whether we store a second copy of the basis without constraints or dof trans...
bool skip_residual_in_train_reduced_basis
Boolean flag to indicate if we skip residual calculations in train_reduced_basis. ...
unsigned int delta_N
The number of basis functions that we add at each greedy step.
RBEvaluation * rb_eval
The current RBEvaluation object we are using to perform the Evaluation stage of the reduced basis met...
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...
ElemAssembly * inner_product_assembly
Pointer to inner product assembly.
std::unique_ptr< LinearSolver< Number > > inner_product_solver
We store an extra linear solver object which we can optionally use for solving all systems in which t...
bool _preevaluate_thetas_flag
Flag to indicate if we preevaluate the theta functions.
bool assemble_before_solve
Flag which tells the system to whether or not to call the user assembly function during each call to ...
Definition: system.h:1609
bool exit_on_repeated_greedy_parameters
Boolean flag to indicate whether we exit the greedy if we select the same parameters twice in a row...
bool output_dual_innerprods_computed
A boolean flag to indicate whether or not the output dual norms have already been computed — used to...
bool _preevaluate_thetas_completed
Flag to indicate if the preevaluate_thetas function has been called, since this allows us to avoid ca...
unsigned int Nmax
Maximum number of reduced basis functions we are willing to use.

◆ RBConstruction() [2/3]

libMesh::RBConstruction::RBConstruction ( RBConstruction &&  )
default

Special functions.

  • This class has the same restrictions/defaults as its base class.
  • Destructor is defaulted out-of-line

◆ RBConstruction() [3/3]

libMesh::RBConstruction::RBConstruction ( const RBConstruction )
delete

◆ ~RBConstruction()

libMesh::RBConstruction::~RBConstruction ( )
virtualdefault

Member Function Documentation

◆ activate()

void libMesh::System::activate ( )
inlineinherited

Activates the system.

Only active systems are solved.

Definition at line 2441 of file system.h.

References libMesh::System::_active.

2442 {
2443  _active = true;
2444 }
bool _active
Flag stating if the system is active or not.
Definition: system.h:2252

◆ active()

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

Definition at line 2433 of file system.h.

References libMesh::System::_active.

2434 {
2435  return _active;
2436 }
bool _active
Flag stating if the system is active or not.
Definition: system.h:2252

◆ add_adjoint_rhs()

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

Definition at line 1284 of file system.C.

References libMesh::System::add_vector().

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

1285 {
1286  std::ostringstream adjoint_rhs_name;
1287  adjoint_rhs_name << "adjoint_rhs" << i;
1288 
1289  return this->add_vector(adjoint_rhs_name.str(), false);
1290 }
NumericVector< Number > & add_vector(std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Adds the additional vector vec_name to this system.
Definition: system.C:756

◆ add_adjoint_solution()

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

Definition at line 1220 of file system.C.

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

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

1221 {
1222  std::ostringstream adjoint_name;
1223  adjoint_name << "adjoint_solution" << i;
1224 
1225  NumericVector<Number> & returnval = this->add_vector(adjoint_name.str());
1226  this->set_vector_as_adjoint(adjoint_name.str(), i);
1227  return returnval;
1228 }
void set_vector_as_adjoint(const std::string &vec_name, int qoi_num)
Allows one to set the QoI index controlling whether the vector identified by vec_name represents a so...
Definition: system.C:1147
NumericVector< Number > & add_vector(std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Adds the additional vector vec_name to this system.
Definition: system.C:756
template class LIBMESH_EXPORT NumericVector< Number >

◆ add_matrices()

void libMesh::ImplicitSystem::add_matrices ( )
overrideprotectedvirtualinherited

Adds the system matrix.

Reimplemented from libMesh::System.

Definition at line 113 of file implicit_system.C.

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

114 {
116 
117  // Possible that we cleared the _matrices but
118  // forgot to update the matrix pointer?
119  if (this->n_matrices() == 0)
120  matrix = nullptr;
121 
122  // Only need to add the matrix if it isn't there
123  // already!
124  if (matrix == nullptr)
125  matrix = &(this->add_matrix ("System Matrix"));
126 
128 }
virtual void add_matrices()
Insertion point for adding matrices in derived classes before init_matrices() is called.
Definition: system.h:2017
libmesh_assert(ctx)
unsigned int n_matrices() const
Definition: system.h:2638
SparseMatrix< Number > * matrix
The system matrix.
SparseMatrix< Number > & add_matrix(std::string_view mat_name, ParallelType type=PARALLEL, MatrixBuildType mat_build_type=MatrixBuildType::AUTOMATIC)
Adds the additional matrix mat_name to this system.
Definition: system.C:998

◆ add_matrix() [1/3]

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

Adds the additional matrix mat_name to this system.

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

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

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

Definition at line 998 of file system.C.

References libMesh::System::_matrices, libMesh::System::_matrix_types, libMesh::SparseMatrix< T >::build(), libMesh::ParallelObject::comm(), libMesh::default_solver_package(), libMesh::DIAGONAL, libMesh::System::get_dof_map(), libMesh::System::get_mesh(), libMesh::DofMap::get_static_condensation(), libMesh::System::has_static_condensation(), libMesh::if(), libMesh::System::late_matrix_init(), and libMesh::libmesh_assert().

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

1001 {
1002  parallel_object_only();
1003 
1004  libmesh_assert(this->comm().verify(std::string(mat_name)));
1005  libmesh_assert(this->comm().verify(int(type)));
1006  libmesh_assert(this->comm().verify(int(mat_build_type)));
1007 
1008  // Return the matrix if it is already there.
1009  if (auto it = this->_matrices.find(mat_name);
1010  it != this->_matrices.end())
1011  return *it->second;
1012 
1013  // Otherwise build the matrix to return.
1014  std::unique_ptr<SparseMatrix<Number>> matrix;
1015  if (this->has_static_condensation())
1016  {
1017  if (mat_build_type == MatrixBuildType::DIAGONAL)
1018  libmesh_error_msg(
1019  "We do not currently support static condensation of the diagonal matrix type");
1020  matrix = std::make_unique<StaticCondensation>(this->get_mesh(),
1021  *this,
1022  this->get_dof_map(),
1024  }
1025  else
1027  auto & mat = *matrix;
1028 
1029  _matrices.emplace(mat_name, std::move(matrix));
1030 
1031  _matrix_types.emplace(mat_name, type);
1032 
1033  // Initialize it first if we've already initialized the others.
1034  this->late_matrix_init(mat, type);
1035 
1036  return mat;
1037 }
const Parallel::Communicator & comm() const
bool has_static_condensation() const
Definition: system.C:2664
const MeshBase & get_mesh() const
Definition: system.h:2401
static std::unique_ptr< SparseMatrix< T > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package(), const MatrixBuildType matrix_build_type=MatrixBuildType::AUTOMATIC)
Builds a SparseMatrix<T> using the linear solver package specified by solver_package.
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2277
SolverPackage default_solver_package()
Definition: libmesh.C:1051
StaticCondensationDofMap & get_static_condensation()
Definition: dof_map.h:2859
libmesh_assert(ctx)
std::map< std::string, ParallelType, std::less<> > _matrix_types
Holds the types of the matrices.
Definition: system.h:2282
template class LIBMESH_EXPORT SparseMatrix< Number >
const DofMap & get_dof_map() const
Definition: system.h:2417
void late_matrix_init(SparseMatrix< Number > &mat, ParallelType type)
Helper function to keep DofMap forward declarable in system.h.
Definition: system.C:1063

◆ add_matrix() [2/3]

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

Adds the additional matrix mat_name to this system.

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

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

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

Definition at line 2646 of file system.h.

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

2648 {
2649  // Return the matrix if it is already there.
2650  auto it = this->_matrices.find(mat_name);
2651  if (it != this->_matrices.end())
2652  return *it->second;
2653 
2654  // Otherwise build the matrix to return.
2655  auto pr = _matrices.emplace(mat_name, std::make_unique<MatrixType<Number>>(this->comm()));
2656  _matrix_types.emplace(mat_name, type);
2657 
2658  SparseMatrix<Number> & mat = *(pr.first->second);
2659 
2660  // Initialize it first if we've already initialized the others.
2661  this->late_matrix_init(mat, type);
2662 
2663  return mat;
2664 }
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2277
std::map< std::string, ParallelType, std::less<> > _matrix_types
Holds the types of the matrices.
Definition: system.h:2282
template class LIBMESH_EXPORT SparseMatrix< Number >
void late_matrix_init(SparseMatrix< Number > &mat, ParallelType type)
Helper function to keep DofMap forward declarable in system.h.
Definition: system.C:1063

◆ add_matrix() [3/3]

SparseMatrix< Number > & libMesh::System::add_matrix ( std::string_view  mat_name,
std::unique_ptr< SparseMatrix< Number >>  matrix,
ParallelType  type = PARALLEL 
)
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 main/system matrix, then all the additional matrices, if existent, have to be initialized by the user, too.

Parameters
mat_nameA name for the matrix
matrixThe matrix we are handing over the System for ownership
typeThe serial/parallel/ghosted type of the matrix

Definition at line 1041 of file system.C.

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

1044 {
1045  parallel_object_only();
1046 
1047  const std::string namestr{mat_name};
1048 
1049  libmesh_assert(this->comm().verify(namestr));
1050  libmesh_assert(this->comm().verify(int(type)));
1051 
1052  SparseMatrix<Number> & mat = *matrix;
1053 
1054  _matrices[namestr] = std::move(matrix);
1055  _matrix_types[namestr] = type;
1056 
1057  // Initialize it first if we've already initialized the others.
1058  this->late_matrix_init(mat, type);
1059 
1060  return mat;
1061 }
const Parallel::Communicator & comm() const
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2277
libmesh_assert(ctx)
std::map< std::string, ParallelType, std::less<> > _matrix_types
Holds the types of the matrices.
Definition: system.h:2282
template class LIBMESH_EXPORT SparseMatrix< Number >
void late_matrix_init(SparseMatrix< Number > &mat, ParallelType type)
Helper function to keep DofMap forward declarable in system.h.
Definition: system.C:1063

◆ add_scaled_Aq()

void libMesh::RBConstruction::add_scaled_Aq ( Number  scalar,
unsigned int  q_a,
SparseMatrix< Number > *  input_matrix,
bool  symmetrize 
)

Add the scaled q^th affine matrix to input_matrix.

If symmetrize==true, then we symmetrize Aq before adding it.

Definition at line 1056 of file rb_construction.C.

References libMesh::SparseMatrix< T >::add(), add_scaled_matrix_and_vector(), libMesh::SparseMatrix< T >::close(), libMesh::RBAssemblyExpansion::get_A_assembly(), get_Aq(), get_rb_theta_expansion(), and rb_assembly_expansion.

Referenced by libMesh::RBSCMConstruction::add_scaled_symm_Aq().

1060 {
1061  LOG_SCOPE("add_scaled_Aq()", "RBConstruction");
1062 
1063  libmesh_error_msg_if(q_a >= get_rb_theta_expansion().get_n_A_terms(),
1064  "Error: We must have q < Q_a in add_scaled_Aq.");
1065 
1066  if (!symmetrize)
1067  {
1068  input_matrix->add(scalar, *get_Aq(q_a));
1069  input_matrix->close();
1070  }
1071  else
1072  {
1075  input_matrix,
1076  nullptr,
1077  symmetrize);
1078  }
1079 }
SparseMatrix< Number > * get_Aq(unsigned int q)
Get a pointer to Aq.
virtual void add(const numeric_index_type i, const numeric_index_type j, const T value)=0
Add value to the element (i,j).
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
void add_scaled_matrix_and_vector(Number scalar, ElemAssembly *elem_assembly, SparseMatrix< Number > *input_matrix, NumericVector< Number > *input_vector, bool symmetrize=false, bool apply_dof_constraints=true)
This function loops over the mesh and applies the specified interior and/or boundary assembly routine...
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
ElemAssembly & get_A_assembly(unsigned int q)
Return a reference to the specified A_assembly object.
RBAssemblyExpansion * rb_assembly_expansion
This member holds the (parameter independent) assembly functors that define the "affine expansion" of...

◆ add_scaled_matrix_and_vector()

void libMesh::RBConstruction::add_scaled_matrix_and_vector ( Number  scalar,
ElemAssembly elem_assembly,
SparseMatrix< Number > *  input_matrix,
NumericVector< Number > *  input_vector,
bool  symmetrize = false,
bool  apply_dof_constraints = true 
)
protected

This function loops over the mesh and applies the specified interior and/or boundary assembly routines, then adds the scaled result to input_matrix and/or input_vector.

If symmetrize==true then we assemble the symmetric part of the matrix, 0.5*(A + A^T)

Definition at line 641 of file rb_construction.C.

References libMesh::DofMap::_dof_coupling, libMesh::SparseMatrix< T >::add_matrix(), libMesh::NumericVector< T >::add_vector(), libMesh::FEAbstract::attach_quadrature_rule(), libMesh::ElemAssembly::boundary_assembly(), build_context(), libMesh::NumericVector< T >::close(), libMesh::SparseMatrix< T >::close(), libMesh::ParallelObject::comm(), libMesh::DofMap::constrain_element_matrix_and_vector(), libMesh::FEType::default_quadrature_rule(), libMesh::DGFEMContext::dg_terms_are_active(), libMesh::DenseMatrix< T >::el(), libMesh::FEMContext::elem_fe_reinit(), libMesh::DiffContext::get_dof_indices(), libMesh::System::get_dof_map(), libMesh::FEMContext::get_elem(), libMesh::DGFEMContext::get_elem_elem_jacobian(), libMesh::DiffContext::get_elem_jacobian(), libMesh::DGFEMContext::get_elem_neighbor_jacobian(), libMesh::DiffContext::get_elem_residual(), libMesh::FEMContext::get_element_fe(), libMesh::FEAbstract::get_fe_type(), libMesh::System::get_mesh(), libMesh::DGFEMContext::get_neighbor_dof_indices(), libMesh::DGFEMContext::get_neighbor_elem_jacobian(), libMesh::DGFEMContext::get_neighbor_neighbor_jacobian(), libMesh::ElemAssembly::get_nodal_values(), libMesh::FEMContext::get_side(), libMesh::DenseMatrix< T >::get_transpose(), impose_internal_fluxes, init_context(), libMesh::ElemAssembly::interior_assembly(), libMesh::Tri3Subdivision::is_ghost(), libMesh::DenseMatrixBase< T >::m(), TIMPI::Communicator::max(), mesh, libMesh::DenseMatrixBase< T >::n(), libMesh::Elem::n_sides(), libMesh::System::n_vars(), libMesh::Elem::neighbor_ptr(), libMesh::NODEELEM, post_process_elem_matrix_and_vector(), libMesh::FEMContext::pre_fe_reinit(), libMesh::DofObject::processor_id(), TIMPI::Communicator::rank(), libMesh::FEMContext::side, libMesh::DGFEMContext::side_fe_reinit(), libMesh::Elem::side_ptr(), skip_degenerate_sides, libMesh::TRI3SUBDIVISION, and libMesh::MeshTools::volume().

Referenced by add_scaled_Aq(), assemble_all_output_vectors(), assemble_Aq_matrix(), assemble_Fq_vector(), assemble_inner_product_matrix(), libMesh::TransientRBConstruction::assemble_L2_matrix(), and libMesh::TransientRBConstruction::assemble_Mq_matrix().

647 {
648  LOG_SCOPE("add_scaled_matrix_and_vector()", "RBConstruction");
649 
650  bool assemble_matrix = (input_matrix != nullptr);
651  bool assemble_vector = (input_vector != nullptr);
652 
653  if (!assemble_matrix && !assemble_vector)
654  return;
655 
656  const MeshBase & mesh = this->get_mesh();
657 
658  // First add any node-based terms (e.g. point loads)
659 
660  // Make a std::set of all the nodes that are in 1 or more
661  // nodesets. We only want to call get_nodal_values() once per Node
662  // per ElemAssembly object, regardless of how many nodesets it
663  // appears in.
664  std::set<dof_id_type> nodes_with_nodesets;
665  for (const auto & t : mesh.get_boundary_info().build_node_list())
666  nodes_with_nodesets.insert(std::get<0>(t));
667 
668  // It's possible for the node assembly loop below to throw an
669  // exception on one (or some subset) of the processors. In that
670  // case, we stop assembling on the processor(s) that threw and let
671  // the other processors finish assembly. Then we synchronize to
672  // check whether an exception was thrown on _any_ processor, and if
673  // so, re-throw it on _all_ processors.
674  int nodal_assembly_threw = 0;
675 
676  libmesh_try
677  {
678 
679  for (const auto & id : nodes_with_nodesets)
680  {
681  const Node & node = mesh.node_ref(id);
682 
683  // If node is on this processor, then all dofs on node are too
684  // so we can do the add below safely
685  if (node.processor_id() == this->comm().rank())
686  {
687  // Get the values to add to the rhs vector
688  std::vector<dof_id_type> nodal_dof_indices;
689  DenseMatrix<Number> nodal_matrix;
690  DenseVector<Number> nodal_rhs;
691  elem_assembly->get_nodal_values(nodal_dof_indices,
692  nodal_matrix,
693  nodal_rhs,
694  *this,
695  node);
696 
697  // Perform any required user-defined postprocessing on
698  // the matrix and rhs.
699  //
700  // TODO: We need to postprocess node matrices and vectors
701  // in some cases (e.g. when rotations are applied to
702  // nodes), but since we don't have a FEMContext at this
703  // point we would need to have a different interface
704  // taking the DenseMatrix, DenseVector, and probably the
705  // current node that we are on...
706  // this->post_process_elem_matrix_and_vector(nodal_matrix, nodal_rhs);
707 
708  if (!nodal_dof_indices.empty())
709  {
710  if (apply_dof_constraints)
711  {
712  // Apply constraints, e.g. Dirichlet and periodic constraints
714  nodal_matrix,
715  nodal_rhs,
716  nodal_dof_indices,
717  /*asymmetric_constraint_rows*/ false);
718  }
719 
720  // Scale and add to global matrix and/or vector
721  nodal_matrix *= scalar;
722  nodal_rhs *= scalar;
723 
724  if (assemble_vector)
725  input_vector->add_vector(nodal_rhs, nodal_dof_indices);
726 
727  if (assemble_matrix)
728  input_matrix->add_matrix(nodal_matrix, nodal_dof_indices);
729  }
730  }
731  }
732  } // libmesh_try
733  libmesh_catch(...)
734  {
735  nodal_assembly_threw = 1;
736  }
737 
738  // Check for exceptions on any procs and if there is one, re-throw
739  // it on all procs.
740  this->comm().max(nodal_assembly_threw);
741 
742  if (nodal_assembly_threw)
743  libmesh_error_msg("Error during assembly in RBConstruction::add_scaled_matrix_and_vector()");
744 
745  std::unique_ptr<DGFEMContext> c = this->build_context();
746  DGFEMContext & context = cast_ref<DGFEMContext &>(*c);
747 
748  this->init_context(context);
749 
750  // It's possible for the assembly loop below to throw an exception
751  // on one (or some subset) of the processors. This can happen when
752  // e.g. the mesh contains one or more elements with negative
753  // Jacobian. In that case, we stop assembling on the processor(s)
754  // that threw and let the other processors finish assembly. Then we
755  // synchronize to check whether an exception was thrown on _any_
756  // processor, and if so, re-throw it on _all_ processors. This way,
757  // we make it easier for callers to handle exceptions in parallel
758  // during assembly: they can simply assume that the code either
759  // throws on all procs or on no procs.
760  int assembly_threw = 0;
761 
762  libmesh_try
763  {
764 
765  for (const auto & elem : mesh.active_local_element_ptr_range())
766  {
767  const ElemType elemtype = elem->type();
768 
769  if(elemtype == NODEELEM)
770  {
771  // We assume that we do not perform any assembly directly on
772  // NodeElems, so we skip the assembly calls.
773 
774  // However, in a spline basis with Dirichlet constraints on
775  // spline nodes, a constrained matrix has to take those
776  // nodes into account.
777  if (!apply_dof_constraints)
778  continue;
779  }
780 
781  // Subdivision elements need special care:
782  // - skip ghost elements
783  // - init special quadrature rule
784  std::unique_ptr<QBase> qrule;
785  if (elemtype == TRI3SUBDIVISION)
786  {
787  const Tri3Subdivision * gh_elem = static_cast<const Tri3Subdivision *> (elem);
788  if (gh_elem->is_ghost())
789  continue ;
790  // A Gauss quadrature rule for numerical integration.
791  // For subdivision shell elements, a single Gauss point per
792  // element is sufficient, hence we use extraorder = 0.
793  const int extraorder = 0;
794  FEBase * elem_fe = nullptr;
795  context.get_element_fe( 0, elem_fe );
796 
797  qrule = elem_fe->get_fe_type().default_quadrature_rule (2, extraorder);
798 
799  // Tell the finite element object to use our quadrature rule.
800  elem_fe->attach_quadrature_rule (qrule.get());
801  }
802 
803  context.pre_fe_reinit(*this, elem);
804 
805  // Do nothing in case there are no dof_indices on the current element
806  if ( context.get_dof_indices().empty() )
807  continue;
808 
809  context.elem_fe_reinit();
810 
811  if (elemtype != NODEELEM)
812  {
813  elem_assembly->interior_assembly(context);
814 
815  const unsigned char n_sides = context.get_elem().n_sides();
816  for (context.side = 0; context.side != n_sides; ++context.side)
817  {
818  // May not need to apply fluxes on non-boundary elements
819  if ((context.get_elem().neighbor_ptr(context.get_side()) != nullptr) && !impose_internal_fluxes)
820  continue;
821 
822  // skip degenerate sides with zero area
823  if( (context.get_elem().side_ptr(context.get_side())->volume() <= 0.) && skip_degenerate_sides)
824  continue;
825 
826  context.side_fe_reinit();
827  elem_assembly->boundary_assembly(context);
828 
829  if (context.dg_terms_are_active())
830  {
831  input_matrix->add_matrix (context.get_elem_elem_jacobian(),
832  context.get_dof_indices(),
833  context.get_dof_indices());
834 
835  input_matrix->add_matrix (context.get_elem_neighbor_jacobian(),
836  context.get_dof_indices(),
837  context.get_neighbor_dof_indices());
838 
839  input_matrix->add_matrix (context.get_neighbor_elem_jacobian(),
840  context.get_neighbor_dof_indices(),
841  context.get_dof_indices());
842 
843  input_matrix->add_matrix (context.get_neighbor_neighbor_jacobian(),
844  context.get_neighbor_dof_indices(),
845  context.get_neighbor_dof_indices());
846  }
847  }
848  }
849 
850  // Do any required user post-processing before symmetrizing and/or applying
851  // constraints.
852  //
853  // We only do this if apply_dof_constraints is true because we want to be
854  // able to set apply_dof_constraints=false in order to obtain a matrix
855  // A with no dof constraints or dof transformations, as opposed to C^T A C,
856  // which includes constraints and/or dof transformations. Here C refers to
857  // the matrix that imposes dof constraints and transformations on the
858  // solution u.
859  //
860  // Matrices such as A are what we store in our "non_dirichlet" operators, and
861  // they are useful for computing terms such as (C u_i)^T A (C u_j) (e.g. see
862  // update_RB_system_matrices()), where C u is the result of a "truth_solve",
863  // which includes calls to both enforce_constraints_exactly() and
864  // post_process_truth_solution(). If we use C^T A C to compute these terms then
865  // we would "double apply" the matrix C, which can give incorrect results.
866  if (apply_dof_constraints)
868 
869  // Need to symmetrize before imposing
870  // periodic constraints
871  if (assemble_matrix && symmetrize)
872  {
873  DenseMatrix<Number> Ke_transpose;
874  context.get_elem_jacobian().get_transpose(Ke_transpose);
875  context.get_elem_jacobian() += Ke_transpose;
876  context.get_elem_jacobian() *= 0.5;
877  }
878 
879  // As discussed above, we can set apply_dof_constraints=false to
880  // get A instead of C^T A C
881  if (apply_dof_constraints)
882  {
883  // Apply constraints, e.g. Dirichlet and periodic constraints
885  (context.get_elem_jacobian(),
886  context.get_elem_residual(),
887  context.get_dof_indices(),
888  /*asymmetric_constraint_rows*/ false );
889  }
890 
891  // Scale and add to global matrix and/or vector
892  context.get_elem_jacobian() *= scalar;
893  context.get_elem_residual() *= scalar;
894 
895  if (assemble_matrix)
896  {
897 
898  CouplingMatrix * coupling_matrix = get_dof_map()._dof_coupling;
899  if (!coupling_matrix)
900  {
901  // If we haven't defined a _dof_coupling matrix then just add
902  // the whole matrix
903  input_matrix->add_matrix (context.get_elem_jacobian(),
904  context.get_dof_indices() );
905  }
906  else
907  {
908  // Otherwise we should only add the relevant submatrices
909  for (unsigned int var1=0; var1<n_vars(); var1++)
910  {
911  ConstCouplingRow ccr(var1, *coupling_matrix);
912  for (const auto & var2 : ccr)
913  {
914  unsigned int sub_m = context.get_elem_jacobian( var1, var2 ).m();
915  unsigned int sub_n = context.get_elem_jacobian( var1, var2 ).n();
916  DenseMatrix<Number> sub_jac(sub_m, sub_n);
917  for (unsigned int row=0; row<sub_m; row++)
918  for (unsigned int col=0; col<sub_n; col++)
919  {
920  sub_jac(row,col) = context.get_elem_jacobian( var1, var2 ).el(row,col);
921  }
922  input_matrix->add_matrix (sub_jac,
923  context.get_dof_indices(var1),
924  context.get_dof_indices(var2) );
925  }
926  }
927  }
928 
929  }
930 
931  if (assemble_vector)
932  input_vector->add_vector (context.get_elem_residual(),
933  context.get_dof_indices() );
934  } // end for (elem)
935 
936  } // libmesh_try
937  libmesh_catch(...)
938  {
939  assembly_threw = 1;
940  }
941 
942  // Note: regardless of whether any procs threw during assembly (and
943  // thus didn't finish assembling), we should not leave the matrix
944  // and vector in an inconsistent state, since it may be possible to
945  // recover from the exception. Therefore, we close them now. The
946  // assumption here is that the nature of the exception does not
947  // prevent the matrix and vector from still being assembled (albeit
948  // with incomplete data).
949  if (assemble_matrix)
950  input_matrix->close();
951  if (assemble_vector)
952  input_vector->close();
953 
954  // Check for exceptions on any procs and if there is one, re-throw
955  // it on all procs.
956  this->comm().max(assembly_threw);
957 
958  if (assembly_threw)
959  libmesh_error_msg("Error during assembly in RBConstruction::add_scaled_matrix_and_vector()");
960 }
ElemType
Defines an enum for geometric element types.
virtual void post_process_elem_matrix_and_vector(DGFEMContext &)
This function is called from add_scaled_matrix_and_vector() before each element matrix and vector are...
void constrain_element_matrix_and_vector(DenseMatrix< Number > &matrix, DenseVector< Number > &rhs, std::vector< dof_id_type > &elem_dofs, bool asymmetric_constraint_rows=true) const
Constrains the element matrix and vector.
Definition: dof_map.h:2498
virtual void add_vector(const T *v, const std::vector< numeric_index_type > &dof_indices)
Computes , where v is a pointer and each dof_indices[i] specifies where to add value v[i]...
MeshBase & mesh
processor_id_type rank() const
const Parallel::Communicator & comm() const
bool skip_degenerate_sides
In some cases meshes are intentionally created with degenerate sides as a way to represent, say, triangles using a hex-only mesh.
virtual std::unique_ptr< DGFEMContext > build_context()
Builds a DGFEMContext object with enough information to do evaluations on each element.
const MeshBase & get_mesh() const
Definition: system.h:2401
virtual void init_context(FEMContext &)
Initialize the FEMContext prior to performing an element loop.
bool impose_internal_fluxes
Boolean flag to indicate whether we impose "fluxes" (i.e.
virtual void add_matrix(const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols)=0
Add the full matrix dm to the SparseMatrix.
CouplingMatrix * _dof_coupling
Degree of freedom coupling.
Definition: dof_map.h:1741
FEGenericBase< Real > FEBase
Real volume(const MeshBase &mesh, unsigned int dim=libMesh::invalid_uint)
Find the total volume of a mesh (interpreting that as area for dim = 2, or total arc length for dim =...
Definition: mesh_tools.C:992
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
void max(const T &r, T &o, Request &req) const
unsigned int n_vars() const
Definition: system.C:2669
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ add_sensitivity_rhs()

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

Definition at line 1314 of file system.C.

References libMesh::System::add_vector().

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

1315 {
1316  std::ostringstream sensitivity_rhs_name;
1317  sensitivity_rhs_name << "sensitivity_rhs" << i;
1318 
1319  return this->add_vector(sensitivity_rhs_name.str(), false);
1320 }
NumericVector< Number > & add_vector(std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Adds the additional vector vec_name to this system.
Definition: system.C:756

◆ add_sensitivity_solution()

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

Definition at line 1169 of file system.C.

References libMesh::System::add_vector().

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

1170 {
1171  std::ostringstream sensitivity_name;
1172  sensitivity_name << "sensitivity_solution" << i;
1173 
1174  return this->add_vector(sensitivity_name.str());
1175 }
NumericVector< Number > & add_vector(std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Adds the additional vector vec_name to this system.
Definition: system.C:756

◆ add_variable() [1/2]

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

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

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

Returns
The index number for the new variable.

Definition at line 1344 of file system.C.

References libMesh::DofMap::add_variable(), and libMesh::System::get_dof_map().

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

1347 {
1348  return this->get_dof_map().add_variable(*this, var, type, active_subdomains);
1349 }
unsigned int add_variable(System &sys, std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variable var to the list of variables for this system.
Definition: dof_map.C:3137
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ add_variable() [2/2]

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

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

Same as before, but assumes LAGRANGE as default value for FEType.family. If active_subdomains is either nullptr (the default) or points to an empty set, then it will be assumed that var has no subdomain restrictions. If p_refinement is false, then even when on an Elem with non-zero p_level() this variable will not be p-refined.

Definition at line 1353 of file system.C.

References libMesh::System::add_variable().

1358 {
1359  return this->add_variable(var,
1360  FEType(order, family).set_p_refinement(p_refinement),
1361  active_subdomains);
1362 }
unsigned int add_variable(std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variable var to the list of variables for this system.
Definition: system.C:1344

◆ add_variable_array()

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

Adds variables vars to the list of variables for this system.

If active_subdomains is either nullptr (the default) or points to an empty set, then it will be assumed that the vars have no subdomain restrictions. This API will end up calling this->add_variables(). However, we will additionally store data that can be leveraged by the DofMap to build degrees of freedom containers corresponding to all the variables in this variable array

An 'array variable' is simply a sequence of contiguous variable numbers defined by pair where the first member of the pair is the first number in the variable sequence and the second member of the pair is the number of the last variable in the sequence plus one. Array variables may be used in tandem with variable grouping by downstream code to build optimized physics kernels since each variable in the array will have the same shape functions.

Returns
The index number for the last of the new variables.

Definition at line 1386 of file system.C.

References libMesh::DofMap::add_variable_array(), and libMesh::System::get_dof_map().

Referenced by DofMapTest::testArrayDofIndicesWithType().

1389 {
1390  return this->get_dof_map().add_variable_array(*this, vars, type, active_subdomains);
1391 }
unsigned int add_variable_array(System &sys, const std::vector< std::string > &vars, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds variables vars to the list of variables for this system.
Definition: dof_map.C:3368
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ add_variables() [1/2]

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

Adds the variables vars to the list of variables for this system.

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

Returns
The index number for the last of the new variables.

Definition at line 1366 of file system.C.

References libMesh::DofMap::add_variables(), and libMesh::System::get_dof_map().

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

1369 {
1370  return this->get_dof_map().add_variables(*this, vars, type, active_subdomains);
1371 }
unsigned int add_variables(System &sys, const std::vector< std::string > &vars, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variables vars to the list of variables for this system.
Definition: dof_map.C:3244
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ add_variables() [2/2]

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

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

Same as before, but assumes LAGRANGE as default value for FEType.family. If active_subdomains is either nullptr (the default) or points to an empty set, then it will be assumed that var has no subdomain restrictions. If p_refinement is false, then even when on an Elem with non-zero p_level() this variable will not be p-refined.

Definition at line 1375 of file system.C.

References libMesh::System::add_variables().

1380 {
1381  return this->add_variables(vars,
1382  FEType(order, family).set_p_refinement(p_refinement),
1383  active_subdomains);
1384 }
unsigned int add_variables(const std::vector< std::string > &vars, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variables vars to the list of variables for this system.
Definition: system.C:1366

◆ add_vector()

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

Adds the additional vector vec_name to this system.

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

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

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

Definition at line 756 of file system.C.

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

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

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

◆ add_weighted_sensitivity_adjoint_solution()

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

Definition at line 1252 of file system.C.

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

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

1253 {
1254  std::ostringstream adjoint_name;
1255  adjoint_name << "weighted_sensitivity_adjoint_solution" << i;
1256 
1257  NumericVector<Number> & returnval = this->add_vector(adjoint_name.str());
1258  this->set_vector_as_adjoint(adjoint_name.str(), i);
1259  return returnval;
1260 }
void set_vector_as_adjoint(const std::string &vec_name, int qoi_num)
Allows one to set the QoI index controlling whether the vector identified by vec_name represents a so...
Definition: system.C:1147
NumericVector< Number > & add_vector(std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Adds the additional vector vec_name to this system.
Definition: system.C:756
template class LIBMESH_EXPORT NumericVector< Number >

◆ add_weighted_sensitivity_solution()

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

Definition at line 1199 of file system.C.

References libMesh::System::add_vector().

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

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

◆ adjoint_qoi_parameter_sensitivity()

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

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

Uses adjoint_solve() and the adjoint sensitivity method.

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

Reimplemented from libMesh::System.

Definition at line 517 of file implicit_system.C.

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

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

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

◆ adjoint_solve()

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

Assembles & solves the linear system (dR/du)^T*z = dq/du, for those quantities of interest q specified by qoi_indices.

Leave qoi_indices empty to solve all adjoint problems.

Returns
A pair with the total number of linear iterations performed and the (sum of the) final residual norms

Reimplemented from libMesh::System.

Reimplemented in libMesh::DifferentiableSystem.

Definition at line 196 of file implicit_system.C.

References libMesh::System::add_adjoint_solution(), libMesh::LinearSolver< T >::adjoint_solve(), libMesh::System::assemble_before_solve, libMesh::ExplicitSystem::assemble_qoi_derivative(), libMesh::ImplicitSystem::assembly(), libMesh::DofMap::enforce_adjoint_constraints_exactly(), libMesh::System::get_adjoint_rhs(), libMesh::System::get_adjoint_solution(), libMesh::System::get_dof_map(), libMesh::ImplicitSystem::get_linear_solve_parameters(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::QoISet::has_index(), libMesh::make_range(), libMesh::ImplicitSystem::matrix, and libMesh::System::n_qois().

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

197 {
198  // Log how long the linear solve takes.
199  LOG_SCOPE("adjoint_solve()", "ImplicitSystem");
200 
201  if (this->assemble_before_solve)
202  // Assemble the linear system
203  this->assembly (/* get_residual = */ false,
204  /* get_jacobian = */ true);
205 
206  // The adjoint problem is linear
207  LinearSolver<Number> * solver = this->get_linear_solver();
208 
209  // Reset and build the RHS from the QOI derivative
210  this->assemble_qoi_derivative(qoi_indices,
211  /* include_liftfunc = */ false,
212  /* apply_constraints = */ true);
213 
214  // Our iteration counts and residuals will be sums of the individual
215  // results
216  std::pair<unsigned int, Real> solver_params =
218  std::pair<unsigned int, Real> totalrval = std::make_pair(0,0.0);
219 
220  for (auto i : make_range(this->n_qois()))
221  if (qoi_indices.has_index(i))
222  {
223  const std::pair<unsigned int, Real> rval =
224  solver->adjoint_solve (*matrix, this->add_adjoint_solution(i),
225  this->get_adjoint_rhs(i),
226  double(solver_params.second),
227  solver_params.first);
228 
229  totalrval.first += rval.first;
230  totalrval.second += rval.second;
231  }
232 
233  // The linear solver may not have fit our constraints exactly
234 #ifdef LIBMESH_ENABLE_CONSTRAINTS
235  for (auto i : make_range(this->n_qois()))
236  if (qoi_indices.has_index(i))
238  (this->get_adjoint_solution(i), i);
239 #endif
240 
241  return totalrval;
242 }
NumericVector< Number > & add_adjoint_solution(unsigned int i=0)
Definition: system.C:1220
virtual std::pair< unsigned int, Real > get_linear_solve_parameters() const
unsigned int n_qois() const
Number of currently active quantities of interest.
Definition: system.h:2562
virtual LinearSolver< Number > * get_linear_solver() const
void enforce_adjoint_constraints_exactly(NumericVector< Number > &v, unsigned int q) const
Heterogeneously constrains the numeric vector v, which represents an adjoint solution defined on the ...
Definition: dof_map.h:2522
virtual void assembly(bool, bool, bool=false, bool=false)
Assembles a residual in rhs and/or a jacobian in matrix, as requested.
template class LIBMESH_EXPORT LinearSolver< Number >
SparseMatrix< Number > * matrix
The system matrix.
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
virtual void assemble_qoi_derivative(const QoISet &qoi_indices=QoISet(), bool include_liftfunc=true, bool apply_constraints=true) override
Prepares adjoint_rhs for quantity of interest derivative assembly, then calls user qoi derivative fun...
NumericVector< Number > & get_adjoint_solution(unsigned int i=0)
Definition: system.C:1232
bool assemble_before_solve
Flag which tells the system to whether or not to call the user assembly function during each call to ...
Definition: system.h:1609
const DofMap & get_dof_map() const
Definition: system.h:2417
NumericVector< Number > & get_adjoint_rhs(unsigned int i=0)
Definition: system.C:1294

◆ allocate_data_structures()

void libMesh::RBConstruction::allocate_data_structures ( )
protectedvirtual

Helper function that actually allocates all the data structures required by this class.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 514 of file rb_construction.C.

References Aq_vector, libMesh::DofMap::attach_matrix(), libMesh::SparseMatrix< T >::build(), libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), Fq_representor, Fq_representor_innerprods, Fq_vector, libMesh::System::get_dof_map(), libMesh::RBThetaExpansion::get_n_A_terms(), libMesh::RBThetaExpansion::get_n_F_terms(), libMesh::RBThetaExpansion::get_n_output_terms(), libMesh::RBThetaExpansion::get_n_outputs(), get_rb_theta_expansion(), inner_product_matrix, libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), non_dirichlet_Aq_vector, non_dirichlet_Fq_vector, non_dirichlet_inner_product_matrix, non_dirichlet_outputs_vector, output_dual_innerprods, outputs_vector, libMesh::PARALLEL, store_dirichlet_operators, store_non_dirichlet_operators, and truth_outputs.

Referenced by libMesh::TransientRBConstruction::allocate_data_structures(), and initialize_rb_construction().

515 {
516  // Resize vectors for storing mesh-dependent data
517  Aq_vector.resize(get_rb_theta_expansion().get_n_A_terms());
518  Fq_vector.resize(get_rb_theta_expansion().get_n_F_terms());
519 
520  // Resize the Fq_representors and initialize each to nullptr.
521  // These are basis independent and hence stored here, whereas
522  // the Aq_representors are stored in RBEvaluation
523  Fq_representor.resize(get_rb_theta_expansion().get_n_F_terms());
524 
525  // Initialize vectors for the inner products of the Fq representors
526  // These are basis independent and therefore stored here.
527  unsigned int Q_f_hat = get_rb_theta_expansion().get_n_F_terms()*(get_rb_theta_expansion().get_n_F_terms()+1)/2;
528  Fq_representor_innerprods.resize(Q_f_hat);
529 
530  // Resize the output vectors
531  outputs_vector.resize(get_rb_theta_expansion().get_n_outputs());
532  for (unsigned int n=0; n<get_rb_theta_expansion().get_n_outputs(); n++)
534 
535  // Resize the output dual norm vectors
536  output_dual_innerprods.resize(get_rb_theta_expansion().get_n_outputs());
537  for (unsigned int n=0; n<get_rb_theta_expansion().get_n_outputs(); n++)
538  {
540  output_dual_innerprods[n].resize(Q_l_hat);
541  }
542 
543  {
544  DofMap & dof_map = this->get_dof_map();
545 
547  {
548  dof_map.attach_matrix(*inner_product_matrix);
549  inner_product_matrix->init();
550  inner_product_matrix->zero();
551  }
552 
554  {
555  // We also need a non-Dirichlet inner-product matrix
557  dof_map.attach_matrix(*non_dirichlet_inner_product_matrix);
560  }
561 
563  for (unsigned int q=0; q<get_rb_theta_expansion().get_n_A_terms(); q++)
564  {
565  // Initialize the memory for the matrices
567  dof_map.attach_matrix(*Aq_vector[q]);
568  Aq_vector[q]->init();
569  Aq_vector[q]->zero();
570  }
571 
572  // We also need to initialize a second set of non-Dirichlet operators
574  {
575  non_dirichlet_Aq_vector.resize(get_rb_theta_expansion().get_n_A_terms());
576  for (unsigned int q=0; q<get_rb_theta_expansion().get_n_A_terms(); q++)
577  {
578  // Initialize the memory for the matrices
580  dof_map.attach_matrix(*non_dirichlet_Aq_vector[q]);
581  non_dirichlet_Aq_vector[q]->init();
582  non_dirichlet_Aq_vector[q]->zero();
583  }
584  }
585  }
586 
587  // Initialize the vectors
589  for (unsigned int q=0; q<get_rb_theta_expansion().get_n_F_terms(); q++)
590  {
591  // Initialize the memory for the vectors
593  Fq_vector[q]->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
594  }
595 
596  // We also need to initialize a second set of non-Dirichlet operators
598  {
599  non_dirichlet_Fq_vector.resize(get_rb_theta_expansion().get_n_F_terms());
600  for (unsigned int q=0; q<get_rb_theta_expansion().get_n_F_terms(); q++)
601  {
602  // Initialize the memory for the vectors
604  non_dirichlet_Fq_vector[q]->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
605  }
606  }
607 
609  for (unsigned int n=0; n<get_rb_theta_expansion().get_n_outputs(); n++)
610  for (unsigned int q_l=0; q_l<get_rb_theta_expansion().get_n_output_terms(n); q_l++)
611  {
612  // Initialize the memory for the truth output vectors
614  outputs_vector[n][q_l]->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
615  }
616 
618  {
619  non_dirichlet_outputs_vector.resize(get_rb_theta_expansion().get_n_outputs());
620  for (unsigned int n=0; n<get_rb_theta_expansion().get_n_outputs(); n++)
621  {
622  non_dirichlet_outputs_vector[n].resize( get_rb_theta_expansion().get_n_output_terms(n) );
623  for (unsigned int q_l=0; q_l<get_rb_theta_expansion().get_n_output_terms(n); q_l++)
624  {
625  // Initialize the memory for the truth output vectors
627  non_dirichlet_outputs_vector[n][q_l]->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
628  }
629  }
630  }
631 
632  // Resize truth_outputs vector
633  truth_outputs.resize(this->get_rb_theta_expansion().get_n_outputs());
634 }
bool store_dirichlet_operators
Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enfor...
std::vector< std::unique_ptr< NumericVector< Number > > > Fq_representor
Vector storing the residual representors associated with the right-hand side.
unsigned int get_n_F_terms() const
Get Q_f, the number of terms in the affine expansion for the right-hand side.
std::vector< std::vector< Number > > output_dual_innerprods
The vector storing the dual norm inner product terms for each output.
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form.
const Parallel::Communicator & comm() const
std::unique_ptr< SparseMatrix< Number > > inner_product_matrix
The inner product matrix.
dof_id_type n_local_dofs() const
Definition: system.C:155
std::vector< Number > Fq_representor_innerprods
Vectors storing the residual representor inner products to be used in computing the residuals online...
unsigned int get_n_outputs() const
Get n_outputs, the number output functionals.
static std::unique_ptr< SparseMatrix< T > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package(), const MatrixBuildType matrix_build_type=MatrixBuildType::AUTOMATIC)
Builds a SparseMatrix<T> using the linear solver package specified by solver_package.
dof_id_type n_dofs() const
Definition: system.C:118
std::vector< std::unique_ptr< NumericVector< Number > > > non_dirichlet_Fq_vector
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
std::unique_ptr< SparseMatrix< Number > > non_dirichlet_inner_product_matrix
std::vector< std::unique_ptr< SparseMatrix< Number > > > Aq_vector
Vector storing the Q_a matrices from the affine expansion.
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...
unsigned int get_n_output_terms(unsigned int output_index) const
Get the number of affine terms associated with the specified output.
std::vector< std::unique_ptr< NumericVector< Number > > > Fq_vector
Vector storing the Q_f vectors in the affine decomposition of the right-hand side.
std::vector< Number > truth_outputs
Vector storing the truth output values from the most recent truth solve.
std::vector< std::unique_ptr< SparseMatrix< Number > > > non_dirichlet_Aq_vector
We may also need a second set of matrices/vectors that do not have the Dirichlet boundary conditions ...
std::vector< std::vector< std::unique_ptr< NumericVector< Number > > > > non_dirichlet_outputs_vector
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
const DofMap & get_dof_map() const
Definition: system.h:2417
std::vector< std::vector< std::unique_ptr< NumericVector< Number > > > > outputs_vector
The libMesh vectors that define the output functionals.

◆ assemble()

virtual void libMesh::LinearImplicitSystem::assemble ( )
inlineoverridevirtualinherited

Prepares matrix and _dof_map for matrix assembly.

Does not actually assemble anything. For matrix assembly, use the assemble() in derived classes. Should be overridden in derived classes.

Reimplemented from libMesh::ImplicitSystem.

Reimplemented in libMesh::FrequencySystem, and libMesh::NewmarkSystem.

Definition at line 115 of file linear_implicit_system.h.

References libMesh::ImplicitSystem::assemble().

Referenced by libMesh::NewmarkSystem::assemble(), libMesh::FrequencySystem::assemble(), libMesh::LinearImplicitSystem::assembly(), and libMesh::LinearImplicitSystem::solve().

virtual void assemble() override
Prepares matrix and rhs for system assembly, then calls user assembly function.

◆ assemble_affine_expansion()

void libMesh::RBConstruction::assemble_affine_expansion ( bool  skip_matrix_assembly,
bool  skip_vector_assembly 
)
virtual

Assemble the matrices and vectors for this system.

Optionally skip matrix or vector assembly (e.g. we may want to read data in from disk instead).

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 496 of file rb_construction.C.

References assemble_all_affine_operators(), assemble_all_affine_vectors(), assemble_all_output_vectors(), and assemble_misc_matrices().

Referenced by libMesh::TransientRBConstruction::assemble_affine_expansion(), and initialize_rb_construction().

498 {
499  if (!skip_matrix_assembly)
500  {
501  // Assemble and store all of the matrices
502  this->assemble_misc_matrices();
504  }
505 
506  if (!skip_vector_assembly)
507  {
508  // Assemble and store all of the vectors
511  }
512 }
virtual void assemble_all_output_vectors()
Assemble and store the output vectors.
virtual void assemble_misc_matrices()
Assemble and store all the inner-product matrix, the constraint matrix (for constrained problems) and...
virtual void assemble_all_affine_vectors()
Assemble and store the affine RHS vectors.
virtual void assemble_all_affine_operators()
Assemble and store all Q_a affine operators as well as the inner-product matrix.

◆ assemble_all_affine_operators()

void libMesh::RBConstruction::assemble_all_affine_operators ( )
protectedvirtual

Assemble and store all Q_a affine operators as well as the inner-product matrix.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 1096 of file rb_construction.C.

References assemble_Aq_matrix(), get_Aq(), libMesh::RBThetaExpansion::get_n_A_terms(), get_non_dirichlet_Aq(), get_rb_theta_expansion(), libMesh::out, store_dirichlet_operators, and store_non_dirichlet_operators.

Referenced by assemble_affine_expansion(), and libMesh::TransientRBConstruction::assemble_all_affine_operators().

1097 {
1099  for (unsigned int q_a=0; q_a<get_rb_theta_expansion().get_n_A_terms(); q_a++)
1100  {
1101  libMesh::out << "Assembling affine operator " << (q_a+1) << " of "
1102  << get_rb_theta_expansion().get_n_A_terms() << std::endl;
1103  assemble_Aq_matrix(q_a, get_Aq(q_a));
1104  }
1105 
1107  {
1108  for (unsigned int q_a=0; q_a<get_rb_theta_expansion().get_n_A_terms(); q_a++)
1109  {
1110  libMesh::out << "Assembling non-Dirichlet affine operator " << (q_a+1) << " of "
1111  << get_rb_theta_expansion().get_n_A_terms() << std::endl;
1112  assemble_Aq_matrix(q_a, get_non_dirichlet_Aq(q_a), false);
1113  }
1114  }
1115 }
bool store_dirichlet_operators
Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enfor...
SparseMatrix< Number > * get_Aq(unsigned int q)
Get a pointer to Aq.
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form.
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
SparseMatrix< Number > * get_non_dirichlet_Aq(unsigned int q)
Get a pointer to non_dirichlet_Aq.
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...
OStreamProxy out
void assemble_Aq_matrix(unsigned int q, SparseMatrix< Number > *input_matrix, bool apply_dof_constraints=true)
Assemble the q^th affine matrix and store it in input_matrix.

◆ assemble_all_affine_vectors()

void libMesh::RBConstruction::assemble_all_affine_vectors ( )
protectedvirtual

Assemble and store the affine RHS vectors.

Definition at line 1117 of file rb_construction.C.

References assemble_Fq_vector(), get_Fq(), libMesh::RBThetaExpansion::get_n_F_terms(), get_non_dirichlet_Fq(), get_rb_theta_expansion(), libMesh::out, store_dirichlet_operators, and store_non_dirichlet_operators.

Referenced by assemble_affine_expansion().

1118 {
1120  for (unsigned int q_f=0; q_f<get_rb_theta_expansion().get_n_F_terms(); q_f++)
1121  {
1122  libMesh::out << "Assembling affine vector " << (q_f+1) << " of "
1123  << get_rb_theta_expansion().get_n_F_terms() << std::endl;
1124  assemble_Fq_vector(q_f, get_Fq(q_f));
1125  }
1126 
1128  {
1129  for (unsigned int q_f=0; q_f<get_rb_theta_expansion().get_n_F_terms(); q_f++)
1130  {
1131  libMesh::out << "Assembling non-Dirichlet affine vector " << (q_f+1) << " of "
1132  << get_rb_theta_expansion().get_n_F_terms() << std::endl;
1133  assemble_Fq_vector(q_f, get_non_dirichlet_Fq(q_f), false);
1134  }
1135  }
1136 
1137 }
bool store_dirichlet_operators
Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enfor...
unsigned int get_n_F_terms() const
Get Q_f, the number of terms in the affine expansion for the right-hand side.
NumericVector< Number > * get_Fq(unsigned int q)
Get a pointer to Fq.
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
void assemble_Fq_vector(unsigned int q, NumericVector< Number > *input_vector, bool apply_dof_constraints=true)
Assemble the q^th affine vector and store it in input_matrix.
NumericVector< Number > * get_non_dirichlet_Fq(unsigned int q)
Get a pointer to non-Dirichlet Fq.
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...
OStreamProxy out

◆ assemble_all_output_vectors()

void libMesh::RBConstruction::assemble_all_output_vectors ( )
protectedvirtual

Assemble and store the output vectors.

Definition at line 1156 of file rb_construction.C.

References add_scaled_matrix_and_vector(), libMesh::RBThetaExpansion::get_n_output_terms(), libMesh::RBThetaExpansion::get_n_outputs(), get_non_dirichlet_output_vector(), libMesh::RBAssemblyExpansion::get_output_assembly(), get_output_vector(), get_rb_theta_expansion(), libMesh::out, rb_assembly_expansion, store_dirichlet_operators, store_non_dirichlet_operators, and libMesh::NumericVector< T >::zero().

Referenced by assemble_affine_expansion().

1157 {
1159  for (unsigned int n=0; n<get_rb_theta_expansion().get_n_outputs(); n++)
1160  for (unsigned int q_l=0; q_l<get_rb_theta_expansion().get_n_output_terms(n); q_l++)
1161  {
1162  libMesh::out << "Assembling output vector, (" << (n+1) << "," << (q_l+1)
1163  << ") of (" << get_rb_theta_expansion().get_n_outputs()
1164  << "," << get_rb_theta_expansion().get_n_output_terms(n) << ")"
1165  << std::endl;
1166  get_output_vector(n, q_l)->zero();
1168  nullptr,
1169  get_output_vector(n,q_l),
1170  false, /* symmetrize */
1171  true /* apply_dof_constraints */);
1172  }
1173 
1175  {
1176  for (unsigned int n=0; n<get_rb_theta_expansion().get_n_outputs(); n++)
1177  for (unsigned int q_l=0; q_l<get_rb_theta_expansion().get_n_output_terms(n); q_l++)
1178  {
1179  libMesh::out << "Assembling non-Dirichlet output vector, (" << (n+1) << "," << (q_l+1)
1180  << ") of (" << get_rb_theta_expansion().get_n_outputs()
1181  << "," << get_rb_theta_expansion().get_n_output_terms(n) << ")"
1182  << std::endl;
1185  nullptr,
1187  false, /* symmetrize */
1188  false /* apply_dof_constraints */);
1189  }
1190  }
1191 }
bool store_dirichlet_operators
Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enfor...
ElemAssembly & get_output_assembly(unsigned int output_index, unsigned int q_l)
Return a reference to the specified output assembly object.
unsigned int get_n_outputs() const
Get n_outputs, the number output functionals.
virtual void zero()=0
Set all entries to zero.
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
void add_scaled_matrix_and_vector(Number scalar, ElemAssembly *elem_assembly, SparseMatrix< Number > *input_matrix, NumericVector< Number > *input_vector, bool symmetrize=false, bool apply_dof_constraints=true)
This function loops over the mesh and applies the specified interior and/or boundary assembly routine...
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...
unsigned int get_n_output_terms(unsigned int output_index) const
Get the number of affine terms associated with the specified output.
OStreamProxy out
RBAssemblyExpansion * rb_assembly_expansion
This member holds the (parameter independent) assembly functors that define the "affine expansion" of...
NumericVector< Number > * get_output_vector(unsigned int n, unsigned int q_l)
Get a pointer to the n^th output.
NumericVector< Number > * get_non_dirichlet_output_vector(unsigned int n, unsigned int q_l)
Get a pointer to non-Dirichlet output vector.

◆ assemble_Aq_matrix()

void libMesh::RBConstruction::assemble_Aq_matrix ( unsigned int  q,
SparseMatrix< Number > *  input_matrix,
bool  apply_dof_constraints = true 
)

Assemble the q^th affine matrix and store it in input_matrix.

Definition at line 1039 of file rb_construction.C.

References add_scaled_matrix_and_vector(), libMesh::RBAssemblyExpansion::get_A_assembly(), get_rb_theta_expansion(), rb_assembly_expansion, and libMesh::SparseMatrix< T >::zero().

Referenced by assemble_all_affine_operators().

1042 {
1043  libmesh_error_msg_if(q >= get_rb_theta_expansion().get_n_A_terms(),
1044  "Error: We must have q < Q_a in assemble_Aq_matrix.");
1045 
1046  input_matrix->zero();
1047 
1050  input_matrix,
1051  nullptr,
1052  false, /* symmetrize */
1053  apply_dof_constraints);
1054 }
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
virtual void zero()=0
Set all entries to 0.
void add_scaled_matrix_and_vector(Number scalar, ElemAssembly *elem_assembly, SparseMatrix< Number > *input_matrix, NumericVector< Number > *input_vector, bool symmetrize=false, bool apply_dof_constraints=true)
This function loops over the mesh and applies the specified interior and/or boundary assembly routine...
ElemAssembly & get_A_assembly(unsigned int q)
Return a reference to the specified A_assembly object.
RBAssemblyExpansion * rb_assembly_expansion
This member holds the (parameter independent) assembly functors that define the "affine expansion" of...

◆ assemble_Fq_vector()

void libMesh::RBConstruction::assemble_Fq_vector ( unsigned int  q,
NumericVector< Number > *  input_vector,
bool  apply_dof_constraints = true 
)

Assemble the q^th affine vector and store it in input_matrix.

Definition at line 1139 of file rb_construction.C.

References add_scaled_matrix_and_vector(), libMesh::RBAssemblyExpansion::get_F_assembly(), get_rb_theta_expansion(), rb_assembly_expansion, and libMesh::NumericVector< T >::zero().

Referenced by assemble_all_affine_vectors().

1142 {
1143  libmesh_error_msg_if(q >= get_rb_theta_expansion().get_n_F_terms(),
1144  "Error: We must have q < Q_f in assemble_Fq_vector.");
1145 
1146  input_vector->zero();
1147 
1150  nullptr,
1151  input_vector,
1152  false, /* symmetrize */
1153  apply_dof_constraints /* apply_dof_constraints */);
1154 }
ElemAssembly & get_F_assembly(unsigned int q)
Return a reference to the specified F_assembly object.
virtual void zero()=0
Set all entries to zero.
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
void add_scaled_matrix_and_vector(Number scalar, ElemAssembly *elem_assembly, SparseMatrix< Number > *input_matrix, NumericVector< Number > *input_vector, bool symmetrize=false, bool apply_dof_constraints=true)
This function loops over the mesh and applies the specified interior and/or boundary assembly routine...
RBAssemblyExpansion * rb_assembly_expansion
This member holds the (parameter independent) assembly functors that define the "affine expansion" of...

◆ assemble_inner_product_matrix()

void libMesh::RBConstruction::assemble_inner_product_matrix ( SparseMatrix< Number > *  input_matrix,
bool  apply_dof_constraints = true 
)

Assemble the inner product matrix and store it in input_matrix.

Definition at line 1006 of file rb_construction.C.

References add_scaled_matrix_and_vector(), energy_inner_product_coeffs, libMesh::RBAssemblyExpansion::get_A_assembly(), libMesh::RBThetaExpansion::get_n_A_terms(), get_rb_theta_expansion(), inner_product_assembly, rb_assembly_expansion, use_energy_inner_product, and libMesh::SparseMatrix< T >::zero().

Referenced by assemble_misc_matrices().

1008 {
1009  input_matrix->zero();
1010 
1012  {
1015  input_matrix,
1016  nullptr,
1017  false, /* symmetrize */
1018  apply_dof_constraints);
1019  }
1020  else
1021  {
1022  libmesh_error_msg_if(energy_inner_product_coeffs.size() != get_rb_theta_expansion().get_n_A_terms(),
1023  "Error: invalid number of entries in energy_inner_product_coeffs.");
1024 
1025  // We symmetrize below so that we may use the energy inner-product even in cases
1026  // where the A_q are not symmetric.
1027  for (unsigned int q_a=0; q_a<get_rb_theta_expansion().get_n_A_terms(); q_a++)
1028  {
1031  input_matrix,
1032  nullptr,
1033  true, /* symmetrize */
1034  apply_dof_constraints);
1035  }
1036  }
1037 }
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form.
std::vector< Number > energy_inner_product_coeffs
We may optionally want to use the "energy inner-product" rather than the inner-product assembly speci...
bool use_energy_inner_product
Boolean to indicate whether we&#39;re using the energy inner-product.
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
virtual void zero()=0
Set all entries to 0.
void add_scaled_matrix_and_vector(Number scalar, ElemAssembly *elem_assembly, SparseMatrix< Number > *input_matrix, NumericVector< Number > *input_vector, bool symmetrize=false, bool apply_dof_constraints=true)
This function loops over the mesh and applies the specified interior and/or boundary assembly routine...
ElemAssembly * inner_product_assembly
Pointer to inner product assembly.
ElemAssembly & get_A_assembly(unsigned int q)
Return a reference to the specified A_assembly object.
RBAssemblyExpansion * rb_assembly_expansion
This member holds the (parameter independent) assembly functors that define the "affine expansion" of...

◆ assemble_misc_matrices()

void libMesh::RBConstruction::assemble_misc_matrices ( )
protectedvirtual

Assemble and store all the inner-product matrix, the constraint matrix (for constrained problems) and the mass matrix (for time-dependent problems).

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 1081 of file rb_construction.C.

References assemble_inner_product_matrix(), inner_product_matrix, non_dirichlet_inner_product_matrix, libMesh::out, store_dirichlet_operators, and store_non_dirichlet_operators.

Referenced by assemble_affine_expansion(), and libMesh::TransientRBConstruction::assemble_misc_matrices().

1082 {
1084  {
1085  libMesh::out << "Assembling inner product matrix" << std::endl;
1087  }
1088 
1090  {
1091  libMesh::out << "Assembling non-Dirichlet inner product matrix" << std::endl;
1093  }
1094 }
bool store_dirichlet_operators
Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enfor...
std::unique_ptr< SparseMatrix< Number > > inner_product_matrix
The inner product matrix.
void assemble_inner_product_matrix(SparseMatrix< Number > *input_matrix, bool apply_dof_constraints=true)
Assemble the inner product matrix and store it in input_matrix.
std::unique_ptr< SparseMatrix< Number > > non_dirichlet_inner_product_matrix
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...
OStreamProxy out

◆ assemble_qoi()

void libMesh::ExplicitSystem::assemble_qoi ( const QoISet qoi_indices = QoISet())
overridevirtualinherited

Prepares qoi for quantity of interest assembly, then calls user qoi function.

Can be overridden in derived classes.

Reimplemented from libMesh::System.

Reimplemented in libMesh::FEMSystem.

Definition at line 54 of file explicit_system.C.

References libMesh::System::assemble_qoi(), libMesh::QoISet::has_index(), libMesh::make_range(), libMesh::System::n_qois(), and libMesh::System::set_qoi().

Referenced by libMesh::ImplicitSystem::adjoint_qoi_parameter_sensitivity(), libMesh::ImplicitSystem::forward_qoi_parameter_sensitivity(), libMesh::Euler2Solver::integrate_qoi_timestep(), libMesh::EulerSolver::integrate_qoi_timestep(), libMesh::SteadySolver::integrate_qoi_timestep(), libMesh::ImplicitSystem::qoi_parameter_hessian(), and libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product().

55 {
56  // The user quantity of interest assembly gets to expect to
57  // accumulate on initially zero values
58  for (auto i : make_range(this->n_qois()))
59  if (qoi_indices.has_index(i))
60  this->set_qoi(i, 0);
61 
62  Parent::assemble_qoi (qoi_indices);
63 }
unsigned int n_qois() const
Number of currently active quantities of interest.
Definition: system.h:2562
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
void set_qoi(unsigned int qoi_index, Number qoi_value)
Definition: system.C:2171
virtual void assemble_qoi(const QoISet &qoi_indices=QoISet())
Calls user qoi function.
Definition: system.C:565

◆ assemble_qoi_derivative()

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

Prepares adjoint_rhs for quantity of interest derivative assembly, then calls user qoi derivative function.

Can be overridden in derived classes.

Reimplemented from libMesh::System.

Reimplemented in libMesh::FEMSystem.

Definition at line 67 of file explicit_system.C.

References libMesh::System::add_adjoint_rhs(), libMesh::System::assemble_qoi_derivative(), libMesh::QoISet::has_index(), libMesh::make_range(), libMesh::System::n_qois(), and libMesh::NumericVector< T >::zero().

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

70 {
71  // The user quantity of interest derivative assembly gets to expect
72  // to accumulate on initially zero vectors
73  for (auto i : make_range(this->n_qois()))
74  if (qoi_indices.has_index(i))
75  this->add_adjoint_rhs(i).zero();
76 
77  Parent::assemble_qoi_derivative (qoi_indices, include_liftfunc,
78  apply_constraints);
79 }
unsigned int n_qois() const
Number of currently active quantities of interest.
Definition: system.h:2562
virtual void assemble_qoi_derivative(const QoISet &qoi_indices=QoISet(), bool include_liftfunc=true, bool apply_constraints=true)
Calls user qoi derivative function.
Definition: system.C:576
virtual void zero()=0
Set all entries to zero.
NumericVector< Number > & add_adjoint_rhs(unsigned int i=0)
Definition: system.C:1284
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173

◆ assemble_residual_derivatives()

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

Residual parameter derivative function.

Uses finite differences by default.

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

Can be overridden in derived classes.

Reimplemented from libMesh::System.

Definition at line 474 of file implicit_system.C.

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

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

475 {
476  ParameterVector & parameters_vec =
477  const_cast<ParameterVector &>(parameters_in);
478 
479  const unsigned int Np = cast_int<unsigned int>
480  (parameters_vec.size());
481 
482  for (unsigned int p=0; p != Np; ++p)
483  {
484  NumericVector<Number> & sensitivity_rhs = this->add_sensitivity_rhs(p);
485 
486  // Approximate -(partial R / partial p) by
487  // (R(p-dp) - R(p+dp)) / (2*dp)
488 
489  Number old_parameter = *parameters_vec[p];
490 
491  const Real delta_p =
492  TOLERANCE * std::max(std::abs(old_parameter), 1e-3);
493 
494  *parameters_vec[p] -= delta_p;
495 
496  // this->assembly(true, false, true);
497  this->assembly(true, false, false);
498  this->rhs->close();
499  sensitivity_rhs = *this->rhs;
500 
501  *parameters_vec[p] = old_parameter + delta_p;
502 
503  // this->assembly(true, false, true);
504  this->assembly(true, false, false);
505  this->rhs->close();
506 
507  sensitivity_rhs -= *this->rhs;
508  sensitivity_rhs /= (2*delta_p);
509  sensitivity_rhs.close();
510 
511  *parameters_vec[p] = old_parameter;
512  }
513 }
static constexpr Real TOLERANCE
NumericVector< Number > * rhs
The system matrix.
NumericVector< Number > & add_sensitivity_rhs(unsigned int i=0)
Definition: system.C:1314
virtual void assembly(bool, bool, bool=false, bool=false)
Assembles a residual in rhs and/or a jacobian in matrix, as requested.
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
template class LIBMESH_EXPORT NumericVector< Number >

◆ assembly()

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

Assembles a residual in rhs and/or a jacobian in matrix, as requested.

Reimplemented from libMesh::ImplicitSystem.

Definition at line 367 of file linear_implicit_system.C.

References libMesh::NumericVector< T >::add_vector(), libMesh::LinearImplicitSystem::assemble(), libMesh::NumericVector< T >::close(), libMesh::SparseMatrix< T >::close(), libMesh::ImplicitSystem::matrix, libMesh::ExplicitSystem::rhs, and libMesh::System::solution.

371 {
372  // Residual R(u(p),p) := A(p)*u(p) - b(p)
373  // partial R / partial u = A
374 
375  this->assemble();
376  this->rhs->close();
377  this->matrix->close();
378 
379  *(this->rhs) *= -1.0;
380  this->rhs->add_vector(*this->solution, *this->matrix);
381 }
virtual void assemble() override
Prepares matrix and _dof_map for matrix assembly.
virtual void add_vector(const T *v, const std::vector< numeric_index_type > &dof_indices)
Computes , where v is a pointer and each dof_indices[i] specifies where to add value v[i]...
NumericVector< Number > * rhs
The system matrix.
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
SparseMatrix< Number > * matrix
The system matrix.

◆ attach_assemble_function()

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

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

Definition at line 1954 of file system.C.

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

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

1956 {
1958 
1959  if (_assemble_system_object != nullptr)
1960  {
1961  libmesh_warning("WARNING: Cannot specify both assembly function and object!");
1962 
1963  _assemble_system_object = nullptr;
1964  }
1965 
1967 }
Assembly * _assemble_system_object
Object that assembles the system.
Definition: system.h:2182
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:81
libmesh_assert(ctx)
void(* _assemble_system_function)(EquationSystems &es, const std::string &name)
Function that assembles the system.
Definition: system.h:2176

◆ attach_assemble_object()

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

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

Definition at line 1971 of file system.C.

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

Referenced by main().

1972 {
1973  if (_assemble_system_function != nullptr)
1974  {
1975  libmesh_warning("WARNING: Cannot specify both assembly object and function!");
1976 
1977  _assemble_system_function = nullptr;
1978  }
1979 
1980  _assemble_system_object = &assemble_in;
1981 }
Assembly * _assemble_system_object
Object that assembles the system.
Definition: system.h:2182
void(* _assemble_system_function)(EquationSystems &es, const std::string &name)
Function that assembles the system.
Definition: system.h:2176

◆ attach_constraint_function()

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

Register a user function for imposing constraints.

Definition at line 1985 of file system.C.

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

1987 {
1989 
1990  if (_constrain_system_object != nullptr)
1991  {
1992  libmesh_warning("WARNING: Cannot specify both constraint function and object!");
1993 
1994  _constrain_system_object = nullptr;
1995  }
1996 
1998 }
void(* _constrain_system_function)(EquationSystems &es, const std::string &name)
Function to impose constraints.
Definition: system.h:2187
Constraint * _constrain_system_object
Object that constrains the system.
Definition: system.h:2193
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:81
libmesh_assert(ctx)

◆ attach_constraint_object()

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

Register a user object for imposing constraints.

Definition at line 2002 of file system.C.

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

Referenced by libMesh::VariationalMeshSmoother::setup(), and DofMapTest::testConstraintLoopDetection().

2003 {
2004  if (_constrain_system_function != nullptr)
2005  {
2006  libmesh_warning("WARNING: Cannot specify both constraint object and function!");
2007 
2008  _constrain_system_function = nullptr;
2009  }
2010 
2011  _constrain_system_object = &constrain;
2012 }
void(* _constrain_system_function)(EquationSystems &es, const std::string &name)
Function to impose constraints.
Definition: system.h:2187
Constraint * _constrain_system_object
Object that constrains the system.
Definition: system.h:2193

◆ attach_init_function()

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

Register a user function to use in initializing the system.

Definition at line 1923 of file system.C.

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

Referenced by main().

1925 {
1927 
1928  if (_init_system_object != nullptr)
1929  {
1930  libmesh_warning("WARNING: Cannot specify both initialization function and object!");
1931 
1932  _init_system_object = nullptr;
1933  }
1934 
1936 }
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:81
libmesh_assert(ctx)
Initialization * _init_system_object
Object that initializes the system.
Definition: system.h:2171
void(* _init_system_function)(EquationSystems &es, const std::string &name)
Function that initializes the system.
Definition: system.h:2165

◆ attach_init_object()

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

Register a user class to use to initialize the system.

Note
This is exclusive with the attach_init_function.

Definition at line 1940 of file system.C.

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

1941 {
1942  if (_init_system_function != nullptr)
1943  {
1944  libmesh_warning("WARNING: Cannot specify both initialization object and function!");
1945 
1946  _init_system_function = nullptr;
1947  }
1948 
1949  _init_system_object = &init_in;
1950 }
Initialization * _init_system_object
Object that initializes the system.
Definition: system.h:2171
void(* _init_system_function)(EquationSystems &es, const std::string &name)
Function that initializes the system.
Definition: system.h:2165

◆ attach_QOI_derivative()

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

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

Definition at line 2059 of file system.C.

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

2061 {
2063 
2064  if (_qoi_evaluate_derivative_object != nullptr)
2065  {
2066  libmesh_warning("WARNING: Cannot specify both QOI derivative function and object!");
2067 
2069  }
2070 
2072 }
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:81
QOIDerivative * _qoi_evaluate_derivative_object
Object to compute derivatives of quantities of interest.
Definition: system.h:2219
libmesh_assert(ctx)
void(* _qoi_evaluate_derivative_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices, bool include_liftfunc, bool apply_constraints)
Function to evaluate quantity of interest derivative.
Definition: system.h:2210

◆ attach_QOI_derivative_object()

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

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

Definition at line 2076 of file system.C.

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

2077 {
2078  if (_qoi_evaluate_derivative_function != nullptr)
2079  {
2080  libmesh_warning("WARNING: Cannot specify both QOI derivative object and function!");
2081 
2083  }
2084 
2085  _qoi_evaluate_derivative_object = &qoi_derivative;
2086 }
QOIDerivative * _qoi_evaluate_derivative_object
Object to compute derivatives of quantities of interest.
Definition: system.h:2219
void(* _qoi_evaluate_derivative_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices, bool include_liftfunc, bool apply_constraints)
Function to evaluate quantity of interest derivative.
Definition: system.h:2210

◆ attach_QOI_function()

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

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

Definition at line 2027 of file system.C.

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

2030 {
2032 
2033  if (_qoi_evaluate_object != nullptr)
2034  {
2035  libmesh_warning("WARNING: Cannot specify both QOI function and object!");
2036 
2037  _qoi_evaluate_object = nullptr;
2038  }
2039 
2041 }
void(* _qoi_evaluate_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices)
Function to evaluate quantity of interest.
Definition: system.h:2198
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:81
libmesh_assert(ctx)
QOI * _qoi_evaluate_object
Object to compute quantities of interest.
Definition: system.h:2205

◆ attach_QOI_object()

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

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

Definition at line 2045 of file system.C.

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

2046 {
2047  if (_qoi_evaluate_function != nullptr)
2048  {
2049  libmesh_warning("WARNING: Cannot specify both QOI object and function!");
2050 
2051  _qoi_evaluate_function = nullptr;
2052  }
2053 
2054  _qoi_evaluate_object = &qoi_in;
2055 }
void(* _qoi_evaluate_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices)
Function to evaluate quantity of interest.
Definition: system.h:2198
QOI * _qoi_evaluate_object
Object to compute quantities of interest.
Definition: system.h:2205

◆ attach_shell_matrix()

void libMesh::LinearImplicitSystem::attach_shell_matrix ( ShellMatrix< Number > *  shell_matrix)
inherited

This function enables the user to provide a shell matrix, i.e.

a matrix that is not stored element-wise, but as a function. When you register your shell matrix using this function, calling solve() will no longer use the matrix member but the registered shell matrix instead. You can reset this behaviour to its original state by supplying a nullptr to this function.

Definition at line 165 of file linear_implicit_system.C.

References libMesh::LinearImplicitSystem::_shell_matrix.

Referenced by libMesh::LinearImplicitSystem::detach_shell_matrix(), and main().

166 {
167  _shell_matrix = shell_matrix;
168 }
ShellMatrix< Number > * _shell_matrix
User supplies shell matrix or nullptr if no shell matrix is used.

◆ boundary_project_solution() [1/2]

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

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

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

Only degrees of freedom which affect the function's trace on a boundary in the set b are affected. Only degrees of freedom associated with the variables listed in the vector variables are projected. The function value f and its gradient g are user-provided cloneable functors. A gradient g is only required/used for projecting onto finite element spaces with continuous derivatives. elem_range active_local_range, if provided, indicates the range of elements over which to perform the projection.

Definition at line 1305 of file system_projection.C.

References b.

Referenced by SystemsTest::testBoundaryProjectCube().

1310 {
1311  this->boundary_project_vector(b, variables, *solution, f, g, -1 /*is_adjoint*/, active_local_range);
1312 
1313  solution->localize(*current_local_solution);
1314 }
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
static const Real b
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1667
void boundary_project_vector(const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1, std::optional< ConstElemRange > active_local_range=std::nullopt) const
Projects arbitrary boundary functions onto a vector of degree of freedom values for the current syste...

◆ boundary_project_solution() [2/2]

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

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

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

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

Definition at line 1286 of file system_projection.C.

References b, fptr(), and gptr().

1293 {
1294  WrappedFunction<Number> f(*this, fptr, &function_parameters);
1295  WrappedFunction<Gradient> g(*this, gptr, &function_parameters);
1296  this->boundary_project_solution(b, variables, &f, &g, active_local_range);
1297 }
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:81
void boundary_project_solution(const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, std::optional< ConstElemRange > active_local_range=std::nullopt)
Projects arbitrary boundary functions onto a vector of degree of freedom values for the current syste...
static const Real b
Gradient gptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:96

◆ boundary_project_vector() [1/2]

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

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

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

Only degrees of freedom which affect the function's trace on a boundary in the set b are affected. Only degrees of freedom associated with the variables listed in the vector variables are projected. The function value f and its gradient g are user-provided cloneable functors. A gradient g is only required/used for projecting onto finite element spaces with continuous derivatives. elem_range active_local_range, if provided, indicates the range of elements over which to perform the projection.

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

Definition at line 1343 of file system_projection.C.

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

1350 {
1351  LOG_SCOPE ("boundary_project_vector()", "System");
1352 
1353  if (!active_local_range)
1354  {
1355  active_local_range.emplace
1356  (this->get_mesh().active_local_elements_begin(),
1357  this->get_mesh().active_local_elements_end());
1358  }
1359 
1361  (active_local_range.value(),
1362  BoundaryProjectSolution(b, variables, *this, f, g,
1364  new_vector)
1365  );
1366 
1367  // We don't do SCALAR dofs when just projecting the boundary, so
1368  // we're done here.
1369 
1370  new_vector.close();
1371 
1372 #ifdef LIBMESH_ENABLE_CONSTRAINTS
1373  if (is_adjoint == -1)
1374  this->get_dof_map().enforce_constraints_exactly(*this, &new_vector);
1375  else if (is_adjoint >= 0)
1377  is_adjoint);
1378 #else
1379  libmesh_ignore(is_adjoint);
1380 #endif
1381 }
void parallel_for(const Range &range, const Body &body, unsigned int n_threads=libMesh::n_threads())
Execute the provided function object in parallel on the specified range.
Definition: threads_none.h:73
const EquationSystems & get_equation_systems() const
Definition: system.h:767
Parameters parameters
Parameters for the system. If a parameter is not provided, it should be retrieved from the EquationSy...
Definition: system.h:1588
const MeshBase & get_mesh() const
Definition: system.h:2401
void enforce_adjoint_constraints_exactly(NumericVector< Number > &v, unsigned int q) const
Heterogeneously constrains the numeric vector v, which represents an adjoint solution defined on the ...
Definition: dof_map.h:2522
void libmesh_ignore(const Args &...)
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
static const Real b
const DofMap & get_dof_map() const
Definition: system.h:2417
void enforce_constraints_exactly(const System &system, NumericVector< Number > *v=nullptr, bool homogeneous=false) const
Constrains the numeric vector v, which represents a solution defined on the mesh. ...
Definition: dof_map.h:2518

◆ boundary_project_vector() [2/2]

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

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

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

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

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

Definition at line 1324 of file system_projection.C.

References b, fptr(), and gptr().

1332 {
1333  WrappedFunction<Number> f(*this, fptr, &function_parameters);
1334  WrappedFunction<Gradient> g(*this, gptr, &function_parameters);
1335  this->boundary_project_vector(b, variables, new_vector, &f, &g,
1336  is_adjoint, active_local_range);
1337 }
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:81
static const Real b
Gradient gptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:96
void boundary_project_vector(const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1, std::optional< ConstElemRange > active_local_range=std::nullopt) const
Projects arbitrary boundary functions onto a vector of degree of freedom values for the current syste...

◆ broadcast_parameters()

void libMesh::RBConstructionBase< LinearImplicitSystem >::broadcast_parameters ( const unsigned int  proc_id)
inherited

Broadcasts parameters from processor proc_id to all processors.

This broadcasts the RBParameters object from .get_parameters(), and then sets it on all processors with .set_parameters().

Definition at line 720 of file rb_construction_base.C.

Referenced by compute_max_error_bound().

721 {
722  libmesh_assert_less (proc_id, this->n_processors());
723 
724  // create a copy of the current parameters
725  RBParameters current_parameters = get_parameters();
726  libmesh_error_msg_if(current_parameters.n_samples()!=1,
727  "Only single-sample RBParameter objects can be broadcast.");
728 
729  // Serialize the current_parameters to current_parameters_vector in order to broadcast.
730  // We handle multiple samples and vector values.
731  // However, the vector values are assumed to remain the same size across samples.
732  const std::size_t nparams = current_parameters.n_parameters();
733  const std::size_t nsamples = current_parameters.n_samples();
734 
735  // First we get the sizes of all the parameter value vectors.
736  std::vector<std::size_t> param_value_sizes;
737  param_value_sizes.reserve(nparams);
738  for (const auto & pr : current_parameters)
739  param_value_sizes.push_back(pr.second[0].size());
740 
741  // Broadcast the sizes vector and reserve memory.
742  this->comm().broadcast(param_value_sizes, proc_id);
743  std::size_t buffsize = std::accumulate(param_value_sizes.cbegin(), param_value_sizes.cend(), 0ul);
744  std::vector<Real> serialized_parameters;
745  serialized_parameters.reserve(buffsize);
746 
747  // Then we serialize the parameters/sample/value vectors into a single vector.
748  for (const auto & pr : current_parameters)
749  {
750  for (const auto sample_idx : make_range(nsamples))
751  serialized_parameters.insert(serialized_parameters.end(),
752  pr.second[sample_idx].cbegin(),
753  pr.second[sample_idx].cend());
754  }
755 
756  // Do the broadcasts.
757  this->comm().broadcast(serialized_parameters, proc_id);
758 
759  // Deserialize into the copy of the RBParameters object.
760  std::size_t param_idx = 0;
761  auto val_idx = serialized_parameters.cbegin();
762  for (const auto & pr : current_parameters)
763  {
764  const std::size_t param_value_size = param_value_sizes[param_idx];
765  for (const auto sample_idx: make_range(nsamples))
766  {
767  auto end_val_idx = std::next(val_idx,param_value_size);
768  RBParameter sample_val(val_idx, end_val_idx);
769  current_parameters.set_value(pr.first, sample_idx, sample_val);
770  val_idx = end_val_idx;
771  }
772  ++param_idx;
773  }
774 
775  // Overwrite the parameters globally.
776  set_parameters(current_parameters);
777 }
const Parallel::Communicator & comm() const
processor_id_type n_processors() const
std::vector< Real > RBParameter
Typedef for an individual RB parameter.
Definition: rb_parameters.h:39
const RBParameters & get_parameters() const
Get the current parameters.
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
bool set_parameters(const RBParameters &params)
Set the current parameters to params The parameters are checked for validity; an error is thrown if t...
static const unsigned int next[3]
A lookup table for the increment modulo 3 operation, for iterating through the three nodes per elemen...
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173

◆ build_context()

std::unique_ptr< DGFEMContext > libMesh::RBConstruction::build_context ( )
protectedvirtual

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

We use DGFEMContext since it allows for both DG and continuous Galerkin formulations.

Definition at line 636 of file rb_construction.C.

Referenced by add_scaled_matrix_and_vector().

637 {
638  return std::make_unique<DGFEMContext>(*this);
639 }

◆ build_zero_dirichlet_boundary_object()

std::unique_ptr< DirichletBoundary > libMesh::RBConstruction::build_zero_dirichlet_boundary_object ( )
static

It's helpful to be able to generate a DirichletBoundary that stores a ZeroFunction in order to impose Dirichlet boundary conditions.

Definition at line 2527 of file rb_construction.C.

Referenced by SimpleRBConstruction::init_data().

2528 {
2529  ZeroFunction<> zf;
2530 
2531  std::set<boundary_id_type> dirichlet_ids;
2532  std::vector<unsigned int> variables;
2533 
2534  // The DirichletBoundary constructor clones zf, so it's OK that zf is only in local scope
2535  return std::make_unique<DirichletBoundary>(dirichlet_ids, variables, &zf);
2536 }

◆ calculate_norm() [1/2]

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

Definition at line 1506 of file system.C.

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

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

1510 {
1511  //short circuit to save time
1512  if (norm_type == DISCRETE_L1 ||
1513  norm_type == DISCRETE_L2 ||
1514  norm_type == DISCRETE_L_INF)
1515  return discrete_var_norm(v,var,norm_type);
1516 
1517  // Not a discrete norm
1518  std::vector<FEMNormType> norms(this->n_vars(), L2);
1519  std::vector<Real> weights(this->n_vars(), 0.0);
1520  norms[var] = norm_type;
1521  weights[var] = 1.0;
1522  Real val = this->calculate_norm(v, SystemNorm(norms, weights), skip_dimensions);
1523  return val;
1524 }
Real calculate_norm(const NumericVector< Number > &v, unsigned int var, FEMNormType norm_type, std::set< unsigned int > *skip_dimensions=nullptr) const
Definition: system.C:1506
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Real discrete_var_norm(const NumericVector< Number > &v, unsigned int var, FEMNormType norm_type) const
Finds the discrete norm for the entries in the vector corresponding to Dofs associated with var...
Definition: system.C:1487
unsigned int n_vars() const
Definition: system.C:2669

◆ calculate_norm() [2/2]

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

Definition at line 1528 of file system.C.

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

1531 {
1532  // This function must be run on all processors at once
1533  parallel_object_only();
1534 
1535  LOG_SCOPE ("calculate_norm()", "System");
1536 
1537  // Zero the norm before summation
1538  Real v_norm = 0.;
1539 
1540  if (norm.is_discrete())
1541  {
1542  //Check to see if all weights are 1.0 and all types are equal
1543  FEMNormType norm_type0 = norm.type(0);
1544  unsigned int check_var = 0, check_end = this->n_vars();
1545  for (; check_var != check_end; ++check_var)
1546  if ((norm.weight(check_var) != 1.0) || (norm.type(check_var) != norm_type0))
1547  break;
1548 
1549  //All weights were 1.0 so just do the full vector discrete norm
1550  if (check_var == this->n_vars())
1551  {
1552  if (norm_type0 == DISCRETE_L1)
1553  return v.l1_norm();
1554  if (norm_type0 == DISCRETE_L2)
1555  return v.l2_norm();
1556  if (norm_type0 == DISCRETE_L_INF)
1557  return v.linfty_norm();
1558  else
1559  libmesh_error_msg("Invalid norm_type0 = " << Utility::enum_to_string(norm_type0));
1560  }
1561 
1562  for (auto var : make_range(this->n_vars()))
1563  {
1564  // Skip any variables we don't need to integrate
1565  if (norm.weight(var) == 0.0)
1566  continue;
1567 
1568  v_norm += norm.weight(var) * discrete_var_norm(v, var, norm.type(var));
1569  }
1570 
1571  return v_norm;
1572  }
1573 
1574  // Localize the potentially parallel vector
1575  std::unique_ptr<NumericVector<Number>> local_v = NumericVector<Number>::build(this->comm());
1576  local_v->init(v.size(), v.local_size(), _dof_map->get_send_list(),
1577  true, GHOSTED);
1578  v.localize (*local_v, _dof_map->get_send_list());
1579 
1580  // I'm not sure how best to mix Hilbert norms on some variables (for
1581  // which we'll want to square then sum then square root) with norms
1582  // like L_inf (for which we'll just want to take an absolute value
1583  // and then sum).
1584  bool using_hilbert_norm = true,
1585  using_nonhilbert_norm = true;
1586 
1587  // Loop over all variables
1588  for (auto var : make_range(this->n_vars()))
1589  {
1590  // Skip any variables we don't need to integrate
1591  Real norm_weight_sq = norm.weight_sq(var);
1592  if (norm_weight_sq == 0.0)
1593  continue;
1594  Real norm_weight = norm.weight(var);
1595 
1596  // Check for unimplemented norms (rather than just returning 0).
1597  FEMNormType norm_type = norm.type(var);
1598  if ((norm_type==H1) ||
1599  (norm_type==H2) ||
1600  (norm_type==L2) ||
1601  (norm_type==H1_SEMINORM) ||
1602  (norm_type==H2_SEMINORM))
1603  {
1604  if (!using_hilbert_norm)
1605  libmesh_not_implemented();
1606  using_nonhilbert_norm = false;
1607  }
1608  else if ((norm_type==L1) ||
1609  (norm_type==L_INF) ||
1610  (norm_type==W1_INF_SEMINORM) ||
1611  (norm_type==W2_INF_SEMINORM))
1612  {
1613  if (!using_nonhilbert_norm)
1614  libmesh_not_implemented();
1615  using_hilbert_norm = false;
1616  }
1617  else
1618  libmesh_not_implemented();
1619 
1620  const FEType & fe_type = this->get_dof_map().variable_type(var);
1621 
1622  // Allow space for dims 0-3, and for both scalar and vector
1623  // elements, even if we don't use them all
1624  std::vector<std::unique_ptr<FEBase>> fe_ptrs(4);
1625  std::vector<std::unique_ptr<FEVectorBase>> vec_fe_ptrs(4);
1626  std::vector<std::unique_ptr<QBase>> q_rules(4);
1627 
1628  const std::set<unsigned char> & elem_dims = _mesh.elem_dimensions();
1629 
1630  // Prepare finite elements for each dimension present in the mesh
1631  for (const auto & dim : elem_dims)
1632  {
1633  if (skip_dimensions && skip_dimensions->find(dim) != skip_dimensions->end())
1634  continue;
1635 
1636  // Construct quadrature and finite element objects
1637  q_rules[dim] = fe_type.default_quadrature_rule (dim);
1638 
1639  const FEFieldType field_type = FEInterface::field_type(fe_type);
1640  if (field_type == TYPE_SCALAR)
1641  {
1642  fe_ptrs[dim] = FEBase::build(dim, fe_type);
1643  fe_ptrs[dim]->attach_quadrature_rule (q_rules[dim].get());
1644  }
1645  else
1646  {
1647  vec_fe_ptrs[dim] = FEVectorBase::build(dim, fe_type);
1648  vec_fe_ptrs[dim]->attach_quadrature_rule (q_rules[dim].get());
1649  libmesh_assert_equal_to(field_type, TYPE_VECTOR);
1650  }
1651 
1652  }
1653 
1654  std::vector<dof_id_type> dof_indices;
1655 
1656  // Begin the loop over the elements
1657  for (const auto & elem : this->get_mesh().active_local_element_ptr_range())
1658  {
1659  const unsigned int dim = elem->dim();
1660 
1661  // One way for implementing this would be to exchange the fe with the FEInterface- class.
1662  // However, it needs to be discussed whether integral-norms make sense for infinite elements.
1663  // or in which sense they could make sense.
1664  if (elem->infinite() )
1665  libmesh_not_implemented();
1666 
1667  if (skip_dimensions && skip_dimensions->find(dim) != skip_dimensions->end())
1668  continue;
1669 
1670  QBase * qrule = q_rules[dim].get();
1671  libmesh_assert(qrule);
1672 
1673  this->get_dof_map().dof_indices (elem, dof_indices, var);
1674 
1675  auto element_calculation = [&dof_indices, &elem,
1676  norm_type, norm_weight, norm_weight_sq, &qrule,
1677  &local_v, &v_norm](auto & fe) {
1678  typedef typename std::remove_reference<decltype(fe)>::type::OutputShape OutputShape;
1679  typedef typename TensorTools::MakeNumber<OutputShape>::type OutputNumberShape;
1680  typedef typename std::remove_reference<decltype(fe)>::type::OutputGradient OutputGradient;
1681  typedef typename TensorTools::MakeNumber<OutputGradient>::type OutputNumberGradient;
1682 
1683  const std::vector<Real> & JxW = fe.get_JxW();
1684  const std::vector<std::vector<OutputShape>> * phi = nullptr;
1685  if (norm_type == H1 ||
1686  norm_type == H2 ||
1687  norm_type == L2 ||
1688  norm_type == L1 ||
1689  norm_type == L_INF)
1690  phi = &(fe.get_phi());
1691 
1692  const std::vector<std::vector<OutputGradient>> * dphi = nullptr;
1693  if (norm_type == H1 ||
1694  norm_type == H2 ||
1695  norm_type == H1_SEMINORM ||
1696  norm_type == W1_INF_SEMINORM)
1697  dphi = &(fe.get_dphi());
1698 
1699 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
1700  typedef typename std::remove_reference<decltype(fe)>::type::OutputTensor OutputTensor;
1701 
1702  const std::vector<std::vector<OutputTensor>> * d2phi = nullptr;
1703  if (norm_type == H2 ||
1704  norm_type == H2_SEMINORM ||
1705  norm_type == W2_INF_SEMINORM)
1706  d2phi = &(fe.get_d2phi());
1707 #endif
1708 
1709  fe.reinit (elem);
1710 
1711  const unsigned int n_qp = qrule->n_points();
1712 
1713  const unsigned int n_sf = cast_int<unsigned int>
1714  (dof_indices.size());
1715 
1716  // Begin the loop over the Quadrature points.
1717  for (unsigned int qp=0; qp<n_qp; qp++)
1718  {
1719  if (norm_type == L1)
1720  {
1721  OutputNumberShape u_h = 0.;
1722  for (unsigned int i=0; i != n_sf; ++i)
1723  u_h += (*phi)[i][qp] * (*local_v)(dof_indices[i]);
1724  v_norm += norm_weight *
1725  JxW[qp] * TensorTools::norm(u_h);
1726  }
1727 
1728  if (norm_type == L_INF)
1729  {
1730  OutputNumberShape u_h = 0.;
1731  for (unsigned int i=0; i != n_sf; ++i)
1732  u_h += (*phi)[i][qp] * (*local_v)(dof_indices[i]);
1733  v_norm = std::max(v_norm, norm_weight * TensorTools::norm(u_h));
1734  }
1735 
1736  if (norm_type == H1 ||
1737  norm_type == H2 ||
1738  norm_type == L2)
1739  {
1740  OutputNumberShape u_h = 0.;
1741  for (unsigned int i=0; i != n_sf; ++i)
1742  u_h += (*phi)[i][qp] * (*local_v)(dof_indices[i]);
1743  v_norm += norm_weight_sq *
1744  JxW[qp] * TensorTools::norm_sq(u_h);
1745  }
1746 
1747  if (norm_type == H1 ||
1748  norm_type == H2 ||
1749  norm_type == H1_SEMINORM)
1750  {
1751  OutputNumberGradient grad_u_h;
1752  for (unsigned int i=0; i != n_sf; ++i)
1753  grad_u_h.add_scaled((*dphi)[i][qp], (*local_v)(dof_indices[i]));
1754  v_norm += norm_weight_sq *
1755  JxW[qp] * grad_u_h.norm_sq();
1756  }
1757 
1758  if (norm_type == W1_INF_SEMINORM)
1759  {
1760  OutputNumberGradient grad_u_h;
1761  for (unsigned int i=0; i != n_sf; ++i)
1762  grad_u_h.add_scaled((*dphi)[i][qp], (*local_v)(dof_indices[i]));
1763  v_norm = std::max(v_norm, norm_weight * grad_u_h.norm());
1764  }
1765 
1766 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
1767  typedef typename TensorTools::MakeNumber<OutputTensor>::type OutputNumberTensor;
1768 
1769  if (norm_type == H2 ||
1770  norm_type == H2_SEMINORM)
1771  {
1772  OutputNumberTensor hess_u_h;
1773  for (unsigned int i=0; i != n_sf; ++i)
1774  hess_u_h.add_scaled((*d2phi)[i][qp], (*local_v)(dof_indices[i]));
1775  v_norm += norm_weight_sq *
1776  JxW[qp] * hess_u_h.norm_sq();
1777  }
1778 
1779  if (norm_type == W2_INF_SEMINORM)
1780  {
1781  OutputNumberTensor hess_u_h;
1782  for (unsigned int i=0; i != n_sf; ++i)
1783  hess_u_h.add_scaled((*d2phi)[i][qp], (*local_v)(dof_indices[i]));
1784  v_norm = std::max(v_norm, norm_weight * hess_u_h.norm());
1785  }
1786 #endif
1787  }
1788  };
1789 
1790  FEBase * scalar_fe = fe_ptrs[dim].get();
1791  FEVectorBase * vec_fe = vec_fe_ptrs[dim].get();
1792 
1793  if (scalar_fe)
1794  {
1795  libmesh_assert(!vec_fe);
1796  element_calculation(*scalar_fe);
1797  }
1798 
1799  if (vec_fe)
1800  {
1801  libmesh_assert(!scalar_fe);
1802  element_calculation(*vec_fe);
1803  }
1804  }
1805  }
1806 
1807  if (using_hilbert_norm)
1808  {
1809  this->comm().sum(v_norm);
1810  v_norm = std::sqrt(v_norm);
1811  }
1812  else
1813  {
1814  this->comm().max(v_norm);
1815  }
1816 
1817  return v_norm;
1818 }
void dof_indices(const Elem *const elem, std::vector< dof_id_type > &di) const
Definition: dof_map.C:2192
auto norm_sq(const T &a)
Definition: tensor_tools.h:104
unsigned int dim
virtual numeric_index_type size() const =0
void sum(T &r) const
static FEFieldType field_type(const FEType &fe_type)
FEMNormType
defines an enum for norms defined on vectors of finite element coefficients
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2225
const Parallel::Communicator & comm() const
FEGenericBase< RealGradient > FEVectorBase
Definition: fe_base.h:818
const MeshBase & get_mesh() const
Definition: system.h:2401
virtual Real l2_norm() const =0
static std::unique_ptr< FEGenericBase > build(const unsigned int dim, const FEType &type)
Builds a specific finite element type.
libmesh_assert(ctx)
const FEType & variable_type(const unsigned int i) const
Definition: dof_map.h:2388
const std::set< unsigned char > & elem_dimensions() const
Definition: mesh_base.h:426
FEGenericBase< Real > FEBase
virtual Real l1_norm() const =0
std::string enum_to_string(const T e)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void max(const T &r, T &o, Request &req) const
auto norm(const T &a)
Definition: tensor_tools.h:74
virtual numeric_index_type local_size() const =0
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
Real discrete_var_norm(const NumericVector< Number > &v, unsigned int var, FEMNormType norm_type) const
Finds the discrete norm for the entries in the vector corresponding to Dofs associated with var...
Definition: system.C:1487
unsigned int n_vars() const
Definition: system.C:2669
const DofMap & get_dof_map() const
Definition: system.h:2417
MeshBase & _mesh
Constant reference to the mesh data structure used for the simulation.
Definition: system.h:2237
virtual Real linfty_norm() const =0
virtual void localize(std::vector< T > &v_local) const =0
Creates a copy of the global vector in the local vector v_local.
FEFieldType
defines an enum for finite element field types - i.e.

◆ can_add_matrices()

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

Definition at line 2028 of file system.h.

References libMesh::System::_matrices_initialized.

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

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

◆ check_convergence()

void libMesh::RBConstruction::check_convergence ( LinearSolver< Number > &  input_solver)
protected

Check if the linear solver reports convergence.

Throw an error when that is not the case.

Definition at line 2736 of file rb_construction.C.

References libMesh::LinearSolver< T >::get_converged_reason().

Referenced by compute_Fq_representor_innerprods(), compute_output_dual_innerprods(), enrich_basis_from_rhs_terms(), libMesh::TransientRBConstruction::truth_solve(), truth_solve(), libMesh::TransientRBConstruction::update_residual_terms(), and update_residual_terms().

2737 {
2739 
2740  conv_flag = input_solver.get_converged_reason();
2741 
2742  libmesh_error_msg_if(conv_flag < 0, "Convergence error. Error id: " << conv_flag);
2743 }
LinearConvergenceReason
Linear solver convergence flags (taken from the PETSc flags).
virtual LinearConvergenceReason get_converged_reason() const =0

◆ check_if_zero_truth_solve()

bool libMesh::RBConstruction::check_if_zero_truth_solve ( ) const
virtual
Returns
true if the most recent truth solve gave a zero solution.

Definition at line 461 of file rb_construction.C.

References libMesh::System::solution.

Referenced by train_reduced_basis_with_greedy().

462 {
463  return (solution->l2_norm() == 0.);
464 }
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655

◆ clear()

void libMesh::RBConstruction::clear ( )
overridevirtual

Clear all the data structures associated with the system.

Reimplemented from libMesh::RBConstructionBase< LinearImplicitSystem >.

Reimplemented in libMesh::TransientSystem< RBConstruction >, and libMesh::TransientRBConstruction.

Definition at line 104 of file rb_construction.C.

References Aq_vector, libMesh::RBConstructionBase< LinearImplicitSystem >::clear(), Fq_representor, Fq_representor_innerprods_computed, Fq_vector, non_dirichlet_Aq_vector, non_dirichlet_Fq_vector, non_dirichlet_outputs_vector, outputs_vector, store_dirichlet_operators, and store_non_dirichlet_operators.

105 {
106  LOG_SCOPE("clear()", "RBConstruction");
107 
108  Parent::clear();
109 
111  {
112  Aq_vector.clear();
113  Fq_vector.clear();
114  outputs_vector.clear();
115  }
116 
118  {
119  non_dirichlet_Aq_vector.clear();
120  non_dirichlet_Fq_vector.clear();
122  }
123 
124  // Also delete the Fq representors
125  Fq_representor.clear();
126 
127  // Set Fq_representor_innerprods_computed flag to false now
128  // that we've cleared the Fq representors
130 }
bool store_dirichlet_operators
Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enfor...
std::vector< std::unique_ptr< NumericVector< Number > > > Fq_representor
Vector storing the residual representors associated with the right-hand side.
std::vector< std::unique_ptr< NumericVector< Number > > > non_dirichlet_Fq_vector
bool Fq_representor_innerprods_computed
A boolean flag to indicate whether or not the Fq representor norms have already been computed — used...
std::vector< std::unique_ptr< SparseMatrix< Number > > > Aq_vector
Vector storing the Q_a matrices from the affine expansion.
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...
std::vector< std::unique_ptr< NumericVector< Number > > > Fq_vector
Vector storing the Q_f vectors in the affine decomposition of the right-hand side.
std::vector< std::unique_ptr< SparseMatrix< Number > > > non_dirichlet_Aq_vector
We may also need a second set of matrices/vectors that do not have the Dirichlet boundary conditions ...
std::vector< std::vector< std::unique_ptr< NumericVector< Number > > > > non_dirichlet_outputs_vector
virtual void clear()
Clear all the data structures associated with the system.
std::vector< std::vector< std::unique_ptr< NumericVector< Number > > > > outputs_vector
The libMesh vectors that define the output functionals.

◆ comm()

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

Definition at line 97 of file parallel_object.h.

References libMesh::ParallelObject::_communicator.

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

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

◆ compare()

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

Definition at line 606 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.

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

◆ compute_Fq_representor_innerprods()

void libMesh::RBConstruction::compute_Fq_representor_innerprods ( bool  compute_inner_products = true)
protectedvirtual

Compute the terms that are combined ‘online’ to determine the dual norm of the residual.

Here we compute the terms associated with the right-hand side. These terms are basis independent, hence we separate them from the rest of the calculations that are done in update_residual_terms. By default, inner product terms are also computed, but you can turn this feature off e.g. if you are already reading in that data from files.

Definition at line 2186 of file rb_construction.C.

References libMesh::NumericVector< T >::add(), assert_convergence, libMesh::NumericVector< T >::build(), check_convergence(), libMesh::ParallelObject::comm(), libMesh::LinearImplicitSystem::final_linear_residual(), Fq_representor, libMesh::RBEvaluation::Fq_representor_innerprods, Fq_representor_innerprods, Fq_representor_innerprods_computed, get_Fq(), libMesh::RBThetaExpansion::get_n_F_terms(), get_non_dirichlet_inner_product_matrix_if_avail(), get_rb_evaluation(), get_rb_theta_expansion(), libMesh::Utility::get_timestamp(), inner_product_matrix, inner_product_solver, libMesh::RBConstructionBase< LinearImplicitSystem >::inner_product_storage_vector, libMesh::RBConstructionBase< LinearImplicitSystem >::is_quiet(), libMesh::libmesh_assert(), libMesh::System::n_dofs(), libMesh::LinearImplicitSystem::n_linear_iterations(), libMesh::System::n_local_dofs(), libMesh::out, libMesh::PARALLEL, libMesh::ExplicitSystem::rhs, libMesh::System::solution, solve_for_matrix_and_rhs(), libMesh::SparseMatrix< T >::vector_mult(), and libMesh::NumericVector< T >::zero().

Referenced by recompute_all_residual_terms(), and train_reduced_basis_with_greedy().

2187 {
2188 
2189  // Skip calculations if we've already computed the Fq_representors
2191  {
2192  // Only log if we get to here
2193  LOG_SCOPE("compute_Fq_representor_innerprods()", "RBConstruction");
2194 
2195  for (unsigned int q_f=0; q_f<get_rb_theta_expansion().get_n_F_terms(); q_f++)
2196  {
2197  if (!Fq_representor[q_f])
2198  {
2200  Fq_representor[q_f]->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
2201  }
2202 
2203  libmesh_assert(Fq_representor[q_f]->size() == this->n_dofs() &&
2204  Fq_representor[q_f]->local_size() == this->n_local_dofs() );
2205 
2206  rhs->zero();
2207  rhs->add(1., *get_Fq(q_f));
2208 
2209  if (!is_quiet())
2210  libMesh::out << "Starting solve q_f=" << q_f
2211  << " in RBConstruction::update_residual_terms() at "
2212  << Utility::get_timestamp() << std::endl;
2213 
2215 
2216  if (assert_convergence)
2218 
2219  if (!is_quiet())
2220  {
2221  libMesh::out << "Finished solve q_f=" << q_f
2222  << " in RBConstruction::update_residual_terms() at "
2223  << Utility::get_timestamp() << std::endl;
2224 
2226  << " iterations, final residual "
2227  << this->final_linear_residual() << std::endl;
2228  }
2229 
2230  *Fq_representor[q_f] = *solution;
2231  }
2232 
2233  if (compute_inner_products)
2234  {
2235  unsigned int q=0;
2236 
2237  for (unsigned int q_f1=0; q_f1<get_rb_theta_expansion().get_n_F_terms(); q_f1++)
2238  {
2240 
2241  for (unsigned int q_f2=q_f1; q_f2<get_rb_theta_expansion().get_n_F_terms(); q_f2++)
2242  {
2244 
2245  q++;
2246  }
2247  }
2248  } // end if (compute_inner_products)
2249 
2251  }
2252 
2254 }
std::vector< Number > Fq_representor_innerprods
Vectors storing the residual representor inner products to be used in computing the residuals online...
std::vector< std::unique_ptr< NumericVector< Number > > > Fq_representor
Vector storing the residual representors associated with the right-hand side.
unsigned int get_n_F_terms() const
Get Q_f, the number of terms in the affine expansion for the right-hand side.
bool assert_convergence
A boolean flag to indicate whether to check for proper convergence after each solve.
void vector_mult(NumericVector< T > &dest, const NumericVector< T > &arg) const
Multiplies the matrix by the NumericVector arg and stores the result in NumericVector dest...
std::string get_timestamp()
Definition: timestamp.C:37
NumericVector< Number > * rhs
The system matrix.
const Parallel::Communicator & comm() const
bool is_quiet() const
Is the system in quiet mode?
std::unique_ptr< SparseMatrix< Number > > inner_product_matrix
The inner product matrix.
NumericVector< Number > * get_Fq(unsigned int q)
Get a pointer to Fq.
dof_id_type n_local_dofs() const
Definition: system.C:155
std::vector< Number > Fq_representor_innerprods
Vectors storing the residual representor inner products to be used in computing the residuals online...
dof_id_type n_dofs() const
Definition: system.C:118
virtual void zero()=0
Set all entries to zero.
std::unique_ptr< NumericVector< Number > > inner_product_storage_vector
We keep an extra temporary vector that is useful for performing inner products (avoids unnecessary me...
virtual void solve_for_matrix_and_rhs(LinearSolver< Number > &input_solver, SparseMatrix< Number > &input_matrix, NumericVector< Number > &input_rhs)
Assembles & solves the linear system A*x=b for the specified matrix input_matrix and right-hand side ...
bool Fq_representor_innerprods_computed
A boolean flag to indicate whether or not the Fq representor norms have already been computed — used...
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
unsigned int n_linear_iterations() const
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
libmesh_assert(ctx)
void check_convergence(LinearSolver< Number > &input_solver)
Check if the linear solver reports convergence.
std::unique_ptr< LinearSolver< Number > > inner_product_solver
We store an extra linear solver object which we can optionally use for solving all systems in which t...
OStreamProxy out
SparseMatrix< Number > * get_non_dirichlet_inner_product_matrix_if_avail()
Get the non-Dirichlet inner-product matrix if it&#39;s available, otherwise get the inner-product matrix ...
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.
virtual void add(const numeric_index_type i, const T value)=0
Adds value to the vector entry specified by i.

◆ compute_max_error_bound()

Real libMesh::RBConstruction::compute_max_error_bound ( )
virtual

(i) Compute the a posteriori error bound for each set of parameters in the training set, (ii) set current_parameters to the parameters that maximize the error bound, and (iii) return the maximum error bound.

Definition at line 1833 of file rb_construction.C.

References libMesh::RBConstructionBase< LinearImplicitSystem >::broadcast_parameters(), libMesh::ParallelObject::comm(), libMesh::RBConstructionBase< LinearImplicitSystem >::get_first_local_training_index(), libMesh::RBConstructionBase< LinearImplicitSystem >::get_global_max_error_pair(), libMesh::RBConstructionBase< LinearImplicitSystem >::get_last_local_training_index(), libMesh::RBConstructionBase< LinearImplicitSystem >::get_local_n_training_samples(), libMesh::RBParametrized::get_n_params(), get_preevaluate_thetas_flag(), get_RB_error_bound(), get_rb_evaluation(), libMesh::ParallelObject::processor_id(), libMesh::Real, libMesh::RBConstructionBase< LinearImplicitSystem >::serial_training_set, set_current_training_parameter_index(), libMesh::RBConstructionBase< LinearImplicitSystem >::set_params_from_training_set(), TIMPI::Communicator::sum(), and training_error_bounds.

Referenced by train_reduced_basis_with_greedy().

1834 {
1835  LOG_SCOPE("compute_max_error_bound()", "RBConstruction");
1836 
1837  // Treat the case with no parameters in a special way
1838  if (get_n_params() == 0)
1839  {
1840  Real max_val;
1841  if (std::numeric_limits<Real>::has_infinity)
1842  {
1843  max_val = std::numeric_limits<Real>::infinity();
1844  }
1845  else
1846  {
1847  max_val = std::numeric_limits<Real>::max();
1848  }
1849 
1850  // Make sure we do at least one solve, but otherwise return a zero error bound
1851  // when we have no parameters
1852  return (get_rb_evaluation().get_n_basis_functions() == 0) ? max_val : 0.;
1853  }
1854 
1856 
1857  // keep track of the maximum error
1858  unsigned int max_err_index = 0;
1859  Real max_err = 0.;
1860 
1862  for (unsigned int i=0; i<get_local_n_training_samples(); i++)
1863  {
1864  // Load training parameter i, this is only loaded
1865  // locally since the RB solves are local.
1866  set_params_from_training_set( first_index+i );
1867 
1868  // In case we pre-evaluate the theta functions,
1869  // also keep track of the current training parameter index.
1871  set_current_training_parameter_index(first_index+i);
1872 
1873 
1875 
1876  if (training_error_bounds[i] > max_err)
1877  {
1878  max_err_index = i;
1879  max_err = training_error_bounds[i];
1880  }
1881  }
1882 
1883  std::pair<numeric_index_type, Real> error_pair(first_index+max_err_index, max_err);
1884  get_global_max_error_pair(this->comm(),error_pair);
1885 
1886  // If we have a serial training set (i.e. a training set that is the same on all processors)
1887  // just set the parameters on all processors
1888  if (serial_training_set)
1889  {
1890  set_params_from_training_set( error_pair.first );
1891  }
1892  // otherwise, broadcast the parameter that produced the maximum error
1893  else
1894  {
1895  unsigned int root_id=0;
1896  if ((get_first_local_training_index() <= error_pair.first) &&
1897  (error_pair.first < get_last_local_training_index()))
1898  {
1899  set_params_from_training_set( error_pair.first );
1900  root_id = this->processor_id();
1901  }
1902 
1903  this->comm().sum(root_id); // root_id is only non-zero on one processor
1904  broadcast_parameters(root_id);
1905  }
1906 
1907  return error_pair.second;
1908 }
numeric_index_type get_first_local_training_index() const
Get the first local index of the training parameters.
std::vector< Real > training_error_bounds
Vector storing the values of the error bound for each parameter in the training set — the parameter ...
void sum(T &r) const
const Parallel::Communicator & comm() const
static void get_global_max_error_pair(const Parallel::Communicator &communicator, std::pair< numeric_index_type, Real > &error_pair)
Static function to return the error pair (index,error) that is corresponds to the largest error on al...
void broadcast_parameters(const unsigned int proc_id)
Broadcasts parameters from processor proc_id to all processors.
bool get_preevaluate_thetas_flag() const
Get/set flag to pre-evaluate the theta functions.
dof_id_type numeric_index_type
Definition: id_types.h:99
numeric_index_type get_last_local_training_index() const
Get the last local index of the training parameters.
numeric_index_type get_local_n_training_samples() const
Get the total number of training samples local to this processor.
virtual Real get_RB_error_bound()
void set_params_from_training_set(unsigned int global_index)
Set parameters to the RBParameters stored in index global_index of the global training set...
void set_current_training_parameter_index(unsigned int index)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
bool serial_training_set
This boolean flag indicates whether or not the training set should be the same on all processors...
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.
processor_id_type processor_id() const
unsigned int get_n_params() const
Get the number of parameters.

◆ compute_output_dual_innerprods()

void libMesh::RBConstruction::compute_output_dual_innerprods ( )
protectedvirtual

Compute and store the dual norm of each output functional.

Definition at line 2091 of file rb_construction.C.

References libMesh::NumericVector< T >::add(), assert_convergence, libMesh::NumericVector< T >::build(), check_convergence(), libMesh::ParallelObject::comm(), libMesh::LinearImplicitSystem::final_linear_residual(), libMesh::LinearImplicitSystem::get_linear_solver(), get_matrix_for_output_dual_solves(), libMesh::RBThetaExpansion::get_n_output_terms(), libMesh::RBThetaExpansion::get_n_outputs(), get_output_vector(), get_rb_evaluation(), get_rb_theta_expansion(), libMesh::Utility::get_timestamp(), libMesh::RBConstructionBase< LinearImplicitSystem >::inner_product_storage_vector, libMesh::RBConstructionBase< LinearImplicitSystem >::is_quiet(), libMesh::ImplicitSystem::linear_solver, libMesh::System::n_dofs(), libMesh::LinearImplicitSystem::n_linear_iterations(), libMesh::System::n_local_dofs(), libMesh::out, libMesh::RBEvaluation::output_dual_innerprods, output_dual_innerprods, output_dual_innerprods_computed, libMesh::PARALLEL, libMesh::ExplicitSystem::rhs, libMesh::System::solution, solve_for_matrix_and_rhs(), libMesh::SparseMatrix< T >::vector_mult(), and libMesh::NumericVector< T >::zero().

Referenced by train_reduced_basis_with_greedy().

2092 {
2093  // Skip calculations if we've already computed the output dual norms
2095  {
2096  // Short circuit if we don't have any outputs
2097  if (get_rb_theta_expansion().get_n_outputs() == 0)
2098  {
2100  return;
2101  }
2102 
2103  // Only log if we get to here
2104  LOG_SCOPE("compute_output_dual_innerprods()", "RBConstruction");
2105 
2106  libMesh::out << "Compute output dual inner products" << std::endl;
2107 
2108  // Find out the largest value of Q_l
2109  unsigned int max_Q_l = 0;
2110  for (unsigned int n=0; n<get_rb_theta_expansion().get_n_outputs(); n++)
2111  max_Q_l = (get_rb_theta_expansion().get_n_output_terms(n) > max_Q_l) ? get_rb_theta_expansion().get_n_output_terms(n) : max_Q_l;
2112 
2113  std::vector<std::unique_ptr<NumericVector<Number>>> L_q_representor(max_Q_l);
2114  for (unsigned int q=0; q<max_Q_l; q++)
2115  {
2116  L_q_representor[q] = NumericVector<Number>::build(this->comm());
2117  L_q_representor[q]->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
2118  }
2119 
2120  for (unsigned int n=0; n<get_rb_theta_expansion().get_n_outputs(); n++)
2121  {
2122  for (unsigned int q_l=0; q_l<get_rb_theta_expansion().get_n_output_terms(n); q_l++)
2123  {
2124  rhs->zero();
2125  rhs->add(1., *get_output_vector(n,q_l));
2126 
2127  if (!is_quiet())
2128  libMesh::out << "Starting solve n=" << n << ", q_l=" << q_l
2129  << " in RBConstruction::compute_output_dual_innerprods() at "
2130  << Utility::get_timestamp() << std::endl;
2131 
2132  // Use the main linear solver here instead of the inner_product solver, since
2133  // get_matrix_for_output_dual_solves() may not return the inner product matrix.
2135 
2136  // We possibly perform multiple solves here with the same matrix, hence
2137  // set reuse_preconditioner(true) (and set it back to false again below
2138  // at the end of this function).
2139  linear_solver->reuse_preconditioner(true);
2140 
2141  if (assert_convergence)
2143 
2144  if (!is_quiet())
2145  {
2146  libMesh::out << "Finished solve n=" << n << ", q_l=" << q_l
2147  << " in RBConstruction::compute_output_dual_innerprods() at "
2148  << Utility::get_timestamp() << std::endl;
2149 
2151  << " iterations, final residual "
2152  << this->final_linear_residual() << std::endl;
2153  }
2154 
2155  *L_q_representor[q_l] = *solution;
2156  }
2157 
2158  unsigned int q=0;
2159  for (unsigned int q_l1=0; q_l1<get_rb_theta_expansion().get_n_output_terms(n); q_l1++)
2160  {
2162 
2163  for (unsigned int q_l2=q_l1; q_l2<get_rb_theta_expansion().get_n_output_terms(n); q_l2++)
2164  {
2165  output_dual_innerprods[n][q] = L_q_representor[q_l2]->dot(*inner_product_storage_vector);
2166  libMesh::out << "output_dual_innerprods[" << n << "][" << q << "] = " << output_dual_innerprods[n][q] << std::endl;
2167 
2168  q++;
2169  }
2170  }
2171  }
2172 
2173  // We may not need to use linear_solver again (e.g. this would happen if we use
2174  // extra_linear_solver for the truth_solves). As a result, let's clear linear_solver
2175  // to release any memory it may be taking up. If we do need it again, it will
2176  // be initialized when necessary.
2177  linear_solver->clear();
2178  linear_solver->reuse_preconditioner(false);
2179 
2181  }
2182 
2184 }
bool assert_convergence
A boolean flag to indicate whether to check for proper convergence after each solve.
void vector_mult(NumericVector< T > &dest, const NumericVector< T > &arg) const
Multiplies the matrix by the NumericVector arg and stores the result in NumericVector dest...
std::string get_timestamp()
Definition: timestamp.C:37
std::vector< std::vector< Number > > output_dual_innerprods
The vector storing the dual norm inner product terms for each output.
NumericVector< Number > * rhs
The system matrix.
const Parallel::Communicator & comm() const
bool is_quiet() const
Is the system in quiet mode?
std::vector< std::vector< Number > > output_dual_innerprods
The vector storing the dual norm inner product terms for each output.
virtual LinearSolver< Number > * get_linear_solver() const override
dof_id_type n_local_dofs() const
Definition: system.C:155
unsigned int get_n_outputs() const
Get n_outputs, the number output functionals.
dof_id_type n_dofs() const
Definition: system.C:118
virtual void zero()=0
Set all entries to zero.
std::unique_ptr< NumericVector< Number > > inner_product_storage_vector
We keep an extra temporary vector that is useful for performing inner products (avoids unnecessary me...
virtual void solve_for_matrix_and_rhs(LinearSolver< Number > &input_solver, SparseMatrix< Number > &input_matrix, NumericVector< Number > &input_rhs)
Assembles & solves the linear system A*x=b for the specified matrix input_matrix and right-hand side ...
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
unsigned int n_linear_iterations() const
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
virtual SparseMatrix< Number > & get_matrix_for_output_dual_solves()
Return the matrix for the output residual dual norm solves.
unsigned int get_n_output_terms(unsigned int output_index) const
Get the number of affine terms associated with the specified output.
void check_convergence(LinearSolver< Number > &input_solver)
Check if the linear solver reports convergence.
OStreamProxy out
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
NumericVector< Number > * get_output_vector(unsigned int n, unsigned int q_l)
Get a pointer to the n^th output.
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.
virtual void add(const numeric_index_type i, const T value)=0
Adds value to the vector entry specified by i.
std::unique_ptr< LinearSolver< Number > > linear_solver
This class handles all the details of interfacing with various linear algebra packages like PETSc or ...
bool output_dual_innerprods_computed
A boolean flag to indicate whether or not the output dual norms have already been computed — used to...

◆ compute_residual_dual_norm_slow()

Real libMesh::RBConstruction::compute_residual_dual_norm_slow ( const unsigned int  N)

The slow (but simple, non-error prone) way to compute the residual dual norm.

Useful for error checking.

Definition at line 2275 of file rb_construction.C.

References _untransformed_basis_functions, libMesh::SparseMatrix< T >::add(), libMesh::NumericVector< T >::add(), libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), libMesh::RBEvaluation::get_n_basis_functions(), get_non_dirichlet_inner_product_matrix_if_avail(), get_rb_evaluation(), inner_product_matrix, inner_product_solver, libMesh::RBConstructionBase< LinearImplicitSystem >::inner_product_storage_vector, libMesh::libmesh_real(), libMesh::ImplicitSystem::matrix, libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), libMesh::PARALLEL, libMesh::ExplicitSystem::rhs, libMesh::System::solution, solve_for_matrix_and_rhs(), store_untransformed_basis, truth_assembly(), libMesh::SparseMatrix< T >::vector_mult(), and libMesh::SparseMatrix< T >::zero().

2276 {
2277  LOG_SCOPE("compute_residual_dual_norm_slow()", "RBConstruction");
2278 
2279  // Put the residual in rhs in order to compute the norm of the Riesz representor
2280  // Note that this only works in serial since otherwise each processor will
2281  // have a different parameter value during the Greedy training.
2282 
2283  std::unique_ptr<NumericVector<Number>> RB_sol = NumericVector<Number>::build(comm());
2284  RB_sol->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
2285 
2286  std::unique_ptr<NumericVector<Number>> temp = NumericVector<Number>::build(comm());
2287  temp->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
2288 
2290  {
2291  libmesh_assert_equal_to(_untransformed_basis_functions.size(), get_rb_evaluation().get_n_basis_functions());
2292  }
2293 
2294  for (unsigned int i=0; i<N; i++)
2295  {
2297  {
2298  RB_sol->add(get_rb_evaluation().RB_solution(i), get_rb_evaluation().get_basis_function(i));
2299  }
2300  else
2301  {
2302  RB_sol->add(get_rb_evaluation().RB_solution(i), *_untransformed_basis_functions[i]);
2303  }
2304  }
2305 
2306  this->truth_assembly();
2307  matrix->vector_mult(*temp, *RB_sol);
2308  rhs->add(-1., *temp);
2309 
2310  // Then solve to get the Reisz representor
2311  matrix->zero();
2313 
2316  Number slow_residual_norm_sq = solution->dot(*inner_product_storage_vector);
2317 
2318  return std::sqrt( libmesh_real(slow_residual_norm_sq) );
2319 }
T libmesh_real(T a)
virtual void truth_assembly()
Assemble the truth matrix and right-hand side for current_parameters.
std::vector< std::unique_ptr< NumericVector< Number > > > _untransformed_basis_functions
In cases where we have dof transformations such as a change of coordinates at some nodes we need to s...
void vector_mult(NumericVector< T > &dest, const NumericVector< T > &arg) const
Multiplies the matrix by the NumericVector arg and stores the result in NumericVector dest...
NumericVector< Number > * rhs
The system matrix.
const Parallel::Communicator & comm() const
std::unique_ptr< SparseMatrix< Number > > inner_product_matrix
The inner product matrix.
dof_id_type n_local_dofs() const
Definition: system.C:155
dof_id_type n_dofs() const
Definition: system.C:118
std::unique_ptr< NumericVector< Number > > inner_product_storage_vector
We keep an extra temporary vector that is useful for performing inner products (avoids unnecessary me...
virtual void add(const numeric_index_type i, const numeric_index_type j, const T value)=0
Add value to the element (i,j).
virtual void solve_for_matrix_and_rhs(LinearSolver< Number > &input_solver, SparseMatrix< Number > &input_matrix, NumericVector< Number > &input_rhs)
Assembles & solves the linear system A*x=b for the specified matrix input_matrix and right-hand side ...
virtual void zero()=0
Set all entries to 0.
bool store_untransformed_basis
Boolean flag to indicate whether we store a second copy of the basis without constraints or dof trans...
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
std::unique_ptr< LinearSolver< Number > > inner_product_solver
We store an extra linear solver object which we can optionally use for solving all systems in which t...
SparseMatrix< Number > * matrix
The system matrix.
virtual unsigned int get_n_basis_functions() const
Get the current number of basis functions.
SparseMatrix< Number > * get_non_dirichlet_inner_product_matrix_if_avail()
Get the non-Dirichlet inner-product matrix if it&#39;s available, otherwise get the inner-product matrix ...
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.
virtual void add(const numeric_index_type i, const T value)=0
Adds value to the vector entry specified by i.

◆ condense_constrained_dofs()

virtual bool libMesh::System::condense_constrained_dofs ( ) const
inlineprotectedvirtualinherited

Whether this object should condense out constrained degrees of freedom.

Reimplemented in libMesh::CondensedEigenSystem.

Definition at line 2059 of file system.h.

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

2059 { return false; }

◆ create_static_condensation()

void libMesh::LinearImplicitSystem::create_static_condensation ( )
overridevirtualinherited

Request that static condensation be performed for this system.

Reimplemented from libMesh::ImplicitSystem.

Definition at line 63 of file linear_implicit_system.C.

References libMesh::ImplicitSystem::create_static_condensation(), libMesh::ImplicitSystem::linear_solver, and libMesh::ImplicitSystem::setup_static_condensation_preconditioner().

64 {
67 }
virtual void create_static_condensation() override
Request that static condensation be performed for this system.
void setup_static_condensation_preconditioner(T &solver)
Sets up the static condensation preconditioner for the supplied solver.
std::unique_ptr< LinearSolver< Number > > linear_solver
This class handles all the details of interfacing with various linear algebra packages like PETSc or ...

◆ current_solution()

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

Definition at line 162 of file system.C.

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

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

163 {
164  // Check the sizes
165  libmesh_assert_less (global_dof_number, _dof_map->n_dofs());
166  libmesh_assert_less (global_dof_number, current_local_solution->size());
167 
168  return (*current_local_solution)(global_dof_number);
169 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2225
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1667

◆ deactivate()

void libMesh::System::deactivate ( )
inlineinherited

Deactivates the system.

Only active systems are solved.

Definition at line 2449 of file system.h.

References libMesh::System::_active.

2450 {
2451  _active = false;
2452 }
bool _active
Flag stating if the system is active or not.
Definition: system.h:2252

◆ detach_shell_matrix()

void libMesh::LinearImplicitSystem::detach_shell_matrix ( )
inlineinherited

Detaches a shell matrix.

Same as attach_shell_matrix(nullptr).

Definition at line 176 of file linear_implicit_system.h.

References libMesh::LinearImplicitSystem::attach_shell_matrix().

Referenced by main().

176 { attach_shell_matrix(nullptr); }
void attach_shell_matrix(ShellMatrix< Number > *shell_matrix)
This function enables the user to provide a shell matrix, i.e.

◆ disable_cache()

void libMesh::ImplicitSystem::disable_cache ( )
overridevirtualinherited

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

Should be overridden in derived systems.

Reimplemented from libMesh::System.

Definition at line 132 of file implicit_system.C.

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

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

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

◆ disable_print_counter_info() [1/2]

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 100 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

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

◆ disable_print_counter_info() [2/2]

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 100 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

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

◆ enable_print_counter_info() [1/2]

void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

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

Definition at line 94 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

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

◆ enable_print_counter_info() [2/2]

void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

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

Definition at line 94 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

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

◆ enrich_basis_from_rhs_terms()

void libMesh::RBConstruction::enrich_basis_from_rhs_terms ( const bool  resize_rb_eval_data = true)

This function computes one basis function for each rhs term.

This is useful in some cases since we can avoid doing a full greedy if we know that we do not have any "left-hand side" parameters, for example.

Definition at line 1331 of file rb_construction.C.

References assert_convergence, check_convergence(), enrich_RB_space(), extra_linear_solver, libMesh::System::get_equation_systems(), get_Fq(), libMesh::LinearImplicitSystem::get_linear_solver(), libMesh::System::get_mesh(), libMesh::RBThetaExpansion::get_n_F_terms(), get_Nmax(), get_rb_evaluation(), get_rb_theta_expansion(), libMesh::RBParametrized::initialize_parameters(), libMesh::NumericVector< T >::l2_norm(), libMesh::ImplicitSystem::matrix, libMesh::System::name(), libMesh::out, post_process_truth_solution(), libMesh::NumericVector< T >::print_matlab(), libMesh::RBEvaluation::resize_data_structures(), libMesh::ExplicitSystem::rhs, solve_for_matrix_and_rhs(), truth_assembly(), update_system(), and libMesh::ExodusII_IO::write_equation_systems().

1332 {
1333  LOG_SCOPE("enrich_basis_from_rhs_terms()", "RBConstruction");
1334 
1335  // initialize rb_eval's parameters
1337 
1338  // possibly resize data structures according to Nmax
1339  if (resize_rb_eval_data)
1340  {
1342  }
1343 
1344  libMesh::out << std::endl << "---- Enriching basis from rhs terms ----" << std::endl;
1345 
1346  truth_assembly();
1347 
1348  for (unsigned int q_f=0; q_f<get_rb_theta_expansion().get_n_F_terms(); q_f++)
1349  {
1350  libMesh::out << std::endl << "Performing truth solve with rhs from rhs term " << q_f << std::endl;
1351 
1352  *rhs = *get_Fq(q_f);
1353 
1354  if (rhs->l2_norm() == 0)
1355  {
1356  // Skip enrichment if the rhs is zero
1357  continue;
1358  }
1359 
1360  // truth_assembly assembles into matrix and rhs, so use those for the solve
1361  if (extra_linear_solver)
1362  {
1363  // If extra_linear_solver has been initialized, then we use it for the
1364  // truth solves.
1366 
1367  if (assert_convergence)
1369  }
1370  else
1371  {
1373 
1374  if (assert_convergence)
1376  }
1377 
1378  // Debugging: enable this code to print the rhs that was used in
1379  // the most recent truth solve to a uniquely-named file.
1380 #if 0
1381  {
1382  char temp_file[] = "truth_rhs_XXXXXX.dat";
1383  int fd = mkstemps(temp_file, 4);
1384  if (fd != -1)
1385  {
1386  libMesh::out << "Writing truth system rhs to file: " << temp_file << std::endl;
1387  rhs->print_matlab(std::string(temp_file));
1388  }
1389  }
1390 #endif // 0
1391 
1392  // Debugging: enable this code to print the most recent truth
1393  // solution to a uniquely-named file.
1394 #ifdef LIBMESH_HAVE_EXODUS_API
1395 #if 0
1396  {
1397  // Note: mkstemps creates a file and returns an open file descriptor to it.
1398  // The filename is created from a template which must have 6 'X' characters followed
1399  // by a suffix having the specified length (in this case 4, for ".exo").
1400  char temp_file[] = "truth_XXXXXX.exo";
1401  int fd = mkstemps(temp_file, 4);
1402  if (fd != -1)
1403  {
1404  libMesh::out << "Writing truth solution to file: " << temp_file << std::endl;
1405  ExodusII_IO exo_io(this->get_mesh());
1406  std::set<std::string> system_names = {this->name()};
1407  exo_io.write_equation_systems(std::string(temp_file),
1408  this->get_equation_systems(), &system_names);
1409  }
1410  }
1411 #endif // 0
1412 #endif // LIBMESH_HAVE_EXODUS_API
1413 
1414  // Call user-defined post-processing routines on the truth solution.
1416 
1417  // Add orthogonal part of the snapshot to the RB space
1418  libMesh::out << "Enriching the RB space" << std::endl;
1419  enrich_RB_space();
1420 
1421  update_system();
1422  }
1423 }
virtual void truth_assembly()
Assemble the truth matrix and right-hand side for current_parameters.
unsigned int get_n_F_terms() const
Get Q_f, the number of terms in the affine expansion for the right-hand side.
bool assert_convergence
A boolean flag to indicate whether to check for proper convergence after each solve.
virtual void resize_data_structures(const unsigned int Nmax, bool resize_error_bound_data=true)
Resize and clear the data vectors corresponding to the value of Nmax.
const EquationSystems & get_equation_systems() const
Definition: system.h:767
NumericVector< Number > * rhs
The system matrix.
virtual LinearSolver< Number > * get_linear_solver() const override
NumericVector< Number > * get_Fq(unsigned int q)
Get a pointer to Fq.
const MeshBase & get_mesh() const
Definition: system.h:2401
LinearSolver< Number > * extra_linear_solver
Also, we store a pointer to an extra linear solver.
virtual void solve_for_matrix_and_rhs(LinearSolver< Number > &input_solver, SparseMatrix< Number > &input_matrix, NumericVector< Number > &input_rhs)
Assembles & solves the linear system A*x=b for the specified matrix input_matrix and right-hand side ...
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
virtual Real l2_norm() const =0
unsigned int get_Nmax() const
Get/set Nmax, the maximum number of RB functions we are willing to compute.
virtual void update_system()
Update the system after enriching the RB space; this calls a series of functions to update the system...
virtual void post_process_truth_solution()
Similarly, provide an opportunity to post-process the truth solution after the solve is complete...
virtual void print_matlab(const std::string &filename="") const
Print the contents of the vector in Matlab&#39;s sparse matrix format.
void check_convergence(LinearSolver< Number > &input_solver)
Check if the linear solver reports convergence.
OStreamProxy out
SparseMatrix< Number > * matrix
The system matrix.
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.
const std::string & name() const
Definition: system.h:2385
void initialize_parameters(const RBParameters &mu_min_in, const RBParameters &mu_max_in, const std::map< std::string, std::vector< Real >> &discrete_parameter_values)
Initialize the parameter ranges and set current_parameters.
virtual void enrich_RB_space()
Add a new basis function to the RB space.

◆ enrich_RB_space()

void libMesh::RBConstruction::enrich_RB_space ( )
protectedvirtual

Add a new basis function to the RB space.

This is called during train_reduced_basis.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 1719 of file rb_construction.C.

References _untransformed_basis_functions, _untransformed_solution, libMesh::RBEvaluation::basis_functions, libMesh::RBEvaluation::get_n_basis_functions(), get_non_dirichlet_inner_product_matrix_if_avail(), get_rb_evaluation(), libMesh::RBConstructionBase< LinearImplicitSystem >::inner_product_storage_vector, libMesh::System::solution, store_untransformed_basis, and libMesh::SparseMatrix< T >::vector_mult().

Referenced by enrich_basis_from_rhs_terms(), and train_reduced_basis_with_greedy().

1720 {
1721  LOG_SCOPE("enrich_RB_space()", "RBConstruction");
1722 
1723  auto new_bf = solution->clone();
1724 
1725  std::unique_ptr<NumericVector<Number>> new_untransformed_bf;
1727  {
1728  new_untransformed_bf = _untransformed_solution->clone();
1729  libmesh_assert_equal_to(_untransformed_basis_functions.size(), get_rb_evaluation().get_n_basis_functions());
1730  }
1731 
1732  for (unsigned int index=0; index<get_rb_evaluation().get_n_basis_functions(); index++)
1733  {
1735 
1736  Number scalar =
1737  inner_product_storage_vector->dot(get_rb_evaluation().get_basis_function(index));
1738  new_bf->add(-scalar, get_rb_evaluation().get_basis_function(index));
1739 
1741  {
1742  new_untransformed_bf->add(-scalar, *_untransformed_basis_functions[index]);
1743  }
1744  }
1745 
1746  // Normalize new_bf
1748  Number new_bf_norm = std::sqrt( inner_product_storage_vector->dot(*new_bf) );
1749 
1750  if (new_bf_norm == 0.)
1751  {
1752  new_bf->zero(); // avoid potential nan's
1753 
1755  {
1756  new_untransformed_bf->zero();
1757  }
1758  }
1759  else
1760  {
1761  new_bf->scale(1./new_bf_norm);
1762 
1764  {
1765  new_untransformed_bf->scale(1./new_bf_norm);
1766  }
1767  }
1768 
1769  // load the new basis function into the basis_functions vector.
1770  get_rb_evaluation().basis_functions.emplace_back( std::move(new_bf) );
1771 
1773  {
1774  _untransformed_basis_functions.emplace_back( std::move(new_untransformed_bf) );
1775  }
1776 }
std::vector< std::unique_ptr< NumericVector< Number > > > _untransformed_basis_functions
In cases where we have dof transformations such as a change of coordinates at some nodes we need to s...
void vector_mult(NumericVector< T > &dest, const NumericVector< T > &arg) const
Multiplies the matrix by the NumericVector arg and stores the result in NumericVector dest...
std::vector< std::unique_ptr< NumericVector< Number > > > basis_functions
The libMesh vectors storing the finite element coefficients of the RB basis functions.
std::unique_ptr< NumericVector< Number > > inner_product_storage_vector
We keep an extra temporary vector that is useful for performing inner products (avoids unnecessary me...
bool store_untransformed_basis
Boolean flag to indicate whether we store a second copy of the basis without constraints or dof trans...
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
std::unique_ptr< NumericVector< Number > > _untransformed_solution
We also store a copy of the untransformed solution in order to create _untransformed_basis_functions...
virtual unsigned int get_n_basis_functions() const
Get the current number of basis functions.
SparseMatrix< Number > * get_non_dirichlet_inner_product_matrix_if_avail()
Get the non-Dirichlet inner-product matrix if it&#39;s available, otherwise get the inner-product matrix ...
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.

◆ final_linear_residual()

Real libMesh::LinearImplicitSystem::final_linear_residual ( ) const
inlineinherited
Returns
The final residual for the linear system solve.

Definition at line 160 of file linear_implicit_system.h.

References libMesh::LinearImplicitSystem::_final_linear_residual.

Referenced by compute_Fq_representor_innerprods(), compute_output_dual_innerprods(), main(), libMesh::TransientRBConstruction::update_residual_terms(), and update_residual_terms().

160 { return _final_linear_residual; }
Real _final_linear_residual
The final residual for the linear system Ax=b.

◆ forward_qoi_parameter_sensitivity()

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

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

Uses the forward sensitivity method.

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

Reimplemented from libMesh::System.

Definition at line 627 of file implicit_system.C.

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

Referenced by main().

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

◆ generate_training_parameters_deterministic()

std::pair< std::size_t, std::size_t > libMesh::RBConstructionBase< LinearImplicitSystem >::generate_training_parameters_deterministic ( const Parallel::Communicator communicator,
const std::map< std::string, bool > &  log_param_scale,
std::map< std::string, std::vector< RBParameter >> &  local_training_parameters_in,
const unsigned int  n_global_training_samples_in,
const RBParameters min_parameters,
const RBParameters max_parameters,
const bool  serial_training_set = false 
)
staticinherited

Static helper function for generating a deterministic set of parameters.

Only works with 1 or 2 parameters (as defined by the lengths of min/max parameters vectors), otherwise throws an error. The parameter n_global_training_samples_in is the total number of parameters to generate, and they will be split across all the processors (unless serial_training_set=true) in the local_training_parameters_in map.

Returns
a pair of {first_local_index,last_local_index}

Definition at line 572 of file rb_construction_base.C.

579 {
580  libmesh_assert_equal_to ( min_parameters.n_parameters(), max_parameters.n_parameters() );
581  const unsigned int num_params = min_parameters.n_parameters();
582 
583  if (num_params == 0)
584  return {0,0};
585 
586  if (num_params > 3)
587  libmesh_not_implemented_msg("ERROR: Deterministic training sample generation "
588  "not implemented for more than three parameters.");
589 
590  // TODO - we don't support vector-data here yet. This would only apply in the case where
591  // min or max are vector-valued, and all the generated points need to stay within those ranges.
592  // But typically we expect that if we're calling this function, we only have 1 min and 1 max,
593  // so the generated values are single-valued as well. The .get_value() calls will throw an error
594  // if this is not the case.
595 
596  // Reinitialize training_parameters_in (but don't remove existing keys!)
597  const auto &[n_local_training_samples, first_local_index] =
598  calculate_n_local_samples_and_index(communicator, n_global_training_samples_in,
600  const auto last_local_index = first_local_index + n_local_training_samples;
601  for (const auto & pr : min_parameters)
602  local_training_parameters_in[pr.first] = std::vector<RBParameter>(n_local_training_samples);
603 
604  // n_training_samples_per_param has 3 entries, but entries after "num_params"
605  // are unused so we just set their value to 1. We need to set it to 1 (rather
606  // than 0) so that we don't skip the inner part of the triply-nested loop over
607  // n_training_samples_per_param below.
608  std::vector<unsigned int> n_training_samples_per_param(3);
609  for (unsigned int param=0; param<3; param++)
610  {
611  if (param < num_params)
612  {
613  n_training_samples_per_param[param] =
614  static_cast<unsigned int>( std::round(std::pow(static_cast<Real>(n_global_training_samples_in), 1./num_params)) );
615  }
616  else
617  {
618  n_training_samples_per_param[param] = 1;
619  }
620  }
621 
622  {
623  // The current implementation assumes that we have the same number of
624  // samples in each parameter, so we check that n_training_samples_in
625  // is consistent with this assumption.
626  unsigned int total_samples_check = 1;
627  for (unsigned int n_samples : n_training_samples_per_param)
628  {
629  total_samples_check *= n_samples;
630  }
631 
632  libmesh_error_msg_if(total_samples_check != n_global_training_samples_in,
633  "Error: Number of training samples = "
634  << n_global_training_samples_in
635  << " does not enable a uniform grid of samples with "
636  << num_params << " parameters. Try "
637  << total_samples_check << " samples instead?");
638  }
639 
640  // First we make a list of training samples associated with each parameter,
641  // then we take a tensor product to obtain the final set of training samples.
642  std::vector<std::vector<Real>> training_samples_per_param(num_params);
643  {
644  unsigned int i = 0;
645  for (const auto & pr : min_parameters)
646  {
647  const std::string & param_name = pr.first;
648  const bool use_log_scaling = libmesh_map_find(log_param_scale, param_name);
649  Real min_param = min_parameters.get_value(param_name);
650  Real max_param = max_parameters.get_value(param_name);
651 
652  training_samples_per_param[i].resize(n_training_samples_per_param[i]);
653 
654  for (unsigned int j=0; j<n_training_samples_per_param[i]; j++)
655  {
656  // Generate log10 scaled training parameters
657  if (use_log_scaling)
658  {
659  Real epsilon = 1.e-6; // Prevent rounding errors triggering asserts
660  Real log_min = std::log10(min_param + epsilon);
661  Real log_range = std::log10( (max_param-epsilon) / (min_param+epsilon) );
662  Real step_size = log_range /
663  std::max((unsigned int)1,(n_training_samples_per_param[i]-1));
664 
665  if (j<(n_training_samples_per_param[i]-1))
666  {
667  training_samples_per_param[i][j] = std::pow(10., log_min + j*step_size );
668  }
669  else
670  {
671  // due to rounding error, the last parameter can be slightly
672  // bigger than max_parameters, hence snap back to the max
673  training_samples_per_param[i][j] = max_param;
674  }
675  }
676  else
677  {
678  // Generate linearly scaled training parameters
679  Real step_size = (max_param - min_param) /
680  std::max((unsigned int)1,(n_training_samples_per_param[i]-1));
681  training_samples_per_param[i][j] = j*step_size + min_param;
682  }
683 
684  }
685  i++;
686  }
687  }
688 
689  // Now load into training_samples_in
690  {
691  std::vector<unsigned int> indices(3);
692  unsigned int index_count = 0;
693  for (indices[0]=0; indices[0]<n_training_samples_per_param[0]; indices[0]++)
694  {
695  for (indices[1]=0; indices[1]<n_training_samples_per_param[1]; indices[1]++)
696  {
697  for (indices[2]=0; indices[2]<n_training_samples_per_param[2]; indices[2]++)
698  {
699  unsigned int param_count = 0;
700  for (const auto & pr : min_parameters)
701  {
702  std::vector<RBParameter> & training_vector =
703  libmesh_map_find(local_training_parameters_in, pr.first);
704  if (first_local_index <= index_count && index_count < last_local_index)
705  training_vector[index_count - first_local_index] =
706  {training_samples_per_param[param_count][indices[param_count]]};
707 
708  param_count++;
709  }
710  index_count++;
711  }
712  }
713  }
714  }
715  return {first_local_index, first_local_index+n_local_training_samples};
716 }
T pow(const T &x)
Definition: utility.h:296
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
bool serial_training_set
This boolean flag indicates whether or not the training set should be the same on all processors...

◆ generate_training_parameters_random()

std::pair< std::size_t, std::size_t > libMesh::RBConstructionBase< LinearImplicitSystem >::generate_training_parameters_random ( const Parallel::Communicator communicator,
const std::map< std::string, bool > &  log_param_scale,
std::map< std::string, std::vector< RBParameter >> &  local_training_parameters_in,
const unsigned int  n_global_training_samples_in,
const RBParameters min_parameters,
const RBParameters max_parameters,
const int  training_parameters_random_seed = -1,
const bool  serial_training_set = false 
)
staticinherited

Static helper function for generating a randomized set of parameters.

The parameter n_global_training_samples_in is the total number of parameters to generate, and they will be split across all the processors (unless serial_training_set=true) in the local_training_parameters_in map.

Returns
a pair of {first_local_index,last_local_index}

Definition at line 472 of file rb_construction_base.C.

480 {
481  const unsigned int num_params = min_parameters.n_parameters();
482  libmesh_error_msg_if(num_params!=max_parameters.n_parameters(),
483  "Number of parameters must be identical for min/max.");
484 
485  // Clear training_parameters_in
486  local_training_parameters_in.clear();
487 
488  if (num_params == 0)
489  return {0,0};
490 
491  if (training_parameters_random_seed < 0)
492  {
493  if (!serial_training_set)
494  {
495  // seed the random number generator with the system time
496  // and the processor ID so that the seed is different
497  // on different processors
498  std::srand( static_cast<unsigned>( std::time(0)*(1+communicator.rank()) ));
499  }
500  else
501  {
502  // seed the random number generator with the system time
503  // only so that the seed is the same on all processors
504  //
505  // Note that we broadcast the time on processor 0 to make
506  // sure all processors agree.
507  unsigned int current_time = static_cast<unsigned>( std::time(0) );
508  communicator.broadcast(current_time, 0);
509  std::srand(current_time);
510  }
511  }
512  else
513  {
514  if (!serial_training_set)
515  {
516  // seed the random number generator with the provided value
517  // and the processor ID so that the seed is different
518  // on different processors
519  std::srand( static_cast<unsigned>( training_parameters_random_seed*(1+communicator.rank()) ));
520  }
521  else
522  {
523  // seed the random number generator with the provided value
524  // so that the seed is the same on all processors
525  std::srand( static_cast<unsigned>( training_parameters_random_seed ));
526  }
527  }
528 
529  // TODO - we don't support vector-data here yet. This would only apply in the case where
530  // min or max are vector-valued, and all the generated points need to stay within those ranges.
531  // But typically we expect that if we're calling this function, we only have 1 min and 1 max,
532  // so the generated values are single-valued as well. The .get_value() calls will throw an error
533  // if this is not the case.
534 
535  // initialize training_parameters_in
536  const auto & [n_local_training_samples, first_local_index] =
537  calculate_n_local_samples_and_index(communicator, n_global_training_samples_in,
539  for (const auto & pr : min_parameters)
540  local_training_parameters_in[pr.first] = std::vector<RBParameter>(n_local_training_samples);
541 
542  // finally, set the values
543  for (auto & [param_name, sample_vector] : local_training_parameters_in)
544  {
545  for (auto i : make_range(n_local_training_samples))
546  {
547  Real random_number = static_cast<Real>(std::rand()) / RAND_MAX; // in range [0,1]
548 
549  // Generate log10 scaled training parameters
550  if (libmesh_map_find(log_param_scale, param_name))
551  {
552  Real log_min = std::log10(min_parameters.get_value(param_name));
553  Real log_range = std::log10(max_parameters.get_value(param_name) / min_parameters.get_value(param_name));
554 
555  sample_vector[i] = {std::pow(Real(10.), log_min + random_number*log_range )};
556  }
557  // Generate linearly scaled training parameters
558  else
559  {
560  sample_vector[i] = {
561  random_number * (max_parameters.get_value(param_name) -
562  min_parameters.get_value(param_name)) +
563  min_parameters.get_value(param_name)};
564  }
565  }
566  }
567  return {first_local_index, first_local_index+n_local_training_samples};
568 }
T pow(const T &x)
Definition: utility.h:296
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
DIE A HORRIBLE DEATH HERE typedef MPI_Comm communicator
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
bool serial_training_set
This boolean flag indicates whether or not the training set should be the same on all processors...

◆ get_abs_training_tolerance()

Real libMesh::RBConstruction::get_abs_training_tolerance ( ) const
inline

Definition at line 227 of file rb_construction.h.

References abs_training_tolerance.

Referenced by print_info().

◆ get_adjoint_rhs() [1/2]

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

Definition at line 1294 of file system.C.

References libMesh::System::get_vector().

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

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

◆ get_adjoint_rhs() [2/2]

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

Definition at line 1304 of file system.C.

References libMesh::System::get_vector().

1305 {
1306  std::ostringstream adjoint_rhs_name;
1307  adjoint_rhs_name << "adjoint_rhs" << i;
1308 
1309  return this->get_vector(adjoint_rhs_name.str());
1310 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:931

◆ get_adjoint_solution() [1/2]

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

◆ get_adjoint_solution() [2/2]

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

Definition at line 1242 of file system.C.

References libMesh::System::get_vector().

1243 {
1244  std::ostringstream adjoint_name;
1245  adjoint_name << "adjoint_solution" << i;
1246 
1247  return this->get_vector(adjoint_name.str());
1248 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:931

◆ get_all_matrices()

void libMesh::RBConstruction::get_all_matrices ( std::map< std::string, SparseMatrix< Number > *> &  all_matrices)
virtual

Get a map that stores pointers to all of the matrices.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 2455 of file rb_construction.C.

References get_Aq(), get_inner_product_matrix(), libMesh::RBThetaExpansion::get_n_A_terms(), get_non_dirichlet_Aq(), get_non_dirichlet_inner_product_matrix(), get_rb_theta_expansion(), store_dirichlet_operators, and store_non_dirichlet_operators.

Referenced by libMesh::TransientRBConstruction::get_all_matrices().

2456 {
2457  all_matrices.clear();
2458 
2460  all_matrices["inner_product"] = get_inner_product_matrix();
2461 
2463  all_matrices["non_dirichlet_inner_product"] = get_non_dirichlet_inner_product_matrix();
2464 
2465  for (unsigned int q_a=0; q_a<get_rb_theta_expansion().get_n_A_terms(); q_a++)
2466  {
2467  std::stringstream matrix_name;
2468  matrix_name << "A" << q_a;
2469 
2471  all_matrices[matrix_name.str()] = get_Aq(q_a);
2472 
2474  {
2475  matrix_name << "_non_dirichlet";
2476  all_matrices[matrix_name.str()] = get_non_dirichlet_Aq(q_a);
2477  }
2478  }
2479 }
bool store_dirichlet_operators
Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enfor...
SparseMatrix< Number > * get_Aq(unsigned int q)
Get a pointer to Aq.
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form.
SparseMatrix< Number > * get_non_dirichlet_inner_product_matrix()
Get the non-Dirichlet (or more generally no-constraints) version of the inner-product matrix...
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
SparseMatrix< Number > * get_inner_product_matrix()
Get a pointer to inner_product_matrix.
SparseMatrix< Number > * get_non_dirichlet_Aq(unsigned int q)
Get a pointer to non_dirichlet_Aq.
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...

◆ get_all_variable_numbers()

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

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

Definition at line 1403 of file system.C.

References libMesh::DofMap::get_all_variable_numbers(), and libMesh::System::get_dof_map().

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

1404 {
1405  this->get_dof_map().get_all_variable_numbers(all_variable_numbers);
1406 }
void get_all_variable_numbers(std::vector< unsigned int > &all_variable_numbers) const
Fills all_variable_numbers with all the variable numbers for the variables that have been added to th...
Definition: dof_map.C:3380
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ get_all_vectors()

void libMesh::RBConstruction::get_all_vectors ( std::map< std::string, NumericVector< Number > *> &  all_vectors)
virtual

Get a map that stores pointers to all of the vectors.

Definition at line 2481 of file rb_construction.C.

References get_Fq(), libMesh::RBThetaExpansion::get_n_F_terms(), get_non_dirichlet_Fq(), get_output_vectors(), get_rb_theta_expansion(), store_dirichlet_operators, and store_non_dirichlet_operators.

2482 {
2483  all_vectors.clear();
2484 
2485  get_output_vectors(all_vectors);
2486 
2487  for (unsigned int q_f=0; q_f<get_rb_theta_expansion().get_n_F_terms(); q_f++)
2488  {
2489  std::stringstream F_vector_name;
2490  F_vector_name << "F" << q_f;
2491 
2493  all_vectors[F_vector_name.str()] = get_Fq(q_f);
2494 
2496  {
2497  F_vector_name << "_non_dirichlet";
2498  all_vectors[F_vector_name.str()] = get_non_dirichlet_Fq(q_f);
2499  }
2500  }
2501 }
bool store_dirichlet_operators
Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enfor...
unsigned int get_n_F_terms() const
Get Q_f, the number of terms in the affine expansion for the right-hand side.
NumericVector< Number > * get_Fq(unsigned int q)
Get a pointer to Fq.
virtual void get_output_vectors(std::map< std::string, NumericVector< Number > *> &all_vectors)
Get a map that stores pointers to all of the vectors.
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
NumericVector< Number > * get_non_dirichlet_Fq(unsigned int q)
Get a pointer to non-Dirichlet Fq.
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...

◆ get_Aq()

SparseMatrix< Number > * libMesh::RBConstruction::get_Aq ( unsigned int  q)

Get a pointer to Aq.

Definition at line 2371 of file rb_construction.C.

References Aq_vector, get_rb_theta_expansion(), and store_dirichlet_operators.

Referenced by add_scaled_Aq(), assemble_all_affine_operators(), get_all_matrices(), get_non_dirichlet_Aq_if_avail(), libMesh::TransientRBConstruction::truth_assembly(), truth_assembly(), and update_residual_terms().

2372 {
2373  libmesh_error_msg_if(!store_dirichlet_operators,
2374  "Error: Must have store_dirichlet_operators==true to access non_dirichlet_Aq.");
2375 
2376  libmesh_error_msg_if(q >= get_rb_theta_expansion().get_n_A_terms(),
2377  "Error: We must have q < Q_a in get_Aq.");
2378 
2379  return Aq_vector[q].get();
2380 }
bool store_dirichlet_operators
Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enfor...
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
std::vector< std::unique_ptr< SparseMatrix< Number > > > Aq_vector
Vector storing the Q_a matrices from the affine expansion.

◆ get_closest_value()

Real libMesh::RBParametrized::get_closest_value ( Real  value,
const std::vector< Real > &  list_of_values 
)
staticinherited
Returns
The closest entry to value from list_of_values.

Definition at line 432 of file rb_parametrized.C.

References distance(), libMesh::Real, and value.

Referenced by libMesh::RBParametrized::is_value_in_list().

433 {
434  libmesh_error_msg_if(list_of_values.empty(), "Error: list_of_values is empty.");
435 
436  Real min_distance = std::numeric_limits<Real>::max();
437  Real closest_val = 0.;
438  for (const auto & current_value : list_of_values)
439  {
440  Real distance = std::abs(value - current_value);
441  if (distance < min_distance)
442  {
443  min_distance = distance;
444  closest_val = current_value;
445  }
446  }
447 
448  return closest_val;
449 }
Real distance(const Point &p)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const bool value
Definition: xdr_io.C:55

◆ get_constraint_object()

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

Return the user object for imposing constraints.

Definition at line 2019 of file system.C.

References libMesh::System::_constrain_system_object.

2020 {
2021  libmesh_assert_msg(_constrain_system_object,"No constraint object available.");
2022  return *_constrain_system_object;
2023 }
Constraint * _constrain_system_object
Object that constrains the system.
Definition: system.h:2193

◆ get_convergence_assertion_flag()

bool libMesh::RBConstruction::get_convergence_assertion_flag ( ) const
protected

Getter for the flag determining if convergence should be checked after each solve.

Definition at line 2745 of file rb_construction.C.

References assert_convergence.

2746 {
2747  return assert_convergence;
2748 }
bool assert_convergence
A boolean flag to indicate whether to check for proper convergence after each solve.

◆ get_current_training_parameter_index()

unsigned int libMesh::RBConstruction::get_current_training_parameter_index ( ) const
protected

Get/set the current training parameter index.

Definition at line 2765 of file rb_construction.C.

References _current_training_parameter_index.

Referenced by get_RB_error_bound().

2766 {
2768 }
unsigned int _current_training_parameter_index
The current training parameter index during reduced basis training.

◆ get_delta_N()

unsigned int libMesh::RBConstruction::get_delta_N ( ) const
inline

Get delta_N, the number of basis functions we add to the RB space per iteration of the greedy algorithm.

For steady-state systems, this should be 1, but can be more than 1 for time-dependent systems.

Definition at line 469 of file rb_construction.h.

References delta_N.

Referenced by libMesh::TransientRBConstruction::add_IC_to_RB_space(), libMesh::TransientRBConstruction::enrich_RB_space(), libMesh::TransientRBConstruction::print_info(), libMesh::TransientRBConstruction::update_system(), libMesh::TransientRBConstruction::write_riesz_representors_to_files(), and write_riesz_representors_to_files().

469 { return delta_N; }
unsigned int delta_N
The number of basis functions that we add at each greedy step.

◆ get_deterministic_training_parameter_name()

const std::string& libMesh::RBConstructionBase< LinearImplicitSystem >::get_deterministic_training_parameter_name ( ) const
inherited

Get the name of the parameter that we will generate deterministic training parameters for.

◆ get_discrete_parameter_values()

const std::map< std::string, std::vector< Real > > & libMesh::RBParametrized::get_discrete_parameter_values ( ) const
inherited

Get a const reference to the discrete parameter values.

Definition at line 359 of file rb_parametrized.C.

References libMesh::RBParametrized::_discrete_parameter_values, and libMesh::RBParametrized::parameters_initialized.

Referenced by libMesh::RBDataSerialization::add_parameter_ranges_to_builder(), libMesh::RBParametrized::check_if_valid_params(), libMesh::RBParametrized::get_n_discrete_params(), libMesh::RBParametrized::initialize_parameters(), libMesh::RBParametrized::print_discrete_parameter_values(), and libMesh::RBParametrized::write_discrete_parameter_values_to_file().

360 {
361  libmesh_error_msg_if(!parameters_initialized, "Error: parameters not initialized in RBParametrized::get_discrete_parameter_values");
362 
364 }
bool parameters_initialized
Flag indicating whether the parameters have been initialized.
std::map< std::string, std::vector< Real > > _discrete_parameter_values
Map that defines the allowable values of any discrete parameters.

◆ get_dof_map() [1/2]

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

Definition at line 2417 of file system.h.

References libMesh::System::_dof_map.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::DifferentiableSystem::add_dot_var_dirichlet_bcs(), libMesh::System::add_matrix(), libMesh::HPCoarsenTest::add_projection(), add_scaled_matrix_and_vector(), libMesh::System::add_variable(), libMesh::System::add_variable_array(), libMesh::System::add_variables(), libMesh::AdaptiveTimeSolver::adjoint_advance_timestep(), libMesh::UnsteadySolver::adjoint_advance_timestep(), libMesh::ImplicitSystem::adjoint_solve(), libMesh::NewmarkSolver::advance_timestep(), libMesh::AdaptiveTimeSolver::advance_timestep(), libMesh::UnsteadySolver::advance_timestep(), libMesh::EquationSystems::allgather(), libMesh::TransientRBConstruction::allocate_data_structures(), allocate_data_structures(), alternative_fe_assembly(), assemble(), LinearElasticity::assemble(), assemble_1D(), AssembleOptimization::assemble_A_and_F(), libMesh::ClawSystem::assemble_advection_matrices(), assemble_and_solve(), libMesh::ClawSystem::assemble_avg_coupling_matrices(), assemble_biharmonic(), libMesh::ClawSystem::assemble_boundary_condition_matrices(), assemble_divgrad(), assemble_elasticity(), assemble_ellipticdg(), assemble_func(), assemble_graddiv(), assemble_helmholtz(), libMesh::ClawSystem::assemble_jump_coupling_matrix(), assemble_laplace(), assemble_mass(), libMesh::ClawSystem::assemble_mass_matrix(), assemble_matrices(), assemble_matrix_and_rhs(), assemble_poisson(), assemble_SchroedingerEquation(), assemble_shell(), assemble_stokes(), assemble_temperature_jump(), assemble_wave(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::PetscDMWrapper::build_sf(), libMesh::System::calculate_norm(), compute_jacobian(), compute_residual(), compute_stresses(), LinearElasticityWithContact::compute_stresses(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), libMesh::Problem_Interface::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), MyConstraint::constrain(), libMesh::VariationalSmootherConstraint::constrain_node_to_line(), libMesh::VariationalSmootherConstraint::constrain_node_to_plane(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::CondensedEigenSystem::copy_sub_to_super(), libMesh::CondensedEigenSystem::copy_super_to_sub(), libMesh::System::create_static_condensation(), libMesh::ImplicitSystem::create_static_condensation_system_matrix(), create_wrapped_function(), DMCreateDomainDecomposition_libMesh(), DMCreateFieldDecomposition_libMesh(), DMlibMeshFunction(), DMlibMeshJacobian(), DMlibMeshSetSystem_libMesh(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), fe_assembly(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::VariationalSmootherConstraint::fix_node(), form_functionA(), form_functionB(), form_matrixA(), libMesh::System::get_all_variable_numbers(), libMesh::CondensedEigenSystem::get_eigenpair(), libMesh::System::get_info(), libMesh::System::has_static_condensation(), libMesh::System::has_variable(), libMesh::System::identify_variable_groups(), libMesh::SystemSubsetBySubdomain::init(), libMesh::SecondOrderUnsteadySolver::init_data(), libMesh::UnsteadySolver::init_data(), HeatSystem::init_data(), SimpleRBConstruction::init_data(), libMesh::ClawSystem::init_data(), LaplaceSystem::init_dirichlet_bcs(), NonManifoldCouplingTestBase::init_es(), libMesh::EigenSystem::init_matrices(), libMesh::System::init_matrices(), libMesh::PetscDMWrapper::init_petscdm(), libMesh::CondensedEigenSystem::initialize_condensed_dofs(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), LaplaceYoung::jacobian(), LargeDeformationElasticity::jacobian(), libMesh::System::late_matrix_init(), libMesh::libmesh_petsc_snes_fd_residual(), libMesh::libmesh_petsc_snes_jacobian(), libMesh::libmesh_petsc_snes_mffd_residual(), libMesh::libmesh_petsc_snes_residual(), libMesh::libmesh_petsc_snes_residual_helper(), libMesh::System::local_dof_indices(), AssembleOptimization::lower_and_upper_bounds(), main(), libMesh::DofMap::max_constraint_error(), LinearElasticityWithContact::move_mesh(), libMesh::System::n_components(), libMesh::System::n_variable_groups(), libMesh::System::n_vars(), libMesh::DGFEMContext::neighbor_side_fe_reinit(), libMesh::UnsteadySolver::old_nonlinear_solution(), libMesh::SecondOrderUnsteadySolver::old_solution_accel(), libMesh::SecondOrderUnsteadySolver::old_solution_rate(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::SmoothnessEstimator::EstimateSmoothness::operator()(), libMesh::PatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::RBSCMConstruction::perform_SCM_greedy(), periodic_bc_test_poisson(), libMesh::petsc_auto_fieldsplit(), libMesh::ErrorVector::plot_error(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::FEMContext::pre_fe_reinit(), libMesh::InterMeshProjection::project_system_vectors(), libMesh::System::re_update(), libMesh::System::read_parallel_data(), libMesh::System::read_SCALAR_dofs(), MeshFunctionTest::read_variable_info_from_output_data(), libMesh::SecondOrderUnsteadySolver::reinit(), libMesh::UnsteadySolver::reinit(), libMesh::System::reinit(), libMesh::System::reinit_constraints(), libMesh::EquationSystems::reinit_solutions(), LaplaceYoung::residual(), LargeDeformationElasticity::residual(), LinearElasticityWithContact::residual_and_jacobian(), libMesh::UnsteadySolver::retrieve_timestep(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), libMesh::HPCoarsenTest::select_refinement(), libMesh::ImplicitSystem::sensitivity_solve(), set_context_solution_vec(), libMesh::PetscPreconditioner< T >::set_hypre_ads_data(), libMesh::PetscPreconditioner< T >::set_hypre_ams_data(), libMesh::PetscDMWrapper::set_point_range_in_section(), set_system_parameters(), SlitMeshRefinedSystemTest::setUp(), FETestBase< order, family, elem_type, N_x >::setUp(), SolidSystem::side_time_derivative(), libMesh::NewtonSolver::solve(), libMesh::PetscDiffSolver::solve(), libMesh::EigenSystem::solve(), solve_for_matrix_and_rhs(), SystemsTest::test100KVariables(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), ProjectSolutionTest::test_partial_project_solution(), MeshFunctionTest::test_subdomain_id_sets(), SystemsTest::testBlockRestrictedVarNDofs(), DofMapTest::testConstraintLoopDetection(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), EquationSystemsTest::testDisableDefaultGhosting(), SystemsTest::testDofCouplingWithVarGroups(), DofMapTest::testDofOwner(), MeshInputTest::testDynaReadPatch(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), MeshAssignTest::testMeshMoveAssign(), PeriodicBCTest::testPeriodicBC(), SystemsTest::testPostInitAddVectorTypeChange(), SystemsTest::testProjectCubeWithMeshFunction(), SystemsTest::testProjectMatrix1D(), SystemsTest::testProjectMatrix2D(), SystemsTest::testProjectMatrix3D(), InfFERadialTest::testRefinement(), EquationSystemsTest::testSelectivePRefine(), BoundaryInfoTest::testShellFaceConstraints(), DisjointNeighborTest::testTempJump(), DisjointNeighborTest::testTempJumpRefine(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::BoundaryVolumeSolutionTransfer::transfer_boundary_volume(), libMesh::UnsteadySolver::update(), update_current_local_solution(), libMesh::System::variable(), libMesh::System::variable_group(), libMesh::System::variable_name(), libMesh::System::variable_number(), libMesh::System::variable_scalar_number(), libMesh::System::variable_type(), NonManifoldGhostingFunctorTest::verify_send_list_entries_helper(), libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve(), libMesh::ImplicitSystem::weighted_sensitivity_solve(), libMesh::Nemesis_IO_Helper::write_nodal_solution(), libMesh::System::write_parallel_data(), libMesh::EnsightIO::write_scalar_ascii(), libMesh::System::write_SCALAR_dofs(), libMesh::EnsightIO::write_vector_ascii(), and zero_constrained_dofs_on_vector().

2418 {
2419  return *_dof_map;
2420 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2225

◆ get_dof_map() [2/2]

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

Definition at line 2425 of file system.h.

References libMesh::System::_dof_map.

2426 {
2427  return *_dof_map;
2428 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2225

◆ get_equation_systems() [1/2]

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

Definition at line 767 of file system.h.

References libMesh::System::_equation_systems.

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

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

◆ get_equation_systems() [2/2]

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

Definition at line 772 of file system.h.

References libMesh::System::_equation_systems.

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

◆ get_evaluated_thetas()

const std::vector< Number > & libMesh::RBConstruction::get_evaluated_thetas ( unsigned int  training_parameter_index) const
protected

Return the evaluated theta functions at the given training parameter index.

Definition at line 2776 of file rb_construction.C.

References _evaluated_thetas, libMesh::RBConstructionBase< LinearImplicitSystem >::get_first_local_training_index(), and libMesh::libmesh_assert().

Referenced by get_RB_error_bound().

2777 {
2778  const numeric_index_type first_index = get_first_local_training_index();
2779  libmesh_assert(training_parameter_index >= first_index);
2780 
2781  const numeric_index_type local_index = training_parameter_index - first_index;
2782  libmesh_assert(local_index < _evaluated_thetas.size());
2783 
2784  return _evaluated_thetas[local_index];
2785 }
numeric_index_type get_first_local_training_index() const
Get the first local index of the training parameters.
std::vector< std::vector< Number > > _evaluated_thetas
Storage of evaluated theta functions at a set of parameters.
dof_id_type numeric_index_type
Definition: id_types.h:99
libmesh_assert(ctx)

◆ get_first_local_training_index()

numeric_index_type libMesh::RBConstructionBase< LinearImplicitSystem >::get_first_local_training_index ( ) const
inherited

Get the first local index of the training parameters.

Definition at line 191 of file rb_construction_base.C.

Referenced by compute_max_error_bound(), get_evaluated_thetas(), and preevaluate_thetas().

192 {
193  libmesh_error_msg_if(!_training_parameters_initialized,
194  "Error: training parameters must first be initialized.");
195 
196  // First we check if there are no parameters here, and in that case we
197  // return 0 for a serial training set and comm().rank() for a parallel
198  // training set. This is consistent with get_n_training_samples(), and
199  // avoids accessing training_parameters.begin() when training_parameters
200  // is empty.
201  if (_training_parameters.empty())
202  {
204  return 0;
205  else
206  return this->comm().rank();
207  }
208 
209  return _first_local_index;
210 }
processor_id_type rank() const
const Parallel::Communicator & comm() const
numeric_index_type _first_local_index
The first sample-vector index from the global vector which is stored in the _training_parameters on t...
bool serial_training_set
This boolean flag indicates whether or not the training set should be the same on all processors...
std::map< std::string, std::vector< RBParameter > > _training_parameters
The training samples for each parameter.
bool _training_parameters_initialized
Boolean flag to indicate whether or not the parameter ranges have been initialized.

◆ get_Fq()

NumericVector< Number > * libMesh::RBConstruction::get_Fq ( unsigned int  q)

Get a pointer to Fq.

Definition at line 2403 of file rb_construction.C.

References Fq_vector, get_rb_theta_expansion(), and store_dirichlet_operators.

Referenced by assemble_all_affine_vectors(), compute_Fq_representor_innerprods(), enrich_basis_from_rhs_terms(), get_all_vectors(), get_non_dirichlet_Fq_if_avail(), libMesh::TransientRBConstruction::truth_assembly(), and truth_assembly().

2404 {
2405  libmesh_error_msg_if(!store_dirichlet_operators,
2406  "Error: Must have store_dirichlet_operators==true to access non_dirichlet_Fq.");
2407 
2408  libmesh_error_msg_if(q >= get_rb_theta_expansion().get_n_F_terms(),
2409  "Error: We must have q < Q_f in get_Fq.");
2410 
2411  return Fq_vector[q].get();
2412 }
bool store_dirichlet_operators
Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enfor...
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
std::vector< std::unique_ptr< NumericVector< Number > > > Fq_vector
Vector storing the Q_f vectors in the affine decomposition of the right-hand side.

◆ get_global_max_error_pair()

void libMesh::RBConstructionBase< LinearImplicitSystem >::get_global_max_error_pair ( const Parallel::Communicator communicator,
std::pair< numeric_index_type, Real > &  error_pair 
)
staticprotectedinherited

Static function to return the error pair (index,error) that is corresponds to the largest error on all processors.

Definition at line 134 of file rb_construction_base.C.

Referenced by compute_max_error_bound().

136 {
137  // Set error_pair.second to the maximum global value and also
138  // find which processor contains the maximum value
139  unsigned int proc_ID_index;
140  communicator.maxloc(error_pair.second, proc_ID_index);
141 
142  // Then broadcast error_pair.first from proc_ID_index
143  communicator.broadcast(error_pair.first, proc_ID_index);
144 }
DIE A HORRIBLE DEATH HERE typedef MPI_Comm communicator

◆ get_greedy_parameter()

const RBParameters & libMesh::RBConstruction::get_greedy_parameter ( unsigned int  i)

Return the parameters chosen during the i^th step of the Greedy algorithm.

Definition at line 1607 of file rb_construction.C.

References get_rb_evaluation(), and libMesh::RBEvaluation::greedy_param_list.

1608 {
1609  libmesh_error_msg_if(i >= get_rb_evaluation().greedy_param_list.size(),
1610  "Error: Argument in RBConstruction::get_greedy_parameter is too large.");
1611 
1613 }
std::vector< RBParameters > greedy_param_list
The list of parameters selected by the Greedy algorithm in generating the Reduced Basis associated wi...
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.

◆ get_info() [1/3]

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

Gets a string containing the reference information.

Definition at line 47 of file reference_counter.C.

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

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

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

◆ get_info() [2/3]

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

Gets a string containing the reference information.

Definition at line 47 of file reference_counter.C.

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

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

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

◆ get_info() [3/3]

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

Definition at line 1822 of file system.C.

References libMesh::ParallelObject::comm(), libMesh::FEType::family, libMesh::System::get_dof_map(), libMesh::DofMap::get_info(), libMesh::DofMap::get_static_condensation(), libMesh::System::has_static_condensation(), libMesh::FEType::inf_map, libMesh::System::is_initialized(), libMesh::make_range(), TIMPI::Communicator::max(), libMesh::System::n_constrained_dofs(), libMesh::DofMapBase::n_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 SystemsTest::testUninitializedInfo().

1823 {
1824  std::ostringstream oss;
1825 
1826 
1827  const std::string & sys_name = this->name();
1828 
1829  oss << " System #" << this->number() << ", \"" << sys_name << "\"\n"
1830  << " Type \"" << this->system_type() << "\"\n"
1831  << " Variables=";
1832 
1833  for (auto vg : make_range(this->n_variable_groups()))
1834  {
1835  const VariableGroup & vg_description (this->variable_group(vg));
1836 
1837  if (vg_description.n_variables() > 1) oss << "{ ";
1838  for (auto vn : make_range(vg_description.n_variables()))
1839  oss << "\"" << vg_description.name(vn) << "\" ";
1840  if (vg_description.n_variables() > 1) oss << "} ";
1841  }
1842 
1843  oss << '\n';
1844 
1845  oss << " Finite Element Types=";
1846 #ifndef LIBMESH_ENABLE_INFINITE_ELEMENTS
1847  for (auto vg : make_range(this->n_variable_groups()))
1848  oss << "\""
1849  << Utility::enum_to_string<FEFamily>(this->get_dof_map().variable_group(vg).type().family)
1850  << "\" ";
1851 #else
1852  for (auto vg : make_range(this->n_variable_groups()))
1853  {
1854  oss << "\""
1855  << Utility::enum_to_string<FEFamily>(this->get_dof_map().variable_group(vg).type().family)
1856  << "\", \""
1857  << Utility::enum_to_string<FEFamily>(this->get_dof_map().variable_group(vg).type().radial_family)
1858  << "\" ";
1859  }
1860 
1861  oss << '\n' << " Infinite Element Mapping=";
1862  for (auto vg : make_range(this->n_variable_groups()))
1863  oss << "\""
1864  << Utility::enum_to_string<InfMapType>(this->get_dof_map().variable_group(vg).type().inf_map)
1865  << "\" ";
1866 #endif
1867 
1868  oss << '\n';
1869 
1870  oss << " Approximation Orders=";
1871  for (auto vg : make_range(this->n_variable_groups()))
1872  {
1873 #ifndef LIBMESH_ENABLE_INFINITE_ELEMENTS
1874  oss << "\""
1875  << Utility::enum_to_string<Order>(this->get_dof_map().variable_group(vg).type().order)
1876  << "\" ";
1877 #else
1878  oss << "\""
1879  << Utility::enum_to_string<Order>(this->get_dof_map().variable_group(vg).type().order)
1880  << "\", \""
1881  << Utility::enum_to_string<Order>(this->get_dof_map().variable_group(vg).type().radial_order)
1882  << "\" ";
1883 #endif
1884  }
1885 
1886  oss << '\n';
1887 
1888  if (this->is_initialized())
1889  {
1890  oss << " n_dofs()=" << this->n_dofs() << '\n';
1891  dof_id_type local_dofs = this->n_local_dofs();
1892  oss << " n_local_dofs()=" << local_dofs << '\n';
1893  this->comm().max(local_dofs);
1894  oss << " max(n_local_dofs())=" << local_dofs << '\n';
1895 #ifdef LIBMESH_ENABLE_CONSTRAINTS
1896  if (this->n_constrained_dofs())
1897  {
1898  oss << " n_constrained_dofs()=" << this->n_constrained_dofs() << '\n';
1899  oss << " n_local_constrained_dofs()=" << this->n_local_constrained_dofs() << '\n';
1900  dof_id_type local_unconstrained_dofs = this->n_local_dofs() - this->n_local_constrained_dofs();
1901  this->comm().max(local_unconstrained_dofs);
1902  oss << " max(local unconstrained dofs)=" << local_unconstrained_dofs << '\n';
1903  }
1904 #endif
1905  if (this->has_static_condensation())
1906  oss << " n uncondensed dofs="
1907  << this->get_dof_map().get_static_condensation().n_dofs() << '\n';
1908  }
1909  else
1910  oss << " (still uninitialized)\n";
1911 
1912  oss << " " << "n_vectors()=" << this->n_vectors() << '\n';
1913  oss << " " << "n_matrices()=" << this->n_matrices() << '\n';
1914  // oss << " " << "n_additional_matrices()=" << this->n_additional_matrices() << '\n';
1915 
1916  oss << this->get_dof_map().get_info();
1917 
1918  return oss.str();
1919 }
bool is_initialized() const
Definition: system.h:2457
FEFamily family
The type of finite element.
Definition: fe_type.h:228
dof_id_type n_dofs() const
Definition: dof_map_base.h:105
OrderWrapper radial_order
The approximation order in radial direction of the infinite element.
Definition: fe_type.h:263
unsigned int n_variable_groups() const
Definition: system.C:2694
const Parallel::Communicator & comm() const
OrderWrapper order
The approximation order of the element (at 0 p-refinement level).
Definition: fe_type.h:203
bool has_static_condensation() const
Definition: system.C:2664
dof_id_type n_local_dofs() const
Definition: system.C:155
std::string get_info() const
Gets summary info about the sparsity bandwidth and constraints.
Definition: dof_map.C:2976
dof_id_type n_dofs() const
Definition: system.C:118
unsigned int number() const
Definition: system.h:2393
StaticCondensationDofMap & get_static_condensation()
Definition: dof_map.h:2859
unsigned int n_vectors() const
Definition: system.h:2499
const VariableGroup & variable_group(const unsigned int c) const
Definition: dof_map.h:2348
InfMapType inf_map
The coordinate mapping type of the infinite element.
Definition: fe_type.h:284
unsigned int n_matrices() const
Definition: system.h:2638
FEFamily radial_family
The type of approximation in radial direction.
Definition: fe_type.h:276
virtual std::string system_type() const
Definition: system.h:510
void max(const T &r, T &o, Request &req) const
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
dof_id_type n_local_constrained_dofs() const
Definition: system.C:140
const std::string & name() const
Definition: system.h:2385
const DofMap & get_dof_map() const
Definition: system.h:2417
const VariableGroup & variable_group(unsigned int vg) const
Return a constant reference to VariableGroup vg.
Definition: system.C:2704
dof_id_type n_constrained_dofs() const
Definition: system.C:125
uint8_t dof_id_type
Definition: id_types.h:67
const FEType & type() const
Definition: variable.h:144

◆ get_inner_product_assembly()

ElemAssembly & libMesh::RBConstruction::get_inner_product_assembly ( )
Returns
A reference to the inner product assembly object

Definition at line 427 of file rb_construction.C.

References inner_product_assembly, and use_energy_inner_product.

428 {
429  libmesh_error_msg_if(use_energy_inner_product,
430  "Error: inner_product_assembly not available since we're using energy inner-product");
431 
432  libmesh_error_msg_if(!inner_product_assembly,
433  "Error: inner_product_assembly hasn't been initialized yet");
434 
435  return *inner_product_assembly;
436 }
bool use_energy_inner_product
Boolean to indicate whether we&#39;re using the energy inner-product.
ElemAssembly * inner_product_assembly
Pointer to inner product assembly.

◆ get_inner_product_matrix() [1/2]

SparseMatrix< Number > * libMesh::RBConstruction::get_inner_product_matrix ( )

Get a pointer to inner_product_matrix.

Accessing via this function, rather than directly through the class member allows us to do error checking (e.g. inner_product_matrix is not defined in low-memory mode).

Definition at line 2321 of file rb_construction.C.

References inner_product_matrix, and store_dirichlet_operators.

Referenced by get_all_matrices(), get_non_dirichlet_inner_product_matrix_if_avail(), and libMesh::RBSCMConstruction::load_matrix_B().

2322 {
2323  libmesh_error_msg_if(!store_dirichlet_operators,
2324  "Error: Must have store_dirichlet_operators==true to access inner_product_matrix.");
2325  return inner_product_matrix.get();
2326 }
bool store_dirichlet_operators
Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enfor...
std::unique_ptr< SparseMatrix< Number > > inner_product_matrix
The inner product matrix.

◆ get_inner_product_matrix() [2/2]

const SparseMatrix< Number > * libMesh::RBConstruction::get_inner_product_matrix ( ) const

Definition at line 2328 of file rb_construction.C.

References inner_product_matrix, and store_dirichlet_operators.

2329 {
2330  libmesh_error_msg_if(!store_dirichlet_operators,
2331  "Error: Must have store_dirichlet_operators==true to access inner_product_matrix.");
2332  return inner_product_matrix.get();
2333 }
bool store_dirichlet_operators
Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enfor...
std::unique_ptr< SparseMatrix< Number > > inner_product_matrix
The inner product matrix.

◆ get_last_local_training_index()

numeric_index_type libMesh::RBConstructionBase< LinearImplicitSystem >::get_last_local_training_index ( ) const
inherited

Get the last local index of the training parameters.

Definition at line 213 of file rb_construction_base.C.

Referenced by compute_max_error_bound().

214 {
215  libmesh_error_msg_if(!_training_parameters_initialized,
216  "Error: training parameters must first be initialized.");
217 
218  if (_training_parameters.empty())
219  return 0;
220 
222 }
numeric_index_type _first_local_index
The first sample-vector index from the global vector which is stored in the _training_parameters on t...
std::map< std::string, std::vector< RBParameter > > _training_parameters
The training samples for each parameter.
bool _training_parameters_initialized
Boolean flag to indicate whether or not the parameter ranges have been initialized.

◆ get_linear_solve_parameters()

std::pair< unsigned int, Real > libMesh::ImplicitSystem::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 in libMesh::NonlinearImplicitSystem, and libMesh::DifferentiableSystem.

Definition at line 1237 of file implicit_system.C.

References libMesh::Parameters::get(), libMesh::System::get_equation_systems(), libMesh::Parameters::have_parameter(), libMesh::EquationSystems::parameters, libMesh::System::parameters, and libMesh::Real.

Referenced by libMesh::ImplicitSystem::adjoint_solve(), libMesh::ImplicitSystem::sensitivity_solve(), libMesh::NonlinearImplicitSystem::set_solver_parameters(), libMesh::FrequencySystem::solve(), libMesh::LinearImplicitSystem::solve(), libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve(), and libMesh::ImplicitSystem::weighted_sensitivity_solve().

1238 {
1239  return std::make_pair(
1240  parameters.have_parameter<unsigned int>("linear solver maximum iterations")
1241  ? parameters.get<unsigned int>("linear solver maximum iterations")
1242  : this->get_equation_systems().parameters.get<unsigned int>(
1243  "linear solver maximum iterations"),
1244  parameters.have_parameter<Real>("linear solver tolerance")
1245  ? parameters.get<Real>("linear solver tolerance")
1246  : this->get_equation_systems().parameters.get<Real>("linear solver tolerance"));
1247 }
bool have_parameter(std::string_view) const
Definition: parameters.h:420
const EquationSystems & get_equation_systems() const
Definition: system.h:767
Parameters parameters
Parameters for the system. If a parameter is not provided, it should be retrieved from the EquationSy...
Definition: system.h:1588
const T & get(std::string_view) const
Definition: parameters.h:451
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Parameters parameters
Data structure holding arbitrary parameters.

◆ get_linear_solver()

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

Reimplemented from libMesh::ImplicitSystem.

Definition at line 360 of file linear_implicit_system.C.

References libMesh::ImplicitSystem::linear_solver.

Referenced by compute_output_dual_innerprods(), enrich_basis_from_rhs_terms(), initialize_rb_construction(), main(), SystemsTest::testDofCouplingWithVarGroups(), libMesh::TransientRBConstruction::truth_solve(), and truth_solve().

361 {
362  return linear_solver.get();
363 }
std::unique_ptr< LinearSolver< Number > > linear_solver
This class handles all the details of interfacing with various linear algebra packages like PETSc or ...

◆ get_local_n_training_samples()

numeric_index_type libMesh::RBConstructionBase< LinearImplicitSystem >::get_local_n_training_samples ( ) const
inherited

Get the total number of training samples local to this processor.

Definition at line 175 of file rb_construction_base.C.

Referenced by compute_max_error_bound(), and preevaluate_thetas().

176 {
177  libmesh_error_msg_if(!_training_parameters_initialized,
178  "Error: training parameters must first be initialized.");
179 
180  // First we check if there are no parameters here, and in that case we
181  // return 1 for both serial and parallel training sets. This is consistent
182  // with get_n_training_samples(), and avoids accessing
183  // training_parameters.begin() when training_parameters is empty.
184  if (_training_parameters.empty())
185  return 1;
186 
188 }
std::map< std::string, std::vector< RBParameter > > _training_parameters
The training samples for each parameter.
bool _training_parameters_initialized
Boolean flag to indicate whether or not the parameter ranges have been initialized.

◆ get_matrix() [1/2]

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

Definition at line 1111 of file system.C.

References libMesh::System::_matrices.

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

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

◆ get_matrix() [2/2]

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

Definition at line 1118 of file system.C.

References libMesh::System::_matrices.

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

◆ get_matrix_for_output_dual_solves()

SparseMatrix< Number > & libMesh::RBConstruction::get_matrix_for_output_dual_solves ( )
protectedvirtual

Return the matrix for the output residual dual norm solves.

By default we use the inner product matrix for steady state problems.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 2086 of file rb_construction.C.

References inner_product_matrix.

Referenced by compute_output_dual_innerprods().

2087 {
2088  return *inner_product_matrix;
2089 }
std::unique_ptr< SparseMatrix< Number > > inner_product_matrix
The inner product matrix.

◆ get_mesh() [1/2]

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

Definition at line 2401 of file system.h.

References libMesh::System::_mesh.

Referenced by libMesh::ExactSolution::_compute_error(), LinearElasticityWithContact::add_contact_edge_elements(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::System::add_matrix(), libMesh::HPCoarsenTest::add_projection(), add_scaled_matrix_and_vector(), libMesh::DofMap::add_variables(), AssembleOptimization::assemble_A_and_F(), libMesh::ClawSystem::assemble_advection_matrices(), libMesh::ClawSystem::assemble_avg_coupling_matrices(), libMesh::ClawSystem::assemble_boundary_condition_matrices(), libMesh::ClawSystem::assemble_jump_coupling_matrix(), libMesh::ClawSystem::assemble_mass_matrix(), libMesh::FEMSystem::assemble_qoi(), libMesh::FEMSystem::assemble_qoi_derivative(), libMesh::FEMSystem::assembly(), libMesh::VariationalSmootherSystem::assembly(), AssemblyA0::boundary_assembly(), AssemblyA1::boundary_assembly(), AssemblyF0::boundary_assembly(), AssemblyF1::boundary_assembly(), AssemblyA2::boundary_assembly(), AssemblyF2::boundary_assembly(), libMesh::System::calculate_norm(), compute_jacobian(), libMesh::VariationalSmootherSystem::compute_mesh_quality_info(), compute_residual(), LinearElasticityWithContact::compute_stresses(), libMesh::VariationalSmootherConstraint::constrain(), libMesh::VariationalSmootherConstraint::constrain_node_to_line(), libMesh::VariationalSmootherConstraint::constrain_node_to_plane(), libMesh::System::create_static_condensation(), libMesh::ImplicitSystem::create_static_condensation_system_matrix(), libMesh::RBEIMEvaluation::distribute_bfs(), DMCreateDomainDecomposition_libMesh(), DMCreateFieldDecomposition_libMesh(), DMlibMeshSetSystem_libMesh(), SolidSystem::element_time_derivative(), HeatSystem::element_time_derivative(), enrich_basis_from_rhs_terms(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_interiors(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_sides(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::AdjointResidualErrorEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::SmoothnessEstimator::estimate_smoothness(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::VariationalSmootherConstraint::fix_node(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::GenericProjector(), LinearElasticityWithContact::get_least_and_max_gap_function(), libMesh::SystemSubsetBySubdomain::init(), libMesh::RBEIMConstruction::init_context(), SolidSystem::init_data(), libMesh::VariationalSmootherSystem::init_data(), libMesh::System::init_data(), libMesh::System::init_matrices(), libMesh::PetscDMWrapper::init_petscdm(), LinearElasticityWithContact::initialize_contact_load_paths(), libMesh::RBEIMConstruction::initialize_qp_data(), libMesh::System::local_dof_indices(), libMesh::DofMap::max_constraint_error(), libMesh::FEMSystem::mesh_position_get(), libMesh::FEMSystem::mesh_position_set(), LinearElasticityWithContact::move_mesh(), libMesh::System::n_components(), libMesh::RBEIMEvaluation::node_distribute_bfs(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::SmoothnessEstimator::EstimateSmoothness::operator()(), libMesh::PatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::petsc_auto_fieldsplit(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::FEMSystem::postprocess(), libMesh::RBParametrizedFunction::preevaluate_parametrized_function_on_mesh(), libMesh::RBParametrizedFunction::preevaluate_parametrized_function_on_mesh_sides(), libMesh::VariationalSmootherSystem::prepare_for_smoothing(), libMesh::System::read_header(), libMesh::RBEvaluation::read_in_vectors_from_multiple_files(), libMesh::System::read_parallel_data(), libMesh::System::read_serialized_vector(), libMesh::System::read_serialized_vectors(), libMesh::System::reinit(), LinearElasticityWithContact::residual_and_jacobian(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), SolidSystem::save_initial_mesh(), libMesh::HPSingularity::select_refinement(), libMesh::HPCoarsenTest::select_refinement(), libMesh::PetscPreconditioner< T >::set_hypre_ads_data(), libMesh::PetscPreconditioner< T >::set_hypre_ams_data(), libMesh::PetscPreconditioner< T >::set_petsc_aux_data(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::RBEIMEvaluation::side_distribute_bfs(), SolidSystem::side_time_derivative(), libMesh::PetscDiffSolver::solve(), libMesh::ClawSystem::solve_conservation_law(), MeshAssignTest::testMeshMoveAssign(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::BoundaryVolumeSolutionTransfer::transfer(), libMesh::BoundaryVolumeSolutionTransfer::transfer_boundary_volume(), libMesh::BoundaryVolumeSolutionTransfer::transfer_volume_boundary(), libMesh::TransientRBConstruction::truth_solve(), truth_solve(), libMesh::System::write_header(), libMesh::RBEvaluation::write_out_vectors(), libMesh::System::write_parallel_data(), libMesh::System::write_serialized_vector(), libMesh::System::write_serialized_vectors(), and libMesh::System::zero_variable().

2402 {
2403  return _mesh;
2404 }
MeshBase & _mesh
Constant reference to the mesh data structure used for the simulation.
Definition: system.h:2237

◆ get_mesh() [2/2]

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

Definition at line 2409 of file system.h.

References libMesh::System::_mesh.

2410 {
2411  return _mesh;
2412 }
MeshBase & _mesh
Constant reference to the mesh data structure used for the simulation.
Definition: system.h:2237

◆ get_n_continuous_params()

unsigned int libMesh::RBParametrized::get_n_continuous_params ( ) const
inherited

Get the number of continuous parameters.

Definition at line 112 of file rb_parametrized.C.

References libMesh::RBParametrized::get_n_discrete_params(), libMesh::RBParametrized::get_n_params(), libMesh::libmesh_assert(), and libMesh::RBParametrized::parameters_initialized.

Referenced by libMesh::RBDataSerialization::add_parameter_ranges_to_builder(), and libMesh::RBParametrized::write_parameter_ranges_to_file().

113 {
114  libmesh_error_msg_if(!parameters_initialized, "Error: parameters not initialized in RBParametrized::get_n_continuous_params");
115 
117 
118  return static_cast<unsigned int>(get_n_params() - get_n_discrete_params());
119 }
bool parameters_initialized
Flag indicating whether the parameters have been initialized.
unsigned int get_n_discrete_params() const
Get the number of discrete parameters.
libmesh_assert(ctx)
unsigned int get_n_params() const
Get the number of parameters.

◆ get_n_discrete_params()

unsigned int libMesh::RBParametrized::get_n_discrete_params ( ) const
inherited

Get the number of discrete parameters.

Definition at line 121 of file rb_parametrized.C.

References libMesh::RBParametrized::get_discrete_parameter_values(), and libMesh::RBParametrized::parameters_initialized.

Referenced by libMesh::RBDataSerialization::add_parameter_ranges_to_builder(), libMesh::RBParametrized::get_n_continuous_params(), and libMesh::RBParametrized::write_discrete_parameter_values_to_file().

122 {
123  libmesh_error_msg_if(!parameters_initialized, "Error: parameters not initialized in RBParametrized::get_n_discrete_params");
124 
125  return cast_int<unsigned int>
127 }
bool parameters_initialized
Flag indicating whether the parameters have been initialized.
const std::map< std::string, std::vector< Real > > & get_discrete_parameter_values() const
Get a const reference to the discrete parameter values.

◆ get_n_params()

unsigned int libMesh::RBParametrized::get_n_params ( ) const
inherited

Get the number of parameters.

Definition at line 103 of file rb_parametrized.C.

References libMesh::RBParameters::n_parameters(), libMesh::RBParametrized::parameters_initialized, libMesh::RBParametrized::parameters_max, and libMesh::RBParametrized::parameters_min.

Referenced by libMesh::RBParametrized::check_if_valid_params(), libMesh::RBEIMConstruction::compute_max_eim_error(), compute_max_error_bound(), libMesh::RBParametrized::get_n_continuous_params(), libMesh::RBSCMConstruction::print_info(), libMesh::RBEIMConstruction::print_info(), print_info(), libMesh::RBEIMEvaluation::set_eim_error_indicator_active(), and train_reduced_basis_with_POD().

104 {
105  libmesh_error_msg_if(!parameters_initialized, "Error: parameters not initialized in RBParametrized::get_n_params");
106 
107  libmesh_assert_equal_to ( parameters_min.n_parameters(), parameters_max.n_parameters() );
108 
109  return parameters_min.n_parameters();
110 }
bool parameters_initialized
Flag indicating whether the parameters have been initialized.
RBParameters parameters_min
Vectors that define the ranges (min and max) for the parameters.
unsigned int n_parameters() const
Get the number of parameters that have been added.

◆ get_n_training_samples()

numeric_index_type libMesh::RBConstructionBase< LinearImplicitSystem >::get_n_training_samples ( ) const
inherited

Get the number of global training samples.

Definition at line 153 of file rb_construction_base.C.

Referenced by print_info(), and train_reduced_basis_with_POD().

154 {
155  libmesh_error_msg_if(!_training_parameters_initialized,
156  "Error: training parameters must first be initialized.");
157 
158  // First we check if there are no parameters here, and in that case we
159  // return 1 since a single training sample is sufficient to generate an
160  // RB approximation if there are no parameters. Note that in parallel,
161  // and when we don't have a serial training set, set return comm().size()
162  // so that each processor is assigned a single (empty) training sample.
163  if (_training_parameters.empty())
164  {
166  return 1;
167  else
168  return this->comm().size();
169  }
170 
172 }
const Parallel::Communicator & comm() const
processor_id_type size() const
bool serial_training_set
This boolean flag indicates whether or not the training set should be the same on all processors...
std::map< std::string, std::vector< RBParameter > > _training_parameters
The training samples for each parameter.
bool _training_parameters_initialized
Boolean flag to indicate whether or not the parameter ranges have been initialized.

◆ get_Nmax()

unsigned int libMesh::RBConstruction::get_Nmax ( ) const
inline

Get/set Nmax, the maximum number of RB functions we are willing to compute.

Definition at line 253 of file rb_construction.h.

References Nmax.

Referenced by enrich_basis_from_rhs_terms(), libMesh::TransientRBConstruction::enrich_RB_space(), greedy_termination_test(), train_reduced_basis_with_greedy(), and train_reduced_basis_with_POD().

253 { return Nmax; }
unsigned int Nmax
Maximum number of reduced basis functions we are willing to use.

◆ get_non_dirichlet_Aq()

SparseMatrix< Number > * libMesh::RBConstruction::get_non_dirichlet_Aq ( unsigned int  q)

Get a pointer to non_dirichlet_Aq.

Definition at line 2382 of file rb_construction.C.

References get_rb_theta_expansion(), non_dirichlet_Aq_vector, and store_non_dirichlet_operators.

Referenced by assemble_all_affine_operators(), get_all_matrices(), and get_non_dirichlet_Aq_if_avail().

2383 {
2384  libmesh_error_msg_if(!store_non_dirichlet_operators,
2385  "Error: Must have store_non_dirichlet_operators==true to access non_dirichlet_Aq.");
2386 
2387  libmesh_error_msg_if(q >= get_rb_theta_expansion().get_n_A_terms(),
2388  "Error: We must have q < Q_a in get_Aq.");
2389 
2390  return non_dirichlet_Aq_vector[q].get();
2391 }
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...
std::vector< std::unique_ptr< SparseMatrix< Number > > > non_dirichlet_Aq_vector
We may also need a second set of matrices/vectors that do not have the Dirichlet boundary conditions ...

◆ get_non_dirichlet_Aq_if_avail()

SparseMatrix< Number > * libMesh::RBConstruction::get_non_dirichlet_Aq_if_avail ( unsigned int  q)

Get a pointer to non_dirichlet_Aq if it's available, otherwise get Aq.

Definition at line 2393 of file rb_construction.C.

References get_Aq(), get_non_dirichlet_Aq(), and store_non_dirichlet_operators.

Referenced by update_RB_system_matrices().

2394 {
2396  {
2397  return get_non_dirichlet_Aq(q);
2398  }
2399 
2400  return get_Aq(q);
2401 }
SparseMatrix< Number > * get_Aq(unsigned int q)
Get a pointer to Aq.
SparseMatrix< Number > * get_non_dirichlet_Aq(unsigned int q)
Get a pointer to non_dirichlet_Aq.
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...

◆ get_non_dirichlet_Fq()

NumericVector< Number > * libMesh::RBConstruction::get_non_dirichlet_Fq ( unsigned int  q)

Get a pointer to non-Dirichlet Fq.

Definition at line 2414 of file rb_construction.C.

References get_rb_theta_expansion(), non_dirichlet_Fq_vector, and store_non_dirichlet_operators.

Referenced by assemble_all_affine_vectors(), get_all_vectors(), and get_non_dirichlet_Fq_if_avail().

2415 {
2416  libmesh_error_msg_if(!store_non_dirichlet_operators,
2417  "Error: Must have store_non_dirichlet_operators==true to access non_dirichlet_Fq.");
2418 
2419  libmesh_error_msg_if(q >= get_rb_theta_expansion().get_n_F_terms(),
2420  "Error: We must have q < Q_f in get_Fq.");
2421 
2422  return non_dirichlet_Fq_vector[q].get();
2423 }
std::vector< std::unique_ptr< NumericVector< Number > > > non_dirichlet_Fq_vector
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...

◆ get_non_dirichlet_Fq_if_avail()

NumericVector< Number > * libMesh::RBConstruction::get_non_dirichlet_Fq_if_avail ( unsigned int  q)

Get a pointer to non_dirichlet_Fq if it's available, otherwise get Fq.

Definition at line 2425 of file rb_construction.C.

References get_Fq(), get_non_dirichlet_Fq(), and store_non_dirichlet_operators.

Referenced by update_RB_system_matrices().

2426 {
2428  {
2429  return get_non_dirichlet_Fq(q);
2430  }
2431 
2432  return get_Fq(q);
2433 }
NumericVector< Number > * get_Fq(unsigned int q)
Get a pointer to Fq.
NumericVector< Number > * get_non_dirichlet_Fq(unsigned int q)
Get a pointer to non-Dirichlet Fq.
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...

◆ get_non_dirichlet_inner_product_matrix() [1/2]

SparseMatrix< Number > * libMesh::RBConstruction::get_non_dirichlet_inner_product_matrix ( )

Get the non-Dirichlet (or more generally no-constraints) version of the inner-product matrix.

This is useful for performing multiplications on vectors that already have constraints enforced.

Definition at line 2335 of file rb_construction.C.

References non_dirichlet_inner_product_matrix, and store_non_dirichlet_operators.

Referenced by get_all_matrices(), and get_non_dirichlet_inner_product_matrix_if_avail().

2336 {
2337  libmesh_error_msg_if(!store_non_dirichlet_operators,
2338  "Error: Must have store_non_dirichlet_operators==true to access non_dirichlet_inner_product_matrix.");
2339 
2341 }
std::unique_ptr< SparseMatrix< Number > > non_dirichlet_inner_product_matrix
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...

◆ get_non_dirichlet_inner_product_matrix() [2/2]

const SparseMatrix< Number > * libMesh::RBConstruction::get_non_dirichlet_inner_product_matrix ( ) const

Definition at line 2343 of file rb_construction.C.

References non_dirichlet_inner_product_matrix, and store_non_dirichlet_operators.

2344 {
2345  libmesh_error_msg_if(!store_non_dirichlet_operators,
2346  "Error: Must have store_non_dirichlet_operators==true to access non_dirichlet_inner_product_matrix.");
2347 
2349 }
std::unique_ptr< SparseMatrix< Number > > non_dirichlet_inner_product_matrix
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...

◆ get_non_dirichlet_inner_product_matrix_if_avail() [1/2]

SparseMatrix< Number > * libMesh::RBConstruction::get_non_dirichlet_inner_product_matrix_if_avail ( )

Get the non-Dirichlet inner-product matrix if it's available, otherwise get the inner-product matrix with constraints.

Definition at line 2351 of file rb_construction.C.

References get_inner_product_matrix(), get_non_dirichlet_inner_product_matrix(), and store_non_dirichlet_operators.

Referenced by libMesh::TransientRBConstruction::add_IC_to_RB_space(), compute_Fq_representor_innerprods(), compute_residual_dual_norm_slow(), libMesh::TransientRBConstruction::enrich_RB_space(), enrich_RB_space(), print_basis_function_orthogonality(), libMesh::TransientRBConstruction::set_error_temporal_data(), train_reduced_basis_with_POD(), truth_solve(), update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), and update_residual_terms().

2352 {
2354  {
2356  }
2357 
2358  return get_inner_product_matrix();
2359 }
SparseMatrix< Number > * get_non_dirichlet_inner_product_matrix()
Get the non-Dirichlet (or more generally no-constraints) version of the inner-product matrix...
SparseMatrix< Number > * get_inner_product_matrix()
Get a pointer to inner_product_matrix.
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...

◆ get_non_dirichlet_inner_product_matrix_if_avail() [2/2]

const SparseMatrix< Number > * libMesh::RBConstruction::get_non_dirichlet_inner_product_matrix_if_avail ( ) const

Definition at line 2361 of file rb_construction.C.

References get_inner_product_matrix(), get_non_dirichlet_inner_product_matrix(), and store_non_dirichlet_operators.

2362 {
2364  {
2366  }
2367 
2368  return get_inner_product_matrix();
2369 }
SparseMatrix< Number > * get_non_dirichlet_inner_product_matrix()
Get the non-Dirichlet (or more generally no-constraints) version of the inner-product matrix...
SparseMatrix< Number > * get_inner_product_matrix()
Get a pointer to inner_product_matrix.
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...

◆ get_non_dirichlet_output_vector()

NumericVector< Number > * libMesh::RBConstruction::get_non_dirichlet_output_vector ( unsigned int  n,
unsigned int  q_l 
)

Get a pointer to non-Dirichlet output vector.

Definition at line 2445 of file rb_construction.C.

References get_rb_theta_expansion(), and non_dirichlet_outputs_vector.

Referenced by assemble_all_output_vectors(), and get_output_vectors().

2446 {
2447  libmesh_error_msg_if((n >= get_rb_theta_expansion().get_n_outputs()) ||
2448  (q_l >= get_rb_theta_expansion().get_n_output_terms(n)),
2449  "Error: We must have n < n_outputs and "
2450  "q_l < get_rb_theta_expansion().get_n_output_terms(n) in get_non_dirichlet_output_vector.");
2451 
2452  return non_dirichlet_outputs_vector[n][q_l].get();
2453 }
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
std::vector< std::vector< std::unique_ptr< NumericVector< Number > > > > non_dirichlet_outputs_vector

◆ get_normalize_rb_bound_in_greedy()

bool libMesh::RBConstruction::get_normalize_rb_bound_in_greedy ( ) const
inline

Definition at line 234 of file rb_construction.h.

References normalize_rb_bound_in_greedy.

Referenced by print_info().

bool normalize_rb_bound_in_greedy
This boolean indicates if we normalize the RB error in the greedy using RBEvaluation::get_error_bound...

◆ get_output_vector()

NumericVector< Number > * libMesh::RBConstruction::get_output_vector ( unsigned int  n,
unsigned int  q_l 
)

Get a pointer to the n^th output.

Definition at line 2435 of file rb_construction.C.

References get_rb_theta_expansion(), and outputs_vector.

Referenced by assemble_all_output_vectors(), compute_output_dual_innerprods(), get_output_vectors(), libMesh::TransientRBConstruction::truth_solve(), truth_solve(), and update_RB_system_matrices().

2436 {
2437  libmesh_error_msg_if((n >= get_rb_theta_expansion().get_n_outputs()) ||
2438  (q_l >= get_rb_theta_expansion().get_n_output_terms(n)),
2439  "Error: We must have n < n_outputs and "
2440  "q_l < get_rb_theta_expansion().get_n_output_terms(n) in get_output_vector.");
2441 
2442  return outputs_vector[n][q_l].get();
2443 }
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
std::vector< std::vector< std::unique_ptr< NumericVector< Number > > > > outputs_vector
The libMesh vectors that define the output functionals.

◆ get_output_vectors()

void libMesh::RBConstruction::get_output_vectors ( std::map< std::string, NumericVector< Number > *> &  all_vectors)
virtual

Get a map that stores pointers to all of the vectors.

Definition at line 2503 of file rb_construction.C.

References libMesh::RBThetaExpansion::get_n_output_terms(), libMesh::RBThetaExpansion::get_n_outputs(), get_non_dirichlet_output_vector(), get_output_vector(), get_rb_theta_expansion(), store_dirichlet_operators, and store_non_dirichlet_operators.

Referenced by get_all_vectors().

2504 {
2505  output_vectors.clear();
2506 
2507  for (unsigned int n=0; n<get_rb_theta_expansion().get_n_outputs(); n++)
2508  for (unsigned int q_l=0; q_l<get_rb_theta_expansion().get_n_output_terms(n); q_l++)
2509  {
2510  std::stringstream output_name;
2512  {
2513  output_name << "output_" << n << "_"<< q_l;
2514  output_vectors[output_name.str()] = get_output_vector(n,q_l);
2515  }
2516 
2518  {
2519  output_name << "_non_dirichlet";
2520  output_vectors[output_name.str()] = get_non_dirichlet_output_vector(n,q_l);
2521  }
2522  }
2523 }
bool store_dirichlet_operators
Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enfor...
unsigned int get_n_outputs() const
Get n_outputs, the number output functionals.
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
bool store_non_dirichlet_operators
Boolean flag to indicate whether we store a second copy of each affine operator and vector which does...
unsigned int get_n_output_terms(unsigned int output_index) const
Get the number of affine terms associated with the specified output.
NumericVector< Number > * get_output_vector(unsigned int n, unsigned int q_l)
Get a pointer to the n^th output.
NumericVector< Number > * get_non_dirichlet_output_vector(unsigned int n, unsigned int q_l)
Get a pointer to non-Dirichlet output vector.

◆ get_parameter_max()

Real libMesh::RBParametrized::get_parameter_max ( const std::string &  param_name) const
inherited

Get maximum allowable value of parameter param_name.

Definition at line 171 of file rb_parametrized.C.

References libMesh::RBParameters::get_value(), libMesh::RBParametrized::parameters_initialized, and libMesh::RBParametrized::parameters_max.

Referenced by libMesh::RBParametrized::check_if_valid_params(), libMesh::RBSCMConstruction::print_info(), libMesh::RBEIMConstruction::print_info(), and print_info().

172 {
173  libmesh_error_msg_if(!parameters_initialized, "Error: parameters not initialized in RBParametrized::get_parameter_max");
174 
175  return parameters_max.get_value(param_name);
176 }
Real get_value(const std::string &param_name) const
Get the value of the specified parameter, throw an error if it does not exist.
Definition: rb_parameters.C:65
bool parameters_initialized
Flag indicating whether the parameters have been initialized.

◆ get_parameter_min()

Real libMesh::RBParametrized::get_parameter_min ( const std::string &  param_name) const
inherited

Get minimum allowable value of parameter param_name.

Definition at line 164 of file rb_parametrized.C.

References libMesh::RBParameters::get_value(), libMesh::RBParametrized::parameters_initialized, and libMesh::RBParametrized::parameters_min.

Referenced by libMesh::RBParametrized::check_if_valid_params(), libMesh::RBSCMConstruction::print_info(), libMesh::RBEIMConstruction::print_info(), and print_info().

165 {
166  libmesh_error_msg_if(!parameters_initialized, "Error: parameters not initialized in RBParametrized::get_parameter_min");
167 
168  return parameters_min.get_value(param_name);
169 }
Real get_value(const std::string &param_name) const
Get the value of the specified parameter, throw an error if it does not exist.
Definition: rb_parameters.C:65
bool parameters_initialized
Flag indicating whether the parameters have been initialized.
RBParameters parameters_min
Vectors that define the ranges (min and max) for the parameters.

◆ get_parameters()

const RBParameters & libMesh::RBParametrized::get_parameters ( ) const
inherited

Get the current parameters.

Definition at line 143 of file rb_parametrized.C.

References libMesh::RBParametrized::parameters, and libMesh::RBParametrized::parameters_initialized.

Referenced by libMesh::TransientRBConstruction::add_scaled_mass_matrix(), libMesh::TransientRBEvaluation::cache_online_residual_terms(), libMesh::RBEvaluation::compute_residual_dual_norm(), libMesh::RBSCMConstruction::compute_SCM_bounds_on_training_set(), libMesh::RBSCMConstruction::enrich_C_J(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_interiors(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_nodes(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_sides(), libMesh::RBEvaluation::eval_output_dual_norm(), libMesh::RBSCMConstruction::evaluate_stability_constant(), get_RB_error_bound(), libMesh::RBSCMEvaluation::get_SCM_LB(), libMesh::RBSCMEvaluation::get_SCM_UB(), SimpleRBEvaluation::get_stability_lower_bound(), greedy_termination_test(), libMesh::RBEIMConstruction::initialize_parametrized_functions_in_training_set(), libMesh::RBSCMEvaluation::legacy_read_offline_data_from_files(), libMesh::TransientRBConstruction::mass_matrix_scaled_matvec(), preevaluate_thetas(), libMesh::RBSCMConstruction::print_info(), libMesh::RBEIMConstruction::print_info(), print_info(), libMesh::RBParametrized::print_parameters(), libMesh::RBSCMConstruction::process_parameters_file(), libMesh::TransientRBEvaluation::rb_solve(), libMesh::RBEvaluation::rb_solve(), libMesh::RBSCMEvaluation::save_current_parameters(), libMesh::RBEIMConstruction::train_eim_approximation_with_greedy(), libMesh::RBEIMConstruction::train_eim_approximation_with_POD(), libMesh::TransientRBConstruction::truth_assembly(), truth_assembly(), libMesh::TransientRBConstruction::truth_solve(), truth_solve(), libMesh::TransientRBEvaluation::uncached_compute_residual_dual_norm(), and update_greedy_param_list().

144 {
145  libmesh_error_msg_if(!parameters_initialized, "Error: parameters not initialized in RBParametrized::get_parameters");
146 
147  return parameters;
148 }
bool parameters_initialized
Flag indicating whether the parameters have been initialized.
RBParameters parameters
Vector storing the current parameters.

◆ get_parameters_max()

const RBParameters & libMesh::RBParametrized::get_parameters_max ( ) const
inherited

Get an RBParameters object that specifies the maximum allowable value for each parameter.

Definition at line 157 of file rb_parametrized.C.

References libMesh::RBParametrized::parameters_initialized, and libMesh::RBParametrized::parameters_max.

Referenced by libMesh::RBDataSerialization::add_parameter_ranges_to_builder(), libMesh::RBParametrized::initialize_parameters(), libMesh::RBSCMConstruction::process_parameters_file(), libMesh::RBEIMConstruction::set_rb_construction_parameters(), set_rb_construction_parameters(), and libMesh::RBParametrized::write_parameter_ranges_to_file().

158 {
159  libmesh_error_msg_if(!parameters_initialized, "Error: parameters not initialized in RBParametrized::get_parameters_max");
160 
161  return parameters_max;
162 }
bool parameters_initialized
Flag indicating whether the parameters have been initialized.

◆ get_parameters_min()

const RBParameters & libMesh::RBParametrized::get_parameters_min ( ) const
inherited

Get an RBParameters object that specifies the minimum allowable value for each parameter.

Definition at line 150 of file rb_parametrized.C.

References libMesh::RBParametrized::parameters_initialized, and libMesh::RBParametrized::parameters_min.

Referenced by libMesh::RBDataSerialization::add_parameter_ranges_to_builder(), libMesh::RBParametrized::initialize_parameters(), libMesh::RBSCMConstruction::process_parameters_file(), libMesh::RBEIMConstruction::set_rb_construction_parameters(), set_rb_construction_parameters(), and libMesh::RBParametrized::write_parameter_ranges_to_file().

151 {
152  libmesh_error_msg_if(!parameters_initialized, "Error: parameters not initialized in RBParametrized::get_parameters_min");
153 
154  return parameters_min;
155 }
bool parameters_initialized
Flag indicating whether the parameters have been initialized.
RBParameters parameters_min
Vectors that define the ranges (min and max) for the parameters.

◆ get_params_from_training_set()

RBParameters libMesh::RBConstructionBase< LinearImplicitSystem >::get_params_from_training_set ( unsigned int  global_index)
protectedinherited

Return the RBParameters in index global_index of the global training set.

Why do we use an index here? RBParameters supports loading the full sample set. This seems probably unnecessary now to load individually. Maybe it's a memory issue?

Definition at line 231 of file rb_construction_base.C.

232 {
233  libmesh_error_msg_if(!_training_parameters_initialized,
234  "Error: training parameters must first be initialized.");
235 
236  // If the _training_parameters are empty, return an empty RBParameters.
237  // Otherwise, create a new RBParameters object from the single sample requested.
238  RBParameters params;
239  if (!_training_parameters.empty())
240  {
241  libmesh_error_msg_if((global_index < this->get_first_local_training_index()) ||
242  (global_index >= this->get_last_local_training_index()),
243  "Error: index "
244  << global_index
245  << " must be within range: "
247  << " - "
248  << this->get_last_local_training_index());
249 
250  const numeric_index_type local_index = global_index - get_first_local_training_index();
251  for (const auto & [param_name, sample_vector] : _training_parameters)
252  params.set_value(param_name, sample_vector[local_index]);
253 
254  // Copy all extra values into the new RBParameters.
255  // We assume that the samples may be indexed differently for extra parameters,
256  // so we don't just copy the local_index value.
257  const auto & mine = get_parameters();
258  for (const auto & [key, extra_sample_vector] :
259  as_range(mine.extra_begin(), mine.extra_end()))
260  {
261  for (const auto idx : index_range(extra_sample_vector))
262  params.set_extra_value(key, idx, extra_sample_vector[idx]);
263  }
264  }
265 
266  return params;
267 }
numeric_index_type get_first_local_training_index() const
Get the first local index of the training parameters.
dof_id_type numeric_index_type
Definition: id_types.h:99
SimpleRange< IndexType > as_range(const std::pair< IndexType, IndexType > &p)
Helper function that allows us to treat a homogenous pair as a range.
Definition: simple_range.h:57
numeric_index_type get_last_local_training_index() const
Get the last local index of the training parameters.
const RBParameters & get_parameters() const
Get the current parameters.
std::map< std::string, std::vector< RBParameter > > _training_parameters
The training samples for each parameter.
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:150
bool _training_parameters_initialized
Boolean flag to indicate whether or not the parameter ranges have been initialized.
unsigned int idx(const ElemType type, const unsigned int nx, const unsigned int i, const unsigned int j)
A useful inline function which replaces the macros used previously.

◆ get_preevaluate_thetas_flag()

bool libMesh::RBConstruction::get_preevaluate_thetas_flag ( ) const

Get/set flag to pre-evaluate the theta functions.

Definition at line 2755 of file rb_construction.C.

References _preevaluate_thetas_flag.

Referenced by compute_max_error_bound(), get_RB_error_bound(), and train_reduced_basis_with_greedy().

2756 {
2757  return _preevaluate_thetas_flag;
2758 }
bool _preevaluate_thetas_flag
Flag to indicate if we preevaluate the theta functions.

◆ get_project_with_constraints()

bool libMesh::System::get_project_with_constraints ( )
inlineinherited

Setter and getter functions for project_with_constraints boolean.

Definition at line 1837 of file system.h.

References libMesh::System::project_with_constraints.

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

1838  {
1839  return project_with_constraints;
1840  }
bool project_with_constraints
Do we want to apply constraints while projecting vectors ?
Definition: system.h:2343

◆ get_qoi_error_estimate_value()

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

Definition at line 2206 of file system.C.

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

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

2207 {
2208  libmesh_assert(qoi_index < _qoi_error_estimates.size());
2209  return _qoi_error_estimates[qoi_index];
2210 }
libmesh_assert(ctx)
std::vector< Number > _qoi_error_estimates
Vector to hold error estimates for qois, either from a steady state calculation, or from a single uns...
Definition: system.h:2377

◆ get_qoi_value()

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

◆ get_qoi_values()

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

Returns a copy of qoi, not a reference.

Definition at line 2186 of file system.C.

References libMesh::System::_qoi.

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

2187 {
2188  return this->_qoi;
2189 }
std::vector< Number > _qoi
Values of the quantities of interest.
Definition: system.h:2367

◆ get_rb_assembly_expansion()

RBAssemblyExpansion & libMesh::RBConstruction::get_rb_assembly_expansion ( )
Returns
A reference to the rb_assembly_expansion object

Definition at line 414 of file rb_construction.C.

References rb_assembly_expansion.

Referenced by libMesh::TransientRBConstruction::assemble_Mq_matrix(), libMesh::TransientRBConstruction::initialize_rb_construction(), and initialize_rb_construction().

415 {
416  libmesh_error_msg_if(!rb_assembly_expansion, "Error: RBAssemblyExpansion object hasn't been initialized yet");
417 
418  return *rb_assembly_expansion;
419 }
RBAssemblyExpansion * rb_assembly_expansion
This member holds the (parameter independent) assembly functors that define the "affine expansion" of...

◆ get_RB_error_bound()

Real libMesh::RBConstruction::get_RB_error_bound ( )
protectedvirtual
Returns
The RB error bound for the current parameters.

Used in the Greedy algorithm to select the next parameter.

Definition at line 1784 of file rb_construction.C.

References abs_training_tolerance, get_current_training_parameter_index(), libMesh::RBEvaluation::get_error_bound_normalization(), get_evaluated_thetas(), libMesh::RBParametrized::get_parameters(), get_preevaluate_thetas_flag(), get_rb_evaluation(), normalize_rb_bound_in_greedy, libMesh::RBEvaluation::rb_solve(), libMesh::Real, and libMesh::RBParametrized::set_parameters().

Referenced by compute_max_error_bound().

1785 {
1787 
1788  Real error_bound = 0.;
1790  {
1791  // Obtain the pre-evaluated theta functions from the current training parameter index
1792  const auto & evaluated_thetas = get_evaluated_thetas(get_current_training_parameter_index());
1793  error_bound = get_rb_evaluation().rb_solve(get_rb_evaluation().get_n_basis_functions(),
1794  &evaluated_thetas);
1795  }
1796  else
1797  error_bound = get_rb_evaluation().rb_solve(get_rb_evaluation().get_n_basis_functions());
1798 
1799 
1801  {
1802  Real error_bound_normalization = get_rb_evaluation().get_error_bound_normalization();
1803 
1804  if ((error_bound < abs_training_tolerance) ||
1805  (error_bound_normalization < abs_training_tolerance))
1806  {
1807  // We don't want to normalize this error bound if the bound or the
1808  // normalization value are below the absolute tolerance. Hence do nothing
1809  // in this case.
1810  }
1811  else
1812  error_bound /= error_bound_normalization;
1813  }
1814 
1815  return error_bound;
1816 }
bool normalize_rb_bound_in_greedy
This boolean indicates if we normalize the RB error in the greedy using RBEvaluation::get_error_bound...
virtual Real get_error_bound_normalization()
unsigned int get_current_training_parameter_index() const
Get/set the current training parameter index.
bool get_preevaluate_thetas_flag() const
Get/set flag to pre-evaluate the theta functions.
const std::vector< Number > & get_evaluated_thetas(unsigned int training_parameter_index) const
Return the evaluated theta functions at the given training parameter index.
const RBParameters & get_parameters() const
Get the current parameters.
virtual Real rb_solve(unsigned int N)
Perform online solve with the N RB basis functions, for the set of parameters in current_params, where 0 <= N <= RB_size.
bool set_parameters(const RBParameters &params)
Set the current parameters to params The parameters are checked for validity; an error is thrown if t...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.

◆ get_rb_evaluation() [1/2]

RBEvaluation & libMesh::RBConstruction::get_rb_evaluation ( )

Get a reference to the RBEvaluation object.

Definition at line 179 of file rb_construction.C.

References rb_eval.

Referenced by libMesh::TransientRBConstruction::add_IC_to_RB_space(), libMesh::TransientRBConstruction::assemble_affine_expansion(), compute_Fq_representor_innerprods(), compute_max_error_bound(), compute_output_dual_innerprods(), compute_residual_dual_norm_slow(), enrich_basis_from_rhs_terms(), libMesh::TransientRBConstruction::enrich_RB_space(), enrich_RB_space(), get_greedy_parameter(), get_RB_error_bound(), get_rb_theta_expansion(), greedy_termination_test(), load_basis_function(), libMesh::TransientRBConstruction::load_rb_solution(), load_rb_solution(), main(), preevaluate_thetas(), print_basis_function_orthogonality(), libMesh::TransientRBConstruction::process_parameters_file(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), read_riesz_representors_from_files(), recompute_all_residual_terms(), libMesh::TransientRBConstruction::set_error_temporal_data(), train_reduced_basis_with_greedy(), train_reduced_basis_with_POD(), update_greedy_param_list(), libMesh::TransientRBConstruction::update_RB_initial_condition_all_N(), libMesh::TransientRBConstruction::update_RB_system_matrices(), update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), update_residual_terms(), libMesh::TransientRBConstruction::write_riesz_representors_to_files(), and write_riesz_representors_to_files().

180 {
181  libmesh_error_msg_if(!rb_eval, "Error: RBEvaluation object hasn't been initialized yet");
182 
183  return *rb_eval;
184 }
RBEvaluation * rb_eval
The current RBEvaluation object we are using to perform the Evaluation stage of the reduced basis met...

◆ get_rb_evaluation() [2/2]

const RBEvaluation & libMesh::RBConstruction::get_rb_evaluation ( ) const

Definition at line 186 of file rb_construction.C.

References rb_eval.

187 {
188  libmesh_error_msg_if(!rb_eval, "Error: RBEvaluation object hasn't been initialized yet");
189 
190  return *rb_eval;
191 }
RBEvaluation * rb_eval
The current RBEvaluation object we are using to perform the Evaluation stage of the reduced basis met...

◆ get_rb_theta_expansion() [1/2]

RBThetaExpansion & libMesh::RBConstruction::get_rb_theta_expansion ( )

Get a reference to the RBThetaExpansion object that that belongs to rb_eval.

Definition at line 198 of file rb_construction.C.

References get_rb_evaluation(), and libMesh::RBEvaluation::get_rb_theta_expansion().

Referenced by add_scaled_Aq(), libMesh::TransientRBConstruction::add_scaled_mass_matrix(), libMesh::TransientRBConstruction::allocate_data_structures(), allocate_data_structures(), libMesh::TransientRBConstruction::assemble_all_affine_operators(), assemble_all_affine_operators(), assemble_all_affine_vectors(), assemble_all_output_vectors(), assemble_Aq_matrix(), assemble_Fq_vector(), assemble_inner_product_matrix(), libMesh::TransientRBConstruction::assemble_Mq_matrix(), compute_Fq_representor_innerprods(), compute_output_dual_innerprods(), enrich_basis_from_rhs_terms(), libMesh::TransientRBConstruction::get_all_matrices(), get_all_matrices(), get_all_vectors(), get_Aq(), get_Fq(), libMesh::TransientRBConstruction::get_M_q(), get_non_dirichlet_Aq(), get_non_dirichlet_Fq(), libMesh::TransientRBConstruction::get_non_dirichlet_M_q(), get_non_dirichlet_output_vector(), get_output_vector(), get_output_vectors(), libMesh::TransientRBConstruction::initialize_rb_construction(), initialize_rb_construction(), libMesh::TransientRBConstruction::mass_matrix_scaled_matvec(), libMesh::TransientRBConstruction::print_info(), print_info(), libMesh::TransientRBConstruction::truth_assembly(), truth_assembly(), libMesh::TransientRBConstruction::truth_solve(), truth_solve(), libMesh::TransientRBConstruction::update_RB_system_matrices(), update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), and update_residual_terms().

199 {
201 }
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the rb_theta_expansion.
Definition: rb_evaluation.C:85

◆ get_rb_theta_expansion() [2/2]

const RBThetaExpansion & libMesh::RBConstruction::get_rb_theta_expansion ( ) const

Definition at line 203 of file rb_construction.C.

References get_rb_evaluation(), and libMesh::RBEvaluation::get_rb_theta_expansion().

204 {
206 }
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the rb_theta_expansion.
Definition: rb_evaluation.C:85

◆ get_RB_training_type()

const std::string & libMesh::RBConstruction::get_RB_training_type ( ) const

Definition at line 1698 of file rb_construction.C.

References RB_training_type.

Referenced by print_info(), libMesh::TransientRBConstruction::train_reduced_basis(), and train_reduced_basis().

1699 {
1700  return RB_training_type;
1701 }
std::string RB_training_type
This string indicates the type of training that we will use.

◆ get_rel_training_tolerance()

Real libMesh::RBConstruction::get_rel_training_tolerance ( ) const
inline

Definition at line 220 of file rb_construction.h.

References rel_training_tolerance.

Referenced by print_info().

220 { return rel_training_tolerance; }
Real rel_training_tolerance
Relative and absolute tolerances for training reduced basis using the Greedy scheme.

◆ get_sensitivity_rhs() [1/2]

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

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

Definition at line 1324 of file system.C.

References libMesh::System::get_vector().

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

1325 {
1326  std::ostringstream sensitivity_rhs_name;
1327  sensitivity_rhs_name << "sensitivity_rhs" << i;
1328 
1329  return this->get_vector(sensitivity_rhs_name.str());
1330 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:931

◆ get_sensitivity_rhs() [2/2]

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

Definition at line 1334 of file system.C.

References libMesh::System::get_vector().

1335 {
1336  std::ostringstream sensitivity_rhs_name;
1337  sensitivity_rhs_name << "sensitivity_rhs" << i;
1338 
1339  return this->get_vector(sensitivity_rhs_name.str());
1340 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:931

◆ get_sensitivity_solution() [1/2]

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

Definition at line 1179 of file system.C.

References libMesh::System::get_vector().

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

1180 {
1181  std::ostringstream sensitivity_name;
1182  sensitivity_name << "sensitivity_solution" << i;
1183 
1184  return this->get_vector(sensitivity_name.str());
1185 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:931

◆ get_sensitivity_solution() [2/2]

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

Definition at line 1189 of file system.C.

References libMesh::System::get_vector().

1190 {
1191  std::ostringstream sensitivity_name;
1192  sensitivity_name << "sensitivity_solution" << i;
1193 
1194  return this->get_vector(sensitivity_name.str());
1195 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:931

◆ get_shell_matrix()

ShellMatrix<Number>* libMesh::LinearImplicitSystem::get_shell_matrix ( )
inlineinherited
Returns
A pointer to the currently attached shell matrix, if any, otherwise nullptr.

Definition at line 182 of file linear_implicit_system.h.

References libMesh::LinearImplicitSystem::_shell_matrix.

182 { return _shell_matrix; }
ShellMatrix< Number > * _shell_matrix
User supplies shell matrix or nullptr if no shell matrix is used.

◆ get_static_condensation()

StaticCondensation & libMesh::ImplicitSystem::get_static_condensation ( )
inlineinherited
Returns
The static condensation system matrix

Definition at line 362 of file implicit_system.h.

References libMesh::ImplicitSystem::_sc_system_matrix, and libMesh::libmesh_assert().

Referenced by assemble_poisson().

363 {
365  return *_sc_system_matrix;
366 }
StaticCondensation * _sc_system_matrix
The system matrix for static condensation problems.
libmesh_assert(ctx)

◆ get_system_matrix() [1/2]

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

◆ get_system_matrix() [2/2]

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

Definition at line 1260 of file implicit_system.C.

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

1261 {
1263  libmesh_assert_equal_to(&get_matrix("System Matrix"), matrix);
1264  return *matrix;
1265 }
libmesh_assert(ctx)
SparseMatrix< Number > * matrix
The system matrix.
const SparseMatrix< Number > & get_matrix(std::string_view mat_name) const
Definition: system.C:1111

◆ get_vector() [1/4]

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

Definition at line 931 of file system.C.

References libMesh::System::_vectors.

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

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

◆ get_vector() [2/4]

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

Definition at line 938 of file system.C.

References libMesh::System::_vectors.

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

◆ get_vector() [3/4]

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

Definition at line 945 of file system.C.

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

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

◆ get_vector() [4/4]

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

Definition at line 958 of file system.C.

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

959 {
960  // If we don't have that many vectors, throw an error
961  libmesh_assert_less(vec_num, _vectors.size());
962 
963  // Otherwise return a reference to the vec_num'th vector
964  auto it = vectors_begin();
965  std::advance(it, vec_num);
966  return *(it->second);
967 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260
vectors_iterator vectors_begin()
Beginning of vectors container.
Definition: system.h:2505

◆ get_weighted_sensitivity_adjoint_solution() [1/2]

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

Definition at line 1264 of file system.C.

References libMesh::System::get_vector().

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

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

◆ get_weighted_sensitivity_adjoint_solution() [2/2]

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

Definition at line 1274 of file system.C.

References libMesh::System::get_vector().

1275 {
1276  std::ostringstream adjoint_name;
1277  adjoint_name << "weighted_sensitivity_adjoint_solution" << i;
1278 
1279  return this->get_vector(adjoint_name.str());
1280 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:931

◆ get_weighted_sensitivity_solution() [1/2]

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

Definition at line 1206 of file system.C.

References libMesh::System::get_vector().

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

1207 {
1208  return this->get_vector("weighted_sensitivity_solution");
1209 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:931

◆ get_weighted_sensitivity_solution() [2/2]

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

Definition at line 1213 of file system.C.

References libMesh::System::get_vector().

1214 {
1215  return this->get_vector("weighted_sensitivity_solution");
1216 }
const NumericVector< Number > & get_vector(std::string_view vec_name) const
Definition: system.C:931

◆ greedy_termination_test()

bool libMesh::RBConstruction::greedy_termination_test ( Real  abs_greedy_error,
Real  initial_greedy_error,
int  count 
)
protectedvirtual

Function that indicates when to terminate the Greedy basis training.

Override in subclasses to specialize.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 1565 of file rb_construction.C.

References abs_training_tolerance, exit_on_repeated_greedy_parameters, libMesh::RBEvaluation::get_n_basis_functions(), get_Nmax(), libMesh::RBParametrized::get_parameters(), get_rb_evaluation(), libMesh::RBEvaluation::greedy_param_list, libMesh::out, libMesh::Real, and rel_training_tolerance.

Referenced by libMesh::TransientRBConstruction::greedy_termination_test(), and train_reduced_basis_with_greedy().

1568 {
1569  if (abs_greedy_error < this->abs_training_tolerance)
1570  {
1571  libMesh::out << "Absolute error tolerance reached." << std::endl;
1572  return true;
1573  }
1574 
1575  Real rel_greedy_error = abs_greedy_error/initial_error;
1576  if (rel_greedy_error < this->rel_training_tolerance)
1577  {
1578  libMesh::out << "Relative error tolerance reached." << std::endl;
1579  return true;
1580  }
1581 
1582  RBEvaluation & rbe = get_rb_evaluation();
1583 
1584  if (rbe.get_n_basis_functions() >= this->get_Nmax())
1585  {
1586  libMesh::out << "Maximum number of basis functions reached: Nmax = "
1587  << get_Nmax() << std::endl;
1588  return true;
1589  }
1590 
1592  for (auto & plist : rbe.greedy_param_list)
1593  if (plist == get_parameters())
1594  {
1595  libMesh::out << "Exiting greedy because the same parameters were selected twice" << std::endl;
1596  return true;
1597  }
1598 
1599  return false;
1600 }
Real rel_training_tolerance
Relative and absolute tolerances for training reduced basis using the Greedy scheme.
unsigned int get_Nmax() const
Get/set Nmax, the maximum number of RB functions we are willing to compute.
const RBParameters & get_parameters() const
Get the current parameters.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
OStreamProxy out
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.
bool exit_on_repeated_greedy_parameters
Boolean flag to indicate whether we exit the greedy if we select the same parameters twice in a row...

◆ has_constraint_object()

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

Definition at line 2014 of file system.C.

References libMesh::System::_constrain_system_object.

2015 {
2016  return _constrain_system_object != nullptr;
2017 }
Constraint * _constrain_system_object
Object that constrains the system.
Definition: system.h:2193

◆ has_static_condensation()

bool libMesh::System::has_static_condensation ( ) const
inherited

◆ has_variable()

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

Definition at line 1393 of file system.C.

References libMesh::System::get_dof_map(), and libMesh::DofMap::has_variable().

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

1394 {
1395  return this->get_dof_map().has_variable(var);
1396 }
bool has_variable(std::string_view var) const
Definition: dof_map.h:2986
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ have_matrix()

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

Definition at line 1933 of file system.h.

References libMesh::System::_matrices.

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

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

◆ have_vector()

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

Definition at line 2491 of file system.h.

References libMesh::System::_vectors.

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

◆ hide_output()

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

Definition at line 1852 of file system.h.

References libMesh::System::_hide_output.

Referenced by libMesh::StaticCondensationDofMap::reinit(), libMesh::PetscPreconditioner< T >::set_hypre_ads_data(), and libMesh::PetscPreconditioner< T >::set_hypre_ams_data().

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

◆ identify_variable_groups() [1/2]

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

Definition at line 2679 of file system.C.

References libMesh::System::get_dof_map(), and libMesh::DofMap::identify_variable_groups().

2680 {
2681  return this->get_dof_map().identify_variable_groups();
2682 }
bool identify_variable_groups() const
Definition: dof_map.h:2951
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ identify_variable_groups() [2/2]

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

Toggle automatic VariableGroup identification.

Definition at line 2684 of file system.C.

References libMesh::System::get_dof_map(), and libMesh::DofMap::identify_variable_groups().

2685 {
2687 }
bool identify_variable_groups() const
Definition: dof_map.h:2951
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ increment_constructor_count() [1/2]

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

Increments the construction counter.

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

Definition at line 183 of file reference_counter.h.

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

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

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

◆ increment_constructor_count() [2/2]

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

Increments the construction counter.

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

Definition at line 183 of file reference_counter.h.

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

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

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

◆ increment_destructor_count() [1/2]

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

Increments the destruction counter.

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

Definition at line 207 of file reference_counter.h.

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

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

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

◆ increment_destructor_count() [2/2]

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

Increments the destruction counter.

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

Definition at line 207 of file reference_counter.h.

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

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

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

◆ init()

void libMesh::System::init ( )
inherited

Initializes degrees of freedom on the current mesh.

Sets the

Definition at line 196 of file system.C.

References libMesh::System::is_initialized(), libMesh::libmesh_assert(), and libMesh::System::reinit_mesh().

Referenced by libMesh::StaticCondensationDofMap::reinit().

197 {
198  // Calling init() twice on the same system currently works evil
199  // magic, whether done directly or via EquationSystems::read()
200  libmesh_assert(!this->is_initialized());
201 
202  this->reinit_mesh();
203 }
bool is_initialized() const
Definition: system.h:2457
libmesh_assert(ctx)
virtual void reinit_mesh()
Reinitializes the system with a new mesh.
Definition: system.C:289

◆ init_context()

virtual void libMesh::RBConstruction::init_context ( FEMContext )
inlineprotectedvirtual

Initialize the FEMContext prior to performing an element loop.

Reimplement this in derived classes in order to call FE::get_*() as the particular physics requires.

Reimplemented in SimpleRBConstruction, SimpleRBConstruction, SimpleRBConstruction, SimpleRBConstruction, SimpleRBConstruction, and ElasticityRBConstruction.

Definition at line 825 of file rb_construction.h.

Referenced by add_scaled_matrix_and_vector().

826  {
827  // Failing to rederive init_context() means your FE objects don't
828  // know what to compute.
829  libmesh_deprecated();
830  }

◆ init_data()

void libMesh::RBConstructionBase< LinearImplicitSystem >::init_data ( )
protectedvirtualinherited

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

Reimplemented from libMesh::LinearImplicitSystem.

Reimplemented in SimpleRBConstruction, SimpleRBConstruction, SimpleRBConstruction, SimpleRBConstruction, SimpleRBConstruction, SimpleRBConstruction, and ElasticityRBConstruction.

Definition at line 123 of file rb_construction_base.C.

Referenced by SimpleRBConstruction::init_data().

124 {
125  Base::init_data();
126 
127  // Initialize the inner product storage vector, which is useful for
128  // storing intermediate results when evaluating inner products
130  inner_product_storage_vector->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
131 }
const Parallel::Communicator & comm() const
dof_id_type n_local_dofs() const
Definition: system.C:155
dof_id_type n_dofs() const
Definition: system.C:118
std::unique_ptr< NumericVector< Number > > inner_product_storage_vector
We keep an extra temporary vector that is useful for performing inner products (avoids unnecessary me...
static std::unique_ptr< NumericVector< Number > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...

◆ init_matrices()

void libMesh::System::init_matrices ( )
protectedvirtualinherited

Initializes the matrices associated with this system.

Reimplemented in libMesh::EigenSystem.

Definition at line 311 of file system.C.

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

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

312 {
313  parallel_object_only();
314 
315  // No matrices to init
316  if (_matrices.empty())
317  {
318  // any future matrices to be added will need their own
319  // initialization
320  _matrices_initialized = true;
321 
322  return;
323  }
324 
325  // Check for quick return in case the first matrix
326  // (and by extension all the matrices) has already
327  // been initialized
328  if (_matrices.begin()->second->initialized())
329  {
331  return;
332  }
333 
334  _matrices_initialized = true;
335 
336  // Tell the matrices about the dof map, and vice versa
337  for (auto & pr : _matrices)
338  {
339  SparseMatrix<Number> & m = *(pr.second);
340  libmesh_assert (!m.initialized());
341 
342  // We want to allow repeated init() on systems, but we don't
343  // want to attach the same matrix to the DofMap twice
344  if (!this->get_dof_map().is_attached(m))
345  this->get_dof_map().attach_matrix(m);
346 
347  // If the user has already explicitly requested that this matrix use a hash table, then we
348  // always honor that
349  const bool use_hash =
350  pr.second->use_hash_table() ||
351  (this->_prefer_hash_table_matrix_assembly && pr.second->supports_hash_table());
352  pr.second->use_hash_table(use_hash);
353  // Make this call after we've determined whether the matrix is using a hash table
354  if (pr.second->require_sparsity_pattern())
355  this->_require_sparsity_pattern = true;
356  }
357 
358  // Compute the sparsity pattern for the current
359  // mesh and DOF distribution. This also updates
360  // additional matrices, \p DofMap now knows them
361  if (this->_require_sparsity_pattern)
362  this->get_dof_map().compute_sparsity(this->get_mesh());
363 
364  // Initialize matrices and set to zero
365  for (auto & [name, mat] : _matrices)
366  {
367  mat->init(_matrix_types[name]);
368  mat->zero();
369  }
370 }
bool is_attached(SparseMatrix< Number > &matrix)
Matrices should not be attached more than once.
Definition: dof_map.C:295
void attach_matrix(SparseMatrix< Number > &matrix)
Additional matrices may be attached to this DofMap.
Definition: dof_map.C:240
const MeshBase & get_mesh() const
Definition: system.h:2401
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2277
bool _prefer_hash_table_matrix_assembly
Whether to use hash table matrix assembly if the matrix sub-classes support it.
Definition: system.h:2348
libmesh_assert(ctx)
std::map< std::string, ParallelType, std::less<> > _matrix_types
Holds the types of the matrices.
Definition: system.h:2282
template class LIBMESH_EXPORT SparseMatrix< Number >
bool _matrices_initialized
false when additional matrices being added require initialization, true otherwise.
Definition: system.h:2287
bool _require_sparsity_pattern
Whether any of our matrices require an initial sparsity pattern computation in order to determine pre...
Definition: system.h:2353
const std::string & name() const
Definition: system.h:2385
void compute_sparsity(const MeshBase &)
Computes the sparsity pattern for the matrices corresponding to proc_id and sends that data to Linear...
Definition: dof_map.C:1951
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ init_qois()

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

Accessors for qoi and qoi_error_estimates vectors.

Definition at line 2164 of file system.C.

References libMesh::System::_qoi, libMesh::System::_qoi_error_estimates, and libMesh::System::n_qois().

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

2165 {
2166  _qoi.resize(n_qois);
2167  _qoi_error_estimates.resize(n_qois);
2168 }
unsigned int n_qois() const
Number of currently active quantities of interest.
Definition: system.h:2562
std::vector< Number > _qoi
Values of the quantities of interest.
Definition: system.h:2367
std::vector< Number > _qoi_error_estimates
Vector to hold error estimates for qois, either from a steady state calculation, or from a single uns...
Definition: system.h:2377

◆ initialize_parameters() [1/2]

void libMesh::RBParametrized::initialize_parameters ( const RBParameters mu_min_in,
const RBParameters mu_max_in,
const std::map< std::string, std::vector< Real >> &  discrete_parameter_values 
)
inherited

Initialize the parameter ranges and set current_parameters.

Parameter ranges are inclusive. The input min/max RBParameters should have exactly 1 sample each. Vector-valued samples are not currently supported for the min/max parameters or for discrete parameters.

Definition at line 53 of file rb_parametrized.C.

References libMesh::RBParametrized::_discrete_parameter_values, libMesh::RBParameters::begin_serialized(), libMesh::RBParameters::end_serialized(), libMesh::RBParameters::n_parameters(), libMesh::RBParameters::n_samples(), libMesh::Quality::name(), libMesh::RBParametrized::parameters_initialized, libMesh::RBParametrized::parameters_max, libMesh::RBParametrized::parameters_min, libMesh::Real, libMesh::RBParametrized::set_parameters(), and libMesh::RBParameters::set_value().

Referenced by enrich_basis_from_rhs_terms(), libMesh::RBParametrized::initialize_parameters(), libMesh::RBDataDeserialization::load_parameter_ranges(), libMesh::RBSCMConstruction::perform_SCM_greedy(), libMesh::RBSCMConstruction::process_parameters_file(), libMesh::RBParametrized::read_parameter_data_from_files(), libMesh::RBEIMConstruction::set_rb_construction_parameters(), set_rb_construction_parameters(), RBParametersTest::testRBParametrized(), libMesh::RBEIMConstruction::train_eim_approximation_with_greedy(), libMesh::RBEIMConstruction::train_eim_approximation_with_POD(), train_reduced_basis_with_greedy(), and train_reduced_basis_with_POD().

56 {
57  // Check that the min/max vectors have the same size.
58  libmesh_error_msg_if(mu_min_in.n_parameters() != mu_max_in.n_parameters(),
59  "Error: Invalid mu_min/mu_max in initialize_parameters(), different number of parameters.");
60  libmesh_error_msg_if(mu_min_in.n_samples() != 1 ||
61  mu_max_in.n_samples() != 1,
62  "Error: Invalid mu_min/mu_max in initialize_parameters(), only 1 sample supported.");
63 
64  // Ensure all the values are valid for min and max.
65  auto pr_min = mu_min_in.begin_serialized();
66  auto pr_max = mu_max_in.begin_serialized();
67  for (; pr_min != mu_min_in.end_serialized(); ++pr_min, ++pr_max)
68  libmesh_error_msg_if((*pr_min).second > (*pr_max).second,
69  "Error: Invalid mu_min/mu_max in RBParameters constructor.");
70 
71  parameters_min = mu_min_in;
72  parameters_max = mu_max_in;
73 
74  // Add in min/max values due to the discrete parameters
75  for (const auto & [name, vals] : discrete_parameter_values)
76  {
77  libmesh_error_msg_if(vals.empty(), "Error: List of discrete parameters for " << name << " is empty.");
78 
79  Real min_val = *std::min_element(vals.begin(), vals.end());
80  Real max_val = *std::max_element(vals.begin(), vals.end());
81 
82  libmesh_assert_less_equal(min_val, max_val);
83 
84  parameters_min.set_value(name, min_val);
85  parameters_max.set_value(name, max_val);
86  }
87 
88  _discrete_parameter_values = discrete_parameter_values;
89 
91 
92  // Initialize the current parameters to parameters_min
94 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
bool parameters_initialized
Flag indicating whether the parameters have been initialized.
RBParameters parameters_min
Vectors that define the ranges (min and max) for the parameters.
std::map< std::string, std::vector< Real > > _discrete_parameter_values
Map that defines the allowable values of any discrete parameters.
bool set_parameters(const RBParameters &params)
Set the current parameters to params The parameters are checked for validity; an error is thrown if t...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void set_value(const std::string &param_name, Real value)
Set the value of the specified parameter.

◆ initialize_parameters() [2/2]

void libMesh::RBParametrized::initialize_parameters ( const RBParametrized rb_parametrized)
inherited

Initialize the parameter ranges and set current_parameters.

Definition at line 96 of file rb_parametrized.C.

References libMesh::RBParametrized::get_discrete_parameter_values(), libMesh::RBParametrized::get_parameters_max(), libMesh::RBParametrized::get_parameters_min(), and libMesh::RBParametrized::initialize_parameters().

97 {
98  initialize_parameters(rb_parametrized.get_parameters_min(),
99  rb_parametrized.get_parameters_max(),
100  rb_parametrized.get_discrete_parameter_values());
101 }
void initialize_parameters(const RBParameters &mu_min_in, const RBParameters &mu_max_in, const std::map< std::string, std::vector< Real >> &discrete_parameter_values)
Initialize the parameter ranges and set current_parameters.

◆ initialize_rb_construction()

void libMesh::RBConstruction::initialize_rb_construction ( bool  skip_matrix_assembly = false,
bool  skip_vector_assembly = false 
)
virtual

Allocate all the data structures necessary for the construction stage of the RB method.

This function also performs matrix and vector assembly of the "truth" affine expansion.

We can optionally skip the matrix or vector assembly steps by setting skip_matrix_assembly = true, or skip_vector_assembly = true, respectively.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 466 of file rb_construction.C.

References allocate_data_structures(), assemble_affine_expansion(), libMesh::LinearImplicitSystem::get_linear_solver(), libMesh::RBThetaExpansion::get_n_outputs(), get_rb_assembly_expansion(), get_rb_theta_expansion(), inner_product_solver, and libMesh::LinearSolver< T >::reuse_preconditioner().

Referenced by libMesh::TransientRBConstruction::initialize_rb_construction(), and main().

468 {
469  if (!skip_matrix_assembly && !skip_vector_assembly)
470  {
471  // Check that the theta and assembly objects are consistently sized
472  libmesh_assert_equal_to (get_rb_theta_expansion().get_n_A_terms(), get_rb_assembly_expansion().get_n_A_terms());
473  libmesh_assert_equal_to (get_rb_theta_expansion().get_n_F_terms(), get_rb_assembly_expansion().get_n_F_terms());
474  libmesh_assert_equal_to (get_rb_theta_expansion().get_n_outputs(), get_rb_assembly_expansion().get_n_outputs());
475  for (unsigned int i=0; i<get_rb_theta_expansion().get_n_outputs(); i++)
476  {
477  libmesh_assert_equal_to (get_rb_theta_expansion().get_n_output_terms(i),
478  get_rb_assembly_expansion().get_n_output_terms(i));
479  }
480  }
481 
482  // Perform the initialization
484  assemble_affine_expansion(skip_matrix_assembly, skip_vector_assembly);
485 
486  // inner_product_solver performs solves with the same matrix every time
487  // hence we can set reuse_preconditioner(true).
488  inner_product_solver->reuse_preconditioner(true);
489 
490  // The primary solver is used for truth solves and other solves that
491  // require different matrices, so set reuse_preconditioner(false).
493 
494 }
virtual LinearSolver< Number > * get_linear_solver() const override
unsigned int get_n_outputs() const
Get n_outputs, the number output functionals.
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
RBAssemblyExpansion & get_rb_assembly_expansion()
virtual void reuse_preconditioner(bool)
Set the same_preconditioner flag, which indicates if we reuse the same preconditioner for subsequent ...
std::unique_ptr< LinearSolver< Number > > inner_product_solver
We store an extra linear solver object which we can optionally use for solving all systems in which t...
virtual void allocate_data_structures()
Helper function that actually allocates all the data structures required by this class.
virtual void assemble_affine_expansion(bool skip_matrix_assembly, bool skip_vector_assembly)
Assemble the matrices and vectors for this system.

◆ initialize_training_parameters()

void libMesh::RBConstructionBase< LinearImplicitSystem >::initialize_training_parameters ( const RBParameters mu_min,
const RBParameters mu_max,
const unsigned int  n_global_training_samples,
const std::map< std::string, bool > &  log_param_scale,
const bool  deterministic = true 
)
virtualinherited

Initialize the parameter ranges and indicate whether deterministic or random training parameters should be used and whether or not we want the parameters to be scaled logarithmically.

n_global_training_samples is the total number of samples to generate, which will be distributed across all the processors.

Definition at line 292 of file rb_construction_base.C.

Referenced by set_rb_construction_parameters().

297 {
298  if (!is_quiet())
299  {
300  // Print out some info about the training set initialization
301  libMesh::out << "Initializing training parameters with "
302  << (deterministic ? "deterministic " : "random " )
303  << "training set..." << std::endl;
304 
305  for (const auto & pr : log_param_scale)
306  libMesh::out << "Parameter "
307  << pr.first
308  << ": log scaling = "
309  << pr.second
310  << std::endl;
311 
312  libMesh::out << std::endl;
313  }
314 
315  if (deterministic)
316  {
317  const auto [first_local_index, last_local_index] =
319  log_param_scale,
321  n_global_training_samples,
322  mu_min,
323  mu_max,
325  _first_local_index = first_local_index;
326  _n_local_training_samples = last_local_index-first_local_index;
327  }
328  else
329  {
330  // Generate random training samples for all parameters
331  const auto [first_local_index, last_local_index] =
333  log_param_scale,
335  n_global_training_samples,
336  mu_min,
337  mu_max,
340  _first_local_index = first_local_index;
341  _n_local_training_samples = last_local_index-first_local_index;
342  }
344 
345  if (!serial_training_set)
347 
348  // For each parameter that only allows discrete values, we "snap" to the nearest
349  // allowable discrete value
350  if (get_n_discrete_params() > 0)
351  {
352  for (auto & [param_name, sample_vector] : _training_parameters)
353  {
354  if (is_discrete_parameter(param_name))
355  {
356  const std::vector<Real> & discrete_values =
357  libmesh_map_find(get_discrete_parameter_values(), param_name);
358 
359  for (const auto sample_idx : index_range(sample_vector))
360  {
361  // Round all values to the closest discrete value.
362  std::vector<Real> discretized_vector(sample_vector[sample_idx].size());
363  std::transform(sample_vector[sample_idx].cbegin(),
364  sample_vector[sample_idx].cend(),
365  discretized_vector.begin(),
366  [&discrete_values](const Real & val) {
367  return get_closest_value(val, discrete_values);
368  });
369  sample_vector[sample_idx] = discretized_vector;
370  }
371  }
372  }
373  }
374 
376 }
static std::pair< std::size_t, std::size_t > generate_training_parameters_random(const Parallel::Communicator &communicator, const std::map< std::string, bool > &log_param_scale, std::map< std::string, std::vector< RBParameter >> &local_training_parameters_in, const unsigned int n_global_training_samples_in, const RBParameters &min_parameters, const RBParameters &max_parameters, const int training_parameters_random_seed=-1, const bool serial_training_set=false)
Static helper function for generating a randomized set of parameters.
static std::pair< std::size_t, std::size_t > generate_training_parameters_deterministic(const Parallel::Communicator &communicator, const std::map< std::string, bool > &log_param_scale, std::map< std::string, std::vector< RBParameter >> &local_training_parameters_in, const unsigned int n_global_training_samples_in, const RBParameters &min_parameters, const RBParameters &max_parameters, const bool serial_training_set=false)
Static helper function for generating a deterministic set of parameters.
void sum(T &r) const
const Parallel::Communicator & comm() const
bool is_quiet() const
Is the system in quiet mode?
static Real get_closest_value(Real value, const std::vector< Real > &list_of_values)
unsigned int get_n_discrete_params() const
Get the number of discrete parameters.
numeric_index_type _first_local_index
The first sample-vector index from the global vector which is stored in the _training_parameters on t...
const std::map< std::string, std::vector< Real > > & get_discrete_parameter_values() const
Get a const reference to the discrete parameter values.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
OStreamProxy out
bool serial_training_set
This boolean flag indicates whether or not the training set should be the same on all processors...
int _training_parameters_random_seed
If < 0, use std::time() * processor_id() to seed the random number generator for the training paramet...
std::map< std::string, std::vector< RBParameter > > _training_parameters
The training samples for each parameter.
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:150
bool _training_parameters_initialized
Boolean flag to indicate whether or not the parameter ranges have been initialized.
bool is_discrete_parameter(const std::string &mu_name) const
Is parameter mu_name discrete?

◆ is_adjoint_already_solved()

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

Accessor for the adjoint_already_solved boolean.

Definition at line 411 of file system.h.

References libMesh::System::adjoint_already_solved.

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

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

◆ is_discrete_parameter()

bool libMesh::RBParametrized::is_discrete_parameter ( const std::string &  mu_name) const
inherited

Is parameter mu_name discrete?

Definition at line 351 of file rb_parametrized.C.

References libMesh::RBParametrized::_discrete_parameter_values, and libMesh::RBParametrized::parameters_initialized.

Referenced by libMesh::RBDataSerialization::add_parameter_ranges_to_builder(), libMesh::RBEIMConstruction::print_info(), print_info(), and libMesh::RBParametrized::write_parameter_ranges_to_file().

352 {
353  libmesh_error_msg_if(!parameters_initialized,
354  "Error: parameters not initialized in RBParametrized::is_discrete_parameter");
355 
356  return _discrete_parameter_values.count(mu_name);
357 }
bool parameters_initialized
Flag indicating whether the parameters have been initialized.
std::map< std::string, std::vector< Real > > _discrete_parameter_values
Map that defines the allowable values of any discrete parameters.

◆ is_initialized()

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

Definition at line 2457 of file system.h.

References libMesh::System::_is_initialized.

Referenced by libMesh::DofMap::add_variable(), libMesh::DofMap::add_variables(), libMesh::System::get_info(), libMesh::System::init(), and libMesh::StaticCondensationDofMap::reinit().

2458 {
2459  return _is_initialized;
2460 }
bool _is_initialized
true when additional vectors and variables do not require immediate initialization, false otherwise.
Definition: system.h:2306

◆ is_quiet()

bool libMesh::RBConstructionBase< LinearImplicitSystem >::is_quiet ( ) const
inlineinherited

Is the system in quiet mode?

Definition at line 106 of file rb_construction_base.h.

Referenced by compute_Fq_representor_innerprods(), compute_output_dual_innerprods(), print_info(), libMesh::TransientRBConstruction::update_residual_terms(), and update_residual_terms().

107  { return this->quiet_mode; }
bool quiet_mode
Flag to indicate whether we print out extra information during the Offline stage. ...

◆ is_rb_eval_initialized()

bool libMesh::RBConstruction::is_rb_eval_initialized ( ) const
Returns
true if rb_eval is initialized. False, otherwise.

Definition at line 193 of file rb_construction.C.

References rb_eval.

Referenced by libMesh::TransientRBConstruction::print_info(), and print_info().

194 {
195  return (rb_eval != nullptr);
196 }
RBEvaluation * rb_eval
The current RBEvaluation object we are using to perform the Evaluation stage of the reduced basis met...

◆ is_serial_training_type()

bool libMesh::RBConstruction::is_serial_training_type ( const std::string &  RB_training_type_in)
virtual
Returns
true if RB_training_type_in is a type of training that requires a serial training set. For example, POD training generally does require a serial training set.

Definition at line 1681 of file rb_construction.C.

Referenced by set_RB_training_type().

1682 {
1683  return (RB_training_type_in == "POD");
1684 }

◆ load_basis_function()

void libMesh::RBConstruction::load_basis_function ( unsigned int  i)
virtual

Load the i^th RB function into the RBConstruction solution vector.

Definition at line 1708 of file rb_construction.C.

References libMesh::RBEvaluation::get_basis_function(), get_rb_evaluation(), libMesh::System::solution, and libMesh::System::update().

Referenced by main().

1709 {
1710  LOG_SCOPE("load_basis_function()", "RBConstruction");
1711 
1712  libmesh_assert_less (i, get_rb_evaluation().get_n_basis_functions());
1713 
1715 
1716  this->update();
1717 }
NumericVector< Number > & get_basis_function(unsigned int i)
Get a reference to the i^th basis function.
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
virtual void update()
Update the local values to reflect the solution on neighboring processors.
Definition: system.C:498
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.

◆ load_rb_solution()

void libMesh::RBConstruction::load_rb_solution ( )
virtual

Load the RB solution from the most recent solve with rb_eval into this system's solution vector.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 2256 of file rb_construction.C.

References libMesh::RBEvaluation::get_n_basis_functions(), get_rb_evaluation(), libMesh::make_range(), libMesh::RBEvaluation::RB_solution, libMesh::DenseVector< T >::size(), libMesh::System::solution, and libMesh::System::update().

Referenced by main().

2257 {
2258  LOG_SCOPE("load_rb_solution()", "RBConstruction");
2259 
2260  solution->zero();
2261 
2262  libmesh_error_msg_if(get_rb_evaluation().RB_solution.size() > get_rb_evaluation().get_n_basis_functions(),
2263  "ERROR: System contains " << get_rb_evaluation().get_n_basis_functions() << " basis functions."
2264  << " RB_solution vector contains " << get_rb_evaluation().RB_solution.size() << " entries."
2265  << " RB_solution in RBConstruction::load_rb_solution is too long!");
2266 
2267  for (auto i : make_range(get_rb_evaluation().RB_solution.size()))
2268  solution->add(get_rb_evaluation().RB_solution(i), get_rb_evaluation().get_basis_function(i));
2269 
2270  update();
2271 }
DenseVector< Number > RB_solution
The RB solution vector.
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
virtual void update()
Update the local values to reflect the solution on neighboring processors.
Definition: system.C:498
virtual unsigned int get_n_basis_functions() const
Get the current number of basis functions.
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
virtual unsigned int size() const override final
Definition: dense_vector.h:104
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.

◆ load_training_set()

void libMesh::RBConstructionBase< LinearImplicitSystem >::load_training_set ( const std::map< std::string, std::vector< RBParameter >> &  new_training_set)
virtualinherited

Overwrite the training parameters with new_training_set.

This training set is assumed to contain only the samples local to this processor.

Definition at line 379 of file rb_construction_base.C.

Referenced by set_rb_construction_parameters().

380 {
381  // Make sure we're running this on all processors at the same time
382  libmesh_parallel_only(this->comm());
383 
384  // First, make sure that an initial training set has already been generated
385  libmesh_error_msg_if(!_training_parameters_initialized,
386  "Error: load_training_set cannot be used to initialize parameters");
387 
388  // Make sure that the training set has the correct number of parameters
389  const unsigned int n_params = get_n_params();
390  libmesh_error_msg_if(new_training_set.size() > n_params,
391  "Error: new_training_set should not have more than get_n_params() parameters.");
392 
393  // Check that (new_training_set.size() == get_n_params()) is the same on all processes so that
394  // we go into the same branch of the "if" statement below on all processes.
395  const bool size_matches = (new_training_set.size() == n_params);
396  libmesh_assert(this->comm().verify(size_matches));
397 
398  if (size_matches)
399  {
400  // If new_training_set stores values for all parameters, then we overwrite
401  // _training_parameters with new_training_set.
402 
403  // Get the number of local and global training parameters
404  _first_local_index = 0;
406  cast_int<numeric_index_type>(new_training_set.begin()->second.size());
408 
409  if (!serial_training_set)
410  {
411  this->comm().sum(_n_global_training_samples);
412 
413  // Set the first/last indices.
414  std::vector<numeric_index_type> local_sizes (this->n_processors(), 0);
415  local_sizes[this->processor_id()] = _n_local_training_samples;
416  this->comm().sum(local_sizes);
417 
418  // first_local_index is the sum of local_sizes
419  // for all processor ids less than ours
420  for (auto p : make_range(this->processor_id()))
421  _first_local_index += local_sizes[p];
422  }
423 
424  // Ensure that the parameters are the same.
425  for (const auto & pr : _training_parameters)
426  libmesh_error_msg_if(!new_training_set.count(pr.first),
427  "Parameters must be identical in order to overwrite dataset.");
428 
429  // Copy the values from the new_training_set to the internal training_parameters.
430  _training_parameters = new_training_set;
431  }
432  else
433  {
434  // If new_training_set stores values for a subset of the parameters, then we keep the
435  // length of training_parameters unchanged and overwrite the entries of the specified
436  // parameters from new_training_set. Note that we repeatedly loop over new_training_set
437  // to fill up the entire length of the sample_vector.
438  for (auto & [param_name, sample_vector]: _training_parameters)
439  {
440  if (new_training_set.count(param_name))
441  {
442  for (const auto i : make_range(get_local_n_training_samples()))
443  {
444  const unsigned int num_new_samples = libmesh_map_find(new_training_set,param_name).size();
445  libmesh_error_msg_if (num_new_samples==0, "new_training_set set should not be empty");
446 
447  const unsigned int new_training_set_index = i % num_new_samples;
448  sample_vector[i] = libmesh_map_find(new_training_set,param_name)[new_training_set_index];
449  }
450  }
451  }
452  }
453 }
void sum(T &r) const
const Parallel::Communicator & comm() const
numeric_index_type _first_local_index
The first sample-vector index from the global vector which is stored in the _training_parameters on t...
processor_id_type n_processors() const
numeric_index_type get_local_n_training_samples() const
Get the total number of training samples local to this processor.
libmesh_assert(ctx)
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
bool serial_training_set
This boolean flag indicates whether or not the training set should be the same on all processors...
std::map< std::string, std::vector< RBParameter > > _training_parameters
The training samples for each parameter.
processor_id_type processor_id() const
unsigned int get_n_params() const
Get the number of parameters.
bool _training_parameters_initialized
Boolean flag to indicate whether or not the parameter ranges have been initialized.

◆ local_dof_indices()

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

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

Definition at line 1409 of file system.C.

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

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

1411 {
1412  // Make sure the set is clear
1413  var_indices.clear();
1414 
1415  std::vector<dof_id_type> dof_indices;
1416 
1417  const dof_id_type
1418  first_local = this->get_dof_map().first_dof(),
1419  end_local = this->get_dof_map().end_dof();
1420 
1421  // Begin the loop over the elements
1422  for (const auto & elem : this->get_mesh().active_local_element_ptr_range())
1423  {
1424  this->get_dof_map().dof_indices (elem, dof_indices, var);
1425 
1426  for (dof_id_type dof : dof_indices)
1427  //If the dof is owned by the local processor
1428  if (first_local <= dof && dof < end_local)
1429  var_indices.insert(dof);
1430  }
1431 
1432  // we may have missed assigning DOFs to nodes that we own
1433  // but to which we have no connected elements matching our
1434  // variable restriction criterion. this will happen, for example,
1435  // if variable V is restricted to subdomain S. We may not own
1436  // any elements which live in S, but we may own nodes which are
1437  // *connected* to elements which do.
1438  for (const auto & node : this->get_mesh().local_node_ptr_range())
1439  {
1440  libmesh_assert(node);
1441  this->get_dof_map().dof_indices (node, dof_indices, var);
1442  for (auto dof : dof_indices)
1443  if (first_local <= dof && dof < end_local)
1444  var_indices.insert(dof);
1445  }
1446 }
dof_id_type end_dof(const processor_id_type proc) const
Definition: dof_map_base.h:191
void dof_indices(const Elem *const elem, std::vector< dof_id_type > &di) const
Definition: dof_map.C:2192
const MeshBase & get_mesh() const
Definition: system.h:2401
libmesh_assert(ctx)
dof_id_type first_dof(const processor_id_type proc) const
Definition: dof_map_base.h:185
const DofMap & get_dof_map() const
Definition: system.h:2417
uint8_t dof_id_type
Definition: id_types.h:67

◆ matrices_begin() [1/2]

System::matrices_iterator libMesh::System::matrices_begin ( )
inlineinherited

Beginning of matrices container.

Definition at line 2529 of file system.h.

References libMesh::System::_matrices.

2530 {
2531  return _matrices.begin();
2532 }
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2277

◆ matrices_begin() [2/2]

System::const_matrices_iterator libMesh::System::matrices_begin ( ) const
inlineinherited

Beginning of matrices container.

Definition at line 2535 of file system.h.

References libMesh::System::_matrices.

2536 {
2537  return _matrices.begin();
2538 }
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2277

◆ matrices_end() [1/2]

System::matrices_iterator libMesh::System::matrices_end ( )
inlineinherited

End of matrices container.

Definition at line 2541 of file system.h.

References libMesh::System::_matrices.

2542 {
2543  return _matrices.end();
2544 }
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2277

◆ matrices_end() [2/2]

System::const_matrices_iterator libMesh::System::matrices_end ( ) const
inlineinherited

End of matrices container.

Definition at line 2547 of file system.h.

References libMesh::System::_matrices.

2548 {
2549  return _matrices.end();
2550 }
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2277

◆ n_active_dofs()

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

Definition at line 2483 of file system.h.

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

2484 {
2485  return this->n_dofs() - this->n_constrained_dofs();
2486 }
dof_id_type n_dofs() const
Definition: system.C:118
dof_id_type n_constrained_dofs() const
Definition: system.C:125

◆ n_components()

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

Definition at line 2689 of file system.C.

References libMesh::System::get_dof_map(), libMesh::System::get_mesh(), and libMesh::DofMap::n_components().

2690 {
2691  return this->get_dof_map().n_components(this->get_mesh());
2692 }
unsigned int n_components(const MeshBase &mesh) const
Definition: dof_map.h:2963
const MeshBase & get_mesh() const
Definition: system.h:2401
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ n_constrained_dofs()

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

Definition at line 125 of file system.C.

References libMesh::System::_dof_map.

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

126 {
127 #ifdef LIBMESH_ENABLE_CONSTRAINTS
128 
129  return _dof_map->n_constrained_dofs();
130 
131 #else
132 
133  return 0;
134 
135 #endif
136 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2225

◆ n_dofs()

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

Definition at line 118 of file system.C.

References libMesh::System::_dof_map.

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

119 {
120  return _dof_map->n_dofs();
121 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2225

◆ n_linear_iterations()

unsigned int libMesh::LinearImplicitSystem::n_linear_iterations ( ) const
inlineinherited
Returns
The number of iterations taken for the most recent linear solve.

Definition at line 155 of file linear_implicit_system.h.

References libMesh::LinearImplicitSystem::_n_linear_iterations.

Referenced by compute_Fq_representor_innerprods(), compute_output_dual_innerprods(), main(), libMesh::TransientRBConstruction::update_residual_terms(), and update_residual_terms().

155 { return _n_linear_iterations; }
unsigned int _n_linear_iterations
The number of linear iterations required to solve the linear system Ax=b.

◆ n_local_constrained_dofs()

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

Definition at line 140 of file system.C.

References libMesh::System::_dof_map.

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

141 {
142 #ifdef LIBMESH_ENABLE_CONSTRAINTS
143 
144  return _dof_map->n_local_constrained_dofs();
145 
146 #else
147 
148  return 0;
149 
150 #endif
151 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2225

◆ n_local_dofs()

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

Definition at line 155 of file system.C.

References libMesh::System::_dof_map.

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

156 {
157  return _dof_map->n_local_dofs();
158 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2225

◆ n_matrices()

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

Definition at line 2638 of file system.h.

References libMesh::System::_matrices.

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

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

◆ n_objects() [1/2]

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

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

Definition at line 85 of file reference_counter.h.

References libMesh::ReferenceCounter::_n_objects.

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

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

◆ n_objects() [2/2]

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

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

Definition at line 85 of file reference_counter.h.

References libMesh::ReferenceCounter::_n_objects.

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

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

◆ n_processors()

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

Definition at line 103 of file parallel_object.h.

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

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

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

◆ n_qois()

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

Number of currently active quantities of interest.

Definition at line 2562 of file system.h.

References libMesh::System::_qoi, and libMesh::System::_qoi_error_estimates.

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

2563 {
2564  libmesh_assert_equal_to(this->_qoi.size(), this->_qoi_error_estimates.size());
2565 
2566  return cast_int<unsigned int>(this->_qoi.size());
2567 }
std::vector< Number > _qoi
Values of the quantities of interest.
Definition: system.h:2367
std::vector< Number > _qoi_error_estimates
Vector to hold error estimates for qois, either from a steady state calculation, or from a single uns...
Definition: system.h:2377

◆ n_variable_groups()

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

Definition at line 2694 of file system.C.

References libMesh::System::get_dof_map(), and libMesh::DofMap::n_variable_groups().

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

2695 {
2696  return this->get_dof_map().n_variable_groups();
2697 }
unsigned int n_variable_groups() const
Definition: dof_map.h:733
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ n_vars()

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

Definition at line 2669 of file system.C.

References libMesh::System::get_dof_map(), and libMesh::DofMap::n_vars().

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

2670 {
2671  return this->get_dof_map().n_vars();
2672 }
unsigned int n_vars() const
Definition: dof_map.h:2937
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ n_vectors()

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

Definition at line 2499 of file system.h.

References libMesh::System::_vectors.

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

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

◆ name()

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

◆ number()

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

Definition at line 2393 of file system.h.

References libMesh::System::_sys_number.

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

2394 {
2395  return _sys_number;
2396 }
const unsigned int _sys_number
The number associated with this system.
Definition: system.h:2247

◆ operator=() [1/2]

RBConstruction& libMesh::RBConstruction::operator= ( const RBConstruction )
delete

◆ operator=() [2/2]

RBConstruction& libMesh::RBConstruction::operator= ( RBConstruction &&  )
delete

◆ point_gradient() [1/4]

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

Definition at line 2343 of file system.C.

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

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

2347 {
2348  // This function must be called on every processor; there's no
2349  // telling where in the partition p falls.
2350  parallel_object_only();
2351 
2352  // And every processor had better agree about which point we're
2353  // looking for
2354 #ifndef NDEBUG
2355  libmesh_assert(this->comm().verify(p(0)));
2356 #if LIBMESH_DIM > 1
2357  libmesh_assert(this->comm().verify(p(1)));
2358 #endif
2359 #if LIBMESH_DIM > 2
2360  libmesh_assert(this->comm().verify(p(2)));
2361 #endif
2362 #endif // NDEBUG
2363 
2364  // Get a reference to the mesh object associated with the system object that calls this function
2365  const MeshBase & mesh = this->get_mesh();
2366 
2367  // Use an existing PointLocator or create a new one
2368  std::unique_ptr<PointLocatorBase> locator_ptr = mesh.sub_point_locator();
2369  PointLocatorBase & locator = *locator_ptr;
2370 
2371  if (!insist_on_success || !mesh.is_serial())
2372  locator.enable_out_of_mesh_mode();
2373 
2374  // Get a pointer to an element that contains p and allows us to
2375  // evaluate var
2376  const std::set<subdomain_id_type> & raw_subdomains =
2377  this->variable(var).active_subdomains();
2378  const std::set<subdomain_id_type> * implicit_subdomains =
2379  raw_subdomains.empty() ? nullptr : &raw_subdomains;
2380  const Elem * e = locator(p, implicit_subdomains);
2381 
2382  Gradient grad_u;
2383 
2384  if (e && this->get_dof_map().is_evaluable(*e, var))
2385  grad_u = point_gradient(var, p, *e, sol);
2386 
2387  // If I have an element containing p, then let's let everyone know
2388  processor_id_type lowest_owner =
2389  (e && (e->processor_id() == this->processor_id())) ?
2390  this->processor_id() : this->n_processors();
2391  this->comm().min(lowest_owner);
2392 
2393  // Everybody should get their value from a processor that was able
2394  // to compute it.
2395  // If nobody admits owning the point, we may have a problem.
2396  if (lowest_owner != this->n_processors())
2397  this->comm().broadcast(grad_u, lowest_owner);
2398  else
2399  libmesh_assert(!insist_on_success);
2400 
2401  return grad_u;
2402 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.C:2699
Gradient point_gradient(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition: system.C:2343
MeshBase & mesh
const Parallel::Communicator & comm() const
const MeshBase & get_mesh() const
Definition: system.h:2401
uint8_t processor_id_type
processor_id_type n_processors() const
const std::set< subdomain_id_type > & active_subdomains() const
Definition: variable.h:181
void min(const T &r, T &o, Request &req) const
NumberVectorValue Gradient
libmesh_assert(ctx)
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
processor_id_type processor_id() const
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ point_gradient() [2/4]

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

Definition at line 2405 of file system.C.

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

2409 {
2410  // Ensuring that the given point is really in the element is an
2411  // expensive assert, but as long as debugging is turned on we might
2412  // as well try to catch a particularly nasty potential error
2413  libmesh_assert (e.contains_point(p));
2414 
2415  if (!sol)
2416  sol = this->current_local_solution.get();
2417 
2418  // Get the dof map to get the proper indices for our computation
2419  const DofMap & dof_map = this->get_dof_map();
2420 
2421  // write the element dimension into a separate variable.
2422  const unsigned int dim = e.dim();
2423 
2424  // Make sure we can evaluate on this element.
2425  libmesh_assert (dof_map.is_evaluable(e, var));
2426 
2427  // Need dof_indices for phi[i][j]
2428  std::vector<dof_id_type> dof_indices;
2429 
2430  // Fill in the dof_indices for our element
2431  dof_map.dof_indices (&e, dof_indices, var);
2432 
2433  // Get the no of dofs associated with this point
2434  const unsigned int num_dofs = cast_int<unsigned int>
2435  (dof_indices.size());
2436 
2437  FEType fe_type = dof_map.variable_type(var);
2438 
2439  // Map the physical co-ordinates to the master co-ordinates
2440  Point coor = FEMap::inverse_map(dim, &e, p);
2441 
2442  // get the shape function value via the FEInterface to also handle the case
2443  // of infinite elements correctly, the shape function is not fe->phi().
2444  FEComputeData fe_data(this->get_equation_systems(), coor);
2445  fe_data.enable_derivative();
2446  FEInterface::compute_data(dim, fe_type, &e, fe_data);
2447 
2448  // Get ready to accumulate a gradient
2449  Gradient grad_u;
2450 
2451  for (unsigned int l=0; l<num_dofs; l++)
2452  {
2453  // Chartesian coordinates have always LIBMESH_DIM entries,
2454  // local coordinates have as many coordinates as the element has.
2455  for (std::size_t v=0; v<dim; v++)
2456  for (std::size_t xyz=0; xyz<LIBMESH_DIM; xyz++)
2457  {
2458  // FIXME: this needs better syntax: It is matrix-vector multiplication.
2459  grad_u(xyz) += fe_data.local_transform[v][xyz]
2460  * fe_data.dshape[l](v)
2461  * (*sol)(dof_indices[l]);
2462  }
2463  }
2464 
2465  return grad_u;
2466 }
unsigned int dim
static Point inverse_map(const unsigned int dim, const Elem *elem, const Point &p, const Real tolerance=TOLERANCE, const bool secure=true, const bool extra_checks=true)
Definition: fe_map.C:1512
const EquationSystems & get_equation_systems() const
Definition: system.h:767
static void compute_data(const unsigned int dim, const FEType &fe_t, const Elem *elem, FEComputeData &data)
Lets the appropriate child of FEBase compute the requested data for the input specified in data...
NumberVectorValue Gradient
libmesh_assert(ctx)
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1667
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ point_gradient() [3/4]

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

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

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

Definition at line 2470 of file system.C.

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

2471 {
2472  libmesh_assert(e);
2473  return this->point_gradient(var, p, *e);
2474 }
Gradient point_gradient(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition: system.C:2343
libmesh_assert(ctx)

◆ point_gradient() [4/4]

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

Calls the parallel version of point_gradient().

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

Definition at line 2478 of file system.C.

References libMesh::System::point_gradient().

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

◆ point_hessian() [1/4]

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

Definition at line 2487 of file system.C.

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

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

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

◆ point_hessian() [2/4]

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

Definition at line 2548 of file system.C.

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

2552 {
2553  // Ensuring that the given point is really in the element is an
2554  // expensive assert, but as long as debugging is turned on we might
2555  // as well try to catch a particularly nasty potential error
2556  libmesh_assert (e.contains_point(p));
2557 
2558  if (!sol)
2559  sol = this->current_local_solution.get();
2560 
2561  if (e.infinite())
2562  libmesh_not_implemented();
2563 
2564  // Get the dof map to get the proper indices for our computation
2565  const DofMap & dof_map = this->get_dof_map();
2566 
2567  // Make sure we can evaluate on this element.
2568  libmesh_assert (dof_map.is_evaluable(e, var));
2569 
2570  // Need dof_indices for phi[i][j]
2571  std::vector<dof_id_type> dof_indices;
2572 
2573  // Fill in the dof_indices for our element
2574  dof_map.dof_indices (&e, dof_indices, var);
2575 
2576  // Get the no of dofs associated with this point
2577  const unsigned int num_dofs = cast_int<unsigned int>
2578  (dof_indices.size());
2579 
2580  FEType fe_type = dof_map.variable_type(var);
2581 
2582  // Build a FE again so we can calculate u(p)
2583  std::unique_ptr<FEBase> fe (FEBase::build(e.dim(), fe_type));
2584 
2585  // Map the physical co-ordinates to the master co-ordinates
2586  // Build a vector of point co-ordinates to send to reinit
2587  std::vector<Point> coor(1, FEMap::inverse_map(e.dim(), &e, p));
2588 
2589  // Get the values of the shape function derivatives
2590  const std::vector<std::vector<RealTensor>> & d2phi = fe->get_d2phi();
2591 
2592  // Reinitialize the element and compute the shape function values at coor
2593  fe->reinit (&e, &coor);
2594 
2595  // Get ready to accumulate a hessian
2596  Tensor hess_u;
2597 
2598  for (unsigned int l=0; l<num_dofs; l++)
2599  {
2600  hess_u.add_scaled (d2phi[l][0], (*sol)(dof_indices[l]));
2601  }
2602 
2603  return hess_u;
2604 }
static Point inverse_map(const unsigned int dim, const Elem *elem, const Point &p, const Real tolerance=TOLERANCE, const bool secure=true, const bool extra_checks=true)
Definition: fe_map.C:1512
static std::unique_ptr< FEGenericBase > build(const unsigned int dim, const FEType &type)
Builds a specific finite element type.
libmesh_assert(ctx)
void add_scaled(const TypeTensor< T2 > &, const T &)
Add a scaled tensor to this tensor without creating a temporary.
Definition: type_tensor.h:858
NumberTensorValue Tensor
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1667
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ point_hessian() [3/4]

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

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

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

Definition at line 2608 of file system.C.

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

2609 {
2610  libmesh_assert(e);
2611  return this->point_hessian(var, p, *e);
2612 }
libmesh_assert(ctx)
Tensor point_hessian(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition: system.C:2487

◆ point_hessian() [4/4]

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

Calls the parallel version of point_hessian().

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

Definition at line 2616 of file system.C.

References libMesh::System::point_hessian().

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

◆ point_value() [1/4]

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

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

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

Definition at line 2214 of file system.C.

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

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

2218 {
2219  // This function must be called on every processor; there's no
2220  // telling where in the partition p falls.
2221  parallel_object_only();
2222 
2223  // And every processor had better agree about which point we're
2224  // looking for
2225 #ifndef NDEBUG
2226  libmesh_assert(this->comm().verify(p(0)));
2227 #if LIBMESH_DIM > 1
2228  libmesh_assert(this->comm().verify(p(1)));
2229 #endif
2230 #if LIBMESH_DIM > 2
2231  libmesh_assert(this->comm().verify(p(2)));
2232 #endif
2233 #endif // NDEBUG
2234 
2235  // Get a reference to the mesh object associated with the system object that calls this function
2236  const MeshBase & mesh = this->get_mesh();
2237 
2238  // Use an existing PointLocator or create a new one
2239  std::unique_ptr<PointLocatorBase> locator_ptr = mesh.sub_point_locator();
2240  PointLocatorBase & locator = *locator_ptr;
2241 
2242  if (!insist_on_success || !mesh.is_serial())
2243  locator.enable_out_of_mesh_mode();
2244 
2245  // Get a pointer to an element that contains p and allows us to
2246  // evaluate var
2247  const std::set<subdomain_id_type> & raw_subdomains =
2248  this->variable(var).active_subdomains();
2249  const std::set<subdomain_id_type> * implicit_subdomains =
2250  raw_subdomains.empty() ? nullptr : &raw_subdomains;
2251  const Elem * e = locator(p, implicit_subdomains);
2252 
2253  Number u = 0;
2254 
2255  if (e && this->get_dof_map().is_evaluable(*e, var))
2256  u = point_value(var, p, *e, sol);
2257 
2258  // If I have an element containing p, then let's let everyone know
2259  processor_id_type lowest_owner =
2260  (e && (e->processor_id() == this->processor_id())) ?
2261  this->processor_id() : this->n_processors();
2262  this->comm().min(lowest_owner);
2263 
2264  // Everybody should get their value from a processor that was able
2265  // to compute it.
2266  // If nobody admits owning the point, we have a problem.
2267  if (lowest_owner != this->n_processors())
2268  this->comm().broadcast(u, lowest_owner);
2269  else
2270  libmesh_assert(!insist_on_success);
2271 
2272  return u;
2273 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.C:2699
MeshBase & mesh
Number point_value(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition: system.C:2214
const Parallel::Communicator & comm() const
const MeshBase & get_mesh() const
Definition: system.h:2401
uint8_t processor_id_type
processor_id_type n_processors() const
const std::set< subdomain_id_type > & active_subdomains() const
Definition: variable.h:181
void min(const T &r, T &o, Request &req) const
libmesh_assert(ctx)
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
processor_id_type processor_id() const
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ point_value() [2/4]

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

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

Definition at line 2275 of file system.C.

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

2279 {
2280  // Ensuring that the given point is really in the element is an
2281  // expensive assert, but as long as debugging is turned on we might
2282  // as well try to catch a particularly nasty potential error
2283  libmesh_assert (e.contains_point(p));
2284 
2285  if (!sol)
2286  sol = this->current_local_solution.get();
2287 
2288  // Get the dof map to get the proper indices for our computation
2289  const DofMap & dof_map = this->get_dof_map();
2290 
2291  // Make sure we can evaluate on this element.
2292  libmesh_assert (dof_map.is_evaluable(e, var));
2293 
2294  // Need dof_indices for phi[i][j]
2295  std::vector<dof_id_type> dof_indices;
2296 
2297  // Fill in the dof_indices for our element
2298  dof_map.dof_indices (&e, dof_indices, var);
2299 
2300  // Get the no of dofs associated with this point
2301  const unsigned int num_dofs = cast_int<unsigned int>
2302  (dof_indices.size());
2303 
2304  FEType fe_type = dof_map.variable_type(var);
2305 
2306  // Map the physical co-ordinates to the master co-ordinates
2307  Point coor = FEMap::inverse_map(e.dim(), &e, p);
2308 
2309  // get the shape function value via the FEInterface to also handle the case
2310  // of infinite elements correctly, the shape function is not fe->phi().
2311  FEComputeData fe_data(this->get_equation_systems(), coor);
2312  FEInterface::compute_data(e.dim(), fe_type, &e, fe_data);
2313 
2314  // Get ready to accumulate a value
2315  Number u = 0;
2316 
2317  for (unsigned int l=0; l<num_dofs; l++)
2318  {
2319  u += fe_data.shape[l] * (*sol)(dof_indices[l]);
2320  }
2321 
2322  return u;
2323 }
static Point inverse_map(const unsigned int dim, const Elem *elem, const Point &p, const Real tolerance=TOLERANCE, const bool secure=true, const bool extra_checks=true)
Definition: fe_map.C:1512
const EquationSystems & get_equation_systems() const
Definition: system.h:767
static void compute_data(const unsigned int dim, const FEType &fe_t, const Elem *elem, FEComputeData &data)
Lets the appropriate child of FEBase compute the requested data for the input specified in data...
libmesh_assert(ctx)
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1667
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ point_value() [3/4]

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

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

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

Definition at line 2327 of file system.C.

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

2328 {
2329  libmesh_assert(e);
2330  return this->point_value(var, p, *e);
2331 }
Number point_value(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition: system.C:2214
libmesh_assert(ctx)

◆ point_value() [4/4]

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

Calls the parallel version of point_value().

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

Definition at line 2335 of file system.C.

References libMesh::System::point_value().

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

◆ post_process_elem_matrix_and_vector()

virtual void libMesh::RBConstruction::post_process_elem_matrix_and_vector ( DGFEMContext )
inlineprotectedvirtual

This function is called from add_scaled_matrix_and_vector() before each element matrix and vector are assembled into their global counterparts.

By default it is a no-op, but it could be used to apply any user-defined transformations immediately prior to assembly. We use DGFEMContext since it allows for both DG and continuous Galerkin formulations.

Definition at line 724 of file rb_construction.h.

Referenced by add_scaled_matrix_and_vector().

724 {}

◆ post_process_truth_solution()

virtual void libMesh::RBConstruction::post_process_truth_solution ( )
inlineprotectedvirtual

Similarly, provide an opportunity to post-process the truth solution after the solve is complete.

By default this is a no-op, but it could be used to apply any required user-defined post processing to the solution vector. Note: the truth solution is stored in the "solution" member of this class, which is inherited from the parent System class several levels up.

Definition at line 734 of file rb_construction.h.

Referenced by enrich_basis_from_rhs_terms(), and truth_solve().

734 {}

◆ preevaluate_thetas()

void libMesh::RBConstruction::preevaluate_thetas ( )
protectedvirtual

Definition at line 2787 of file rb_construction.C.

References _evaluated_thetas, _preevaluate_thetas_completed, libMesh::RBConstructionBase< LinearImplicitSystem >::get_first_local_training_index(), libMesh::RBConstructionBase< LinearImplicitSystem >::get_local_n_training_samples(), libMesh::RBThetaExpansion::get_n_A_terms(), libMesh::RBParametrized::get_parameters(), get_rb_evaluation(), libMesh::RBEvaluation::get_rb_theta_expansion(), libMesh::index_range(), libMesh::make_range(), and libMesh::RBConstructionBase< LinearImplicitSystem >::set_params_from_training_set().

Referenced by train_reduced_basis_with_greedy().

2788 {
2789  LOG_SCOPE("preevaluate_thetas()", "RBConstruction");
2790 
2792 
2793  // Early return if we've already preevaluated thetas.
2795  return;
2796 
2797  if ( get_local_n_training_samples() == 0 )
2798  return;
2799 
2800  auto & rb_theta_expansion = get_rb_evaluation().get_rb_theta_expansion();
2801  const unsigned int n_A_terms = rb_theta_expansion.get_n_A_terms();
2802  const unsigned int n_F_terms = rb_theta_expansion.get_n_F_terms();
2803  const unsigned int n_outputs = rb_theta_expansion.get_total_n_output_terms();
2804 
2805  // Collect all training parameters
2806  // TODO: Here instead of using a vector of RBParameters objects,
2807  // we could use a single RBParameters object with multiple samples.
2808  // This would save memory over the current approach, but that may
2809  // not be a big deal in practice unless the number of training samples
2810  // is very large for some reason.
2811  std::vector<RBParameters> mus(get_local_n_training_samples());
2812  const numeric_index_type first_index = get_first_local_training_index();
2813  for (unsigned int i=0; i<get_local_n_training_samples(); i++)
2814  {
2815  // Load training parameter i, this is only loaded
2816  // locally since the RB solves are local.
2817  set_params_from_training_set( first_index+i );
2818  mus[i] = get_parameters();
2819  _evaluated_thetas[i].resize(n_A_terms + n_F_terms + n_outputs);
2820  }
2821 
2822  // Evaluate thetas for all training parameters simultaneously
2823  for (unsigned int q_a=0; q_a<n_A_terms; q_a++)
2824  {
2825  const auto A_vals = rb_theta_expansion.eval_A_theta(q_a, mus);
2826  for (auto i : make_range(get_local_n_training_samples()))
2827  _evaluated_thetas[i][q_a] = A_vals[i];
2828  }
2829 
2830  for (unsigned int q_f=0; q_f<n_F_terms; q_f++)
2831  {
2832  const auto F_vals = rb_theta_expansion.eval_F_theta(q_f, mus);
2833  for (auto i : make_range(get_local_n_training_samples()))
2834  _evaluated_thetas[i][n_A_terms + q_f] = F_vals[i];
2835  }
2836 
2837  {
2838  unsigned int output_counter = 0;
2839  for (unsigned int n=0; n<rb_theta_expansion.get_n_outputs(); n++)
2840  for (unsigned int q_l=0; q_l<rb_theta_expansion.get_n_output_terms(n); q_l++)
2841  {
2842  // Evaluate the current output functional term for all
2843  // training parameters simultaneously.
2844  const auto output_vals = rb_theta_expansion.eval_output_theta(n, q_l, mus);
2845 
2846  // TODO: the size of _evaluated_thetas is currently assumed to be
2847  // the same as get_local_n_training_samples(), but this won't be
2848  // the case if we use RBParameters objects that have multiple samples.
2849  // So just make sure that's the case for now.
2850  libmesh_error_msg_if(output_vals.size() != get_local_n_training_samples(),
2851  "We currently only support single-sample RBParameters "
2852  "objects during the training stage.");
2853 
2854  for (auto i : index_range(output_vals))
2855  _evaluated_thetas[i][n_A_terms + n_F_terms + output_counter] = output_vals[i];
2856 
2857  // Go to next output term
2858  output_counter++;
2859  }
2860  }
2861 
2863 }
numeric_index_type get_first_local_training_index() const
Get the first local index of the training parameters.
std::vector< std::vector< Number > > _evaluated_thetas
Storage of evaluated theta functions at a set of parameters.
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form.
dof_id_type numeric_index_type
Definition: id_types.h:99
numeric_index_type get_local_n_training_samples() const
Get the total number of training samples local to this processor.
const RBParameters & get_parameters() const
Get the current parameters.
void set_params_from_training_set(unsigned int global_index)
Set parameters to the RBParameters stored in index global_index of the global training set...
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:150
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the rb_theta_expansion.
Definition: rb_evaluation.C:85
bool _preevaluate_thetas_completed
Flag to indicate if the preevaluate_thetas function has been called, since this allows us to avoid ca...

◆ prefer_hash_table_matrix_assembly()

void libMesh::System::prefer_hash_table_matrix_assembly ( bool  preference)
inlineinherited

Sets whether to use hash table matrix assembly if the matrix sub-classes support it.

Definition at line 2667 of file system.h.

References libMesh::System::_matrices_initialized, and libMesh::System::_prefer_hash_table_matrix_assembly.

Referenced by main().

2668 {
2669  libmesh_error_msg_if(
2671  "System::prefer_hash_table_matrix_assembly() should be called before matrices are initialized");
2673 }
bool _prefer_hash_table_matrix_assembly
Whether to use hash table matrix assembly if the matrix sub-classes support it.
Definition: system.h:2348
bool _matrices_initialized
false when additional matrices being added require initialization, true otherwise.
Definition: system.h:2287

◆ prefix()

std::string libMesh::System::prefix ( ) const
inlineinherited
Returns
A prefix that may be applied to solver options. Note that this prefix is only used if prefix_with_name()

Definition at line 1980 of file system.h.

References libMesh::System::name().

Referenced by libMesh::ImplicitSystem::get_linear_solver(), libMesh::LinearImplicitSystem::solve(), and libMesh::NonlinearImplicitSystem::solve().

1980 { return this->name() + "_"; }
const std::string & name() const
Definition: system.h:2385

◆ prefix_with_name() [1/2]

void libMesh::System::prefix_with_name ( bool  value)
inlineinherited

Instructs this system to prefix solve options with its name for solvers that leverage prefixes.

Definition at line 1969 of file system.h.

References libMesh::System::_prefix_with_name, and value.

1969 { _prefix_with_name = value; }
static const bool value
Definition: xdr_io.C:55
bool _prefix_with_name
Whether we are name prefixing solver options.
Definition: system.h:2358

◆ prefix_with_name() [2/2]

bool libMesh::System::prefix_with_name ( ) const
inlineinherited
Returns
Whether we are name prefixing

Definition at line 1974 of file system.h.

References libMesh::System::_prefix_with_name.

Referenced by libMesh::ContinuationSystem::ContinuationSystem(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::LinearImplicitSystem::solve(), libMesh::NonlinearImplicitSystem::solve(), and libMesh::System::System().

1974 { return _prefix_with_name; }
bool _prefix_with_name
Whether we are name prefixing solver options.
Definition: system.h:2358

◆ print_basis_function_orthogonality()

void libMesh::RBConstruction::print_basis_function_orthogonality ( ) const

Print out a matrix that shows the orthogonality of the RB basis functions.

This is a helpful debugging tool, e.g. orthogonality can be degraded due to finite precision arithmetic.

Definition at line 391 of file rb_construction.C.

References libMesh::RBEvaluation::get_n_basis_functions(), get_non_dirichlet_inner_product_matrix_if_avail(), get_rb_evaluation(), libMesh::out, libMesh::System::solution, value, and libMesh::SparseMatrix< T >::vector_mult().

Referenced by main().

392 {
393  std::unique_ptr<NumericVector<Number>> temp = solution->clone();
394 
395  for (unsigned int i=0; i<get_rb_evaluation().get_n_basis_functions(); i++)
396  {
397  for (unsigned int j=0; j<get_rb_evaluation().get_n_basis_functions(); j++)
398  {
400  Number value = temp->dot( get_rb_evaluation().get_basis_function(i) );
401 
402  libMesh::out << value << " ";
403  }
404  libMesh::out << std::endl;
405  }
406  libMesh::out << std::endl;
407 }
void vector_mult(NumericVector< T > &dest, const NumericVector< T > &arg) const
Multiplies the matrix by the NumericVector arg and stores the result in NumericVector dest...
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
OStreamProxy out
virtual unsigned int get_n_basis_functions() const
Get the current number of basis functions.
SparseMatrix< Number > * get_non_dirichlet_inner_product_matrix_if_avail()
Get the non-Dirichlet inner-product matrix if it&#39;s available, otherwise get the inner-product matrix ...
static const bool value
Definition: xdr_io.C:55
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.

◆ print_discrete_parameter_values()

void libMesh::RBParametrized::print_discrete_parameter_values ( ) const
inherited

Print out all the discrete parameter values.

Definition at line 366 of file rb_parametrized.C.

References libMesh::RBParametrized::get_discrete_parameter_values(), libMesh::Quality::name(), libMesh::out, and value.

Referenced by libMesh::RBSCMConstruction::print_info(), libMesh::RBEIMConstruction::print_info(), and print_info().

367 {
368  for (const auto & [name, values] : get_discrete_parameter_values())
369  {
370  libMesh::out << "Discrete parameter " << name << ", values: ";
371 
372  for (const auto & value : values)
373  libMesh::out << value << " ";
374  libMesh::out << std::endl;
375  }
376 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
const std::map< std::string, std::vector< Real > > & get_discrete_parameter_values() const
Get a const reference to the discrete parameter values.
OStreamProxy out
static const bool value
Definition: xdr_io.C:55

◆ print_info() [1/3]

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

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

Definition at line 81 of file reference_counter.C.

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

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

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

◆ print_info() [2/3]

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

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

Definition at line 81 of file reference_counter.C.

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

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

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

◆ print_info() [3/3]

void libMesh::RBConstruction::print_info ( ) const
virtual

Print out info that describes the current setup of this RBConstruction.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 354 of file rb_construction.C.

References get_abs_training_tolerance(), libMesh::RBThetaExpansion::get_n_A_terms(), libMesh::RBThetaExpansion::get_n_F_terms(), libMesh::RBThetaExpansion::get_n_output_terms(), libMesh::RBThetaExpansion::get_n_outputs(), libMesh::RBParametrized::get_n_params(), libMesh::RBConstructionBase< LinearImplicitSystem >::get_n_training_samples(), get_normalize_rb_bound_in_greedy(), libMesh::RBParametrized::get_parameter_max(), libMesh::RBParametrized::get_parameter_min(), libMesh::RBParametrized::get_parameters(), get_rb_theta_expansion(), get_RB_training_type(), get_rel_training_tolerance(), libMesh::RBParametrized::is_discrete_parameter(), libMesh::RBConstructionBase< LinearImplicitSystem >::is_quiet(), is_rb_eval_initialized(), libMesh::System::name(), Nmax, libMesh::out, and libMesh::RBParametrized::print_discrete_parameter_values().

Referenced by main(), and libMesh::TransientRBConstruction::print_info().

355 {
356  // Print out info that describes the current setup
357  libMesh::out << std::endl << "RBConstruction parameters:" << std::endl;
358  libMesh::out << "system name: " << this->name() << std::endl;
359  libMesh::out << "Nmax: " << Nmax << std::endl;
360  libMesh::out << "Greedy relative error tolerance: " << get_rel_training_tolerance() << std::endl;
361  libMesh::out << "Greedy absolute error tolerance: " << get_abs_training_tolerance() << std::endl;
362  libMesh::out << "Do we normalize RB error bound in greedy? " << get_normalize_rb_bound_in_greedy() << std::endl;
363  libMesh::out << "RB training type: " << get_RB_training_type() << std::endl;
365  {
366  libMesh::out << "Aq operators attached: " << get_rb_theta_expansion().get_n_A_terms() << std::endl;
367  libMesh::out << "Fq functions attached: " << get_rb_theta_expansion().get_n_F_terms() << std::endl;
368  libMesh::out << "n_outputs: " << get_rb_theta_expansion().get_n_outputs() << std::endl;
369  for (unsigned int n=0; n<get_rb_theta_expansion().get_n_outputs(); n++)
370  libMesh::out << "output " << n << ", Q_l = " << get_rb_theta_expansion().get_n_output_terms(n) << std::endl;
371  }
372  else
373  {
374  libMesh::out << "RBThetaExpansion member is not set yet" << std::endl;
375  }
376  libMesh::out << "Number of parameters: " << get_n_params() << std::endl;
377  for (const auto & pr : get_parameters())
378  if (!is_discrete_parameter(pr.first))
379  {
380  libMesh::out << "Parameter " << pr.first
381  << ": Min = " << get_parameter_min(pr.first)
382  << ", Max = " << get_parameter_max(pr.first) << std::endl;
383  }
384 
386  libMesh::out << "n_training_samples: " << get_n_training_samples() << std::endl;
387  libMesh::out << "quiet mode? " << is_quiet() << std::endl;
388  libMesh::out << std::endl;
389 }
bool get_normalize_rb_bound_in_greedy() const
unsigned int get_n_F_terms() const
Get Q_f, the number of terms in the affine expansion for the right-hand side.
Real get_parameter_min(const std::string &param_name) const
Get minimum allowable value of parameter param_name.
Real get_parameter_max(const std::string &param_name) const
Get maximum allowable value of parameter param_name.
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form.
bool is_quiet() const
Is the system in quiet mode?
const std::string & get_RB_training_type() const
unsigned int get_n_outputs() const
Get n_outputs, the number output functionals.
Real get_rel_training_tolerance() const
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
Real get_abs_training_tolerance() const
const RBParameters & get_parameters() const
Get the current parameters.
bool is_rb_eval_initialized() const
numeric_index_type get_n_training_samples() const
Get the number of global training samples.
unsigned int get_n_output_terms(unsigned int output_index) const
Get the number of affine terms associated with the specified output.
OStreamProxy out
const std::string & name() const
Definition: system.h:2385
unsigned int get_n_params() const
Get the number of parameters.
bool is_discrete_parameter(const std::string &mu_name) const
Is parameter mu_name discrete?
unsigned int Nmax
Maximum number of reduced basis functions we are willing to use.
void print_discrete_parameter_values() const
Print out all the discrete parameter values.

◆ print_parameters()

void libMesh::RBParametrized::print_parameters ( ) const
inherited

Print the current parameters.

Definition at line 178 of file rb_parametrized.C.

References libMesh::RBParametrized::get_parameters(), libMesh::RBParametrized::parameters_initialized, and libMesh::RBParameters::print().

Referenced by libMesh::RBEIMConstruction::train_eim_approximation_with_greedy(), and train_reduced_basis_with_greedy().

179 {
180  libmesh_error_msg_if(!parameters_initialized, "Error: parameters not initialized in RBParametrized::print_current_parameters");
181 
182  get_parameters().print();
183 }
bool parameters_initialized
Flag indicating whether the parameters have been initialized.
void print(unsigned precision=6, int max_values=5) const
Print the parameters.
const RBParameters & get_parameters() const
Get the current parameters.

◆ process_parameters_file()

void libMesh::RBConstruction::process_parameters_file ( const std::string &  parameters_filename)
virtual

Read in from the file specified by parameters_filename and set the this system's member variables accordingly.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 208 of file rb_construction.C.

References abs_training_tolerance, libMesh::make_range(), Nmax, libMesh::RBConstructionBase< LinearImplicitSystem >::quiet_mode, libMesh::Real, rel_training_tolerance, set_rb_construction_parameters(), and libMesh::RBParameters::set_value().

Referenced by main(), and libMesh::TransientRBConstruction::process_parameters_file().

209 {
210  // First read in data from input_filename
211  GetPot infile(parameters_filename);
212 
213  const unsigned int n_training_samples = infile("n_training_samples",0);
214  const bool deterministic_training = infile("deterministic_training",false);
215  unsigned int training_parameters_random_seed_in =
216  static_cast<unsigned int>(-1);
217  training_parameters_random_seed_in = infile("training_parameters_random_seed",
218  training_parameters_random_seed_in);
219  const bool quiet_mode_in = infile("quiet_mode", quiet_mode);
220  const unsigned int Nmax_in = infile("Nmax", Nmax);
221  const Real rel_training_tolerance_in = infile("rel_training_tolerance",
223  const Real abs_training_tolerance_in = infile("abs_training_tolerance",
225 
226  // Initialize value to false, let the input file value override.
227  const bool normalize_rb_bound_in_greedy_in = infile("normalize_rb_bound_in_greedy",
228  false);
229 
230  const std::string RB_training_type_in = infile("RB_training_type", "Greedy");
231 
232  // Read in the parameters from the input file too
233  unsigned int n_continuous_parameters = infile.vector_variable_size("parameter_names");
234  RBParameters mu_min_in;
235  RBParameters mu_max_in;
236  for (unsigned int i=0; i<n_continuous_parameters; i++)
237  {
238  // Read in the parameter names
239  std::string param_name = infile("parameter_names", "NONE", i);
240 
241  {
242  Real min_val = infile(param_name, 0., 0);
243  mu_min_in.set_value(param_name, min_val);
244  }
245 
246  {
247  Real max_val = infile(param_name, 0., 1);
248  mu_max_in.set_value(param_name, max_val);
249  }
250  }
251 
252  std::map<std::string, std::vector<Real>> discrete_parameter_values_in;
253 
254  unsigned int n_discrete_parameters = infile.vector_variable_size("discrete_parameter_names");
255  for (unsigned int i=0; i<n_discrete_parameters; i++)
256  {
257  std::string param_name = infile("discrete_parameter_names", "NONE", i);
258 
259  unsigned int n_vals_for_param = infile.vector_variable_size(param_name);
260  std::vector<Real> vals_for_param(n_vals_for_param);
261  for (auto j : make_range(vals_for_param.size()))
262  vals_for_param[j] = infile(param_name, 0., j);
263 
264  discrete_parameter_values_in[param_name] = vals_for_param;
265  }
266 
267  std::map<std::string,bool> log_scaling_in;
268  // For now, just set all entries to false.
269  // TODO: Implement a decent way to specify log-scaling true/false
270  // in the input text file
271  for (const auto & pr : mu_min_in)
272  log_scaling_in[pr.first] = false;
273 
274  // Set the parameters that have been read in
275  set_rb_construction_parameters(n_training_samples,
276  deterministic_training,
277  static_cast<int>(training_parameters_random_seed_in),
278  quiet_mode_in,
279  Nmax_in,
280  rel_training_tolerance_in,
281  abs_training_tolerance_in,
282  normalize_rb_bound_in_greedy_in,
283  RB_training_type_in,
284  mu_min_in,
285  mu_max_in,
286  discrete_parameter_values_in,
287  log_scaling_in);
288 }
bool quiet_mode
Flag to indicate whether we print out extra information during the Offline stage. ...
void set_rb_construction_parameters(unsigned int n_training_samples_in, bool deterministic_training_in, int training_parameters_random_seed_in, bool quiet_mode_in, unsigned int Nmax_in, Real rel_training_tolerance_in, Real abs_training_tolerance_in, bool normalize_rb_error_bound_in_greedy_in, const std::string &RB_training_type_in, const RBParameters &mu_min_in, const RBParameters &mu_max_in, const std::map< std::string, std::vector< Real >> &discrete_parameter_values_in, const std::map< std::string, bool > &log_scaling, std::map< std::string, std::vector< RBParameter >> *training_sample_list=nullptr)
Set the state of this RBConstruction object based on the arguments to this function.
Real rel_training_tolerance
Relative and absolute tolerances for training reduced basis using the Greedy scheme.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
unsigned int Nmax
Maximum number of reduced basis functions we are willing to use.

◆ processor_id()

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

Definition at line 114 of file parallel_object.h.

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

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

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

◆ project_solution() [1/3]

void libMesh::System::project_solution ( FunctionBase< Number > *  f,
FunctionBase< Gradient > *  g = nullptr,
std::optional< ConstElemRange active_local_range = std::nullopt,
std::optional< std::vector< unsigned int >>  variable_numbers = std::nullopt 
) const
inherited

Projects arbitrary functions onto the current solution.

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

The function value f and its gradient g are user-provided cloneable functors. A gradient g is only required/used for projecting onto finite element spaces with continuous derivatives. elem_range active_local_range, if provided, indicates the range of elements over which to perform the projection. variable_numbers variable_numbers, if provided, indicates the variable numbers onto which to project.

Definition at line 1064 of file system_projection.C.

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

1068 {
1069  this->project_vector(*solution, f, g, /*is_adjoint=*/-1, active_local_range, variable_numbers);
1070 
1071  solution->localize(*current_local_solution, _dof_map->get_send_list());
1072 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2225
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1667
void project_vector(NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1, std::optional< ConstElemRange > active_local_range=std::nullopt, std::optional< std::vector< unsigned int >> variable_numbers=std::nullopt) const
Projects arbitrary functions onto a vector of degree of freedom values for the current system...

◆ project_solution() [2/3]

void libMesh::System::project_solution ( FEMFunctionBase< Number > *  f,
FEMFunctionBase< Gradient > *  g = nullptr,
std::optional< ConstElemRange active_local_range = std::nullopt,
std::optional< std::vector< unsigned int >>  variable_numbers = std::nullopt 
) const
inherited

Projects arbitrary functions onto the current solution.

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

The function value f and its gradient g are user-provided cloneable functors. A gradient g is only required/used for projecting onto finite element spaces with continuous derivatives. elem_range active_local_range, if provided, indicates the range of elements over which to perform the projection. variable_numbers variable_numbers, if provided, indicates the variable numbers onto which to project.

Definition at line 1079 of file system_projection.C.

1083 {
1084  this->project_vector(*solution, f, g, /*is_adjoint=*/-1, active_local_range, variable_numbers);
1085 
1086  solution->localize(*current_local_solution, _dof_map->get_send_list());
1087 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2225
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1667
void project_vector(NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1, std::optional< ConstElemRange > active_local_range=std::nullopt, std::optional< std::vector< unsigned int >> variable_numbers=std::nullopt) const
Projects arbitrary functions onto a vector of degree of freedom values for the current system...

◆ project_solution() [3/3]

void libMesh::System::project_solution ( ValueFunctionPointer  fptr,
GradientFunctionPointer  gptr,
const Parameters parameters,
std::optional< ConstElemRange active_local_range = std::nullopt,
std::optional< std::vector< unsigned int >>  variable_numbers = std::nullopt 
) const
inherited

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

Definition at line 1048 of file system_projection.C.

References fptr(), and gptr().

1053 {
1054  WrappedFunction<Number> f(*this, fptr, &function_parameters);
1055  WrappedFunction<Gradient> g(*this, gptr, &function_parameters);
1056  this->project_solution(&f, &g, active_local_range, variable_numbers);
1057 }
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:81
void project_solution(FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, std::optional< ConstElemRange > active_local_range=std::nullopt, std::optional< std::vector< unsigned int >> variable_numbers=std::nullopt) const
Projects arbitrary functions onto the current solution.
Gradient gptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:96

◆ project_solution_on_reinit()

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

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

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

Definition at line 884 of file system.h.

References libMesh::System::_solution_projection.

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

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

◆ project_vector() [1/5]

void libMesh::System::project_vector ( NumericVector< Number > &  new_vector,
FunctionBase< Number > *  f,
FunctionBase< Gradient > *  g = nullptr,
int  is_adjoint = -1,
std::optional< ConstElemRange active_local_range = std::nullopt,
std::optional< std::vector< unsigned int >>  variable_numbers = std::nullopt 
) const
inherited

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

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

The function value f and its gradient g are user-provided cloneable functors. A gradient g is only required/used for projecting onto finite element spaces with continuous derivatives. elem_range active_local_range, if provided, indicates the range of elements over which to perform the projection. variable_numbers variable_numbers, if provided, indicates the variable numbers onto which to project.

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

Definition at line 1111 of file system_projection.C.

References libMesh::libmesh_assert().

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

1117 {
1118  LOG_SCOPE ("project_vector(FunctionBase)", "System");
1119 
1120  libmesh_assert(f);
1121 
1122  WrappedFunctor<Number> f_fem(*f);
1123 
1124  if (g)
1125  {
1126  WrappedFunctor<Gradient> g_fem(*g);
1127 
1128  this->project_vector(new_vector, &f_fem, &g_fem, is_adjoint, active_local_range, variable_numbers);
1129  }
1130  else
1131  this->project_vector(new_vector, &f_fem, nullptr, is_adjoint, active_local_range, variable_numbers);
1132 }
libmesh_assert(ctx)
void project_vector(NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1, std::optional< ConstElemRange > active_local_range=std::nullopt, std::optional< std::vector< unsigned int >> variable_numbers=std::nullopt) const
Projects arbitrary functions onto a vector of degree of freedom values for the current system...

◆ project_vector() [2/5]

void libMesh::System::project_vector ( NumericVector< Number > &  new_vector,
FEMFunctionBase< Number > *  f,
FEMFunctionBase< Gradient > *  g = nullptr,
int  is_adjoint = -1,
std::optional< ConstElemRange active_local_range = std::nullopt,
std::optional< std::vector< unsigned int >>  variable_numbers = std::nullopt 
) const
inherited

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

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

The function value f and its gradient g are user-provided cloneable functors. A gradient g is only required/used for projecting onto finite element spaces with continuous derivatives. elem_range active_local_range, if provided, indicates the range of elements over which to perform the projection. variable_numbers variable_numbers, if provided, indicates the variable numbers onto which to project.

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

Definition at line 1139 of file system_projection.C.

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

1145 {
1146  LOG_SCOPE ("project_fem_vector()", "System");
1147 
1148  libmesh_assert (f);
1149 
1150  if (!active_local_range)
1151  {
1152  active_local_range.emplace
1153  (this->get_mesh().active_local_elements_begin(),
1154  this->get_mesh().active_local_elements_end());
1155  }
1156 
1157  VectorSetAction<Number> setter(new_vector);
1158 
1159  const unsigned int n_variables = this->n_vars();
1160 
1161  std::vector<unsigned int> vars;
1162  if (variable_numbers)
1163  {
1164  vars = *variable_numbers;
1165  for (auto v : vars)
1166  if (v >= n_variables)
1167  libmesh_error_msg("ERROR: variable number " << v <<
1168  " out of range for system with " <<
1169  n_variables << " variables.");
1170  }
1171  else
1172  {
1173  vars.resize(n_variables);
1174  std::iota(vars.begin(), vars.end(), 0);
1175  }
1176 
1177 
1178  // Use a typedef to make the calling sequence for parallel_for() a bit more readable
1179  typedef
1180  GenericProjector<FEMFunctionWrapper<Number>, FEMFunctionWrapper<Gradient>,
1181  Number, VectorSetAction<Number>> FEMProjector;
1182 
1183  FEMFunctionWrapper<Number> fw(*f);
1184 
1185  if (g)
1186  {
1187  FEMFunctionWrapper<Gradient> gw(*g);
1188 
1189  FEMProjector projector(*this, fw, &gw, setter, vars);
1190  projector.project(active_local_range.value());
1191  }
1192  else
1193  {
1194  FEMProjector projector(*this, fw, nullptr, setter, vars);
1195  projector.project(active_local_range.value());
1196  }
1197 
1198  // Also, load values into the SCALAR dofs
1199  // Note: We assume that all SCALAR dofs are on the
1200  // processor with highest ID
1201  if (this->processor_id() == (this->n_processors()-1))
1202  {
1203  // FIXME: Do we want to first check for SCALAR vars before building this? [PB]
1204  FEMContext context( *this );
1205 
1206  const DofMap & dof_map = this->get_dof_map();
1207  for (auto var : vars)
1208  if (this->variable(var).type().family == SCALAR)
1209  {
1210  // FIXME: We reinit with an arbitrary element in case the user
1211  // doesn't override FEMFunctionBase::component. Is there
1212  // any use case we're missing? [PB]
1213  context.pre_fe_reinit(*this, *(this->get_mesh().active_local_elements_begin()));
1214 
1215  std::vector<dof_id_type> SCALAR_indices;
1216  dof_map.SCALAR_dof_indices (SCALAR_indices, var);
1217  const unsigned int n_SCALAR_dofs =
1218  cast_int<unsigned int>(SCALAR_indices.size());
1219 
1220  for (unsigned int i=0; i<n_SCALAR_dofs; i++)
1221  {
1222  const dof_id_type global_index = SCALAR_indices[i];
1223  const unsigned int component_index =
1224  this->variable_scalar_number(var,i);
1225 
1226  new_vector.set(global_index, f->component(context, component_index, Point(), this->time));
1227  }
1228  }
1229  }
1230 
1231  new_vector.close();
1232 
1233  // Look for spline bases, in which case we need to backtrack
1234  // to calculate the spline DoF values.
1235  std::vector<const Variable *> rational_vars;
1236  for (auto varnum : vars)
1237  {
1238  const Variable & var = this->get_dof_map().variable(varnum);
1239  if (var.type().family == RATIONAL_BERNSTEIN)
1240  rational_vars.push_back(&var);
1241  }
1242 
1243  // Okay, but are we really using any *spline* bases, or just
1244  // unconstrained rational bases?
1245  bool using_spline_bases = false;
1246  if (!rational_vars.empty())
1247  {
1248  // Look for a spline node: a NodeElem with a rational variable
1249  // on it.
1250  for (auto & elem : active_local_range.value())
1251  if (elem->type() == NODEELEM)
1252  for (auto rational_var : rational_vars)
1253  if (rational_var->active_on_subdomain(elem->subdomain_id()))
1254  {
1255  using_spline_bases = true;
1256  goto checked_on_splines;
1257  }
1258  }
1259 
1260 checked_on_splines:
1261 
1262  // Not every processor may have a NodeElem, especially while
1263  // we're not partitioning them efficiently yet.
1264  this->comm().max(using_spline_bases);
1265 
1266  if (using_spline_bases)
1267  this->solve_for_unconstrained_dofs(new_vector, is_adjoint);
1268 
1269 #ifdef LIBMESH_ENABLE_CONSTRAINTS
1270  if (is_adjoint == -1)
1271  this->get_dof_map().enforce_constraints_exactly(*this, &new_vector);
1272  else if (is_adjoint >= 0)
1274  is_adjoint);
1275 #else
1276  libmesh_ignore(is_adjoint);
1277 #endif
1278 }
Real time
For time-dependent problems, this is the time t at the beginning of the current timestep.
Definition: system.h:1677
unsigned int variable_scalar_number(std::string_view var, unsigned int component) const
Definition: system.h:2474
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.C:2699
const Parallel::Communicator & comm() const
const MeshBase & get_mesh() const
Definition: system.h:2401
const Variable & variable(const unsigned int c) const override
Definition: dof_map.h:2358
void enforce_adjoint_constraints_exactly(NumericVector< Number > &v, unsigned int q) const
Heterogeneously constrains the numeric vector v, which represents an adjoint solution defined on the ...
Definition: dof_map.h:2522
processor_id_type n_processors() const
void libmesh_ignore(const Args &...)
libmesh_assert(ctx)
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
void max(const T &r, T &o, Request &req) const
virtual Output component(const FEMContext &, unsigned int i, const Point &p, Real time=0.)
virtual void set(const numeric_index_type i, const T value)=0
Sets v(i) = value.
unsigned int n_vars() const
Definition: system.C:2669
processor_id_type processor_id() const
const DofMap & get_dof_map() const
Definition: system.h:2417
void solve_for_unconstrained_dofs(NumericVector< Number > &, int is_adjoint=-1) const
uint8_t dof_id_type
Definition: id_types.h:67
void enforce_constraints_exactly(const System &system, NumericVector< Number > *v=nullptr, bool homogeneous=false) const
Constrains the numeric vector v, which represents a solution defined on the mesh. ...
Definition: dof_map.h:2518

◆ project_vector() [3/5]

void libMesh::System::project_vector ( ValueFunctionPointer  fptr,
GradientFunctionPointer  gptr,
const Parameters parameters,
NumericVector< Number > &  new_vector,
int  is_adjoint = -1,
std::optional< ConstElemRange active_local_range = std::nullopt,
std::optional< std::vector< unsigned int >>  variable_numbers = std::nullopt 
) const
inherited

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

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

The function value fptr and its gradient gptr are represented by function pointers. A gradient gptr is only required/used for projecting onto finite element spaces with continuous derivatives. elem_range active_local_range, if provided, indicates the range of elements over which to perform the projection. variable_numbers variable_numbers, if provided, indicates the variable numbers onto which to project.

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

Definition at line 1094 of file system_projection.C.

References fptr(), and gptr().

1101 {
1102  WrappedFunction<Number> f(*this, fptr, &function_parameters);
1103  WrappedFunction<Gradient> g(*this, gptr, &function_parameters);
1104  this->project_vector(new_vector, &f, &g, is_adjoint, active_local_range, variable_numbers);
1105 }
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:81
Gradient gptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition: projection.C:96
void project_vector(NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1, std::optional< ConstElemRange > active_local_range=std::nullopt, std::optional< std::vector< unsigned int >> variable_numbers=std::nullopt) const
Projects arbitrary functions onto a vector of degree of freedom values for the current system...

◆ project_vector() [4/5]

void libMesh::System::project_vector ( NumericVector< Number > &  vector,
int  is_adjoint = -1,
std::optional< ConstElemRange active_local_range = std::nullopt,
std::optional< std::vector< unsigned int >>  variable_numbers = std::nullopt 
) const
protectedinherited

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

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

Definition at line 247 of file system_projection.C.

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

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

◆ project_vector() [5/5]

void libMesh::System::project_vector ( const NumericVector< Number > &  old_v,
NumericVector< Number > &  new_v,
int  is_adjoint = -1,
std::optional< ConstElemRange active_local_range = std::nullopt,
std::optional< std::vector< unsigned int >>  variable_numbers = std::nullopt 
) const
protectedinherited

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

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

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

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

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

Definition at line 267 of file system_projection.C.

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

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

◆ projection_matrix()

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

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

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

Definition at line 982 of file system_projection.C.

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

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

983 {
984  LOG_SCOPE ("projection_matrix()", "System");
985 
986  const unsigned int n_variables = this->n_vars();
987 
988  if (n_variables)
989  {
990  ConstElemRange active_local_elem_range
991  (this->get_mesh().active_local_elements_begin(),
992  this->get_mesh().active_local_elements_end());
993 
994  std::vector<unsigned int> vars(n_variables);
995  std::iota(vars.begin(), vars.end(), 0);
996 
997  // Use a typedef to make the calling sequence for parallel_for() a bit more readable
998  typedef OldSolutionCoefs<Real, &FEMContext::point_value> OldSolutionValueCoefs;
999  typedef OldSolutionCoefs<RealGradient, &FEMContext::point_gradient> OldSolutionGradientCoefs;
1000 
1001  typedef
1002  GenericProjector<OldSolutionValueCoefs,
1003  OldSolutionGradientCoefs,
1004  DynamicSparseNumberArray<Real,dof_id_type>,
1005  MatrixFillAction<Real, Number> > ProjMatFiller;
1006 
1007  OldSolutionValueCoefs f(*this, &vars);
1008  OldSolutionGradientCoefs g(*this, &vars);
1009  MatrixFillAction<Real, Number> setter(proj_mat);
1010 
1011  ProjMatFiller mat_filler(*this, f, &g, setter, vars);
1012  mat_filler.project(active_local_elem_range);
1013 
1014  // Set the SCALAR dof transfer entries too.
1015  // Note: We assume that all SCALAR dofs are on the
1016  // processor with highest ID
1017  if (this->processor_id() == (this->n_processors()-1))
1018  {
1019  const DofMap & dof_map = this->get_dof_map();
1020  for (auto var : make_range(this->n_vars()))
1021  if (this->variable(var).type().family == SCALAR)
1022  {
1023  // We can just map SCALAR dofs directly across
1024  std::vector<dof_id_type> new_SCALAR_indices, old_SCALAR_indices;
1025  dof_map.SCALAR_dof_indices (new_SCALAR_indices, var, false);
1026  dof_map.SCALAR_dof_indices (old_SCALAR_indices, var, true);
1027  const unsigned int new_n_dofs =
1028  cast_int<unsigned int>(new_SCALAR_indices.size());
1029 
1030  for (unsigned int i=0; i<new_n_dofs; i++)
1031  {
1032  proj_mat.set( new_SCALAR_indices[i],
1033  old_SCALAR_indices[i], 1);
1034  }
1035  }
1036  }
1037  }
1038 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.C:2699
const MeshBase & get_mesh() const
Definition: system.h:2401
StoredRange< MeshBase::const_element_iterator, const Elem * > ConstElemRange
Definition: elem_range.h:34
virtual void set(const numeric_index_type i, const numeric_index_type j, const T value)=0
Set the element (i,j) to value.
processor_id_type n_processors() const
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
unsigned int n_vars() const
Definition: system.C:2669
processor_id_type processor_id() const
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ prolong_vectors()

void libMesh::System::prolong_vectors ( )
virtualinherited

Prolong vectors after the mesh has refined.

Definition at line 432 of file system.C.

References libMesh::System::restrict_vectors().

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

433 {
434 #ifdef LIBMESH_ENABLE_AMR
435  // Currently project_vector handles both restriction and prolongation
436  this->restrict_vectors();
437 #endif
438 }
virtual void restrict_vectors()
Restrict vectors after the mesh has coarsened.
Definition: system.C:374

◆ qoi_parameter_hessian()

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

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

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

Reimplemented from libMesh::System.

Definition at line 922 of file implicit_system.C.

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

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

◆ qoi_parameter_hessian_vector_product()

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

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

Reimplemented from libMesh::System.

Definition at line 717 of file implicit_system.C.

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

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

◆ qoi_parameter_sensitivity()

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

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

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

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

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

Definition at line 590 of file system.C.

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

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

◆ re_update()

void libMesh::System::re_update ( )
virtualinherited

Re-update the local values when the mesh has changed.

This method takes the data updated by update() and makes it up-to-date on the current mesh.

Reimplemented in libMesh::TransientSystem< RBConstruction >.

Definition at line 521 of file system.C.

References libMesh::System::current_local_solution, libMesh::System::get_dof_map(), libMesh::DofMap::get_send_list(), libMesh::System::n_vars(), and libMesh::System::solution.

522 {
523  parallel_object_only();
524 
525  // If this system is empty... don't do anything!
526  if (!this->n_vars())
527  return;
528 
529  const std::vector<dof_id_type> & send_list = this->get_dof_map().get_send_list ();
530 
531  // Check sizes
532  libmesh_assert_equal_to (current_local_solution->size(), solution->size());
533  // Not true with ghosted vectors
534  // libmesh_assert_equal_to (current_local_solution->local_size(), solution->size());
535  // libmesh_assert (!send_list.empty());
536  libmesh_assert_less_equal (send_list.size(), solution->size());
537 
538  // Create current_local_solution from solution. This will
539  // put a local copy of solution into current_local_solution.
540  solution->localize (*current_local_solution, send_list);
541 }
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1667
unsigned int n_vars() const
Definition: system.C:2669
const DofMap & get_dof_map() const
Definition: system.h:2417
const std::vector< dof_id_type > & get_send_list() const
Definition: dof_map.h:533

◆ read_header()

void libMesh::System::read_header ( Xdr io,
std::string_view  version,
const bool  read_header = true,
const bool  read_additional_data = true,
const bool  read_legacy_format = false 
)
inherited

Reads the basic data header for this System.

Definition at line 97 of file system_io.C.

References libMesh::System::_additional_data_written, libMesh::System::_written_var_indices, libMesh::System::add_variable(), libMesh::System::add_vector(), TIMPI::Communicator::broadcast(), libMesh::System::clear(), libMesh::ParallelObject::comm(), libMesh::Utility::contains(), libMesh::Xdr::data(), libMesh::FEType::family, libMesh::System::get_mesh(), libMesh::OrderWrapper::get_order(), libMesh::FEType::inf_map, libMesh::libmesh_assert(), libMesh::MeshBase::mesh_dimension(), libMesh::MONOMIAL, libMesh::on_command_line(), libMesh::FEType::order, libMesh::out, libMesh::ParallelObject::processor_id(), libMesh::FEType::radial_family, libMesh::FEType::radial_order, libMesh::Xdr::reading(), libMesh::System::variable_number(), libMesh::Xdr::version(), and libMesh::XYZ.

Referenced by libMesh::EquationSystems::read(), and libMesh::RBEvaluation::read_in_vectors_from_multiple_files().

102 {
103  // This method implements the input of a
104  // System object, embedded in the output of
105  // an EquationSystems<T_sys>. This warrants some
106  // documentation. The output file essentially
107  // consists of 5 sections:
108  //
109  // for this system
110  //
111  // 5.) The number of variables in the system (unsigned int)
112  //
113  // for each variable in the system
114  //
115  // 6.) The name of the variable (string)
116  //
117  // 6.1.) Variable subdomains
118  //
119  // 7.) Combined in an FEType:
120  // - The approximation order(s) of the variable
121  // (Order Enum, cast to int/s)
122  // - The finite element family/ies of the variable
123  // (FEFamily Enum, cast to int/s)
124  //
125  // end variable loop
126  //
127  // 8.) The number of additional vectors (unsigned int),
128  //
129  // for each additional vector in the system object
130  //
131  // 9.) the name of the additional vector (string)
132  //
133  // end system
134  libmesh_assert (io.reading());
135 
136  // Possibly clear data structures and start from scratch.
137  if (read_header_in)
138  this->clear ();
139 
140  // Figure out if we need to read infinite element information.
141  // This will be true if the version string contains " with infinite elements"
142  const bool read_ifem_info =
143  Utility::contains(version, " with infinite elements") ||
144  libMesh::on_command_line ("--read-ifem-systems");
145 
146 
147  {
148  // 5.)
149  // Read the number of variables in the system
150  unsigned int nv=0;
151  if (this->processor_id() == 0)
152  io.data (nv);
153  this->comm().broadcast(nv);
154 
155  _written_var_indices.clear();
156  _written_var_indices.resize(nv, 0);
157 
158  for (unsigned int var=0; var<nv; var++)
159  {
160  // 6.)
161  // Read the name of the var-th variable
162  std::string var_name;
163  if (this->processor_id() == 0)
164  io.data (var_name);
165  this->comm().broadcast(var_name);
166 
167  // 6.1.)
168  std::set<subdomain_id_type> domains;
169  if (io.version() >= LIBMESH_VERSION_ID(0,7,2))
170  {
171  std::vector<subdomain_id_type> domain_array;
172  if (this->processor_id() == 0)
173  io.data (domain_array);
174  for (const auto & id : domain_array)
175  domains.insert(id);
176  }
177  this->comm().broadcast(domains);
178 
179  // 7.)
180  // Read the approximation order(s) of the var-th variable
181  int order=0;
182  if (this->processor_id() == 0)
183  io.data (order);
184  this->comm().broadcast(order);
185 
186 
187  // do the same for infinite element radial_order
188  int rad_order=0;
189  if (read_ifem_info)
190  {
191  if (this->processor_id() == 0)
192  io.data(rad_order);
193  this->comm().broadcast(rad_order);
194  }
195 
196  // Read the finite element type of the var-th variable
197  int fam=0;
198  if (this->processor_id() == 0)
199  io.data (fam);
200  this->comm().broadcast(fam);
201  FEType type;
202  type.order = static_cast<Order>(order);
203  type.family = static_cast<FEFamily>(fam);
204 
205  // Check for incompatibilities. The shape function indexing was
206  // changed for the monomial and xyz finite element families to
207  // simplify extension to arbitrary p. The consequence is that
208  // old restart files will not be read correctly. This is expected
209  // to be an unlikely occurrence, but catch it anyway.
210  if (read_legacy_format)
211  if ((type.family == MONOMIAL || type.family == XYZ) &&
212  ((type.order.get_order() > 2 && this->get_mesh().mesh_dimension() == 2) ||
213  (type.order.get_order() > 1 && this->get_mesh().mesh_dimension() == 3)))
214  {
215  libmesh_here();
216  libMesh::out << "*****************************************************************\n"
217  << "* WARNING: reading a potentially incompatible restart file!!! *\n"
218  << "* contact [email protected] for more details *\n"
219  << "*****************************************************************"
220  << std::endl;
221  }
222 
223  // Read additional information for infinite elements
224  int radial_fam=0;
225  int i_map=0;
226  if (read_ifem_info)
227  {
228  if (this->processor_id() == 0)
229  io.data (radial_fam);
230  this->comm().broadcast(radial_fam);
231  if (this->processor_id() == 0)
232  io.data (i_map);
233  this->comm().broadcast(i_map);
234  }
235 
236 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
237 
238  type.radial_order = static_cast<Order>(rad_order);
239  type.radial_family = static_cast<FEFamily>(radial_fam);
240  type.inf_map = static_cast<InfMapType>(i_map);
241 
242 #endif
243 
244  if (read_header_in)
245  {
246  if (domains.empty())
247  _written_var_indices[var] = this->add_variable (var_name, type);
248  else
249  _written_var_indices[var] = this->add_variable (var_name, type, &domains);
250  }
251  else
252  _written_var_indices[var] = this->variable_number(var_name);
253  }
254  }
255 
256  // 8.)
257  // Read the number of additional vectors.
258  unsigned int nvecs=0;
259  if (this->processor_id() == 0)
260  io.data (nvecs);
261  this->comm().broadcast(nvecs);
262 
263  // If nvecs > 0, this means that write_additional_data
264  // was true when this file was written. We will need to
265  // make use of this fact later.
266  this->_additional_data_written = nvecs;
267 
268  for (unsigned int vec=0; vec<nvecs; vec++)
269  {
270  // 9.)
271  // Read the name of the vec-th additional vector
272  std::string vec_name;
273  if (this->processor_id() == 0)
274  io.data (vec_name);
275  this->comm().broadcast(vec_name);
276  if (io.version() >= LIBMESH_VERSION_ID(1,7,0))
277  {
278  int vec_projection = 0;
279  if (this->processor_id() == 0)
280  io.data (vec_projection);
281  this->comm().broadcast(vec_projection);
282  int vec_type;
283  if (this->processor_id() == 0)
284  io.data (vec_type);
285  this->comm().broadcast(vec_type);
286 
287  if (read_additional_data)
288  this->add_vector(vec_name, bool(vec_projection), ParallelType(vec_type));
289  }
290  else if (read_additional_data)
291  // Systems now can handle adding post-initialization vectors
292  // libmesh_assert(this->_can_add_vectors);
293  // Some systems may have added their own vectors already
294  // libmesh_assert_equal_to (this->_vectors.count(vec_name), 0);
295  this->add_vector(vec_name);
296  }
297 }
virtual void clear()
Clear all the data structures associated with the system.
Definition: system.C:173
Order
defines an enum for polynomial orders.
Definition: enum_order.h:40
const Parallel::Communicator & comm() const
NumericVector< Number > & add_vector(std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Adds the additional vector vec_name to this system.
Definition: system.C:756
const MeshBase & get_mesh() const
Definition: system.h:2401
unsigned int variable_number(std::string_view var) const
Definition: system.C:1398
libmesh_assert(ctx)
unsigned int _additional_data_written
This flag is used only when reading in a system from file.
Definition: system.h:2313
unsigned int add_variable(std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variable var to the list of variables for this system.
Definition: system.C:1344
bool contains(std::string_view superstring, std::string_view substring)
Look for a substring within a string.
Definition: utility.C:205
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
InfMapType
defines an enum for the types of coordinate mappings available in infinite elements.
OStreamProxy out
unsigned int mesh_dimension() const
Definition: mesh_base.C:422
bool on_command_line(std::string arg)
Definition: libmesh.C:921
FEFamily
defines an enum for finite element families.
processor_id_type processor_id() const
std::vector< unsigned int > _written_var_indices
This vector is used only when reading in a system from file.
Definition: system.h:2325
ParallelType
Defines an enum for parallel data structure types.

◆ read_parallel_data() [1/2]

template<typename InValType >
void libMesh::System::read_parallel_data ( Xdr io,
const bool  read_additional_data 
)
inherited

Reads additional data, namely vectors, for this System.

This method may safely be called on a distributed-memory mesh. This method will read an individual file for each processor in the simulation where the local solution components for that processor are stored.

This method implements the output of the vectors contained in this System object, embedded in the output of an EquationSystems<T_sys>.

9.) The global solution vector, re-ordered to be node-major (More on this later.)

for each additional vector in the object

10.) The global additional vector, re-ordered to be node-major (More on this later.)

Note that the actual IO is handled through the Xdr class (to be renamed later?) which provides a uniform interface to both the XDR (eXternal Data Representation) interface and standard ASCII output. Thus this one section of code will read XDR or ASCII files with no changes.

Definition at line 302 of file system_io.C.

References libMesh::System::_additional_data_written, libMesh::System::_vectors, libMesh::System::_written_var_indices, libMesh::Xdr::data(), libMesh::FEType::family, libMesh::System::get_dof_map(), libMesh::System::get_mesh(), libMesh::DofObject::invalid_id, libMesh::Xdr::is_open(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::ParallelObject::n_processors(), libMesh::System::n_vars(), libMesh::System::number(), libMesh::ParallelObject::processor_id(), libMesh::Xdr::reading(), libMesh::SCALAR, libMesh::DofMap::SCALAR_dof_indices(), libMesh::System::solution, libMesh::Variable::type(), and libMesh::System::variable().

304 {
324  // PerfLog pl("IO Performance",false);
325  // pl.push("read_parallel_data");
326  [[maybe_unused]] dof_id_type total_read_size = 0;
327 
328  libmesh_assert (io.reading());
329  libmesh_assert (io.is_open());
330 
331  // build the ordered nodes and element maps.
332  // when writing/reading parallel files we need to iterate
333  // over our nodes/elements in order of increasing global id().
334  // however, this is not guaranteed to be ordering we obtain
335  // by using the node_iterators/element_iterators directly.
336  // so build a set, sorted by id(), that provides the ordering.
337  // further, for memory economy build the set but then transfer
338  // its contents to vectors, which will be sorted.
339  std::vector<const DofObject *> ordered_nodes, ordered_elements;
340  {
341  std::set<const DofObject *, CompareDofObjectsByID>
342  ordered_nodes_set (this->get_mesh().local_nodes_begin(),
343  this->get_mesh().local_nodes_end());
344 
345  ordered_nodes.insert(ordered_nodes.end(),
346  ordered_nodes_set.begin(),
347  ordered_nodes_set.end());
348  }
349  {
350  std::set<const DofObject *, CompareDofObjectsByID>
351  ordered_elements_set (this->get_mesh().local_elements_begin(),
352  this->get_mesh().local_elements_end());
353 
354  ordered_elements.insert(ordered_elements.end(),
355  ordered_elements_set.begin(),
356  ordered_elements_set.end());
357  }
358 
359  // std::vector<Number> io_buffer;
360  std::vector<InValType> io_buffer;
361 
362  // 9.)
363  //
364  // Actually read the solution components
365  // for the ith system to disk
366  io.data(io_buffer);
367 
368  total_read_size += cast_int<dof_id_type>(io_buffer.size());
369 
370  const unsigned int sys_num = this->number();
371  const unsigned int nv = cast_int<unsigned int>
372  (this->_written_var_indices.size());
373  libmesh_assert_less_equal (nv, this->n_vars());
374 
375  dof_id_type cnt=0;
376 
377  // Loop over each non-SCALAR variable and each node, and read out the value.
378  for (unsigned int data_var=0; data_var<nv; data_var++)
379  {
380  const unsigned int var = _written_var_indices[data_var];
381  if (this->variable(var).type().family != SCALAR)
382  {
383  // First read the node DOF values
384  for (const auto & node : ordered_nodes)
385  for (auto comp : make_range(node->n_comp(sys_num,var)))
386  {
387  libmesh_assert_not_equal_to (node->dof_number(sys_num, var, comp),
389  libmesh_assert_less (cnt, io_buffer.size());
390  this->solution->set(node->dof_number(sys_num, var, comp), io_buffer[cnt++]);
391  }
392 
393  // Then read the element DOF values
394  for (const auto & elem : ordered_elements)
395  for (auto comp : make_range(elem->n_comp(sys_num,var)))
396  {
397  libmesh_assert_not_equal_to (elem->dof_number(sys_num, var, comp),
399  libmesh_assert_less (cnt, io_buffer.size());
400  this->solution->set(elem->dof_number(sys_num, var, comp), io_buffer[cnt++]);
401  }
402  }
403  }
404 
405  // Finally, read the SCALAR variables on the last processor
406  for (unsigned int data_var=0; data_var<nv; data_var++)
407  {
408  const unsigned int var = _written_var_indices[data_var];
409  if (this->variable(var).type().family == SCALAR)
410  {
411  if (this->processor_id() == (this->n_processors()-1))
412  {
413  const DofMap & dof_map = this->get_dof_map();
414  std::vector<dof_id_type> SCALAR_dofs;
415  dof_map.SCALAR_dof_indices(SCALAR_dofs, var);
416 
417  for (auto dof : SCALAR_dofs)
418  this->solution->set(dof, io_buffer[cnt++]);
419  }
420  }
421  }
422 
423  // And we're done setting solution entries
424  this->solution->close();
425 
426  // For each additional vector, simply go through the list.
427  // ONLY attempt to do this IF additional data was actually
428  // written to the file for this system (controlled by the
429  // _additional_data_written flag).
430  if (this->_additional_data_written)
431  {
432  const std::size_t nvecs = this->_vectors.size();
433 
434  // If the number of additional vectors written is non-zero, and
435  // the number of additional vectors we have is non-zero, and
436  // they don't match, then something is wrong and we can't be
437  // sure we're reading data into the correct places.
438  if (read_additional_data && nvecs &&
439  nvecs != this->_additional_data_written)
440  libmesh_error_msg
441  ("Additional vectors in file do not match system");
442 
443  auto pos = _vectors.begin();
444 
445  for (std::size_t i = 0; i != this->_additional_data_written; ++i)
446  {
447  cnt=0;
448  io_buffer.clear();
449 
450  // 10.)
451  //
452  // Actually read the additional vector components
453  // for the ith system from disk
454  io.data(io_buffer);
455 
456  total_read_size += cast_int<dof_id_type>(io_buffer.size());
457 
458  // If read_additional_data==true and we have additional vectors,
459  // then we will keep this vector data; otherwise we are going to
460  // throw it away.
461  if (read_additional_data && nvecs)
462  {
463  // Loop over each non-SCALAR variable and each node, and read out the value.
464  for (unsigned int data_var=0; data_var<nv; data_var++)
465  {
466  const unsigned int var = _written_var_indices[data_var];
467  if (this->variable(var).type().family != SCALAR)
468  {
469  // First read the node DOF values
470  for (const auto & node : ordered_nodes)
471  for (auto comp : make_range(node->n_comp(sys_num,var)))
472  {
473  libmesh_assert_not_equal_to (node->dof_number(sys_num, var, comp),
475  libmesh_assert_less (cnt, io_buffer.size());
476  pos->second->set(node->dof_number(sys_num, var, comp), io_buffer[cnt++]);
477  }
478 
479  // Then read the element DOF values
480  for (const auto & elem : ordered_elements)
481  for (auto comp : make_range(elem->n_comp(sys_num,var)))
482  {
483  libmesh_assert_not_equal_to (elem->dof_number(sys_num, var, comp),
485  libmesh_assert_less (cnt, io_buffer.size());
486  pos->second->set(elem->dof_number(sys_num, var, comp), io_buffer[cnt++]);
487  }
488  }
489  }
490 
491  // Finally, read the SCALAR variables on the last processor
492  for (unsigned int data_var=0; data_var<nv; data_var++)
493  {
494  const unsigned int var = _written_var_indices[data_var];
495  if (this->variable(var).type().family == SCALAR)
496  {
497  if (this->processor_id() == (this->n_processors()-1))
498  {
499  const DofMap & dof_map = this->get_dof_map();
500  std::vector<dof_id_type> SCALAR_dofs;
501  dof_map.SCALAR_dof_indices(SCALAR_dofs, var);
502 
503  for (auto dof : SCALAR_dofs)
504  pos->second->set(dof, io_buffer[cnt++]);
505  }
506  }
507  }
508 
509  // And we're done setting entries for this variable
510  pos->second->close();
511  }
512 
513  // If we've got vectors then we need to be iterating through
514  // those too
515  if (pos != this->_vectors.end())
516  ++pos;
517  }
518  }
519 
520  // const Real
521  // dt = pl.get_elapsed_time(),
522  // rate = total_read_size*sizeof(Number)/dt;
523 
524  // libMesh::err << "Read " << total_read_size << " \"Number\" values\n"
525  // << " Elapsed time = " << dt << '\n'
526  // << " Rate = " << rate/1.e6 << "(MB/sec)\n\n";
527 
528  // pl.pop("read_parallel_data");
529 }
FEFamily family
The type of finite element.
Definition: fe_type.h:228
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.C:2699
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260
const MeshBase & get_mesh() const
Definition: system.h:2401
processor_id_type n_processors() const
unsigned int number() const
Definition: system.h:2393
static constexpr dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:473
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
libmesh_assert(ctx)
unsigned int _additional_data_written
This flag is used only when reading in a system from file.
Definition: system.h:2313
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
unsigned int n_vars() const
Definition: system.C:2669
processor_id_type processor_id() const
const DofMap & get_dof_map() const
Definition: system.h:2417
std::vector< unsigned int > _written_var_indices
This vector is used only when reading in a system from file.
Definition: system.h:2325
uint8_t dof_id_type
Definition: id_types.h:67
const FEType & type() const
Definition: variable.h:144

◆ read_parallel_data() [2/2]

template LIBMESH_EXPORT void libMesh::System::read_parallel_data< Real > ( Xdr io,
const bool  read_additional_data 
)
inlineinherited

Non-templated version for backward compatibility.

Reads additional data, namely vectors, for this System. This method may safely be called on a distributed-memory mesh. This method will read an individual file for each processor in the simulation where the local solution components for that processor are stored.

Definition at line 1412 of file system.h.

1414  { read_parallel_data<Number>(io, read_additional_data); }

◆ read_parameter_data_from_files()

void libMesh::RBParametrized::read_parameter_data_from_files ( const std::string &  continuous_param_file_name,
const std::string &  discrete_param_file_name,
const bool  read_binary_data 
)
inherited

Read in the parameter ranges from files.

Definition at line 262 of file rb_parametrized.C.

References libMesh::RBParametrized::initialize_parameters(), libMesh::RBParametrized::read_discrete_parameter_values_from_file(), and libMesh::RBParametrized::read_parameter_ranges_from_file().

Referenced by libMesh::RBSCMEvaluation::legacy_read_offline_data_from_files(), and libMesh::RBEvaluation::legacy_read_offline_data_from_files().

265 {
266  RBParameters param_min;
267  RBParameters param_max;
268  read_parameter_ranges_from_file(continuous_param_file_name,
269  read_binary_data,
270  param_min,
271  param_max);
272 
273  std::map<std::string, std::vector<Real>> discrete_parameter_values_in;
274  read_discrete_parameter_values_from_file(discrete_param_file_name,
275  read_binary_data,
276  discrete_parameter_values_in);
277 
278  initialize_parameters(param_min, param_max, discrete_parameter_values_in);
279 }
void read_parameter_ranges_from_file(const std::string &file_name, const bool read_binary, RBParameters &param_min, RBParameters &param_max)
Read in the parameter ranges from file.
void read_discrete_parameter_values_from_file(const std::string &file_name, const bool read_binary_data, std::map< std::string, std::vector< Real >> &discrete_parameter_values_in)
Read in the discrete parameter values from file, if we have any.
void initialize_parameters(const RBParameters &mu_min_in, const RBParameters &mu_max_in, const std::map< std::string, std::vector< Real >> &discrete_parameter_values)
Initialize the parameter ranges and set current_parameters.

◆ read_riesz_representors_from_files()

void libMesh::RBConstruction::read_riesz_representors_from_files ( const std::string &  riesz_representors_dir,
const bool  write_binary_residual_representors 
)
virtual

Read in all the Riesz representor data from files.

directory_name specifies which directory to read from. io_flag specifies whether we read in all data, or only a basis (in)dependent subset.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 2649 of file rb_construction.C.

References libMesh::RBEvaluation::Aq_representor, libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), libMesh::DECODE, Fq_representor, Fq_representor_innerprods_computed, libMesh::RBEvaluation::get_n_basis_functions(), get_rb_evaluation(), libMesh::index_range(), libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), libMesh::out, libMesh::PARALLEL, libMesh::ParallelObject::processor_id(), libMesh::READ, libMesh::System::read_serialized_data(), and libMesh::System::solution.

2651 {
2652  LOG_SCOPE("read_riesz_representors_from_files()", "RBConstruction");
2653 
2654  libMesh::out << "Reading in the Fq_representors..." << std::endl;
2655 
2656  const std::string riesz_representor_suffix = (read_binary_residual_representors ? ".xdr" : ".dat");
2657  std::ostringstream file_name;
2658  struct stat stat_info;
2659 
2660  // Read in the Fq_representors. There should be Q_f of these. FIXME:
2661  // should we be worried about leaks here?
2662  for (const auto & rep : Fq_representor)
2663  libmesh_error_msg_if(rep, "Error, must delete existing Fq_representor before reading in from file.");
2664 
2665  for (auto i : index_range(Fq_representor))
2666  {
2667  file_name.str(""); // reset filename
2668  file_name << riesz_representors_dir
2669  << "/Fq_representor" << i << riesz_representor_suffix;
2670 
2671  // On processor zero check to be sure the file exists
2672  if (this->processor_id() == 0)
2673  {
2674  int stat_result = stat(file_name.str().c_str(), &stat_info);
2675 
2676  libmesh_error_msg_if(stat_result != 0, "File does not exist: " << file_name.str());
2677  }
2678 
2679  Xdr fqr_data(file_name.str(),
2680  read_binary_residual_representors ? DECODE : READ);
2681 
2682  read_serialized_data(fqr_data, false);
2683 
2685  Fq_representor[i]->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
2686 
2687  // No need to copy, just swap
2688  // *Fq_representor[i] = *solution;
2689  Fq_representor[i]->swap(*solution);
2690  }
2691 
2692  // Alert the update_residual_terms() function that we don't need to recompute
2693  // the Fq_representors as we have already read them in from file!
2695 
2696 
2697  libMesh::out << "Reading in the Aq_representors..." << std::endl;
2698 
2699  // Read in the Aq representors. The class makes room for [Q_a][Nmax] of these. We are going to
2700  // read in [Q_a][get_rb_evaluation().get_n_basis_functions()]. FIXME:
2701  // should we be worried about leaks in the locations where we're about to fill entries?
2702  RBEvaluation & rbe = get_rb_evaluation();
2703  for (const auto & row : rbe.Aq_representor)
2704  for (const auto & rep : row)
2705  libmesh_error_msg_if(rep, "Error, must delete existing Aq_representor before reading in from file.");
2706 
2707  // Now ready to read them in from file!
2708  for (auto i : index_range(rbe.Aq_representor))
2709  for (unsigned int j=0; j<rbe.get_n_basis_functions(); ++j)
2710  {
2711  file_name.str(""); // reset filename
2712  file_name << riesz_representors_dir
2713  << "/Aq_representor" << i << "_" << j << riesz_representor_suffix;
2714 
2715  // On processor zero check to be sure the file exists
2716  if (this->processor_id() == 0)
2717  {
2718  int stat_result = stat(file_name.str().c_str(), &stat_info);
2719 
2720  libmesh_error_msg_if(stat_result != 0, "File does not exist: " << file_name.str());
2721  }
2722 
2723  Xdr aqr_data(file_name.str(), read_binary_residual_representors ? DECODE : READ);
2724 
2725  read_serialized_data(aqr_data, false);
2726 
2727  rbe.Aq_representor[i][j] = NumericVector<Number>::build(this->comm());
2728  rbe.Aq_representor[i][j]->init (n_dofs(), n_local_dofs(),
2729  false, PARALLEL);
2730 
2731  // No need to copy, just swap
2732  rbe.Aq_representor[i][j]->swap(*solution);
2733  }
2734 }
std::vector< std::unique_ptr< NumericVector< Number > > > Fq_representor
Vector storing the residual representors associated with the right-hand side.
const Parallel::Communicator & comm() const
dof_id_type n_local_dofs() const
Definition: system.C:155
dof_id_type n_dofs() const
Definition: system.C:118
bool Fq_representor_innerprods_computed
A boolean flag to indicate whether or not the Fq representor norms have already been computed — used...
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
OStreamProxy out
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.
processor_id_type processor_id() const
void read_serialized_data(Xdr &io, const bool read_additional_data=true)
Reads additional data, namely vectors, for this System.
Definition: system_io.C:533
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:150

◆ read_serialized_data() [1/2]

template<typename InValType >
void libMesh::System::read_serialized_data ( Xdr io,
const bool  read_additional_data = true 
)
inherited

Reads additional data, namely vectors, for this System.

This method may safely be called on a distributed-memory mesh.

Definition at line 533 of file system_io.C.

References libMesh::System::_additional_data_written, libMesh::System::_vectors, libMesh::ParallelObject::processor_id(), and libMesh::System::solution.

Referenced by libMesh::TransientRBConstruction::initialize_truth(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), and read_riesz_representors_from_files().

535 {
536  // This method implements the input of the vectors
537  // contained in this System object, embedded in the
538  // output of an EquationSystems<T_sys>.
539  //
540  // 10.) The global solution vector, re-ordered to be node-major
541  // (More on this later.)
542  //
543  // for each additional vector in the object
544  //
545  // 11.) The global additional vector, re-ordered to be
546  // node-major (More on this later.)
547  parallel_object_only();
548  std::string comment;
549 
550  // PerfLog pl("IO Performance",false);
551  // pl.push("read_serialized_data");
552  // std::size_t total_read_size = 0;
553 
554  // 10.)
555  // Read the global solution vector
556  {
557  // total_read_size +=
558  this->read_serialized_vector<InValType>(io, this->solution.get());
559 
560  // get the comment
561  if (this->processor_id() == 0)
562  io.comment (comment);
563  }
564 
565  // 11.)
566  // Only read additional vectors if data is available, and only use
567  // that data to fill our vectors if the user requested it.
568  if (this->_additional_data_written)
569  {
570  const std::size_t nvecs = this->_vectors.size();
571 
572  // If the number of additional vectors written is non-zero, and
573  // the number of additional vectors we have is non-zero, and
574  // they don't match, then we can't read additional vectors
575  // and be sure we're reading data into the correct places.
576  if (read_additional_data && nvecs &&
577  nvecs != this->_additional_data_written)
578  libmesh_error_msg
579  ("Additional vectors in file do not match system");
580 
581  auto pos = _vectors.begin();
582 
583  for (std::size_t i = 0; i != this->_additional_data_written; ++i)
584  {
585  // Read data, but only put it into a vector if we've been
586  // asked to and if we have a corresponding vector to read.
587 
588  // total_read_size +=
589  this->read_serialized_vector<InValType>
590  (io, (read_additional_data && nvecs) ? pos->second.get() : nullptr);
591 
592  // get the comment
593  if (this->processor_id() == 0)
594  io.comment (comment);
595 
596 
597  // If we've got vectors then we need to be iterating through
598  // those too
599  if (pos != this->_vectors.end())
600  ++pos;
601  }
602  }
603 
604  // const Real
605  // dt = pl.get_elapsed_time(),
606  // rate = total_read_size*sizeof(Number)/dt;
607 
608  // libMesh::out << "Read " << total_read_size << " \"Number\" values\n"
609  // << " Elapsed time = " << dt << '\n'
610  // << " Rate = " << rate/1.e6 << "(MB/sec)\n\n";
611 
612  // pl.pop("read_serialized_data");
613 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
unsigned int _additional_data_written
This flag is used only when reading in a system from file.
Definition: system.h:2313
processor_id_type processor_id() const

◆ read_serialized_data() [2/2]

template LIBMESH_EXPORT void libMesh::System::read_serialized_data< Real > ( Xdr io,
const bool  read_additional_data = true 
)
inlineinherited

Non-templated version for backward compatibility.

Reads additional data, namely vectors, for this System. This method may safely be called on a distributed-memory mesh.

Definition at line 1370 of file system.h.

1372  { read_serialized_data<Number>(io, read_additional_data); }

◆ read_serialized_vectors() [1/2]

template<typename InValType >
std::size_t libMesh::System::read_serialized_vectors ( Xdr io,
const std::vector< NumericVector< Number > *> &  vectors 
) const
inherited

Read a number of identically distributed vectors.

This method allows for optimization for the multiple vector case by only communicating the metadata once.

Definition at line 2018 of file system_io.C.

References libMesh::Xdr::data(), libMesh::System::get_mesh(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::MeshTools::n_elem(), libMesh::MeshBase::n_elem(), n_nodes, libMesh::MeshBase::n_nodes(), libMesh::System::n_vars(), libMesh::ParallelObject::processor_id(), libMesh::System::read_SCALAR_dofs(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::Xdr::reading(), libMesh::SCALAR, and libMesh::System::variable().

Referenced by libMesh::RBEvaluation::read_in_vectors_from_multiple_files().

2020 {
2021  parallel_object_only();
2022 
2023  // Error checking
2024  // #ifndef NDEBUG
2025  // // In parallel we better be reading a parallel vector -- if not
2026  // // we will not set all of its components below!!
2027  // if (this->n_processors() > 1)
2028  // {
2029  // libmesh_assert (vec.type() == PARALLEL ||
2030  // vec.type() == GHOSTED);
2031  // }
2032  // #endif
2033 
2034  libmesh_assert (io.reading());
2035 
2036  if (this->processor_id() == 0)
2037  {
2038  // sizes
2039  unsigned int num_vecs=0;
2040  dof_id_type vector_length=0;
2041 
2042  // Get the number of vectors
2043  io.data(num_vecs);
2044  // Get the buffer size
2045  io.data(vector_length);
2046 
2047  libmesh_error_msg_if
2048  (num_vecs != vectors.size(),
2049  "Xdr file header declares " << num_vecs << " vectors, but we were asked to read " << vectors.size());
2050 
2051  if (num_vecs != 0)
2052  {
2053  libmesh_error_msg_if (vectors[0] == nullptr, "vectors[0] should not be null");
2054  libmesh_error_msg_if (vectors[0]->size() != vector_length, "Inconsistent vector sizes");
2055  }
2056  }
2057 
2058  // no need to actually communicate these.
2059  // this->comm().broadcast(num_vecs);
2060  // this->comm().broadcast(vector_length);
2061 
2062  // Cache these - they are not free!
2063  const dof_id_type
2064  n_nodes = this->get_mesh().n_nodes(),
2065  n_elem = this->get_mesh().n_elem();
2066 
2067  std::size_t read_length = 0;
2068 
2069  //---------------------------------
2070  // Collect the values for all nodes
2071  read_length +=
2072  this->read_serialized_blocked_dof_objects (n_nodes,
2073  this->get_mesh().local_nodes_begin(),
2074  this->get_mesh().local_nodes_end(),
2075  InValType(),
2076  io,
2077  vectors);
2078 
2079  //------------------------------------
2080  // Collect the values for all elements
2081  read_length +=
2083  this->get_mesh().local_elements_begin(),
2084  this->get_mesh().local_elements_end(),
2085  InValType(),
2086  io,
2087  vectors);
2088 
2089  //-------------------------------------------
2090  // Finally loop over all the SCALAR variables
2091  for (NumericVector<Number> * vec : vectors)
2092  for (auto var : make_range(this->n_vars()))
2093  if (this->variable(var).type().family == SCALAR)
2094  {
2095  libmesh_assert_not_equal_to (vec, 0);
2096 
2097  read_length +=
2098  this->read_SCALAR_dofs (var, io, vec);
2099  }
2100 
2101  //---------------------------------------
2102  // last step - must close all the vectors
2103  for (NumericVector<Number> * vec : vectors)
2104  {
2105  libmesh_assert_not_equal_to (vec, 0);
2106  vec->close();
2107  }
2108 
2109  return read_length;
2110 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.C:2699
dof_id_type n_elem(const MeshBase::const_element_iterator &begin, const MeshBase::const_element_iterator &end)
Count up the number of elements of a specific type (as defined by an iterator range).
Definition: mesh_tools.C:976
std::size_t read_serialized_blocked_dof_objects(const dof_id_type n_objects, const iterator_type begin, const iterator_type end, const InValType dummy, Xdr &io, const std::vector< NumericVector< Number > *> &vecs, const unsigned int var_to_read=libMesh::invalid_uint) const
Reads an input vector from the stream io and assigns the values to a set of DofObjects.
Definition: system_io.C:618
const MeshBase & get_mesh() const
Definition: system.h:2401
const dof_id_type n_nodes
Definition: tecplot_io.C:67
libmesh_assert(ctx)
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
unsigned int read_SCALAR_dofs(const unsigned int var, Xdr &io, NumericVector< Number > *vec) const
Reads the SCALAR dofs from the stream io and assigns the values to the appropriate entries of vec...
Definition: system_io.C:942
unsigned int n_vars() const
Definition: system.C:2669
virtual dof_id_type n_elem() const =0
processor_id_type processor_id() const
template class LIBMESH_EXPORT NumericVector< Number >
virtual dof_id_type n_nodes() const =0
uint8_t dof_id_type
Definition: id_types.h:67

◆ read_serialized_vectors() [2/2]

template LIBMESH_EXPORT std::size_t libMesh::System::read_serialized_vectors< Real > ( Xdr io,
const std::vector< NumericVector< Number > *> &  vectors 
) const
inlineinherited

Non-templated version for backward compatibility.

Read a number of identically distributed vectors. This method allows for optimization for the multiple vector case by only communicating the metadata once.

Definition at line 1390 of file system.h.

1392  { return read_serialized_vectors<Number>(io, vectors); }

◆ recompute_all_residual_terms()

void libMesh::RBConstruction::recompute_all_residual_terms ( const bool  compute_inner_products = true)
virtual

This function computes all of the residual representors, can be useful when restarting a basis training computation.

If compute_inner_products is false, we just compute the residual Riesz representors, whereas if true, we also compute all the corresponding inner product terms.

Definition at line 1818 of file rb_construction.C.

References compute_Fq_representor_innerprods(), delta_N, Fq_representor_innerprods_computed, libMesh::RBEvaluation::get_n_basis_functions(), get_rb_evaluation(), and update_residual_terms().

Referenced by train_reduced_basis_with_POD().

1819 {
1820  // Compute the basis independent terms
1822  compute_Fq_representor_innerprods(compute_inner_products);
1823 
1824  // and all the basis dependent terms
1825  unsigned int saved_delta_N = delta_N;
1827 
1828  update_residual_terms(compute_inner_products);
1829 
1830  delta_N = saved_delta_N;
1831 }
bool Fq_representor_innerprods_computed
A boolean flag to indicate whether or not the Fq representor norms have already been computed — used...
virtual void update_residual_terms(bool compute_inner_products=true)
Compute the terms that are combined ‘online’ to determine the dual norm of the residual.
unsigned int delta_N
The number of basis functions that we add at each greedy step.
virtual unsigned int get_n_basis_functions() const
Get the current number of basis functions.
virtual void compute_Fq_representor_innerprods(bool compute_inner_products=true)
Compute the terms that are combined ‘online’ to determine the dual norm of the residual.
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.

◆ reinit()

void libMesh::LinearImplicitSystem::reinit ( )
overridevirtualinherited

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

Reimplemented from libMesh::System.

Reimplemented in libMesh::NewmarkSystem.

Definition at line 99 of file linear_implicit_system.C.

References libMesh::ImplicitSystem::linear_solver, and libMesh::System::reinit().

Referenced by fe_assembly().

100 {
101  // re-initialize the linear solver interface
102  linear_solver->clear();
103 
104  // initialize parent data
105  Parent::reinit();
106 }
virtual void reinit()
Reinitializes degrees of freedom and other required data on the current mesh.
Definition: system.C:442
std::unique_ptr< LinearSolver< Number > > linear_solver
This class handles all the details of interfacing with various linear algebra packages like PETSc or ...

◆ reinit_constraints()

void libMesh::System::reinit_constraints ( )
virtualinherited

Reinitializes the constraints for this system.

Also prepares the send_list, whether or not constraints have changed.

Definition at line 483 of file system.C.

References libMesh::System::_mesh, libMesh::DofMap::create_dof_constraints(), libMesh::System::get_dof_map(), libMesh::on_command_line(), libMesh::out, libMesh::DofMap::prepare_send_list(), libMesh::DofMap::print_dof_constraints(), libMesh::DofMap::process_constraints(), libMesh::System::time, and libMesh::System::user_constrain().

Referenced by libMesh::EquationSystems::allgather(), libMesh::System::init_data(), libMesh::PetscDMWrapper::init_petscdm(), and libMesh::EquationSystems::reinit_solutions().

484 {
485  parallel_object_only();
486 
487 #ifdef LIBMESH_ENABLE_CONSTRAINTS
489  user_constrain();
491  if (libMesh::on_command_line ("--print-constraints"))
493 #endif
495 }
Real time
For time-dependent problems, this is the time t at the beginning of the current timestep.
Definition: system.h:1677
void print_dof_constraints(std::ostream &os=libMesh::out, bool print_nonlocal=false) const
Prints (from processor 0) all DoF and Node constraints.
void process_constraints(MeshBase &)
Postprocesses any constrained degrees of freedom to be constrained only in terms of unconstrained dof...
OStreamProxy out
void create_dof_constraints(const MeshBase &, Real time=0)
Rebuilds the raw degree of freedom and DofObject constraints, based on attached DirichletBoundary obj...
void prepare_send_list()
Takes the _send_list vector (which may have duplicate entries) and sorts it.
Definition: dof_map.C:1826
bool on_command_line(std::string arg)
Definition: libmesh.C:921
virtual void user_constrain()
Calls user&#39;s attached constraint function, or is overridden by the user in derived classes...
Definition: system.C:2118
const DofMap & get_dof_map() const
Definition: system.h:2417
MeshBase & _mesh
Constant reference to the mesh data structure used for the simulation.
Definition: system.h:2237

◆ reinit_mesh()

void libMesh::System::reinit_mesh ( )
virtualinherited

Reinitializes the system with a new mesh.

Definition at line 289 of file system.C.

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

Referenced by libMesh::System::init(), libMesh::PetscPreconditioner< T >::set_hypre_ads_data(), and libMesh::PetscPreconditioner< T >::set_hypre_ams_data().

290 {
291  parallel_object_only();
292 
293  // First initialize any required data:
294  // either only the basic System data
295  if (_basic_system_only)
297  // or all the derived class' data too
298  else
299  this->init_data();
300 
301  // If no variables have been added to this system
302  // don't do anything
303  if (!this->n_vars())
304  return;
305 
306  // Then call the user-provided initialization function
307  this->user_initialization();
308 
309 }
bool _basic_system_only
Holds true if the components of more advanced system types (e.g.
Definition: system.h:2300
virtual void init_data()
Initializes the data for the system.
Definition: system.C:207
virtual void user_initialization()
Calls user&#39;s attached initialization function, or is overridden by the user in derived classes...
Definition: system.C:2090
unsigned int n_vars() const
Definition: system.C:2669

◆ remove_matrix()

void libMesh::System::remove_matrix ( std::string_view  mat_name)
inherited

Removes the additional matrix mat_name from this system.

Definition at line 1076 of file system.C.

References libMesh::System::_matrices.

1077 {
1078  parallel_object_only(); // Not strictly needed, but the only safe way to keep in sync
1079 
1080  if (const auto pos = _matrices.find(mat_name);
1081  pos != _matrices.end())
1082  _matrices.erase(pos); // erase()'d entries are destroyed
1083 }
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2277

◆ remove_vector()

void libMesh::System::remove_vector ( std::string_view  vec_name)
inherited

Removes the additional vector vec_name from this system.

Definition at line 861 of file system.C.

References libMesh::System::_vector_is_adjoint, libMesh::System::_vector_projections, libMesh::System::_vectors, and libMesh::libmesh_assert().

Referenced by libMesh::AdjointRefinementEstimator::estimate_error(), and libMesh::UnsteadySolver::integrate_adjoint_sensitivity().

862 {
863  parallel_object_only(); // Not strictly needed, but the only safe way to keep in sync
864 
865  if (const auto pos = _vectors.find(vec_name);
866  pos != _vectors.end())
867  {
868  _vectors.erase(pos);
869  auto proj_it = _vector_projections.find(vec_name);
870  libmesh_assert(proj_it != _vector_projections.end());
871  _vector_projections.erase(proj_it);
872 
873  auto adj_it = _vector_is_adjoint.find(vec_name);
874  libmesh_assert(adj_it != _vector_is_adjoint.end());
875  _vector_is_adjoint.erase(adj_it);
876  }
877 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260
std::map< std::string, int, std::less<> > _vector_is_adjoint
Holds non-negative if a vector by that name should be projected using adjoint constraints/BCs, -1 if primal.
Definition: system.h:2272
libmesh_assert(ctx)
std::map< std::string, bool, std::less<> > _vector_projections
Holds true if a vector by that name should be projected onto a changed grid, false if it should be ze...
Definition: system.h:2266

◆ request_matrix() [1/2]

const SparseMatrix< Number > * libMesh::System::request_matrix ( std::string_view  mat_name) const
inherited
Returns
A const pointer to this system's additional matrix named mat_name, or nullptr if no matrix by that name exists.

Definition at line 1087 of file system.C.

References libMesh::System::_matrices.

Referenced by libMesh::EigenSystem::has_matrix_A(), libMesh::EigenSystem::has_matrix_B(), libMesh::EigenSystem::has_precond_matrix(), libMesh::ImplicitSystem::sensitivity_solve(), libMesh::NewtonSolver::solve(), and libMesh::LinearImplicitSystem::solve().

1088 {
1089  if (const auto pos = _matrices.find(mat_name);
1090  pos != _matrices.end())
1091  return pos->second.get();
1092 
1093  // Otherwise, mat_name does not exist
1094  return nullptr;
1095 }
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2277

◆ request_matrix() [2/2]

SparseMatrix< Number > * libMesh::System::request_matrix ( std::string_view  mat_name)
inherited
Returns
A writable pointer to this system's additional matrix named mat_name, or nullptr if no matrix by that name exists.

Definition at line 1099 of file system.C.

References libMesh::System::_matrices.

1100 {
1101  if (auto pos = _matrices.find(mat_name);
1102  pos != _matrices.end())
1103  return pos->second.get();
1104 
1105  // Otherwise, mat_name does not exist
1106  return nullptr;
1107 }
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
Some systems need an arbitrary number of matrices.
Definition: system.h:2277

◆ request_vector() [1/4]

const NumericVector< Number > * libMesh::System::request_vector ( std::string_view  vec_name) const
inherited
Returns
A const pointer to the vector if this System has a vector associated with the given name, nullptr otherwise.

Definition at line 879 of file system.C.

References libMesh::System::_vectors, and libMesh::NumericVector< T >::get().

Referenced by libMesh::UniformRefinementEstimator::_estimate_error().

880 {
881  if (const auto pos = _vectors.find(vec_name);
882  pos != _vectors.end())
883  return pos->second.get();
884 
885  // Otherwise, vec_name was not found
886  return nullptr;
887 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260

◆ request_vector() [2/4]

NumericVector< Number > * libMesh::System::request_vector ( std::string_view  vec_name)
inherited
Returns
A pointer to the vector if this System has a vector associated with the given name, nullptr otherwise.

Definition at line 891 of file system.C.

References libMesh::System::_vectors, and libMesh::NumericVector< T >::get().

892 {
893  if (auto pos = _vectors.find(vec_name);
894  pos != _vectors.end())
895  return pos->second.get();
896 
897  // Otherwise, vec_name was not found
898  return nullptr;
899 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260

◆ request_vector() [3/4]

const NumericVector< Number > * libMesh::System::request_vector ( const unsigned int  vec_num) const
inherited
Returns
A const pointer to this system's additional vector number vec_num (where the vectors are counted starting with 0), or nullptr if the system has no such vector.

Definition at line 903 of file system.C.

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

904 {
905  // If we don't have that many vectors, return nullptr
906  if (vec_num >= _vectors.size())
907  return nullptr;
908 
909  // Otherwise return a pointer to the vec_num'th vector
910  auto it = vectors_begin();
911  std::advance(it, vec_num);
912  return it->second.get();
913 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260
vectors_iterator vectors_begin()
Beginning of vectors container.
Definition: system.h:2505

◆ request_vector() [4/4]

NumericVector< Number > * libMesh::System::request_vector ( const unsigned int  vec_num)
inherited
Returns
A writable pointer to this system's additional vector number vec_num (where the vectors are counted starting with 0), or nullptr if the system has no such vector.

Definition at line 917 of file system.C.

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

918 {
919  // If we don't have that many vectors, return nullptr
920  if (vec_num >= _vectors.size())
921  return nullptr;
922 
923  // Otherwise return a pointer to the vec_num'th vector
924  auto it = vectors_begin();
925  std::advance(it, vec_num);
926  return it->second.get();
927 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260
vectors_iterator vectors_begin()
Beginning of vectors container.
Definition: system.h:2505

◆ reset_preevaluate_thetas_completed()

void libMesh::RBConstruction::reset_preevaluate_thetas_completed ( )
protected

Reset the _preevaluate_thetas_completed flag to false.

We can use this to force us to recalculate preevaluate thetas, in cases where that is necessary.

Definition at line 2865 of file rb_construction.C.

References _preevaluate_thetas_completed.

2866 {
2868 }
bool _preevaluate_thetas_completed
Flag to indicate if the preevaluate_thetas function has been called, since this allows us to avoid ca...

◆ restrict_solve_to()

void libMesh::LinearImplicitSystem::restrict_solve_to ( const SystemSubset subset,
const SubsetSolveMode  subset_solve_mode = SUBSET_ZERO 
)
overridevirtualinherited

After calling this method, any solve will be limited to the given subset.

To disable this mode, call this method with subset being a nullptr.

Reimplemented from libMesh::System.

Definition at line 110 of file linear_implicit_system.C.

References libMesh::LinearImplicitSystem::_subset, libMesh::LinearImplicitSystem::_subset_solve_mode, and libMesh::SystemSubset::get_system().

Referenced by libMesh::LinearImplicitSystem::clear(), and main().

112 {
113  _subset = subset;
114  _subset_solve_mode = subset_solve_mode;
115 
116  if (subset != nullptr)
117  libmesh_assert_equal_to (&subset->get_system(), this);
118 }
SubsetSolveMode _subset_solve_mode
If restrict-solve-to-subset mode is active, this member decides what happens with the dofs outside th...
const SystemSubset * _subset
The current subset on which to solve (or nullptr if none).

◆ restrict_vectors()

void libMesh::System::restrict_vectors ( )
virtualinherited

Restrict vectors after the mesh has coarsened.

Definition at line 374 of file system.C.

References libMesh::System::_dof_map, libMesh::System::_solution_projection, libMesh::System::_vector_projections, libMesh::System::_vectors, libMesh::System::current_local_solution, libMesh::NumericVector< T >::get(), libMesh::GHOSTED, libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), libMesh::PARALLEL, libMesh::System::project_vector(), libMesh::System::solution, and libMesh::System::vector_is_adjoint().

Referenced by libMesh::System::prolong_vectors(), and libMesh::EquationSystems::reinit_solutions().

375 {
376  parallel_object_only();
377 
378 #ifdef LIBMESH_ENABLE_AMR
379  // Restrict the _vectors on the coarsened cells
380  for (auto & [vec_name, vec] : _vectors)
381  {
382  NumericVector<Number> * v = vec.get();
383 
384  if (_vector_projections[vec_name])
385  {
386  this->project_vector (*v, this->vector_is_adjoint(vec_name));
387  }
388  else
389  {
390  const ParallelType type = vec->type();
391 
392  if (type == GHOSTED)
393  {
394 #ifdef LIBMESH_ENABLE_GHOSTED
395  vec->init (this->n_dofs(), this->n_local_dofs(),
396  _dof_map->get_send_list(), /*fast=*/false,
397  GHOSTED);
398 #else
399  libmesh_error_msg("Cannot initialize ghosted vectors when they are not enabled.");
400 #endif
401  }
402  else
403  vec->init (this->n_dofs(), this->n_local_dofs(), false, type);
404  }
405  }
406 
407  const std::vector<dof_id_type> & send_list = _dof_map->get_send_list ();
408 
409  // Restrict the solution on the coarsened cells
411  this->project_vector (*solution);
412  // Or at least make sure the solution vector is the correct size
413  else
414  solution->init (this->n_dofs(), this->n_local_dofs(), true, PARALLEL);
415 
416 #ifdef LIBMESH_ENABLE_GHOSTED
417  current_local_solution->init(this->n_dofs(),
418  this->n_local_dofs(), send_list,
419  false, GHOSTED);
420 #else
421  current_local_solution->init(this->n_dofs());
422 #endif
423 
425  solution->localize (*current_local_solution, send_list);
426 
427 #endif // LIBMESH_ENABLE_AMR
428 }
int vector_is_adjoint(std::string_view vec_name) const
Definition: system.C:1160
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2225
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260
dof_id_type n_local_dofs() const
Definition: system.C:155
dof_id_type n_dofs() const
Definition: system.C:118
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
bool _solution_projection
Holds true if the solution vector should be projected onto a changed grid, false if it should be zero...
Definition: system.h:2294
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1667
template class LIBMESH_EXPORT NumericVector< Number >
void project_vector(NumericVector< Number > &new_vector, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, int is_adjoint=-1, std::optional< ConstElemRange > active_local_range=std::nullopt, std::optional< std::vector< unsigned int >> variable_numbers=std::nullopt) const
Projects arbitrary functions onto a vector of degree of freedom values for the current system...
std::map< std::string, bool, std::less<> > _vector_projections
Holds true if a vector by that name should be projected onto a changed grid, false if it should be ze...
Definition: system.h:2266
ParallelType
Defines an enum for parallel data structure types.

◆ sensitivity_solve()

std::pair< unsigned int, Real > libMesh::ImplicitSystem::sensitivity_solve ( const ParameterVector parameters)
overridevirtualinherited

Assembles & solves the linear system(s) (dR/du)*u_p = -dR/dp, for those parameters contained within parameters.

Returns
A pair with the total number of linear iterations performed and the (sum of the) final residual norms

Reimplemented from libMesh::System.

Definition at line 140 of file implicit_system.C.

References libMesh::System::add_sensitivity_solution(), libMesh::System::assemble_before_solve, libMesh::ImplicitSystem::assemble_residual_derivatives(), libMesh::ImplicitSystem::assembly(), libMesh::SparseMatrix< T >::close(), libMesh::DofMap::enforce_constraints_exactly(), libMesh::System::get_dof_map(), libMesh::ImplicitSystem::get_linear_solve_parameters(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::System::get_sensitivity_rhs(), libMesh::System::get_sensitivity_solution(), libMesh::make_range(), libMesh::ImplicitSystem::matrix, libMesh::System::request_matrix(), libMesh::ParameterVector::size(), and libMesh::LinearSolver< T >::solve().

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

141 {
142  // Log how long the linear solve takes.
143  LOG_SCOPE("sensitivity_solve()", "ImplicitSystem");
144 
145  // The forward system should now already be solved.
146  // Now assemble the corresponding sensitivity system.
147 
148  if (this->assemble_before_solve)
149  {
150  // Build the Jacobian
151  this->assembly(false, true);
152  this->matrix->close();
153 
154  // Reset and build the RHS from the residual derivatives
155  this->assemble_residual_derivatives(parameters_vec);
156  }
157 
158  // The sensitivity problem is linear
159  LinearSolver<Number> * solver = this->get_linear_solver();
160 
161  // Our iteration counts and residuals will be sums of the individual
162  // results
163  std::pair<unsigned int, Real> solver_params =
165  std::pair<unsigned int, Real> totalrval = std::make_pair(0,0.0);
166 
167  // Solve the linear system.
168  SparseMatrix<Number> * pc = this->request_matrix("Preconditioner");
169  for (auto p : make_range(parameters_vec.size()))
170  {
171  std::pair<unsigned int, Real> rval =
172  solver->solve (*matrix, pc,
173  this->add_sensitivity_solution(p),
174  this->get_sensitivity_rhs(p),
175  double(solver_params.second),
176  solver_params.first);
177 
178  totalrval.first += rval.first;
179  totalrval.second += rval.second;
180  }
181 
182  // The linear solver may not have fit our constraints exactly
183 #ifdef LIBMESH_ENABLE_CONSTRAINTS
184  for (auto p : make_range(parameters_vec.size()))
186  (*this, &this->get_sensitivity_solution(p),
187  /* homogeneous = */ true);
188 #endif
189 
190  return totalrval;
191 }
virtual std::pair< unsigned int, Real > get_linear_solve_parameters() const
NumericVector< Number > & get_sensitivity_solution(unsigned int i=0)
Definition: system.C:1179
NumericVector< Number > & get_sensitivity_rhs(unsigned int i=0)
Definition: system.C:1324
virtual LinearSolver< Number > * get_linear_solver() const
const SparseMatrix< Number > * request_matrix(std::string_view mat_name) const
Definition: system.C:1087
virtual void assembly(bool, bool, bool=false, bool=false)
Assembles a residual in rhs and/or a jacobian in matrix, as requested.
template class LIBMESH_EXPORT LinearSolver< Number >
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
template class LIBMESH_EXPORT SparseMatrix< Number >
SparseMatrix< Number > * matrix
The system matrix.
virtual void assemble_residual_derivatives(const ParameterVector &parameters) override
Residual parameter derivative function.
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
NumericVector< Number > & add_sensitivity_solution(unsigned int i=0)
Definition: system.C:1169
bool assemble_before_solve
Flag which tells the system to whether or not to call the user assembly function during each call to ...
Definition: system.h:1609
const DofMap & get_dof_map() const
Definition: system.h:2417
void enforce_constraints_exactly(const System &system, NumericVector< Number > *v=nullptr, bool homogeneous=false) const
Constrains the numeric vector v, which represents a solution defined on the mesh. ...
Definition: dof_map.h:2518

◆ set_abs_training_tolerance()

void libMesh::RBConstruction::set_abs_training_tolerance ( Real  new_training_tolerance)
inline

Get/set the absolute tolerance for the basis training.

Definition at line 225 of file rb_construction.h.

References abs_training_tolerance.

Referenced by set_rb_construction_parameters().

226  {this->abs_training_tolerance = new_training_tolerance; }

◆ set_adjoint_already_solved()

void libMesh::System::set_adjoint_already_solved ( bool  setting)
inlineinherited

Setter for the adjoint_already_solved boolean.

Definition at line 417 of file system.h.

References libMesh::System::adjoint_already_solved.

Referenced by main().

418  { adjoint_already_solved = setting;}
bool adjoint_already_solved
Has the adjoint problem already been solved? If the user sets adjoint_already_solved to true...
Definition: system.h:2332

◆ set_basic_system_only()

void libMesh::System::set_basic_system_only ( )
inlineinherited

Sets the system to be "basic only": i.e.

advanced system components such as ImplicitSystem matrices may not be initialized. This is useful for efficiency in certain utility programs that never use System::solve(). This method must be called after the System or derived class is created but before it is initialized; e.g. from within EquationSystems::read()

Definition at line 2465 of file system.h.

References libMesh::System::_basic_system_only.

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

2466 {
2467  _basic_system_only = true;
2468 }
bool _basic_system_only
Holds true if the components of more advanced system types (e.g.
Definition: system.h:2300

◆ set_context_solution_vec()

void libMesh::RBConstruction::set_context_solution_vec ( NumericVector< Number > &  vec)
protectedvirtual

Set current_local_solution = vec so that we can access vec from FEMContext during assembly.

Override in subclasses if different behavior is required.

Definition at line 962 of file rb_construction.C.

References libMesh::System::current_local_solution, libMesh::System::get_dof_map(), and libMesh::NumericVector< T >::localize().

963 {
964  // Set current_local_solution = vec so that we can access
965  // vec from DGFEMContext during assembly
966  vec.localize
967  (*current_local_solution, this->get_dof_map().get_send_list());
968 }
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1667
const DofMap & get_dof_map() const
Definition: system.h:2417
virtual void localize(std::vector< T > &v_local) const =0
Creates a copy of the global vector in the local vector v_local.

◆ set_convergence_assertion_flag()

void libMesh::RBConstruction::set_convergence_assertion_flag ( bool  flag)

Setter for the flag determining if convergence should be checked after each solve.

Definition at line 2750 of file rb_construction.C.

References assert_convergence.

2751 {
2752  assert_convergence = flag;
2753 }
bool assert_convergence
A boolean flag to indicate whether to check for proper convergence after each solve.

◆ set_current_training_parameter_index()

void libMesh::RBConstruction::set_current_training_parameter_index ( unsigned int  index)
protected

Definition at line 2770 of file rb_construction.C.

References _current_training_parameter_index.

Referenced by compute_max_error_bound().

2771 {
2773 }
unsigned int _current_training_parameter_index
The current training parameter index during reduced basis training.

◆ set_deterministic_training_parameter_name()

void libMesh::RBConstructionBase< LinearImplicitSystem >::set_deterministic_training_parameter_name ( const std::string &  name)
inherited

In some cases we only want to allow discrete parameter values, instead of parameters that may take any value in a specified interval.

Here we provide a method to set the d Set the discrete values for parameter mu that are allowed in the training set. This must be called before the training set is generated. Set the name of the parameter that we will generate deterministic training parameters for. Defaults to "NONE".

◆ set_energy_inner_product()

void libMesh::RBConstruction::set_energy_inner_product ( const std::vector< Number > &  energy_inner_product_coeffs_in)

Specify the coefficients of the A_q operators to be used in the energy inner-product.

Definition at line 438 of file rb_construction.C.

References energy_inner_product_coeffs, and use_energy_inner_product.

439 {
441  energy_inner_product_coeffs = energy_inner_product_coeffs_in;
442 }
std::vector< Number > energy_inner_product_coeffs
We may optionally want to use the "energy inner-product" rather than the inner-product assembly speci...
bool use_energy_inner_product
Boolean to indicate whether we&#39;re using the energy inner-product.

◆ set_inner_product_assembly()

void libMesh::RBConstruction::set_inner_product_assembly ( ElemAssembly inner_product_assembly_in)

Set the rb_assembly_expansion object.

Definition at line 421 of file rb_construction.C.

References inner_product_assembly, and use_energy_inner_product.

Referenced by SimpleRBConstruction::init_data().

422 {
423  use_energy_inner_product = false;
424  inner_product_assembly = &inner_product_assembly_in;
425 }
bool use_energy_inner_product
Boolean to indicate whether we&#39;re using the energy inner-product.
ElemAssembly * inner_product_assembly
Pointer to inner product assembly.

◆ set_Nmax()

void libMesh::RBConstruction::set_Nmax ( unsigned int  Nmax)
virtual

Definition at line 1703 of file rb_construction.C.

References Nmax.

Referenced by set_rb_construction_parameters().

1704 {
1705  this->Nmax = Nmax_in;
1706 }
unsigned int Nmax
Maximum number of reduced basis functions we are willing to use.

◆ set_normalize_rb_bound_in_greedy()

void libMesh::RBConstruction::set_normalize_rb_bound_in_greedy ( bool  normalize_rb_bound_in_greedy_in)
inline

Get/set the boolean to indicate if we normalize the RB error in the greedy.

Definition at line 232 of file rb_construction.h.

References normalize_rb_bound_in_greedy.

Referenced by set_rb_construction_parameters().

233  {this->normalize_rb_bound_in_greedy = normalize_rb_bound_in_greedy_in; }
bool normalize_rb_bound_in_greedy
This boolean indicates if we normalize the RB error in the greedy using RBEvaluation::get_error_bound...

◆ set_normalize_solution_snapshots()

void libMesh::RBConstructionBase< LinearImplicitSystem >::set_normalize_solution_snapshots ( bool  value)
inherited

Set the boolean option that indicates if we normalization solution snapshots or not.

Definition at line 147 of file rb_construction_base.C.

148 {
150 }
bool _normalize_solution_snapshots
Set this boolean to true if we want to normalize solution snapshots used in training to have norm of ...
static const bool value
Definition: xdr_io.C:55

◆ set_parameters()

bool libMesh::RBParametrized::set_parameters ( const RBParameters params)
inherited

Set the current parameters to params The parameters are checked for validity; an error is thrown if the number of parameters or samples is different than expected.

We

Returns
a boolean true if the new parameters are within the min/max range, and false otherwise (but the parameters are set regardless). Enabling the "verbose_mode" flag will also print more details.

Definition at line 129 of file rb_parametrized.C.

References libMesh::RBParametrized::check_if_valid_params(), libMesh::RBParametrized::parameters, and libMesh::RBParametrized::parameters_initialized.

Referenced by libMesh::RBSCMConstruction::compute_SCM_bounds_on_training_set(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_interiors(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_nodes(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_sides(), get_RB_error_bound(), SimpleRBEvaluation::get_stability_lower_bound(), libMesh::RBParametrized::initialize_parameters(), libMesh::RBSCMEvaluation::reload_current_parameters(), libMesh::RBSCMEvaluation::set_current_parameters_from_C_J(), and RBParametersTest::testRBParametrized().

130 {
131  libmesh_error_msg_if(!parameters_initialized, "Error: parameters not initialized in RBParametrized::set_parameters");
132 
133  // Terminate if params has the wrong number of parameters or samples.
134  // If the parameters are outside the min/max range, return false.
135  const bool valid_params = check_if_valid_params(params);
136 
137  // Make a copy of params (default assignment operator just does memberwise copy, which is sufficient here)
138  this->parameters = params;
139 
140  return valid_params;
141 }
bool parameters_initialized
Flag indicating whether the parameters have been initialized.
bool check_if_valid_params(const RBParameters &params) const
Helper function to check that params is valid:
RBParameters parameters
Vector storing the current parameters.

◆ set_params_from_training_set()

void libMesh::RBConstructionBase< LinearImplicitSystem >::set_params_from_training_set ( unsigned int  global_index)
protectedinherited

Set parameters to the RBParameters stored in index global_index of the global training set.

Definition at line 225 of file rb_construction_base.C.

Referenced by compute_max_error_bound(), preevaluate_thetas(), and train_reduced_basis_with_POD().

226 {
228 }
bool set_parameters(const RBParameters &params)
Set the current parameters to params The parameters are checked for validity; an error is thrown if t...
RBParameters get_params_from_training_set(unsigned int global_index)
Return the RBParameters in index global_index of the global training set.

◆ set_params_from_training_set_and_broadcast()

void libMesh::RBConstructionBase< LinearImplicitSystem >::set_params_from_training_set_and_broadcast ( unsigned int  global_index)
protectedvirtualinherited

Load the specified training parameter and then broadcast to all processors.

Definition at line 270 of file rb_construction_base.C.

271 {
272  libmesh_error_msg_if(!_training_parameters_initialized,
273  "Error: training parameters must first be initialized.");
274 
275  processor_id_type root_id = 0;
276  if ((this->get_first_local_training_index() <= global_index) &&
277  (global_index < this->get_last_local_training_index()))
278  {
279  // Set parameters on only one processor
280  set_params_from_training_set(global_index);
281 
282  // set root_id, only non-zero on one processor
283  root_id = this->processor_id();
284  }
285 
286  // broadcast
287  this->comm().max(root_id);
288  broadcast_parameters(root_id);
289 }
numeric_index_type get_first_local_training_index() const
Get the first local index of the training parameters.
const Parallel::Communicator & comm() const
void broadcast_parameters(const unsigned int proc_id)
Broadcasts parameters from processor proc_id to all processors.
uint8_t processor_id_type
numeric_index_type get_last_local_training_index() const
Get the last local index of the training parameters.
void set_params_from_training_set(unsigned int global_index)
Set parameters to the RBParameters stored in index global_index of the global training set...
void max(const T &r, T &o, Request &req) const
processor_id_type processor_id() const
bool _training_parameters_initialized
Boolean flag to indicate whether or not the parameter ranges have been initialized.

◆ set_preevaluate_thetas_flag()

void libMesh::RBConstruction::set_preevaluate_thetas_flag ( bool  flag)

Definition at line 2760 of file rb_construction.C.

References _preevaluate_thetas_flag.

2761 {
2762  _preevaluate_thetas_flag = flag;
2763 }
bool _preevaluate_thetas_flag
Flag to indicate if we preevaluate the theta functions.

◆ set_project_with_constraints()

void libMesh::System::set_project_with_constraints ( bool  _project_with_constraints)
inlineinherited

Definition at line 1842 of file system.h.

References libMesh::System::project_with_constraints.

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

1843  {
1844  project_with_constraints = _project_with_constraints;
1845  }
bool project_with_constraints
Do we want to apply constraints while projecting vectors ?
Definition: system.h:2343

◆ set_qoi() [1/2]

void libMesh::System::set_qoi ( unsigned int  qoi_index,
Number  qoi_value 
)
inherited

Definition at line 2171 of file system.C.

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

Referenced by libMesh::ExplicitSystem::assemble_qoi(), libMesh::FEMSystem::assemble_qoi(), libMesh::Euler2Solver::integrate_qoi_timestep(), libMesh::TwostepTimeSolver::integrate_qoi_timestep(), and libMesh::EulerSolver::integrate_qoi_timestep().

2172 {
2173  libmesh_assert(qoi_index < _qoi.size());
2174 
2175  _qoi[qoi_index] = qoi_value;
2176 }
std::vector< Number > _qoi
Values of the quantities of interest.
Definition: system.h:2367
libmesh_assert(ctx)

◆ set_qoi() [2/2]

void libMesh::System::set_qoi ( std::vector< Number new_qoi)
inherited

Definition at line 2192 of file system.C.

References libMesh::System::_qoi.

2193 {
2194  libmesh_assert_equal_to(this->_qoi.size(), new_qoi.size());
2195  this->_qoi = std::move(new_qoi);
2196 }
std::vector< Number > _qoi
Values of the quantities of interest.
Definition: system.h:2367

◆ set_qoi_error_estimate()

void libMesh::System::set_qoi_error_estimate ( unsigned int  qoi_index,
Number  qoi_error_estimate 
)
inherited

Definition at line 2199 of file system.C.

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

Referenced by libMesh::Euler2Solver::integrate_adjoint_refinement_error_estimate(), libMesh::TwostepTimeSolver::integrate_adjoint_refinement_error_estimate(), and libMesh::EulerSolver::integrate_adjoint_refinement_error_estimate().

2200 {
2201  libmesh_assert(qoi_index < _qoi_error_estimates.size());
2202 
2203  _qoi_error_estimates[qoi_index] = qoi_error_estimate;
2204 }
libmesh_assert(ctx)
std::vector< Number > _qoi_error_estimates
Vector to hold error estimates for qois, either from a steady state calculation, or from a single uns...
Definition: system.h:2377

◆ set_quiet_mode()

void libMesh::RBConstructionBase< LinearImplicitSystem >::set_quiet_mode ( bool  quiet_mode_in)
inlineinherited

Set the quiet_mode flag.

If quiet == false then we print out a lot of extra information during the Offline stage.

Definition at line 100 of file rb_construction_base.h.

Referenced by set_rb_construction_parameters().

101  { this->quiet_mode = quiet_mode_in; }
bool quiet_mode
Flag to indicate whether we print out extra information during the Offline stage. ...

◆ set_rb_assembly_expansion()

void libMesh::RBConstruction::set_rb_assembly_expansion ( RBAssemblyExpansion rb_assembly_expansion_in)

Set the rb_assembly_expansion object.

Definition at line 409 of file rb_construction.C.

References rb_assembly_expansion.

Referenced by SimpleRBConstruction::init_data().

410 {
411  rb_assembly_expansion = &rb_assembly_expansion_in;
412 }
RBAssemblyExpansion * rb_assembly_expansion
This member holds the (parameter independent) assembly functors that define the "affine expansion" of...

◆ set_rb_construction_parameters()

void libMesh::RBConstruction::set_rb_construction_parameters ( unsigned int  n_training_samples_in,
bool  deterministic_training_in,
int  training_parameters_random_seed_in,
bool  quiet_mode_in,
unsigned int  Nmax_in,
Real  rel_training_tolerance_in,
Real  abs_training_tolerance_in,
bool  normalize_rb_error_bound_in_greedy_in,
const std::string &  RB_training_type_in,
const RBParameters mu_min_in,
const RBParameters mu_max_in,
const std::map< std::string, std::vector< Real >> &  discrete_parameter_values_in,
const std::map< std::string, bool > &  log_scaling,
std::map< std::string, std::vector< RBParameter >> *  training_sample_list = nullptr 
)

Set the state of this RBConstruction object based on the arguments to this function.

Definition at line 290 of file rb_construction.C.

References libMesh::RBParametrized::get_parameters_max(), libMesh::RBParametrized::get_parameters_min(), libMesh::RBParametrized::initialize_parameters(), libMesh::RBConstructionBase< LinearImplicitSystem >::initialize_training_parameters(), libMesh::RBConstructionBase< LinearImplicitSystem >::load_training_set(), set_abs_training_tolerance(), set_Nmax(), set_normalize_rb_bound_in_greedy(), libMesh::RBConstructionBase< LinearImplicitSystem >::set_quiet_mode(), set_RB_training_type(), set_rel_training_tolerance(), and libMesh::RBConstructionBase< LinearImplicitSystem >::set_training_random_seed().

Referenced by process_parameters_file().

305 {
306  // Read in training_parameters_random_seed value. This is used to
307  // seed the RNG when picking the training parameters. By default the
308  // value is -1, which means use std::time to seed the RNG.
309  set_training_random_seed(training_parameters_random_seed_in);
310 
311  // Set quiet mode
312  set_quiet_mode(quiet_mode_in);
313 
314  // Initialize RB parameters
315  set_Nmax(Nmax_in);
316 
317  set_rel_training_tolerance(rel_training_tolerance_in);
318  set_abs_training_tolerance(abs_training_tolerance_in);
319 
320  set_normalize_rb_bound_in_greedy(normalize_rb_bound_in_greedy_in);
321 
322  set_RB_training_type(RB_training_type_in);
323 
324  // Initialize the parameter ranges and the parameters themselves
325  initialize_parameters(mu_min_in, mu_max_in, discrete_parameter_values_in);
326 
327  bool updated_deterministic_training = deterministic_training_in;
328  if (training_sample_list && (this->get_parameters_min().n_parameters() > 3))
329  {
330  // In this case we force deterministic_training to be false because
331  // a) deterministic training samples are not currrently supported with
332  // more than 3 parameters, and
333  // b) we will overwrite the training samples anyway in the call to
334  // load_training_set() below, so we do not want to generate an
335  // error due to deterministic training sample generation when
336  // the samples will be overwritten anyway.
337  updated_deterministic_training = false;
338  }
339 
341  this->get_parameters_max(),
342  n_training_samples_in,
343  log_scaling_in,
344  updated_deterministic_training); // use deterministic parameters
345 
346  if (training_sample_list)
347  {
348  // Note that we must call initialize_training_parameters() before
349  // load_training_set() in order to initialize the parameter vectors.
350  load_training_set(*training_sample_list);
351  }
352 }
void set_RB_training_type(const std::string &RB_training_type_in)
Get/set the string that determines the training type.
const RBParameters & get_parameters_max() const
Get an RBParameters object that specifies the maximum allowable value for each parameter.
void set_quiet_mode(bool quiet_mode_in)
Set the quiet_mode flag.
virtual void load_training_set(const std::map< std::string, std::vector< RBParameter >> &new_training_set)
Overwrite the training parameters with new_training_set.
virtual void initialize_training_parameters(const RBParameters &mu_min, const RBParameters &mu_max, const unsigned int n_global_training_samples, const std::map< std::string, bool > &log_param_scale, const bool deterministic=true)
Initialize the parameter ranges and indicate whether deterministic or random training parameters shou...
void set_training_random_seed(int seed)
Set the seed that is used to randomly generate training parameters.
const RBParameters & get_parameters_min() const
Get an RBParameters object that specifies the minimum allowable value for each parameter.
void set_abs_training_tolerance(Real new_training_tolerance)
Get/set the absolute tolerance for the basis training.
void set_normalize_rb_bound_in_greedy(bool normalize_rb_bound_in_greedy_in)
Get/set the boolean to indicate if we normalize the RB error in the greedy.
virtual void set_Nmax(unsigned int Nmax)
void set_rel_training_tolerance(Real new_training_tolerance)
Get/set the relative tolerance for the basis training.
void initialize_parameters(const RBParameters &mu_min_in, const RBParameters &mu_max_in, const std::map< std::string, std::vector< Real >> &discrete_parameter_values)
Initialize the parameter ranges and set current_parameters.

◆ set_rb_evaluation()

void libMesh::RBConstruction::set_rb_evaluation ( RBEvaluation rb_eval_in)

Set the RBEvaluation object.

Definition at line 174 of file rb_construction.C.

References rb_eval.

Referenced by main().

175 {
176  rb_eval = &rb_eval_in;
177 }
RBEvaluation * rb_eval
The current RBEvaluation object we are using to perform the Evaluation stage of the reduced basis met...

◆ set_RB_training_type()

void libMesh::RBConstruction::set_RB_training_type ( const std::string &  RB_training_type_in)

Get/set the string that determines the training type.

Definition at line 1686 of file rb_construction.C.

References is_serial_training_type(), RB_training_type, and libMesh::RBConstructionBase< LinearImplicitSystem >::serial_training_set.

Referenced by set_rb_construction_parameters().

1687 {
1688  this->RB_training_type = RB_training_type_in;
1689 
1690  if(is_serial_training_type(RB_training_type_in))
1691  {
1692  // We need to use a serial training set (so that the training
1693  // set is the same on all processes) if we're using POD
1694  this->serial_training_set = true;
1695  }
1696 }
std::string RB_training_type
This string indicates the type of training that we will use.
virtual bool is_serial_training_type(const std::string &RB_training_type_in)
bool serial_training_set
This boolean flag indicates whether or not the training set should be the same on all processors...

◆ set_rel_training_tolerance()

void libMesh::RBConstruction::set_rel_training_tolerance ( Real  new_training_tolerance)
inline

Get/set the relative tolerance for the basis training.

Definition at line 218 of file rb_construction.h.

References rel_training_tolerance.

Referenced by set_rb_construction_parameters().

219  {this->rel_training_tolerance = new_training_tolerance; }
Real rel_training_tolerance
Relative and absolute tolerances for training reduced basis using the Greedy scheme.

◆ set_training_parameter_values()

void libMesh::RBConstructionBase< LinearImplicitSystem >::set_training_parameter_values ( const std::string &  param_name,
const std::vector< RBParameter > &  values 
)
inherited

Overwrite the local training samples for param_name using values.

This assumes that values.size() matches get_local_n_training_samples().

Definition at line 456 of file rb_construction_base.C.

458 {
459  libmesh_error_msg_if(!_training_parameters_initialized,
460  "Training parameters must be initialized before calling set_training_parameter_values");
461  libmesh_error_msg_if(values.size() != get_local_n_training_samples(),
462  "Inconsistent sizes");
463 
464  // Copy the new data, overwriting the old data.
465  auto & training_vector = libmesh_map_find(_training_parameters, param_name);
466  training_vector = values;
467 }
numeric_index_type get_local_n_training_samples() const
Get the total number of training samples local to this processor.
std::map< std::string, std::vector< RBParameter > > _training_parameters
The training samples for each parameter.
bool _training_parameters_initialized
Boolean flag to indicate whether or not the parameter ranges have been initialized.

◆ set_training_random_seed()

void libMesh::RBConstructionBase< LinearImplicitSystem >::set_training_random_seed ( int  seed)
inherited

Set the seed that is used to randomly generate training parameters.

Definition at line 780 of file rb_construction_base.C.

Referenced by set_rb_construction_parameters().

781 {
783 }
int _training_parameters_random_seed
If < 0, use std::time() * processor_id() to seed the random number generator for the training paramet...

◆ set_vector_as_adjoint()

void libMesh::System::set_vector_as_adjoint ( const std::string &  vec_name,
int  qoi_num 
)
inherited

Allows one to set the QoI index controlling whether the vector identified by vec_name represents a solution from the adjoint (qoi_num >= 0) or primal (qoi_num == -1) space.

This becomes significant if those spaces have differing heterogeneous Dirichlet constraints.

qoi_num == -2 can be used to indicate a vector which should not be affected by constraints during projection operations.

Definition at line 1147 of file system.C.

References libMesh::System::_vector_is_adjoint.

Referenced by libMesh::System::add_adjoint_solution(), and libMesh::System::add_weighted_sensitivity_adjoint_solution().

1149 {
1150  parallel_object_only(); // Not strictly needed, but the only safe way to keep in sync
1151 
1152  // We reserve -1 for vectors which get primal constraints, -2 for
1153  // vectors which get no constraints
1154  libmesh_assert_greater_equal(qoi_num, -2);
1155  _vector_is_adjoint[vec_name] = qoi_num;
1156 }
std::map< std::string, int, std::less<> > _vector_is_adjoint
Holds non-negative if a vector by that name should be projected using adjoint constraints/BCs, -1 if primal.
Definition: system.h:2272

◆ set_vector_preservation()

void libMesh::System::set_vector_preservation ( const std::string &  vec_name,
bool  preserve 
)
inherited

Allows one to set the boolean controlling whether the vector identified by vec_name should be "preserved": projected to new meshes, saved, etc.

Definition at line 1125 of file system.C.

References libMesh::System::_vector_projections.

Referenced by libMesh::AdjointRefinementEstimator::estimate_error(), and main().

1127 {
1128  parallel_object_only(); // Not strictly needed, but the only safe way to keep in sync
1129 
1130  _vector_projections[vec_name] = preserve;
1131 }
std::map< std::string, bool, std::less<> > _vector_projections
Holds true if a vector by that name should be projected onto a changed grid, false if it should be ze...
Definition: system.h:2266

◆ setup_static_condensation_preconditioner()

template<typename T >
template void libMesh::ImplicitSystem::setup_static_condensation_preconditioner ( T &  solver)
protectedinherited

◆ solve()

void libMesh::LinearImplicitSystem::solve ( )
overridevirtualinherited

Assembles & solves the linear system A*x=b.

Reimplemented from libMesh::ImplicitSystem.

Reimplemented in libMesh::FrequencySystem.

Definition at line 122 of file linear_implicit_system.C.

References libMesh::LinearImplicitSystem::_final_linear_residual, libMesh::LinearImplicitSystem::_n_linear_iterations, libMesh::LinearImplicitSystem::_shell_matrix, libMesh::LinearImplicitSystem::_subset, libMesh::LinearImplicitSystem::_subset_solve_mode, libMesh::LinearImplicitSystem::assemble(), libMesh::System::assemble_before_solve, libMesh::SystemSubset::dof_ids(), libMesh::ImplicitSystem::get_linear_solve_parameters(), libMesh::ImplicitSystem::linear_solver, libMesh::ImplicitSystem::matrix, libMesh::System::prefix(), libMesh::System::prefix_with_name(), libMesh::System::request_matrix(), libMesh::ExplicitSystem::rhs, libMesh::System::solution, and libMesh::System::update().

Referenced by assemble_and_solve(), main(), libMesh::ClawSystem::solve_conservation_law(), SystemsTest::testDofCouplingWithVarGroups(), PeriodicBCTest::testPeriodicBC(), DisjointNeighborTest::testTempJump(), and DisjointNeighborTest::testTempJumpRefine().

123 {
124  if (this->assemble_before_solve)
125  // Assemble the linear system
126  this->assemble ();
127 
128  // If the linear solver hasn't been initialized, we do so here.
129  if (this->prefix_with_name())
130  linear_solver->init(this->prefix().c_str());
131  else
132  linear_solver->init();
133 
134  linear_solver->init_systems(*this);
135 
136  // Get the user-specified linear solver tolerance
137  const auto [maxits, tol] = this->get_linear_solve_parameters();
138 
139  if (_subset != nullptr)
140  linear_solver->restrict_solve_to(&_subset->dof_ids(),_subset_solve_mode);
141 
142  // Solve the linear system. Several cases:
143  std::pair<unsigned int, Real> rval = std::make_pair(0,0.0);
144  if (_shell_matrix)
145  // 1.) Shell matrix with or without user-supplied preconditioner.
146  rval = linear_solver->solve(*_shell_matrix, this->request_matrix("Preconditioner"), *solution, *rhs, tol, maxits);
147  else
148  // 2.) No shell matrix, with or without user-supplied preconditioner
149  rval = linear_solver->solve (*matrix, this->request_matrix("Preconditioner"), *solution, *rhs, tol, maxits);
150 
151  if (_subset != nullptr)
152  linear_solver->restrict_solve_to(nullptr);
153 
154  // Store the number of linear iterations required to
155  // solve and the final residual.
156  _n_linear_iterations = rval.first;
157  _final_linear_residual = rval.second;
158 
159  // Update the system after the solve
160  this->update();
161 }
virtual void assemble() override
Prepares matrix and _dof_map for matrix assembly.
ShellMatrix< Number > * _shell_matrix
User supplies shell matrix or nullptr if no shell matrix is used.
unsigned int _n_linear_iterations
The number of linear iterations required to solve the linear system Ax=b.
virtual std::pair< unsigned int, Real > get_linear_solve_parameters() const
NumericVector< Number > * rhs
The system matrix.
SubsetSolveMode _subset_solve_mode
If restrict-solve-to-subset mode is active, this member decides what happens with the dofs outside th...
const SparseMatrix< Number > * request_matrix(std::string_view mat_name) const
Definition: system.C:1087
std::string prefix() const
Definition: system.h:1980
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
virtual const std::vector< unsigned int > & dof_ids() const =0
Real _final_linear_residual
The final residual for the linear system Ax=b.
virtual void update()
Update the local values to reflect the solution on neighboring processors.
Definition: system.C:498
SparseMatrix< Number > * matrix
The system matrix.
const SystemSubset * _subset
The current subset on which to solve (or nullptr if none).
bool assemble_before_solve
Flag which tells the system to whether or not to call the user assembly function during each call to ...
Definition: system.h:1609
std::unique_ptr< LinearSolver< Number > > linear_solver
This class handles all the details of interfacing with various linear algebra packages like PETSc or ...
bool prefix_with_name() const
Definition: system.h:1974

◆ solve_for_matrix_and_rhs()

void libMesh::RBConstruction::solve_for_matrix_and_rhs ( LinearSolver< Number > &  input_solver,
SparseMatrix< Number > &  input_matrix,
NumericVector< Number > &  input_rhs 
)
virtual

Assembles & solves the linear system A*x=b for the specified matrix input_matrix and right-hand side rhs.

Definition at line 137 of file rb_construction.C.

References libMesh::LinearImplicitSystem::_final_linear_residual, libMesh::LinearImplicitSystem::_n_linear_iterations, libMesh::DofMap::enforce_constraints_exactly(), libMesh::Parameters::get(), libMesh::System::get_dof_map(), libMesh::System::get_equation_systems(), libMesh::LinearSolver< T >::init(), libMesh::EquationSystems::parameters, libMesh::Real, libMesh::System::solution, libMesh::LinearSolver< T >::solve(), and libMesh::System::update().

Referenced by compute_Fq_representor_innerprods(), compute_output_dual_innerprods(), compute_residual_dual_norm_slow(), enrich_basis_from_rhs_terms(), libMesh::TransientRBConstruction::truth_solve(), truth_solve(), libMesh::TransientRBConstruction::update_residual_terms(), and update_residual_terms().

140 {
141  // This is similar to LinearImplicitSysmte::solve()
142 
143  // Get a reference to the EquationSystems
144  const EquationSystems & es =
145  this->get_equation_systems();
146 
147  // If the linear solver hasn't been initialized, we do so here.
148  input_solver.init();
149 
150  // Get the user-specifiied linear solver tolerance
151  const double tol =
152  double(es.parameters.get<Real>("linear solver tolerance"));
153 
154  // Get the user-specified maximum # of linear solver iterations
155  const unsigned int maxits =
156  es.parameters.get<unsigned int>("linear solver maximum iterations");
157 
158  // It's good practice to clear the solution vector first since it can
159  // affect convergence of iterative solvers
160  solution->zero();
161 
162  // Solve the linear system.
163  // Store the number of linear iterations required to
164  // solve and the final residual.
166  input_solver.solve (input_matrix, *solution, input_rhs, tol, maxits);
167 
169 
170  // Update the system after the solve
171  this->update();
172 }
unsigned int _n_linear_iterations
The number of linear iterations required to solve the linear system Ax=b.
const EquationSystems & get_equation_systems() const
Definition: system.h:767
virtual void init(const char *name=nullptr)=0
Initialize data structures if not done so already.
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
virtual std::pair< unsigned int, Real > solve(SparseMatrix< T > &, NumericVector< T > &, NumericVector< T > &, const std::optional< double > tol=std::nullopt, const std::optional< unsigned int > m_its=std::nullopt)=0
This function calls the solver _solver_type preconditioned with the _preconditioner_type precondition...
Real _final_linear_residual
The final residual for the linear system Ax=b.
virtual void update()
Update the local values to reflect the solution on neighboring processors.
Definition: system.C:498
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const DofMap & get_dof_map() const
Definition: system.h:2417
void enforce_constraints_exactly(const System &system, NumericVector< Number > *v=nullptr, bool homogeneous=false) const
Constrains the numeric vector v, which represents a solution defined on the mesh. ...
Definition: dof_map.h:2518

◆ solve_for_unconstrained_dofs()

void libMesh::System::solve_for_unconstrained_dofs ( NumericVector< Number > &  vec,
int  is_adjoint = -1 
) const
inherited

Definition at line 2102 of file system_projection.C.

References libMesh::DofMap::build_sparsity(), libMesh::DofMap::computed_sparsity_already(), libMesh::DofMapBase::end_dof(), libMesh::DofMapBase::first_dof(), libMesh::NumericVector< T >::get(), libMesh::DofMap::heterogenously_constrain_element_matrix_and_vector(), libMesh::DofMap::is_constrained_dof(), libMesh::NumericVector< T >::local_size(), libMesh::DofMap::n_dofs(), libMesh::DofMap::n_local_dofs(), libMesh::PARALLEL, libMesh::Real, libMesh::NumericVector< T >::size(), and libMesh::DofMap::update_sparsity_pattern().

2104 {
2105  const DofMap & dof_map = this->get_dof_map();
2106 
2107  std::unique_ptr<SparseMatrix<Number>> mat =
2109 
2110  std::unique_ptr<SparsityPattern::Build> sp;
2111 
2112  if (dof_map.computed_sparsity_already())
2113  dof_map.update_sparsity_pattern(*mat);
2114  else
2115  {
2116  mat->attach_dof_map(dof_map);
2117  sp = dof_map.build_sparsity(this->get_mesh());
2118  mat->attach_sparsity_pattern(*sp);
2119  }
2120 
2121  mat->init();
2122 
2123  libmesh_assert_equal_to(vec.size(), dof_map.n_dofs());
2124  libmesh_assert_equal_to(vec.local_size(), dof_map.n_local_dofs());
2125 
2126  std::unique_ptr<NumericVector<Number>> rhs =
2128 
2129  rhs->init(dof_map.n_dofs(), dof_map.n_local_dofs(), false,
2130  PARALLEL);
2131 
2132  // Here we start with the unconstrained (and indeterminate) linear
2133  // system, K*u = f, where K is the identity matrix for constrained
2134  // DoFs and 0 elsewhere, and f is the current solution values for
2135  // constrained DoFs and 0 elsewhere.
2136  // We then apply the usual heterogeneous constraint matrix C and
2137  // offset h, where u = C*x + h,
2138  // to get C^T*K*C*x = C^T*f - C^T*K*h
2139  // - a constrained and no-longer-singular system that finds the
2140  // closest approximation for the unconstrained degrees of freedom.
2141  //
2142  // Here, though "closest" is in an algebraic sense; we're
2143  // effectively using a pseudoinverse that optimizes in a
2144  // discretization-dependent norm. That only seems to give ~0.1%
2145  // excess error even in coarse unit test cases, but at some point it
2146  // might be reasonable to weight K and f properly.
2147 
2148  for (dof_id_type d : IntRange<dof_id_type>(dof_map.first_dof(),
2149  dof_map.end_dof()))
2150  {
2151  if (dof_map.is_constrained_dof(d))
2152  {
2153  DenseMatrix<Number> K(1,1);
2154  DenseVector<Number> F(1);
2155  std::vector<dof_id_type> dof_indices(1, d);
2156  K(0,0) = 1;
2157  F(0) = (*this->solution)(d);
2158  dof_map.heterogenously_constrain_element_matrix_and_vector
2159  (K, F, dof_indices, false, is_adjoint);
2160  mat->add_matrix(K, dof_indices);
2161  rhs->add_vector(F, dof_indices);
2162  }
2163  }
2164 
2165  std::unique_ptr<LinearSolver<Number>> linear_solver =
2167 
2168  linear_solver->solve(*mat, vec, *rhs,
2169  double(this->get_equation_systems().parameters.get<Real>("linear solver tolerance")),
2170  this->get_equation_systems().parameters.get<unsigned int>("linear solver maximum iterations"));
2171 }
static std::unique_ptr< LinearSolver< T > > build(const libMesh::Parallel::Communicator &comm_in, const SolverPackage solver_package=libMesh::default_solver_package())
Builds a LinearSolver using the linear solver package specified by solver_package.
Definition: linear_solver.C:59
virtual numeric_index_type size() const =0
const EquationSystems & get_equation_systems() const
Definition: system.h:767
const Parallel::Communicator & comm() const
Parameters parameters
Parameters for the system. If a parameter is not provided, it should be retrieved from the EquationSy...
Definition: system.h:1588
const MeshBase & get_mesh() const
Definition: system.h:2401
static std::unique_ptr< SparseMatrix< T > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package(), const MatrixBuildType matrix_build_type=MatrixBuildType::AUTOMATIC)
Builds a SparseMatrix<T> using the linear solver package specified by solver_package.
const T & get(std::string_view) const
Definition: parameters.h:451
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual numeric_index_type local_size() const =0
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
const DofMap & get_dof_map() const
Definition: system.h:2417
uint8_t dof_id_type
Definition: id_types.h:67

◆ system()

sys_type& libMesh::RBConstruction::system ( )
inline
Returns
A reference to *this.

Definition at line 125 of file rb_construction.h.

125 { return *this; }

◆ system_type()

std::string libMesh::RBConstruction::system_type ( ) const
overridevirtual
Returns
A string indicating the type of the system.

Reimplemented from libMesh::LinearImplicitSystem.

Reimplemented in libMesh::TransientSystem< RBConstruction >.

Definition at line 132 of file rb_construction.C.

133 {
134  return "RBConstruction";
135 }

◆ train_reduced_basis()

Real libMesh::RBConstruction::train_reduced_basis ( const bool  resize_rb_eval_data = true)
virtual

Train the reduced basis.

This can use different approaches, e.g. Greedy or POD, which are chosen using the RB_training_type member variable.

In the case that we use Greedy training, this function returns the final maximum a posteriori error bound on the training set.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 1193 of file rb_construction.C.

References get_RB_training_type(), train_reduced_basis_with_greedy(), and train_reduced_basis_with_POD().

Referenced by main(), and libMesh::TransientRBConstruction::train_reduced_basis().

1194 {
1195  if(get_RB_training_type() == "Greedy")
1196  {
1197  return train_reduced_basis_with_greedy(resize_rb_eval_data);
1198  }
1199  else if (get_RB_training_type() == "POD")
1200  {
1202  return 0.;
1203  }
1204  else
1205  {
1206  libmesh_error_msg("RB training type not recognized: " + get_RB_training_type());
1207  }
1208 
1209  return 0.;
1210 }
const std::string & get_RB_training_type() const
Real train_reduced_basis_with_greedy(const bool resize_rb_eval_data)
Train the reduced basis using the "Greedy algorithm.".
void train_reduced_basis_with_POD()
Train the reduced basis using Proper Orthogonal Decomposition (POD).

◆ train_reduced_basis_with_greedy()

Real libMesh::RBConstruction::train_reduced_basis_with_greedy ( const bool  resize_rb_eval_data)

Train the reduced basis using the "Greedy algorithm.".

Each stage of the Greedy algorithm involves solving the reduced basis over a large training set and selecting the parameter at which the reduced basis error bound is largest, then performing a truth_solve at that parameter and enriching the reduced basis with the corresponding snapshot.

resize_rb_eval_data is a boolean flag to indicate whether or not we call rb_eval->resize_data_structures(Nmax). True by default, but we may set it to false if, for example, we are continuing from a previous training run and don't want to clobber the existing rb_eval data.

Returns
The final maximum a posteriori error bound on the training set.

Definition at line 1212 of file rb_construction.C.

References check_if_zero_truth_solve(), compute_Fq_representor_innerprods(), compute_max_error_bound(), compute_output_dual_innerprods(), enrich_RB_space(), libMesh::RBEvaluation::get_n_basis_functions(), get_Nmax(), get_preevaluate_thetas_flag(), get_rb_evaluation(), libMesh::RBEvaluation::greedy_param_list, greedy_termination_test(), libMesh::RBParametrized::initialize_parameters(), libMesh::out, preevaluate_thetas(), libMesh::RBParametrized::print_parameters(), libMesh::Real, libMesh::RBEvaluation::resize_data_structures(), skip_residual_in_train_reduced_basis, truth_solve(), update_greedy_param_list(), update_residual_terms(), update_system(), and use_empty_rb_solve_in_greedy.

Referenced by train_reduced_basis().

1213 {
1214  LOG_SCOPE("train_reduced_basis_with_greedy()", "RBConstruction");
1215 
1216  int count = 0;
1217 
1218  RBEvaluation & rbe = get_rb_evaluation();
1219 
1220  // initialize rbe's parameters
1221  rbe.initialize_parameters(*this);
1222 
1223  // possibly resize data structures according to Nmax
1224  if (resize_rb_eval_data)
1225  rbe.resize_data_structures(get_Nmax());
1226 
1227  // Clear the Greedy param list
1228  for (auto & plist : rbe.greedy_param_list)
1229  plist.clear();
1230 
1231  rbe.greedy_param_list.clear();
1232 
1233  Real training_greedy_error = 0.;
1234 
1235 
1236  // If we are continuing from a previous training run,
1237  // we might already be at the max number of basis functions.
1238  // If so, we can just return.
1239  if (rbe.get_n_basis_functions() >= get_Nmax())
1240  {
1241  libMesh::out << "Maximum number of basis functions reached: Nmax = "
1242  << get_Nmax() << std::endl;
1243  return 0.;
1244  }
1245 
1246  // Optionally pre-evaluate the theta functions on the entire (local) training parameter set.
1249 
1251  {
1252  // Compute the dual norms of the outputs if we haven't already done so.
1254 
1255  // Compute the Fq Riesz representor dual norms if we haven't already done so.
1257  }
1258 
1259  libMesh::out << std::endl << "---- Performing Greedy basis enrichment ----" << std::endl;
1260  Real initial_greedy_error = 0.;
1261  bool initial_greedy_error_initialized = false;
1262  while (true)
1263  {
1264  libMesh::out << std::endl << "---- Basis dimension: "
1265  << rbe.get_n_basis_functions() << " ----" << std::endl;
1266 
1267  if (count > 0 || (count==0 && use_empty_rb_solve_in_greedy))
1268  {
1269  libMesh::out << "Performing RB solves on training set" << std::endl;
1270  training_greedy_error = compute_max_error_bound();
1271 
1272  libMesh::out << "Maximum error bound is " << training_greedy_error << std::endl << std::endl;
1273 
1274  // record the initial error
1275  if (!initial_greedy_error_initialized)
1276  {
1277  initial_greedy_error = training_greedy_error;
1278  initial_greedy_error_initialized = true;
1279  }
1280 
1281  // Break out of training phase if we have reached Nmax
1282  // or if the training_tolerance is satisfied.
1283  if (greedy_termination_test(training_greedy_error, initial_greedy_error, count))
1284  break;
1285  }
1286 
1287  libMesh::out << "Performing truth solve at parameter:" << std::endl;
1288  print_parameters();
1289 
1290  // Update the list of Greedily selected parameters
1291  this->update_greedy_param_list();
1292 
1293  // Perform an Offline truth solve for the current parameter
1294  truth_solve(-1);
1295 
1297  {
1298  libMesh::out << "Zero basis function encountered hence ending basis enrichment" << std::endl;
1299  break;
1300  }
1301 
1302  // Add orthogonal part of the snapshot to the RB space
1303  libMesh::out << "Enriching the RB space" << std::endl;
1304  enrich_RB_space();
1305 
1306  update_system();
1307 
1308  // Check if we've reached Nmax now. We do this before calling
1309  // update_residual_terms() since we can skip that step if we've
1310  // already reached Nmax.
1311  if (rbe.get_n_basis_functions() >= this->get_Nmax())
1312  {
1313  libMesh::out << "Maximum number of basis functions reached: Nmax = "
1314  << get_Nmax() << std::endl;
1315  break;
1316  }
1317 
1319  {
1321  }
1322 
1323  // Increment counter
1324  count++;
1325  }
1326  this->update_greedy_param_list();
1327 
1328  return training_greedy_error;
1329 }
virtual Real truth_solve(int plot_solution)
Perform a "truth" solve, i.e.
virtual bool greedy_termination_test(Real abs_greedy_error, Real initial_greedy_error, int count)
Function that indicates when to terminate the Greedy basis training.
virtual Real compute_max_error_bound()
(i) Compute the a posteriori error bound for each set of parameters in the training set...
bool use_empty_rb_solve_in_greedy
A boolean flag to indicate whether or not we initialize the Greedy algorithm by performing rb_solves ...
bool get_preevaluate_thetas_flag() const
Get/set flag to pre-evaluate the theta functions.
void update_greedy_param_list()
Update the list of Greedily chosen parameters with current_parameters.
unsigned int get_Nmax() const
Get/set Nmax, the maximum number of RB functions we are willing to compute.
virtual void update_residual_terms(bool compute_inner_products=true)
Compute the terms that are combined ‘online’ to determine the dual norm of the residual.
virtual void update_system()
Update the system after enriching the RB space; this calls a series of functions to update the system...
void print_parameters() const
Print the current parameters.
bool skip_residual_in_train_reduced_basis
Boolean flag to indicate if we skip residual calculations in train_reduced_basis. ...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
OStreamProxy out
virtual void preevaluate_thetas()
virtual void compute_Fq_representor_innerprods(bool compute_inner_products=true)
Compute the terms that are combined ‘online’ to determine the dual norm of the residual.
virtual bool check_if_zero_truth_solve() const
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.
virtual void compute_output_dual_innerprods()
Compute and store the dual norm of each output functional.
virtual void enrich_RB_space()
Add a new basis function to the RB space.

◆ train_reduced_basis_with_POD()

void libMesh::RBConstruction::train_reduced_basis_with_POD ( )

Train the reduced basis using Proper Orthogonal Decomposition (POD).

This is an alternative to train_reduced_basis(), which uses the RB greedy algorithm. In contrast to the RB greedy algorithm, POD requires us to perform truth solves at all training samples, which can be computationally intensive.

The main advantage of using POD is that it does not rely on the RB error indicator. The RB error indicator typically stagnates due to rounding error at approximately square-root of machine precision, since it involves taking the square-root of a sum of terms that cancel. This error indicator stagnation puts a limit on the accuracy level that can be achieved with the RB greedy algorithm, so for cases where we need higher accuracy, the POD approach is a good alternative.

Definition at line 1425 of file rb_construction.C.

References libMesh::RBConstructionBase< LinearImplicitSystem >::_normalize_solution_snapshots, libMesh::RBEvaluation::basis_functions, libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), delta_N, libMesh::DenseMatrix< T >::el(), libMesh::RBEvaluation::get_n_basis_functions(), libMesh::RBParametrized::get_n_params(), libMesh::RBConstructionBase< LinearImplicitSystem >::get_n_training_samples(), get_Nmax(), get_non_dirichlet_inner_product_matrix_if_avail(), get_rb_evaluation(), libMesh::RBParametrized::initialize_parameters(), libMesh::RBConstructionBase< LinearImplicitSystem >::inner_product_storage_vector, libMesh::libmesh_assert(), libMesh::libmesh_conj(), libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), libMesh::TensorTools::norm(), libMesh::out, libMesh::PARALLEL, std::real(), libMesh::Real, recompute_all_residual_terms(), rel_training_tolerance, libMesh::RBEvaluation::resize_data_structures(), libMesh::RBConstructionBase< LinearImplicitSystem >::serial_training_set, libMesh::RBConstructionBase< LinearImplicitSystem >::set_params_from_training_set(), libMesh::System::solution, libMesh::DenseMatrix< T >::svd(), truth_solve(), update_system(), and libMesh::SparseMatrix< T >::vector_mult().

Referenced by train_reduced_basis().

1426 {
1427  // We need to use the same training set on all processes so that
1428  // the truth solves below work correctly in parallel.
1429  libmesh_error_msg_if(!serial_training_set, "We must use a serial training set with POD");
1430  libmesh_error_msg_if(get_rb_evaluation().get_n_basis_functions() > 0, "Basis should not already be initialized");
1431 
1434 
1435  // Storage for the POD snapshots
1436  unsigned int n_snapshots = get_n_training_samples();
1437 
1438  if (get_n_params() == 0)
1439  {
1440  // In this case we should have generated an empty training set
1441  // so assert this
1442  libmesh_assert(n_snapshots == 0);
1443 
1444  // If we have no parameters, then we should do exactly one "truth solve"
1445  n_snapshots = 1;
1446  }
1447 
1448  std::vector<std::unique_ptr<NumericVector<Number>>> POD_snapshots(n_snapshots);
1449  for (unsigned int i=0; i<n_snapshots; i++)
1450  {
1451  POD_snapshots[i] = NumericVector<Number>::build(this->comm());
1452  POD_snapshots[i]->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
1453  }
1454 
1455  // We use the same training set on all processes
1456  libMesh::out << std::endl;
1457  for (unsigned int i=0; i<n_snapshots; i++)
1458  {
1459  if (get_n_params() > 0)
1460  {
1462  }
1463 
1464  libMesh::out << "Truth solve " << (i+1) << " of " << n_snapshots << std::endl;
1465 
1466  truth_solve(-1);
1467 
1468  *POD_snapshots[i] = *solution;
1469  }
1470  libMesh::out << std::endl;
1471 
1473  {
1474  libMesh::out << "Normalizing solution snapshots" << std::endl;
1475  for (unsigned int i=0; i<n_snapshots; i++)
1476  {
1478  *inner_product_storage_vector, *POD_snapshots[i]);
1479  Real norm = std::sqrt(std::real(POD_snapshots[i]->dot(*inner_product_storage_vector)));
1480 
1481  if (norm > 0.)
1482  POD_snapshots[i]->scale(1./norm);
1483  }
1484  }
1485 
1486  // Set up the "correlation matrix"
1487  DenseMatrix<Number> correlation_matrix(n_snapshots,n_snapshots);
1488  for (unsigned int i=0; i<n_snapshots; i++)
1489  {
1491  *inner_product_storage_vector, *POD_snapshots[i]);
1492 
1493  for (unsigned int j=0; j<=i; j++)
1494  {
1495  Number inner_prod = (POD_snapshots[j]->dot(*inner_product_storage_vector));
1496 
1497  correlation_matrix(i,j) = inner_prod;
1498  if(i != j)
1499  {
1500  correlation_matrix(j,i) = libmesh_conj(inner_prod);
1501  }
1502  }
1503  }
1504 
1505  // compute SVD of correlation matrix
1506  DenseVector<Real> sigma( n_snapshots );
1507  DenseMatrix<Number> U( n_snapshots, n_snapshots );
1508  DenseMatrix<Number> VT( n_snapshots, n_snapshots );
1509  correlation_matrix.svd(sigma, U, VT );
1510 
1511  if (sigma(0) == 0.)
1512  return;
1513 
1514  // Add dominant vectors from the POD as basis functions.
1515  unsigned int j = 0;
1516  while (true)
1517  {
1518  if (j >= get_Nmax() || j >= n_snapshots)
1519  {
1520  libMesh::out << "Maximum number of basis functions (" << j << ") reached." << std::endl;
1521  break;
1522  }
1523 
1524  // The "energy" error in the POD approximation is determined by the first omitted
1525  // singular value, i.e. sigma(j). We normalize by sigma(0), which gives the total
1526  // "energy", in order to obtain a relative error.
1527  const Real rel_err = std::sqrt(sigma(j)) / std::sqrt(sigma(0));
1528 
1529  libMesh::out << "Number of basis functions: " << j
1530  << ", POD error norm: " << rel_err << std::endl;
1531 
1532  if (rel_err < this->rel_training_tolerance)
1533  {
1534  libMesh::out << "Training tolerance reached." << std::endl;
1535  break;
1536  }
1537 
1538  std::unique_ptr< NumericVector<Number> > v = POD_snapshots[j]->zero_clone();
1539  for ( unsigned int i=0; i<n_snapshots; ++i )
1540  {
1541  v->add( U.el(i, j), *POD_snapshots[i] );
1542  }
1543 
1544  Real norm_v = std::sqrt(sigma(j));
1545  v->scale( 1./norm_v );
1546 
1547  get_rb_evaluation().basis_functions.emplace_back( std::move(v) );
1548 
1549  j++;
1550  }
1551  libMesh::out << std::endl;
1552 
1554  update_system();
1555 
1556  // We now compute all terms required to evaluate the RB error indicator.
1557  // Unlike in the case of the RB Greedy algorithm, for the POD approach
1558  // we do not need this data in order to compute the basis. However, we
1559  // do need this data in order to evaluate error indicator quantities in
1560  // the Online stage, so we compute it now so that it can be saved in
1561  // the training data.
1563 }
boost::multiprecision::float128 real(const boost::multiprecision::float128 in)
T libmesh_conj(T a)
virtual void resize_data_structures(const unsigned int Nmax, bool resize_error_bound_data=true)
Resize and clear the data vectors corresponding to the value of Nmax.
bool _normalize_solution_snapshots
Set this boolean to true if we want to normalize solution snapshots used in training to have norm of ...
virtual Real truth_solve(int plot_solution)
Perform a "truth" solve, i.e.
template class LIBMESH_EXPORT DenseVector< Real >
Definition: dense_vector.C:29
void vector_mult(NumericVector< T > &dest, const NumericVector< T > &arg) const
Multiplies the matrix by the NumericVector arg and stores the result in NumericVector dest...
std::vector< std::unique_ptr< NumericVector< Number > > > basis_functions
The libMesh vectors storing the finite element coefficients of the RB basis functions.
const Parallel::Communicator & comm() const
dof_id_type n_local_dofs() const
Definition: system.C:155
dof_id_type n_dofs() const
Definition: system.C:118
std::unique_ptr< NumericVector< Number > > inner_product_storage_vector
We keep an extra temporary vector that is useful for performing inner products (avoids unnecessary me...
virtual void recompute_all_residual_terms(const bool compute_inner_products=true)
This function computes all of the residual representors, can be useful when restarting a basis traini...
Real rel_training_tolerance
Relative and absolute tolerances for training reduced basis using the Greedy scheme.
unsigned int get_Nmax() const
Get/set Nmax, the maximum number of RB functions we are willing to compute.
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
virtual void update_system()
Update the system after enriching the RB space; this calls a series of functions to update the system...
libmesh_assert(ctx)
unsigned int delta_N
The number of basis functions that we add at each greedy step.
numeric_index_type get_n_training_samples() const
Get the number of global training samples.
void set_params_from_training_set(unsigned int global_index)
Set parameters to the RBParameters stored in index global_index of the global training set...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
auto norm(const T &a)
Definition: tensor_tools.h:74
OStreamProxy out
virtual unsigned int get_n_basis_functions() const
Get the current number of basis functions.
SparseMatrix< Number > * get_non_dirichlet_inner_product_matrix_if_avail()
Get the non-Dirichlet inner-product matrix if it&#39;s available, otherwise get the inner-product matrix ...
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
bool serial_training_set
This boolean flag indicates whether or not the training set should be the same on all processors...
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.
void initialize_parameters(const RBParameters &mu_min_in, const RBParameters &mu_max_in, const std::map< std::string, std::vector< Real >> &discrete_parameter_values)
Initialize the parameter ranges and set current_parameters.
unsigned int get_n_params() const
Get the number of parameters.

◆ truth_assembly()

void libMesh::RBConstruction::truth_assembly ( )
protectedvirtual

Assemble the truth matrix and right-hand side for current_parameters.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 970 of file rb_construction.C.

References libMesh::SparseMatrix< T >::add(), libMesh::NumericVector< T >::add(), libMesh::NumericVector< T >::build(), libMesh::NumericVector< T >::close(), libMesh::SparseMatrix< T >::close(), libMesh::ParallelObject::comm(), get_Aq(), get_Fq(), libMesh::RBThetaExpansion::get_n_A_terms(), libMesh::RBThetaExpansion::get_n_F_terms(), libMesh::RBParametrized::get_parameters(), get_rb_theta_expansion(), libMesh::ImplicitSystem::matrix, libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), libMesh::PARALLEL, libMesh::ExplicitSystem::rhs, libMesh::SparseMatrix< T >::zero(), and libMesh::NumericVector< T >::zero().

Referenced by compute_residual_dual_norm_slow(), enrich_basis_from_rhs_terms(), and truth_solve().

971 {
972  LOG_SCOPE("truth_assembly()", "RBConstruction");
973 
974  const RBParameters & mu = get_parameters();
975 
976  this->matrix->zero();
977  this->rhs->zero();
978 
979  this->matrix->close();
980  this->rhs->close();
981 
982  {
983  // We should have already assembled the matrices
984  // and vectors in the affine expansion, so
985  // just use them
986 
987  for (unsigned int q_a=0; q_a<get_rb_theta_expansion().get_n_A_terms(); q_a++)
988  {
989  matrix->add(get_rb_theta_expansion().eval_A_theta(q_a, mu), *get_Aq(q_a));
990  }
991 
992  std::unique_ptr<NumericVector<Number>> temp_vec = NumericVector<Number>::build(this->comm());
993  temp_vec->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
994  for (unsigned int q_f=0; q_f<get_rb_theta_expansion().get_n_F_terms(); q_f++)
995  {
996  *temp_vec = *get_Fq(q_f);
997  temp_vec->scale( get_rb_theta_expansion().eval_F_theta(q_f, mu) );
998  rhs->add(*temp_vec);
999  }
1000  }
1001 
1002  this->matrix->close();
1003  this->rhs->close();
1004 }
unsigned int get_n_F_terms() const
Get Q_f, the number of terms in the affine expansion for the right-hand side.
SparseMatrix< Number > * get_Aq(unsigned int q)
Get a pointer to Aq.
NumericVector< Number > * rhs
The system matrix.
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form.
const Parallel::Communicator & comm() const
NumericVector< Number > * get_Fq(unsigned int q)
Get a pointer to Fq.
dof_id_type n_local_dofs() const
Definition: system.C:155
dof_id_type n_dofs() const
Definition: system.C:118
virtual void zero()=0
Set all entries to zero.
virtual void add(const numeric_index_type i, const numeric_index_type j, const T value)=0
Add value to the element (i,j).
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
virtual void zero()=0
Set all entries to 0.
const RBParameters & get_parameters() const
Get the current parameters.
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
SparseMatrix< Number > * matrix
The system matrix.
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
virtual void add(const numeric_index_type i, const T value)=0
Adds value to the vector entry specified by i.

◆ truth_solve()

Real libMesh::RBConstruction::truth_solve ( int  plot_solution)
virtual

Perform a "truth" solve, i.e.

solve the finite element system at at the parameters currently set in the system. This is used extensively in training the reduced basis, since "truth snapshots" are employed as basis functions.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 1615 of file rb_construction.C.

References _untransformed_solution, assert_convergence, check_convergence(), libMesh::NumericVector< T >::dot(), libMesh::RBThetaExpansion::eval_output_theta(), extra_linear_solver, libMesh::System::get_equation_systems(), libMesh::LinearImplicitSystem::get_linear_solver(), libMesh::System::get_mesh(), libMesh::RBThetaExpansion::get_n_output_terms(), libMesh::RBThetaExpansion::get_n_outputs(), get_non_dirichlet_inner_product_matrix_if_avail(), get_output_vector(), libMesh::RBParametrized::get_parameters(), get_rb_theta_expansion(), libMesh::RBConstructionBase< LinearImplicitSystem >::inner_product_storage_vector, libMesh::libmesh_ignore(), libMesh::libmesh_real(), libMesh::ImplicitSystem::matrix, libMesh::System::name(), post_process_truth_solution(), libMesh::ExplicitSystem::rhs, libMesh::System::solution, solve_for_matrix_and_rhs(), store_untransformed_basis, truth_assembly(), truth_outputs, libMesh::SparseMatrix< T >::vector_mult(), and libMesh::ExodusII_IO::write_equation_systems().

Referenced by train_reduced_basis_with_greedy(), and train_reduced_basis_with_POD().

1616 {
1617  LOG_SCOPE("truth_solve()", "RBConstruction");
1618 
1620  {
1621  _untransformed_solution = solution->zero_clone();
1622  }
1623 
1624  truth_assembly();
1625 
1626  // truth_assembly assembles into matrix and rhs, so use those for the solve
1627  if (extra_linear_solver)
1628  {
1629  // If extra_linear_solver has been initialized, then we use it for the
1630  // truth solves.
1632 
1633  if (assert_convergence)
1635  }
1636  else
1637  {
1639 
1640  if (assert_convergence)
1642  }
1643 
1645  {
1647  }
1648 
1649  // Call user-defined post-processing routines on the truth solution.
1651 
1652  const RBParameters & mu = get_parameters();
1653 
1654  for (unsigned int n=0; n<get_rb_theta_expansion().get_n_outputs(); n++)
1655  {
1656  truth_outputs[n] = 0.;
1657  for (unsigned int q_l=0; q_l<get_rb_theta_expansion().get_n_output_terms(n); q_l++)
1659  get_output_vector(n,q_l)->dot(*solution);
1660  }
1661 
1662 #ifdef LIBMESH_HAVE_EXODUS_API
1663  if (plot_solution > 0)
1664  {
1665  ExodusII_IO exo_io(this->get_mesh());
1666  std::set<std::string> system_names = {this->name()};
1667  exo_io.write_equation_systems("truth.exo", this->get_equation_systems(), &system_names);
1668  }
1669 #else
1670  libmesh_ignore(plot_solution);
1671 #endif
1672 
1673  // Get the X norm of the truth solution
1674  // Useful for normalizing our true error data
1676  Number truth_X_norm = std::sqrt(inner_product_storage_vector->dot(*solution));
1677 
1678  return libmesh_real(truth_X_norm);
1679 }
T libmesh_real(T a)
virtual Number eval_output_theta(unsigned int output_index, unsigned int q_l, const RBParameters &mu) const
Evaluate theta_q_l at the current parameter.
virtual void truth_assembly()
Assemble the truth matrix and right-hand side for current_parameters.
bool assert_convergence
A boolean flag to indicate whether to check for proper convergence after each solve.
void vector_mult(NumericVector< T > &dest, const NumericVector< T > &arg) const
Multiplies the matrix by the NumericVector arg and stores the result in NumericVector dest...
const EquationSystems & get_equation_systems() const
Definition: system.h:767
NumericVector< Number > * rhs
The system matrix.
virtual LinearSolver< Number > * get_linear_solver() const override
virtual T dot(const NumericVector< T > &v) const =0
unsigned int get_n_outputs() const
Get n_outputs, the number output functionals.
const MeshBase & get_mesh() const
Definition: system.h:2401
std::unique_ptr< NumericVector< Number > > inner_product_storage_vector
We keep an extra temporary vector that is useful for performing inner products (avoids unnecessary me...
LinearSolver< Number > * extra_linear_solver
Also, we store a pointer to an extra linear solver.
virtual void solve_for_matrix_and_rhs(LinearSolver< Number > &input_solver, SparseMatrix< Number > &input_matrix, NumericVector< Number > &input_rhs)
Assembles & solves the linear system A*x=b for the specified matrix input_matrix and right-hand side ...
void libmesh_ignore(const Args &...)
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
bool store_untransformed_basis
Boolean flag to indicate whether we store a second copy of the basis without constraints or dof trans...
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
const RBParameters & get_parameters() const
Get the current parameters.
std::unique_ptr< NumericVector< Number > > _untransformed_solution
We also store a copy of the untransformed solution in order to create _untransformed_basis_functions...
virtual void post_process_truth_solution()
Similarly, provide an opportunity to post-process the truth solution after the solve is complete...
unsigned int get_n_output_terms(unsigned int output_index) const
Get the number of affine terms associated with the specified output.
void check_convergence(LinearSolver< Number > &input_solver)
Check if the linear solver reports convergence.
SparseMatrix< Number > * matrix
The system matrix.
std::vector< Number > truth_outputs
Vector storing the truth output values from the most recent truth solve.
SparseMatrix< Number > * get_non_dirichlet_inner_product_matrix_if_avail()
Get the non-Dirichlet inner-product matrix if it&#39;s available, otherwise get the inner-product matrix ...
NumericVector< Number > * get_output_vector(unsigned int n, unsigned int q_l)
Get a pointer to the n^th output.
const std::string & name() const
Definition: system.h:2385

◆ update()

void libMesh::System::update ( )
virtualinherited

Update the local values to reflect the solution on neighboring processors.

Reimplemented in SolidSystem.

Definition at line 498 of file system.C.

References libMesh::System::_dof_map, libMesh::System::current_local_solution, libMesh::libmesh_assert(), and libMesh::System::solution.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::FEMSystem::assemble_qoi(), libMesh::FEMSystem::assemble_qoi_derivative(), libMesh::NonlinearImplicitSystem::assembly(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::NewmarkSolver::compute_initial_accel(), compute_stresses(), LinearElasticityWithContact::compute_stresses(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), libMesh::Problem_Interface::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::GMVIO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), DMlibMeshFunction(), DMlibMeshJacobian(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::CondensedEigenSystem::get_eigenpair(), libMesh::TransientRBConstruction::initialize_truth(), libMesh::Euler2Solver::integrate_adjoint_refinement_error_estimate(), libMesh::EulerSolver::integrate_adjoint_refinement_error_estimate(), libMesh::libmesh_petsc_snes_fd_residual(), libMesh::libmesh_petsc_snes_jacobian(), libMesh::libmesh_petsc_snes_mffd_residual(), libMesh::libmesh_petsc_snes_residual(), libMesh::libmesh_petsc_snes_residual_helper(), libMesh::NewtonSolver::line_search(), load_basis_function(), libMesh::TransientRBConstruction::load_rb_solution(), load_rb_solution(), main(), libMesh::FEMSystem::mesh_position_get(), HeatSystem::perturb_accumulate_residuals(), libMesh::ErrorVector::plot_error(), libMesh::FEMSystem::postprocess(), libMesh::ImplicitSystem::qoi_parameter_hessian(), libMesh::MemorySolutionHistory::retrieve(), libMesh::FileSolutionHistory::retrieve(), libMesh::NewtonSolver::solve(), libMesh::ExplicitSystem::solve(), libMesh::LinearImplicitSystem::solve(), libMesh::OptimizationSystem::solve(), libMesh::NonlinearImplicitSystem::solve(), libMesh::ClawSystem::solve_conservation_law(), solve_for_matrix_and_rhs(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::DirectSolutionTransfer::transfer(), and update_current_local_solution().

499 {
500  parallel_object_only();
501 
502  libmesh_assert(solution->closed());
503 
504  const std::vector<dof_id_type> & send_list = _dof_map->get_send_list ();
505 
506  // Check sizes
507  libmesh_assert_equal_to (current_local_solution->size(), solution->size());
508  // More processors than elements => empty send_list
509  // libmesh_assert (!send_list.empty());
510  libmesh_assert_less_equal (send_list.size(), solution->size());
511 
512  // Create current_local_solution from solution. This will
513  // put a local copy of solution into current_local_solution.
514  // Only the necessary values (specified by the send_list)
515  // are copied to minimize communication
516  solution->localize (*current_local_solution, send_list);
517 }
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc...
Definition: system.h:2225
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
libmesh_assert(ctx)
std::unique_ptr< NumericVector< Number > > current_local_solution
All the values I need to compute my contribution to the simulation at hand.
Definition: system.h:1667

◆ update_global_solution() [1/2]

void libMesh::System::update_global_solution ( std::vector< Number > &  global_soln) const
inherited

Fill the input vector global_soln so that it contains the global solution on all processors.

Requires communication with all other processors.

Definition at line 733 of file system.C.

References libMesh::System::solution.

Referenced by libMesh::ExactSolution::_compute_error(), libMesh::ExactErrorEstimator::estimate_error(), main(), and libMesh::InterMeshProjection::project_system_vectors().

734 {
735  parallel_object_only();
736 
737  global_soln.resize (solution->size());
738 
739  solution->localize (global_soln);
740 }
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655

◆ update_global_solution() [2/2]

void libMesh::System::update_global_solution ( std::vector< Number > &  global_soln,
const processor_id_type  dest_proc 
) const
inherited

Fill the input vector global_soln so that it contains the global solution on processor dest_proc.

Requires communication with all other processors.

Definition at line 744 of file system.C.

References libMesh::System::solution.

746 {
747  parallel_object_only();
748 
749  global_soln.resize (solution->size());
750 
751  solution->localize_to_one (global_soln, dest_proc);
752 }
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655

◆ update_greedy_param_list()

void libMesh::RBConstruction::update_greedy_param_list ( )
protected

Update the list of Greedily chosen parameters with current_parameters.

Definition at line 1602 of file rb_construction.C.

References libMesh::RBParametrized::get_parameters(), get_rb_evaluation(), and libMesh::RBEvaluation::greedy_param_list.

Referenced by train_reduced_basis_with_greedy().

1603 {
1605 }
std::vector< RBParameters > greedy_param_list
The list of parameters selected by the Greedy algorithm in generating the Reduced Basis associated wi...
const RBParameters & get_parameters() const
Get the current parameters.
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.

◆ update_RB_system_matrices()

void libMesh::RBConstruction::update_RB_system_matrices ( )
protectedvirtual

Compute the reduced basis matrices for the current basis.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 1910 of file rb_construction.C.

References libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), compute_RB_inner_product, delta_N, libMesh::NumericVector< T >::dot(), libMesh::RBThetaExpansion::get_n_A_terms(), libMesh::RBEvaluation::get_n_basis_functions(), libMesh::RBThetaExpansion::get_n_F_terms(), libMesh::RBThetaExpansion::get_n_output_terms(), libMesh::RBThetaExpansion::get_n_outputs(), get_non_dirichlet_Aq_if_avail(), get_non_dirichlet_Fq_if_avail(), get_non_dirichlet_inner_product_matrix_if_avail(), get_output_vector(), get_rb_evaluation(), get_rb_theta_expansion(), libMesh::libmesh_conj(), libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), libMesh::PARALLEL, libMesh::RBEvaluation::RB_Aq_vector, libMesh::RBEvaluation::RB_Fq_vector, libMesh::RBEvaluation::RB_inner_product_matrix, libMesh::RBEvaluation::RB_output_vectors, value, and libMesh::SparseMatrix< T >::vector_mult().

Referenced by libMesh::TransientRBConstruction::update_RB_system_matrices(), and update_system().

1911 {
1912  LOG_SCOPE("update_RB_system_matrices()", "RBConstruction");
1913 
1914  unsigned int RB_size = get_rb_evaluation().get_n_basis_functions();
1915 
1916  std::unique_ptr<NumericVector<Number>> temp = NumericVector<Number>::build(this->comm());
1917  temp->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
1918 
1919  for (unsigned int q_f=0; q_f<get_rb_theta_expansion().get_n_F_terms(); q_f++)
1920  {
1921  for (unsigned int i=(RB_size-delta_N); i<RB_size; i++)
1922  {
1923  get_rb_evaluation().RB_Fq_vector[q_f](i) = get_non_dirichlet_Fq_if_avail(q_f)->dot(get_rb_evaluation().get_basis_function(i));
1924  }
1925  }
1926 
1927  for (unsigned int i=(RB_size-delta_N); i<RB_size; i++)
1928  {
1929  for (unsigned int n=0; n<get_rb_theta_expansion().get_n_outputs(); n++)
1930  for (unsigned int q_l=0; q_l<get_rb_theta_expansion().get_n_output_terms(n); q_l++)
1931  {
1932  get_rb_evaluation().RB_output_vectors[n][q_l](i) =
1933  get_output_vector(n,q_l)->dot(get_rb_evaluation().get_basis_function(i));
1934  }
1935 
1936  for (unsigned int j=0; j<RB_size; j++)
1937  {
1938  Number value = 0.;
1939 
1941  {
1942  // Compute reduced inner_product_matrix
1943  temp->zero();
1945 
1946  value = temp->dot( get_rb_evaluation().get_basis_function(i) );
1948  if (i!=j)
1949  {
1950  // The inner product matrix is assumed
1951  // to be hermitian
1953  }
1954  }
1955 
1956  for (unsigned int q_a=0; q_a<get_rb_theta_expansion().get_n_A_terms(); q_a++)
1957  {
1958  // Compute reduced Aq matrix
1959  temp->zero();
1960  get_non_dirichlet_Aq_if_avail(q_a)->vector_mult(*temp, get_rb_evaluation().get_basis_function(j));
1961 
1962  value = (*temp).dot(get_rb_evaluation().get_basis_function(i));
1963  get_rb_evaluation().RB_Aq_vector[q_a](i,j) = value;
1964 
1965  if (i!=j)
1966  {
1967  temp->zero();
1968  get_non_dirichlet_Aq_if_avail(q_a)->vector_mult(*temp, get_rb_evaluation().get_basis_function(i));
1969 
1970  value = (*temp).dot(get_rb_evaluation().get_basis_function(j));
1971  get_rb_evaluation().RB_Aq_vector[q_a](j,i) = value;
1972  }
1973  }
1974  }
1975  }
1976 }
T libmesh_conj(T a)
unsigned int get_n_F_terms() const
Get Q_f, the number of terms in the affine expansion for the right-hand side.
void vector_mult(NumericVector< T > &dest, const NumericVector< T > &arg) const
Multiplies the matrix by the NumericVector arg and stores the result in NumericVector dest...
DenseMatrix< Number > RB_inner_product_matrix
The inner product matrix.
bool compute_RB_inner_product
Boolean flag to indicate whether we compute the RB_inner_product_matrix.
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form.
const Parallel::Communicator & comm() const
NumericVector< Number > * get_non_dirichlet_Fq_if_avail(unsigned int q)
Get a pointer to non_dirichlet_Fq if it&#39;s available, otherwise get Fq.
virtual T dot(const NumericVector< T > &v) const =0
dof_id_type n_local_dofs() const
Definition: system.C:155
unsigned int get_n_outputs() const
Get n_outputs, the number output functionals.
dof_id_type n_dofs() const
Definition: system.C:118
std::vector< DenseVector< Number > > RB_Fq_vector
Dense vector for the RHS.
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
unsigned int delta_N
The number of basis functions that we add at each greedy step.
std::vector< DenseMatrix< Number > > RB_Aq_vector
Dense matrices for the RB computations.
unsigned int get_n_output_terms(unsigned int output_index) const
Get the number of affine terms associated with the specified output.
virtual unsigned int get_n_basis_functions() const
Get the current number of basis functions.
SparseMatrix< Number > * get_non_dirichlet_inner_product_matrix_if_avail()
Get the non-Dirichlet inner-product matrix if it&#39;s available, otherwise get the inner-product matrix ...
static const bool value
Definition: xdr_io.C:55
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
NumericVector< Number > * get_output_vector(unsigned int n, unsigned int q_l)
Get a pointer to the n^th output.
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.
SparseMatrix< Number > * get_non_dirichlet_Aq_if_avail(unsigned int q)
Get a pointer to non_dirichlet_Aq if it&#39;s available, otherwise get Aq.
std::vector< std::vector< DenseVector< Number > > > RB_output_vectors
The vectors storing the RB output vectors.

◆ update_residual_terms()

void libMesh::RBConstruction::update_residual_terms ( bool  compute_inner_products = true)
protectedvirtual

Compute the terms that are combined ‘online’ to determine the dual norm of the residual.

By default, inner product terms are also computed, but you can turn this feature off e.g. if you are already reading in that data from files.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 1979 of file rb_construction.C.

References _untransformed_basis_functions, libMesh::RBEvaluation::Aq_Aq_representor_innerprods, libMesh::RBEvaluation::Aq_representor, assert_convergence, libMesh::NumericVector< T >::build(), check_convergence(), libMesh::ParallelObject::comm(), delta_N, libMesh::LinearImplicitSystem::final_linear_residual(), libMesh::RBEvaluation::Fq_Aq_representor_innerprods, Fq_representor, get_Aq(), libMesh::RBThetaExpansion::get_n_A_terms(), libMesh::RBEvaluation::get_n_basis_functions(), libMesh::RBThetaExpansion::get_n_F_terms(), get_non_dirichlet_inner_product_matrix_if_avail(), get_rb_evaluation(), get_rb_theta_expansion(), libMesh::Utility::get_timestamp(), inner_product_matrix, inner_product_solver, libMesh::RBConstructionBase< LinearImplicitSystem >::inner_product_storage_vector, libMesh::RBConstructionBase< LinearImplicitSystem >::is_quiet(), libMesh::libmesh_assert(), libMesh::System::n_dofs(), libMesh::LinearImplicitSystem::n_linear_iterations(), libMesh::System::n_local_dofs(), libMesh::out, libMesh::PARALLEL, libMesh::ExplicitSystem::rhs, libMesh::NumericVector< T >::scale(), libMesh::System::solution, solve_for_matrix_and_rhs(), store_untransformed_basis, libMesh::SparseMatrix< T >::vector_mult(), and libMesh::NumericVector< T >::zero().

Referenced by recompute_all_residual_terms(), train_reduced_basis_with_greedy(), and libMesh::TransientRBConstruction::update_residual_terms().

1980 {
1981  LOG_SCOPE("update_residual_terms()", "RBConstruction");
1982 
1983  libMesh::out << "Updating RB residual terms" << std::endl;
1984 
1985  unsigned int RB_size = get_rb_evaluation().get_n_basis_functions();
1986 
1988  {
1989  libmesh_assert_equal_to(_untransformed_basis_functions.size(), get_rb_evaluation().get_n_basis_functions());
1990  }
1991 
1992  for (unsigned int q_a=0; q_a<get_rb_theta_expansion().get_n_A_terms(); q_a++)
1993  {
1994  for (unsigned int i=(RB_size-delta_N); i<RB_size; i++)
1995  {
1996  // Initialize the vector in which we'll store the representor
1997  if (!get_rb_evaluation().Aq_representor[q_a][i])
1998  {
2000  get_rb_evaluation().Aq_representor[q_a][i]->init(this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
2001  }
2002 
2003  libmesh_assert(get_rb_evaluation().Aq_representor[q_a][i]->size() == this->n_dofs() &&
2004  get_rb_evaluation().Aq_representor[q_a][i]->local_size() == this->n_local_dofs() );
2005 
2006  rhs->zero();
2008  {
2009  get_Aq(q_a)->vector_mult(*rhs, get_rb_evaluation().get_basis_function(i));
2010  }
2011  else
2012  {
2014  }
2015  rhs->scale(-1.);
2016 
2017  if (!is_quiet())
2018  {
2019  libMesh::out << "Starting solve [q_a][i]=[" << q_a <<"]["<< i << "] in RBConstruction::update_residual_terms() at "
2020  << Utility::get_timestamp() << std::endl;
2021  }
2022 
2024 
2025  if (assert_convergence)
2027 
2028  if (!is_quiet())
2029  {
2030  libMesh::out << "Finished solve [q_a][i]=[" << q_a <<"]["<< i << "] in RBConstruction::update_residual_terms() at "
2031  << Utility::get_timestamp() << std::endl;
2032  libMesh::out << this->n_linear_iterations() << " iterations, final residual "
2033  << this->final_linear_residual() << std::endl;
2034  }
2035 
2036  // Store the representor
2038  }
2039  }
2040 
2041  // Now compute and store the inner products (if requested)
2042  if (compute_inner_products)
2043  {
2044 
2045  for (unsigned int q_f=0; q_f<get_rb_theta_expansion().get_n_F_terms(); q_f++)
2046  {
2048 
2049  for (unsigned int q_a=0; q_a<get_rb_theta_expansion().get_n_A_terms(); q_a++)
2050  {
2051  for (unsigned int i=(RB_size-delta_N); i<RB_size; i++)
2052  {
2054  inner_product_storage_vector->dot(*get_rb_evaluation().Aq_representor[q_a][i]);
2055  }
2056  }
2057  }
2058 
2059  unsigned int q=0;
2060  for (unsigned int q_a1=0; q_a1<get_rb_theta_expansion().get_n_A_terms(); q_a1++)
2061  {
2062  for (unsigned int q_a2=q_a1; q_a2<get_rb_theta_expansion().get_n_A_terms(); q_a2++)
2063  {
2064  for (unsigned int i=(RB_size-delta_N); i<RB_size; i++)
2065  {
2066  for (unsigned int j=0; j<RB_size; j++)
2067  {
2070  inner_product_storage_vector->dot(*get_rb_evaluation().Aq_representor[q_a1][i]);
2071 
2072  if (i != j)
2073  {
2076  inner_product_storage_vector->dot(*get_rb_evaluation().Aq_representor[q_a1][j]);
2077  }
2078  }
2079  }
2080  q++;
2081  }
2082  }
2083  } // end if (compute_inner_products)
2084 }
std::vector< std::vector< std::unique_ptr< NumericVector< Number > > > > Aq_representor
Vector storing the residual representors associated with the left-hand side.
std::vector< std::unique_ptr< NumericVector< Number > > > Fq_representor
Vector storing the residual representors associated with the right-hand side.
unsigned int get_n_F_terms() const
Get Q_f, the number of terms in the affine expansion for the right-hand side.
bool assert_convergence
A boolean flag to indicate whether to check for proper convergence after each solve.
std::vector< std::unique_ptr< NumericVector< Number > > > _untransformed_basis_functions
In cases where we have dof transformations such as a change of coordinates at some nodes we need to s...
void vector_mult(NumericVector< T > &dest, const NumericVector< T > &arg) const
Multiplies the matrix by the NumericVector arg and stores the result in NumericVector dest...
std::string get_timestamp()
Definition: timestamp.C:37
SparseMatrix< Number > * get_Aq(unsigned int q)
Get a pointer to Aq.
NumericVector< Number > * rhs
The system matrix.
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form.
const Parallel::Communicator & comm() const
bool is_quiet() const
Is the system in quiet mode?
std::unique_ptr< SparseMatrix< Number > > inner_product_matrix
The inner product matrix.
dof_id_type n_local_dofs() const
Definition: system.C:155
dof_id_type n_dofs() const
Definition: system.C:118
virtual void zero()=0
Set all entries to zero.
std::unique_ptr< NumericVector< Number > > inner_product_storage_vector
We keep an extra temporary vector that is useful for performing inner products (avoids unnecessary me...
virtual void scale(const T factor)=0
Scale each element of the vector by the given factor.
virtual void solve_for_matrix_and_rhs(LinearSolver< Number > &input_solver, SparseMatrix< Number > &input_matrix, NumericVector< Number > &input_rhs)
Assembles & solves the linear system A*x=b for the specified matrix input_matrix and right-hand side ...
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the RBThetaExpansion object that that belongs to rb_eval.
unsigned int n_linear_iterations() const
bool store_untransformed_basis
Boolean flag to indicate whether we store a second copy of the basis without constraints or dof trans...
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
libmesh_assert(ctx)
unsigned int delta_N
The number of basis functions that we add at each greedy step.
std::vector< std::vector< std::vector< Number > > > Fq_Aq_representor_innerprods
Vectors storing the residual representor inner products to be used in computing the residuals online...
void check_convergence(LinearSolver< Number > &input_solver)
Check if the linear solver reports convergence.
std::unique_ptr< LinearSolver< Number > > inner_product_solver
We store an extra linear solver object which we can optionally use for solving all systems in which t...
OStreamProxy out
virtual unsigned int get_n_basis_functions() const
Get the current number of basis functions.
SparseMatrix< Number > * get_non_dirichlet_inner_product_matrix_if_avail()
Get the non-Dirichlet inner-product matrix if it&#39;s available, otherwise get the inner-product matrix ...
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.
std::vector< std::vector< std::vector< Number > > > Aq_Aq_representor_innerprods

◆ update_system()

void libMesh::RBConstruction::update_system ( )
protectedvirtual

Update the system after enriching the RB space; this calls a series of functions to update the system properly.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 1778 of file rb_construction.C.

References libMesh::out, and update_RB_system_matrices().

Referenced by enrich_basis_from_rhs_terms(), train_reduced_basis_with_greedy(), train_reduced_basis_with_POD(), and libMesh::TransientRBConstruction::update_system().

1779 {
1780  libMesh::out << "Updating RB matrices" << std::endl;
1782 }
virtual void update_RB_system_matrices()
Compute the reduced basis matrices for the current basis.
OStreamProxy out

◆ user_assembly()

void libMesh::System::user_assembly ( )
virtualinherited

Calls user's attached assembly function, or is overridden by the user in derived classes.

Definition at line 2104 of file system.C.

References libMesh::System::_assemble_system_function, libMesh::System::_assemble_system_object, libMesh::System::_equation_systems, libMesh::System::Assembly::assemble(), and libMesh::System::name().

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

2105 {
2106  // Call the user-provided assembly function,
2107  // if it was provided
2108  if (_assemble_system_function != nullptr)
2110 
2111  // ...or the user-provided assembly object.
2112  else if (_assemble_system_object != nullptr)
2114 }
Assembly * _assemble_system_object
Object that assembles the system.
Definition: system.h:2182
virtual void assemble()=0
Assembly function.
EquationSystems & _equation_systems
Constant reference to the EquationSystems object used for the simulation.
Definition: system.h:2231
const std::string & name() const
Definition: system.h:2385
void(* _assemble_system_function)(EquationSystems &es, const std::string &name)
Function that assembles the system.
Definition: system.h:2176

◆ user_constrain()

void libMesh::System::user_constrain ( )
virtualinherited

Calls user's attached constraint function, or is overridden by the user in derived classes.

Definition at line 2118 of file system.C.

References libMesh::System::_constrain_system_function, libMesh::System::_constrain_system_object, libMesh::System::_equation_systems, libMesh::System::Constraint::constrain(), and libMesh::System::name().

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

2119 {
2120  // Call the user-provided constraint function,
2121  // if it was provided
2122  if (_constrain_system_function!= nullptr)
2124 
2125  // ...or the user-provided constraint object.
2126  else if (_constrain_system_object != nullptr)
2128 }
void(* _constrain_system_function)(EquationSystems &es, const std::string &name)
Function to impose constraints.
Definition: system.h:2187
Constraint * _constrain_system_object
Object that constrains the system.
Definition: system.h:2193
EquationSystems & _equation_systems
Constant reference to the EquationSystems object used for the simulation.
Definition: system.h:2231
virtual void constrain()=0
Constraint function.
const std::string & name() const
Definition: system.h:2385

◆ user_initialization()

void libMesh::System::user_initialization ( )
virtualinherited

Calls user's attached initialization function, or is overridden by the user in derived classes.

Definition at line 2090 of file system.C.

References libMesh::System::_equation_systems, libMesh::System::_init_system_function, libMesh::System::_init_system_object, libMesh::System::Initialization::initialize(), and libMesh::System::name().

Referenced by libMesh::NewmarkSystem::initial_conditions(), and libMesh::System::reinit_mesh().

2091 {
2092  // Call the user-provided initialization function,
2093  // if it was provided
2094  if (_init_system_function != nullptr)
2095  this->_init_system_function (_equation_systems, this->name());
2096 
2097  // ...or the user-provided initialization object.
2098  else if (_init_system_object != nullptr)
2100 }
virtual void initialize()=0
Initialization function.
Initialization * _init_system_object
Object that initializes the system.
Definition: system.h:2171
void(* _init_system_function)(EquationSystems &es, const std::string &name)
Function that initializes the system.
Definition: system.h:2165
EquationSystems & _equation_systems
Constant reference to the EquationSystems object used for the simulation.
Definition: system.h:2231
const std::string & name() const
Definition: system.h:2385

◆ user_QOI()

void libMesh::System::user_QOI ( const QoISet qoi_indices)
virtualinherited

Calls user's attached quantity of interest function, or is overridden by the user in derived classes.

Definition at line 2132 of file system.C.

References libMesh::System::_equation_systems, libMesh::System::_qoi_evaluate_function, libMesh::System::_qoi_evaluate_object, libMesh::System::name(), and libMesh::System::QOI::qoi().

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

2133 {
2134  // Call the user-provided quantity of interest function,
2135  // if it was provided
2136  if (_qoi_evaluate_function != nullptr)
2137  this->_qoi_evaluate_function(_equation_systems, this->name(), qoi_indices);
2138 
2139  // ...or the user-provided QOI function object.
2140  else if (_qoi_evaluate_object != nullptr)
2141  this->_qoi_evaluate_object->qoi(qoi_indices);
2142 }
void(* _qoi_evaluate_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices)
Function to evaluate quantity of interest.
Definition: system.h:2198
virtual void qoi(const QoISet &qoi_indices)=0
Quantity of interest function.
QOI * _qoi_evaluate_object
Object to compute quantities of interest.
Definition: system.h:2205
EquationSystems & _equation_systems
Constant reference to the EquationSystems object used for the simulation.
Definition: system.h:2231
const std::string & name() const
Definition: system.h:2385

◆ user_QOI_derivative()

void libMesh::System::user_QOI_derivative ( const QoISet qoi_indices = QoISet(),
bool  include_liftfunc = true,
bool  apply_constraints = true 
)
virtualinherited

Calls user's attached quantity of interest derivative function, or is overridden by the user in derived classes.

Definition at line 2146 of file system.C.

References libMesh::System::_equation_systems, libMesh::System::_qoi_evaluate_derivative_function, libMesh::System::_qoi_evaluate_derivative_object, libMesh::System::name(), and libMesh::System::QOIDerivative::qoi_derivative().

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

2149 {
2150  // Call the user-provided quantity of interest derivative,
2151  // if it was provided
2152  if (_qoi_evaluate_derivative_function != nullptr)
2154  (_equation_systems, this->name(), qoi_indices, include_liftfunc,
2155  apply_constraints);
2156 
2157  // ...or the user-provided QOI derivative function object.
2158  else if (_qoi_evaluate_derivative_object != nullptr)
2160  (qoi_indices, include_liftfunc, apply_constraints);
2161 }
QOIDerivative * _qoi_evaluate_derivative_object
Object to compute derivatives of quantities of interest.
Definition: system.h:2219
virtual void qoi_derivative(const QoISet &qoi_indices, bool include_liftfunc, bool apply_constraints)=0
Quantity of interest derivative function.
EquationSystems & _equation_systems
Constant reference to the EquationSystems object used for the simulation.
Definition: system.h:2231
const std::string & name() const
Definition: system.h:2385
void(* _qoi_evaluate_derivative_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices, bool include_liftfunc, bool apply_constraints)
Function to evaluate quantity of interest derivative.
Definition: system.h:2210

◆ variable()

const Variable & libMesh::System::variable ( unsigned int  var) const
inherited

Return a constant reference to Variable var.

Definition at line 2699 of file system.C.

References libMesh::System::get_dof_map(), and libMesh::DofMap::variable().

Referenced by libMesh::ExactSolution::_compute_error(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DifferentiableSystem::add_second_order_dot_vars(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::FirstOrderUnsteadySolver::compute_second_order_eqns(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::DifferentiableSystem::have_first_order_scalar_vars(), libMesh::DifferentiableSystem::have_second_order_scalar_vars(), main(), libMesh::DifferentiablePhysics::nonlocal_mass_residual(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SortAndCopy::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectEdges::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectSides::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectInteriors::operator()(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::System::read_parallel_data(), libMesh::System::read_SCALAR_dofs(), libMesh::System::read_serialized_vector(), libMesh::System::read_serialized_vectors(), libMesh::PetscPreconditioner< T >::set_petsc_aux_data(), libMesh::PetscDMWrapper::set_point_range_in_section(), SystemsTest::testFirstScalarNumber(), libMesh::System::write_header(), libMesh::Nemesis_IO_Helper::write_nodal_solution(), libMesh::System::write_parallel_data(), libMesh::System::write_serialized_vector(), and libMesh::System::write_serialized_vectors().

2700 {
2701  return this->get_dof_map().variable(i);
2702 }
const Variable & variable(const unsigned int c) const override
Definition: dof_map.h:2358
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ variable_group()

const VariableGroup & libMesh::System::variable_group ( unsigned int  vg) const
inherited

Return a constant reference to VariableGroup vg.

Definition at line 2704 of file system.C.

References libMesh::System::get_dof_map(), and libMesh::DofMap::variable_group().

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

2705 {
2706  return this->get_dof_map().variable_group(vg);
2707 }
const VariableGroup & variable_group(const unsigned int c) const
Definition: dof_map.h:2348
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ variable_name()

const std::string & libMesh::System::variable_name ( const unsigned int  i) const
inherited

◆ variable_number()

unsigned int libMesh::System::variable_number ( std::string_view  var) const
inherited
Returns
The variable number associated with the user-specified variable named var.

Definition at line 1398 of file system.C.

References libMesh::System::get_dof_map(), and libMesh::DofMap::variable_number().

Referenced by libMesh::ExactSolution::_compute_error(), alternative_fe_assembly(), LinearElasticity::assemble(), AssembleOptimization::assemble_A_and_F(), assemble_divgrad(), assemble_elasticity(), assemble_graddiv(), assemble_matrix_and_rhs(), assemble_shell(), assemble_stokes(), compute_enriched_soln(), compute_stresses(), LinearElasticityWithContact::compute_stresses(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::GMVIO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::ExactErrorEstimator::estimate_error(), fe_assembly(), libMesh::ExactErrorEstimator::find_squared_element_error(), CoupledSystemQoI::init_context(), libMesh::HDGProblem::jacobian(), LargeDeformationElasticity::jacobian(), line_print(), main(), LinearElasticityWithContact::move_mesh(), libMesh::System::read_header(), libMesh::HDGProblem::residual(), LargeDeformationElasticity::residual(), LinearElasticityWithContact::residual_and_jacobian(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), OverlappingTestBase::setup_coupling_matrix(), libMesh::DTKAdapter::update_variable_values(), libMesh::System::variable_scalar_number(), libMesh::EnsightIO::write_scalar_ascii(), and libMesh::EnsightIO::write_vector_ascii().

1399 {
1400  return this->get_dof_map().variable_number(var);
1401 }
unsigned int variable_number(std::string_view var) const
Definition: dof_map.h:2991
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ variable_scalar_number() [1/2]

unsigned int libMesh::System::variable_scalar_number ( std::string_view  var,
unsigned int  component 
) const
inlineinherited
Returns
An index, starting from 0 for the first component of the first variable, and incrementing for each component of each (potentially vector-valued) variable in the system in order. For systems with only scalar-valued variables, this will be the same as variable_number(var)

Irony: currently our only non-scalar-valued variable type is SCALAR.

Definition at line 2474 of file system.h.

References libMesh::System::variable_number().

Referenced by libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::ExactErrorEstimator::find_squared_element_error(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectEdges::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectSides::operator()(), and libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectInteriors::operator()().

2476 {
2477  return variable_scalar_number(this->variable_number(var), component);
2478 }
unsigned int variable_scalar_number(std::string_view var, unsigned int component) const
Definition: system.h:2474
unsigned int variable_number(std::string_view var) const
Definition: system.C:1398

◆ variable_scalar_number() [2/2]

unsigned int libMesh::System::variable_scalar_number ( unsigned int  var_num,
unsigned int  component 
) const
inherited
Returns
An index, starting from 0 for the first component of the first variable, and incrementing for each component of each (potentially vector-valued) variable in the system in order. For systems with only scalar-valued variables, this will be the same as var_num

Irony: currently our only non-scalar-valued variable type is SCALAR.

Definition at line 2710 of file system.C.

References libMesh::System::get_dof_map(), and libMesh::DofMap::variable_scalar_number().

2712 {
2713  return this->get_dof_map().variable_scalar_number(var_num, component);
2714 }
unsigned int variable_scalar_number(unsigned int var_num, unsigned int component) const
Definition: dof_map.h:2974
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ variable_type() [1/2]

const FEType & libMesh::System::variable_type ( const unsigned int  i) const
inherited
Returns
The finite element type variable number i.

Definition at line 2716 of file system.C.

References libMesh::System::get_dof_map(), and libMesh::DofMap::variable_type().

Referenced by libMesh::ExactSolution::_compute_error(), alternative_fe_assembly(), assemble(), libMesh::ClawSystem::assemble_advection_matrices(), libMesh::ClawSystem::assemble_avg_coupling_matrices(), libMesh::ClawSystem::assemble_boundary_condition_matrices(), assemble_ellipticdg(), libMesh::ClawSystem::assemble_jump_coupling_matrix(), libMesh::ClawSystem::assemble_mass_matrix(), assemble_shell(), assemble_stokes(), libMesh::FEMContext::attach_quadrature_rules(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::GMVIO::copy_nodal_solution(), libMesh::DGFEMContext::DGFEMContext(), fe_assembly(), libMesh::FEMContext::find_hardest_fe_type(), libMesh::EquationSystems::find_variable_numbers(), form_functionA(), form_functionB(), form_matrixA(), libMesh::FEMSystem::init_context(), libMesh::FEMContext::init_internal_data(), RationalMapTest< elem_type >::setUp(), FETestBase< order, family, elem_type, N_x >::setUp(), EquationSystemsTest::testBadVarNames(), libMesh::Nemesis_IO_Helper::write_element_values(), libMesh::System::write_header(), libMesh::Nemesis_IO_Helper::write_nodal_solution(), libMesh::EnsightIO::write_scalar_ascii(), and libMesh::EnsightIO::write_vector_ascii().

2717 {
2718  return this->get_dof_map().variable_type(i);
2719 }
const FEType & variable_type(const unsigned int i) const
Definition: dof_map.h:2388
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ variable_type() [2/2]

const FEType & libMesh::System::variable_type ( std::string_view  var) const
inherited
Returns
The finite element type for variable var.

Definition at line 2721 of file system.C.

References libMesh::System::get_dof_map(), and libMesh::DofMap::variable_type().

2722 {
2723  return this->get_dof_map().variable_type(var);
2724 }
const FEType & variable_type(const unsigned int i) const
Definition: dof_map.h:2388
const DofMap & get_dof_map() const
Definition: system.h:2417

◆ vector_is_adjoint()

int libMesh::System::vector_is_adjoint ( std::string_view  vec_name) const
inherited
Returns
The integer describing whether the vector identified by vec_name represents a solution from an adjoint (non-negative) or the primal (-1) space.

Definition at line 1160 of file system.C.

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

Referenced by libMesh::InterMeshProjection::project_system_vectors(), and libMesh::System::restrict_vectors().

1161 {
1162  const auto it = _vector_is_adjoint.find(vec_name);
1163  libmesh_assert(it != _vector_is_adjoint.end());
1164  return it->second;
1165 }
std::map< std::string, int, std::less<> > _vector_is_adjoint
Holds non-negative if a vector by that name should be projected using adjoint constraints/BCs, -1 if primal.
Definition: system.h:2272
libmesh_assert(ctx)

◆ vector_name() [1/2]

const std::string & libMesh::System::vector_name ( const unsigned int  vec_num) const
inherited
Returns
The name of this system's additional vector number vec_num (where the vectors are counted starting with 0).

Definition at line 971 of file system.C.

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

Referenced by libMesh::AdjointRefinementEstimator::estimate_error(), and main().

972 {
973  // If we don't have that many vectors, throw an error
974  libmesh_assert_less(vec_num, _vectors.size());
975 
976  // Otherwise return a reference to the vec_num'th vector name
977  auto it = vectors_begin();
978  std::advance(it, vec_num);
979  return it->first;
980 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260
vectors_iterator vectors_begin()
Beginning of vectors container.
Definition: system.h:2505

◆ vector_name() [2/2]

const std::string & libMesh::System::vector_name ( const NumericVector< Number > &  vec_reference) const
inherited
Returns
The name of a system vector, given a reference to that vector

Definition at line 982 of file system.C.

References libMesh::System::_vectors, libMesh::NumericVector< T >::get(), libMesh::libmesh_assert(), libMesh::System::vectors_begin(), and libMesh::System::vectors_end().

983 {
984  // Linear search for a vector whose pointer matches vec_reference
985  auto it = std::find_if(vectors_begin(), vectors_end(),
986  [&vec_reference](const decltype(_vectors)::value_type & pr)
987  { return &vec_reference == pr.second.get(); });
988 
989  // Before returning, make sure we didn't loop till the end and not find any match
990  libmesh_assert (it != vectors_end());
991 
992  // Return the string associated with the current vector
993  return it->first;
994 }
vectors_iterator vectors_end()
End of vectors container.
Definition: system.h:2517
virtual void get(const std::vector< numeric_index_type > &index, T *values) const
Access multiple components at once.
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260
vectors_iterator vectors_begin()
Beginning of vectors container.
Definition: system.h:2505
libmesh_assert(ctx)

◆ vector_preservation()

bool libMesh::System::vector_preservation ( std::string_view  vec_name) const
inherited
Returns
The boolean describing whether the vector identified by vec_name should be "preserved": projected to new meshes, saved, etc.

Definition at line 1135 of file system.C.

References libMesh::System::_vector_projections.

Referenced by libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::MemoryHistoryData::store_vectors(), SystemsTest::testAddVectorProjChange(), SystemsTest::testAddVectorTypeChange(), and SystemsTest::testPostInitAddVectorTypeChange().

1136 {
1137  if (auto it = _vector_projections.find(vec_name);
1138  it != _vector_projections.end())
1139  return it->second;
1140 
1141  // vec_name was not in the map, return false
1142  return false;
1143 }
std::map< std::string, bool, std::less<> > _vector_projections
Holds true if a vector by that name should be projected onto a changed grid, false if it should be ze...
Definition: system.h:2266

◆ vectors_begin() [1/2]

System::vectors_iterator libMesh::System::vectors_begin ( )
inlineinherited

Beginning of vectors container.

Definition at line 2505 of file system.h.

References libMesh::System::_vectors.

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::System::get_vector(), libMesh::InterMeshProjection::project_system_vectors(), libMesh::System::request_vector(), libMesh::MemoryHistoryData::store_vectors(), and libMesh::System::vector_name().

2506 {
2507  return _vectors.begin();
2508 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260

◆ vectors_begin() [2/2]

System::const_vectors_iterator libMesh::System::vectors_begin ( ) const
inlineinherited

Beginning of vectors container.

Definition at line 2511 of file system.h.

References libMesh::System::_vectors.

2512 {
2513  return _vectors.begin();
2514 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260

◆ vectors_end() [1/2]

System::vectors_iterator libMesh::System::vectors_end ( )
inlineinherited

End of vectors container.

Definition at line 2517 of file system.h.

References libMesh::System::_vectors.

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::InterMeshProjection::project_system_vectors(), libMesh::MemoryHistoryData::store_vectors(), and libMesh::System::vector_name().

2518 {
2519  return _vectors.end();
2520 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260

◆ vectors_end() [2/2]

System::const_vectors_iterator libMesh::System::vectors_end ( ) const
inlineinherited

End of vectors container.

Definition at line 2523 of file system.h.

References libMesh::System::_vectors.

2524 {
2525  return _vectors.end();
2526 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260

◆ weighted_sensitivity_adjoint_solve()

std::pair< unsigned int, Real > libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve ( const ParameterVector parameters,
const ParameterVector weights,
const QoISet qoi_indices = QoISet() 
)
overridevirtualinherited

Assembles & solves the linear system(s) (dR/du)^T*z_w = sum(w_p*(d^2q/dudp - d^2R/dudp*z)), for those parameters p contained within parameters, weighted by the values w_p found within weights.

Assumes that adjoint_solve has already calculated z for each qoi in qoi_indices.

Returns
A pair with the total number of linear iterations performed and the (sum of the) final residual norms

Reimplemented from libMesh::System.

Definition at line 247 of file implicit_system.C.

References libMesh::System::add_weighted_sensitivity_adjoint_solution(), libMesh::ExplicitSystem::assemble_qoi_derivative(), libMesh::ImplicitSystem::assembly(), libMesh::NumericVector< T >::close(), libMesh::SparseMatrix< T >::close(), libMesh::ParameterVector::deep_copy(), libMesh::DofMap::enforce_constraints_exactly(), libMesh::System::get_adjoint_rhs(), libMesh::System::get_adjoint_solution(), libMesh::System::get_dof_map(), libMesh::ImplicitSystem::get_linear_solve_parameters(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::SparseMatrix< T >::get_transpose(), libMesh::System::get_weighted_sensitivity_adjoint_solution(), libMesh::DofMap::has_adjoint_dirichlet_boundaries(), libMesh::QoISet::has_index(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::ImplicitSystem::matrix, libMesh::System::n_qois(), libMesh::Real, libMesh::ExplicitSystem::rhs, libMesh::LinearSolver< T >::solve(), libMesh::TOLERANCE, libMesh::ParameterVector::value_copy(), libMesh::SparseMatrix< T >::vector_mult_add(), and libMesh::NumericVector< T >::zero_clone().

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

250 {
251  // Log how long the linear solve takes.
252  LOG_SCOPE("weighted_sensitivity_adjoint_solve()", "ImplicitSystem");
253 
254  // We currently get partial derivatives via central differencing
255  const Real delta_p = TOLERANCE;
256 
257  ParameterVector & parameters_vec =
258  const_cast<ParameterVector &>(parameters_in);
259 
260  // The forward system should now already be solved.
261  // The adjoint system should now already be solved.
262  // Now we're assembling a weighted sum of adjoint-adjoint systems:
263  //
264  // dR/du (u, sum_l(w_l*z^l)) = sum_l(w_l*(Q''_ul - R''_ul (u, z)))
265 
266  // FIXME: The derivation here does not yet take adjoint boundary
267  // conditions into account.
268 #ifdef LIBMESH_ENABLE_DIRICHLET
269  for (auto i : make_range(this->n_qois()))
270  if (qoi_indices.has_index(i))
272 #endif
273 
274  // We'll assemble the rhs first, because the R'' term will require
275  // perturbing the jacobian
276 
277  // We'll use temporary rhs vectors, because we haven't (yet) found
278  // any good reasons why users might want to save these:
279 
280  std::vector<std::unique_ptr<NumericVector<Number>>> temprhs(this->n_qois());
281  for (auto i : make_range(this->n_qois()))
282  if (qoi_indices.has_index(i))
283  temprhs[i] = this->rhs->zero_clone();
284 
285  // We approximate the _l partial derivatives via a central
286  // differencing perturbation in the w_l direction:
287  //
288  // sum_l(w_l*v_l) ~= (v(p + dp*w_l*e_l) - v(p - dp*w_l*e_l))/(2*dp)
289 
290  // PETSc doesn't implement SGEMX, so neither does NumericVector,
291  // so we want to avoid calculating f -= R'*z. We'll thus evaluate
292  // the above equation by first adding -v(p+dp...), then multiplying
293  // the intermediate result vectors by -1, then adding -v(p-dp...),
294  // then finally dividing by 2*dp.
295 
296  ParameterVector oldparameters, parameterperturbation;
297  parameters_vec.deep_copy(oldparameters);
298  weights.deep_copy(parameterperturbation);
299  parameterperturbation *= delta_p;
300  parameters_vec += parameterperturbation;
301 
302  this->assembly(false, true);
303  this->matrix->close();
304 
305  // Take the discrete adjoint, so that we can calculate R_u(u,z) with
306  // a matrix-vector product of R_u and z.
308 
309  this->assemble_qoi_derivative(qoi_indices,
310  /* include_liftfunc = */ false,
311  /* apply_constraints = */ true);
312  for (auto i : make_range(this->n_qois()))
313  if (qoi_indices.has_index(i))
314  {
315  this->get_adjoint_rhs(i).close();
316  *(temprhs[i]) -= this->get_adjoint_rhs(i);
317  this->matrix->vector_mult_add(*(temprhs[i]), this->get_adjoint_solution(i));
318  *(temprhs[i]) *= -1.0;
319  }
320 
321  oldparameters.value_copy(parameters_vec);
322  parameterperturbation *= -1.0;
323  parameters_vec += parameterperturbation;
324 
325  this->assembly(false, true);
326  this->matrix->close();
328 
329  this->assemble_qoi_derivative(qoi_indices,
330  /* include_liftfunc = */ false,
331  /* apply_constraints = */ true);
332  for (auto i : make_range(this->n_qois()))
333  if (qoi_indices.has_index(i))
334  {
335  this->get_adjoint_rhs(i).close();
336  *(temprhs[i]) -= this->get_adjoint_rhs(i);
337  this->matrix->vector_mult_add(*(temprhs[i]), this->get_adjoint_solution(i));
338  *(temprhs[i]) /= (2.0*delta_p);
339  }
340 
341  // Finally, assemble the jacobian at the non-perturbed parameter
342  // values. Ignore assemble_before_solve; if we had a good
343  // non-perturbed matrix before we've already overwritten it.
344  oldparameters.value_copy(parameters_vec);
345 
346  // if (this->assemble_before_solve)
347  {
348  // Build the Jacobian
349  this->assembly(false, true);
350  this->matrix->close();
351 
352  // Take the discrete adjoint
354  }
355 
356  // The weighted adjoint-adjoint problem is linear
357  LinearSolver<Number> * solver = this->get_linear_solver();
358 
359  // Our iteration counts and residuals will be sums of the individual
360  // results
361  std::pair<unsigned int, Real> solver_params =
363  std::pair<unsigned int, Real> totalrval = std::make_pair(0,0.0);
364 
365  for (auto i : make_range(this->n_qois()))
366  if (qoi_indices.has_index(i))
367  {
368  const std::pair<unsigned int, Real> rval =
369  solver->solve (*matrix, this->add_weighted_sensitivity_adjoint_solution(i),
370  *(temprhs[i]),
371  double(solver_params.second),
372  solver_params.first);
373 
374  totalrval.first += rval.first;
375  totalrval.second += rval.second;
376  }
377 
378  // The linear solver may not have fit our constraints exactly
379 #ifdef LIBMESH_ENABLE_CONSTRAINTS
380  for (auto i : make_range(this->n_qois()))
381  if (qoi_indices.has_index(i))
384  /* homogeneous = */ true);
385 #endif
386 
387  return totalrval;
388 }
static constexpr Real TOLERANCE
virtual std::pair< unsigned int, Real > get_linear_solve_parameters() const
unsigned int n_qois() const
Number of currently active quantities of interest.
Definition: system.h:2562
virtual std::unique_ptr< NumericVector< T > > zero_clone() const =0
NumericVector< Number > * rhs
The system matrix.
virtual LinearSolver< Number > * get_linear_solver() const
NumericVector< Number > & add_weighted_sensitivity_adjoint_solution(unsigned int i=0)
Definition: system.C:1252
virtual void assembly(bool, bool, bool=false, bool=false)
Assembles a residual in rhs and/or a jacobian in matrix, as requested.
bool has_adjoint_dirichlet_boundaries(unsigned int q) const
libmesh_assert(ctx)
template class LIBMESH_EXPORT LinearSolver< Number >
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void vector_mult_add(NumericVector< T > &dest, const NumericVector< T > &arg) const
Multiplies the matrix by the NumericVector arg and adds the result to the NumericVector dest...
SparseMatrix< Number > * matrix
The system matrix.
virtual void get_transpose(SparseMatrix< T > &dest) const =0
Copies the transpose of the matrix into dest, which may be *this.
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
virtual void assemble_qoi_derivative(const QoISet &qoi_indices=QoISet(), bool include_liftfunc=true, bool apply_constraints=true) override
Prepares adjoint_rhs for quantity of interest derivative assembly, then calls user qoi derivative fun...
NumericVector< Number > & get_adjoint_solution(unsigned int i=0)
Definition: system.C:1232
const DofMap & get_dof_map() const
Definition: system.h:2417
NumericVector< Number > & get_weighted_sensitivity_adjoint_solution(unsigned int i=0)
Definition: system.C:1264
void enforce_constraints_exactly(const System &system, NumericVector< Number > *v=nullptr, bool homogeneous=false) const
Constrains the numeric vector v, which represents a solution defined on the mesh. ...
Definition: dof_map.h:2518
NumericVector< Number > & get_adjoint_rhs(unsigned int i=0)
Definition: system.C:1294

◆ weighted_sensitivity_solve()

std::pair< unsigned int, Real > libMesh::ImplicitSystem::weighted_sensitivity_solve ( const ParameterVector parameters,
const ParameterVector weights 
)
overridevirtualinherited

Assembles & solves the linear system(s) (dR/du)*u_w = sum(w_p*-dR/dp), for those parameters p contained within parameters weighted by the values w_p found within weights.

Returns
A pair with the total number of linear iterations performed and the (sum of the) final residual norms

Reimplemented from libMesh::System.

Definition at line 393 of file implicit_system.C.

References libMesh::System::add_weighted_sensitivity_solution(), libMesh::ImplicitSystem::assembly(), libMesh::NumericVector< T >::clone(), libMesh::NumericVector< T >::close(), libMesh::SparseMatrix< T >::close(), libMesh::ParameterVector::deep_copy(), libMesh::DofMap::enforce_constraints_exactly(), libMesh::System::get_dof_map(), libMesh::ImplicitSystem::get_linear_solve_parameters(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::System::get_weighted_sensitivity_solution(), libMesh::ImplicitSystem::matrix, libMesh::Real, libMesh::ExplicitSystem::rhs, libMesh::LinearSolver< T >::solve(), libMesh::TOLERANCE, and libMesh::ParameterVector::value_copy().

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

395 {
396  // Log how long the linear solve takes.
397  LOG_SCOPE("weighted_sensitivity_solve()", "ImplicitSystem");
398 
399  // We currently get partial derivatives via central differencing
400  const Real delta_p = TOLERANCE;
401 
402  ParameterVector & parameters_vec =
403  const_cast<ParameterVector &>(parameters_in);
404 
405  // The forward system should now already be solved.
406 
407  // Now we're assembling a weighted sum of sensitivity systems:
408  //
409  // dR/du (u, v)(sum(w_l*u'_l)) = -sum_l(w_l*R'_l (u, v)) forall v
410 
411  // We'll assemble the rhs first, because the R' term will require
412  // perturbing the system, and some applications may not be able to
413  // assemble a perturbed residual without simultaneously constructing
414  // a perturbed jacobian.
415 
416  // We approximate the _l partial derivatives via a central
417  // differencing perturbation in the w_l direction:
418  //
419  // sum_l(w_l*v_l) ~= (v(p + dp*w_l*e_l) - v(p - dp*w_l*e_l))/(2*dp)
420 
421  ParameterVector oldparameters, parameterperturbation;
422  parameters_vec.deep_copy(oldparameters);
423  weights.deep_copy(parameterperturbation);
424  parameterperturbation *= delta_p;
425  parameters_vec += parameterperturbation;
426 
427  this->assembly(true, false, true);
428  this->rhs->close();
429 
430  std::unique_ptr<NumericVector<Number>> temprhs = this->rhs->clone();
431 
432  oldparameters.value_copy(parameters_vec);
433  parameterperturbation *= -1.0;
434  parameters_vec += parameterperturbation;
435 
436  this->assembly(true, false, true);
437  this->rhs->close();
438 
439  *temprhs -= *(this->rhs);
440  *temprhs /= (2.0*delta_p);
441 
442  // Finally, assemble the jacobian at the non-perturbed parameter
443  // values
444  oldparameters.value_copy(parameters_vec);
445 
446  // Build the Jacobian
447  this->assembly(false, true);
448  this->matrix->close();
449 
450  // The weighted sensitivity problem is linear
451  LinearSolver<Number> * solver = this->get_linear_solver();
452 
453  std::pair<unsigned int, Real> solver_params =
455 
456  const std::pair<unsigned int, Real> rval =
457  solver->solve (*matrix, this->add_weighted_sensitivity_solution(),
458  *temprhs,
459  double(solver_params.second),
460  solver_params.first);
461 
462  // The linear solver may not have fit our constraints exactly
463 #ifdef LIBMESH_ENABLE_CONSTRAINTS
465  (*this, &this->get_weighted_sensitivity_solution(),
466  /* homogeneous = */ true);
467 #endif
468 
469  return rval;
470 }
static constexpr Real TOLERANCE
virtual std::pair< unsigned int, Real > get_linear_solve_parameters() const
NumericVector< Number > * rhs
The system matrix.
virtual std::unique_ptr< NumericVector< T > > clone() const =0
virtual LinearSolver< Number > * get_linear_solver() const
NumericVector< Number > & add_weighted_sensitivity_solution()
Definition: system.C:1199
NumericVector< Number > & get_weighted_sensitivity_solution()
Definition: system.C:1206
virtual void assembly(bool, bool, bool=false, bool=false)
Assembles a residual in rhs and/or a jacobian in matrix, as requested.
template class LIBMESH_EXPORT LinearSolver< Number >
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
SparseMatrix< Number > * matrix
The system matrix.
const DofMap & get_dof_map() const
Definition: system.h:2417
void enforce_constraints_exactly(const System &system, NumericVector< Number > *v=nullptr, bool homogeneous=false) const
Constrains the numeric vector v, which represents a solution defined on the mesh. ...
Definition: dof_map.h:2518

◆ write_header()

void libMesh::System::write_header ( Xdr io,
std::string_view  version,
const bool  write_additional_data 
) const
inherited

Writes the basic data header for this System.

This method implements the output of a System object, embedded in the output of an EquationSystems<T_sys>. This warrants some documentation. The output of this part consists of 5 sections:

for this system

5.) The number of variables in the system (unsigned int)

for each variable in the system

6.) The name of the variable (string)

6.1.) subdomain where the variable lives

7.) Combined in an FEType:

  • The approximation order(s) of the variable (Order Enum, cast to int/s)
  • The finite element family/ies of the variable (FEFamily Enum, cast to int/s)

end variable loop

8.) The number of additional vectors (unsigned int),

for each additional vector in the system object

9.) the name of the additional vector (string)

end system

Definition at line 1120 of file system_io.C.

References libMesh::System::_vector_projections, libMesh::System::_vectors, libMesh::Variable::active_subdomains(), libMesh::Xdr::data(), libMesh::FEType::family, libMesh::System::get_mesh(), libMesh::FEType::inf_map, libMesh::libmesh_assert(), libMesh::make_range(), libMesh::System::n_vars(), libMesh::System::n_vectors(), libMesh::System::name(), libMesh::FEType::order, libMesh::ParallelObject::processor_id(), libMesh::FEType::radial_family, libMesh::FEType::radial_order, libMesh::System::variable(), libMesh::System::variable_name(), libMesh::System::variable_type(), and libMesh::Xdr::writing().

Referenced by libMesh::RBEvaluation::write_out_vectors().

1123 {
1157  libmesh_assert (io.writing());
1158 
1159 
1160  // Only write the header information
1161  // if we are processor 0.
1162  if (this->get_mesh().processor_id() != 0)
1163  return;
1164 
1165  std::string comment;
1166 
1167  // 5.)
1168  // Write the number of variables in the system
1169 
1170  {
1171  // set up the comment
1172  comment = "# No. of Variables in System \"";
1173  comment += this->name();
1174  comment += "\"";
1175 
1176  unsigned int nv = this->n_vars();
1177  io.data (nv, comment);
1178  }
1179 
1180 
1181  for (auto var : make_range(this->n_vars()))
1182  {
1183  // 6.)
1184  // Write the name of the var-th variable
1185  {
1186  // set up the comment
1187  comment = "# Name, Variable No. ";
1188  comment += std::to_string(var);
1189  comment += ", System \"";
1190  comment += this->name();
1191  comment += "\"";
1192 
1193  std::string var_name = this->variable_name(var);
1194  io.data (var_name, comment);
1195  }
1196 
1197  // 6.1.) Variable subdomains
1198  {
1199  // set up the comment
1200  comment = "# Subdomains, Variable \"";
1201  comment += this->variable_name(var);
1202  comment += "\", System \"";
1203  comment += this->name();
1204  comment += "\"";
1205 
1206  const std::set<subdomain_id_type> & domains = this->variable(var).active_subdomains();
1207  std::vector<subdomain_id_type> domain_array;
1208  domain_array.assign(domains.begin(), domains.end());
1209  io.data (domain_array, comment);
1210  }
1211 
1212  // 7.)
1213  // Write the approximation order of the var-th variable
1214  // in this system
1215  {
1216  // set up the comment
1217  comment = "# Approximation Order, Variable \"";
1218  comment += this->variable_name(var);
1219  comment += "\", System \"";
1220  comment += this->name();
1221  comment += "\"";
1222 
1223  int order = static_cast<int>(this->variable_type(var).order);
1224  io.data (order, comment);
1225  }
1226 
1227 
1228 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
1229 
1230  // do the same for radial_order
1231  {
1232  comment = "# Radial Approximation Order, Variable \"";
1233  comment += this->variable_name(var);
1234  comment += "\", System \"";
1235  comment += this->name();
1236  comment += "\"";
1237 
1238  int rad_order = static_cast<int>(this->variable_type(var).radial_order);
1239  io.data (rad_order, comment);
1240  }
1241 
1242 #endif
1243 
1244  // Write the Finite Element type of the var-th variable
1245  // in this System
1246  {
1247  // set up the comment
1248  comment = "# FE Family, Variable \"";
1249  comment += this->variable_name(var);
1250  comment += "\", System \"";
1251  comment += this->name();
1252  comment += "\"";
1253 
1254  const FEType & type = this->variable_type(var);
1255  int fam = static_cast<int>(type.family);
1256  io.data (fam, comment);
1257 
1258 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
1259 
1260  comment = "# Radial FE Family, Variable \"";
1261  comment += this->variable_name(var);
1262  comment += "\", System \"";
1263  comment += this->name();
1264  comment += "\"";
1265 
1266  int radial_fam = static_cast<int>(type.radial_family);
1267  io.data (radial_fam, comment);
1268 
1269  comment = "# Infinite Mapping Type, Variable \"";
1270  comment += this->variable_name(var);
1271  comment += "\", System \"";
1272  comment += this->name();
1273  comment += "\"";
1274 
1275  int i_map = static_cast<int>(type.inf_map);
1276  io.data (i_map, comment);
1277 #endif
1278  }
1279  } // end of the variable loop
1280 
1281  // 8.)
1282  // Write the number of additional vectors in the System.
1283  // If write_additional_data==false, then write zero for
1284  // the number of additional vectors.
1285  {
1286  {
1287  // set up the comment
1288  comment = "# No. of Additional Vectors, System \"";
1289  comment += this->name();
1290  comment += "\"";
1291 
1292  unsigned int nvecs = write_additional_data ? this->n_vectors () : 0;
1293  io.data (nvecs, comment);
1294  }
1295 
1296  if (write_additional_data)
1297  {
1298  unsigned int cnt=0;
1299  for (const auto & [vec_name, vec] : _vectors)
1300  {
1301  // 9.)
1302  // write the name of the cnt-th additional vector
1303  const std::string dth_vector = std::to_string(cnt++)+"th vector";
1304  comment = "# Name of " + dth_vector;
1305  std::string nonconst_vec_name = vec_name; // Stupid XDR API
1306 
1307  io.data (nonconst_vec_name, comment);
1308  int vec_projection = _vector_projections.at(vec_name);
1309  comment = "# Whether to do projections for " + dth_vector;
1310  io.data (vec_projection, comment);
1311  int vec_type = vec->type();
1312  comment = "# Parallel type of " + dth_vector;
1313  io.data (vec_type, comment);
1314  }
1315  }
1316  }
1317 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.C:2699
OrderWrapper radial_order
The approximation order in radial direction of the infinite element.
Definition: fe_type.h:263
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260
OrderWrapper order
The approximation order of the element (at 0 p-refinement level).
Definition: fe_type.h:203
const MeshBase & get_mesh() const
Definition: system.h:2401
const std::set< subdomain_id_type > & active_subdomains() const
Definition: variable.h:181
unsigned int n_vectors() const
Definition: system.h:2499
libmesh_assert(ctx)
const std::string & variable_name(const unsigned int i) const
Definition: system.C:2674
const FEType & variable_type(const unsigned int i) const
Definition: system.C:2716
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
const std::string & name() const
Definition: system.h:2385
unsigned int n_vars() const
Definition: system.C:2669
processor_id_type processor_id() const
std::map< std::string, bool, std::less<> > _vector_projections
Holds true if a vector by that name should be projected onto a changed grid, false if it should be ze...
Definition: system.h:2266

◆ write_parallel_data()

void libMesh::System::write_parallel_data ( Xdr io,
const bool  write_additional_data 
) const
inherited

Writes additional data, namely vectors, for this System.

This method may safely be called on a distributed-memory mesh. This method will create an individual file for each processor in the simulation where the local solution components for that processor will be stored.

This method implements the output of the vectors contained in this System object, embedded in the output of an EquationSystems<T_sys>.

9.) The global solution vector, re-ordered to be node-major (More on this later.)

for each additional vector in the object

10.) The global additional vector, re-ordered to be node-major (More on this later.)

Note that the actual IO is handled through the Xdr class (to be renamed later?) which provides a uniform interface to both the XDR (eXternal Data Representation) interface and standard ASCII output. Thus this one section of code will read XDR or ASCII files with no changes.

Definition at line 1321 of file system_io.C.

References libMesh::System::_vectors, libMesh::Xdr::data(), libMesh::FEType::family, libMesh::System::get_dof_map(), libMesh::System::get_mesh(), libMesh::DofObject::invalid_id, libMesh::libmesh_assert(), libMesh::make_range(), libMesh::ParallelObject::n_processors(), libMesh::System::n_vars(), libMesh::System::name(), libMesh::System::number(), libMesh::ParallelObject::processor_id(), libMesh::SCALAR, libMesh::DofMap::SCALAR_dof_indices(), libMesh::System::solution, libMesh::Variable::type(), libMesh::System::variable(), and libMesh::Xdr::writing().

1323 {
1343  // PerfLog pl("IO Performance",false);
1344  // pl.push("write_parallel_data");
1345  // std::size_t total_written_size = 0;
1346 
1347  std::string comment;
1348 
1349  libmesh_assert (io.writing());
1350 
1351  std::vector<Number> io_buffer; io_buffer.reserve(this->solution->local_size());
1352 
1353  // build the ordered nodes and element maps.
1354  // when writing/reading parallel files we need to iterate
1355  // over our nodes/elements in order of increasing global id().
1356  // however, this is not guaranteed to be ordering we obtain
1357  // by using the node_iterators/element_iterators directly.
1358  // so build a set, sorted by id(), that provides the ordering.
1359  // further, for memory economy build the set but then transfer
1360  // its contents to vectors, which will be sorted.
1361  std::vector<const DofObject *> ordered_nodes, ordered_elements;
1362  {
1363  std::set<const DofObject *, CompareDofObjectsByID>
1364  ordered_nodes_set (this->get_mesh().local_nodes_begin(),
1365  this->get_mesh().local_nodes_end());
1366 
1367  ordered_nodes.insert(ordered_nodes.end(),
1368  ordered_nodes_set.begin(),
1369  ordered_nodes_set.end());
1370  }
1371  {
1372  std::set<const DofObject *, CompareDofObjectsByID>
1373  ordered_elements_set (this->get_mesh().local_elements_begin(),
1374  this->get_mesh().local_elements_end());
1375 
1376  ordered_elements.insert(ordered_elements.end(),
1377  ordered_elements_set.begin(),
1378  ordered_elements_set.end());
1379  }
1380 
1381  const unsigned int sys_num = this->number();
1382  const unsigned int nv = this->n_vars();
1383 
1384  // Loop over each non-SCALAR variable and each node, and write out the value.
1385  for (unsigned int var=0; var<nv; var++)
1386  if (this->variable(var).type().family != SCALAR)
1387  {
1388  // First write the node DOF values
1389  for (const auto & node : ordered_nodes)
1390  for (auto comp : make_range(node->n_comp(sys_num,var)))
1391  {
1392  libmesh_assert_not_equal_to (node->dof_number(sys_num, var, comp),
1394 
1395  io_buffer.push_back((*this->solution)(node->dof_number(sys_num, var, comp)));
1396  }
1397 
1398  // Then write the element DOF values
1399  for (const auto & elem : ordered_elements)
1400  for (auto comp : make_range(elem->n_comp(sys_num,var)))
1401  {
1402  libmesh_assert_not_equal_to (elem->dof_number(sys_num, var, comp),
1404 
1405  io_buffer.push_back((*this->solution)(elem->dof_number(sys_num, var, comp)));
1406  }
1407  }
1408 
1409  // Finally, write the SCALAR data on the last processor
1410  for (auto var : make_range(this->n_vars()))
1411  if (this->variable(var).type().family == SCALAR)
1412  {
1413  if (this->processor_id() == (this->n_processors()-1))
1414  {
1415  const DofMap & dof_map = this->get_dof_map();
1416  std::vector<dof_id_type> SCALAR_dofs;
1417  dof_map.SCALAR_dof_indices(SCALAR_dofs, var);
1418 
1419  for (auto dof : SCALAR_dofs)
1420  io_buffer.push_back((*this->solution)(dof));
1421  }
1422  }
1423 
1424  // 9.)
1425  //
1426  // Actually write the reordered solution vector
1427  // for the ith system to disk
1428 
1429  // set up the comment
1430  {
1431  comment = "# System \"";
1432  comment += this->name();
1433  comment += "\" Solution Vector";
1434  }
1435 
1436  io.data (io_buffer, comment);
1437 
1438  // total_written_size += io_buffer.size();
1439 
1440  // Only write additional vectors if wanted
1441  if (write_additional_data)
1442  {
1443  for (auto & [vec_name, vec] : _vectors)
1444  {
1445  io_buffer.clear();
1446  io_buffer.reserve(vec->local_size());
1447 
1448  // Loop over each non-SCALAR variable and each node, and write out the value.
1449  for (unsigned int var=0; var<nv; var++)
1450  if (this->variable(var).type().family != SCALAR)
1451  {
1452  // First write the node DOF values
1453  for (const auto & node : ordered_nodes)
1454  for (auto comp : make_range(node->n_comp(sys_num,var)))
1455  {
1456  libmesh_assert_not_equal_to (node->dof_number(sys_num, var, comp),
1458 
1459  io_buffer.push_back((*vec)(node->dof_number(sys_num, var, comp)));
1460  }
1461 
1462  // Then write the element DOF values
1463  for (const auto & elem : ordered_elements)
1464  for (auto comp : make_range(elem->n_comp(sys_num,var)))
1465  {
1466  libmesh_assert_not_equal_to (elem->dof_number(sys_num, var, comp),
1468 
1469  io_buffer.push_back((*vec)(elem->dof_number(sys_num, var, comp)));
1470  }
1471  }
1472 
1473  // Finally, write the SCALAR data on the last processor
1474  for (auto var : make_range(this->n_vars()))
1475  if (this->variable(var).type().family == SCALAR)
1476  {
1477  if (this->processor_id() == (this->n_processors()-1))
1478  {
1479  const DofMap & dof_map = this->get_dof_map();
1480  std::vector<dof_id_type> SCALAR_dofs;
1481  dof_map.SCALAR_dof_indices(SCALAR_dofs, var);
1482 
1483  for (auto dof : SCALAR_dofs)
1484  io_buffer.push_back((*vec)(dof));
1485  }
1486  }
1487 
1488  // 10.)
1489  //
1490  // Actually write the reordered additional vector
1491  // for this system to disk
1492 
1493  // set up the comment
1494  {
1495  comment = "# System \"";
1496  comment += this->name();
1497  comment += "\" Additional Vector \"";
1498  comment += vec_name;
1499  comment += "\"";
1500  }
1501 
1502  io.data (io_buffer, comment);
1503 
1504  // total_written_size += io_buffer.size();
1505  }
1506  }
1507 
1508  // const Real
1509  // dt = pl.get_elapsed_time(),
1510  // rate = total_written_size*sizeof(Number)/dt;
1511 
1512  // libMesh::err << "Write " << total_written_size << " \"Number\" values\n"
1513  // << " Elapsed time = " << dt << '\n'
1514  // << " Rate = " << rate/1.e6 << "(MB/sec)\n\n";
1515 
1516  // pl.pop("write_parallel_data");
1517 }
FEFamily family
The type of finite element.
Definition: fe_type.h:228
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.C:2699
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260
const MeshBase & get_mesh() const
Definition: system.h:2401
processor_id_type n_processors() const
unsigned int number() const
Definition: system.h:2393
static constexpr dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:473
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
libmesh_assert(ctx)
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
const std::string & name() const
Definition: system.h:2385
unsigned int n_vars() const
Definition: system.C:2669
processor_id_type processor_id() const
const DofMap & get_dof_map() const
Definition: system.h:2417
const FEType & type() const
Definition: variable.h:144

◆ write_parameter_data_to_files()

void libMesh::RBParametrized::write_parameter_data_to_files ( const std::string &  continuous_param_file_name,
const std::string &  discrete_param_file_name,
const bool  write_binary_data 
)
inherited

Write out the parameter ranges to files.

Definition at line 185 of file rb_parametrized.C.

References libMesh::RBParametrized::write_discrete_parameter_values_to_file(), and libMesh::RBParametrized::write_parameter_ranges_to_file().

Referenced by libMesh::RBSCMEvaluation::legacy_write_offline_data_to_files(), and libMesh::RBEvaluation::legacy_write_offline_data_to_files().

188 {
189  write_parameter_ranges_to_file(continuous_param_file_name, write_binary_data);
190  write_discrete_parameter_values_to_file(discrete_param_file_name, write_binary_data);
191 }
void write_discrete_parameter_values_to_file(const std::string &file_name, const bool write_binary_data)
Write out the discrete parameter values to file.
void write_parameter_ranges_to_file(const std::string &file_name, const bool write_binary)
Write out the parameter ranges to file.

◆ write_riesz_representors_to_files()

void libMesh::RBConstruction::write_riesz_representors_to_files ( const std::string &  riesz_representors_dir,
const bool  write_binary_residual_representors 
)
virtual

Write out all the Riesz representor data to files.

residual_representors_dir specifies which directory to write to. write_binary_residual_representors specifies whether we write binary or ASCII data.

Reimplemented in libMesh::TransientRBConstruction.

Definition at line 2540 of file rb_construction.C.

References libMesh::RBEvaluation::Aq_representor, TIMPI::Communicator::barrier(), libMesh::ParallelObject::comm(), libMesh::ENCODE, Fq_representor, get_delta_N(), libMesh::RBEvaluation::get_n_basis_functions(), get_rb_evaluation(), libMesh::index_range(), libMesh::libmesh_assert(), libMesh::Utility::mkdir(), libMesh::out, libMesh::ParallelObject::processor_id(), libMesh::System::solution, libMesh::WRITE, and libMesh::System::write_serialized_data().

2542 {
2543  LOG_SCOPE("write_riesz_representors_to_files()", "RBConstruction");
2544 
2545  // Write out Riesz representors. These are useful to have when restarting,
2546  // so you don't have to recompute them all over again.
2547 
2548  // First we write out the Fq representors, these are independent of an RBEvaluation object.
2549  libMesh::out << "Writing out the Fq_representors..." << std::endl;
2550 
2551  std::ostringstream file_name;
2552  const std::string riesz_representor_suffix = (write_binary_residual_representors ? ".xdr" : ".dat");
2553  struct stat stat_info;
2554 
2555  // Residual representors written out to their own separate directory
2556  if ( this->processor_id() == 0)
2557  if ( Utility::mkdir(riesz_representors_dir.c_str()) != 0)
2558  libMesh::out << "Skipping creating residual_representors directory: " << strerror(errno) << std::endl;
2559 
2560  for (auto i : index_range(Fq_representor))
2561  {
2562  if (Fq_representor[i])
2563  {
2564  file_name.str(""); // reset filename
2565  file_name << riesz_representors_dir << "/Fq_representor" << i << riesz_representor_suffix;
2566 
2567  // Check to see if file exists, if so, don't overwrite it, we assume it was
2568  // there from a previous call to this function. Note: if stat returns zero
2569  // it means it successfully got the file attributes (and therefore the file
2570  // exists). Because of the following factors:
2571  // 1.) write_serialized_data takes longer for proc 0 than it does for others,
2572  // so processors can get out of sync.
2573  // 2.) The constructor for Xdr opens a (0 length) file on *all* processors,
2574  // there are typically hundreds of 0-length files created during this loop,
2575  // and that screws up checking for the existence of files. One way to stay
2576  // in sync is to but a barrier at each iteration of the loop -- not sure how
2577  // bad this will affect performance, but it can't be much worse than serialized
2578  // I/O already is :)
2579  int stat_result = stat(file_name.str().c_str(), &stat_info);
2580 
2581  if ( (stat_result != 0) || // file definitely doesn't already exist
2582  (stat_info.st_size == 0)) // file exists, but has zero length (can happen if another proc already opened it!)
2583  {
2584  // No need to copy!
2585  // *solution = *(Fq_representor[i]);
2586  // std::swap doesn't work on pointers
2587  //std::swap(solution.get(), Fq_representor[i]);
2588  Fq_representor[i]->swap(*solution);
2589 
2590  Xdr fqr_data(file_name.str(),
2591  write_binary_residual_representors ? ENCODE : WRITE);
2592 
2593  write_serialized_data(fqr_data, false);
2594 
2595  // Synchronize before moving on
2596  this->comm().barrier();
2597 
2598  // Swap back.
2599  Fq_representor[i]->swap(*solution);
2600 
2601  // TODO: bzip the resulting file? See $LIBMESH_DIR/src/mesh/unstructured_mesh.C
2602  // for the system call, be sure to do it only on one processor, etc.
2603  }
2604  }
2605  }
2606 
2607 
2608  // Next, write out the Aq representors associated with rb_eval.
2609  libMesh::out << "Writing out the Aq_representors..." << std::endl;
2610 
2611  const unsigned int jstop = get_rb_evaluation().get_n_basis_functions();
2612  const unsigned int jstart = jstop-get_delta_N();
2613 
2614  RBEvaluation & rbe = get_rb_evaluation();
2615  for (auto i : index_range(rbe.Aq_representor))
2616  for (unsigned int j=jstart; j<jstop; ++j)
2617  {
2618  libMesh::out << "Writing out Aq_representor[" << i << "][" << j << "]..." << std::endl;
2619  libmesh_assert(get_rb_evaluation().Aq_representor[i][j]);
2620 
2621  file_name.str(""); // reset filename
2622  file_name << riesz_representors_dir
2623  << "/Aq_representor" << i << "_" << j << riesz_representor_suffix;
2624 
2625  {
2626  // No need to copy! Use swap instead.
2627  // *solution = *(Aq_representor[i][j]);
2628  rbe.Aq_representor[i][j]->swap(*solution);
2629 
2630  Xdr aqr_data(file_name.str(),
2631  write_binary_residual_representors ? ENCODE : WRITE);
2632 
2633  write_serialized_data(aqr_data, false);
2634 
2635  // Synchronize before moving on
2636  this->comm().barrier();
2637 
2638  // Swap back.
2639  rbe.Aq_representor[i][j]->swap(*solution);
2640 
2641  // TODO: bzip the resulting file? See $LIBMESH_DIR/src/mesh/unstructured_mesh.C
2642  // for the system call, be sure to do it only on one processor, etc.
2643  }
2644  }
2645 }
void write_serialized_data(Xdr &io, const bool write_additional_data=true) const
Writes additional data, namely vectors, for this System.
Definition: system_io.C:1521
std::vector< std::unique_ptr< NumericVector< Number > > > Fq_representor
Vector storing the residual representors associated with the right-hand side.
void barrier() const
const Parallel::Communicator & comm() const
int mkdir(const char *pathname)
Create a directory.
Definition: utility.C:152
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
libmesh_assert(ctx)
unsigned int get_delta_N() const
Get delta_N, the number of basis functions we add to the RB space per iteration of the greedy algorit...
OStreamProxy out
virtual unsigned int get_n_basis_functions() const
Get the current number of basis functions.
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:150

◆ write_serialized_data()

void libMesh::System::write_serialized_data ( Xdr io,
const bool  write_additional_data = true 
) const
inherited

Writes additional data, namely vectors, for this System.

This method may safely be called on a distributed-memory mesh.

This method implements the output of the vectors contained in this System object, embedded in the output of an EquationSystems<T_sys>.

9.) The global solution vector, re-ordered to be node-major (More on this later.)

for each additional vector in the object

10.) The global additional vector, re-ordered to be node-major (More on this later.)

Definition at line 1521 of file system_io.C.

References libMesh::System::_vectors, libMesh::Xdr::comment(), libMesh::System::name(), libMesh::ParallelObject::processor_id(), libMesh::System::solution, and libMesh::System::write_serialized_vector().

Referenced by libMesh::TransientRBConstruction::write_riesz_representors_to_files(), and write_riesz_representors_to_files().

1523 {
1537  parallel_object_only();
1538  std::string comment;
1539 
1540  // PerfLog pl("IO Performance",false);
1541  // pl.push("write_serialized_data");
1542  // std::size_t total_written_size = 0;
1543 
1544  // total_written_size +=
1545  this->write_serialized_vector(io, *this->solution);
1546 
1547  // set up the comment
1548  if (this->processor_id() == 0)
1549  {
1550  comment = "# System \"";
1551  comment += this->name();
1552  comment += "\" Solution Vector";
1553 
1554  io.comment (comment);
1555  }
1556 
1557  // Only write additional vectors if wanted
1558  if (write_additional_data)
1559  {
1560  for (auto & pair : this->_vectors)
1561  {
1562  // total_written_size +=
1563  this->write_serialized_vector(io, *pair.second);
1564 
1565  // set up the comment
1566  if (this->processor_id() == 0)
1567  {
1568  comment = "# System \"";
1569  comment += this->name();
1570  comment += "\" Additional Vector \"";
1571  comment += pair.first;
1572  comment += "\"";
1573  io.comment (comment);
1574  }
1575  }
1576  }
1577 
1578  // const Real
1579  // dt = pl.get_elapsed_time(),
1580  // rate = total_written_size*sizeof(Number)/dt;
1581 
1582  // libMesh::out << "Write " << total_written_size << " \"Number\" values\n"
1583  // << " Elapsed time = " << dt << '\n'
1584  // << " Rate = " << rate/1.e6 << "(MB/sec)\n\n";
1585 
1586  // pl.pop("write_serialized_data");
1587 
1588 
1589 
1590 
1591  // // test the new method
1592  // {
1593  // std::vector<std::string> names;
1594  // std::vector<NumericVector<Number> *> vectors_to_write;
1595 
1596  // names.push_back("Solution Vector");
1597  // vectors_to_write.push_back(this->solution.get());
1598 
1599  // // Only write additional vectors if wanted
1600  // if (write_additional_data)
1601  // {
1602  // std::map<std::string, NumericVector<Number> *>::const_iterator
1603  // pos = _vectors.begin();
1604 
1605  // for (; pos != this->_vectors.end(); ++pos)
1606  // {
1607  // names.push_back("Additional Vector " + pos->first);
1608  // vectors_to_write.push_back(pos->second);
1609  // }
1610  // }
1611 
1612  // total_written_size =
1613  // this->write_serialized_vectors (io, names, vectors_to_write);
1614 
1615  // const Real
1616  // dt2 = pl.get_elapsed_time(),
1617  // rate2 = total_written_size*sizeof(Number)/(dt2-dt);
1618 
1619  // libMesh::out << "Write (new) " << total_written_size << " \"Number\" values\n"
1620  // << " Elapsed time = " << (dt2-dt) << '\n'
1621  // << " Rate = " << rate2/1.e6 << "(MB/sec)\n\n";
1622 
1623  // }
1624 }
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
Some systems need an arbitrary number of vectors.
Definition: system.h:2260
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1655
const std::string & name() const
Definition: system.h:2385
processor_id_type processor_id() const
dof_id_type write_serialized_vector(Xdr &io, const NumericVector< Number > &vec) const
Writes a vector for this System.
Definition: system_io.C:1971

◆ write_serialized_vectors()

std::size_t libMesh::System::write_serialized_vectors ( Xdr io,
const std::vector< const NumericVector< Number > *> &  vectors 
) const
inherited

Serialize & write a number of identically distributed vectors.

This method allows for optimization for the multiple vector case by only communicating the metadata once.

Definition at line 2114 of file system_io.C.

References libMesh::Xdr::data(), libMesh::System::get_mesh(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::MeshTools::n_elem(), libMesh::MeshBase::n_elem(), n_nodes, libMesh::MeshBase::n_nodes(), libMesh::System::n_vars(), libMesh::ParallelObject::processor_id(), libMesh::SCALAR, libMesh::System::variable(), libMesh::System::write_SCALAR_dofs(), libMesh::System::write_serialized_blocked_dof_objects(), and libMesh::Xdr::writing().

Referenced by libMesh::RBEvaluation::write_out_vectors().

2116 {
2117  parallel_object_only();
2118 
2119  libmesh_assert (io.writing());
2120 
2121  // Cache these - they are not free!
2122  const dof_id_type
2123  n_nodes = this->get_mesh().n_nodes(),
2124  n_elem = this->get_mesh().n_elem();
2125 
2126  std::size_t written_length = 0;
2127 
2128  if (this->processor_id() == 0)
2129  {
2130  unsigned int
2131  n_vec = cast_int<unsigned int>(vectors.size());
2132  dof_id_type
2133  vec_size = vectors.empty() ? 0 : vectors[0]->size();
2134  // Set the number of vectors
2135  io.data(n_vec, "# number of vectors");
2136  // Set the buffer size
2137  io.data(vec_size, "# vector length");
2138  }
2139 
2140  //---------------------------------
2141  // Collect the values for all nodes
2142  written_length +=
2143  this->write_serialized_blocked_dof_objects (vectors,
2144  n_nodes,
2145  this->get_mesh().local_nodes_begin(),
2146  this->get_mesh().local_nodes_end(),
2147  io);
2148 
2149  //------------------------------------
2150  // Collect the values for all elements
2151  written_length +=
2152  this->write_serialized_blocked_dof_objects (vectors,
2153  n_elem,
2154  this->get_mesh().local_elements_begin(),
2155  this->get_mesh().local_elements_end(),
2156  io);
2157 
2158  //-------------------------------------------
2159  // Finally loop over all the SCALAR variables
2160  for (const NumericVector<Number> * vec : vectors)
2161  for (auto var : make_range(this->n_vars()))
2162  if (this->variable(var).type().family == SCALAR)
2163  {
2164  libmesh_assert_not_equal_to (vec, 0);
2165 
2166  written_length +=
2167  this->write_SCALAR_dofs (*vec, var, io);
2168  }
2169 
2170  return written_length;
2171 }
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.C:2699
dof_id_type n_elem(const MeshBase::const_element_iterator &begin, const MeshBase::const_element_iterator &end)
Count up the number of elements of a specific type (as defined by an iterator range).
Definition: mesh_tools.C:976
unsigned int write_SCALAR_dofs(const NumericVector< Number > &vec, const unsigned int var, Xdr &io) const
Writes the SCALAR dofs associated with var to the stream io.
Definition: system_io.C:1915
const MeshBase & get_mesh() const
Definition: system.h:2401
const dof_id_type n_nodes
Definition: tecplot_io.C:67
libmesh_assert(ctx)
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:173
unsigned int n_vars() const
Definition: system.C:2669
virtual dof_id_type n_elem() const =0
processor_id_type processor_id() const
template class LIBMESH_EXPORT NumericVector< Number >
virtual dof_id_type n_nodes() const =0
std::size_t write_serialized_blocked_dof_objects(const std::vector< const NumericVector< Number > *> &vecs, const dof_id_type n_objects, const iterator_type begin, const iterator_type end, Xdr &io, const unsigned int var_to_write=libMesh::invalid_uint) const
Writes an output vector to the stream io for a set of DofObjects.
Definition: system_io.C:1629
uint8_t dof_id_type
Definition: id_types.h:67

◆ zero_constrained_dofs_on_vector()

void libMesh::RBConstruction::zero_constrained_dofs_on_vector ( NumericVector< Number > &  vector) const

It is sometimes useful to be able to zero vector entries that correspond to constrained dofs.

Definition at line 444 of file rb_construction.C.

References libMesh::NumericVector< T >::close(), libMesh::DofMapBase::end_dof(), libMesh::DofMapBase::first_dof(), libMesh::System::get_dof_map(), libMesh::DofMap::is_constrained_dof(), and libMesh::NumericVector< T >::set().

445 {
446 #ifdef LIBMESH_ENABLE_CONSTRAINTS
447  const DofMap & dof_map = get_dof_map();
448 
449  for (dof_id_type i=dof_map.first_dof(); i<dof_map.end_dof(); i++)
450  {
452  {
453  vector.set(i, 0.);
454  }
455  }
456 #endif
457 
458  vector.close();
459 }
bool is_constrained_dof(const dof_id_type dof) const
Definition: dof_map.h:2426
virtual void close()=0
Calls the NumericVector&#39;s internal assembly routines, ensuring that the values are consistent across ...
virtual void set(const numeric_index_type i, const T value)=0
Sets v(i) = value.
const DofMap & get_dof_map() const
Definition: system.h:2417
uint8_t dof_id_type
Definition: id_types.h:67

◆ zero_variable()

void libMesh::System::zero_variable ( NumericVector< Number > &  v,
unsigned int  var_num 
) const
inherited

Zeroes all dofs in v that correspond to variable number var_num.

Definition at line 1450 of file system.C.

References libMesh::System::get_mesh(), mesh, libMesh::System::n_vars(), libMesh::System::number(), and libMesh::NumericVector< T >::set().

1452 {
1453  /* Make sure the call makes sense. */
1454  libmesh_assert_less (var_num, this->n_vars());
1455 
1456  /* Get a reference to the mesh. */
1457  const MeshBase & mesh = this->get_mesh();
1458 
1459  /* Check which system we are. */
1460  const unsigned int sys_num = this->number();
1461 
1462  // Loop over nodes.
1463  for (const auto & node : mesh.local_node_ptr_range())
1464  {
1465  unsigned int n_comp = node->n_comp(sys_num,var_num);
1466  for (unsigned int i=0; i<n_comp; i++)
1467  {
1468  const dof_id_type index = node->dof_number(sys_num,var_num,i);
1469  v.set(index,0.0);
1470  }
1471  }
1472 
1473  // Loop over elements.
1474  for (const auto & elem : mesh.active_local_element_ptr_range())
1475  {
1476  unsigned int n_comp = elem->n_comp(sys_num,var_num);
1477  for (unsigned int i=0; i<n_comp; i++)
1478  {
1479  const dof_id_type index = elem->dof_number(sys_num,var_num,i);
1480  v.set(index,0.0);
1481  }
1482  }
1483 }
MeshBase & mesh
const MeshBase & get_mesh() const
Definition: system.h:2401
unsigned int number() const
Definition: system.h:2393
virtual void set(const numeric_index_type i, const T value)=0
Sets v(i) = value.
unsigned int n_vars() const
Definition: system.C:2669
uint8_t dof_id_type
Definition: id_types.h:67

Member Data Documentation

◆ _communicator

const Parallel::Communicator& libMesh::ParallelObject::_communicator
protectedinherited

◆ _counts [1/2]

ReferenceCounter::Counts libMesh::ReferenceCounter::_counts
staticprotectedinherited

Actually holds the data.

Definition at line 124 of file reference_counter.h.

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

◆ _counts [2/2]

ReferenceCounter::Counts libMesh::ReferenceCounter::_counts
staticprotectedinherited

Actually holds the data.

Definition at line 124 of file reference_counter.h.

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

◆ _current_training_parameter_index

unsigned int libMesh::RBConstruction::_current_training_parameter_index
private

The current training parameter index during reduced basis training.

Definition at line 1011 of file rb_construction.h.

Referenced by get_current_training_parameter_index(), and set_current_training_parameter_index().

◆ _enable_print_counter [1/2]

bool libMesh::ReferenceCounter::_enable_print_counter = true
staticprotectedinherited

Flag to control whether reference count information is printed when print_info is called.

Definition at line 143 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::disable_print_counter_info(), libMesh::ReferenceCounter::enable_print_counter_info(), and libMesh::ReferenceCounter::print_info().

◆ _enable_print_counter [2/2]

bool libMesh::ReferenceCounter::_enable_print_counter = true
staticprotectedinherited

Flag to control whether reference count information is printed when print_info is called.

Definition at line 143 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::disable_print_counter_info(), libMesh::ReferenceCounter::enable_print_counter_info(), and libMesh::ReferenceCounter::print_info().

◆ _evaluated_thetas

std::vector<std::vector<Number> > libMesh::RBConstruction::_evaluated_thetas
private

Storage of evaluated theta functions at a set of parameters.

This can be used to store all of our theta functions at training samples instead of re-evaluating the same values repeatedly during training.

Definition at line 1018 of file rb_construction.h.

Referenced by get_evaluated_thetas(), and preevaluate_thetas().

◆ _final_linear_residual

Real libMesh::LinearImplicitSystem::_final_linear_residual
protectedinherited

◆ _mutex [1/2]

Threads::spin_mutex libMesh::ReferenceCounter::_mutex
staticprotectedinherited

Mutual exclusion object to enable thread-safe reference counting.

Definition at line 137 of file reference_counter.h.

◆ _mutex [2/2]

Threads::spin_mutex libMesh::ReferenceCounter::_mutex
staticprotectedinherited

Mutual exclusion object to enable thread-safe reference counting.

Definition at line 137 of file reference_counter.h.

◆ _n_linear_iterations

unsigned int libMesh::LinearImplicitSystem::_n_linear_iterations
protectedinherited

The number of linear iterations required to solve the linear system Ax=b.

Definition at line 192 of file linear_implicit_system.h.

Referenced by libMesh::LinearImplicitSystem::n_linear_iterations(), libMesh::FrequencySystem::solve(), libMesh::LinearImplicitSystem::solve(), and solve_for_matrix_and_rhs().

◆ _n_objects [1/2]

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

The number of objects.

Print the reference count information when the number returns to 0.

Definition at line 132 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::n_objects(), libMesh::ReferenceCounter::ReferenceCounter(), and libMesh::ReferenceCounter::~ReferenceCounter().

◆ _n_objects [2/2]

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

The number of objects.

Print the reference count information when the number returns to 0.

Definition at line 132 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::n_objects(), libMesh::ReferenceCounter::ReferenceCounter(), and libMesh::ReferenceCounter::~ReferenceCounter().

◆ _normalize_solution_snapshots

bool libMesh::RBConstructionBase< LinearImplicitSystem >::_normalize_solution_snapshots
protectedinherited

Set this boolean to true if we want to normalize solution snapshots used in training to have norm of 1.

This is relevant if snapshots have differing magnitudes and we want to approximate them all with equal accuracy.

Definition at line 281 of file rb_construction_base.h.

Referenced by train_reduced_basis_with_POD().

◆ _preevaluate_thetas_completed

bool libMesh::RBConstruction::_preevaluate_thetas_completed
private

Flag to indicate if the preevaluate_thetas function has been called, since this allows us to avoid calling preevaluate_thetas more than once, which is typically unnecessary.

Definition at line 1006 of file rb_construction.h.

Referenced by preevaluate_thetas(), and reset_preevaluate_thetas_completed().

◆ _preevaluate_thetas_flag

bool libMesh::RBConstruction::_preevaluate_thetas_flag
private

Flag to indicate if we preevaluate the theta functions.

Definition at line 999 of file rb_construction.h.

Referenced by get_preevaluate_thetas_flag(), and set_preevaluate_thetas_flag().

◆ _shell_matrix

ShellMatrix<Number>* libMesh::LinearImplicitSystem::_shell_matrix
protectedinherited

User supplies shell matrix or nullptr if no shell matrix is used.

Definition at line 202 of file linear_implicit_system.h.

Referenced by libMesh::LinearImplicitSystem::attach_shell_matrix(), libMesh::LinearImplicitSystem::get_shell_matrix(), and libMesh::LinearImplicitSystem::solve().

◆ _subset

const SystemSubset* libMesh::LinearImplicitSystem::_subset
protectedinherited

The current subset on which to solve (or nullptr if none).

Definition at line 207 of file linear_implicit_system.h.

Referenced by libMesh::LinearImplicitSystem::restrict_solve_to(), and libMesh::LinearImplicitSystem::solve().

◆ _subset_solve_mode

SubsetSolveMode libMesh::LinearImplicitSystem::_subset_solve_mode
protectedinherited

If restrict-solve-to-subset mode is active, this member decides what happens with the dofs outside the subset.

Definition at line 213 of file linear_implicit_system.h.

Referenced by libMesh::LinearImplicitSystem::restrict_solve_to(), and libMesh::LinearImplicitSystem::solve().

◆ _untransformed_basis_functions

std::vector<std::unique_ptr<NumericVector<Number> > > libMesh::RBConstruction::_untransformed_basis_functions
private

In cases where we have dof transformations such as a change of coordinates at some nodes we need to store an extra set of basis functions which have not had dof transformations applied to them.

These vectors are required in order to compute the residual in the error indicator.

Definition at line 988 of file rb_construction.h.

Referenced by compute_residual_dual_norm_slow(), enrich_RB_space(), and update_residual_terms().

◆ _untransformed_solution

std::unique_ptr<NumericVector<Number> > libMesh::RBConstruction::_untransformed_solution
private

We also store a copy of the untransformed solution in order to create _untransformed_basis_functions.

Definition at line 994 of file rb_construction.h.

Referenced by enrich_RB_space(), and truth_solve().

◆ abs_training_tolerance

Real libMesh::RBConstruction::abs_training_tolerance
private

◆ Aq_vector

std::vector<std::unique_ptr<SparseMatrix<Number> > > libMesh::RBConstruction::Aq_vector
private

Vector storing the Q_a matrices from the affine expansion.

Definition at line 936 of file rb_construction.h.

Referenced by allocate_data_structures(), clear(), and get_Aq().

◆ assemble_before_solve

bool libMesh::System::assemble_before_solve
inherited

Flag which tells the system to whether or not to call the user assembly function during each call to solve().

By default, every call to solve() begins with a call to the user assemble, so this flag is true. (For explicit systems, "solving" the system occurs during the assembly step, so this flag is always true for explicit systems.)

You will only want to set this to false if you need direct control over when the system is assembled, and are willing to track the state of its assembly yourself. An example of such a case is an implicit system with multiple right hand sides. In this instance, a single assembly would likely be followed with multiple calls to solve.

The frequency system and Newmark system have their own versions of this flag, called _finished_assemble, which might be able to be replaced with this more general concept.

Definition at line 1609 of file system.h.

Referenced by libMesh::ImplicitSystem::adjoint_solve(), libMesh::ClawSystem::ClawSystem(), libMesh::ImplicitSystem::disable_cache(), libMesh::System::disable_cache(), main(), RBConstruction(), libMesh::RBSCMConstruction::RBSCMConstruction(), libMesh::ImplicitSystem::sensitivity_solve(), libMesh::EigenSystem::solve(), libMesh::CondensedEigenSystem::solve(), and libMesh::LinearImplicitSystem::solve().

◆ assert_convergence

bool libMesh::RBConstruction::assert_convergence
protected

◆ compute_RB_inner_product

bool libMesh::RBConstruction::compute_RB_inner_product

Boolean flag to indicate whether we compute the RB_inner_product_matrix.

This is false by default in RBConstruction since (in the default implementation) the RB inner-product matrix will just be the identity. But we may need the inner-product matrix subclasses.

Definition at line 617 of file rb_construction.h.

Referenced by libMesh::TransientRBConstruction::TransientRBConstruction(), and update_RB_system_matrices().

◆ current_local_solution

std::unique_ptr<NumericVector<Number> > libMesh::System::current_local_solution
inherited

All the values I need to compute my contribution to the simulation at hand.

Think of this as the current solution with any ghost values needed from other processors. This vector is necessarily larger than the solution vector in the case of a parallel simulation. The update() member is used to synchronize the contents of the solution and current_local_solution vectors.

Definition at line 1667 of file system.h.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::UniformRefinementEstimator::_estimate_error(), alternative_fe_assembly(), libMesh::VariationalSmootherSystem::assembly(), libMesh::NonlinearImplicitSystem::assembly(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::System::clear(), libMesh::Problem_Interface::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), libMesh::System::current_solution(), DMlibMeshFunction(), DMlibMeshJacobian(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), fe_assembly(), libMesh::StaticCondensation::init(), libMesh::System::init_data(), libMesh::libmesh_petsc_snes_fd_residual(), libMesh::libmesh_petsc_snes_jacobian(), libMesh::libmesh_petsc_snes_mffd_residual(), libMesh::libmesh_petsc_snes_residual(), libMesh::libmesh_petsc_snes_residual_helper(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::FEMContext::pre_fe_reinit(), libMesh::System::re_update(), libMesh::System::reinit(), libMesh::System::restrict_vectors(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), SolidSystem::save_initial_mesh(), set_context_solution_vec(), setup(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), MeshFunctionTest::test_subdomain_id_sets(), MeshInputTest::testCopyElementVectorImpl(), libMesh::BoundaryVolumeSolutionTransfer::transfer_boundary_volume(), libMesh::TransientRBConstruction::truth_assembly(), libMesh::TransientRBConstruction::truth_solve(), libMesh::System::update(), libMesh::Nemesis_IO_Helper::write_element_values(), and libMesh::Nemesis_IO_Helper::write_nodal_solution().

◆ delta_N

unsigned int libMesh::RBConstruction::delta_N
protected

◆ energy_inner_product_coeffs

std::vector<Number> libMesh::RBConstruction::energy_inner_product_coeffs
private

We may optionally want to use the "energy inner-product" rather than the inner-product assembly specified in inner_product_assembly.

In this case the inner-product will be defined by sum_q^Q k_q * A_q. Here we provide the k_q values that will be used. (Note that a true "energy-inner product" would obtain the k_q from the theta_q's, but this is different for each parameter choice so we just provide a fixed set of k_q's here to ensure that the inner-product is parameter independent)

Definition at line 931 of file rb_construction.h.

Referenced by assemble_inner_product_matrix(), and set_energy_inner_product().

◆ exit_on_repeated_greedy_parameters

bool libMesh::RBConstruction::exit_on_repeated_greedy_parameters

Boolean flag to indicate whether we exit the greedy if we select the same parameters twice in a row.

In some problems this indicates that the greedy has "saturated" typically due to numerical rounding effects.

Definition at line 594 of file rb_construction.h.

Referenced by greedy_termination_test(), and libMesh::TransientRBConstruction::TransientRBConstruction().

◆ extra_linear_solver

LinearSolver<Number>* libMesh::RBConstruction::extra_linear_solver

Also, we store a pointer to an extra linear solver.

This can be useful if we want to pass in the linear solver from somewhere else. For example, if a solver is already primed elsewhere then it can be more efficient to use that solver.

Definition at line 543 of file rb_construction.h.

Referenced by enrich_basis_from_rhs_terms(), and truth_solve().

◆ extra_quadrature_order

int libMesh::System::extra_quadrature_order
inherited

A member int that can be employed to indicate increased or reduced quadrature order.

Note
For FEMSystem users, by default, when calling the user-defined residual functions, the FEMSystem will first set up an appropriate FEType::default_quadrature_rule() object for performing the integration. This rule will integrate elements of order up to 2*p+1 exactly (where p is the sum of the base FEType and local p refinement levels), but if additional (or reduced) quadrature accuracy is desired then this extra_quadrature_order (default 0) will be added.

Definition at line 1640 of file system.h.

Referenced by CurlCurlSystem::init_data(), and set_system_parameters().

◆ Fq_representor

std::vector<std::unique_ptr<NumericVector<Number> > > libMesh::RBConstruction::Fq_representor

Vector storing the residual representors associated with the right-hand side.

These are basis independent and hence stored here, whereas the Aq_representors are stored in RBEvaluation

Definition at line 568 of file rb_construction.h.

Referenced by allocate_data_structures(), clear(), compute_Fq_representor_innerprods(), read_riesz_representors_from_files(), libMesh::TransientRBConstruction::update_residual_terms(), update_residual_terms(), and write_riesz_representors_to_files().

◆ Fq_representor_innerprods

std::vector<Number> libMesh::RBConstruction::Fq_representor_innerprods

Vectors storing the residual representor inner products to be used in computing the residuals online.

We store the Fq representor norms here because they are independent of a reduced basis space. The basis dependent representors are stored in RBEvaluation.

Definition at line 577 of file rb_construction.h.

Referenced by allocate_data_structures(), and compute_Fq_representor_innerprods().

◆ Fq_representor_innerprods_computed

bool libMesh::RBConstruction::Fq_representor_innerprods_computed

A boolean flag to indicate whether or not the Fq representor norms have already been computed — used to make sure that we don't recompute them unnecessarily.

Definition at line 657 of file rb_construction.h.

Referenced by clear(), compute_Fq_representor_innerprods(), read_riesz_representors_from_files(), and recompute_all_residual_terms().

◆ Fq_vector

std::vector<std::unique_ptr<NumericVector<Number> > > libMesh::RBConstruction::Fq_vector
private

Vector storing the Q_f vectors in the affine decomposition of the right-hand side.

Definition at line 942 of file rb_construction.h.

Referenced by allocate_data_structures(), clear(), and get_Fq().

◆ impose_internal_fluxes

bool libMesh::RBConstruction::impose_internal_fluxes

Boolean flag to indicate whether we impose "fluxes" (i.e.

element boundary contributions to the weak form) on internal element boundaries in the assembly routines.

Definition at line 601 of file rb_construction.h.

Referenced by add_scaled_matrix_and_vector().

◆ inner_product_assembly

ElemAssembly* libMesh::RBConstruction::inner_product_assembly
private

Pointer to inner product assembly.

Definition at line 913 of file rb_construction.h.

Referenced by assemble_inner_product_matrix(), get_inner_product_assembly(), and set_inner_product_assembly().

◆ inner_product_matrix

std::unique_ptr<SparseMatrix<Number> > libMesh::RBConstruction::inner_product_matrix

◆ inner_product_solver

std::unique_ptr<LinearSolver<Number> > libMesh::RBConstruction::inner_product_solver

We store an extra linear solver object which we can optionally use for solving all systems in which the system matrix is set to inner_product_matrix.

Definition at line 535 of file rb_construction.h.

Referenced by compute_Fq_representor_innerprods(), compute_residual_dual_norm_slow(), initialize_rb_construction(), libMesh::TransientRBConstruction::update_residual_terms(), and update_residual_terms().

◆ inner_product_storage_vector

std::unique_ptr<NumericVector<Number> > libMesh::RBConstructionBase< LinearImplicitSystem >::inner_product_storage_vector
protectedinherited

◆ linear_solver

std::unique_ptr<LinearSolver<Number> > libMesh::ImplicitSystem::linear_solver
mutableinherited

◆ matrix

SparseMatrix<Number>* libMesh::ImplicitSystem::matrix
inherited

The system matrix.

Implicit systems are characterized by the need to solve the linear system Ax=b. This is the system matrix A.

Public access to this member variable will be deprecated in the future! Use get_system_matrix() instead.

Definition at line 311 of file implicit_system.h.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), add_M_C_K_helmholtz(), libMesh::ImplicitSystem::add_matrices(), libMesh::ImplicitSystem::adjoint_solve(), libMesh::ImplicitSystem::assemble(), assemble_func(), assemble_temperature_jump(), libMesh::FEMSystem::assembly(), libMesh::LinearImplicitSystem::assembly(), libMesh::NonlinearImplicitSystem::assembly(), libMesh::ImplicitSystem::clear(), libMesh::NewmarkSystem::compute_matrix(), compute_residual_dual_norm_slow(), libMesh::ContinuationSystem::continuation_solve(), libMesh::ImplicitSystem::create_static_condensation_system_matrix(), DMCreateMatrix_libMesh(), DMlibMeshJacobian(), enrich_basis_from_rhs_terms(), fill_dirichlet_bc(), libMesh::ImplicitSystem::forward_qoi_parameter_sensitivity(), libMesh::ImplicitSystem::get_system_matrix(), main(), periodic_bc_test_poisson(), libMesh::ImplicitSystem::qoi_parameter_hessian(), libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product(), libMesh::ImplicitSystem::sensitivity_solve(), libMesh::NewtonSolver::solve(), libMesh::PetscDiffSolver::solve(), libMesh::NoxNonlinearSolver< Number >::solve(), libMesh::EigenTimeSolver::solve(), libMesh::FrequencySystem::solve(), libMesh::LinearImplicitSystem::solve(), libMesh::NonlinearImplicitSystem::solve(), libMesh::ClawSystem::solve_conservation_law(), libMesh::ContinuationSystem::solve_tangent(), libMesh::TransientRBConstruction::truth_assembly(), truth_assembly(), libMesh::TransientRBConstruction::truth_solve(), truth_solve(), libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve(), and libMesh::ImplicitSystem::weighted_sensitivity_solve().

◆ Nmax

unsigned int libMesh::RBConstruction::Nmax
protected

Maximum number of reduced basis functions we are willing to use.

Definition at line 872 of file rb_construction.h.

Referenced by libMesh::TransientRBConstruction::allocate_data_structures(), get_Nmax(), print_info(), process_parameters_file(), and set_Nmax().

◆ non_dirichlet_Aq_vector

std::vector<std::unique_ptr<SparseMatrix<Number> > > libMesh::RBConstruction::non_dirichlet_Aq_vector
private

We may also need a second set of matrices/vectors that do not have the Dirichlet boundary conditions enforced.

Definition at line 955 of file rb_construction.h.

Referenced by allocate_data_structures(), clear(), and get_non_dirichlet_Aq().

◆ non_dirichlet_Fq_vector

std::vector<std::unique_ptr<NumericVector<Number> > > libMesh::RBConstruction::non_dirichlet_Fq_vector
private

Definition at line 956 of file rb_construction.h.

Referenced by allocate_data_structures(), clear(), and get_non_dirichlet_Fq().

◆ non_dirichlet_inner_product_matrix

std::unique_ptr<SparseMatrix<Number> > libMesh::RBConstruction::non_dirichlet_inner_product_matrix
private

◆ non_dirichlet_outputs_vector

std::vector<std::vector<std::unique_ptr<NumericVector<Number> > > > libMesh::RBConstruction::non_dirichlet_outputs_vector
private

◆ normalize_rb_bound_in_greedy

bool libMesh::RBConstruction::normalize_rb_bound_in_greedy
private

This boolean indicates if we normalize the RB error in the greedy using RBEvaluation::get_error_bound_normalization().

Definition at line 971 of file rb_construction.h.

Referenced by get_normalize_rb_bound_in_greedy(), get_RB_error_bound(), and set_normalize_rb_bound_in_greedy().

◆ output_dual_innerprods

std::vector<std::vector<Number > > libMesh::RBConstruction::output_dual_innerprods

The vector storing the dual norm inner product terms for each output.

Definition at line 560 of file rb_construction.h.

Referenced by allocate_data_structures(), and compute_output_dual_innerprods().

◆ output_dual_innerprods_computed

bool libMesh::RBConstruction::output_dual_innerprods_computed
protected

A boolean flag to indicate whether or not the output dual norms have already been computed — used to make sure that we don't recompute them unnecessarily.

Definition at line 885 of file rb_construction.h.

Referenced by compute_output_dual_innerprods().

◆ outputs_vector

std::vector<std::vector<std::unique_ptr<NumericVector<Number> > > > libMesh::RBConstruction::outputs_vector
private

The libMesh vectors that define the output functionals.

Each row corresponds to the affine expansion of an output.

Definition at line 948 of file rb_construction.h.

Referenced by allocate_data_structures(), clear(), and get_output_vector().

◆ parameters

Parameters libMesh::System::parameters
inherited

◆ quiet_mode

bool libMesh::RBConstructionBase< LinearImplicitSystem >::quiet_mode
protectedinherited

Flag to indicate whether we print out extra information during the Offline stage.

Definition at line 265 of file rb_construction_base.h.

Referenced by process_parameters_file().

◆ rb_assembly_expansion

RBAssemblyExpansion* libMesh::RBConstruction::rb_assembly_expansion
private

This member holds the (parameter independent) assembly functors that define the "affine expansion" of the PDE that we are solving.

Definition at line 908 of file rb_construction.h.

Referenced by add_scaled_Aq(), assemble_all_output_vectors(), assemble_Aq_matrix(), assemble_Fq_vector(), assemble_inner_product_matrix(), get_rb_assembly_expansion(), and set_rb_assembly_expansion().

◆ rb_eval

RBEvaluation* libMesh::RBConstruction::rb_eval
private

The current RBEvaluation object we are using to perform the Evaluation stage of the reduced basis method.

Definition at line 902 of file rb_construction.h.

Referenced by get_rb_evaluation(), is_rb_eval_initialized(), and set_rb_evaluation().

◆ RB_training_type

std::string libMesh::RBConstruction::RB_training_type
private

This string indicates the type of training that we will use.

Options are:

  • Greedy: Reduced basis greedy algorithm
  • POD: Proper Orthogonal Decomposition

Definition at line 979 of file rb_construction.h.

Referenced by get_RB_training_type(), and set_RB_training_type().

◆ rel_training_tolerance

Real libMesh::RBConstruction::rel_training_tolerance
private

Relative and absolute tolerances for training reduced basis using the Greedy scheme.

Definition at line 964 of file rb_construction.h.

Referenced by get_rel_training_tolerance(), greedy_termination_test(), process_parameters_file(), set_rel_training_tolerance(), and train_reduced_basis_with_POD().

◆ rhs

NumericVector<Number>* libMesh::ExplicitSystem::rhs
inherited

The system matrix.

Implicit systems are characterized by the need to solve the linear system Ax=b. This is the right-hand-side vector b.

Definition at line 124 of file explicit_system.h.

Referenced by libMesh::__libmesh_petsc_diff_solver_residual(), add_M_C_K_helmholtz(), libMesh::ExplicitSystem::add_system_rhs(), assemble(), libMesh::ImplicitSystem::assemble(), LinearElasticity::assemble(), assemble_1D(), assemble_biharmonic(), libMesh::AdvectionSystem::assemble_claw_rhs(), assemble_divgrad(), assemble_elasticity(), assemble_ellipticdg(), assemble_func(), assemble_graddiv(), assemble_laplace(), assemble_matrix_and_rhs(), assemble_poisson(), libMesh::ImplicitSystem::assemble_residual_derivatives(), assemble_shell(), assemble_stokes(), assemble_temperature_jump(), assemble_wave(), libMesh::FEMSystem::assembly(), libMesh::VariationalSmootherSystem::assembly(), libMesh::LinearImplicitSystem::assembly(), libMesh::NonlinearImplicitSystem::assembly(), assembly_with_dg_fem_context(), compute_Fq_representor_innerprods(), compute_output_dual_innerprods(), compute_residual_dual_norm_slow(), libMesh::Problem_Interface::computeF(), libMesh::ContinuationSystem::continuation_solve(), DMlibMeshFunction(), enrich_basis_from_rhs_terms(), fill_dirichlet_bc(), libMesh::ImplicitSystem::forward_qoi_parameter_sensitivity(), libMesh::NewtonSolver::line_search(), periodic_bc_test_poisson(), HeatSystem::perturb_accumulate_residuals(), libMesh::ImplicitSystem::qoi_parameter_hessian(), libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product(), libMesh::NewtonSolver::solve(), libMesh::PetscDiffSolver::solve(), libMesh::FrequencySystem::solve(), libMesh::LinearImplicitSystem::solve(), libMesh::NonlinearImplicitSystem::solve(), libMesh::ContinuationSystem::solve_tangent(), libMesh::TransientRBConstruction::truth_assembly(), truth_assembly(), libMesh::TransientRBConstruction::truth_solve(), truth_solve(), libMesh::TransientRBConstruction::update_residual_terms(), update_residual_terms(), libMesh::NewmarkSystem::update_rhs(), libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve(), and libMesh::ImplicitSystem::weighted_sensitivity_solve().

◆ serial_training_set

bool libMesh::RBConstructionBase< LinearImplicitSystem >::serial_training_set
protectedinherited

This boolean flag indicates whether or not the training set should be the same on all processors.

By default it is false, but in the case of the Empirical Interpolation Method (RBEIMConstruction), for example, we need the training set to be identical on all processors.

Definition at line 273 of file rb_construction_base.h.

Referenced by compute_max_error_bound(), set_RB_training_type(), and train_reduced_basis_with_POD().

◆ skip_degenerate_sides

bool libMesh::RBConstruction::skip_degenerate_sides

In some cases meshes are intentionally created with degenerate sides as a way to represent, say, triangles using a hex-only mesh.

In this situation we should detect and skip any degenerate sides in order to prevent zero or negative element Jacobian errors.

Definition at line 609 of file rb_construction.h.

Referenced by add_scaled_matrix_and_vector().

◆ skip_residual_in_train_reduced_basis

bool libMesh::RBConstruction::skip_residual_in_train_reduced_basis

Boolean flag to indicate if we skip residual calculations in train_reduced_basis.

This should only be used in special cases, e.g. when we know a priori that we want exactly one basis function and hence we do not need the residual based error indicator.

Definition at line 586 of file rb_construction.h.

Referenced by train_reduced_basis_with_greedy().

◆ solution

std::unique_ptr<NumericVector<Number> > libMesh::System::solution
inherited

Data structure to hold solution values.

Definition at line 1655 of file system.h.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::TransientRBConstruction::add_IC_to_RB_space(), libMesh::NewmarkSolver::advance_timestep(), libMesh::AdaptiveTimeSolver::advance_timestep(), libMesh::UnsteadySolver::advance_timestep(), libMesh::ContinuationSystem::apply_predictor(), libMesh::TransientRBConstruction::assemble_affine_expansion(), libMesh::FEMSystem::assembly(), libMesh::VariationalSmootherSystem::assembly(), libMesh::LinearImplicitSystem::assembly(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), check_if_zero_truth_solve(), libMesh::System::clear(), libMesh::System::compare(), compute_enriched_soln(), compute_Fq_representor_innerprods(), libMesh::NewmarkSolver::compute_initial_accel(), compute_output_dual_innerprods(), compute_residual_dual_norm_slow(), compute_stresses(), LinearElasticityWithContact::compute_stresses(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), libMesh::Problem_Interface::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), libMesh::ContinuationSystem::continuation_solve(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::GMVIO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), create_wrapped_function(), DMCreateGlobalVector_libMesh(), DMlibMeshFunction(), DMlibMeshJacobian(), libMesh::UnsteadySolver::du(), enrich_RB_space(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::AdjointResidualErrorEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::SmoothnessEstimator::estimate_smoothness(), libMesh::RBSCMConstruction::evaluate_stability_constant(), libMesh::EigenSystem::get_eigenpair(), libMesh::CondensedEigenSystem::get_eigenpair(), LinearElasticityWithContact::get_least_and_max_gap_function(), libMesh::VariationalSmootherSystem::init_data(), libMesh::System::init_data(), libMesh::ContinuationSystem::initialize_tangent(), libMesh::TransientRBConstruction::initialize_truth(), libMesh::libmesh_petsc_snes_fd_residual(), libMesh::libmesh_petsc_snes_jacobian(), libMesh::libmesh_petsc_snes_mffd_residual(), libMesh::libmesh_petsc_snes_residual(), libMesh::libmesh_petsc_snes_residual_helper(), load_basis_function(), libMesh::TransientRBConstruction::load_rb_solution(), load_rb_solution(), main(), libMesh::DofMap::max_constraint_error(), libMesh::FEMSystem::mesh_position_get(), libMesh::ErrorVector::plot_error(), print_basis_function_orthogonality(), libMesh::InterMeshProjection::project_system_vectors(), libMesh::ImplicitSystem::qoi_parameter_hessian(), libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product(), libMesh::System::re_update(), libMesh::System::read_parallel_data(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), read_riesz_representors_from_files(), libMesh::System::read_serialized_data(), MeshFunctionTest::read_variable_info_from_output_data(), libMesh::System::reinit(), libMesh::System::restrict_vectors(), libMesh::MemoryHistoryData::retrieve_vectors(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), libMesh::ContinuationSystem::save_current_solution(), libMesh::TransientRBConstruction::set_error_temporal_data(), setup(), WriteVecAndScalar::setupTests(), libMesh::TwostepTimeSolver::solve(), libMesh::NewtonSolver::solve(), libMesh::PetscDiffSolver::solve(), libMesh::FrequencySystem::solve(), libMesh::LinearImplicitSystem::solve(), libMesh::NonlinearImplicitSystem::solve(), libMesh::ClawSystem::solve_conservation_law(), solve_for_matrix_and_rhs(), libMesh::ContinuationSystem::solve_tangent(), libMesh::MemoryHistoryData::store_vectors(), ConstraintOperatorTest::test1DCoarseningOperator(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), ProjectSolutionTest::test_partial_project_solution(), SystemsTest::testBoundaryProjectCube(), ConstraintOperatorTest::testCoreform(), SystemsTest::testDofCouplingWithVarGroups(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), SystemsTest::testPostInitAddVector(), SystemsTest::testProjectCubeWithMeshFunction(), MeshInputTest::testProjectionRegression(), WriteVecAndScalar::testSolution(), train_reduced_basis_with_POD(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::DirectSolutionTransfer::transfer(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::BoundaryVolumeSolutionTransfer::transfer_boundary_volume(), libMesh::BoundaryVolumeSolutionTransfer::transfer_volume_boundary(), libMesh::TransientRBConstruction::truth_solve(), truth_solve(), libMesh::System::update(), update_current_local_solution(), libMesh::System::update_global_solution(), libMesh::TransientRBConstruction::update_RB_initial_condition_all_N(), libMesh::TransientRBConstruction::update_residual_terms(), update_residual_terms(), libMesh::ContinuationSystem::update_solution(), libMesh::NewmarkSystem::update_u_v_a(), libMesh::DTKAdapter::update_variable_values(), libMesh::System::write_parallel_data(), libMesh::TransientRBConstruction::write_riesz_representors_to_files(), write_riesz_representors_to_files(), and libMesh::System::write_serialized_data().

◆ store_dirichlet_operators

bool libMesh::RBConstruction::store_dirichlet_operators

Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enforced.

This is true by default, but we can choose to skip it in some cases when all we need are operators without constraints enforced (e.g. when we only need to compute inner-product-type terms).

Definition at line 626 of file rb_construction.h.

Referenced by allocate_data_structures(), assemble_all_affine_operators(), assemble_all_affine_vectors(), assemble_all_output_vectors(), assemble_misc_matrices(), clear(), get_all_matrices(), get_all_vectors(), get_Aq(), get_Fq(), get_inner_product_matrix(), and get_output_vectors().

◆ store_non_dirichlet_operators

bool libMesh::RBConstruction::store_non_dirichlet_operators

◆ store_untransformed_basis

bool libMesh::RBConstruction::store_untransformed_basis

Boolean flag to indicate whether we store a second copy of the basis without constraints or dof transformations applied to it.

This is necessary when we have dof transformations and need to calculate the residual R(U) = C^T F - C^T A C U, since we need to evaluate R(U) using the untransformed basis U rather than C U to avoid "double applying" dof transformations in C.

Definition at line 643 of file rb_construction.h.

Referenced by compute_residual_dual_norm_slow(), enrich_RB_space(), truth_solve(), and update_residual_terms().

◆ time

Real libMesh::System::time
inherited

For time-dependent problems, this is the time t at the beginning of the current timestep.

Note
For DifferentiableSystem users: do not access this time during an assembly! Use the DiffContext::time value instead to get correct results.

Definition at line 1677 of file system.h.

Referenced by libMesh::AdaptiveTimeSolver::adjoint_advance_timestep(), libMesh::UnsteadySolver::adjoint_advance_timestep(), libMesh::TwostepTimeSolver::adjoint_solve(), libMesh::AdaptiveTimeSolver::advance_timestep(), libMesh::UnsteadySolver::advance_timestep(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubProjector::construct_projection(), HeatSystem::element_qoi(), fill_dirichlet_bc(), libMesh::ExactErrorEstimator::find_squared_element_error(), initialize(), libMesh::Euler2Solver::integrate_adjoint_refinement_error_estimate(), libMesh::EulerSolver::integrate_adjoint_refinement_error_estimate(), libMesh::UnsteadySolver::integrate_adjoint_sensitivity(), libMesh::Euler2Solver::integrate_qoi_timestep(), libMesh::EulerSolver::integrate_qoi_timestep(), main(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectEdges::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectSides::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectInteriors::operator()(), libMesh::System::reinit_constraints(), libMesh::UnsteadySolver::retrieve_timestep(), and libMesh::TwostepTimeSolver::solve().

◆ training_error_bounds

std::vector<Real> libMesh::RBConstruction::training_error_bounds

Vector storing the values of the error bound for each parameter in the training set — the parameter giving the largest error bound is chosen for the next snapshot in the Greedy basis training.

Definition at line 528 of file rb_construction.h.

Referenced by compute_max_error_bound().

◆ truth_outputs

std::vector<Number > libMesh::RBConstruction::truth_outputs

Vector storing the truth output values from the most recent truth solve.

Definition at line 554 of file rb_construction.h.

Referenced by allocate_data_structures(), and truth_solve().

◆ use_empty_rb_solve_in_greedy

bool libMesh::RBConstruction::use_empty_rb_solve_in_greedy

A boolean flag to indicate whether or not we initialize the Greedy algorithm by performing rb_solves on the training set with an "empty" (i.e.

N=0) reduced basis space.

Definition at line 650 of file rb_construction.h.

Referenced by train_reduced_basis_with_greedy().

◆ use_energy_inner_product

bool libMesh::RBConstruction::use_energy_inner_product
private

Boolean to indicate whether we're using the energy inner-product.

If this is false then we use inner_product_assembly instead.

Definition at line 919 of file rb_construction.h.

Referenced by assemble_inner_product_matrix(), get_inner_product_assembly(), set_energy_inner_product(), and set_inner_product_assembly().

◆ use_fixed_solution

bool libMesh::System::use_fixed_solution
inherited

A boolean to be set to true by systems using elem_fixed_solution, for optional use by e.g.

stabilized methods. False by default.

Note
For FEMSystem users, if this variable is set to true, it must be before init_data() is called.

Definition at line 1625 of file system.h.

Referenced by libMesh::EulerSolver::_general_residual(), libMesh::Euler2Solver::_general_residual(), libMesh::SteadySolver::_general_residual(), libMesh::NewmarkSolver::_general_residual(), libMesh::DifferentiableSystem::clear(), libMesh::DiffContext::DiffContext(), and libMesh::FEMContext::pre_fe_reinit().

◆ verbose_mode

bool libMesh::RBParametrized::verbose_mode
inherited

Public boolean to toggle verbose mode.

Definition at line 181 of file rb_parametrized.h.

Referenced by libMesh::RBParametrized::check_if_valid_params().

◆ zero_out_matrix_and_rhs

bool libMesh::ImplicitSystem::zero_out_matrix_and_rhs
inherited

By default, the system will zero out the matrix and the right hand side.

If this flag is false, it is the responsibility of the client code to take care of setting these to zero before assembly begins

Definition at line 318 of file implicit_system.h.

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


The documentation for this class was generated from the following files: