libMesh
Loading...
Searching...
No Matches
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 Member Functions | Static Private Member Functions | Private Attributes | List of all members
libMesh::TransientRBConstruction Class Reference

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

#include <transient_rb_construction.h>

Inheritance diagram for libMesh::TransientRBConstruction:
[legend]

Public Types

typedef TransientRBConstruction sys_type
 The type of system.
 
typedef TransientSystem< RBConstructionParent
 The type of the parent.
 
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.
 
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.
 
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.
 
typedef std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> >::const_iterator const_matrices_iterator
 

Public Member Functions

 TransientRBConstruction (EquationSystems &es, const std::string &name, const unsigned int number)
 Constructor.
 
 TransientRBConstruction (TransientRBConstruction &&)=default
 Special functions.
 
 TransientRBConstruction (const TransientRBConstruction &)=delete
 
TransientRBConstructionoperator= (const TransientRBConstruction &)=delete
 
TransientRBConstructionoperator= (TransientRBConstruction &&)=delete
 
virtual ~TransientRBConstruction ()
 
virtual void clear () override
 Clear all the data structures associated with the system.
 
virtual void initialize_rb_construction (bool skip_matrix_assembly=false, bool skip_vector_assembly=false) override
 Allocate all the data structures necessary for the construction stage of the RB method.
 
virtual Real truth_solve (int write_interval) override
 Perform a truth solve at the current parameter.
 
virtual Real train_reduced_basis (const bool resize_rb_eval_data=true) override
 Train the reduced basis.
 
virtual void process_parameters_file (const std::string &parameters_filename) override
 Read in the parameters from file and set up the system accordingly.
 
virtual void print_info () const override
 Print out info that describes the current setup of this RBConstruction.
 
virtual bool greedy_termination_test (Real abs_greedy_error, Real initial_greedy_error, int count) override
 Function that indicates when to terminate the Greedy basis training.
 
virtual void assemble_all_affine_operators () override
 Assemble and store all the affine operators.
 
virtual void assemble_misc_matrices () override
 Override to assemble the L2 matrix as well.
 
void assemble_L2_matrix (SparseMatrix< Number > *input_matrix, bool apply_dirichlet_bc=true)
 Assemble the L2 matrix.
 
void assemble_mass_matrix (SparseMatrix< Number > *input_matrix)
 Assemble the mass matrix at the current parameter and store it in input_matrix.
 
void add_scaled_mass_matrix (Number scalar, SparseMatrix< Number > *input_matrix)
 Add the scaled mass matrix (assembled for the current parameter) to input_matrix.
 
void mass_matrix_scaled_matvec (Number scalar, NumericVector< Number > &dest, NumericVector< Number > &arg)
 Perform a matrix-vector multiplication with the current mass matrix and store the result in dest.
 
void set_L2_assembly (ElemAssembly &L2_assembly_in)
 Set the L2 object.
 
ElemAssemblyget_L2_assembly ()
 
void assemble_Mq_matrix (unsigned int q, SparseMatrix< Number > *input_matrix, bool apply_dirichlet_bc=true)
 Assemble the q^th affine term of the mass matrix and store it in input_matrix.
 
SparseMatrix< Number > * get_M_q (unsigned int q)
 Get a pointer to M_q.
 
SparseMatrix< Number > * get_non_dirichlet_M_q (unsigned int q)
 Get a pointer to non_dirichlet_M_q.
 
virtual void get_all_matrices (std::map< std::string, SparseMatrix< Number > * > &all_matrices) override
 Get a map that stores pointers to all of the matrices.
 
virtual void truth_assembly () override
 Assemble the truth system in the transient linear case.
 
int get_max_truth_solves () const
 Get/set max_truth_solves, the maximum number of RB truth solves we are willing to compute in the transient case.
 
void set_max_truth_solves (int max_truth_solves_in)
 
Real get_POD_tol () const
 Get/set POD_tol.
 
void set_POD_tol (const Real POD_tol_in)
 
void set_delta_N (const unsigned int new_delta_N)
 Set delta_N, the number of basis functions we add to the RB space from each POD.
 
virtual void load_rb_solution () override
 Load the RB solution from the current time-level into the libMesh solution vector.
 
const NumericVector< Number > & get_error_temporal_data ()
 Get the column of temporal_data corresponding to the current time level.
 
void update_RB_initial_condition_all_N ()
 Compute the L2 projection of the initial condition onto the RB space for 1 <= N <= RB_size and store each projection in RB_initial_condition_matrix.
 
virtual void write_riesz_representors_to_files (const std::string &riesz_representors_dir, const bool write_binary_residual_representors) override
 Write out all the Riesz representor data to files.
 
virtual void read_riesz_representors_from_files (const std::string &riesz_representors_dir, const bool write_binary_residual_representors) override
 Write out all the Riesz representor data to files.
 
sys_typesystem ()
 
virtual std::string system_type () const override
 
Number old_solution (const dof_id_type global_dof_number) const
 
Number older_solution (const dof_id_type global_dof_number) const
 
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.
 
void set_rb_evaluation (RBEvaluation &rb_eval_in)
 Set the RBEvaluation object.
 
RBEvaluationget_rb_evaluation ()
 Get a reference to the RBEvaluation object.
 
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.
 
const RBThetaExpansionget_rb_theta_expansion () const
 
void set_rb_assembly_expansion (RBAssemblyExpansion &rb_assembly_expansion_in)
 Set the rb_assembly_expansion object.
 
RBAssemblyExpansionget_rb_assembly_expansion ()
 
Real train_reduced_basis_with_greedy (const bool resize_rb_eval_data)
 Train the reduced basis using the "Greedy algorithm.".
 
void enrich_basis_from_rhs_terms (const bool resize_rb_eval_data=true)
 This function computes one basis function for each rhs term.
 
void train_reduced_basis_with_POD ()
 Train the reduced basis using Proper Orthogonal Decomposition (POD).
 
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.
 
const RBParametersget_greedy_parameter (unsigned int i)
 Return the parameters chosen during the i^th step of the Greedy algorithm.
 
void set_rel_training_tolerance (Real new_training_tolerance)
 Get/set the relative tolerance for the basis training.
 
Real get_rel_training_tolerance () const
 
void set_abs_training_tolerance (Real new_training_tolerance)
 Get/set the absolute tolerance for the basis training.
 
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.
 
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.
 
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.
 
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.
 
Real compute_residual_dual_norm_slow (const unsigned int N)
 The slow (but simple, non-error prone) way to compute the residual dual norm.
 
SparseMatrix< Number > * get_inner_product_matrix ()
 Get a pointer to inner_product_matrix.
 
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.
 
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.
 
const SparseMatrix< Number > * get_non_dirichlet_inner_product_matrix_if_avail () const
 
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.
 
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.
 
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.
 
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.
 
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.
 
virtual void get_all_vectors (std::map< std::string, NumericVector< Number > * > &all_vectors)
 Get a map that stores pointers to all of the vectors.
 
virtual void get_output_vectors (std::map< std::string, NumericVector< Number > * > &all_vectors)
 Get a map that stores pointers to all of the vectors.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
void print_basis_function_orthogonality () const
 Print out a matrix that shows the orthogonality of the RB basis functions.
 
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.
 
void set_inner_product_assembly (ElemAssembly &inner_product_assembly_in)
 Set the rb_assembly_expansion object.
 
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.
 
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.
 
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.
 
bool get_preevaluate_thetas_flag () const
 Get/set flag to pre-evaluate the theta functions.
 
void set_preevaluate_thetas_flag (bool flag)
 
void set_quiet_mode (bool quiet_mode_in)
 Set the quiet_mode flag.
 
bool is_quiet () const
 Is the system in quiet mode?
 
void set_normalize_solution_snapshots (bool value)
 Set the boolean option that indicates if we normalization solution snapshots or not.
 
numeric_index_type get_n_training_samples () const
 Get the number of global training samples.
 
numeric_index_type get_local_n_training_samples () const
 Get the total number of training samples local to this processor.
 
numeric_index_type get_first_local_training_index () const
 Get the first local index of the training parameters.
 
numeric_index_type get_last_local_training_index () const
 Get the last local index of the training parameters.
 
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.
 
virtual void load_training_set (const std::map< std::string, std::vector< RBParameter > > &new_training_set)
 Overwrite the training parameters with new_training_set.
 
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.
 
void broadcast_parameters (const unsigned int proc_id)
 Broadcasts parameters from processor proc_id to all processors.
 
void set_training_random_seed (int seed)
 Set the seed that is used to randomly generate training parameters.
 
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.
 
const std::string & get_deterministic_training_parameter_name () const
 Get the name of the parameter that we will generate deterministic training parameters for.
 
virtual void reinit () override
 Reinitializes the member data fields associated with the system, so that, e.g., assemble() may be used.
 
virtual void assemble () override
 Prepares matrix and _dof_map for matrix assembly.
 
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.
 
virtual void solve () override
 Assembles & solves the linear system A*x=b.
 
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.
 
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.
 
void detach_shell_matrix ()
 Detaches a shell matrix.
 
ShellMatrix< Number > * get_shell_matrix ()
 
virtual void create_static_condensation () override
 Request that static condensation be performed for this system.
 
virtual void disable_cache () override
 Avoids use of any cached data that might affect any solve result.
 
virtual std::pair< unsigned int, Realget_linear_solve_parameters () const
 
virtual void assemble_residual_derivatives (const ParameterVector &parameters) override
 Residual parameter derivative function.
 
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.
 
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.
 
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.
 
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.
 
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].
 
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].
 
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).
 
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].
 
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.
 
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.
 
void init ()
 Initializes degrees of freedom on the current mesh.
 
virtual void reinit_constraints ()
 Reinitializes the constraints for this system.
 
virtual void reinit_mesh ()
 Reinitializes the system with a new mesh.
 
bool is_initialized () const
 
virtual void update ()
 Update the local values to reflect the solution on neighboring processors.
 
bool is_adjoint_already_solved () const
 Accessor for the adjoint_already_solved boolean.
 
void set_adjoint_already_solved (bool setting)
 Setter for the adjoint_already_solved boolean.
 
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].
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
void deactivate ()
 Deactivates the system.
 
void set_basic_system_only ()
 Sets the system to be "basic only": i.e.
 
vectors_iterator vectors_begin ()
 Beginning of vectors container.
 
const_vectors_iterator vectors_begin () const
 Beginning of vectors container.
 
vectors_iterator vectors_end ()
 End of vectors container.
 
const_vectors_iterator vectors_end () const
 End of vectors container.
 
matrices_iterator matrices_begin ()
 Beginning of matrices container.
 
const_matrices_iterator matrices_begin () const
 Beginning of matrices container.
 
matrices_iterator matrices_end ()
 End of matrices container.
 
const_matrices_iterator matrices_end () const
 End of matrices container.
 
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.
 
void remove_vector (std::string_view vec_name)
 Removes the additional vector vec_name from this system.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
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.
 
const Variablevariable (unsigned int var) const
 Return a constant reference to Variable var.
 
const VariableGroupvariable_group (unsigned int vg) const
 Return a constant reference to VariableGroup vg.
 
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.
 
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.
 
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.
 
template<typename ValType >
void read_serialized_data (Xdr &io, const bool read_additional_data=true)
 Reads additional data, namely vectors, for this System.
 
void read_serialized_data (Xdr &io, const bool read_additional_data=true)
 Non-templated version for backward compatibility.
 
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.
 
std::size_t read_serialized_vectors (Xdr &io, const std::vector< NumericVector< Number > * > &vectors) const
 Non-templated version for backward compatibility.
 
template<typename InValType >
void read_parallel_data (Xdr &io, const bool read_additional_data)
 Reads additional data, namely vectors, for this System.
 
void read_parallel_data (Xdr &io, const bool read_additional_data)
 Non-templated version for backward compatibility.
 
void write_header (Xdr &io, std::string_view version, const bool write_additional_data) const
 Writes the basic data header for this System.
 
void write_serialized_data (Xdr &io, const bool write_additional_data=true) const
 Writes additional data, namely vectors, for this System.
 
std::size_t write_serialized_vectors (Xdr &io, const std::vector< const NumericVector< Number > * > &vectors) const
 Serialize & write a number of identically distributed vectors.
 
void write_parallel_data (Xdr &io, const bool write_additional_data) const
 Writes additional data, namely vectors, for this System.
 
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.
 
void attach_init_object (Initialization &init)
 Register a user class to use to initialize the system.
 
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.
 
void attach_assemble_object (Assembly &assemble)
 Register a user object to use in assembling the system matrix and RHS.
 
void attach_constraint_function (void fptr(EquationSystems &es, const std::string &name))
 Register a user function for imposing constraints.
 
void attach_constraint_object (Constraint &constrain)
 Register a user object for imposing constraints.
 
bool has_constraint_object () const
 
Constraintget_constraint_object ()
 Return the user object for imposing constraints.
 
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.
 
void attach_QOI_object (QOI &qoi)
 Register a user object for evaluating the quantities of interest, whose values should be placed in System::qoi.
 
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.
 
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.
 
virtual void user_initialization ()
 Calls user's attached initialization function, or is overridden by the user in derived classes.
 
virtual void user_assembly ()
 Calls user's attached assembly function, or is overridden by the user in derived classes.
 
virtual void user_constrain ()
 Calls user's attached constraint function, or is overridden by the user in derived classes.
 
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.
 
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.
 
virtual void restrict_vectors ()
 Restrict vectors after the mesh has coarsened.
 
virtual void prolong_vectors ()
 Prolong vectors after the mesh has refined.
 
Number current_solution (const dof_id_type global_dof_number) const
 
unsigned int n_qois () const
 Number of currently active quantities of interest.
 
void init_qois (unsigned int n_qois)
 Accessors for qoi and qoi_error_estimates vectors.
 
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.
 
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.
 
Number point_value (unsigned int var, const Point &p, const NumericVector< Number > *sol) const
 Calls the parallel version of point_value().
 
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.
 
Gradient point_gradient (unsigned int var, const Point &p, const NumericVector< Number > *sol) const
 Calls the parallel version of point_gradient().
 
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.
 
Tensor point_hessian (unsigned int var, const Point &p, const NumericVector< Number > *sol) const
 Calls the parallel version of point_hessian().
 
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.
 
void zero_variable (NumericVector< Number > &v, unsigned int var_num) const
 Zeroes all dofs in v that correspond to variable number var_num.
 
bool get_project_with_constraints ()
 Setter and getter functions for project_with_constraints boolean.
 
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.
 
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.
 
template<template< typename > class>
SparseMatrix< Number > & add_matrix (std::string_view mat_name, ParallelType=PARALLEL)
 Adds the additional matrix mat_name to this system.
 
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.
 
void remove_matrix (std::string_view mat_name)
 Removes the additional matrix mat_name from this system.
 
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.
 
void prefix_with_name (bool value)
 Instructs this system to prefix solve options with its name for solvers that leverage prefixes.
 
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.
 
void initialize_parameters (const RBParametrized &rb_parametrized)
 Initialize the parameter ranges and set current_parameters.
 
unsigned int get_n_params () const
 Get the number of parameters.
 
unsigned int get_n_continuous_params () const
 Get the number of continuous parameters.
 
unsigned int get_n_discrete_params () const
 Get the number of discrete parameters.
 
const RBParametersget_parameters () const
 Get the current parameters.
 
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.
 
const RBParametersget_parameters_min () const
 Get an RBParameters object that specifies the minimum allowable value for each parameter.
 
const RBParametersget_parameters_max () const
 Get an RBParameters object that specifies the maximum allowable value for each parameter.
 
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.
 
void print_parameters () const
 Print the current parameters.
 
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.
 
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.
 
bool is_discrete_parameter (const std::string &mu_name) const
 Is parameter mu_name discrete?
 
const std::map< std::string, std::vector< Real > > & get_discrete_parameter_values () const
 Get a const reference to the discrete parameter values.
 
void print_discrete_parameter_values () const
 Print out all the discrete parameter values.
 
Real get_delta_t () const
 Get/set delta_t, the time-step size.
 
void set_delta_t (const Real delta_t_in)
 
Real get_euler_theta () const
 Get/set euler_theta, parameter that determines the temporal discretization.
 
void set_euler_theta (const Real euler_theta_in)
 
unsigned int get_time_step () const
 Get/set the current time-step.
 
void set_time_step (const unsigned int k)
 
unsigned int get_n_time_steps () const
 Get/set the total number of time-steps.
 
void set_n_time_steps (const unsigned int K)
 
Real get_control (const unsigned int k) const
 Get/set the RHS control.
 
void set_control (const std::vector< Real > &control)
 
void process_temporal_parameters_file (const std::string &parameters_filename)
 Read in and initialize parameters from parameters_filename.
 
void pull_temporal_discretization_data (RBTemporalDiscretization &other)
 Pull the temporal discretization data from other.
 

Static Public Member Functions

static void print_info (std::ostream &out_stream=libMesh::out)
 Prints the reference information, by default to libMesh::out.
 
static void print_info (std::ostream &out_stream=libMesh::out)
 Prints the reference information, by default to libMesh::out.
 
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.
 
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.
 
static std::string get_info ()
 Gets a string containing the reference information.
 
static std::string get_info ()
 Gets a string containing the reference information.
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects.
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects.
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info().
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info().
 
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::unique_ptr< SparseMatrix< Number > > L2_matrix
 The L2 matrix.
 
std::unique_ptr< SparseMatrix< Number > > non_dirichlet_L2_matrix
 The L2 matrix without Dirichlet conditions enforced.
 
std::vector< std::unique_ptr< SparseMatrix< Number > > > M_q_vector
 Vector storing the Q_m matrices from the mass operator.
 
std::vector< std::unique_ptr< SparseMatrix< Number > > > non_dirichlet_M_q_vector
 We sometimes also need a second set of M_q matrices that do not have the Dirichlet boundary conditions enforced.
 
std::vector< std::vector< Number > > truth_outputs_all_k
 The truth outputs for all time-levels from the most recent truth_solve.
 
bool nonzero_initialization
 Boolean flag to indicate whether we are using a non-zero initialization.
 
bool compute_truth_projection_error
 Boolean flag that indicates whether we will compute the projection error for the truth solution into the RB space (at every time level).
 
std::string init_filename
 The filename of the file containing the initial condition projected onto the truth mesh.
 
NumericVector< Number > * old_local_solution
 All the values I need to compute my contribution to the simulation at hand.
 
NumericVector< Number > * older_local_solution
 All the values I need to compute my contribution to the simulation at hand.
 
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.
 
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.
 
LinearSolver< Number > * extra_linear_solver
 Also, we store a pointer to an extra linear solver.
 
std::unique_ptr< SparseMatrix< Number > > inner_product_matrix
 The inner product matrix.
 
std::vector< Numbertruth_outputs
 Vector storing the truth output values from the most recent truth solve.
 
std::vector< std::vector< Number > > output_dual_innerprods
 The vector storing the dual norm inner product terms for each output.
 
std::vector< std::unique_ptr< NumericVector< Number > > > Fq_representor
 Vector storing the residual representors associated with the right-hand side.
 
std::vector< NumberFq_representor_innerprods
 Vectors storing the residual representor inner products to be used in computing the residuals online.
 
bool skip_residual_in_train_reduced_basis
 Boolean flag to indicate if we skip residual calculations in train_reduced_basis.
 
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 impose_internal_fluxes
 Boolean flag to indicate whether we impose "fluxes" (i.e.
 
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.
 
bool compute_RB_inner_product
 Boolean flag to indicate whether we compute the RB_inner_product_matrix.
 
bool store_dirichlet_operators
 Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enforced.
 
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.
 
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.
 
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.
 
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.
 
SparseMatrix< Number > * matrix
 The system matrix.
 
bool zero_out_matrix_and_rhs
 By default, the system will zero out the matrix and the right hand side.
 
std::unique_ptr< LinearSolver< Number > > linear_solver
 This class handles all the details of interfacing with various linear algebra packages like PETSc or LASPACK.
 
NumericVector< Number > * rhs
 The system matrix.
 
Parameters parameters
 Parameters for the system. If a parameter is not provided, it should be retrieved from the EquationSystems.
 
bool assemble_before_solve
 Flag which tells the system to whether or not to call the user assembly function during each call to solve().
 
bool use_fixed_solution
 A boolean to be set to true by systems using elem_fixed_solution, for optional use by e.g.
 
int extra_quadrature_order
 A member int that can be employed to indicate increased or reduced quadrature order.
 
std::unique_ptr< NumericVector< Number > > solution
 Data structure to hold solution values.
 
std::unique_ptr< NumericVector< Number > > current_local_solution
 All the values I need to compute my contribution to the simulation at hand.
 
Real time
 For time-dependent problems, this is the time t at the beginning of the current timestep.
 
bool verbose_mode
 Public boolean to toggle verbose mode.
 

Protected Types

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

Protected Member Functions

virtual void allocate_data_structures () override
 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) override
 Override assemble_affine_expansion to also initialize RB_ic_proj_rhs_all_N, if necessary.
 
virtual void initialize_truth ()
 This function imposes a truth initial condition, defaults to zero initial condition if the flag nonzero_initialization is true.
 
virtual SparseMatrix< Number > & get_matrix_for_output_dual_solves () override
 Override to return the L2 product matrix for output dual norm solves for transient state problems.
 
void add_IC_to_RB_space ()
 Initialize RB space by adding the truth initial condition as the first RB basis function.
 
virtual void enrich_RB_space () override
 Add a new basis functions to the RB space.
 
virtual void update_system () override
 Update the system after enriching the RB space.
 
virtual void update_RB_system_matrices () override
 Compute the reduced basis matrices for the current basis.
 
virtual void update_residual_terms (bool compute_inner_products) override
 Compute the terms that are combined ‘online’ to determine the dual norm of the residual.
 
Number set_error_temporal_data ()
 Set column k (i.e.
 
virtual void re_update () override
 Re-update the local values when the mesh has changed.
 
virtual std::unique_ptr< DGFEMContextbuild_context ()
 Builds a DGFEMContext object with enough information to do evaluations on each element.
 
void update_greedy_param_list ()
 Update the list of Greedily chosen parameters with current_parameters.
 
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.
 
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.
 
virtual void post_process_truth_solution ()
 Similarly, provide an opportunity to post-process the truth solution after the solve is complete.
 
virtual void set_context_solution_vec (NumericVector< Number > &vec)
 Set current_local_solution = vec so that we can access vec from FEMContext during assembly.
 
virtual void assemble_all_affine_vectors ()
 Assemble and store the affine RHS vectors.
 
virtual void assemble_all_output_vectors ()
 Assemble and store the output vectors.
 
virtual void compute_output_dual_innerprods ()
 Compute and store the dual norm of each output functional.
 
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 Real get_RB_error_bound ()
 
virtual void init_context (FEMContext &)
 Initialize the FEMContext prior to performing an element loop.
 
bool get_convergence_assertion_flag () const
 Getter for the flag determining if convergence should be checked after each solve.
 
void check_convergence (LinearSolver< Number > &input_solver)
 Check if the linear solver reports convergence.
 
unsigned int get_current_training_parameter_index () const
 Get/set the current training parameter index.
 
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.
 
virtual void preevaluate_thetas ()
 
void reset_preevaluate_thetas_completed ()
 Reset the _preevaluate_thetas_completed flag to false.
 
virtual void init_data ()
 Initializes the member data fields associated with the system, so that, e.g., assemble() may be used.
 
RBParameters get_params_from_training_set (unsigned int global_index)
 Return the RBParameters in index global_index of the global training set.
 
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.
 
virtual void set_params_from_training_set_and_broadcast (unsigned int global_index)
 Load the specified training parameter and then broadcast to all processors.
 
virtual void add_matrices () override
 Adds the system matrix.
 
template<typename T >
void setup_static_condensation_preconditioner (T &solver)
 Sets up the static condensation preconditioner for the supplied solver.
 
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.
 
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.
 
virtual void init_matrices ()
 Initializes the matrices associated with this system.
 
bool can_add_matrices () const
 
virtual bool condense_constrained_dofs () const
 Whether this object should condense out constrained degrees of freedom.
 
void increment_constructor_count (const std::string &name) noexcept
 Increments the construction counter.
 
void increment_constructor_count (const std::string &name) noexcept
 Increments the construction counter.
 
void increment_destructor_count (const std::string &name) noexcept
 Increments the destruction counter.
 
void increment_destructor_count (const std::string &name) noexcept
 Increments the destruction counter.
 

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.
 

Protected Attributes

Real POD_tol
 If positive, this tolerance determines the number of POD modes we add to the space on a call to enrich_RB_space().
 
int max_truth_solves
 Maximum number of truth solves in the POD-Greedy.
 
ElemAssemblyL2_assembly
 Function pointer for assembling the L2 matrix.
 
DenseVector< NumberRB_ic_proj_rhs_all_N
 The vector that stores the right-hand side for the initial condition projections.
 
unsigned int Nmax
 Maximum number of reduced basis functions we are willing to use.
 
unsigned int delta_N
 The number of basis functions that we add at each greedy step.
 
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.
 
bool assert_convergence
 A boolean flag to indicate whether to check for proper convergence after each solve.
 
bool quiet_mode
 Flag to indicate whether we print out extra information during the Offline stage.
 
bool serial_training_set
 This boolean flag indicates whether or not the training set should be the same on all processors.
 
bool _normalize_solution_snapshots
 Set this boolean to true if we want to normalize solution snapshots used in training to have norm of 1.
 
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).
 
unsigned int _n_linear_iterations
 The number of linear iterations required to solve the linear system Ax=b.
 
Real _final_linear_residual
 The final residual for the linear system Ax=b.
 
ShellMatrix< Number > * _shell_matrix
 User supplies shell matrix or nullptr if no shell matrix is used.
 
const SystemSubset_subset
 The current subset on which to solve (or nullptr if none).
 
SubsetSolveMode _subset_solve_mode
 If restrict-solve-to-subset mode is active, this member decides what happens with the dofs outside the subset.
 
const Parallel::Communicator_communicator
 

Static Protected Attributes

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

Private Member Functions

virtual void add_old_vectors ()
 Helper function for (re-)adding old and older solution vectors.
 
void create_static_condensation_system_matrix ()
 Create the static condensation system matrix.
 
void add_system_rhs ()
 Add the system right-hand-side vector to the _vectors data structure.
 
void late_matrix_init (SparseMatrix< Number > &mat, ParallelType type)
 Helper function to keep DofMap forward declarable in system.h.
 
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.
 
template<typename iterator_type , typename InValType >
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.
 
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.
 
template<typename InValType >
numeric_index_type read_serialized_vector (Xdr &io, NumericVector< Number > *vec)
 Reads a vector for this System.
 
numeric_index_type read_serialized_vector (Xdr &io, NumericVector< Number > &vec)
 Non-templated version for backward compatibility.
 
template<typename iterator_type >
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.
 
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.
 
dof_id_type write_serialized_vector (Xdr &io, const NumericVector< Number > &vec) const
 Writes a vector for this System.
 
void write_parameter_ranges_to_file (const std::string &file_name, const bool write_binary)
 Write out the parameter ranges to file.
 
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 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.
 
bool check_if_valid_params (const RBParameters &params) const
 Helper function to check that params is valid:
 

Static Private Member Functions

static bool is_value_in_list (Real value, const std::vector< Real > &list_of_values, Real tol)
 Helper function to check if the specified value is in the list of values (within a tolerance given by tol).
 

Private Attributes

std::vector< std::unique_ptr< NumericVector< Number > > > temporal_data
 Dense matrix to store the data that we use for the temporal POD.
 
RBEvaluationrb_eval
 The current RBEvaluation object we are using to perform the Evaluation stage of the reduced basis method.
 
RBAssemblyExpansionrb_assembly_expansion
 This member holds the (parameter independent) assembly functors that define the "affine expansion" of the PDE that we are solving.
 
ElemAssemblyinner_product_assembly
 Pointer to inner product assembly.
 
bool use_energy_inner_product
 Boolean to indicate whether we're using the energy inner-product.
 
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.
 
std::vector< std::unique_ptr< SparseMatrix< Number > > > Aq_vector
 Vector storing the Q_a matrices from the affine expansion.
 
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::vector< std::unique_ptr< NumericVector< Number > > > > outputs_vector
 The libMesh vectors that define the output functionals.
 
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.
 
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.
 
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().
 
std::string RB_training_type
 This string indicates the type of training that we will use.
 
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.
 
std::unique_ptr< NumericVector< Number > > _untransformed_solution
 We also store a copy of the untransformed solution in order to create _untransformed_basis_functions.
 
bool _preevaluate_thetas_flag
 Flag to indicate if we preevaluate the theta functions.
 
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.
 
unsigned int _current_training_parameter_index
 The current training parameter index during reduced basis training.
 
std::vector< std::vector< Number > > _evaluated_thetas
 Storage of evaluated theta functions at a set of parameters.
 
bool _training_parameters_initialized
 Boolean flag to indicate whether or not the parameter ranges have been initialized.
 
std::map< std::string, std::vector< RBParameter > > _training_parameters
 The training samples for each parameter.
 
numeric_index_type _first_local_index
 The first sample-vector index from the global vector which is stored in the _training_parameters on this processor.
 
numeric_index_type _n_local_training_samples
 
numeric_index_type _n_global_training_samples
 
int _training_parameters_random_seed
 If < 0, use std::time() * processor_id() to seed the random number generator for the training parameters (default).
 
StaticCondensation_sc_system_matrix
 The system matrix for static condensation problems.
 
void(* _init_system_function )(EquationSystems &es, const std::string &name)
 Function that initializes the system.
 
Initialization_init_system_object
 Object that initializes the system.
 
void(* _assemble_system_function )(EquationSystems &es, const std::string &name)
 Function that assembles the system.
 
Assembly_assemble_system_object
 Object that assembles the system.
 
void(* _constrain_system_function )(EquationSystems &es, const std::string &name)
 Function to impose constraints.
 
Constraint_constrain_system_object
 Object that constrains the system.
 
void(* _qoi_evaluate_function )(EquationSystems &es, const std::string &name, const QoISet &qoi_indices)
 Function to evaluate quantity of interest.
 
QOI_qoi_evaluate_object
 Object to compute quantities of interest.
 
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.
 
QOIDerivative_qoi_evaluate_derivative_object
 Object to compute derivatives of quantities of interest.
 
std::unique_ptr< DofMap_dof_map
 Data structure describing the relationship between nodes, variables, etc... and degrees of freedom.
 
EquationSystems_equation_systems
 Constant reference to the EquationSystems object used for the simulation.
 
MeshBase_mesh
 Constant reference to the mesh data structure used for the simulation.
 
const std::string _sys_name
 A name associated with this system.
 
const unsigned int _sys_number
 The number associated with this system.
 
bool _active
 Flag stating if the system is active or not.
 
std::map< std::string, std::unique_ptr< NumericVector< Number > >, std::less<> > _vectors
 Some systems need an arbitrary number of vectors.
 
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 zeroed.
 
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.
 
std::map< std::string, std::unique_ptr< SparseMatrix< Number > >, std::less<> > _matrices
 Some systems need an arbitrary number of matrices.
 
std::map< std::string, ParallelType, std::less<> > _matrix_types
 Holds the types of the matrices.
 
bool _matrices_initialized
 false when additional matrices being added require initialization, true otherwise.
 
bool _solution_projection
 Holds true if the solution vector should be projected onto a changed grid, false if it should be zeroed.
 
bool _basic_system_only
 Holds true if the components of more advanced system types (e.g.
 
bool _is_initialized
 true when additional vectors and variables do not require immediate initialization, false otherwise.
 
unsigned int _additional_data_written
 This flag is used only when reading in a system from file.
 
std::vector< unsigned int_written_var_indices
 This vector is used only when reading in a system from file.
 
bool adjoint_already_solved
 Has the adjoint problem already been solved? If the user sets adjoint_already_solved to true, we won't waste time solving it again.
 
bool _hide_output
 Are we allowed to write this system to file? If _hide_output is true, then EquationSystems::write will ignore this system.
 
bool project_with_constraints
 Do we want to apply constraints while projecting vectors ?
 
bool _prefer_hash_table_matrix_assembly
 Whether to use hash table matrix assembly if the matrix sub-classes support it.
 
bool _require_sparsity_pattern
 Whether any of our matrices require an initial sparsity pattern computation in order to determine preallocation.
 
bool _prefix_with_name
 Whether we are name prefixing solver options.
 
std::vector< Number_qoi
 Values of the quantities of interest.
 
std::vector< Number_qoi_error_estimates
 Vector to hold error estimates for qois, either from a steady state calculation, or from a single unsteady solver timestep.
 
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.
 
RBParameters parameters_max
 
std::map< std::string, std::vector< Real > > _discrete_parameter_values
 Map that defines the allowable values of any discrete parameters.
 
Real _delta_t
 The time-step size.
 
Real _euler_theta
 The parameter that determines the generalized Euler scheme discretization that we employ.
 
unsigned int _current_time_step
 The current time-step.
 
unsigned int _n_time_steps
 The number of time-steps.
 
std::vector< Real_control
 The RHS control (scalar function of time).
 

Detailed Description

This class is part of the rbOOmit framework.

TransientRBConstruction extends RBConstruction to add functionality relevant in the time-dependent case.

We can handle time controls on the RHS as h(t)*f(x, \( \mu \)). See Martin Grepl's thesis for more details.

Author
David J. Knezevic
Date
2009

Definition at line 48 of file transient_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 79 of file transient_rb_construction.h.

◆ sys_type

The type of system.

Definition at line 74 of file transient_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

◆ TransientRBConstruction() [1/3]

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

Constructor.

Optionally initializes required data structures.

Definition at line 61 of file transient_rb_construction.C.

64 : Parent(es, name_in, number_in),
65 L2_matrix(SparseMatrix<Number>::build(es.comm())),
66 non_dirichlet_L2_matrix(SparseMatrix<Number>::build(es.comm())),
69 init_filename(""),
70 POD_tol(-1.),
72 L2_assembly(nullptr)
73{
74 // Indicate that we need to compute the RB
75 // inner product matrix in this case
77
78 // We should not necessarily exit the greedy due to repeated parameters in
79 // the transient case
81}
bool compute_RB_inner_product
Boolean flag to indicate whether we compute the RB_inner_product_matrix.
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.
std::unique_ptr< SparseMatrix< Number > > L2_matrix
The L2 matrix.
TransientSystem< RBConstruction > Parent
The type of the parent.
Real POD_tol
If positive, this tolerance determines the number of POD modes we add to the space on a call to enric...
bool compute_truth_projection_error
Boolean flag that indicates whether we will compute the projection error for the truth solution into ...
std::unique_ptr< SparseMatrix< Number > > non_dirichlet_L2_matrix
The L2 matrix without Dirichlet conditions enforced.
bool nonzero_initialization
Boolean flag to indicate whether we are using a non-zero initialization.
std::string init_filename
The filename of the file containing the initial condition projected onto the truth mesh.
ElemAssembly * L2_assembly
Function pointer for assembling the L2 matrix.
int max_truth_solves
Maximum number of truth solves in the POD-Greedy.

References libMesh::RBConstruction::compute_RB_inner_product, and libMesh::RBConstruction::exit_on_repeated_greedy_parameters.

◆ TransientRBConstruction() [2/3]

libMesh::TransientRBConstruction::TransientRBConstruction ( TransientRBConstruction &&  )
default

Special functions.

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

◆ TransientRBConstruction() [3/3]

libMesh::TransientRBConstruction::TransientRBConstruction ( const TransientRBConstruction )
delete

◆ ~TransientRBConstruction()

TransientRBConstruction::~TransientRBConstruction ( )
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.

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

References libMesh::System::_active.

◆ 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.

2434{
2435 return _active;
2436}

References libMesh::System::_active.

◆ 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.

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

References libMesh::System::add_vector().

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

◆ 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.

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
template class LIBMESH_EXPORT NumericVector< Number >

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

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

◆ add_IC_to_RB_space()

void TransientRBConstruction::add_IC_to_RB_space ( )
protected

Initialize RB space by adding the truth initial condition as the first RB basis function.

Definition at line 725 of file transient_rb_construction.C.

726{
727 LOG_SCOPE("add_IC_to_RB_space()", "TransientRBConstruction");
728
729 libmesh_error_msg_if(get_rb_evaluation().get_n_basis_functions() > 0,
730 "Error: Should not call TransientRBConstruction::add_IC_to_RB_space() "
731 "on a system that already contains basis functions.");
732
733 libmesh_error_msg_if(!nonzero_initialization,
734 "Error: Should not call TransientRBConstruction::add_IC_to_RB_space() "
735 "when nonzero_initialization==false.");
736
738
739 // load the new basis function into the basis_functions vector.
740 get_rb_evaluation().basis_functions.emplace_back(NumericVector<Number>::build(this->comm()));
741 NumericVector<Number> & current_bf = get_rb_evaluation().get_basis_function(get_rb_evaluation().get_n_basis_functions()-1);
742 current_bf.init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
743 current_bf = *solution;
744
745 // We can just set the norm to 1.
747
748 Real current_bf_norm = libmesh_real(std::sqrt( current_bf.dot(*inner_product_storage_vector) ));
749 current_bf.scale(1./current_bf_norm);
750
751 unsigned int saved_delta_N = get_delta_N();
752 set_delta_N(1);
754 set_delta_N(saved_delta_N);
755}
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.
const Parallel::Communicator & comm() const
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...
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...
RBEvaluation & get_rb_evaluation()
Get a reference to the RBEvaluation object.
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 ...
NumericVector< Number > & get_basis_function(unsigned int i)
Get a reference to the i^th basis function.
std::vector< std::unique_ptr< NumericVector< Number > > > basis_functions
The libMesh vectors storing the finite element coefficients of the RB basis functions.
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.
dof_id_type n_dofs() const
Definition system.C:118
dof_id_type n_local_dofs() const
Definition system.C:155
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition system.h:1655
virtual void initialize_truth()
This function imposes a truth initial condition, defaults to zero initial condition if the flag nonze...
virtual void update_system() override
Update the system after enriching the RB space.
void set_delta_N(const unsigned int new_delta_N)
Set delta_N, the number of basis functions we add to the RB space from each POD.
T libmesh_real(T a)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

References libMesh::RBEvaluation::basis_functions, libMesh::ParallelObject::comm(), libMesh::NumericVector< T >::dot(), libMesh::RBEvaluation::get_basis_function(), libMesh::RBConstruction::get_delta_N(), libMesh::RBConstruction::get_non_dirichlet_inner_product_matrix_if_avail(), libMesh::RBConstruction::get_rb_evaluation(), libMesh::NumericVector< T >::init(), initialize_truth(), libMesh::RBConstructionBase< LinearImplicitSystem >::inner_product_storage_vector, libMesh::libmesh_real(), libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), nonzero_initialization, libMesh::PARALLEL, libMesh::Real, libMesh::NumericVector< T >::scale(), set_delta_N(), libMesh::System::solution, update_system(), and libMesh::SparseMatrix< T >::vector_mult().

◆ 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.

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}
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
unsigned int n_matrices() const
Definition system.h:2638
virtual void add_matrices()
Insertion point for adding matrices in derived classes before init_matrices() is called.
Definition system.h:2017
libmesh_assert(ctx)

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

◆ 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.

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(),
1023 this->get_dof_map().get_static_condensation());
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}
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
bool has_static_condensation() const
Definition system.C:2669
std::map< std::string, ParallelType, std::less<> > _matrix_types
Holds the types of the matrices.
Definition system.h:2282
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
const MeshBase & get_mesh() const
Definition system.h:2401
SolverPackage default_solver_package()
Definition libmesh.C:1064

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::System::has_static_condensation(), libMesh::System::late_matrix_init(), and libMesh::libmesh_assert().

Referenced by libMesh::EigenSystem::add_matrices(), libMesh::ImplicitSystem::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().

◆ 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.

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}
template class LIBMESH_EXPORT SparseMatrix< Number >

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

◆ 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.

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}

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

◆ add_old_vectors()

void libMesh::TransientSystem< RBConstruction >::add_old_vectors ( )
privatevirtualinherited

Helper function for (re-)adding old and older solution vectors.

Definition at line 150 of file transient_system.C.

136{
137 ParallelType type =
138#ifdef LIBMESH_ENABLE_GHOSTED
139 GHOSTED;
140#else
141 SERIAL;
142#endif
143
144 old_local_solution = &(this->add_vector("_transient_old_local_solution", true, type));
145 older_local_solution = &(this->add_vector("_transient_older_local_solution", true, type));
146}
NumericVector< Number > * older_local_solution
All the values I need to compute my contribution to the simulation at hand.
NumericVector< Number > * old_local_solution
All the values I need to compute my contribution to the simulation at hand.
ParallelType
Defines an enum for parallel data structure types.

◆ add_scaled_Aq()

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

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.

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}
ElemAssembly & get_A_assembly(unsigned int q)
Return a reference to the specified A_assembly object.
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...
SparseMatrix< Number > * get_Aq(unsigned int q)
Get a pointer to Aq.
virtual void close()=0
Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across p...
virtual void add(const numeric_index_type i, const numeric_index_type j, const T value)=0
Add value to the element (i,j).

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

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

◆ add_scaled_mass_matrix()

void TransientRBConstruction::add_scaled_mass_matrix ( Number  scalar,
SparseMatrix< Number > *  input_matrix 
)

Add the scaled mass matrix (assembled for the current parameter) to input_matrix.

Definition at line 362 of file transient_rb_construction.C.

363{
364 const RBParameters & mu = get_parameters();
365
366 TransientRBThetaExpansion & trans_theta_expansion =
367 cast_ref<TransientRBThetaExpansion &>(get_rb_theta_expansion());
368
369 const unsigned int Q_m = trans_theta_expansion.get_n_M_terms();
370
371 for (unsigned int q=0; q<Q_m; q++)
372 input_matrix->add(scalar * trans_theta_expansion.eval_M_theta(q,mu), *get_M_q(q));
373}
const RBParameters & get_parameters() const
Get the current parameters.
SparseMatrix< Number > * get_M_q(unsigned int q)
Get a pointer to M_q.

References libMesh::SparseMatrix< T >::add(), libMesh::TransientRBThetaExpansion::eval_M_theta(), get_M_q(), libMesh::TransientRBThetaExpansion::get_n_M_terms(), libMesh::RBParametrized::get_parameters(), and libMesh::RBConstruction::get_rb_theta_expansion().

Referenced by assemble_mass_matrix(), and truth_assembly().

◆ 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 
)
protectedinherited

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.

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}
unsigned int n_vars
void max(const T &r, T &o, Request &req) const
CouplingMatrix * _dof_coupling
Degree of freedom coupling.
Definition dof_map.h:1741
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 close()=0
Calls the NumericVector's internal assembly routines, ensuring that the values are consistent across ...
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].
virtual std::unique_ptr< DGFEMContext > build_context()
Builds a DGFEMContext object with enough information to do evaluations on each element.
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.
bool skip_degenerate_sides
In some cases meshes are intentionally created with degenerate sides as a way to represent,...
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...
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.
MeshBase & mesh
const Elem & get(const ElemType type_in)
ElemType
Defines an enum for geometric element types.
FEGenericBase< Real > FEBase

References libMesh::DofMap::_dof_coupling, libMesh::SparseMatrix< T >::add_matrix(), libMesh::NumericVector< T >::add_vector(), libMesh::FEAbstract::attach_quadrature_rule(), libMesh::ElemAssembly::boundary_assembly(), libMesh::RBConstruction::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(), libMesh::RBConstruction::impose_internal_fluxes, libMesh::RBConstruction::init_context(), libMesh::ElemAssembly::interior_assembly(), libMesh::Tri3Subdivision::is_ghost(), libMesh::DenseMatrixBase< T >::m(), libMesh::Parallel::Communicator::max(), mesh, libMesh::DenseMatrixBase< T >::n(), libMesh::Elem::n_sides(), n_vars, libMesh::Elem::neighbor_ptr(), libMesh::NODEELEM, libMesh::RBConstruction::post_process_elem_matrix_and_vector(), libMesh::FEMContext::pre_fe_reinit(), libMesh::DofObject::processor_id(), libMesh::Parallel::Communicator::rank(), libMesh::FEMContext::side, libMesh::DGFEMContext::side_fe_reinit(), libMesh::Elem::side_ptr(), libMesh::RBConstruction::skip_degenerate_sides, and libMesh::TRI3SUBDIVISION.

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

◆ 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.

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}

References libMesh::System::add_vector().

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

◆ 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.

1170{
1171 std::ostringstream sensitivity_name;
1172 sensitivity_name << "sensitivity_solution" << i;
1173
1174 return this->add_vector(sensitivity_name.str());
1175}

References libMesh::System::add_vector().

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

◆ add_system_rhs()

void libMesh::ExplicitSystem::add_system_rhs ( )
privateinherited

Add the system right-hand-side vector to the _vectors data structure.

Useful in initialization.

Definition at line 94 of file explicit_system.C.

95{
96 // Possible that we cleared the _vectors but
97 // forgot to update the rhs pointer?
98 if (this->n_vectors() == 0)
99 rhs = nullptr;
100
101
102 // Only need to add the rhs if it isn't there
103 // already!
104 if (rhs == nullptr)
105 rhs = &(this->add_vector ("RHS Vector", false));
106
108}
NumericVector< Number > * rhs
The system matrix.
unsigned int n_vectors() const
Definition system.h:2499

References libMesh::System::add_vector(), libMesh::libmesh_assert(), libMesh::System::n_vectors(), and libMesh::ExplicitSystem::rhs.

Referenced by libMesh::ExplicitSystem::clear(), and libMesh::ExplicitSystem::ExplicitSystem().

◆ 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.

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:3146

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(), LaplaceSystem::init_data(), CoupledSystem::init_data(), HeatSystem::init_data(), PoissonSystem::init_data(), NavierSystem::init_data(), SolidSystem::init_data(), ElasticitySystem::init_data(), SimpleRBConstruction::init_data(), SimpleEIMConstruction::init_data(), ElasticityRBConstruction::init_data(), CurlCurlSystem::init_data(), HilbertSystem::init_data(), libMesh::AdvectionSystem::init_data(), libMesh::VariationalSmootherSystem::init_data(), FirstOrderScalarSystemBase::init_data(), SecondOrderScalarSystemSecondOrderTimeSolverBase::init_data(), NonManifoldCouplingTestBase::init_es(), main(), 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(), FETestBase< order, family, elem_type, build_nx, CaseName >::setUp(), SlitMeshRefinedSystemTest::setUp(), ParsedFEMFunctionTest::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(), SystemsTest::testProjectScalarCoarsening(), 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().

◆ 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.

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

References libMesh::System::add_variable().

◆ 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.

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:3377

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

Referenced by DofMapTest::testArrayDofIndicesWithType().

◆ 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.

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:3253

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

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

◆ 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.

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

References libMesh::System::add_variables().

◆ 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.

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,
832 NumericVector<Number>::build(this->comm(),
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}
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...
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,...
Definition system.h:2272
bool _is_initialized
true when additional vectors and variables do not require immediate initialization,...
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
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
std::unique_ptr< DofMap > _dof_map
Data structure describing the relationship between nodes, variables, etc... and degrees of freedom.
Definition system.h:2225

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::NumericVector< T >::get(), 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::TimeSolver::init_adjoints(), libMesh::UnsteadySolver::init_adjoints(), libMesh::ContinuationSystem::init_data(), libMesh::OptimizationSystem::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().

◆ 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.

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}

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

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

◆ 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.

1200{
1201 return this->add_vector("weighted_sensitivity_solution");
1202}

References libMesh::System::add_vector().

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

◆ 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.

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}
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.
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...
std::vector< Number > get_qoi_values() const
Returns a copy of qoi, not a reference.
Definition system.C:2191
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
bool is_adjoint_already_solved() const
Accessor for the adjoint_already_solved boolean.
Definition system.h:411
static constexpr Real TOLERANCE

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

◆ 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.

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))
237 this->get_dof_map().enforce_adjoint_constraints_exactly
238 (this->get_adjoint_solution(i), i);
239#endif
240
241 return totalrval;
242}
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...
virtual std::pair< unsigned int, Real > get_linear_solve_parameters() const
virtual LinearSolver< Number > * get_linear_solver() const
virtual void assembly(bool, bool, bool=false, bool=false)
Assembles a residual in rhs and/or a jacobian in matrix, as requested.
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
NumericVector< Number > & add_adjoint_solution(unsigned int i=0)
Definition system.C:1220
NumericVector< Number > & get_adjoint_solution(unsigned int i=0)
Definition system.C:1232
NumericVector< Number > & get_adjoint_rhs(unsigned int i=0)
Definition system.C:1294
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:176
template class LIBMESH_EXPORT LinearSolver< Number >

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

◆ allocate_data_structures()

void TransientRBConstruction::allocate_data_structures ( )
overrideprotectedvirtual

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

Reimplemented from libMesh::RBConstruction.

Definition at line 179 of file transient_rb_construction.C.

180{
182
183 TransientRBThetaExpansion & trans_theta_expansion =
184 cast_ref<TransientRBThetaExpansion &>(get_rb_theta_expansion());
185 const unsigned int Q_m = trans_theta_expansion.get_n_M_terms();
186 const unsigned int n_outputs = trans_theta_expansion.get_n_outputs();
187
188 // Resize and allocate vectors for storing mesh-dependent data
189 const unsigned int n_time_levels = get_n_time_steps()+1;
190 temporal_data.resize(n_time_levels);
191
192 // Resize vectors for storing mesh-dependent data but only
193 // initialize if initialize_mesh_dependent_data == true
194 M_q_vector.resize(Q_m);
195
196 // Only initialize the mass matrices if we
197 // are not in single-matrix mode
198 {
199 DofMap & dof_map = this->get_dof_map();
200
201 dof_map.attach_matrix(*L2_matrix);
202 L2_matrix->init();
203 L2_matrix->zero();
204
205 for (unsigned int q=0; q<Q_m; q++)
206 {
207 // Initialize the memory for the matrices
209 dof_map.attach_matrix(*M_q_vector[q]);
210 M_q_vector[q]->init();
211 M_q_vector[q]->zero();
212 }
213
214 // We also need to initialize a second set of non-Dirichlet operators
216 {
217 dof_map.attach_matrix(*non_dirichlet_L2_matrix);
220
221 non_dirichlet_M_q_vector.resize(Q_m);
222 for (unsigned int q=0; q<Q_m; q++)
223 {
224 // Initialize the memory for the matrices
226 dof_map.attach_matrix(*non_dirichlet_M_q_vector[q]);
227 non_dirichlet_M_q_vector[q]->init();
228 non_dirichlet_M_q_vector[q]->zero();
229 }
230 }
231 }
232
233 for (unsigned int i=0; i<n_time_levels; i++)
234 {
236 temporal_data[i]->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
237 }
238
239 // and the truth output vectors
240 truth_outputs_all_k.resize(n_outputs);
241 for (unsigned int n=0; n<n_outputs; n++)
242 {
243 truth_outputs_all_k[n].resize(n_time_levels);
244 }
245
246 // This vector is for storing rhs entries for
247 // computing the projection of the initial condition
248 // into the RB space
250}
void resize(const unsigned int n)
Resize the vector.
virtual void allocate_data_structures()
Helper function that actually allocates all the data structures required by this class.
unsigned int Nmax
Maximum number of reduced basis functions we are willing to use.
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_time_steps() const
Get/set the total number of time-steps.
std::vector< std::vector< Number > > truth_outputs_all_k
The truth outputs for all time-levels from the most recent truth_solve.
std::vector< std::unique_ptr< SparseMatrix< Number > > > non_dirichlet_M_q_vector
We sometimes also need a second set of M_q matrices that do not have the Dirichlet boundary condition...
std::vector< std::unique_ptr< SparseMatrix< Number > > > M_q_vector
Vector storing the Q_m matrices from the mass operator.
DenseVector< Number > RB_ic_proj_rhs_all_N
The vector that stores the right-hand side for the initial condition projections.
std::vector< std::unique_ptr< NumericVector< Number > > > temporal_data
Dense matrix to store the data that we use for the temporal POD.

References libMesh::RBConstruction::allocate_data_structures(), libMesh::DofMap::attach_matrix(), libMesh::SparseMatrix< T >::build(), libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), libMesh::System::get_dof_map(), libMesh::TransientRBThetaExpansion::get_n_M_terms(), libMesh::RBThetaExpansion::get_n_outputs(), libMesh::RBTemporalDiscretization::get_n_time_steps(), libMesh::RBConstruction::get_rb_theta_expansion(), L2_matrix, M_q_vector, libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), libMesh::RBConstruction::Nmax, non_dirichlet_L2_matrix, non_dirichlet_M_q_vector, libMesh::PARALLEL, RB_ic_proj_rhs_all_N, libMesh::DenseVector< T >::resize(), libMesh::RBConstruction::store_non_dirichlet_operators, temporal_data, and truth_outputs_all_k.

◆ 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.

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

References libMesh::ImplicitSystem::assemble().

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

◆ assemble_affine_expansion()

void TransientRBConstruction::assemble_affine_expansion ( bool  skip_matrix_assembly,
bool  skip_vector_assembly 
)
overrideprotectedvirtual

Override assemble_affine_expansion to also initialize RB_ic_proj_rhs_all_N, if necessary.

Reimplemented from libMesh::RBConstruction.

Definition at line 252 of file transient_rb_construction.C.

254{
255 // Call parent's assembly functions
256 Parent::assemble_affine_expansion(skip_matrix_assembly, skip_vector_assembly);
257
258 // Now update RB_ic_proj_rhs_all_N if necessary.
259 // This allows us to compute the L2 projection
260 // of the initial condition into the RB space
261 // so that we can continue to enrich a given RB
262 // space.
263 if (get_rb_evaluation().get_n_basis_functions() > 0)
264 {
265 // Load the initial condition into the solution vector
267
268 std::unique_ptr<NumericVector<Number>> temp1 = NumericVector<Number>::build(this->comm());
269 temp1->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
270
271 // First compute the right-hand side vector for the L2 projection
272 L2_matrix->vector_mult(*temp1, *solution);
273
274 for (unsigned int i=0; i<get_rb_evaluation().get_n_basis_functions(); i++)
275 {
276 RB_ic_proj_rhs_all_N(i) = temp1->dot(get_rb_evaluation().get_basis_function(i));
277 }
278 }
279}
CompareTypes< T, T2 >::supertype dot(const DenseVector< T2 > &vec) const
virtual void assemble_affine_expansion(bool skip_matrix_assembly, bool skip_vector_assembly)
Assemble the matrices and vectors for this system.
virtual unsigned int get_n_basis_functions() const
Get the current number of basis functions.

References libMesh::RBConstruction::assemble_affine_expansion(), libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), libMesh::DenseVector< T >::dot(), libMesh::RBEvaluation::get_n_basis_functions(), libMesh::RBConstruction::get_rb_evaluation(), initialize_truth(), L2_matrix, libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), libMesh::PARALLEL, RB_ic_proj_rhs_all_N, and libMesh::System::solution.

◆ assemble_all_affine_operators()

void TransientRBConstruction::assemble_all_affine_operators ( )
overridevirtual

Assemble and store all the affine operators.

Override to assemble the mass matrix operators.

Reimplemented from libMesh::RBConstruction.

Definition at line 485 of file transient_rb_construction.C.

486{
488
489 TransientRBThetaExpansion & trans_theta_expansion =
490 cast_ref<TransientRBThetaExpansion &>(get_rb_theta_expansion());
491
492 for (unsigned int q=0; q<trans_theta_expansion.get_n_M_terms(); q++)
494
496 {
497 for (unsigned int q=0; q<trans_theta_expansion.get_n_M_terms(); q++)
499 }
500}
virtual void assemble_all_affine_operators()
Assemble and store all Q_a affine operators as well as the inner-product matrix.
void assemble_Mq_matrix(unsigned int q, SparseMatrix< Number > *input_matrix, bool apply_dirichlet_bc=true)
Assemble the q^th affine term of the mass matrix and store it in input_matrix.
SparseMatrix< Number > * get_non_dirichlet_M_q(unsigned int q)
Get a pointer to non_dirichlet_M_q.

References libMesh::RBConstruction::assemble_all_affine_operators(), assemble_Mq_matrix(), get_M_q(), libMesh::TransientRBThetaExpansion::get_n_M_terms(), get_non_dirichlet_M_q(), libMesh::RBConstruction::get_rb_theta_expansion(), and libMesh::RBConstruction::store_non_dirichlet_operators.

◆ assemble_all_affine_vectors()

void libMesh::RBConstruction::assemble_all_affine_vectors ( )
protectedvirtualinherited

Assemble and store the affine RHS vectors.

Definition at line 1117 of file rb_construction.C.

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}
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.
bool store_dirichlet_operators
Boolean flag to indicate whether we store affine operator matrices and vectors with constraints enfor...
NumericVector< Number > * get_non_dirichlet_Fq(unsigned int q)
Get a pointer to non-Dirichlet Fq.
NumericVector< Number > * get_Fq(unsigned int q)
Get a pointer to Fq.
unsigned int get_n_F_terms() const
Get Q_f, the number of terms in the affine expansion for the right-hand side.
OStreamProxy out

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

Referenced by libMesh::RBConstruction::assemble_affine_expansion().

◆ assemble_all_output_vectors()

void libMesh::RBConstruction::assemble_all_output_vectors ( )
protectedvirtualinherited

Assemble and store the output vectors.

Definition at line 1156 of file rb_construction.C.

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}
virtual void zero()=0
Set all entries to zero.
ElemAssembly & get_output_assembly(unsigned int output_index, unsigned int q_l)
Return a reference to the specified output assembly object.
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.
unsigned int get_n_output_terms(unsigned int output_index) const
Get the number of affine terms associated with the specified output.
unsigned int get_n_outputs() const
Get n_outputs, the number output functionals.

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

Referenced by libMesh::RBConstruction::assemble_affine_expansion().

◆ assemble_Aq_matrix()

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

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

Definition at line 1039 of file rb_construction.C.

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}
virtual void zero()=0
Set all entries to 0.

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

Referenced by libMesh::RBConstruction::assemble_all_affine_operators().

◆ assemble_Fq_vector()

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

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

Definition at line 1139 of file rb_construction.C.

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.

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

Referenced by libMesh::RBConstruction::assemble_all_affine_vectors().

◆ assemble_inner_product_matrix()

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

Assemble the inner product matrix and store it in input_matrix.

Definition at line 1006 of file rb_construction.C.

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}
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're using the energy inner-product.
ElemAssembly * inner_product_assembly
Pointer to inner product assembly.
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form.

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

Referenced by libMesh::RBConstruction::assemble_misc_matrices().

◆ assemble_L2_matrix()

void TransientRBConstruction::assemble_L2_matrix ( SparseMatrix< Number > *  input_matrix,
bool  apply_dirichlet_bc = true 
)

Assemble the L2 matrix.

Definition at line 345 of file transient_rb_construction.C.

346{
347 input_matrix->zero();
350 input_matrix,
351 nullptr,
352 false, /* symmetrize */
353 apply_dirichlet_bc);
354}

References libMesh::RBConstruction::add_scaled_matrix_and_vector(), L2_assembly, and libMesh::SparseMatrix< T >::zero().

Referenced by assemble_misc_matrices().

◆ assemble_mass_matrix()

void TransientRBConstruction::assemble_mass_matrix ( SparseMatrix< Number > *  input_matrix)

Assemble the mass matrix at the current parameter and store it in input_matrix.

Definition at line 356 of file transient_rb_construction.C.

357{
358 input_matrix->zero();
359 add_scaled_mass_matrix(1., input_matrix);
360}
void add_scaled_mass_matrix(Number scalar, SparseMatrix< Number > *input_matrix)
Add the scaled mass matrix (assembled for the current parameter) to input_matrix.

References add_scaled_mass_matrix(), and libMesh::SparseMatrix< T >::zero().

◆ assemble_misc_matrices()

void TransientRBConstruction::assemble_misc_matrices ( )
overridevirtual

Override to assemble the L2 matrix as well.

Reimplemented from libMesh::RBConstruction.

Definition at line 502 of file transient_rb_construction.C.

503{
504 libMesh::out << "Assembling L2 matrix" << std::endl;
506
508 {
509 libMesh::out << "Assembling non-Dirichlet L2 matrix" << std::endl;
510 assemble_L2_matrix(non_dirichlet_L2_matrix.get(), /* apply_dirichlet_bc = */ false);
511 }
512
514}
virtual void assemble_misc_matrices()
Assemble and store all the inner-product matrix, the constraint matrix (for constrained problems) and...
void assemble_L2_matrix(SparseMatrix< Number > *input_matrix, bool apply_dirichlet_bc=true)
Assemble the L2 matrix.

References assemble_L2_matrix(), libMesh::RBConstruction::assemble_misc_matrices(), L2_matrix, non_dirichlet_L2_matrix, libMesh::out, and libMesh::RBConstruction::store_non_dirichlet_operators.

◆ assemble_Mq_matrix()

void TransientRBConstruction::assemble_Mq_matrix ( unsigned int  q,
SparseMatrix< Number > *  input_matrix,
bool  apply_dirichlet_bc = true 
)

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

Definition at line 465 of file transient_rb_construction.C.

466{
467 TransientRBThetaExpansion & trans_theta_expansion =
468 cast_ref<TransientRBThetaExpansion &>(get_rb_theta_expansion());
469
470 TransientRBAssemblyExpansion & trans_assembly_expansion =
471 cast_ref<TransientRBAssemblyExpansion &>(get_rb_assembly_expansion());
472
473 libmesh_error_msg_if(q >= trans_theta_expansion.get_n_M_terms(),
474 "Error: We must have q < Q_m in assemble_Mq_matrix.");
475
476 input_matrix->zero();
478 &trans_assembly_expansion.get_M_assembly(q),
479 input_matrix,
480 nullptr,
481 false, /* symmetrize */
482 apply_dirichlet_bc);
483}
RBAssemblyExpansion & get_rb_assembly_expansion()

References libMesh::RBConstruction::add_scaled_matrix_and_vector(), libMesh::TransientRBAssemblyExpansion::get_M_assembly(), libMesh::TransientRBThetaExpansion::get_n_M_terms(), libMesh::RBConstruction::get_rb_assembly_expansion(), libMesh::RBConstruction::get_rb_theta_expansion(), and libMesh::SparseMatrix< T >::zero().

Referenced by assemble_all_affine_operators().

◆ 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.

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}
void set_qoi(unsigned int qoi_index, Number qoi_value)
Definition system.C:2176
virtual void assemble_qoi(const QoISet &qoi_indices=QoISet())
Calls user qoi function.
Definition system.C:565

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

◆ 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.

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}
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
NumericVector< Number > & add_adjoint_rhs(unsigned int i=0)
Definition system.C:1284
const Number zero
.
Definition libmesh.h:297

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

◆ 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.

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}
NumericVector< Number > & add_sensitivity_rhs(unsigned int i=0)
Definition system.C:1314

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

◆ 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.

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.

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.

◆ 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 1959 of file system.C.

1961{
1963
1964 if (_assemble_system_object != nullptr)
1965 {
1966 libmesh_warning("WARNING: Cannot specify both assembly function and object!");
1967
1968 _assemble_system_object = nullptr;
1969 }
1970
1972}
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
Number fptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition projection.C:81

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

◆ 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 1976 of file system.C.

1977{
1978 if (_assemble_system_function != nullptr)
1979 {
1980 libmesh_warning("WARNING: Cannot specify both assembly object and function!");
1981
1982 _assemble_system_function = nullptr;
1983 }
1984
1985 _assemble_system_object = &assemble_in;
1986}

Referenced by main().

◆ 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 1990 of file system.C.

1992{
1994
1995 if (_constrain_system_object != nullptr)
1996 {
1997 libmesh_warning("WARNING: Cannot specify both constraint function and object!");
1998
1999 _constrain_system_object = nullptr;
2000 }
2001
2003}
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

References fptr(), and libMesh::libmesh_assert().

◆ attach_constraint_object()

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

Register a user object for imposing constraints.

Definition at line 2007 of file system.C.

2008{
2009 if (_constrain_system_function != nullptr)
2010 {
2011 libmesh_warning("WARNING: Cannot specify both constraint object and function!");
2012
2014 }
2015
2016 _constrain_system_object = &constrain;
2017}

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

◆ 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 1928 of file system.C.

1930{
1932
1933 if (_init_system_object != nullptr)
1934 {
1935 libmesh_warning("WARNING: Cannot specify both initialization function and object!");
1936
1937 _init_system_object = nullptr;
1938 }
1939
1941}
void(* _init_system_function)(EquationSystems &es, const std::string &name)
Function that initializes the system.
Definition system.h:2165
Initialization * _init_system_object
Object that initializes the system.
Definition system.h:2171

References fptr(), and libMesh::libmesh_assert().

Referenced by main(), and main().

◆ 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 1945 of file system.C.

1946{
1947 if (_init_system_function != nullptr)
1948 {
1949 libmesh_warning("WARNING: Cannot specify both initialization object and function!");
1950
1951 _init_system_function = nullptr;
1952 }
1953
1954 _init_system_object = &init_in;
1955}

◆ 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 2064 of file system.C.

2066{
2068
2069 if (_qoi_evaluate_derivative_object != nullptr)
2070 {
2071 libmesh_warning("WARNING: Cannot specify both QOI derivative function and object!");
2072
2074 }
2075
2077}
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

References fptr(), and libMesh::libmesh_assert().

◆ 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 2081 of file system.C.

2082{
2083 if (_qoi_evaluate_derivative_function != nullptr)
2084 {
2085 libmesh_warning("WARNING: Cannot specify both QOI derivative object and function!");
2086
2088 }
2089
2090 _qoi_evaluate_derivative_object = &qoi_derivative;
2091}

◆ 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 2032 of file system.C.

2035{
2037
2038 if (_qoi_evaluate_object != nullptr)
2039 {
2040 libmesh_warning("WARNING: Cannot specify both QOI function and object!");
2041
2042 _qoi_evaluate_object = nullptr;
2043 }
2044
2046}
QOI * _qoi_evaluate_object
Object to compute quantities of interest.
Definition system.h:2205
void(* _qoi_evaluate_function)(EquationSystems &es, const std::string &name, const QoISet &qoi_indices)
Function to evaluate quantity of interest.
Definition system.h:2198

References fptr(), and libMesh::libmesh_assert().

◆ 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 2050 of file system.C.

2051{
2052 if (_qoi_evaluate_function != nullptr)
2053 {
2054 libmesh_warning("WARNING: Cannot specify both QOI object and function!");
2055
2056 _qoi_evaluate_function = nullptr;
2057 }
2058
2059 _qoi_evaluate_object = &qoi_in;
2060}

◆ 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.

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

References libMesh::LinearImplicitSystem::_shell_matrix.

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

◆ 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 1306 of file system_projection.C.

1311{
1312 this->boundary_project_vector(b, variables, *solution, f, g, -1 /*is_adjoint*/, active_local_range);
1313
1314 solution->localize(*current_local_solution);
1315}
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...
static const Real b

References b.

Referenced by SystemsTest::testBoundaryProjectCube().

◆ 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 1287 of file system_projection.C.

1294{
1295 WrappedFunction<Number> f(*this, fptr, &function_parameters);
1296 WrappedFunction<Gradient> g(*this, gptr, &function_parameters);
1297 this->boundary_project_solution(b, variables, &f, &g, active_local_range);
1298}
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...
Gradient gptr(const Point &p, const Parameters &, const std::string &libmesh_dbg_var(sys_name), const std::string &unknown_name)
Definition projection.C:96

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

◆ 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 1344 of file system_projection.C.

1351{
1352 LOG_SCOPE ("boundary_project_vector()", "System");
1353
1354 if (!active_local_range)
1355 {
1356 active_local_range.emplace
1357 (this->get_mesh().active_local_elements_begin(),
1358 this->get_mesh().active_local_elements_end());
1359 }
1360
1362 (active_local_range.value(),
1363 BoundaryProjectSolution(b, variables, *this, f, g,
1365 new_vector)
1366 );
1367
1368 // We don't do SCALAR dofs when just projecting the boundary, so
1369 // we're done here.
1370
1371 new_vector.close();
1372
1373#ifdef LIBMESH_ENABLE_CONSTRAINTS
1374 if (is_adjoint == -1)
1375 this->get_dof_map().enforce_constraints_exactly(*this, &new_vector);
1376 else if (is_adjoint >= 0)
1378 is_adjoint);
1379#else
1380 libmesh_ignore(is_adjoint);
1381#endif
1382}
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
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
Parameters parameters
Parameters for the system. If a parameter is not provided, it should be retrieved from the EquationSy...
Definition system.h:1588
const EquationSystems & get_equation_systems() const
Definition system.h:767
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.
void libmesh_ignore(const Args &...)

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

◆ 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 1325 of file system_projection.C.

1333{
1334 WrappedFunction<Number> f(*this, fptr, &function_parameters);
1335 WrappedFunction<Gradient> g(*this, gptr, &function_parameters);
1336 this->boundary_project_vector(b, variables, new_vector, &f, &g,
1337 is_adjoint, active_local_range);
1338}

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

◆ 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 165 of file rb_construction_base.C.

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}
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...
std::vector< Real > RBParameter
Typedef for an individual RB parameter.

◆ build_context()

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

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.

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

Referenced by libMesh::RBConstruction::add_scaled_matrix_and_vector().

◆ build_zero_dirichlet_boundary_object()

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

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.

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}

Referenced by SimpleRBConstruction::init_data(), and ElasticityRBConstruction::init_data().

◆ calculate_norm() [1/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 1533 of file system.C.

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

References libMesh::FEType::default_quadrature_rule(), dim, libMesh::DISCRETE_L1, libMesh::DISCRETE_L2, libMesh::DISCRETE_L_INF, 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(), libMesh::QBase::n_points(), n_vars, libMesh::Real, libMesh::NumericVector< T >::size(), libMesh::TYPE_SCALAR, libMesh::TYPE_VECTOR, libMesh::W1_INF_SEMINORM, libMesh::W2_INF_SEMINORM, and libMesh::SystemNorm::weight().

◆ calculate_norm() [2/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 1511 of file system.C.

1515{
1516 //short circuit to save time
1517 if (norm_type == DISCRETE_L1 ||
1518 norm_type == DISCRETE_L2 ||
1519 norm_type == DISCRETE_L_INF)
1520 return discrete_var_norm(v,var,norm_type);
1521
1522 // Not a discrete norm
1523 std::vector<FEMNormType> norms(this->n_vars(), L2);
1524 std::vector<Real> weights(this->n_vars(), 0.0);
1525 norms[var] = norm_type;
1526 weights[var] = 1.0;
1527 Real val = this->calculate_norm(v, SystemNorm(norms, weights), skip_dimensions);
1528 return val;
1529}
Real calculate_norm(const NumericVector< Number > &v, unsigned int var, FEMNormType norm_type, std::set< unsigned int > *skip_dimensions=nullptr) const
Definition system.C:1511

References libMesh::DISCRETE_L1, libMesh::DISCRETE_L2, libMesh::DISCRETE_L_INF, libMesh::L2, 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().

◆ 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.

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

References libMesh::System::_matrices_initialized.

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

◆ check_convergence()

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

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.

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}
virtual LinearConvergenceReason get_converged_reason() const =0
LinearConvergenceReason
Linear solver convergence flags (taken from the PETSc flags).

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

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

◆ check_if_valid_params()

bool libMesh::RBParametrized::check_if_valid_params ( const RBParameters params) const
privateinherited

Helper function to check that params is valid:

  • same number of parameters (error)
  • parameter values are within the min/max range (warning)
  • discrete values are correctly discrete within tolerance (warning) Warnings are only printed if "verbose_mode" is true.

Definition at line 378 of file rb_parametrized.C.

379{
380 // Check if number of parameters are correct.
381 libmesh_error_msg_if(params.n_parameters() != get_n_params(),
382 "Error: Number of parameters don't match; found "
383 << params.n_parameters() << ", expected "
384 << get_n_params());
385
386 bool is_valid = true;
387 std::string prev_param_name = "";
388 for (const auto & [param_name, sample_vec] : params)
389 {
390 std::size_t sample_idx = 0;
391 const Real & min_value = get_parameter_min(param_name);
392 const Real & max_value = get_parameter_max(param_name);
393 for (const auto & value_vec : sample_vec)
394 {
395 for (const auto & value : value_vec)
396 {
397 // Check every parameter value (including across samples and vector-values)
398 // to ensure it's within the min/max range.
399 const bool outside_range = ((value < min_value) || (value > max_value));
400 is_valid = is_valid && !outside_range;
401 if (outside_range && verbose_mode)
402 {
403 libMesh::out << "Warning: parameter " << param_name << " value="
404 << value << " outside acceptable range: ("
405 << min_value << ", " << max_value << ")";
406 }
407
408 // For discrete params, make sure params.get_value(param_name) is sufficiently
409 // close to one of the discrete parameter values.
410 // Note that vector-values not yet supported in discrete parameters,
411 // and the .get_sample_value() call will throw an error if the user
412 // tries to do it.
413 if (const auto it = get_discrete_parameter_values().find(param_name);
414 it != get_discrete_parameter_values().end())
415 {
416 const bool is_value_discrete =
417 is_value_in_list(params.get_sample_value(param_name, sample_idx),
418 it->second,
419 TOLERANCE);
420 is_valid = is_valid && is_value_discrete;
421 if (!is_value_discrete && verbose_mode)
422 libMesh::out << "Warning: parameter " << param_name << " value="
423 << value << " is not in discrete value list.";
424 }
425 }
426 ++sample_idx;
427 }
428 }
429 return is_valid;
430}
unsigned int get_n_params() const
Get the number of parameters.
const std::map< std::string, std::vector< Real > > & get_discrete_parameter_values() const
Get a const reference to the discrete parameter values.
static bool is_value_in_list(Real value, const std::vector< Real > &list_of_values, Real tol)
Helper function to check if the specified value is in the list of values (within a tolerance given by...
Real get_parameter_max(const std::string &param_name) const
Get maximum allowable value of parameter param_name.
Real get_parameter_min(const std::string &param_name) const
Get minimum allowable value of parameter param_name.
bool verbose_mode
Public boolean to toggle verbose mode.
static const bool value
Definition xdr_io.C:55

References libMesh::RBParametrized::get_discrete_parameter_values(), libMesh::RBParametrized::get_n_params(), libMesh::RBParametrized::get_parameter_max(), libMesh::RBParametrized::get_parameter_min(), libMesh::RBParameters::get_sample_value(), libMesh::RBParametrized::is_value_in_list(), libMesh::RBParameters::n_parameters(), libMesh::out, libMesh::Real, libMesh::TOLERANCE, value, and libMesh::RBParametrized::verbose_mode.

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

◆ check_if_zero_truth_solve()

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

Definition at line 461 of file rb_construction.C.

462{
463 return (solution->l2_norm() == 0.);
464}

References libMesh::System::solution.

Referenced by libMesh::RBConstruction::train_reduced_basis_with_greedy().

◆ clear()

void TransientRBConstruction::clear ( )
overridevirtual

Clear all the data structures associated with the system.

Reimplemented from libMesh::TransientSystem< RBConstruction >.

Definition at line 85 of file transient_rb_construction.C.

86{
88
89 // clear the mass matrices
90 M_q_vector.clear();
91
94
95 // clear the temporal_data
96 temporal_data.clear();
97}
virtual void clear() override
Clear all the data structures associated with the system.

References libMesh::TransientSystem< RBConstruction >::clear(), M_q_vector, non_dirichlet_M_q_vector, libMesh::RBConstruction::store_non_dirichlet_operators, and temporal_data.

◆ 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.

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

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::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_get_diagonal(), libMesh::SlepcEigenSolver< T >::_petsc_shell_matrix_get_diagonal(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_mult(), libMesh::SlepcEigenSolver< T >::_petsc_shell_matrix_mult(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_mult_add(), libMesh::DofMap::add_constraints_to_send_list(), add_cube_convex_hull_to_mesh(), libMesh::PetscDMWrapper::add_dofs_helper(), libMesh::PetscDMWrapper::add_dofs_to_section(), add_IC_to_RB_space(), libMesh::RBEIMEvaluation::add_interpolation_data(), libMesh::CondensedEigenSystem::add_matrices(), libMesh::EigenSystem::add_matrices(), libMesh::System::add_matrix(), libMesh::System::add_matrix(), libMesh::System::add_matrix(), libMesh::RBConstruction::add_scaled_matrix_and_vector(), libMesh::System::add_vector(), libMesh::MeshTools::Modification::all_tri(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::RBConstruction::allocate_data_structures(), allocate_data_structures(), 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::DofMap::check_dirichlet_bcid_consistency(), libMesh::MeshTetInterface::check_hull_integrity(), libMesh::MeshBase::complete_preparation(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_max_error_bound(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::RBSCMConstruction::compute_SCM_bounds_on_training_set(), libMesh::DofMap::computed_sparsity_already(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), PetscSolverConfiguration::configure_solver(), 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::MeshBase::detect_interior_parents(), 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(), enrich_RB_space(), libMesh::EpetraVector< T >::EpetraVector(), AssembleOptimization::equality_constraints(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::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::MeshBase::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::RBEIMConstruction::get_random_point(), libMesh::RBEIMConstruction::get_random_point(), libMesh::MeshTetInterface::improve_hull_integrity(), AssembleOptimization::inequality_constraints(), AssembleOptimization::inequality_constraints_jacobian(), libMesh::StaticCondensation::init(), libMesh::TimeSolver::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::LocationMap< T >::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), ElasticitySystem::init_data(), 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::Modification::interpolate_surface(), 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_snes_mffd_interface(), libMesh::libmesh_petsc_snes_postcheck(), 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::MeshCommunication::make_elems_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(), 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< T >::operator=(), libMesh::MeshBase::operator==(), libMesh::DistributedMesh::parallel_max_elem_id(), libMesh::DistributedMesh::parallel_max_node_id(), libMesh::DistributedMesh::parallel_max_unique_id(), libMesh::ReplicatedMesh::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(), LaplaceSystem::postprocess(), PoissonSystem::postprocess(), 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(), libMesh::XdrIO::read(), libMesh::Nemesis_IO::read(), FEMParameters::read(), libMesh::EquationSystems::read(), libMesh::CheckpointIO::read_header(), libMesh::ExodusII_IO::read_header(), libMesh::System::read_header(), libMesh::XdrIO::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::RBConstruction::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::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(), 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::NoxNonlinearSolver< Number >::solve(), 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(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), ExodusC0PolyhedronTest::test_write_and_read_hexagonal_prism(), ExodusC0PolygonTest::test_write_and_read_pentagon(), DofMapTest::testBadElemFECombo(), SystemsTest::testBlockRestrictedVarNDofs(), BoundaryInfoTest::testBoundaryOnChildrenErrors(), CheckpointIOTest::testC0PolygonCheckpoint(), VolumeTest::testC0PolygonMethods(), CheckpointIOTest::testC0PolyhedronCheckpoint(), VolumeTest::testC0PolyhedronMethods(), ConstraintOperatorTest::testCoreform(), ConnectedComponentsTest::testEdge(), MeshInputTest::testExodusIGASidesets(), MeshTriangulationTest::testFoundCenters(), PointLocatorTest::testLocator(), BoundaryInfoTest::testMesh(), BoundaryMeshSubdomainTest::testPerBoundarySubdomain(), PointLocatorTest::testPlanar(), MeshTriangulationTest::testPoly2TriEdge3ToTri7CenterFixup(), MeshTriangulationTest::testPoly2TriRefinementBase(), SystemsTest::testProjectCubeWithMeshFunction(), SystemsTest::testProjectScalarCoarsening(), BoundaryInfoTest::testRenumber(), BoundaryInfoTest::testSelectiveRenumber(), BoundaryMeshSubdomainTest::testSingleSubdomain(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshTriangulationTest::testTriangulatorInterp(), MeshTriangulationTest::testTriangulatorMeshedHoles(), MeshTriangulationTest::testTriangulatorRoundHole(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::Poly2TriTriangulator::triangulate(), libMesh::RBConstruction::truth_assembly(), truth_assembly(), update_current_local_solution(), update_RB_initial_condition_all_N(), libMesh::RBConstruction::update_RB_system_matrices(), update_RB_system_matrices(), update_residual_terms(), libMesh::RBConstruction::update_residual_terms(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::XdrIO::write(), libMesh::NameBasedIO::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::RBConstruction::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().

◆ 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.

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}
const std::string _sys_name
A name associated with this system.
Definition system.h:2242

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.

◆ compute_Fq_representor_innerprods()

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

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.

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
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}
virtual void add(const numeric_index_type i, const T value)=0
Adds value to the vector entry specified by i.
bool is_quiet() const
Is the system in quiet mode?
std::unique_ptr< SparseMatrix< Number > > inner_product_matrix
The inner product matrix.
std::vector< Number > Fq_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.
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 ...
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 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< NumericVector< Number > > > Fq_representor
Vector storing the residual representors associated with the right-hand side.
bool assert_convergence
A boolean flag to indicate whether to check for proper convergence after each solve.
std::vector< Number > Fq_representor_innerprods
Vectors storing the residual representor inner products to be used in computing the residuals online.
std::string get_timestamp()
Definition timestamp.C:37

References libMesh::NumericVector< T >::add(), libMesh::RBConstruction::assert_convergence, libMesh::NumericVector< T >::build(), libMesh::RBConstruction::check_convergence(), libMesh::ParallelObject::comm(), libMesh::LinearImplicitSystem::final_linear_residual(), libMesh::RBConstruction::Fq_representor, libMesh::RBConstruction::Fq_representor_innerprods, libMesh::RBEvaluation::Fq_representor_innerprods, libMesh::RBConstruction::Fq_representor_innerprods_computed, libMesh::RBConstruction::get_Fq(), libMesh::RBThetaExpansion::get_n_F_terms(), libMesh::RBConstruction::get_non_dirichlet_inner_product_matrix_if_avail(), libMesh::RBConstruction::get_rb_evaluation(), libMesh::RBConstruction::get_rb_theta_expansion(), libMesh::Utility::get_timestamp(), libMesh::RBConstruction::inner_product_matrix, libMesh::RBConstruction::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, libMesh::RBConstruction::solve_for_matrix_and_rhs(), libMesh::SparseMatrix< T >::vector_mult(), and libMesh::NumericVector< T >::zero().

Referenced by libMesh::RBConstruction::recompute_all_residual_terms(), and libMesh::RBConstruction::train_reduced_basis_with_greedy().

◆ compute_max_error_bound()

Real libMesh::RBConstruction::compute_max_error_bound ( )
virtualinherited

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

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.
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
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}
processor_id_type processor_id() const
numeric_index_type get_first_local_training_index() const
Get the first 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.
void broadcast_parameters(const unsigned int proc_id)
Broadcasts parameters from processor proc_id to all processors.
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.
numeric_index_type get_last_local_training_index() const
Get the last local index of the training parameters.
bool serial_training_set
This boolean flag indicates whether or not the training set should be the same on all processors.
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...
bool get_preevaluate_thetas_flag() const
Get/set flag to pre-evaluate the theta functions.
virtual Real get_RB_error_bound()
void set_current_training_parameter_index(unsigned int index)
std::vector< Real > training_error_bounds
Vector storing the values of the error bound for each parameter in the training set — the parameter g...
dof_id_type numeric_index_type
Definition id_types.h:99

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(), libMesh::RBConstruction::get_preevaluate_thetas_flag(), libMesh::RBConstruction::get_RB_error_bound(), libMesh::RBConstruction::get_rb_evaluation(), libMesh::ParallelObject::processor_id(), libMesh::Real, libMesh::RBConstructionBase< LinearImplicitSystem >::serial_training_set, libMesh::RBConstruction::set_current_training_parameter_index(), libMesh::RBConstructionBase< LinearImplicitSystem >::set_params_from_training_set(), libMesh::Parallel::Communicator::sum(), and libMesh::RBConstruction::training_error_bounds.

Referenced by libMesh::RBConstruction::train_reduced_basis_with_greedy().

◆ compute_output_dual_innerprods()

void libMesh::RBConstruction::compute_output_dual_innerprods ( )
protectedvirtualinherited

Compute and store the dual norm of each output functional.

Definition at line 2091 of file rb_construction.C.

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
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}
std::unique_ptr< LinearSolver< Number > > linear_solver
This class handles all the details of interfacing with various linear algebra packages like PETSc or ...
virtual LinearSolver< Number > * get_linear_solver() const override
std::vector< std::vector< Number > > output_dual_innerprods
The vector storing the dual norm inner product terms for each output.
bool output_dual_innerprods_computed
A boolean flag to indicate whether or not the output dual norms have already been computed — used to ...
virtual SparseMatrix< Number > & get_matrix_for_output_dual_solves()
Return the matrix for the output residual dual norm solves.
std::vector< std::vector< Number > > output_dual_innerprods
The vector storing the dual norm inner product terms for each output.

References libMesh::NumericVector< T >::add(), libMesh::RBConstruction::assert_convergence, libMesh::NumericVector< T >::build(), libMesh::RBConstruction::check_convergence(), libMesh::ParallelObject::comm(), libMesh::LinearImplicitSystem::final_linear_residual(), libMesh::LinearImplicitSystem::get_linear_solver(), libMesh::RBConstruction::get_matrix_for_output_dual_solves(), libMesh::RBThetaExpansion::get_n_output_terms(), libMesh::RBThetaExpansion::get_n_outputs(), libMesh::RBConstruction::get_output_vector(), libMesh::RBConstruction::get_rb_evaluation(), libMesh::RBConstruction::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::RBConstruction::output_dual_innerprods, libMesh::RBEvaluation::output_dual_innerprods, libMesh::RBConstruction::output_dual_innerprods_computed, libMesh::PARALLEL, libMesh::ExplicitSystem::rhs, libMesh::System::solution, libMesh::RBConstruction::solve_for_matrix_and_rhs(), libMesh::SparseMatrix< T >::vector_mult(), and libMesh::NumericVector< T >::zero().

Referenced by libMesh::RBConstruction::train_reduced_basis_with_greedy().

◆ compute_residual_dual_norm_slow()

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

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.

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}
bool store_untransformed_basis
Boolean flag to indicate whether we store a second copy of the basis without constraints or dof trans...
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...
virtual void truth_assembly()
Assemble the truth matrix and right-hand side for current_parameters.

References libMesh::RBConstruction::_untransformed_basis_functions, libMesh::SparseMatrix< T >::add(), libMesh::NumericVector< T >::add(), libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), libMesh::RBConstruction::get_non_dirichlet_inner_product_matrix_if_avail(), libMesh::RBConstruction::get_rb_evaluation(), libMesh::RBConstruction::inner_product_matrix, libMesh::RBConstruction::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, libMesh::RBConstruction::solve_for_matrix_and_rhs(), libMesh::RBConstruction::store_untransformed_basis, libMesh::RBConstruction::truth_assembly(), libMesh::SparseMatrix< T >::vector_mult(), and libMesh::SparseMatrix< T >::zero().

◆ 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.

2059{ return false; }

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

◆ 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.

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.

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

◆ create_static_condensation_system_matrix()

void libMesh::ImplicitSystem::create_static_condensation_system_matrix ( )
privateinherited

Create the static condensation system matrix.

Definition at line 57 of file implicit_system.C.

58{
59 auto sc_system_matrix = std::make_unique<StaticCondensation>(this->get_mesh(), *this, this->get_dof_map(), this->get_dof_map().get_static_condensation());
60 _sc_system_matrix = sc_system_matrix.get();
61 matrix = &(this->add_matrix ("System Matrix", std::move(sc_system_matrix)));
62}
StaticCondensation * _sc_system_matrix
The system matrix for static condensation problems.
StaticCondensation & get_static_condensation()

References libMesh::ImplicitSystem::_sc_system_matrix, libMesh::System::add_matrix(), libMesh::System::get_dof_map(), libMesh::System::get_mesh(), libMesh::ImplicitSystem::get_static_condensation(), and libMesh::ImplicitSystem::matrix.

Referenced by libMesh::ImplicitSystem::clear(), libMesh::ImplicitSystem::create_static_condensation(), and libMesh::ImplicitSystem::ImplicitSystem().

◆ current_solution()

Number libMesh::System::current_solution ( const dof_id_type  global_dof_number) const
inherited

◆ deactivate()

void libMesh::System::deactivate ( )
inlineinherited

Deactivates the system.

Only active systems are solved.

Definition at line 2449 of file system.h.

2450{
2451 _active = false;
2452}

References libMesh::System::_active.

◆ 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.

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.

References libMesh::LinearImplicitSystem::attach_shell_matrix().

Referenced by main().

◆ 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.

132 {
133 this->assemble_before_solve = true;
135}
virtual void reuse_preconditioner(bool)
Set the same_preconditioner flag, which indicates if we reuse the same preconditioner for subsequent ...

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

◆ disable_print_counter_info() [1/2]

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 100 of file reference_counter.C.

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.

References libMesh::ReferenceCounter::_enable_print_counter.

◆ disable_print_counter_info() [2/2]

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 100 of file reference_counter.C.

101{
102 _enable_print_counter = false;
103 return;
104}

References libMesh::ReferenceCounter::_enable_print_counter.

◆ discrete_var_norm()

Real libMesh::System::discrete_var_norm ( const NumericVector< Number > &  v,
unsigned int  var,
FEMNormType  norm_type 
) const
privateinherited

Finds the discrete norm for the entries in the vector corresponding to Dofs associated with var.

Definition at line 1492 of file system.C.

1495{
1496 std::set<dof_id_type> var_indices;
1497 local_dof_indices(var, var_indices);
1498
1499 if (norm_type == DISCRETE_L1)
1500 return v.subset_l1_norm(var_indices);
1501 if (norm_type == DISCRETE_L2)
1502 return v.subset_l2_norm(var_indices);
1503 if (norm_type == DISCRETE_L_INF)
1504 return v.subset_linfty_norm(var_indices);
1505 else
1506 libmesh_error_msg("Invalid norm_type = " << Utility::enum_to_string(norm_type));
1507}
virtual Real subset_l1_norm(const std::set< numeric_index_type > &indices) const
virtual Real subset_l2_norm(const std::set< numeric_index_type > &indices) const
virtual Real subset_linfty_norm(const std::set< numeric_index_type > &indices) const
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 ...
Definition system.C:1409

References libMesh::DISCRETE_L1, libMesh::DISCRETE_L2, libMesh::DISCRETE_L_INF, libMesh::Real, libMesh::NumericVector< T >::subset_l1_norm(), libMesh::NumericVector< T >::subset_l2_norm(), and libMesh::NumericVector< T >::subset_linfty_norm().

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

Enabled by default.

Definition at line 94 of file reference_counter.C.

95{
97 return;
98}

References libMesh::ReferenceCounter::_enable_print_counter.

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

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

Enabled by default.

Definition at line 94 of file reference_counter.C.

95{
97 return;
98}

References libMesh::ReferenceCounter::_enable_print_counter.

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

◆ enrich_basis_from_rhs_terms()

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

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.

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
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
1362 {
1363 // If extra_linear_solver has been initialized, then we use it for the
1364 // truth solves.
1366
1369 }
1370 else
1371 {
1373
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;
1420
1421 update_system();
1422 }
1423}
virtual void print_matlab(const std::string &filename="") const
Print the contents of the vector in Matlab's sparse matrix format.
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.
LinearSolver< Number > * extra_linear_solver
Also, we store a pointer to an extra linear solver.
unsigned int get_Nmax() const
Get/set Nmax, the maximum number of RB functions we are willing to compute.
virtual void enrich_RB_space()
Add a new basis function to the RB space.
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.
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.
const std::string & name() const
Definition system.h:2385

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

◆ enrich_RB_space()

void TransientRBConstruction::enrich_RB_space ( )
overrideprotectedvirtual

Add a new basis functions to the RB space.

In the transient case we first perform a POD of the time-dependent "truth" and then add a certain number of POD modes to the reduced basis.

Reimplemented from libMesh::RBConstruction.

Definition at line 757 of file transient_rb_construction.C.

758{
759 // Need SLEPc to get the POD eigenvalues
760 LOG_SCOPE("enrich_RB_space()", "TransientRBConstruction");
761
762 // With the "method of snapshots", the size of
763 // the eigenproblem is determined by the number
764 // of time-steps (rather than the number of spatial dofs).
765 unsigned int n_snapshots = temporal_data.size();
766 DenseMatrix<Number> correlation_matrix(n_snapshots,n_snapshots);
767 for (unsigned int i=0; i<n_snapshots; i++)
768 {
771
772 for (unsigned int j=0; j<=i; j++)
773 {
774 // Scale the inner products by the number of time-steps to normalize the
775 // POD energy norm appropriately
776 Number inner_prod = (temporal_data[j]->dot(*inner_product_storage_vector)) /
777 (Real)(get_n_time_steps()+1);
778
779 correlation_matrix(i,j) = inner_prod;
780 if(i != j)
781 {
782 correlation_matrix(j,i) = libmesh_conj(inner_prod);
783 }
784 }
785 }
786
787 // The POD can be formulated in terms of either the SVD or an eigenvalue problem.
788 // Here we use the SVD of the correlation matrix to obtain the POD eigenvalues and
789 // eigenvectors.
790 DenseVector<Real> sigma( n_snapshots );
791 DenseMatrix<Number> U( n_snapshots, n_snapshots );
792 DenseMatrix<Number> VT( n_snapshots, n_snapshots );
793 correlation_matrix.svd(sigma, U, VT );
794
795 libMesh::out << std::endl << "POD singular values:" << std::endl;
796 for (unsigned int i=0; i<=1; i++)
797 {
798 libMesh::out << "singular value " << i << " = " << sigma(i) << std::endl;
799 }
800 libMesh::out << "..." << std::endl;
801 libMesh::out << "last singular value = " << sigma(n_snapshots-1) << std::endl;
802 libMesh::out << std::endl;
803
804 // Now load the new basis functions
805 unsigned int j = 0;
806 while (true)
807 {
808 // load the new basis function into the basis_functions vector.
809 get_rb_evaluation().basis_functions.emplace_back(NumericVector<Number>::build(this->comm()));
810 NumericVector<Number> & current_bf =
811 get_rb_evaluation().get_basis_function(get_rb_evaluation().get_n_basis_functions()-1);
812 current_bf.init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
813 current_bf.zero();
814
815 // Perform the matrix multiplication of temporal data with
816 // the next POD eigenvector
817 for (unsigned int i=0; i<n_snapshots; i++)
818 {
819 current_bf.add( U.el(i,j), *temporal_data[i] );
820 }
821
822 // We just set the norm to 1.
824
825 Real current_bf_norm = std::abs( std::sqrt( current_bf.dot(*inner_product_storage_vector) ) );
826 current_bf.scale(1./current_bf_norm);
827
828 // Increment j here since we use the incremented counter
829 // in the if clauses below
830 j++;
831
832 // If positive POD_tol, we use it to determine the number of basis functions
833 // to add, and then break the loop when POD_tol is satisfied, or after Nmax
834 // basis functions have been added. Else we break the loop after delta_N
835 // (or Nmax) new basis functions.
836 if (POD_tol > 0.)
837 {
838 set_delta_N(1);
839
840 // We need to define the updated RB system matrices before the RB solve
842 Real error_bound = get_rb_evaluation().rb_solve(get_rb_evaluation().get_n_basis_functions());
843
844 if ((error_bound <= POD_tol) || (get_rb_evaluation().get_n_basis_functions()==get_Nmax()))
845 {
846 set_delta_N(0);
847 break;
848 }
849 }
850 else
851 {
852 if (j == get_delta_N())
853 {
854 break;
855 }
856 else
857 if (get_rb_evaluation().get_n_basis_functions()==get_Nmax())
858 {
859 set_delta_N(j);
860 break;
861 }
862 }
863 }
864}
virtual Real rb_solve(unsigned int N)
Perform online solve with the N RB basis functions, for the set of parameters in current_params,...
T libmesh_conj(T a)
template class LIBMESH_EXPORT DenseVector< Real >

References libMesh::NumericVector< T >::add(), libMesh::RBEvaluation::basis_functions, libMesh::ParallelObject::comm(), libMesh::NumericVector< T >::dot(), libMesh::DenseMatrix< T >::el(), libMesh::RBEvaluation::get_basis_function(), libMesh::RBConstruction::get_delta_N(), libMesh::RBTemporalDiscretization::get_n_time_steps(), libMesh::RBConstruction::get_Nmax(), libMesh::RBConstruction::get_non_dirichlet_inner_product_matrix_if_avail(), libMesh::RBConstruction::get_rb_evaluation(), libMesh::NumericVector< T >::init(), libMesh::RBConstructionBase< LinearImplicitSystem >::inner_product_storage_vector, libMesh::libmesh_conj(), libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), libMesh::out, libMesh::PARALLEL, POD_tol, libMesh::RBEvaluation::rb_solve(), libMesh::Real, libMesh::NumericVector< T >::scale(), set_delta_N(), libMesh::DenseMatrix< T >::svd(), temporal_data, update_system(), libMesh::SparseMatrix< T >::vector_mult(), and libMesh::NumericVector< T >::zero().

◆ final_linear_residual()

Real libMesh::LinearImplicitSystem::final_linear_residual ( ) const
inlineinherited

◆ 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.

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] +
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}
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
NumericVector< Number > & get_sensitivity_solution(unsigned int i=0)
Definition system.C:1179

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

◆ 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 217 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,
599 serial_training_set);
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}

◆ 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 199 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,
538 serial_training_set);
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}
DIE A HORRIBLE DEATH HERE typedef MPI_Comm communicator

◆ get_abs_training_tolerance()

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

◆ 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.

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

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

◆ 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.

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}

References libMesh::System::get_vector().

◆ 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.

1243{
1244 std::ostringstream adjoint_name;
1245 adjoint_name << "adjoint_solution" << i;
1246
1247 return this->get_vector(adjoint_name.str());
1248}

References libMesh::System::get_vector().

◆ get_all_matrices()

void TransientRBConstruction::get_all_matrices ( std::map< std::string, SparseMatrix< Number > * > &  all_matrices)
overridevirtual

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

Reimplemented from libMesh::RBConstruction.

Definition at line 318 of file transient_rb_construction.C.

319{
320 Parent::get_all_matrices(all_matrices);
321
322 all_matrices["L2_matrix"] = L2_matrix.get();
323
325 all_matrices["L2_matrix_non_dirichlet"] = non_dirichlet_L2_matrix.get();
326
327 TransientRBThetaExpansion & trans_theta_expansion =
328 cast_ref<TransientRBThetaExpansion &>(get_rb_theta_expansion());
329 const unsigned int Q_m = trans_theta_expansion.get_n_M_terms();
330
331 for (unsigned int q_m=0; q_m<Q_m; q_m++)
332 {
333 std::stringstream matrix_name;
334 matrix_name << "M" << q_m;
335 all_matrices[matrix_name.str()] = get_M_q(q_m);
336
338 {
339 matrix_name << "_non_dirichlet";
340 all_matrices[matrix_name.str()] = get_non_dirichlet_M_q(q_m);
341 }
342 }
343}
virtual void get_all_matrices(std::map< std::string, SparseMatrix< Number > * > &all_matrices)
Get a map that stores pointers to all of the matrices.

References libMesh::RBConstruction::get_all_matrices(), get_M_q(), libMesh::TransientRBThetaExpansion::get_n_M_terms(), get_non_dirichlet_M_q(), libMesh::RBConstruction::get_rb_theta_expansion(), L2_matrix, non_dirichlet_L2_matrix, and libMesh::RBConstruction::store_non_dirichlet_operators.

◆ 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.

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:3389

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

◆ get_all_vectors()

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

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

Definition at line 2481 of file rb_construction.C.

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}
virtual void get_output_vectors(std::map< std::string, NumericVector< Number > * > &all_vectors)
Get a map that stores pointers to all of the vectors.

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

◆ get_Aq()

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

Get a pointer to Aq.

Definition at line 2371 of file rb_construction.C.

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}
std::vector< std::unique_ptr< SparseMatrix< Number > > > Aq_vector
Vector storing the Q_a matrices from the affine expansion.

References libMesh::RBConstruction::Aq_vector, libMesh::RBConstruction::get_rb_theta_expansion(), and libMesh::RBConstruction::store_dirichlet_operators.

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

◆ 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.

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)

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

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

◆ get_constraint_object()

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

Return the user object for imposing constraints.

Definition at line 2024 of file system.C.

2025{
2026 libmesh_assert_msg(_constrain_system_object,"No constraint object available.");
2028}

◆ get_control()

Real libMesh::RBTemporalDiscretization::get_control ( const unsigned int  k) const
inherited

◆ get_convergence_assertion_flag()

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

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

Definition at line 2745 of file rb_construction.C.

2746{
2747 return assert_convergence;
2748}

References libMesh::RBConstruction::assert_convergence.

◆ get_current_training_parameter_index()

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

Get/set the current training parameter index.

Definition at line 2765 of file rb_construction.C.

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

References libMesh::RBConstruction::_current_training_parameter_index.

Referenced by libMesh::RBConstruction::get_RB_error_bound().

◆ get_delta_N()

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

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.

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

References libMesh::RBConstruction::delta_N.

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

◆ get_delta_t()

Real libMesh::RBTemporalDiscretization::get_delta_t ( ) const
inherited

◆ 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.

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

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

◆ get_dof_map() [1/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.

2426{
2427 return *_dof_map;
2428}

References libMesh::System::_dof_map.

◆ get_dof_map() [2/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.

2418{
2419 return *_dof_map;
2420}

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(), libMesh::RBConstruction::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::AdaptiveTimeSolver::advance_timestep(), libMesh::NewmarkSolver::advance_timestep(), libMesh::UnsteadySolver::advance_timestep(), libMesh::EquationSystems::allgather(), libMesh::RBConstruction::allocate_data_structures(), allocate_data_structures(), alternative_fe_assembly(), LinearElasticity::assemble(), assemble(), 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_poisson(), assemble_SchroedingerEquation(), assemble_shell(), 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(), compute_jacobian(), compute_residual(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), LinearElasticityWithContact::compute_stresses(), compute_stresses(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), MyConstraint::constrain(), libMesh::VariationalSmootherConstraint::constrain_node_to_line(), libMesh::VariationalSmootherConstraint::constrain_node_to_plane(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::ImplicitSystem::create_static_condensation_system_matrix(), create_wrapped_function(), DMCreateDomainDecomposition_libMesh(), DMCreateFieldDecomposition_libMesh(), DMlibMeshFunction(), DMlibMeshJacobian(), DMlibMeshSetSystem_libMesh(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), fe_assembly(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::VariationalSmootherConstraint::fix_node(), libMesh::PetscNonlinearSolver< Number >::force_new_preconditioner(), form_functionA(), form_functionB(), form_matrixA(), libMesh::System::get_all_variable_numbers(), libMesh::CondensedEigenSystem::get_eigenpair(), libMesh::System::has_variable(), libMesh::SystemSubsetBySubdomain::init(), CoupledSystem::init_data(), HeatSystem::init_data(), PoissonSystem::init_data(), NavierSystem::init_data(), ElasticitySystem::init_data(), SimpleRBConstruction::init_data(), ElasticityRBConstruction::init_data(), libMesh::ClawSystem::init_data(), libMesh::SecondOrderUnsteadySolver::init_data(), libMesh::UnsteadySolver::init_data(), SigmaPhysics::init_data(), LaplaceSystem::init_dirichlet_bcs(), NonManifoldCouplingTestBase::init_es(), libMesh::System::init_matrices(), libMesh::EigenSystem::init_matrices(), libMesh::PetscDMWrapper::init_petscdm(), libMesh::CondensedEigenSystem::initialize_condensed_dofs(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), LargeDeformationElasticity::jacobian(), LaplaceYoung::jacobian(), libMesh::System::late_matrix_init(), libMesh::System::local_dof_indices(), AssembleOptimization::lower_and_upper_bounds(), main(), libMesh::DofMap::max_constraint_error(), LinearElasticityWithContact::move_mesh(), libMesh::DGFEMContext::neighbor_side_fe_reinit(), libMesh::UnsteadySolver::old_nonlinear_solution(), libMesh::SecondOrderUnsteadySolver::old_solution_accel(), libMesh::SecondOrderUnsteadySolver::old_solution_rate(), libMesh::PatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::SmoothnessEstimator::EstimateSmoothness::operator()(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::RBSCMConstruction::perform_SCM_greedy(), periodic_bc_test_poisson(), libMesh::petsc_auto_fieldsplit(), libMesh::ErrorVector::plot_error(), 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::System::reinit(), libMesh::SecondOrderUnsteadySolver::reinit(), libMesh::UnsteadySolver::reinit(), libMesh::System::reinit_constraints(), libMesh::EquationSystems::reinit_solutions(), LargeDeformationElasticity::residual(), LaplaceYoung::residual(), LinearElasticityWithContact::residual_and_jacobian(), libMesh::UnsteadySolver::retrieve_timestep(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), libMesh::HPCoarsenTest::select_refinement(), libMesh::ImplicitSystem::sensitivity_solve(), libMesh::RBConstruction::set_context_solution_vec(), libMesh::PetscPreconditioner< T >::set_hypre_ads_data(), libMesh::PetscPreconditioner< T >::set_hypre_ams_data(), libMesh::PetscDMWrapper::set_point_range_in_section(), set_system_parameters(), FETestBase< order, family, elem_type, build_nx, CaseName >::setUp(), SlitMeshRefinedSystemTest::setUp(), SolidSystem::side_time_derivative(), libMesh::NewtonSolver::solve(), libMesh::PetscDiffSolver::solve(), libMesh::EigenSystem::solve(), libMesh::RBConstruction::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(), SystemsTest::testProjectScalarCoarsening(), 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_number(), 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 libMesh::RBConstruction::zero_constrained_dofs_on_vector().

◆ get_equation_systems() [1/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.

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

References libMesh::System::_equation_systems.

◆ get_equation_systems() [2/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.

767{ return _equation_systems; }

References libMesh::System::_equation_systems.

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::RBSCMConstruction::add_scaled_symm_Aq(), libMesh::NewmarkSystem::clear(), libMesh::FrequencySystem::clear_all(), compute_jacobian(), compute_residual(), LinearElasticityWithContact::compute_stresses(), SolidSystem::element_time_derivative(), libMesh::RBConstruction::enrich_basis_from_rhs_terms(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::AdjointResidualErrorEstimator::estimate_error(), libMesh::ExactErrorEstimator::find_squared_element_error(), libMesh::ImplicitSystem::get_linear_solve_parameters(), HeatSystem::init_data(), SolidSystem::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::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::CondensedEigenSystem::solve(), libMesh::EigenSystem::solve(), libMesh::FrequencySystem::solve(), libMesh::RBConstruction::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::DirectSolutionTransfer::transfer(), libMesh::DTKSolutionTransfer::transfer(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::RBConstruction::truth_solve(), and libMesh::WrappedFunction< Output >::WrappedFunction().

◆ get_error_temporal_data()

const NumericVector< Number > & TransientRBConstruction::get_error_temporal_data ( )

Get the column of temporal_data corresponding to the current time level.

This gives access to the truth projection error data. If the RB basis is empty, then this corresponds to the truth solution data itself.

Definition at line 698 of file transient_rb_construction.C.

699{
700 LOG_SCOPE("get_error_temporal_data()", "TransientRBConstruction");
701
702 const unsigned int time_step = get_time_step();
703
704 return *temporal_data[time_step];
705}
unsigned int get_time_step() const
Get/set the current time-step.

References libMesh::RBTemporalDiscretization::get_time_step(), and temporal_data.

◆ get_euler_theta()

Real libMesh::RBTemporalDiscretization::get_euler_theta ( ) const
inherited

◆ get_evaluated_thetas()

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

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

Definition at line 2776 of file rb_construction.C.

2777{
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}
std::vector< std::vector< Number > > _evaluated_thetas
Storage of evaluated theta functions at a set of parameters.

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

Referenced by libMesh::RBConstruction::get_RB_error_bound().

◆ 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 128 of file rb_construction_base.C.

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 {
203 if (serial_training_set)
204 return 0;
205 else
206 return this->comm().rank();
207 }
208
209 return _first_local_index;
210}
processor_id_type rank() const
std::map< std::string, std::vector< RBParameter > > _training_parameters
The training samples for each parameter.
numeric_index_type _first_local_index
The first sample-vector index from the global vector which is stored in the _training_parameters on t...

◆ get_Fq()

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

Get a pointer to Fq.

Definition at line 2403 of file rb_construction.C.

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}
std::vector< std::unique_ptr< NumericVector< Number > > > Fq_vector
Vector storing the Q_f vectors in the affine decomposition of the right-hand side.

References libMesh::RBConstruction::Fq_vector, libMesh::RBConstruction::get_rb_theta_expansion(), and libMesh::RBConstruction::store_dirichlet_operators.

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

◆ 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 255 of file rb_construction_base.C.

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}

◆ get_greedy_parameter()

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

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

Definition at line 1607 of file rb_construction.C.

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

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

◆ 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.

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}
static Counts _counts
Actually holds the data.
std::string name(const ElemQuality q)
This function returns a string containing some name for q.

References libMesh::ReferenceCounter::_counts.

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

◆ 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.

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}

References libMesh::ReferenceCounter::_counts.

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

◆ get_info() [3/3]

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

Definition at line 1827 of file system.C.

1828{
1829 std::ostringstream oss;
1830
1831
1832 const std::string & sys_name = this->name();
1833
1834 oss << " System #" << this->number() << ", \"" << sys_name << "\"\n"
1835 << " Type \"" << this->system_type() << "\"\n"
1836 << " Variables=";
1837
1838 for (auto vg : make_range(this->n_variable_groups()))
1839 {
1840 const VariableGroup & vg_description (this->variable_group(vg));
1841
1842 if (vg_description.n_variables() > 1) oss << "{ ";
1843 for (auto vn : make_range(vg_description.n_variables()))
1844 oss << "\"" << vg_description.name(vn) << "\" ";
1845 if (vg_description.n_variables() > 1) oss << "} ";
1846 }
1847
1848 oss << '\n';
1849
1850 oss << " Finite Element Types=";
1851#ifndef LIBMESH_ENABLE_INFINITE_ELEMENTS
1852 for (auto vg : make_range(this->n_variable_groups()))
1853 oss << "\""
1854 << Utility::enum_to_string<FEFamily>(this->get_dof_map().variable_group(vg).type().family)
1855 << "\" ";
1856#else
1857 for (auto vg : make_range(this->n_variable_groups()))
1858 {
1859 oss << "\""
1860 << Utility::enum_to_string<FEFamily>(this->get_dof_map().variable_group(vg).type().family)
1861 << "\", \""
1862 << Utility::enum_to_string<FEFamily>(this->get_dof_map().variable_group(vg).type().radial_family)
1863 << "\" ";
1864 }
1865
1866 oss << '\n' << " Infinite Element Mapping=";
1867 for (auto vg : make_range(this->n_variable_groups()))
1868 oss << "\""
1869 << Utility::enum_to_string<InfMapType>(this->get_dof_map().variable_group(vg).type().inf_map)
1870 << "\" ";
1871#endif
1872
1873 oss << '\n';
1874
1875 oss << " Approximation Orders=";
1876 for (auto vg : make_range(this->n_variable_groups()))
1877 {
1878#ifndef LIBMESH_ENABLE_INFINITE_ELEMENTS
1879 oss << "\""
1880 << Utility::enum_to_string<Order>(this->get_dof_map().variable_group(vg).type().order)
1881 << "\" ";
1882#else
1883 oss << "\""
1884 << Utility::enum_to_string<Order>(this->get_dof_map().variable_group(vg).type().order)
1885 << "\", \""
1886 << Utility::enum_to_string<Order>(this->get_dof_map().variable_group(vg).type().radial_order)
1887 << "\" ";
1888#endif
1889 }
1890
1891 oss << '\n';
1892
1893 if (this->is_initialized())
1894 {
1895 oss << " n_dofs()=" << this->n_dofs() << '\n';
1896 dof_id_type local_dofs = this->n_local_dofs();
1897 oss << " n_local_dofs()=" << local_dofs << '\n';
1898 this->comm().max(local_dofs);
1899 oss << " max(n_local_dofs())=" << local_dofs << '\n';
1900#ifdef LIBMESH_ENABLE_CONSTRAINTS
1901 if (this->n_constrained_dofs())
1902 {
1903 oss << " n_constrained_dofs()=" << this->n_constrained_dofs() << '\n';
1904 oss << " n_local_constrained_dofs()=" << this->n_local_constrained_dofs() << '\n';
1905 dof_id_type local_unconstrained_dofs = this->n_local_dofs() - this->n_local_constrained_dofs();
1906 this->comm().max(local_unconstrained_dofs);
1907 oss << " max(local unconstrained dofs)=" << local_unconstrained_dofs << '\n';
1908 }
1909#endif
1910 if (this->has_static_condensation())
1911 oss << " n uncondensed dofs="
1912 << this->get_dof_map().get_static_condensation().n_dofs() << '\n';
1913 }
1914 else
1915 oss << " (still uninitialized)\n";
1916
1917 oss << " " << "n_vectors()=" << this->n_vectors() << '\n';
1918 oss << " " << "n_matrices()=" << this->n_matrices() << '\n';
1919 // oss << " " << "n_additional_matrices()=" << this->n_additional_matrices() << '\n';
1920
1921 oss << this->get_dof_map().get_info();
1922
1923 return oss.str();
1924}
dof_id_type n_dofs() const
StaticCondensationDofMap & get_static_condensation()
Definition dof_map.h:2859
std::string get_info() const
Gets summary info about the sparsity bandwidth and constraints.
Definition dof_map.C:2985
bool is_initialized() const
Definition system.h:2457
virtual std::string system_type() const
Definition system.h:510
dof_id_type n_constrained_dofs() const
Definition system.C:125
const VariableGroup & variable_group(unsigned int vg) const
Return a constant reference to VariableGroup vg.
Definition system.C:2709
unsigned int n_variable_groups() const
Definition system.C:2699
dof_id_type n_local_constrained_dofs() const
Definition system.C:140
unsigned int number() const
Definition system.h:2393
uint8_t dof_id_type
Definition id_types.h:67

References libMesh::make_range(), libMesh::VariableGroup::n_variables(), and libMesh::VariableGroup::name().

Referenced by SystemsTest::testUninitializedInfo().

◆ get_inner_product_assembly()

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

Definition at line 427 of file rb_construction.C.

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
436}

References libMesh::RBConstruction::inner_product_assembly, and libMesh::RBConstruction::use_energy_inner_product.

◆ get_inner_product_matrix() [1/2]

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

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.

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}

References libMesh::RBConstruction::inner_product_matrix, and libMesh::RBConstruction::store_dirichlet_operators.

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

◆ get_inner_product_matrix() [2/2]

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

Definition at line 2328 of file rb_construction.C.

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}

References libMesh::RBConstruction::inner_product_matrix, and libMesh::RBConstruction::store_dirichlet_operators.

◆ get_L2_assembly()

ElemAssembly & TransientRBConstruction::get_L2_assembly ( )
Returns
A reference to the L2 assembly object

Definition at line 458 of file transient_rb_construction.C.

459{
460 libmesh_error_msg_if(!L2_assembly, "Error: L2_assembly hasn't been initialized yet");
461
462 return *L2_assembly;
463}

References L2_assembly.

◆ 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 133 of file rb_construction_base.C.

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}

◆ 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::DifferentiableSystem, and libMesh::NonlinearImplicitSystem.

Definition at line 1237 of file implicit_system.C.

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}
void ErrorVector unsigned int
bool have_parameter(std::string_view) const
Definition parameters.h:420
const T & get(std::string_view) const
Definition parameters.h:451

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::LinearImplicitSystem::solve(), libMesh::FrequencySystem::solve(), libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve(), and libMesh::ImplicitSystem::weighted_sensitivity_solve().

◆ get_linear_solver()

LinearSolver< Number > * libMesh::LinearImplicitSystem::get_linear_solver ( ) const
overridevirtualinherited

◆ 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 123 of file rb_construction_base.C.

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}

◆ get_M_q()

SparseMatrix< Number > * TransientRBConstruction::get_M_q ( unsigned int  q)

Get a pointer to M_q.

Definition at line 293 of file transient_rb_construction.C.

294{
295 TransientRBThetaExpansion & trans_theta_expansion =
296 cast_ref<TransientRBThetaExpansion &>(get_rb_theta_expansion());
297
298 libmesh_error_msg_if(q >= trans_theta_expansion.get_n_M_terms(),
299 "Error: We must have q < Q_m in get_M_q.");
300
301 return M_q_vector[q].get();
302}

References libMesh::TransientRBThetaExpansion::get_n_M_terms(), libMesh::RBConstruction::get_rb_theta_expansion(), and M_q_vector.

Referenced by add_scaled_mass_matrix(), assemble_all_affine_operators(), get_all_matrices(), mass_matrix_scaled_matvec(), and update_RB_system_matrices().

◆ get_matrix() [1/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.

1119{
1120 return *libmesh_map_find(_matrices, mat_name);
1121}

References libMesh::System::_matrices.

◆ get_matrix() [2/2]

const SparseMatrix< Number > & libMesh::System::get_matrix ( std::string_view  mat_name) const
inherited

◆ get_matrix_for_output_dual_solves()

SparseMatrix< Number > & TransientRBConstruction::get_matrix_for_output_dual_solves ( )
overrideprotectedvirtual

Override to return the L2 product matrix for output dual norm solves for transient state problems.

Reimplemented from libMesh::RBConstruction.

Definition at line 879 of file transient_rb_construction.C.

880{
881 return *L2_matrix;
882}

References L2_matrix.

◆ get_max_truth_solves()

int libMesh::TransientRBConstruction::get_max_truth_solves ( ) const
inline

Get/set max_truth_solves, the maximum number of RB truth solves we are willing to compute in the transient case.

Note
In the steady state case, max_truth_solves is not needed since it is equivalent to Nmax.

Definition at line 214 of file transient_rb_construction.h.

214{ return max_truth_solves; }

References max_truth_solves.

Referenced by greedy_termination_test().

◆ get_mesh() [1/2]

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

Definition at line 2409 of file system.h.

2410{
2411 return _mesh;
2412}

References libMesh::System::_mesh.

◆ get_mesh() [2/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.

2402{
2403 return _mesh;
2404}

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(), libMesh::RBConstruction::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(), AssemblyF0::boundary_assembly(), AssemblyF1::boundary_assembly(), AssemblyF2::boundary_assembly(), AssemblyA0::boundary_assembly(), AssemblyA1::boundary_assembly(), AssemblyA2::boundary_assembly(), 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::ImplicitSystem::create_static_condensation_system_matrix(), libMesh::RBEIMEvaluation::distribute_bfs(), DMCreateDomainDecomposition_libMesh(), DMCreateFieldDecomposition_libMesh(), DMlibMeshSetSystem_libMesh(), NavierSystem::element_constraint(), HeatSystem::element_time_derivative(), NavierSystem::element_time_derivative(), SolidSystem::element_time_derivative(), libMesh::RBConstruction::enrich_basis_from_rhs_terms(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_interiors(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_sides(), libMesh::AdjointResidualErrorEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::SmoothnessEstimator::estimate_smoothness(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::VariationalSmootherConstraint::fix_node(), NavierSystem::forcing(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::GenericProjector(), LinearElasticityWithContact::get_least_and_max_gap_function(), AssemblyPointLoadX::get_nodal_rhs_values(), AssemblyPointLoadY::get_nodal_rhs_values(), AssemblyPointLoadZ::get_nodal_rhs_values(), libMesh::SystemSubsetBySubdomain::init(), libMesh::RBEIMConstruction::init_context(), NavierSystem::init_data(), SolidSystem::init_data(), ElasticitySystem::init_data(), ElasticityRBConstruction::init_data(), libMesh::System::init_data(), libMesh::VariationalSmootherSystem::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(), NavierSystem::mass_residual(), libMesh::DofMap::max_constraint_error(), libMesh::FEMSystem::mesh_position_get(), libMesh::FEMSystem::mesh_position_set(), LinearElasticityWithContact::move_mesh(), libMesh::RBEIMEvaluation::node_distribute_bfs(), Integrate::operator()(), libMesh::PatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::SmoothnessEstimator::EstimateSmoothness::operator()(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::petsc_auto_fieldsplit(), NavierSystem::postprocess(), 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(), NavierSystem::side_constraint(), libMesh::RBEIMEvaluation::side_distribute_bfs(), SolidSystem::side_time_derivative(), libMesh::PetscDiffSolver::solve(), libMesh::ClawSystem::solve_conservation_law(), MeshAssignTest::testMeshMoveAssign(), libMesh::BoundaryVolumeSolutionTransfer::transfer(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::BoundaryVolumeSolutionTransfer::transfer_boundary_volume(), libMesh::BoundaryVolumeSolutionTransfer::transfer_volume_boundary(), libMesh::RBConstruction::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().

◆ 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.

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}
unsigned int get_n_discrete_params() const
Get the number of discrete parameters.

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

◆ 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.

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}

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

◆ get_n_params()

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

◆ get_n_time_steps()

unsigned int libMesh::RBTemporalDiscretization::get_n_time_steps ( ) const
inherited

◆ 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 118 of file rb_construction_base.C.

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 {
165 if (serial_training_set)
166 return 1;
167 else
168 return this->comm().size();
169 }
170
172}
processor_id_type size() const

◆ get_Nmax()

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

◆ get_non_dirichlet_Aq()

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

Get a pointer to non_dirichlet_Aq.

Definition at line 2382 of file rb_construction.C.

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}
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 ...

References libMesh::RBConstruction::get_rb_theta_expansion(), libMesh::RBConstruction::non_dirichlet_Aq_vector, and libMesh::RBConstruction::store_non_dirichlet_operators.

Referenced by libMesh::RBConstruction::assemble_all_affine_operators(), libMesh::RBConstruction::get_all_matrices(), and libMesh::RBConstruction::get_non_dirichlet_Aq_if_avail().

◆ get_non_dirichlet_Aq_if_avail()

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

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

Definition at line 2393 of file rb_construction.C.

2394{
2396 {
2397 return get_non_dirichlet_Aq(q);
2398 }
2399
2400 return get_Aq(q);
2401}
SparseMatrix< Number > * get_non_dirichlet_Aq(unsigned int q)
Get a pointer to non_dirichlet_Aq.

References libMesh::RBConstruction::get_Aq(), libMesh::RBConstruction::get_non_dirichlet_Aq(), and libMesh::RBConstruction::store_non_dirichlet_operators.

Referenced by libMesh::RBConstruction::update_RB_system_matrices().

◆ get_non_dirichlet_Fq()

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

Get a pointer to non-Dirichlet Fq.

Definition at line 2414 of file rb_construction.C.

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

References libMesh::RBConstruction::get_rb_theta_expansion(), libMesh::RBConstruction::non_dirichlet_Fq_vector, and libMesh::RBConstruction::store_non_dirichlet_operators.

Referenced by libMesh::RBConstruction::assemble_all_affine_vectors(), libMesh::RBConstruction::get_all_vectors(), and libMesh::RBConstruction::get_non_dirichlet_Fq_if_avail().

◆ get_non_dirichlet_Fq_if_avail()

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

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

Definition at line 2425 of file rb_construction.C.

2426{
2428 {
2429 return get_non_dirichlet_Fq(q);
2430 }
2431
2432 return get_Fq(q);
2433}

References libMesh::RBConstruction::get_Fq(), libMesh::RBConstruction::get_non_dirichlet_Fq(), and libMesh::RBConstruction::store_non_dirichlet_operators.

Referenced by libMesh::RBConstruction::update_RB_system_matrices().

◆ get_non_dirichlet_inner_product_matrix() [1/2]

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

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.

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

References libMesh::RBConstruction::non_dirichlet_inner_product_matrix, and libMesh::RBConstruction::store_non_dirichlet_operators.

Referenced by libMesh::RBConstruction::get_all_matrices(), libMesh::RBConstruction::get_non_dirichlet_inner_product_matrix_if_avail(), and libMesh::RBConstruction::get_non_dirichlet_inner_product_matrix_if_avail().

◆ get_non_dirichlet_inner_product_matrix() [2/2]

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

Definition at line 2343 of file rb_construction.C.

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}

References libMesh::RBConstruction::non_dirichlet_inner_product_matrix, and libMesh::RBConstruction::store_non_dirichlet_operators.

◆ get_non_dirichlet_inner_product_matrix_if_avail() [1/2]

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

◆ get_non_dirichlet_inner_product_matrix_if_avail() [2/2]

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

◆ get_non_dirichlet_M_q()

SparseMatrix< Number > * TransientRBConstruction::get_non_dirichlet_M_q ( unsigned int  q)

Get a pointer to non_dirichlet_M_q.

Definition at line 304 of file transient_rb_construction.C.

305{
306 libmesh_error_msg_if(!store_non_dirichlet_operators,
307 "Error: Must have store_non_dirichlet_operators==true to access non_dirichlet_M_q.");
308
309 TransientRBThetaExpansion & trans_theta_expansion =
310 cast_ref<TransientRBThetaExpansion &>(get_rb_theta_expansion());
311
312 libmesh_error_msg_if(q >= trans_theta_expansion.get_n_M_terms(),
313 "Error: We must have q < Q_m in get_M_q.");
314
315 return non_dirichlet_M_q_vector[q].get();
316}

References libMesh::TransientRBThetaExpansion::get_n_M_terms(), libMesh::RBConstruction::get_rb_theta_expansion(), non_dirichlet_M_q_vector, and libMesh::RBConstruction::store_non_dirichlet_operators.

Referenced by assemble_all_affine_operators(), and get_all_matrices().

◆ get_non_dirichlet_output_vector()

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

Get a pointer to non-Dirichlet output vector.

Definition at line 2445 of file rb_construction.C.

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}
std::vector< std::vector< std::unique_ptr< NumericVector< Number > > > > non_dirichlet_outputs_vector

References libMesh::RBConstruction::get_rb_theta_expansion(), and libMesh::RBConstruction::non_dirichlet_outputs_vector.

Referenced by libMesh::RBConstruction::assemble_all_output_vectors(), and libMesh::RBConstruction::get_output_vectors().

◆ get_normalize_rb_bound_in_greedy()

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

Definition at line 234 of file rb_construction.h.

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

References libMesh::RBConstruction::normalize_rb_bound_in_greedy.

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

◆ get_output_vector()

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

Get a pointer to the n^th output.

Definition at line 2435 of file rb_construction.C.

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}
std::vector< std::vector< std::unique_ptr< NumericVector< Number > > > > outputs_vector
The libMesh vectors that define the output functionals.

References libMesh::RBConstruction::get_rb_theta_expansion(), and libMesh::RBConstruction::outputs_vector.

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

◆ get_output_vectors()

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

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

Definition at line 2503 of file rb_construction.C.

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}

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

Referenced by libMesh::RBConstruction::get_all_vectors().

◆ 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.

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.

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

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

◆ 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.

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}

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

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

◆ get_parameters()

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

Get the current parameters.

Definition at line 143 of file rb_parametrized.C.

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

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

Referenced by 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(), libMesh::RBConstruction::get_RB_error_bound(), libMesh::RBSCMEvaluation::get_SCM_LB(), libMesh::RBSCMEvaluation::get_SCM_UB(), SimpleRBEvaluation::get_stability_lower_bound(), libMesh::RBConstruction::greedy_termination_test(), libMesh::RBEIMConstruction::initialize_parametrized_functions_in_training_set(), libMesh::RBSCMEvaluation::legacy_read_offline_data_from_files(), main(), mass_matrix_scaled_matvec(), libMesh::RBConstruction::preevaluate_thetas(), libMesh::RBEIMConstruction::print_info(), libMesh::RBSCMConstruction::print_info(), libMesh::RBConstruction::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::RBConstruction::truth_assembly(), truth_assembly(), libMesh::RBConstruction::truth_solve(), truth_solve(), libMesh::TransientRBEvaluation::uncached_compute_residual_dual_norm(), and libMesh::RBConstruction::update_greedy_param_list().

◆ get_parameters_max()

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

◆ get_parameters_min()

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

◆ 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 238 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 << " - "
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}
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.
SimpleRange< IndexType > as_range(const std::pair< IndexType, IndexType > &p)
Helper function that allows us to treat a homogenous pair as a range.
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:153

◆ get_POD_tol()

Real libMesh::TransientRBConstruction::get_POD_tol ( ) const
inline

Get/set POD_tol.

Definition at line 220 of file transient_rb_construction.h.

220{ return POD_tol; }

References POD_tol.

Referenced by print_info().

◆ get_preevaluate_thetas_flag()

bool libMesh::RBConstruction::get_preevaluate_thetas_flag ( ) const
inherited

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

Definition at line 2755 of file rb_construction.C.

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

References libMesh::RBConstruction::_preevaluate_thetas_flag.

Referenced by libMesh::RBConstruction::compute_max_error_bound(), libMesh::RBConstruction::get_RB_error_bound(), and libMesh::RBConstruction::train_reduced_basis_with_greedy().

◆ 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.

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

References libMesh::System::project_with_constraints.

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

◆ get_qoi_error_estimate_value()

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

Definition at line 2211 of file system.C.

2212{
2213 libmesh_assert(qoi_index < _qoi_error_estimates.size());
2214 return _qoi_error_estimates[qoi_index];
2215}
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

References libMesh::libmesh_assert().

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

◆ 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

◆ get_rb_assembly_expansion()

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

Definition at line 414 of file rb_construction.C.

415{
416 libmesh_error_msg_if(!rb_assembly_expansion, "Error: RBAssemblyExpansion object hasn't been initialized yet");
417
418 return *rb_assembly_expansion;
419}

References libMesh::RBConstruction::rb_assembly_expansion.

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

◆ get_RB_error_bound()

Real libMesh::RBConstruction::get_RB_error_bound ( )
protectedvirtualinherited
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.

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}
const std::vector< Number > & get_evaluated_thetas(unsigned int training_parameter_index) const
Return the evaluated theta functions at the given training parameter index.
unsigned int get_current_training_parameter_index() const
Get/set the current training parameter index.
virtual Real get_error_bound_normalization()

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

Referenced by libMesh::RBConstruction::compute_max_error_bound().

◆ get_rb_evaluation() [1/2]

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

Get a reference to the RBEvaluation object.

Definition at line 179 of file rb_construction.C.

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

References libMesh::RBConstruction::rb_eval.

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

◆ get_rb_evaluation() [2/2]

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

Definition at line 186 of file rb_construction.C.

187{
188 libmesh_error_msg_if(!rb_eval, "Error: RBEvaluation object hasn't been initialized yet");
189
190 return *rb_eval;
191}

References libMesh::RBConstruction::rb_eval.

◆ get_rb_theta_expansion() [1/2]

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

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

Definition at line 198 of file rb_construction.C.

199{
201}
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the rb_theta_expansion.

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

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

◆ get_rb_theta_expansion() [2/2]

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

◆ get_RB_training_type()

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

Definition at line 1698 of file rb_construction.C.

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

References libMesh::RBConstruction::RB_training_type.

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

◆ get_rel_training_tolerance()

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

Definition at line 220 of file rb_construction.h.

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

References libMesh::RBConstruction::rel_training_tolerance.

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

◆ 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.

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}

References libMesh::System::get_vector().

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

◆ 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.

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}

References libMesh::System::get_vector().

◆ 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.

1180{
1181 std::ostringstream sensitivity_name;
1182 sensitivity_name << "sensitivity_solution" << i;
1183
1184 return this->get_vector(sensitivity_name.str());
1185}

References libMesh::System::get_vector().

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

◆ 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.

1190{
1191 std::ostringstream sensitivity_name;
1192 sensitivity_name << "sensitivity_solution" << i;
1193
1194 return this->get_vector(sensitivity_name.str());
1195}

References libMesh::System::get_vector().

◆ 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.

182{ return _shell_matrix; }

References libMesh::LinearImplicitSystem::_shell_matrix.

◆ 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.

363{
365 return *_sc_system_matrix;
366}

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

Referenced by assemble_poisson(), and libMesh::ImplicitSystem::create_static_condensation_system_matrix().

◆ get_system_matrix() [1/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.

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

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

◆ get_system_matrix() [2/2]

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

◆ get_time_step()

unsigned int libMesh::RBTemporalDiscretization::get_time_step ( ) const
inherited

◆ get_vector() [1/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.

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}
vectors_iterator vectors_begin()
Beginning of vectors container.
Definition system.h:2505

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

◆ get_vector() [2/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.

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}

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

◆ get_vector() [3/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.

939{
940 return *(libmesh_map_find(_vectors, vec_name));
941}

References libMesh::System::_vectors.

◆ get_vector() [4/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.

932{
933 return *(libmesh_map_find(_vectors, vec_name));
934}

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::AdaptiveTimeSolver::advance_timestep(), libMesh::NewmarkSolver::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_rhs(), libMesh::System::get_adjoint_solution(), libMesh::System::get_adjoint_solution(), libMesh::System::get_sensitivity_rhs(), libMesh::System::get_sensitivity_rhs(), libMesh::System::get_sensitivity_solution(), libMesh::System::get_sensitivity_solution(), libMesh::System::get_weighted_sensitivity_adjoint_solution(), libMesh::System::get_weighted_sensitivity_adjoint_solution(), libMesh::System::get_weighted_sensitivity_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().

◆ 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.

1265{
1266 std::ostringstream adjoint_name;
1267 adjoint_name << "weighted_sensitivity_adjoint_solution" << i;
1268
1269 return this->get_vector(adjoint_name.str());
1270}

References libMesh::System::get_vector().

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

◆ 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.

1275{
1276 std::ostringstream adjoint_name;
1277 adjoint_name << "weighted_sensitivity_adjoint_solution" << i;
1278
1279 return this->get_vector(adjoint_name.str());
1280}

References libMesh::System::get_vector().

◆ 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.

1207{
1208 return this->get_vector("weighted_sensitivity_solution");
1209}

References libMesh::System::get_vector().

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

◆ 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.

1214{
1215 return this->get_vector("weighted_sensitivity_solution");
1216}

References libMesh::System::get_vector().

◆ greedy_termination_test()

bool TransientRBConstruction::greedy_termination_test ( Real  abs_greedy_error,
Real  initial_greedy_error,
int  count 
)
overridevirtual

Function that indicates when to terminate the Greedy basis training.

Reimplemented from libMesh::RBConstruction.

Definition at line 615 of file transient_rb_construction.C.

618{
619 if ((get_max_truth_solves()>0) && (count >= get_max_truth_solves()))
620 {
621 libMesh::out << "Maximum number of truth solves reached: max = "
622 << count << std::endl;
623 return true;
624 }
625
626 return Parent::greedy_termination_test(abs_greedy_error, initial_greedy_error, count);
627}
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.
int get_max_truth_solves() const
Get/set max_truth_solves, the maximum number of RB truth solves we are willing to compute in the tran...

References get_max_truth_solves(), libMesh::RBConstruction::greedy_termination_test(), and libMesh::out.

◆ 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 2019 of file system.C.

2020{
2021 return _constrain_system_object != nullptr;
2022}

◆ 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.

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

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

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

◆ 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.

1933{ return _matrices.count(mat_name); }

References libMesh::System::_matrices.

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

◆ 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.

2492{
2493 return (_vectors.count(vec_name));
2494}

References libMesh::System::_vectors.

◆ 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.

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

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

◆ 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 2684 of file system.C.

2685{
2686 return this->get_dof_map().identify_variable_groups();
2687}
bool identify_variable_groups() const
Definition dof_map.h:2951

◆ identify_variable_groups() [2/2]

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

Toggle automatic VariableGroup identification.

Definition at line 2689 of file system.C.

2690{
2692}

◆ 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.

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}
streamT * get()
Rather than implement every ostream/ios/ios_base function, we'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
OStreamProxy err

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

Referenced by libMesh::ReferenceCountedObject< T >::ReferenceCountedObject(), libMesh::ReferenceCountedObject< T >::ReferenceCountedObject(), and libMesh::ReferenceCountedObject< T >::ReferenceCountedObject().

◆ 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.

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}

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

Referenced by libMesh::ReferenceCountedObject< T >::ReferenceCountedObject(), libMesh::ReferenceCountedObject< T >::ReferenceCountedObject(), and libMesh::ReferenceCountedObject< T >::ReferenceCountedObject().

◆ 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.

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}

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

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

◆ 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.

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}

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

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

◆ init()

void libMesh::System::init ( )
inherited

Initializes degrees of freedom on the current mesh.

Sets the

Definition at line 196 of file system.C.

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

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

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

◆ init_context()

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

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, ElasticityRBConstruction, SimpleRBConstruction, and SimpleRBConstruction.

Definition at line 825 of file rb_construction.h.

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

Referenced by libMesh::RBConstruction::add_scaled_matrix_and_vector().

◆ 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, ElasticityRBConstruction, SimpleRBConstruction, and SimpleRBConstruction.

Definition at line 231 of file rb_construction_base.C.

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
129 inner_product_storage_vector = NumericVector<Number>::build(this->comm());
130 inner_product_storage_vector->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
131}

◆ 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.

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
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
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
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}
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:1960
void attach_matrix(SparseMatrix< Number > &matrix)
Additional matrices may be attached to this DofMap.
Definition dof_map.C:240
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 _require_sparsity_pattern
Whether any of our matrices require an initial sparsity pattern computation in order to determine pre...
Definition system.h:2353

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::libmesh_assert(), and libMesh::System::name().

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

◆ init_qois()

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

Accessors for qoi and qoi_error_estimates vectors.

Definition at line 2169 of file system.C.

2170{
2171 _qoi.resize(n_qois);
2173}

Referenced by CoupledSystem::CoupledSystem(), HeatSystem::HeatSystem(), LaplaceQoI::init_qoi_count(), CoupledSystemQoI::init_qoi_count(), LaplaceSystem::LaplaceSystem(), main(), and PoissonSystem::PoissonSystem().

◆ 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.

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}
void set_value(const std::string &param_name, Real value)
Set the value of the specified parameter.

References libMesh::RBParametrized::_discrete_parameter_values, libMesh::RBParameters::begin_serialized(), libMesh::RBParameters::end_serialized(), libMesh::RBParameters::n_parameters(), libMesh::RBParameters::n_samples(), 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 libMesh::RBConstruction::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::RBConstruction::set_rb_construction_parameters(), libMesh::RBEIMConstruction::set_rb_construction_parameters(), RBParametersTest::testRBParametrized(), libMesh::RBEIMConstruction::train_eim_approximation_with_greedy(), libMesh::RBEIMConstruction::train_eim_approximation_with_POD(), libMesh::RBConstruction::train_reduced_basis_with_greedy(), and libMesh::RBConstruction::train_reduced_basis_with_POD().

◆ 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.

97{
98 initialize_parameters(rb_parametrized.get_parameters_min(),
99 rb_parametrized.get_parameters_max(),
100 rb_parametrized.get_discrete_parameter_values());
101}

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

◆ initialize_rb_construction()

void TransientRBConstruction::initialize_rb_construction ( bool  skip_matrix_assembly = false,
bool  skip_vector_assembly = false 
)
overridevirtual

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.

Override to check that theta and assembly expansions are consistently sized.

Reimplemented from libMesh::RBConstruction.

Definition at line 99 of file transient_rb_construction.C.

101{
102 // Check that the theta and assembly objects are consistently sized
103#ifndef NDEBUG
104 TransientRBThetaExpansion & trans_theta_expansion =
105 cast_ref<TransientRBThetaExpansion &>(get_rb_theta_expansion());
106
107 TransientRBAssemblyExpansion & trans_assembly_expansion =
108 cast_ref<TransientRBAssemblyExpansion &>(get_rb_assembly_expansion());
109#endif
110 // This assert only gets called if DEBUG is on
111 libmesh_assert_equal_to (trans_theta_expansion.get_n_M_terms(), trans_assembly_expansion.get_n_M_terms());
112
113 Parent::initialize_rb_construction(skip_matrix_assembly, skip_vector_assembly);
114}
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.

References libMesh::TransientRBAssemblyExpansion::get_n_M_terms(), libMesh::TransientRBThetaExpansion::get_n_M_terms(), libMesh::RBConstruction::get_rb_assembly_expansion(), libMesh::RBConstruction::get_rb_theta_expansion(), and libMesh::RBConstruction::initialize_rb_construction().

◆ 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 142 of file rb_construction_base.C.

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,
320 _training_parameters,
321 n_global_training_samples,
322 mu_min,
323 mu_max,
324 serial_training_set);
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,
334 _training_parameters,
335 n_global_training_samples,
336 mu_min,
337 mu_max,
338 this->_training_parameters_random_seed,
339 serial_training_set);
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)
346 this->comm().sum(_n_global_training_samples);
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}
bool _training_parameters_initialized
Boolean flag to indicate whether or not the parameter ranges have been initialized.
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.
bool is_discrete_parameter(const std::string &mu_name) const
Is parameter mu_name discrete?
The libMesh namespace provides an interface to certain functionality in the library.

◆ initialize_truth()

void TransientRBConstruction::initialize_truth ( )
protectedvirtual

This function imposes a truth initial condition, defaults to zero initial condition if the flag nonzero_initialization is true.

Definition at line 707 of file transient_rb_construction.C.

708{
710 {
711 // Use System::read_serialized_data to read the initial condition
712 // into this->solution
713 Xdr IC_data(init_filename, READ);
714 read_serialized_data(IC_data, false);
715 }
716 else
717 {
718 // Otherwise zero out the solution as a default
719 this->solution->zero();
720 }
721 this->solution->close();
722 this->update();
723}
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
virtual void update()
Update the local values to reflect the solution on neighboring processors.
Definition system.C:498

References init_filename, nonzero_initialization, libMesh::READ, libMesh::System::read_serialized_data(), libMesh::System::solution, and libMesh::System::update().

Referenced by add_IC_to_RB_space(), assemble_affine_expansion(), truth_solve(), and update_RB_initial_condition_all_N().

◆ 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.

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

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

◆ 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.

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}

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

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

◆ 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.

2458{
2459 return _is_initialized;
2460}

References libMesh::System::_is_initialized.

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

◆ 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.

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
inherited
Returns
true if rb_eval is initialized. False, otherwise.

Definition at line 193 of file rb_construction.C.

194{
195 return (rb_eval != nullptr);
196}

References libMesh::RBConstruction::rb_eval.

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

◆ is_serial_training_type()

bool libMesh::RBConstruction::is_serial_training_type ( const std::string &  RB_training_type_in)
virtualinherited
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.

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

Referenced by libMesh::RBConstruction::set_RB_training_type().

◆ is_value_in_list()

bool libMesh::RBParametrized::is_value_in_list ( Real  value,
const std::vector< Real > &  list_of_values,
Real  tol 
)
staticprivateinherited

Helper function to check if the specified value is in the list of values (within a tolerance given by tol).

Definition at line 451 of file rb_parametrized.C.

452{
453 Real closest_value = get_closest_value(value, list_of_values);
454
455 // Check if relative tolerance is satisfied
456 Real rel_error = std::abs(value - closest_value) / std::abs(value);
457 if (rel_error <= tol)
458 {
459 return true;
460 }
461
462 // If relative tolerance isn't satisfied, we should still check an absolute
463 // error, since relative tolerance can be misleading if value is close to zero
464 Real abs_error = std::abs(value - closest_value);
465 return (abs_error <= tol);
466}
static Real get_closest_value(Real value, const std::vector< Real > &list_of_values)

References libMesh::RBParametrized::get_closest_value(), libMesh::Real, and value.

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

◆ late_matrix_init()

void libMesh::System::late_matrix_init ( SparseMatrix< Number > &  mat,
ParallelType  type 
)
privateinherited

Helper function to keep DofMap forward declarable in system.h.

Definition at line 1063 of file system.C.

1065{
1067 {
1068 this->get_dof_map().attach_matrix(mat);
1069 mat.init(type);
1070 }
1071}
virtual void init(const numeric_index_type m, const numeric_index_type n, const numeric_index_type m_l, const numeric_index_type n_l, const numeric_index_type nnz=30, const numeric_index_type noz=10, const numeric_index_type blocksize=1)=0
Initialize SparseMatrix with the specified sizes.

References libMesh::System::_matrices_initialized, libMesh::DofMap::attach_matrix(), libMesh::System::get_dof_map(), and libMesh::SparseMatrix< T >::init().

Referenced by libMesh::System::add_matrix(), libMesh::System::add_matrix(), and libMesh::System::add_matrix().

◆ load_basis_function()

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

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

Definition at line 1708 of file rb_construction.C.

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}

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

Referenced by main().

◆ load_rb_solution()

void TransientRBConstruction::load_rb_solution ( )
overridevirtual

Load the RB solution from the current time-level into the libMesh solution vector.

Reimplemented from libMesh::RBConstruction.

Definition at line 884 of file transient_rb_construction.C.

885{
886 LOG_SCOPE("load_rb_solution()", "TransientRBConstruction");
887
888 solution->zero();
889
890 const unsigned int time_step = get_time_step();
891
892 TransientRBEvaluation & trans_rb_eval = cast_ref<TransientRBEvaluation &>(get_rb_evaluation());
893 DenseVector<Number> RB_solution_vector_k = trans_rb_eval.RB_temporal_solution_data[time_step];
894
895 libmesh_error_msg_if(RB_solution_vector_k.size() > get_rb_evaluation().get_n_basis_functions(),
896 "ERROR: rb_eval object contains "
897 << get_rb_evaluation().get_n_basis_functions()
898 << " basis functions. RB_solution vector contains "
899 << RB_solution_vector_k.size()
900 << " entries. RB_solution in TransientRBConstruction::load_rb_solution is too long!");
901
902 for (unsigned int i=0; i<RB_solution_vector_k.size(); i++)
903 solution->add(RB_solution_vector_k(i), get_rb_evaluation().get_basis_function(i));
904
905 update();
906}

References libMesh::RBConstruction::get_rb_evaluation(), libMesh::RBTemporalDiscretization::get_time_step(), libMesh::TransientRBEvaluation::RB_temporal_solution_data, libMesh::DenseVector< T >::size(), libMesh::System::solution, and libMesh::System::update().

◆ 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 152 of file rb_construction_base.C.

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
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}

◆ 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.

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 first_dof(const processor_id_type proc) const
dof_id_type end_dof(const processor_id_type proc) const

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 SystemsTest::testBlockRestrictedVarNDofs(), and libMesh::DirectSolutionTransfer::transfer().

◆ mass_matrix_scaled_matvec()

void TransientRBConstruction::mass_matrix_scaled_matvec ( Number  scalar,
NumericVector< Number > &  dest,
NumericVector< Number > &  arg 
)

Perform a matrix-vector multiplication with the current mass matrix and store the result in dest.

Definition at line 375 of file transient_rb_construction.C.

378{
379 LOG_SCOPE("mass_matrix_scaled_matvec()", "TransientRBConstruction");
380
381 dest.zero();
382
383 const RBParameters & mu = get_parameters();
384
385 TransientRBThetaExpansion & trans_theta_expansion =
386 cast_ref<TransientRBThetaExpansion &>(get_rb_theta_expansion());
387
388 const unsigned int Q_m = trans_theta_expansion.get_n_M_terms();
389
390 std::unique_ptr<NumericVector<Number>> temp_vec = NumericVector<Number>::build(this->comm());
391 temp_vec->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
392
393 for (unsigned int q=0; q<Q_m; q++)
394 {
395 get_M_q(q)->vector_mult(*temp_vec, arg);
396 dest.add(scalar * trans_theta_expansion.eval_M_theta(q,mu), *temp_vec);
397 }
398}

References libMesh::NumericVector< T >::add(), libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), libMesh::TransientRBThetaExpansion::eval_M_theta(), get_M_q(), libMesh::TransientRBThetaExpansion::get_n_M_terms(), libMesh::RBParametrized::get_parameters(), libMesh::RBConstruction::get_rb_theta_expansion(), libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), libMesh::PARALLEL, libMesh::SparseMatrix< T >::vector_mult(), and libMesh::NumericVector< T >::zero().

Referenced by truth_assembly().

◆ matrices_begin() [1/2]

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

Beginning of matrices container.

Definition at line 2529 of file system.h.

2530{
2531 return _matrices.begin();
2532}

References libMesh::System::_matrices.

◆ 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.

2536{
2537 return _matrices.begin();
2538}

References libMesh::System::_matrices.

◆ matrices_end() [1/2]

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

End of matrices container.

Definition at line 2541 of file system.h.

2542{
2543 return _matrices.end();
2544}

References libMesh::System::_matrices.

◆ 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.

2548{
2549 return _matrices.end();
2550}

References libMesh::System::_matrices.

◆ 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.

2484{
2485 return this->n_dofs() - this->n_constrained_dofs();
2486}

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

◆ 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 2694 of file system.C.

2695{
2696 return this->get_dof_map().n_components(this->get_mesh());
2697}
unsigned int n_components(const MeshBase &mesh) const
Definition dof_map.h:2963

Referenced by ElasticityRBConstruction::init_data().

◆ 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.

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}

References libMesh::System::_dof_map.

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

◆ 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.

119{
120 return _dof_map->n_dofs();
121}

References libMesh::System::_dof_map.

Referenced by add_IC_to_RB_space(), libMesh::System::add_vector(), libMesh::RBConstruction::allocate_data_structures(), allocate_data_structures(), 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(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), enrich_RB_space(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::System::init_data(), libMesh::AdvectionSystem::init_data(), libMesh::SecondOrderUnsteadySolver::init_data(), libMesh::UnsteadySolver::init_data(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), main(), 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::RBConstruction::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(), 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(), SystemsTest::testProjectScalarCoarsening(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::RBConstruction::truth_assembly(), truth_assembly(), update_RB_initial_condition_all_N(), libMesh::RBConstruction::update_RB_system_matrices(), update_RB_system_matrices(), update_residual_terms(), and libMesh::RBConstruction::update_residual_terms().

◆ 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.

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

References libMesh::LinearImplicitSystem::_n_linear_iterations.

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

◆ 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.

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}

References libMesh::System::_dof_map.

◆ 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.

156{
157 return _dof_map->n_local_dofs();
158}

References libMesh::System::_dof_map.

Referenced by add_IC_to_RB_space(), libMesh::System::add_vector(), libMesh::RBConstruction::allocate_data_structures(), allocate_data_structures(), assemble_affine_expansion(), libMesh::AdvectionSystem::assemble_claw_rhs(), libMesh::PetscDMWrapper::build_section(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), enrich_RB_space(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::System::init_data(), libMesh::AdvectionSystem::init_data(), libMesh::SecondOrderUnsteadySolver::init_data(), libMesh::UnsteadySolver::init_data(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), main(), mass_matrix_scaled_matvec(), libMesh::RBEvaluation::read_in_vectors_from_multiple_files(), libMesh::RBConstruction::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(), 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(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::RBConstruction::truth_assembly(), truth_assembly(), update_RB_initial_condition_all_N(), libMesh::RBConstruction::update_RB_system_matrices(), update_RB_system_matrices(), update_residual_terms(), and libMesh::RBConstruction::update_residual_terms().

◆ 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.

2639{
2640 return cast_int<unsigned int>(_matrices.size());
2641}

References libMesh::System::_matrices.

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

◆ 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.

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

References libMesh::ReferenceCounter::_n_objects.

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

◆ 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.

86 { return _n_objects; }

References libMesh::ReferenceCounter::_n_objects.

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

◆ 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.

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 }
uint8_t processor_id_type
Definition id_types.h:104

References libMesh::ParallelObject::_communicator, libMesh::libmesh_assert(), and libMesh::Parallel::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::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::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::UnstructuredMesh::create_pid_mesh(), libMesh::MeshTools::create_processor_bounding_box(), 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::ExodusII_IO_Helper::initialize(), libMesh::Nemesis_IO_Helper::initialize(), libMesh::DistributedMesh::insert_elem(), libMesh::NumericVector< T >::is_effectively_ghosted(), libMesh::NumericVector< T >::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::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::MeshBase::partition(), libMesh::Partitioner::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::NameBasedIO::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::DistributedMesh::update_parallel_id_counts(), libMesh::GMVIO::write_binary(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::VTKIO::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().

◆ 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.

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}

References libMesh::System::_qoi.

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::FEMSystem::assemble_qoi(), libMesh::ExplicitSystem::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::TimeSolver::init_adjoints(), libMesh::UnsteadySolver::init_adjoints(), libMesh::Euler2Solver::integrate_adjoint_refinement_error_estimate(), libMesh::EulerSolver::integrate_adjoint_refinement_error_estimate(), libMesh::SteadySolver::integrate_adjoint_refinement_error_estimate(), libMesh::TwostepTimeSolver::integrate_adjoint_refinement_error_estimate(), libMesh::Euler2Solver::integrate_qoi_timestep(), libMesh::EulerSolver::integrate_qoi_timestep(), libMesh::TwostepTimeSolver::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().

◆ 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 2699 of file system.C.

2700{
2701 return this->get_dof_map().n_variable_groups();
2702}
unsigned int n_variable_groups() const
Definition dof_map.h:733

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

◆ n_vars()

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

Definition at line 2674 of file system.C.

2675{
2676 return this->get_dof_map().n_vars();
2677}
unsigned int n_vars() const
Definition dof_map.h:2937

Referenced by libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::PetscDMWrapper::add_dofs_helper(), libMesh::DiffContext::add_localized_vector(), libMesh::TwostepTimeSolver::adjoint_solve(), libMesh::FEMContext::attach_quadrature_rules(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::PetscDMWrapper::build_section(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), LinearElasticityWithContact::compute_stresses(), compute_stresses(), libMesh::DGFEMContext::DGFEMContext(), libMesh::DiffContext::DiffContext(), libMesh::AdjointResidualErrorEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::ErrorEstimator::estimate_errors(), libMesh::ExactSolution::ExactSolution(), libMesh::FEMContext::find_hardest_fe_type(), libMesh::EquationSystems::find_variable_numbers_by_predicate(), 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::PatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::SmoothnessEstimator::EstimateSmoothness::operator()(), libMesh::WeightedPatchRecoveryErrorEstimator::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_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().

◆ 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.

2500{
2501 return cast_int<unsigned int>(_vectors.size());
2502}

References libMesh::System::_vectors.

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

◆ 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.

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

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::ExodusII_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::find_squared_element_error(), libMesh::EquationSystems::find_variable_numbers_by_predicate(), libMesh::VariationalSmootherConstraint::fix_node(), AssemblyPointLoadX::get_nodal_rhs_values(), AssemblyPointLoadY::get_nodal_rhs_values(), AssemblyPointLoadZ::get_nodal_rhs_values(), libMesh::VariationalSmootherSystem::init_data(), main(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SortAndCopy::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectInteriors::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::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(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::MeshFunctionSolutionTransfer::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().

◆ old_solution()

Number libMesh::TransientSystem< RBConstruction >::old_solution ( const dof_id_type  global_dof_number) const
inherited
Returns
The old solution (at the previous timestep) for the specified global DOF.

Definition at line 112 of file transient_system.C.

112{
113 // Check the sizes
114 libmesh_assert_less (global_dof_number, this->get_dof_map().n_dofs());
115 libmesh_assert_less (global_dof_number, old_local_solution->size());
116
117 return (*old_local_solution)(global_dof_number);
118}

◆ older_solution()

Number libMesh::TransientSystem< RBConstruction >::older_solution ( const dof_id_type  global_dof_number) const
inherited
Returns
The older solution (two timesteps ago) for the specified global DOF.

Definition at line 118 of file transient_system.C.

124{
125 // Check the sizes
126 libmesh_assert_less (global_dof_number, this->get_dof_map().n_dofs());
127 libmesh_assert_less (global_dof_number, older_local_solution->size());
128
129 return (*older_local_solution)(global_dof_number);
130}

◆ operator=() [1/2]

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

◆ operator=() [2/2]

TransientRBConstruction & libMesh::TransientRBConstruction::operator= ( TransientRBConstruction &&  )
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 2348 of file system.C.

2352{
2353 // This function must be called on every processor; there's no
2354 // telling where in the partition p falls.
2355 parallel_object_only();
2356
2357 // And every processor had better agree about which point we're
2358 // looking for
2359#ifndef NDEBUG
2360 libmesh_assert(this->comm().verify(p(0)));
2361#if LIBMESH_DIM > 1
2362 libmesh_assert(this->comm().verify(p(1)));
2363#endif
2364#if LIBMESH_DIM > 2
2365 libmesh_assert(this->comm().verify(p(2)));
2366#endif
2367#endif // NDEBUG
2368
2369 // Get a reference to the mesh object associated with the system object that calls this function
2370 const MeshBase & mesh = this->get_mesh();
2371
2372 // Use an existing PointLocator or create a new one
2373 std::unique_ptr<PointLocatorBase> locator_ptr = mesh.sub_point_locator();
2374 PointLocatorBase & locator = *locator_ptr;
2375
2376 if (!insist_on_success || !mesh.is_serial())
2377 locator.enable_out_of_mesh_mode();
2378
2379 // Get a pointer to an element that contains p and allows us to
2380 // evaluate var
2381 const std::set<subdomain_id_type> & raw_subdomains =
2382 this->variable(var).active_subdomains();
2383 const std::set<subdomain_id_type> * implicit_subdomains =
2384 raw_subdomains.empty() ? nullptr : &raw_subdomains;
2385 const Elem * e = locator(p, implicit_subdomains);
2386
2387 Gradient grad_u;
2388
2389 if (e && this->get_dof_map().is_evaluable(*e, var))
2390 grad_u = point_gradient(var, p, *e, sol);
2391
2392 // If I have an element containing p, then let's let everyone know
2393 processor_id_type lowest_owner =
2394 (e && (e->processor_id() == this->processor_id())) ?
2395 this->processor_id() : this->n_processors();
2396 this->comm().min(lowest_owner);
2397
2398 // Everybody should get their value from a processor that was able
2399 // to compute it.
2400 // If nobody admits owning the point, we may have a problem.
2401 if (lowest_owner != this->n_processors())
2402 this->comm().broadcast(grad_u, lowest_owner);
2403 else
2404 libmesh_assert(!insist_on_success);
2405
2406 return grad_u;
2407}
void min(const T &r, T &o, Request &req) const
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition system.C:2704
Gradient point_gradient(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition system.C:2348
const std::set< subdomain_id_type > & active_subdomains() const
Definition variable.h:181
NumberVectorValue Gradient

References libMesh::PointLocatorBase::enable_out_of_mesh_mode(), libMesh::libmesh_assert(), mesh, and libMesh::DofObject::processor_id().

Referenced by line_print().

◆ 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 2410 of file system.C.

2414{
2415 // Ensuring that the given point is really in the element is an
2416 // expensive assert, but as long as debugging is turned on we might
2417 // as well try to catch a particularly nasty potential error
2418 libmesh_assert (e.contains_point(p));
2419
2420 if (!sol)
2421 sol = this->current_local_solution.get();
2422
2423 // Get the dof map to get the proper indices for our computation
2424 const DofMap & dof_map = this->get_dof_map();
2425
2426 // write the element dimension into a separate variable.
2427 const unsigned int dim = e.dim();
2428
2429 // Make sure we can evaluate on this element.
2430 libmesh_assert (dof_map.is_evaluable(e, var));
2431
2432 // Need dof_indices for phi[i][j]
2433 std::vector<dof_id_type> dof_indices;
2434
2435 // Fill in the dof_indices for our element
2436 dof_map.dof_indices (&e, dof_indices, var);
2437
2438 // Get the no of dofs associated with this point
2439 const unsigned int num_dofs = cast_int<unsigned int>
2440 (dof_indices.size());
2441
2442 FEType fe_type = dof_map.variable_type(var);
2443
2444 // Map the physical co-ordinates to the master co-ordinates
2445 Point coor = FEMap::inverse_map(dim, &e, p);
2446
2447 // get the shape function value via the FEInterface to also handle the case
2448 // of infinite elements correctly, the shape function is not fe->phi().
2449 FEComputeData fe_data(this->get_equation_systems(), coor);
2450 fe_data.enable_derivative();
2451 FEInterface::compute_data(dim, fe_type, &e, fe_data);
2452
2453 // Get ready to accumulate a gradient
2454 Gradient grad_u;
2455
2456 for (unsigned int l=0; l<num_dofs; l++)
2457 {
2458 // Chartesian coordinates have always LIBMESH_DIM entries,
2459 // local coordinates have as many coordinates as the element has.
2460 for (std::size_t v=0; v<dim; v++)
2461 for (std::size_t xyz=0; xyz<LIBMESH_DIM; xyz++)
2462 {
2463 // FIXME: this needs better syntax: It is matrix-vector multiplication.
2464 grad_u(xyz) += fe_data.local_transform[v][xyz]
2465 * fe_data.dshape[l](v)
2466 * (*sol)(dof_indices[l]);
2467 }
2468 }
2469
2470 return grad_u;
2471}
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,...
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
virtual void get(const std::vector< numeric_index_type > &index, T *values) const
Access multiple components at once.

References libMesh::Elem::contains_point(), dim, libMesh::Elem::dim(), libMesh::DofMap::dof_indices(), libMesh::FEComputeData::dshape, libMesh::FEComputeData::enable_derivative(), libMesh::NumericVector< T >::get(), libMesh::DofMap::is_evaluable(), libMesh::libmesh_assert(), libMesh::FEComputeData::local_transform, and libMesh::DofMap::variable_type().

◆ 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 2475 of file system.C.

2476{
2477 libmesh_assert(e);
2478 return this->point_gradient(var, p, *e);
2479}

References libMesh::libmesh_assert().

◆ 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 2483 of file system.C.

2484{
2485 return this->point_gradient(var, p, true, sol);
2486}

◆ 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 2492 of file system.C.

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

References libMesh::PointLocatorBase::enable_out_of_mesh_mode(), libMesh::libmesh_assert(), mesh, and libMesh::DofObject::processor_id().

◆ 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 2553 of file system.C.

2557{
2558 // Ensuring that the given point is really in the element is an
2559 // expensive assert, but as long as debugging is turned on we might
2560 // as well try to catch a particularly nasty potential error
2561 libmesh_assert (e.contains_point(p));
2562
2563 if (!sol)
2564 sol = this->current_local_solution.get();
2565
2566 if (e.infinite())
2567 libmesh_not_implemented();
2568
2569 // Get the dof map to get the proper indices for our computation
2570 const DofMap & dof_map = this->get_dof_map();
2571
2572 // Make sure we can evaluate on this element.
2573 libmesh_assert (dof_map.is_evaluable(e, var));
2574
2575 // Need dof_indices for phi[i][j]
2576 std::vector<dof_id_type> dof_indices;
2577
2578 // Fill in the dof_indices for our element
2579 dof_map.dof_indices (&e, dof_indices, var);
2580
2581 // Get the no of dofs associated with this point
2582 const unsigned int num_dofs = cast_int<unsigned int>
2583 (dof_indices.size());
2584
2585 FEType fe_type = dof_map.variable_type(var);
2586
2587 // Build a FE again so we can calculate u(p)
2588 std::unique_ptr<FEBase> fe (FEBase::build(e.dim(), fe_type));
2589
2590 // Map the physical co-ordinates to the master co-ordinates
2591 // Build a vector of point co-ordinates to send to reinit
2592 std::vector<Point> coor(1, FEMap::inverse_map(e.dim(), &e, p));
2593
2594 // Get the values of the shape function derivatives
2595 const std::vector<std::vector<RealTensor>> & d2phi = fe->get_d2phi();
2596
2597 // Reinitialize the element and compute the shape function values at coor
2598 fe->reinit (&e, &coor);
2599
2600 // Get ready to accumulate a hessian
2601 Tensor hess_u;
2602
2603 for (unsigned int l=0; l<num_dofs; l++)
2604 {
2605 hess_u.add_scaled (d2phi[l][0], (*sol)(dof_indices[l]));
2606 }
2607
2608 return hess_u;
2609}
void add_scaled(const TypeTensor< T2 > &, const T &)
Add a scaled tensor to this tensor without creating a temporary.

References libMesh::TypeTensor< T >::add_scaled(), libMesh::Elem::contains_point(), libMesh::Elem::dim(), libMesh::DofMap::dof_indices(), libMesh::NumericVector< T >::get(), libMesh::Elem::infinite(), libMesh::DofMap::is_evaluable(), libMesh::libmesh_assert(), and libMesh::DofMap::variable_type().

◆ 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 2613 of file system.C.

2614{
2615 libmesh_assert(e);
2616 return this->point_hessian(var, p, *e);
2617}

References libMesh::libmesh_assert().

◆ 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 2621 of file system.C.

2622{
2623 return this->point_hessian(var, p, true, sol);
2624}

◆ 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 2219 of file system.C.

2223{
2224 // This function must be called on every processor; there's no
2225 // telling where in the partition p falls.
2226 parallel_object_only();
2227
2228 // And every processor had better agree about which point we're
2229 // looking for
2230#ifndef NDEBUG
2231 libmesh_assert(this->comm().verify(p(0)));
2232#if LIBMESH_DIM > 1
2233 libmesh_assert(this->comm().verify(p(1)));
2234#endif
2235#if LIBMESH_DIM > 2
2236 libmesh_assert(this->comm().verify(p(2)));
2237#endif
2238#endif // NDEBUG
2239
2240 // Get a reference to the mesh object associated with the system object that calls this function
2241 const MeshBase & mesh = this->get_mesh();
2242
2243 // Use an existing PointLocator or create a new one
2244 std::unique_ptr<PointLocatorBase> locator_ptr = mesh.sub_point_locator();
2245 PointLocatorBase & locator = *locator_ptr;
2246
2247 if (!insist_on_success || !mesh.is_serial())
2248 locator.enable_out_of_mesh_mode();
2249
2250 // Get a pointer to an element that contains p and allows us to
2251 // evaluate var
2252 const std::set<subdomain_id_type> & raw_subdomains =
2253 this->variable(var).active_subdomains();
2254 const std::set<subdomain_id_type> * implicit_subdomains =
2255 raw_subdomains.empty() ? nullptr : &raw_subdomains;
2256 const Elem * e = locator(p, implicit_subdomains);
2257
2258 Number u = 0;
2259
2260 if (e && this->get_dof_map().is_evaluable(*e, var))
2261 u = point_value(var, p, *e, sol);
2262
2263 // If I have an element containing p, then let's let everyone know
2264 processor_id_type lowest_owner =
2265 (e && (e->processor_id() == this->processor_id())) ?
2266 this->processor_id() : this->n_processors();
2267 this->comm().min(lowest_owner);
2268
2269 // Everybody should get their value from a processor that was able
2270 // to compute it.
2271 // If nobody admits owning the point, we have a problem.
2272 if (lowest_owner != this->n_processors())
2273 this->comm().broadcast(u, lowest_owner);
2274 else
2275 libmesh_assert(!insist_on_success);
2276
2277 return u;
2278}
Number point_value(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition system.C:2219

References libMesh::PointLocatorBase::enable_out_of_mesh_mode(), libMesh::libmesh_assert(), mesh, and libMesh::DofObject::processor_id().

Referenced by line_print(), main(), NavierSystem::postprocess(), MeshInputTest::testCopyElementSolutionImpl(), MeshInputTest::testCopyElementVectorImpl(), MeshInputTest::testCopyNodalSolutionImpl(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), PeriodicBCTest::testPeriodicBC(), SystemsTest::testProjectCubeWithMeshFunction(), EquationSystemsTest::testRepartitionThenReinit(), DisjointNeighborTest::testTempJump(), and DisjointNeighborTest::testTempJumpRefine().

◆ 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 2280 of file system.C.

2284{
2285 // Ensuring that the given point is really in the element is an
2286 // expensive assert, but as long as debugging is turned on we might
2287 // as well try to catch a particularly nasty potential error
2288 libmesh_assert (e.contains_point(p));
2289
2290 if (!sol)
2291 sol = this->current_local_solution.get();
2292
2293 // Get the dof map to get the proper indices for our computation
2294 const DofMap & dof_map = this->get_dof_map();
2295
2296 // Make sure we can evaluate on this element.
2297 libmesh_assert (dof_map.is_evaluable(e, var));
2298
2299 // Need dof_indices for phi[i][j]
2300 std::vector<dof_id_type> dof_indices;
2301
2302 // Fill in the dof_indices for our element
2303 dof_map.dof_indices (&e, dof_indices, var);
2304
2305 // Get the no of dofs associated with this point
2306 const unsigned int num_dofs = cast_int<unsigned int>
2307 (dof_indices.size());
2308
2309 FEType fe_type = dof_map.variable_type(var);
2310
2311 // Map the physical co-ordinates to the master co-ordinates
2312 Point coor = FEMap::inverse_map(e.dim(), &e, p);
2313
2314 // get the shape function value via the FEInterface to also handle the case
2315 // of infinite elements correctly, the shape function is not fe->phi().
2316 FEComputeData fe_data(this->get_equation_systems(), coor);
2317 FEInterface::compute_data(e.dim(), fe_type, &e, fe_data);
2318
2319 // Get ready to accumulate a value
2320 Number u = 0;
2321
2322 for (unsigned int l=0; l<num_dofs; l++)
2323 {
2324 u += fe_data.shape[l] * (*sol)(dof_indices[l]);
2325 }
2326
2327 return u;
2328}

References libMesh::Elem::contains_point(), libMesh::Elem::dim(), libMesh::DofMap::dof_indices(), libMesh::NumericVector< T >::get(), libMesh::DofMap::is_evaluable(), libMesh::libmesh_assert(), libMesh::FEComputeData::shape, and libMesh::DofMap::variable_type().

◆ 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 2332 of file system.C.

2333{
2334 libmesh_assert(e);
2335 return this->point_value(var, p, *e);
2336}

References libMesh::libmesh_assert().

◆ 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 2340 of file system.C.

2341{
2342 return this->point_value(var, p, true, sol);
2343}

◆ post_process_elem_matrix_and_vector()

virtual void libMesh::RBConstruction::post_process_elem_matrix_and_vector ( DGFEMContext )
inlineprotectedvirtualinherited

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 723 of file rb_construction.h.

724{}

Referenced by libMesh::RBConstruction::add_scaled_matrix_and_vector().

◆ post_process_truth_solution()

virtual void libMesh::RBConstruction::post_process_truth_solution ( )
inlineprotectedvirtualinherited

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.

734{}

Referenced by libMesh::RBConstruction::enrich_basis_from_rhs_terms(), and libMesh::RBConstruction::truth_solve().

◆ preevaluate_thetas()

void libMesh::RBConstruction::preevaluate_thetas ( )
protectedvirtualinherited

Definition at line 2787 of file rb_construction.C.

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());
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);
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);
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}
bool _preevaluate_thetas_completed
Flag to indicate if the preevaluate_thetas function has been called, since this allows us to avoid ca...

References libMesh::RBConstruction::_evaluated_thetas, libMesh::RBConstruction::_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(), libMesh::RBConstruction::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 libMesh::RBConstruction::train_reduced_basis_with_greedy().

◆ 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.

2668{
2669 libmesh_error_msg_if(
2671 "System::prefer_hash_table_matrix_assembly() should be called before matrices are initialized");
2673}

References libMesh::System::_matrices_initialized, and libMesh::System::_prefer_hash_table_matrix_assembly.

Referenced by main().

◆ 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.

1980{ return this->name() + "_"; }

References libMesh::System::name().

Referenced by libMesh::ContinuationSystem::ContinuationSystem(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::LinearImplicitSystem::solve(), and libMesh::NonlinearImplicitSystem::solve().

◆ prefix_with_name() [1/2]

bool libMesh::System::prefix_with_name ( ) const
inlineinherited
Returns
Whether we are name prefixing

Definition at line 1974 of file system.h.

1974{ return _prefix_with_name; }
bool _prefix_with_name
Whether we are name prefixing solver options.
Definition system.h:2358

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

◆ prefix_with_name() [2/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.

◆ print_basis_function_orthogonality()

void libMesh::RBConstruction::print_basis_function_orthogonality ( ) const
inherited

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.

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}

References libMesh::RBEvaluation::get_n_basis_functions(), libMesh::RBConstruction::get_non_dirichlet_inner_product_matrix_if_avail(), libMesh::RBConstruction::get_rb_evaluation(), libMesh::out, libMesh::System::solution, value, and libMesh::SparseMatrix< T >::vector_mult().

Referenced by main().

◆ 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.

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}

References libMesh::RBParametrized::get_discrete_parameter_values(), libMesh::out, and value.

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

◆ print_info() [1/3]

void TransientRBConstruction::print_info ( ) const
overridevirtual

Print out info that describes the current setup of this RBConstruction.

Reimplemented from libMesh::RBConstruction.

Definition at line 143 of file transient_rb_construction.C.

144{
146
147 libMesh::out << std::endl << "TransientRBConstruction parameters:" << std::endl;
148
150 {
151 // Print out info that describes the current setup
152 auto & trans_theta_expansion =
153 cast_ref<const TransientRBThetaExpansion &>(get_rb_theta_expansion());
154 libMesh::out << "Q_m: " << trans_theta_expansion.get_n_M_terms() << std::endl;
155 }
156 else
157 {
158 libMesh::out << "RBThetaExpansion member is not set yet" << std::endl;
159 }
160 libMesh::out << "Number of time-steps: " << get_n_time_steps() << std::endl;
161 libMesh::out << "dt: " << get_delta_t() << std::endl;
162 libMesh::out << "euler_theta (time discretization parameter): " << get_euler_theta() << std::endl;
163 if (get_POD_tol() > 0.)
164 libMesh::out << "POD_tol: " << get_POD_tol() << std::endl;
165 if (max_truth_solves > 0)
166 libMesh::out << "Maximum number of truth solves: " << max_truth_solves << std::endl;
167 libMesh::out << "delta_N (number of basis functions to add each POD-Greedy step): " << get_delta_N() << std::endl;
169 {
170 libMesh::out << "Reading initial condition from " << init_filename << std::endl;
171 }
172 else
173 {
174 libMesh::out << "Using zero initial condition" << std::endl;
175 }
176 libMesh::out << std::endl;
177}
virtual void print_info() const
Print out info that describes the current setup of this RBConstruction.
bool is_rb_eval_initialized() const
Real get_delta_t() const
Get/set delta_t, the time-step size.
Real get_euler_theta() const
Get/set euler_theta, parameter that determines the temporal discretization.
Real get_POD_tol() const
Get/set POD_tol.

References libMesh::RBConstruction::get_delta_N(), libMesh::RBTemporalDiscretization::get_delta_t(), libMesh::RBTemporalDiscretization::get_euler_theta(), libMesh::RBTemporalDiscretization::get_n_time_steps(), get_POD_tol(), libMesh::RBConstruction::get_rb_theta_expansion(), init_filename, libMesh::RBConstruction::is_rb_eval_initialized(), max_truth_solves, nonzero_initialization, libMesh::out, and libMesh::RBConstruction::print_info().

◆ 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.

82{
84 out_stream << ReferenceCounter::get_info();
85}
static std::string get_info()
Gets a string containing the reference information.

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

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

◆ print_info() [3/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.

82{
84 out_stream << ReferenceCounter::get_info();
85}

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

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

◆ print_parameters()

void libMesh::RBParametrized::print_parameters ( ) const
inherited

Print the current parameters.

Definition at line 178 of file rb_parametrized.C.

179{
180 libmesh_error_msg_if(!parameters_initialized, "Error: parameters not initialized in RBParametrized::print_current_parameters");
181
183}
void print(unsigned precision=6, int max_values=5) const
Print the parameters.

References libMesh::RBParametrized::get_parameters(), libMesh::RBParametrized::parameters_initialized, and libMesh::RBParameters::print().

Referenced by main(), libMesh::RBEIMConstruction::train_eim_approximation_with_greedy(), and libMesh::RBConstruction::train_reduced_basis_with_greedy().

◆ process_parameters_file()

void TransientRBConstruction::process_parameters_file ( const std::string &  parameters_filename)
overridevirtual

Read in the parameters from file and set up the system accordingly.

Reimplemented from libMesh::RBConstruction.

Definition at line 116 of file transient_rb_construction.C.

117{
118 Parent::process_parameters_file(parameters_filename);
119
120 // Read in data from parameters_filename
121 GetPot infile(parameters_filename);
122
123 // Read in the generic temporal discretization data
124 process_temporal_parameters_file(parameters_filename);
125
126 // Read in the data specific to Construction
127 nonzero_initialization = infile("nonzero_initialization",nonzero_initialization);
128 init_filename = infile("init_filename",init_filename);
129
130 const Real POD_tol_in = infile("POD_tol", POD_tol);
131 const int max_truth_solves_in = infile("max_truth_solves", max_truth_solves);
132 const unsigned int delta_N_in = infile("delta_N", delta_N);
133
134 set_POD_tol(POD_tol_in);
135 set_max_truth_solves(max_truth_solves_in);
136 set_delta_N(delta_N_in);
137
138 // Pass the temporal discretization data to the RBEvaluation
139 TransientRBEvaluation & trans_rb_eval = cast_ref<TransientRBEvaluation &>(get_rb_evaluation());
140 trans_rb_eval.pull_temporal_discretization_data( *this );
141}
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 acc...
void process_temporal_parameters_file(const std::string &parameters_filename)
Read in and initialize parameters from parameters_filename.
void set_max_truth_solves(int max_truth_solves_in)

References libMesh::RBConstruction::delta_N, libMesh::RBConstruction::get_rb_evaluation(), init_filename, max_truth_solves, nonzero_initialization, POD_tol, libMesh::RBConstruction::process_parameters_file(), libMesh::RBTemporalDiscretization::process_temporal_parameters_file(), libMesh::RBTemporalDiscretization::pull_temporal_discretization_data(), libMesh::Real, set_delta_N(), set_max_truth_solves(), and set_POD_tol().

◆ process_temporal_parameters_file()

void libMesh::RBTemporalDiscretization::process_temporal_parameters_file ( const std::string &  parameters_filename)
inherited

Read in and initialize parameters from parameters_filename.

Definition at line 93 of file rb_temporal_discretization.C.

94{
95 // Read in data from parameters_filename
96 GetPot infile(parameters_filename);
97
98 // Read in parameters related to temporal discretization
99 unsigned int n_time_steps_in = infile("n_time_steps", get_n_time_steps());
100 const Real delta_t_in = infile("delta_t", get_delta_t());
101 const Real euler_theta_in = infile("euler_theta", get_euler_theta());
102
103 // and set the relevant member variables
104 set_n_time_steps(n_time_steps_in);
105 set_delta_t(delta_t_in);
106 set_euler_theta(euler_theta_in);
107 set_time_step(0);
108}
void set_euler_theta(const Real euler_theta_in)

References libMesh::RBTemporalDiscretization::get_delta_t(), libMesh::RBTemporalDiscretization::get_euler_theta(), libMesh::RBTemporalDiscretization::get_n_time_steps(), libMesh::Real, libMesh::RBTemporalDiscretization::set_delta_t(), libMesh::RBTemporalDiscretization::set_euler_theta(), libMesh::RBTemporalDiscretization::set_n_time_steps(), and libMesh::RBTemporalDiscretization::set_time_step().

Referenced by process_parameters_file().

◆ 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.

115 { return cast_int<processor_id_type>(_communicator.rank()); }

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

Referenced by libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::BoundaryInfo::add_elements(), libMesh::DistributedMesh::add_node(), libMesh::MeshTools::Modification::all_tri(), 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(), libMesh::RBConstruction::compute_max_error_bound(), libMesh::Nemesis_IO_Helper::compute_node_communication_maps(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::Nemesis_IO_Helper::construct_nemesis_filename(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::ExodusII_IO_Helper::create(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::DistributedMesh::DistributedMesh(), 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::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::MeshTools::Modification::interpolate_surface(), libMesh::SparsityPattern::Build::join(), libMesh::RBEvaluation::legacy_write_offline_data_to_files(), libMesh::RBSCMEvaluation::legacy_write_offline_data_to_files(), libMesh::TransientRBEvaluation::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(), main(), 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::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::XdrIO::read(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::NameBasedIO::read(), libMesh::EquationSystems::read(), libMesh::EquationSystems::read(), libMesh::ExodusII_IO_Helper::read_elem_num_map(), libMesh::ExodusII_IO_Helper::read_global_values(), libMesh::CheckpointIO::read_header(), libMesh::ExodusII_IO::read_header(), libMesh::System::read_header(), libMesh::XdrIO::read_header(), libMesh::DynaIO::read_mesh(), libMesh::ExodusII_IO_Helper::read_node_num_map(), libMesh::System::read_parallel_data(), libMesh::RBConstruction::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::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(), ExodusC0PolyhedronTest::test_write_and_read_hexagonal_prism(), ExodusC0PolygonTest::test_write_and_read_pentagon(), 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(), BoundaryMeshSubdomainTest::testPerBoundarySubdomain(), SystemsTest::testProjectMatrix3D(), BoundaryInfoTest::testShellFaceConstraints(), MeshInputTest::testSingleElementImpl(), BoundaryMeshSubdomainTest::testSingleSubdomain(), WriteVecAndScalar::testSolution(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::NetGenMeshInterface::triangulate(), libMesh::Parallel::Packing< Elem * >::unpack(), libMesh::Parallel::Packing< Node * >::unpack(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::DTKAdapter::update_variable_values(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::XdrIO::write(), libMesh::NameBasedIO::write(), libMesh::CheckpointIO::write(), libMesh::EquationSystems::write(), libMesh::EquationSystems::write(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO::write_element_data(), libMesh::ExodusII_IO::write_element_data_from_discontinuous_nodal_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::ExodusII_IO::write_nodal_data(), libMesh::VTKIO::write_nodal_data(), libMesh::UCDIO::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::ExodusII_IO_Helper::write_nodesets(), libMesh::Nemesis_IO_Helper::write_nodesets(), libMesh::RBEIMEvaluation::write_out_interior_basis_functions(), libMesh::RBEIMEvaluation::write_out_node_basis_functions(), libMesh::RBEIMEvaluation::write_out_side_basis_functions(), write_output_solvedata(), libMesh::System::write_parallel_data(), libMesh::RBConstruction::write_riesz_representors_to_files(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bc_names(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::System::write_serialized_data(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::XdrIO::write_serialized_subdomain_names(), libMesh::System::write_serialized_vector(), libMesh::System::write_serialized_vectors(), libMesh::ExodusII_IO_Helper::write_sideset_data(), libMesh::ExodusII_IO_Helper::write_sidesets(), libMesh::Nemesis_IO_Helper::write_sidesets(), libMesh::ExodusII_IO::write_timestep(), libMesh::ExodusII_IO_Helper::write_timestep(), and libMesh::ExodusII_IO::write_timestep_discontinuous().

◆ project_solution() [1/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 1080 of file system_projection.C.

1084{
1085 this->project_vector(*solution, f, g, /*is_adjoint=*/-1, active_local_range, variable_numbers);
1086
1087 solution->localize(*current_local_solution, _dof_map->get_send_list());
1088}
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 ( 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 1065 of file system_projection.C.

1069{
1070 this->project_vector(*solution, f, g, /*is_adjoint=*/-1, active_local_range, variable_numbers);
1071
1072 solution->localize(*current_local_solution, _dof_map->get_send_list());
1073}

Referenced by init_sys(), initialize(), main(), set_initial_condition(), FETestBase< order, family, elem_type, build_nx, CaseName >::setUp(), SlitMeshRefinedSystemTest::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().

◆ 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 1049 of file system_projection.C.

1054{
1055 WrappedFunction<Number> f(*this, fptr, &function_parameters);
1056 WrappedFunction<Gradient> g(*this, gptr, &function_parameters);
1057 this->project_solution(&f, &g, active_local_range, variable_numbers);
1058}
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.

References fptr(), and gptr().

◆ 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.

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

References libMesh::System::_solution_projection.

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

◆ project_vector() [1/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.

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, scalar_vars;
389 for (auto var : vars)
390 {
391 if (this->variable(var).type().family == SCALAR)
392 scalar_vars.push_back(var);
393 else if (FEInterface::field_type(this->variable_type(var)) == TYPE_SCALAR)
394 regular_vars.push_back(var);
395 else
396 vector_vars.push_back(var);
397 }
398
399 VectorSetAction<Number> setter(new_vector);
400
401 if (!regular_vars.empty())
402 {
403 // Use a typedef to make the calling sequence for parallel_for() a bit more readable
404 typedef
405 GenericProjector<OldSolutionValue<Number, &FEMContext::point_value>,
406 OldSolutionValue<Gradient, &FEMContext::point_gradient>,
407 Number, VectorSetAction<Number>> FEMProjector;
408
409 OldSolutionValue<Number, &FEMContext::point_value>
410 f(*this, old_vector, &regular_vars);
411 OldSolutionValue<Gradient, &FEMContext::point_gradient>
412 g(*this, old_vector, &regular_vars);
413
414 FEMProjector projector(*this, f, &g, setter, regular_vars);
415 projector.project(active_local_range.value());
416 }
417
418 if (!vector_vars.empty())
419 {
420 typedef
421 GenericProjector<OldSolutionValue<Gradient, &FEMContext::point_value>,
422 OldSolutionValue<Tensor, &FEMContext::point_gradient>,
423 Gradient, VectorSetAction<Number>> FEMVectorProjector;
424
425 OldSolutionValue<Gradient, &FEMContext::point_value> f_vector(*this, old_vector, &vector_vars);
426 OldSolutionValue<Tensor, &FEMContext::point_gradient> g_vector(*this, old_vector, &vector_vars);
427
428 FEMVectorProjector vector_projector(*this, f_vector, &g_vector, setter, vector_vars);
429 vector_projector.project(active_local_range.value());
430 }
431
432 // Copy the SCALAR dofs from old_vector to new_vector
433 // Note: We assume that all SCALAR dofs are on the
434 // processor with highest ID
435 if (this->processor_id() == (this->n_processors()-1))
436 {
437 const DofMap & dof_map = this->get_dof_map();
438 for (auto var : scalar_vars)
439 {
440 // We can just map SCALAR dofs directly across
441 std::vector<dof_id_type> new_SCALAR_indices, old_SCALAR_indices;
442 dof_map.SCALAR_dof_indices (new_SCALAR_indices, var, false);
443 dof_map.SCALAR_dof_indices (old_SCALAR_indices, var, true);
444 for (auto i : index_range(new_SCALAR_indices))
445 new_vector.set(new_SCALAR_indices[i], old_vector(old_SCALAR_indices[i]));
446 }
447 }
448 }
449
450 new_vector.close();
451
452 // If the old vector was serial, we probably need to send our values
453 // to other processors
454 //
455 // FIXME: I'm not sure how to make a NumericVector do that without
456 // creating a temporary parallel vector to use localize! - RHS
457 if (old_v.type() == SERIAL)
458 {
459 std::unique_ptr<NumericVector<Number>> dist_v = NumericVector<Number>::build(this->comm());
460 dist_v->init(this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
461 dist_v->close();
462
463 for (auto i : make_range(dist_v->size()))
464 if (new_vector(i) != 0.0)
465 dist_v->set(i, new_vector(i));
466
467 dist_v->close();
468
469 dist_v->localize (new_v, this->get_dof_map().get_send_list());
470 new_v.close();
471 }
472 // If the old vector was parallel, we need to update it
473 // and free the localized copies
474 else if (old_v.type() == PARALLEL)
475 {
476 // We may have to set dof values that this processor doesn't
477 // own in certain special cases, like LAGRANGE FIRST or
478 // HERMITE THIRD elements on second-order meshes?
479 new_v = new_vector;
480 new_v.close();
481 }
482
483
484 // Apply constraints only if we we are asked to
486 {
487 if (is_adjoint == -1)
488 {
489 this->get_dof_map().enforce_constraints_exactly(*this, &new_v);
490 }
491 else if (is_adjoint >= 0)
492 {
494 is_adjoint);
495 }
496 }
497#else
498
499 // AMR is disabled: simply copy the vector
500 new_v = old_v;
501
502 libmesh_ignore(is_adjoint, active_local_range, variable_numbers);
503
504#endif // #ifdef LIBMESH_ENABLE_AMR
505}
virtual void clear()
Restores the NumericVector<T> to a pristine state.
ParallelType type() const
const FEType & variable_type(const unsigned int i) const
Definition system.C:2721
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.

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

◆ project_vector() [2/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.

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

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

◆ project_vector() [3/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 1140 of file system_projection.C.

1146{
1147 LOG_SCOPE ("project_fem_vector()", "System");
1148
1149 libmesh_assert (f);
1150
1151 if (!active_local_range)
1152 {
1153 active_local_range.emplace
1154 (this->get_mesh().active_local_elements_begin(),
1155 this->get_mesh().active_local_elements_end());
1156 }
1157
1158 VectorSetAction<Number> setter(new_vector);
1159
1160 const unsigned int n_variables = this->n_vars();
1161
1162 std::vector<unsigned int> vars;
1163 if (variable_numbers)
1164 {
1165 vars = *variable_numbers;
1166 for (auto v : vars)
1167 if (v >= n_variables)
1168 libmesh_error_msg("ERROR: variable number " << v <<
1169 " out of range for system with " <<
1170 n_variables << " variables.");
1171 }
1172 else
1173 {
1174 vars.resize(n_variables);
1175 std::iota(vars.begin(), vars.end(), 0);
1176 }
1177
1178
1179 // Use a typedef to make the calling sequence for parallel_for() a bit more readable
1180 typedef
1181 GenericProjector<FEMFunctionWrapper<Number>, FEMFunctionWrapper<Gradient>,
1182 Number, VectorSetAction<Number>> FEMProjector;
1183
1184 FEMFunctionWrapper<Number> fw(*f);
1185
1186 if (g)
1187 {
1188 FEMFunctionWrapper<Gradient> gw(*g);
1189
1190 FEMProjector projector(*this, fw, &gw, setter, vars);
1191 projector.project(active_local_range.value());
1192 }
1193 else
1194 {
1195 FEMProjector projector(*this, fw, nullptr, setter, vars);
1196 projector.project(active_local_range.value());
1197 }
1198
1199 // Also, load values into the SCALAR dofs
1200 // Note: We assume that all SCALAR dofs are on the
1201 // processor with highest ID
1202 if (this->processor_id() == (this->n_processors()-1))
1203 {
1204 // FIXME: Do we want to first check for SCALAR vars before building this? [PB]
1205 FEMContext context( *this );
1206
1207 const DofMap & dof_map = this->get_dof_map();
1208 for (auto var : vars)
1209 if (this->variable(var).type().family == SCALAR)
1210 {
1211 // FIXME: We reinit with an arbitrary element in case the user
1212 // doesn't override FEMFunctionBase::component. Is there
1213 // any use case we're missing? [PB]
1214 context.pre_fe_reinit(*this, *(this->get_mesh().active_local_elements_begin()));
1215
1216 std::vector<dof_id_type> SCALAR_indices;
1217 dof_map.SCALAR_dof_indices (SCALAR_indices, var);
1218 const unsigned int n_SCALAR_dofs =
1219 cast_int<unsigned int>(SCALAR_indices.size());
1220
1221 for (unsigned int i=0; i<n_SCALAR_dofs; i++)
1222 {
1223 const dof_id_type global_index = SCALAR_indices[i];
1224 const unsigned int component_index =
1225 this->variable_scalar_number(var,i);
1226
1227 new_vector.set(global_index, f->component(context, component_index, Point(), this->time));
1228 }
1229 }
1230 }
1231
1232 new_vector.close();
1233
1234 // Look for spline bases, in which case we need to backtrack
1235 // to calculate the spline DoF values.
1236 std::vector<const Variable *> rational_vars;
1237 for (auto varnum : vars)
1238 {
1239 const Variable & var = this->get_dof_map().variable(varnum);
1240 if (var.type().family == RATIONAL_BERNSTEIN)
1241 rational_vars.push_back(&var);
1242 }
1243
1244 // Okay, but are we really using any *spline* bases, or just
1245 // unconstrained rational bases?
1246 bool using_spline_bases = false;
1247 if (!rational_vars.empty())
1248 {
1249 // Look for a spline node: a NodeElem with a rational variable
1250 // on it.
1251 for (auto & elem : active_local_range.value())
1252 if (elem->type() == NODEELEM)
1253 for (auto rational_var : rational_vars)
1254 if (rational_var->active_on_subdomain(elem->subdomain_id()))
1255 {
1256 using_spline_bases = true;
1257 goto checked_on_splines;
1258 }
1259 }
1260
1261checked_on_splines:
1262
1263 // Not every processor may have a NodeElem, especially while
1264 // we're not partitioning them efficiently yet.
1265 this->comm().max(using_spline_bases);
1266
1267 if (using_spline_bases)
1268 this->solve_for_unconstrained_dofs(new_vector, is_adjoint);
1269
1270#ifdef LIBMESH_ENABLE_CONSTRAINTS
1271 if (is_adjoint == -1)
1272 this->get_dof_map().enforce_constraints_exactly(*this, &new_vector);
1273 else if (is_adjoint >= 0)
1275 is_adjoint);
1276#else
1277 libmesh_ignore(is_adjoint);
1278#endif
1279}
const Variable & variable(const unsigned int c) const override
Definition dof_map.h:2358
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.
void solve_for_unconstrained_dofs(NumericVector< Number > &, int is_adjoint=-1) const
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
@ RATIONAL_BERNSTEIN

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

◆ project_vector() [4/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 1112 of file system_projection.C.

1118{
1119 LOG_SCOPE ("project_vector(FunctionBase)", "System");
1120
1121 libmesh_assert(f);
1122
1123 WrappedFunctor<Number> f_fem(*f);
1124
1125 if (g)
1126 {
1127 WrappedFunctor<Gradient> g_fem(*g);
1128
1129 this->project_vector(new_vector, &f_fem, &g_fem, is_adjoint, active_local_range, variable_numbers);
1130 }
1131 else
1132 this->project_vector(new_vector, &f_fem, nullptr, is_adjoint, active_local_range, variable_numbers);
1133}

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

◆ project_vector() [5/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 1095 of file system_projection.C.

1102{
1103 WrappedFunction<Number> f(*this, fptr, &function_parameters);
1104 WrappedFunction<Gradient> g(*this, gptr, &function_parameters);
1105 this->project_vector(new_vector, &f, &g, is_adjoint, active_local_range, variable_numbers);
1106}

References fptr(), and gptr().

◆ 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 983 of file system_projection.C.

984{
985 LOG_SCOPE ("projection_matrix()", "System");
986
987 const unsigned int n_variables = this->n_vars();
988
989 if (n_variables)
990 {
991 ConstElemRange active_local_elem_range
992 (this->get_mesh().active_local_elements_begin(),
993 this->get_mesh().active_local_elements_end());
994
995 std::vector<unsigned int> vars(n_variables);
996 std::iota(vars.begin(), vars.end(), 0);
997
998 // Use a typedef to make the calling sequence for parallel_for() a bit more readable
999 typedef OldSolutionCoefs<Real, &FEMContext::point_value> OldSolutionValueCoefs;
1000 typedef OldSolutionCoefs<RealGradient, &FEMContext::point_gradient> OldSolutionGradientCoefs;
1001
1002 typedef
1003 GenericProjector<OldSolutionValueCoefs,
1004 OldSolutionGradientCoefs,
1005 DynamicSparseNumberArray<Real,dof_id_type>,
1006 MatrixFillAction<Real, Number> > ProjMatFiller;
1007
1008 OldSolutionValueCoefs f(*this, &vars);
1009 OldSolutionGradientCoefs g(*this, &vars);
1010 MatrixFillAction<Real, Number> setter(proj_mat);
1011
1012 ProjMatFiller mat_filler(*this, f, &g, setter, vars);
1013 mat_filler.project(active_local_elem_range);
1014
1015 // Set the SCALAR dof transfer entries too.
1016 // Note: We assume that all SCALAR dofs are on the
1017 // processor with highest ID
1018 if (this->processor_id() == (this->n_processors()-1))
1019 {
1020 const DofMap & dof_map = this->get_dof_map();
1021 for (auto var : make_range(this->n_vars()))
1022 if (this->variable(var).type().family == SCALAR)
1023 {
1024 // We can just map SCALAR dofs directly across
1025 std::vector<dof_id_type> new_SCALAR_indices, old_SCALAR_indices;
1026 dof_map.SCALAR_dof_indices (new_SCALAR_indices, var, false);
1027 dof_map.SCALAR_dof_indices (old_SCALAR_indices, var, true);
1028 const unsigned int new_n_dofs =
1029 cast_int<unsigned int>(new_SCALAR_indices.size());
1030
1031 for (unsigned int i=0; i<new_n_dofs; i++)
1032 {
1033 proj_mat.set( new_SCALAR_indices[i],
1034 old_SCALAR_indices[i], 1);
1035 }
1036 }
1037 }
1038 }
1039}
virtual void set(const numeric_index_type i, const numeric_index_type j, const T value)=0
Set the element (i,j) to value.
StoredRange< MeshBase::const_element_iterator, const Elem * > ConstElemRange
Definition elem_range.h:34

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

◆ prolong_vectors()

void libMesh::System::prolong_vectors ( )
virtualinherited

Prolong vectors after the mesh has refined.

Definition at line 432 of file system.C.

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

References libMesh::System::restrict_vectors().

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

◆ pull_temporal_discretization_data()

void libMesh::RBTemporalDiscretization::pull_temporal_discretization_data ( RBTemporalDiscretization other)
inherited

◆ 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.

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}
Number get_qoi_value(unsigned int qoi_index) const
Definition system.C:2184

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

◆ 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.

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}
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...
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)),...
NumericVector< Number > & get_weighted_sensitivity_adjoint_solution(unsigned int i=0)
Definition system.C:1264
NumericVector< Number > & get_weighted_sensitivity_solution()
Definition system.C:1206

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

◆ 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.

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 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
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

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

◆ re_update()

void libMesh::TransientSystem< RBConstruction >::re_update ( )
overrideprotectedvirtualinherited

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 from libMesh::System.

Definition at line 143 of file transient_system.C.

77{
78 // re_update the parent system
79 Base::re_update ();
80
81 const std::vector<dof_id_type> & send_list = this->get_dof_map().get_send_list ();
82
83 const dof_id_type first_local_dof = Base::get_dof_map().first_dof();
84 const dof_id_type end_local_dof = Base::get_dof_map().end_dof();
85
86 // Check sizes
87 libmesh_assert_greater_equal (end_local_dof, first_local_dof);
88 libmesh_assert_greater_equal (older_local_solution->size(), send_list.size());
89 libmesh_assert_greater_equal (old_local_solution->size(), send_list.size());
90
91 // Even if we don't have to do anything ourselves, localize() may
92 // use parallel_only tools
93 // if (first_local_dof == end_local_dof)
94 // return;
95
96 // Update the old & older solutions with the send_list,
97 // which may have changed since their last update.
98 older_local_solution->localize (first_local_dof,
99 end_local_dof-1,
100 send_list);
101
102 old_local_solution->localize (first_local_dof,
103 end_local_dof-1,
104 send_list);
105}
const std::vector< dof_id_type > & get_send_list() const
Definition dof_map.h:533

◆ read_discrete_parameter_values_from_file()

void libMesh::RBParametrized::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 
)
privateinherited

Read in the discrete parameter values from file, if we have any.

Definition at line 318 of file rb_parametrized.C.

321{
322 // read in the discrete parameters, if we have any
323 std::ifstream check_if_file_exists(file_name.c_str());
324 if (check_if_file_exists.good())
325 {
326 // The reading mode: DECODE for binary, READ for ASCII
327 XdrMODE mode = read_binary_data ? DECODE : READ;
328
329 // Read in the parameter ranges
330 Xdr discrete_parameter_values_in(file_name, mode);
331 unsigned int n_discrete_params;
332 discrete_parameter_values_in >> n_discrete_params;
333
334 for (unsigned int i=0; i<n_discrete_params; i++)
335 {
336 std::string param_name;
337 discrete_parameter_values_in >> param_name;
338
339 unsigned int n_discrete_values;
340 discrete_parameter_values_in >> n_discrete_values;
341
342 std::vector<Real> discrete_values(n_discrete_values);
343 for (auto & val : discrete_values)
344 discrete_parameter_values_in >> val;
345
346 discrete_parameter_values[param_name] = discrete_values;
347 }
348 }
349}
XdrMODE
Defines an enum for read/write mode in Xdr format.

References libMesh::DECODE, and libMesh::READ.

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

◆ 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.

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 libmesh-users@lists.sourceforge.net for more details *\n"
219 << "*****************************************************************"
220 << std::endl;
221 }
222
223 // Read additional information for infinite elements
224 int radial_fam=0;
225 int i_map=0;
226 if (read_ifem_info)
227 {
228 if (this->processor_id() == 0)
229 io.data (radial_fam);
230 this->comm().broadcast(radial_fam);
231 if (this->processor_id() == 0)
232 io.data (i_map);
233 this->comm().broadcast(i_map);
234 }
235
236#ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
237
238 type.radial_order = static_cast<Order>(rad_order);
239 type.radial_family = static_cast<FEFamily>(radial_fam);
240 type.inf_map = static_cast<InfMapType>(i_map);
241
242#endif
243
244 if (read_header_in)
245 {
246 if (domains.empty())
247 _written_var_indices[var] = this->add_variable (var_name, type);
248 else
249 _written_var_indices[var] = this->add_variable (var_name, type, &domains);
250 }
251 else
252 _written_var_indices[var] = this->variable_number(var_name);
253 }
254 }
255
256 // 8.)
257 // Read the number of additional vectors.
258 unsigned int nvecs=0;
259 if (this->processor_id() == 0)
260 io.data (nvecs);
261 this->comm().broadcast(nvecs);
262
263 // If nvecs > 0, this means that write_additional_data
264 // was true when this file was written. We will need to
265 // make use of this fact later.
266 this->_additional_data_written = nvecs;
267
268 for (unsigned int vec=0; vec<nvecs; vec++)
269 {
270 // 9.)
271 // Read the name of the vec-th additional vector
272 std::string vec_name;
273 if (this->processor_id() == 0)
274 io.data (vec_name);
275 this->comm().broadcast(vec_name);
276 if (io.version() >= LIBMESH_VERSION_ID(1,7,0))
277 {
278 int vec_projection = 0;
279 if (this->processor_id() == 0)
280 io.data (vec_projection);
281 this->comm().broadcast(vec_projection);
282 int vec_type;
283 if (this->processor_id() == 0)
284 io.data (vec_type);
285 this->comm().broadcast(vec_type);
286
287 if (read_additional_data)
288 this->add_vector(vec_name, bool(vec_projection), ParallelType(vec_type));
289 }
290 else if (read_additional_data)
291 // Systems now can handle adding post-initialization vectors
292 // libmesh_assert(this->_can_add_vectors);
293 // Some systems may have added their own vectors already
294 // libmesh_assert_equal_to (this->_vectors.count(vec_name), 0);
295 this->add_vector(vec_name);
296 }
297}
unsigned int mesh_dimension() const
Definition mesh_base.C:430
std::vector< unsigned int > _written_var_indices
This vector is used only when reading in a system from file.
Definition system.h:2325
virtual void clear()
Clear all the data structures associated with the system.
Definition system.C:173
unsigned int variable_number(std::string_view var) const
Definition system.C:1398
unsigned int _additional_data_written
This flag is used only when reading in a system from file.
Definition system.h:2313
bool contains(std::string_view superstring, std::string_view substring)
Look for a substring within a string.
Definition utility.C:205
bool on_command_line(std::string arg)
Definition libmesh.C:934

References libMesh::System::_additional_data_written, libMesh::System::_written_var_indices, libMesh::System::add_variable(), libMesh::System::add_vector(), libMesh::Parallel::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().

◆ 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.

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}
static constexpr dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition dof_object.h:473

References libMesh::System::_additional_data_written, libMesh::System::_vectors, libMesh::System::_written_var_indices, libMesh::Xdr::data(), 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, and libMesh::System::variable().

◆ 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.

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_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 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.

References libMesh::RBParametrized::initialize_parameters(), libMesh::RBParametrized::read_discrete_parameter_values_from_file(), and libMesh::RBParametrized::read_parameter_ranges_from_file().

Referenced by libMesh::RBEvaluation::legacy_read_offline_data_from_files(), and libMesh::RBSCMEvaluation::legacy_read_offline_data_from_files().

◆ read_parameter_ranges_from_file()

void libMesh::RBParametrized::read_parameter_ranges_from_file ( const std::string &  file_name,
const bool  read_binary,
RBParameters param_min,
RBParameters param_max 
)
privateinherited

Read in the parameter ranges from file.

Initialize parameters to the "minimum" parameter values.

Definition at line 281 of file rb_parametrized.C.

285{
286 // The reading mode: DECODE for binary, READ for ASCII
287 XdrMODE mode = read_binary_data ? DECODE : READ;
288
289 // Read in the parameter ranges
290 Xdr parameter_ranges_in(file_name, mode);
291 unsigned int n_continuous_params;
292 parameter_ranges_in >> n_continuous_params;
293
294 for (unsigned int i=0; i<n_continuous_params; i++)
295 {
296 std::string param_name;
297 Real param_value;
298
299 parameter_ranges_in >> param_name;
300 parameter_ranges_in >> param_value;
301
302 param_min.set_value(param_name, param_value);
303 }
304 for (unsigned int i=0; i<n_continuous_params; i++)
305 {
306 std::string param_name;
307 Real param_value;
308
309 parameter_ranges_in >> param_name;
310 parameter_ranges_in >> param_value;
311
312 param_max.set_value(param_name, param_value);
313 }
314
315 parameter_ranges_in.close();
316}

References libMesh::Xdr::close(), libMesh::DECODE, libMesh::READ, libMesh::Real, and libMesh::RBParameters::set_value().

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

◆ read_riesz_representors_from_files()

void TransientRBConstruction::read_riesz_representors_from_files ( const std::string &  riesz_representors_dir,
const bool  write_binary_residual_representors 
)
overridevirtual

Write out all the Riesz representor data to files.

Override to read in transient data too.

Reimplemented from libMesh::RBConstruction.

Definition at line 1293 of file transient_rb_construction.C.

1295{
1296 LOG_SCOPE("read_riesz_representors_from_files()", "TransientRBConstruction");
1297
1298 const std::string riesz_representor_suffix =
1299 (read_binary_residual_representors ? ".xdr" : ".dat");
1300
1301 std::ostringstream file_name;
1302 struct stat stat_info;
1303
1304 TransientRBEvaluation & trans_rb_eval = cast_ref<TransientRBEvaluation &>(get_rb_evaluation());
1305
1306 libMesh::out << "Reading in the M_q_representors..." << std::endl;
1307
1308 // Read in the Aq representors. The class makes room for [Q_m][Nmax] of these. We are going to
1309 // read in [Q_m][this->rb_eval->get_n_basis_functions()]. FIXME:
1310 // should we be worried about leaks in the locations where we're about to fill entries?
1311 for (std::size_t i=0; i<trans_rb_eval.M_q_representor.size(); ++i)
1312 for (std::size_t j=0; j<trans_rb_eval.M_q_representor[i].size(); ++j)
1313 libmesh_error_msg_if(trans_rb_eval.M_q_representor[i][j] != nullptr,
1314 "Error, must delete existing M_q_representor before reading in from file.");
1315
1316 // Now ready to read them in from file!
1317 for (std::size_t i=0; i<trans_rb_eval.M_q_representor.size(); ++i)
1318 for (std::size_t j=0; j<trans_rb_eval.get_n_basis_functions(); ++j)
1319 {
1320 file_name.str(""); // reset filename
1321 file_name << riesz_representors_dir
1322 << "/M_q_representor" << i << "_" << j << riesz_representor_suffix;
1323
1324 // On processor zero check to be sure the file exists
1325 if (this->processor_id() == 0)
1326 {
1327 int stat_result = stat(file_name.str().c_str(), &stat_info);
1328
1329 libmesh_error_msg_if(stat_result != 0, "File does not exist: " << file_name.str());
1330 }
1331
1332 Xdr aqr_data(file_name.str(),
1333 read_binary_residual_representors ? DECODE : READ);
1334
1335 read_serialized_data(aqr_data, false);
1336
1337 trans_rb_eval.M_q_representor[i][j] = NumericVector<Number>::build(this->comm());
1338 trans_rb_eval.M_q_representor[i][j]->init (n_dofs(), n_local_dofs(),
1339 false, PARALLEL);
1340
1341 // No need to copy, just swap
1342 //*M_q_representor[i][j] = *solution;
1343 trans_rb_eval.M_q_representor[i][j]->swap(*solution);
1344 }
1345}

References libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), libMesh::DECODE, libMesh::RBConstruction::get_rb_evaluation(), 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.

◆ read_SCALAR_dofs()

unsigned int libMesh::System::read_SCALAR_dofs ( const unsigned int  var,
Xdr io,
NumericVector< Number > *  vec 
) const
privateinherited

Reads the SCALAR dofs from the stream io and assigns the values to the appropriate entries of vec.

Returns
The number of dofs read.

Reads data and discards it if vec is a null pointer.

Definition at line 939 of file system_io.C.

942{
943 unsigned int n_assigned_vals = 0; // the number of values assigned, this will be returned.
944
945 // Processor 0 will read the block from the buffer stream and send it to the last processor
946 const unsigned int n_SCALAR_dofs = this->variable(var).type().order.get_order();
947 std::vector<Number> input_buffer(n_SCALAR_dofs);
948 if (this->processor_id() == 0)
949 io.data_stream(input_buffer.data(), n_SCALAR_dofs);
950
951#ifdef LIBMESH_HAVE_MPI
952 if (this->n_processors() > 1)
953 {
954 const Parallel::MessageTag val_tag = this->comm().get_unique_tag();
955
956 // Post the receive on the last processor
957 if (this->processor_id() == (this->n_processors()-1))
958 this->comm().receive(0, input_buffer, val_tag);
959
960 // Send the data to processor 0
961 if (this->processor_id() == 0)
962 this->comm().send(this->n_processors()-1, input_buffer, val_tag);
963 }
964#endif
965
966 // Finally, set the SCALAR values
967 if (this->processor_id() == (this->n_processors()-1))
968 {
969 const DofMap & dof_map = this->get_dof_map();
970 std::vector<dof_id_type> SCALAR_dofs;
971 dof_map.SCALAR_dof_indices(SCALAR_dofs, var);
972
973 for (auto i : index_range(SCALAR_dofs))
974 {
975 if (vec)
976 vec->set (SCALAR_dofs[i], input_buffer[i]);
977 ++n_assigned_vals;
978 }
979 }
980
981 return n_assigned_vals;
982}
MessageTag get_unique_tag(int tagvalue=MessageTag::invalid_tag) const
Status receive(const unsigned int dest_processor_id, T &buf, const MessageTag &tag=any_tag) const
void send(const unsigned int dest_processor_id, const T &buf, const MessageTag &tag=no_tag) const
OrderWrapper order
The approximation order of the element (at 0 p-refinement level).
Definition fe_type.h:203
int get_order() const
Explicitly request the order as an int.
Definition fe_type.h:80
const FEType & type() const
Definition variable.h:144

References libMesh::ParallelObject::comm(), libMesh::Xdr::data_stream(), libMesh::System::get_dof_map(), libMesh::OrderWrapper::get_order(), libMesh::Parallel::Communicator::get_unique_tag(), libMesh::index_range(), libMesh::ParallelObject::n_processors(), libMesh::FEType::order, libMesh::ParallelObject::processor_id(), libMesh::Parallel::Communicator::receive(), libMesh::DofMap::SCALAR_dof_indices(), libMesh::Parallel::Communicator::send(), libMesh::NumericVector< T >::set(), libMesh::Variable::type(), and libMesh::System::variable().

Referenced by libMesh::System::read_serialized_vector(), and libMesh::System::read_serialized_vectors().

◆ read_serialized_blocked_dof_objects()

template<typename iterator_type , typename InValType >
std::size_t libMesh::System::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
privateinherited

Reads an input vector from the stream io and assigns the values to a set of DofObjects.

This method uses blocked input and is safe to call on a distributed memory-mesh. Unless otherwise specified, all variables are read.

If an entry in vecs is a null pointer, the corresponding data is read (incrementing the file read location) but discarded.

Definition at line 618 of file system_io.C.

625{
626 //-------------------------------------------------------
627 // General order: (IO format 0.7.4 & greater)
628 //
629 // for (objects ...)
630 // for (vecs ....)
631 // for (vars ....)
632 // for (comps ...)
633 //
634 // where objects are nodes or elements, sorted to be
635 // partition independent,
636 // vecs are one or more *identically distributed* solution
637 // coefficient vectors, vars are one or more variables
638 // to write, and comps are all the components for said
639 // vars on the object.
640
641 // variables to read. Unless specified otherwise, defaults to _written_var_indices.
642 std::vector<unsigned int> vars_to_read (_written_var_indices);
643
644 if (var_to_read != libMesh::invalid_uint)
645 vars_to_read.assign({var_to_read});
646
647 const unsigned int
648 sys_num = this->number(),
649 num_vecs = cast_int<unsigned int>(vecs.size());
650 const dof_id_type
651 io_blksize = cast_int<dof_id_type>(std::min(max_io_blksize, static_cast<std::size_t>(n_objs))),
652 num_blks = cast_int<unsigned int>(std::ceil(static_cast<double>(n_objs)/
653 static_cast<double>(io_blksize)));
654
655 libmesh_assert_less_equal (_written_var_indices.size(), this->n_vars());
656
657 std::size_t n_read_values=0;
658
659 std::vector<std::vector<dof_id_type>> xfer_ids(num_blks); // The global IDs and # of components for the local objects in all blocks
660 std::vector<std::vector<Number>> recv_vals(num_blks); // The raw values for the local objects in all blocks
661 std::vector<Parallel::Request>
662 id_requests(num_blks), val_requests(num_blks);
663 std::vector<Parallel::MessageTag>
664 id_tags(num_blks), val_tags(num_blks);
665
666 // ------------------------------------------------------
667 // First pass - count the number of objects in each block
668 // traverse all the objects and figure out which block they
669 // will ultimately live in.
670 std::vector<std::size_t>
671 xfer_ids_size (num_blks,0),
672 recv_vals_size (num_blks,0);
673
674
675 for (iterator_type it=begin; it!=end; ++it)
676 {
677 const dof_id_type
678 id = (*it)->id(),
679 block = id/io_blksize;
680
681 libmesh_assert_less (block, num_blks);
682
683 xfer_ids_size[block] += 2; // for each object, we send its id, as well as the total number of components for all variables
684
685 dof_id_type n_comp_tot=0;
686 for (const auto & var : vars_to_read)
687 n_comp_tot += (*it)->n_comp(sys_num, var); // for each variable, we will receive the nonzero components
688
689 recv_vals_size[block] += n_comp_tot*num_vecs;
690 }
691
692 // knowing the recv_vals_size[block] for each processor allows
693 // us to sum them and find the global size for each block.
694 std::vector<std::size_t> tot_vals_size(recv_vals_size);
695 this->comm().sum (tot_vals_size);
696
697
698 //------------------------------------------
699 // Collect the ids & number of values needed
700 // for all local objects, binning them into
701 // 'blocks' that will be sent to processor 0
702 for (dof_id_type blk=0; blk<num_blks; blk++)
703 {
704 // Each processor should build up its transfer buffers for its
705 // local objects in [first_object,last_object).
706 const dof_id_type
707 first_object = blk*io_blksize,
708 last_object = std::min(cast_int<dof_id_type>((blk+1)*io_blksize), n_objs);
709
710 // convenience
711 std::vector<dof_id_type> & ids (xfer_ids[blk]);
712 std::vector<Number> & vals (recv_vals[blk]);
713
714 // we now know the number of values we will store for each block,
715 // so we can do efficient preallocation
716 ids.clear(); ids.reserve (xfer_ids_size[blk]);
717 vals.resize(recv_vals_size[blk]);
718
719#ifdef DEBUG
720 std::unordered_set<dof_id_type> seen_ids;
721#endif
722
723 if (recv_vals_size[blk] != 0) // only if there are nonzero values to receive
724 for (iterator_type it=begin; it!=end; ++it)
725 {
726 dof_id_type id = (*it)->id();
727#ifdef DEBUG
728 // Any renumbering tricks should not have given us any
729 // duplicate ids.
730 libmesh_assert(!seen_ids.count(id));
731 seen_ids.insert(id);
732#endif
733
734 if ((id >= first_object) && // object in [first_object,last_object)
735 (id < last_object))
736 {
737 ids.push_back(id);
738
739 unsigned int n_comp_tot=0;
740
741 for (const auto & var : vars_to_read)
742 n_comp_tot += (*it)->n_comp(sys_num, var);
743
744 ids.push_back (n_comp_tot*num_vecs);
745 }
746 }
747
748#ifdef LIBMESH_HAVE_MPI
749 id_tags[blk] = this->comm().get_unique_tag(100*num_blks + blk);
750 val_tags[blk] = this->comm().get_unique_tag(200*num_blks + blk);
751
752 // nonblocking send the data for this block
753 this->comm().send (0, ids, id_requests[blk], id_tags[blk]);
754
755 // Go ahead and post the receive too
756 this->comm().receive (0, vals, val_requests[blk], val_tags[blk]);
757#endif
758 }
759
760 //---------------------------------------------------
761 // Here processor 0 will read and distribute the data.
762 // We have to do this block-wise to ensure that we
763 // do not exhaust memory on processor 0.
764
765 // give these variables scope outside the block to avoid reallocation
766 std::vector<std::vector<dof_id_type>> recv_ids (this->n_processors());
767 std::vector<std::vector<Number>> send_vals (this->n_processors());
768 std::vector<Parallel::Request> reply_requests (this->n_processors());
769 std::vector<unsigned int> obj_val_offsets; // map to traverse entry-wise rather than processor-wise
770 std::vector<Number> input_vals; // The input buffer for the current block
771 std::vector<InValType> input_vals_tmp; // The input buffer for the current block
772
773 for (dof_id_type blk=0; blk<num_blks; blk++)
774 {
775 // Each processor should build up its transfer buffers for its
776 // local objects in [first_object,last_object).
777 const dof_id_type
778 first_object = blk*io_blksize,
779 last_object = std::min(cast_int<dof_id_type>((blk+1)*io_blksize), n_objs),
780 n_objects_blk = last_object - first_object;
781
782 // Processor 0 has a special job. It needs to gather the requested indices
783 // in [first_object,last_object) from all processors, read the data from
784 // disk, and reply
785 if (this->processor_id() == 0)
786 {
787 // we know the input buffer size for this block and can begin reading it now
788 input_vals.resize(tot_vals_size[blk]);
789 input_vals_tmp.resize(tot_vals_size[blk]);
790
791 // a ThreadedIO object to perform asynchronous file IO
792 ThreadedIO<InValType> threaded_io(io, input_vals_tmp);
793 Threads::Thread async_io(threaded_io);
794
795 // offset array. this will define where each object's values
796 // map into the actual input_vals buffer. this must get
797 // 0-initialized because 0-component objects are not actually sent
798 obj_val_offsets.resize (n_objects_blk); std::fill (obj_val_offsets.begin(), obj_val_offsets.end(), 0);
799 recv_vals_size.resize(this->n_processors()); // reuse this to count how many values are going to each processor
800
801#ifndef NDEBUG
802 std::size_t n_vals_blk = 0;
803#endif
804
805 // loop over all processors and process their index request
806 for (processor_id_type comm_step=0, tnp=this->n_processors(); comm_step != tnp; ++comm_step)
807 {
808#ifdef LIBMESH_HAVE_MPI
809 // blocking receive indices for this block, imposing no particular order on processor
810 Parallel::Status id_status (this->comm().probe (Parallel::any_source, id_tags[blk]));
811 std::vector<dof_id_type> & ids (recv_ids[id_status.source()]);
812 std::size_t & n_vals_proc (recv_vals_size[id_status.source()]);
813 this->comm().receive (id_status.source(), ids, id_tags[blk]);
814#else
815 // straight copy without MPI
816 std::vector<dof_id_type> & ids (recv_ids[0]);
817 std::size_t & n_vals_proc (recv_vals_size[0]);
818 ids = xfer_ids[blk];
819#endif
820
821 n_vals_proc = 0;
822
823 // note its possible we didn't receive values for objects in
824 // this block if they have no components allocated.
825 for (std::size_t idx=0, sz=ids.size(); idx<sz; idx+=2)
826 {
827 const dof_id_type
828 local_idx = ids[idx+0]-first_object,
829 n_vals_tot_allvecs = ids[idx+1];
830
831 libmesh_assert_less (local_idx, n_objects_blk);
832
833 obj_val_offsets[local_idx] = n_vals_tot_allvecs;
834 n_vals_proc += n_vals_tot_allvecs;
835 }
836
837#ifndef NDEBUG
838 n_vals_blk += n_vals_proc;
839#endif
840 }
841
842 // We need the offsets into the input_vals vector for each object.
843 // fortunately, this is simply the partial sum of the total number
844 // of components for each object
845 std::partial_sum(obj_val_offsets.begin(), obj_val_offsets.end(),
846 obj_val_offsets.begin());
847
848 libmesh_assert_equal_to (n_vals_blk, obj_val_offsets.back());
849 libmesh_assert_equal_to (n_vals_blk, tot_vals_size[blk]);
850
851 // Wait for read completion
852 async_io.join();
853 // now copy the values back to the main vector for transfer
854 for (auto i_val : index_range(input_vals))
855 input_vals[i_val] = input_vals_tmp[i_val];
856
857 n_read_values += input_vals.size();
858
859 // pack data replies for each processor
860 for (auto proc : make_range(this->n_processors()))
861 {
862 const std::vector<dof_id_type> & ids (recv_ids[proc]);
863 std::vector<Number> & vals (send_vals[proc]);
864 const std::size_t & n_vals_proc (recv_vals_size[proc]);
865
866 vals.clear(); vals.reserve(n_vals_proc);
867
868 for (std::size_t idx=0, sz=ids.size(); idx<sz; idx+=2)
869 {
870 const dof_id_type
871 local_idx = ids[idx+0]-first_object,
872 n_vals_tot_allvecs = ids[idx+1];
873
874 std::vector<Number>::const_iterator in_vals(input_vals.begin());
875 if (local_idx != 0)
876 std::advance (in_vals, obj_val_offsets[local_idx-1]);
877
878 for (unsigned int val=0; val<n_vals_tot_allvecs; val++, ++in_vals)
879 {
880 libmesh_assert (in_vals != input_vals.end());
881 //libMesh::out << "*in_vals=" << *in_vals << '\n';
882 vals.push_back(*in_vals);
883 }
884 }
885
886#ifdef LIBMESH_HAVE_MPI
887 // send the relevant values to this processor
888 this->comm().send (proc, vals, reply_requests[proc], val_tags[blk]);
889#else
890 recv_vals[blk] = vals;
891#endif
892 }
893 } // end processor 0 read/reply
894
895 // all processors complete the (already posted) read for this block
896 {
897 Parallel::wait (val_requests[blk]);
898
899 const std::vector<Number> & vals (recv_vals[blk]);
900 std::vector<Number>::const_iterator val_it(vals.begin());
901
902 if (!recv_vals[blk].empty()) // nonzero values to receive
903 for (iterator_type it=begin; it!=end; ++it)
904 if (((*it)->id() >= first_object) && // object in [first_object,last_object)
905 ((*it)->id() < last_object))
906 // unpack & set the values
907 for (auto & vec : vecs)
908 for (const auto & var : vars_to_read)
909 {
910 const unsigned int n_comp = (*it)->n_comp(sys_num, var);
911
912 for (unsigned int comp=0; comp<n_comp; comp++, ++val_it)
913 {
914 const dof_id_type dof_index = (*it)->dof_number (sys_num, var, comp);
915 libmesh_assert (val_it != vals.end());
916 if (vec)
917 {
918 libmesh_assert_greater_equal (dof_index, vec->first_local_index());
919 libmesh_assert_less (dof_index, vec->last_local_index());
920 //libMesh::out << "dof_index, *val_it = \t" << dof_index << ", " << *val_it << '\n';
921 vec->set (dof_index, *val_it);
922 }
923 }
924 }
925 }
926
927 // processor 0 needs to make sure all replies have been handed off
928 if (this->processor_id () == 0)
929 Parallel::wait(reply_requests);
930 }
931
932 Parallel::wait(id_requests);
933
934 return n_read_values;
935}
Status wait(Request &r)
const unsigned int any_source
NonConcurrentThread Thread
Use the non-concurrent placeholder.
const unsigned int invalid_uint
A number which is used quite often to represent an invalid or uninitialized value for an unsigned int...
Definition libmesh.h:303

References libMesh::System::_written_var_indices, TIMPI::any_source, libMesh::ParallelObject::comm(), libMesh::Parallel::Communicator::get_unique_tag(), libMesh::index_range(), libMesh::invalid_uint, libMesh::Threads::NonConcurrentThread::join(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::ParallelObject::n_processors(), libMesh::System::number(), libMesh::ParallelObject::processor_id(), libMesh::Parallel::Communicator::receive(), libMesh::Parallel::Communicator::send(), TIMPI::Status::source(), libMesh::Parallel::Communicator::sum(), and TIMPI::wait().

Referenced by libMesh::System::read_serialized_vector(), and libMesh::System::read_serialized_vectors().

◆ 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.

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}

References libMesh::System::_additional_data_written, libMesh::System::_vectors, libMesh::Xdr::comment(), libMesh::ParallelObject::processor_id(), and libMesh::System::solution.

Referenced by initialize_truth(), libMesh::RBConstruction::read_riesz_representors_from_files(), and read_riesz_representors_from_files().

◆ 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_vector() [1/2]

numeric_index_type libMesh::System::read_serialized_vector ( Xdr io,
NumericVector< Number > &  vec 
)
inlineprivateinherited

Non-templated version for backward compatibility.

Reads a vector for this System. This method may safely be called on a distributed-memory mesh.

Returns
The length of the vector read.

Definition at line 2126 of file system.h.

2128 { return read_serialized_vector<Number>(io, &vec); }

◆ read_serialized_vector() [2/2]

template<typename InValType >
template LIBMESH_EXPORT numeric_index_type libMesh::System::read_serialized_vector< Real > ( Xdr io,
NumericVector< Number > *  vec 
)
privateinherited

Reads a vector for this System.

This method may safely be called on a distributed-memory mesh.

Returns
The length of the vector read.

Reads data and discards it if vec is a null pointer.

Definition at line 986 of file system_io.C.

988{
989 parallel_object_only();
990
991#ifndef NDEBUG
992 // In parallel we better be reading a parallel vector -- if not
993 // we will not set all of its components below!!
994 if (this->n_processors() > 1 && vec)
995 {
996 libmesh_assert (vec->type() == PARALLEL ||
997 vec->type() == GHOSTED);
998 }
999#endif
1000
1001 libmesh_assert (io.reading());
1002
1003 // vector length
1004 unsigned int vector_length=0; // FIXME? size_t would break binary compatibility...
1005#ifndef NDEBUG
1006 std::size_t n_assigned_vals=0;
1007#endif
1008
1009 // Get the buffer size
1010 if (this->processor_id() == 0)
1011 io.data(vector_length, "# vector length");
1012 this->comm().broadcast(vector_length);
1013
1014 const unsigned int nv = cast_int<unsigned int>
1015 (this->_written_var_indices.size());
1016 const dof_id_type
1017 n_nodes = this->get_mesh().n_nodes(),
1018 n_elem = this->get_mesh().n_elem();
1019
1020 libmesh_assert_less_equal (nv, this->n_vars());
1021
1022 // for newer versions, read variables node/elem major
1023 if (io.version() >= LIBMESH_VERSION_ID(0,7,4))
1024 {
1025 //---------------------------------
1026 // Collect the values for all nodes
1027#ifndef NDEBUG
1028 n_assigned_vals +=
1029#endif
1031 this->get_mesh().local_nodes_begin(),
1032 this->get_mesh().local_nodes_end(),
1033 InValType(),
1034 io,
1035 std::vector<NumericVector<Number> *> (1,vec));
1036
1037
1038 //------------------------------------
1039 // Collect the values for all elements
1040#ifndef NDEBUG
1041 n_assigned_vals +=
1042#endif
1044 this->get_mesh().local_elements_begin(),
1045 this->get_mesh().local_elements_end(),
1046 InValType(),
1047 io,
1048 std::vector<NumericVector<Number> *> (1,vec));
1049 }
1050
1051 // for older versions, read variables var-major
1052 else
1053 {
1054 // Loop over each variable in the system, and then each node/element in the mesh.
1055 for (unsigned int data_var=0; data_var<nv; data_var++)
1056 {
1057 const unsigned int var = _written_var_indices[data_var];
1058 if (this->variable(var).type().family != SCALAR)
1059 {
1060 //---------------------------------
1061 // Collect the values for all nodes
1062#ifndef NDEBUG
1063 n_assigned_vals +=
1064#endif
1066 this->get_mesh().local_nodes_begin(),
1067 this->get_mesh().local_nodes_end(),
1068 InValType(),
1069 io,
1070 std::vector<NumericVector<Number> *> (1,vec),
1071 var);
1072
1073
1074 //------------------------------------
1075 // Collect the values for all elements
1076#ifndef NDEBUG
1077 n_assigned_vals +=
1078#endif
1080 this->get_mesh().local_elements_begin(),
1081 this->get_mesh().local_elements_end(),
1082 InValType(),
1083 io,
1084 std::vector<NumericVector<Number> *> (1,vec),
1085 var);
1086 } // end variable loop
1087 }
1088 }
1089
1090 //-------------------------------------------
1091 // Finally loop over all the SCALAR variables
1092 for (unsigned int data_var=0; data_var<nv; data_var++)
1093 {
1094 const unsigned int var = _written_var_indices[data_var];
1095 if (this->variable(var).type().family == SCALAR)
1096 {
1097#ifndef NDEBUG
1098 n_assigned_vals +=
1099#endif
1100 this->read_SCALAR_dofs (var, io, vec);
1101 }
1102 }
1103
1104 if (vec)
1105 vec->close();
1106
1107#ifndef NDEBUG
1108 this->comm().sum (n_assigned_vals);
1109 libmesh_assert_equal_to (n_assigned_vals, vector_length);
1110#endif
1111
1112 return vector_length;
1113}
virtual dof_id_type n_elem() const =0
virtual dof_id_type n_nodes() const =0
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
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:939
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).
const dof_id_type n_nodes
Definition tecplot_io.C:67

References libMesh::System::_written_var_indices, libMesh::Parallel::Communicator::broadcast(), libMesh::NumericVector< T >::close(), libMesh::ParallelObject::comm(), libMesh::Xdr::data(), libMesh::System::get_mesh(), libMesh::GHOSTED, libMesh::libmesh_assert(), libMesh::MeshBase::n_elem(), libMesh::MeshBase::n_nodes(), n_nodes, libMesh::ParallelObject::n_processors(), libMesh::System::n_vars(), libMesh::PARALLEL, libMesh::ParallelObject::processor_id(), libMesh::System::read_SCALAR_dofs(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::Xdr::reading(), libMesh::SCALAR, libMesh::Parallel::Communicator::sum(), libMesh::NumericVector< T >::type(), libMesh::System::variable(), and libMesh::Xdr::version().

◆ 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 2015 of file system_io.C.

2017{
2018 parallel_object_only();
2019
2020 // Error checking
2021 // #ifndef NDEBUG
2022 // // In parallel we better be reading a parallel vector -- if not
2023 // // we will not set all of its components below!!
2024 // if (this->n_processors() > 1)
2025 // {
2026 // libmesh_assert (vec.type() == PARALLEL ||
2027 // vec.type() == GHOSTED);
2028 // }
2029 // #endif
2030
2031 libmesh_assert (io.reading());
2032
2033 if (this->processor_id() == 0)
2034 {
2035 // sizes
2036 unsigned int num_vecs=0;
2037 dof_id_type vector_length=0;
2038
2039 // Get the number of vectors
2040 io.data(num_vecs);
2041 // Get the buffer size
2042 io.data(vector_length);
2043
2044 libmesh_error_msg_if
2045 (num_vecs != vectors.size(),
2046 "Xdr file header declares " << num_vecs << " vectors, but we were asked to read " << vectors.size());
2047
2048 if (num_vecs != 0)
2049 {
2050 libmesh_error_msg_if (vectors[0] == nullptr, "vectors[0] should not be null");
2051 libmesh_error_msg_if (vectors[0]->size() != vector_length, "Inconsistent vector sizes");
2052 }
2053 }
2054
2055 // no need to actually communicate these.
2056 // this->comm().broadcast(num_vecs);
2057 // this->comm().broadcast(vector_length);
2058
2059 // Cache these - they are not free!
2060 const dof_id_type
2061 n_nodes = this->get_mesh().n_nodes(),
2062 n_elem = this->get_mesh().n_elem();
2063
2064 std::size_t read_length = 0;
2065
2066 //---------------------------------
2067 // Collect the values for all nodes
2068 read_length +=
2070 this->get_mesh().local_nodes_begin(),
2071 this->get_mesh().local_nodes_end(),
2072 InValType(),
2073 io,
2074 vectors);
2075
2076 //------------------------------------
2077 // Collect the values for all elements
2078 read_length +=
2080 this->get_mesh().local_elements_begin(),
2081 this->get_mesh().local_elements_end(),
2082 InValType(),
2083 io,
2084 vectors);
2085
2086 //-------------------------------------------
2087 // Finally loop over all the SCALAR variables
2088 for (NumericVector<Number> * vec : vectors)
2089 for (auto var : make_range(this->n_vars()))
2090 if (this->variable(var).type().family == SCALAR)
2091 {
2092 libmesh_assert_not_equal_to (vec, 0);
2093
2094 read_length +=
2095 this->read_SCALAR_dofs (var, io, vec);
2096 }
2097
2098 //---------------------------------------
2099 // last step - must close all the vectors
2100 for (NumericVector<Number> * vec : vectors)
2101 {
2102 libmesh_assert_not_equal_to (vec, 0);
2103 vec->close();
2104 }
2105
2106 return read_length;
2107}

References libMesh::Xdr::data(), libMesh::FEType::family, libMesh::System::get_mesh(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::MeshBase::n_elem(), libMesh::MeshBase::n_nodes(), 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, libMesh::Variable::type(), and libMesh::System::variable().

Referenced by libMesh::RBEvaluation::read_in_vectors_from_multiple_files().

◆ 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)
virtualinherited

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.

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}
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 void update_residual_terms(bool compute_inner_products=true)
Compute the terms that are combined ‘online’ to determine the dual norm of the residual.

References libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::delta_N, libMesh::RBConstruction::Fq_representor_innerprods_computed, libMesh::RBEvaluation::get_n_basis_functions(), libMesh::RBConstruction::get_rb_evaluation(), and libMesh::RBConstruction::update_residual_terms().

Referenced by libMesh::RBConstruction::train_reduced_basis_with_POD().

◆ 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.

100{
101 // re-initialize the linear solver interface
102 linear_solver->clear();
103
104 // initialize parent data
106}
virtual void reinit()
Reinitializes degrees of freedom and other required data on the current mesh.
Definition system.C:442

References libMesh::ImplicitSystem::linear_solver, and libMesh::System::reinit().

Referenced by fe_assembly().

◆ 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.

484{
485 parallel_object_only();
486
487#ifdef LIBMESH_ENABLE_CONSTRAINTS
491 if (libMesh::on_command_line ("--print-constraints"))
493#endif
495}
void prepare_send_list()
Takes the _send_list vector (which may have duplicate entries) and sorts it.
Definition dof_map.C:1835
void print_dof_constraints(std::ostream &os=libMesh::out, bool print_nonlocal=false) const
Prints (from processor 0) all DoF and Node constraints.
void create_dof_constraints(const MeshBase &, Real time=0)
Rebuilds the raw degree of freedom and DofObject constraints, based on attached DirichletBoundary obj...
void process_constraints(MeshBase &)
Postprocesses any constrained degrees of freedom to be constrained only in terms of unconstrained dof...
virtual void user_constrain()
Calls user's attached constraint function, or is overridden by the user in derived classes.
Definition system.C:2123

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

◆ reinit_mesh()

void libMesh::System::reinit_mesh ( )
virtualinherited

Reinitializes the system with a new mesh.

Definition at line 289 of file system.C.

290{
291 parallel_object_only();
292
293 // First initialize any required data:
294 // either only the basic System data
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}
virtual void user_initialization()
Calls user's attached initialization function, or is overridden by the user in derived classes.
Definition system.C:2095
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

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

◆ 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.

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}

References libMesh::System::_matrices.

◆ 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.

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}

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

◆ request_matrix() [1/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.

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}

References libMesh::System::_matrices.

◆ request_matrix() [2/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.

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}

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

◆ request_vector() [1/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.

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}

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

◆ request_vector() [2/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.

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}

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

◆ request_vector() [3/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.

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}

References libMesh::System::_vectors, and libMesh::NumericVector< T >::get().

◆ request_vector() [4/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.

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}

References libMesh::System::_vectors, and libMesh::NumericVector< T >::get().

Referenced by libMesh::UniformRefinementEstimator::_estimate_error().

◆ reset_preevaluate_thetas_completed()

void libMesh::RBConstruction::reset_preevaluate_thetas_completed ( )
protectedinherited

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.

2866{
2868}

References libMesh::RBConstruction::_preevaluate_thetas_completed.

◆ 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.

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

References libMesh::LinearImplicitSystem::_subset, libMesh::LinearImplicitSystem::_subset_solve_mode, and libMesh::SystemSubset::get_system().

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

◆ restrict_vectors()

void libMesh::System::restrict_vectors ( )
virtualinherited

Restrict vectors after the mesh has coarsened.

Definition at line 374 of file system.C.

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

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

◆ 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.

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,
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()))
185 this->get_dof_map().enforce_constraints_exactly
186 (*this, &this->get_sensitivity_solution(p),
187 /* homogeneous = */ true);
188#endif
189
190 return totalrval;
191}
NumericVector< Number > & add_sensitivity_solution(unsigned int i=0)
Definition system.C:1169
const SparseMatrix< Number > * request_matrix(std::string_view mat_name) const
Definition system.C:1087

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

◆ set_abs_training_tolerance()

void libMesh::RBConstruction::set_abs_training_tolerance ( Real  new_training_tolerance)
inlineinherited

Get/set the absolute tolerance for the basis training.

Definition at line 225 of file rb_construction.h.

226 {this->abs_training_tolerance = new_training_tolerance; }

References libMesh::RBConstruction::abs_training_tolerance.

Referenced by libMesh::RBConstruction::set_rb_construction_parameters().

◆ 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.

418 { adjoint_already_solved = setting;}

References libMesh::System::adjoint_already_solved.

Referenced by main().

◆ 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.

2466{
2467 _basic_system_only = true;
2468}

References libMesh::System::_basic_system_only.

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

◆ set_context_solution_vec()

void libMesh::RBConstruction::set_context_solution_vec ( NumericVector< Number > &  vec)
protectedvirtualinherited

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.

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}

References libMesh::System::current_local_solution, libMesh::System::get_dof_map(), and libMesh::NumericVector< T >::localize().

◆ set_control()

void libMesh::RBTemporalDiscretization::set_control ( const std::vector< Real > &  control)
inherited

Definition at line 85 of file rb_temporal_discretization.C.

86{
87 libmesh_assert_less_equal(control.size(),_n_time_steps+1);
88 _control = control;
89 // If the input vector is smaller than the number of time steps (+1), we complete it with zeros
90 _control.resize(_n_time_steps+1);
91}

References libMesh::RBTemporalDiscretization::_control, and libMesh::RBTemporalDiscretization::_n_time_steps.

Referenced by libMesh::RBTemporalDiscretization::pull_temporal_discretization_data().

◆ set_convergence_assertion_flag()

void libMesh::RBConstruction::set_convergence_assertion_flag ( bool  flag)
inherited

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

Definition at line 2750 of file rb_construction.C.

2751{
2752 assert_convergence = flag;
2753}

References libMesh::RBConstruction::assert_convergence.

◆ set_current_training_parameter_index()

void libMesh::RBConstruction::set_current_training_parameter_index ( unsigned int  index)
protectedinherited

◆ set_delta_N()

void libMesh::TransientRBConstruction::set_delta_N ( const unsigned int  new_delta_N)
inline

Set delta_N, the number of basis functions we add to the RB space from each POD.

Definition at line 227 of file transient_rb_construction.h.

227{ this->delta_N = new_delta_N; }

References libMesh::RBConstruction::delta_N.

Referenced by add_IC_to_RB_space(), enrich_RB_space(), and process_parameters_file().

◆ set_delta_t()

void libMesh::RBTemporalDiscretization::set_delta_t ( const Real  delta_t_in)
inherited

◆ 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)
inherited

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.

439{
441 energy_inner_product_coeffs = energy_inner_product_coeffs_in;
442}

References libMesh::RBConstruction::energy_inner_product_coeffs, and libMesh::RBConstruction::use_energy_inner_product.

◆ set_error_temporal_data()

Number TransientRBConstruction::set_error_temporal_data ( )
protected

Set column k (i.e.

the current time level) of temporal_data to the difference between the current solution and the orthogonal projection of the current solution onto the current RB space.

Definition at line 629 of file transient_rb_construction.C.

630{
631 LOG_SCOPE("set_error_temporal_data()", "TransientRBConstruction");
632
633 // first compute the projection of solution onto the current
634 // RB space
635
636 const unsigned int time_step = get_time_step();
637
638 if (get_rb_evaluation().get_n_basis_functions() == 0)
639 {
640 // If the basis is empty, then the error is the solution itself
641 temporal_data[time_step]->zero();
642 temporal_data[time_step]->add(1., *solution);
643 }
644 else
645 {
646 unsigned int RB_size = get_rb_evaluation().get_n_basis_functions();
647
648 std::unique_ptr<NumericVector<Number>> temp = NumericVector<Number>::build(this->comm());
649 temp->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
650
651 // First compute the right-hand side vector for the projection
653
654 // zero_dirichlet_dofs_on_vector(*temp);
655
656 // Do not assume that RB_stiffness matrix is diagonal,
657 // diagonality degrades as N increases
658
659 // Get an appropriately sized copy of RB_inner_product_matrix
660 DenseMatrix<Number> RB_inner_product_matrix_N(RB_size,RB_size);
661 for (unsigned int i=0; i<RB_size; i++)
662 for (unsigned int j=0; j<RB_size; j++)
663 {
664 RB_inner_product_matrix_N(i,j) = get_rb_evaluation().RB_inner_product_matrix(i,j);
665 }
666
667 // Compute the projection RHS
668 DenseVector<Number> RB_proj_rhs(RB_size);
669 for (unsigned int i=0; i<RB_size; i++)
670 {
671 RB_proj_rhs(i) = temp->dot(get_rb_evaluation().get_basis_function(i));
672 }
673
674 DenseVector<Number> RB_proj(RB_size);
675
676 // Now solve the linear system
677 RB_inner_product_matrix_N.lu_solve(RB_proj_rhs, RB_proj);
678
679 // Load the RB projection into temp
680 temp->zero();
681 for (unsigned int i=0; i<RB_size; i++)
682 {
683 temp->add(RB_proj(i), get_rb_evaluation().get_basis_function(i));
684 }
685
686 temp->add(-1., *solution);
687
688 // Now temp holds the projection error, store in temporal_data
689 *(temporal_data[time_step]) = *temp;
690 }
691
692 // return the square of the X norm of the truth solution
694
696}
DenseMatrix< Number > RB_inner_product_matrix
The inner product matrix.

References libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), libMesh::DenseVector< T >::dot(), libMesh::RBEvaluation::get_n_basis_functions(), libMesh::RBConstruction::get_non_dirichlet_inner_product_matrix_if_avail(), libMesh::RBConstruction::get_rb_evaluation(), libMesh::RBTemporalDiscretization::get_time_step(), libMesh::RBConstructionBase< LinearImplicitSystem >::inner_product_storage_vector, libMesh::DenseMatrix< T >::lu_solve(), libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), libMesh::PARALLEL, libMesh::RBEvaluation::RB_inner_product_matrix, libMesh::System::solution, temporal_data, and libMesh::SparseMatrix< T >::vector_mult().

Referenced by truth_solve().

◆ set_euler_theta()

void libMesh::RBTemporalDiscretization::set_euler_theta ( const Real  euler_theta_in)
inherited

◆ set_inner_product_assembly()

void libMesh::RBConstruction::set_inner_product_assembly ( ElemAssembly inner_product_assembly_in)
inherited

Set the rb_assembly_expansion object.

Definition at line 421 of file rb_construction.C.

422{
424 inner_product_assembly = &inner_product_assembly_in;
425}

References libMesh::RBConstruction::inner_product_assembly, and libMesh::RBConstruction::use_energy_inner_product.

Referenced by SimpleRBConstruction::init_data(), and ElasticityRBConstruction::init_data().

◆ set_L2_assembly()

void TransientRBConstruction::set_L2_assembly ( ElemAssembly L2_assembly_in)

Set the L2 object.

Definition at line 453 of file transient_rb_construction.C.

454{
455 L2_assembly = &L2_assembly_in;
456}

References L2_assembly.

◆ set_max_truth_solves()

void libMesh::TransientRBConstruction::set_max_truth_solves ( int  max_truth_solves_in)
inline

Definition at line 215 of file transient_rb_construction.h.

215{ this->max_truth_solves = max_truth_solves_in; }

References max_truth_solves.

Referenced by process_parameters_file().

◆ set_n_time_steps()

void libMesh::RBTemporalDiscretization::set_n_time_steps ( const unsigned int  K)
inherited

◆ set_Nmax()

void libMesh::RBConstruction::set_Nmax ( unsigned int  Nmax)
virtualinherited

Definition at line 1703 of file rb_construction.C.

1704{
1705 this->Nmax = Nmax_in;
1706}

References libMesh::RBConstruction::Nmax.

Referenced by libMesh::RBConstruction::set_rb_construction_parameters().

◆ set_normalize_rb_bound_in_greedy()

void libMesh::RBConstruction::set_normalize_rb_bound_in_greedy ( bool  normalize_rb_bound_in_greedy_in)
inlineinherited

Get/set the boolean to indicate if we normalize the RB error in the greedy.

Definition at line 232 of file rb_construction.h.

233 {this->normalize_rb_bound_in_greedy = normalize_rb_bound_in_greedy_in; }

References libMesh::RBConstruction::normalize_rb_bound_in_greedy.

Referenced by libMesh::RBConstruction::set_rb_construction_parameters().

◆ 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 113 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 ...

◆ 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.

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 check_if_valid_params(const RBParameters &params) const
Helper function to check that params is valid:

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(), libMesh::RBConstruction::get_RB_error_bound(), SimpleRBEvaluation::get_stability_lower_bound(), libMesh::RBParametrized::initialize_parameters(), main(), libMesh::RBSCMEvaluation::reload_current_parameters(), libMesh::RBSCMEvaluation::set_current_parameters_from_C_J(), and RBParametersTest::testRBParametrized().

◆ 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 243 of file rb_construction_base.C.

226{
228}
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 248 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}
uint8_t processor_id_type

◆ set_POD_tol()

void libMesh::TransientRBConstruction::set_POD_tol ( const Real  POD_tol_in)
inline

Definition at line 221 of file transient_rb_construction.h.

221{ this->POD_tol = POD_tol_in; }

References POD_tol.

Referenced by process_parameters_file().

◆ set_preevaluate_thetas_flag()

void libMesh::RBConstruction::set_preevaluate_thetas_flag ( bool  flag)
inherited

Definition at line 2760 of file rb_construction.C.

2761{
2763}

References libMesh::RBConstruction::_preevaluate_thetas_flag.

◆ set_project_with_constraints()

void libMesh::System::set_project_with_constraints ( bool  _project_with_constraints)
inlineinherited

Definition at line 1842 of file system.h.

1843 {
1844 project_with_constraints = _project_with_constraints;
1845 }

References libMesh::System::project_with_constraints.

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

◆ set_qoi() [1/2]

void libMesh::System::set_qoi ( std::vector< Number new_qoi)
inherited

Definition at line 2197 of file system.C.

2198{
2199 libmesh_assert_equal_to(this->_qoi.size(), new_qoi.size());
2200 this->_qoi = std::move(new_qoi);
2201}

◆ set_qoi() [2/2]

void libMesh::System::set_qoi ( unsigned int  qoi_index,
Number  qoi_value 
)
inherited

◆ set_qoi_error_estimate()

void libMesh::System::set_qoi_error_estimate ( unsigned int  qoi_index,
Number  qoi_error_estimate 
)
inherited

◆ 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.

101 { this->quiet_mode = quiet_mode_in; }

◆ set_rb_assembly_expansion()

void libMesh::RBConstruction::set_rb_assembly_expansion ( RBAssemblyExpansion rb_assembly_expansion_in)
inherited

Set the rb_assembly_expansion object.

Definition at line 409 of file rb_construction.C.

410{
411 rb_assembly_expansion = &rb_assembly_expansion_in;
412}

References libMesh::RBConstruction::rb_assembly_expansion.

Referenced by SimpleRBConstruction::init_data(), and ElasticityRBConstruction::init_data().

◆ 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 
)
inherited

Set the state of this RBConstruction object based on the arguments to this function.

Definition at line 290 of file rb_construction.C.

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_training_random_seed(int seed)
Set the seed that is used to randomly generate training parameters.
void set_quiet_mode(bool quiet_mode_in)
Set the quiet_mode flag.
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...
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 set_Nmax(unsigned int Nmax)
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.
void set_abs_training_tolerance(Real new_training_tolerance)
Get/set the absolute tolerance for the basis training.
void set_rel_training_tolerance(Real new_training_tolerance)
Get/set the relative tolerance for the basis training.
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.
const RBParameters & get_parameters_min() const
Get an RBParameters object that specifies the minimum allowable value for each parameter.

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(), libMesh::RBConstruction::set_abs_training_tolerance(), libMesh::RBConstruction::set_Nmax(), libMesh::RBConstruction::set_normalize_rb_bound_in_greedy(), libMesh::RBConstructionBase< LinearImplicitSystem >::set_quiet_mode(), libMesh::RBConstruction::set_RB_training_type(), libMesh::RBConstruction::set_rel_training_tolerance(), and libMesh::RBConstructionBase< LinearImplicitSystem >::set_training_random_seed().

Referenced by libMesh::RBConstruction::process_parameters_file().

◆ set_rb_evaluation()

void libMesh::RBConstruction::set_rb_evaluation ( RBEvaluation rb_eval_in)
inherited

Set the RBEvaluation object.

Definition at line 174 of file rb_construction.C.

175{
176 rb_eval = &rb_eval_in;
177}

References libMesh::RBConstruction::rb_eval.

Referenced by main().

◆ set_RB_training_type()

void libMesh::RBConstruction::set_RB_training_type ( const std::string &  RB_training_type_in)
inherited

Get/set the string that determines the training type.

Definition at line 1686 of file rb_construction.C.

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}
virtual bool is_serial_training_type(const std::string &RB_training_type_in)

References libMesh::RBConstruction::is_serial_training_type(), libMesh::RBConstruction::RB_training_type, and libMesh::RBConstructionBase< LinearImplicitSystem >::serial_training_set.

Referenced by libMesh::RBConstruction::set_rb_construction_parameters().

◆ set_rel_training_tolerance()

void libMesh::RBConstruction::set_rel_training_tolerance ( Real  new_training_tolerance)
inlineinherited

Get/set the relative tolerance for the basis training.

Definition at line 218 of file rb_construction.h.

219 {this->rel_training_tolerance = new_training_tolerance; }

References libMesh::RBConstruction::rel_training_tolerance.

Referenced by libMesh::RBConstruction::set_rb_construction_parameters().

◆ set_time_step()

void libMesh::RBTemporalDiscretization::set_time_step ( const unsigned int  k)
inherited

◆ 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 158 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}

◆ 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 170 of file rb_construction_base.C.

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.

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}

References libMesh::System::_vector_is_adjoint.

Referenced by libMesh::System::add_adjoint_solution(), and libMesh::System::add_weighted_sensitivity_adjoint_solution().

◆ 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.

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}

References libMesh::System::_vector_projections.

Referenced by libMesh::AdjointRefinementEstimator::estimate_error(), and main().

◆ 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.

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 const std::vector< unsigned int > & dof_ids() const =0
bool prefix_with_name() const
Definition system.h:1974
std::string prefix() const
Definition system.h:1980

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

◆ 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 
)
virtualinherited

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.

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}
virtual void init(const char *name=nullptr)=0
Initialize data structures if not done so already.
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...

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 libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::RBConstruction::enrich_basis_from_rhs_terms(), libMesh::RBConstruction::truth_solve(), truth_solve(), update_residual_terms(), and libMesh::RBConstruction::update_residual_terms().

◆ solve_for_unconstrained_dofs()

void libMesh::System::solve_for_unconstrained_dofs ( NumericVector< Number > &  vec,
int  is_adjoint = -1 
) const
inherited

Definition at line 2103 of file system_projection.C.

2105{
2106 const DofMap & dof_map = this->get_dof_map();
2107
2108 std::unique_ptr<SparseMatrix<Number>> mat =
2110
2111 std::unique_ptr<SparsityPattern::Build> sp;
2112
2113 if (dof_map.computed_sparsity_already())
2114 dof_map.update_sparsity_pattern(*mat);
2115 else
2116 {
2117 mat->attach_dof_map(dof_map);
2118 sp = dof_map.build_sparsity(this->get_mesh());
2119 mat->attach_sparsity_pattern(*sp);
2120 }
2121
2122 mat->init();
2123
2124 libmesh_assert_equal_to(vec.size(), dof_map.n_dofs());
2125 libmesh_assert_equal_to(vec.local_size(), dof_map.n_local_dofs());
2126
2127 std::unique_ptr<NumericVector<Number>> rhs =
2129
2130 rhs->init(dof_map.n_dofs(), dof_map.n_local_dofs(), false,
2131 PARALLEL);
2132
2133 // Here we start with the unconstrained (and indeterminate) linear
2134 // system, K*u = f, where K is the identity matrix for constrained
2135 // DoFs and 0 elsewhere, and f is the current solution values for
2136 // constrained DoFs and 0 elsewhere.
2137 // We then apply the usual heterogeneous constraint matrix C and
2138 // offset h, where u = C*x + h,
2139 // to get C^T*K*C*x = C^T*f - C^T*K*h
2140 // - a constrained and no-longer-singular system that finds the
2141 // closest approximation for the unconstrained degrees of freedom.
2142 //
2143 // Here, though "closest" is in an algebraic sense; we're
2144 // effectively using a pseudoinverse that optimizes in a
2145 // discretization-dependent norm. That only seems to give ~0.1%
2146 // excess error even in coarse unit test cases, but at some point it
2147 // might be reasonable to weight K and f properly.
2148
2149 for (dof_id_type d : IntRange<dof_id_type>(dof_map.first_dof(),
2150 dof_map.end_dof()))
2151 {
2152 if (dof_map.is_constrained_dof(d))
2153 {
2154 DenseMatrix<Number> K(1,1);
2155 DenseVector<Number> F(1);
2156 std::vector<dof_id_type> dof_indices(1, d);
2157 K(0,0) = 1;
2158 F(0) = (*this->solution)(d);
2159 dof_map.heterogenously_constrain_element_matrix_and_vector
2160 (K, F, dof_indices, false, is_adjoint);
2161 mat->add_matrix(K, dof_indices);
2162 rhs->add_vector(F, dof_indices);
2163 }
2164 }
2165
2166 std::unique_ptr<LinearSolver<Number>> linear_solver =
2168
2169 linear_solver->solve(*mat, vec, *rhs,
2170 double(this->get_equation_systems().parameters.get<Real>("linear solver tolerance")),
2171 this->get_equation_systems().parameters.get<unsigned int>("linear solver maximum iterations"));
2172}
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.

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

◆ system()

sys_type & libMesh::TransientSystem< RBConstruction >::system ( )
inlineinherited
Returns
A reference to *this.

Definition at line 89 of file transient_system.h.

89{ return *this; }

◆ system_type()

std::string libMesh::TransientSystem< RBConstruction >::system_type ( ) const
inlineoverridevirtualinherited
Returns
"Transient" prepended to T::system_type(). Helps in identifying the system type in an equation system file.

Reimplemented from libMesh::RBConstruction.

Definition at line 102 of file transient_system.h.

173{
174 std::string type = "Transient";
175 type += Base::system_type ();
176
177 return type;
178}

◆ train_reduced_basis()

Real TransientRBConstruction::train_reduced_basis ( const bool  resize_rb_eval_data = true)
overridevirtual

Train the reduced basis.

Overridden so that we can set the flag compute_truth_projection_error to true so that the calls to truth_solve during the basis construction will compute the projection error. Other calls to truth_solve generally do not need to perform these projection calculations.

Reimplemented from libMesh::RBConstruction.

Definition at line 281 of file transient_rb_construction.C.

282{
283 libmesh_error_msg_if(get_RB_training_type() == "POD",
284 "POD RB training is not supported with TransientRBConstruction");
285
287 Real value = Parent::train_reduced_basis(resize_rb_eval_data);
289
290 return value;
291}
virtual Real train_reduced_basis(const bool resize_rb_eval_data=true)
Train the reduced basis.
const std::string & get_RB_training_type() const

References compute_truth_projection_error, libMesh::RBConstruction::get_RB_training_type(), libMesh::Real, libMesh::RBConstruction::train_reduced_basis(), and value.

◆ train_reduced_basis_with_greedy()

Real libMesh::RBConstruction::train_reduced_basis_with_greedy ( const bool  resize_rb_eval_data)
inherited

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.

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;
1289
1290 // Update the list of Greedily selected parameters
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;
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 }
1327
1328 return training_greedy_error;
1329}
virtual Real compute_max_error_bound()
(i) Compute the a posteriori error bound for each set of parameters in the training set,...
bool skip_residual_in_train_reduced_basis
Boolean flag to indicate if we skip residual calculations in train_reduced_basis.
void update_greedy_param_list()
Update the list of Greedily chosen parameters with current_parameters.
virtual Real truth_solve(int plot_solution)
Perform a "truth" solve, i.e.
bool use_empty_rb_solve_in_greedy
A boolean flag to indicate whether or not we initialize the Greedy algorithm by performing rb_solves ...
virtual void preevaluate_thetas()
virtual void compute_output_dual_innerprods()
Compute and store the dual norm of each output functional.
virtual bool check_if_zero_truth_solve() const
virtual void clear() override
Clear all the data structures associated with the system.
void print_parameters() const
Print the current parameters.

References libMesh::RBConstruction::check_if_zero_truth_solve(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_max_error_bound(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::enrich_RB_space(), libMesh::RBEvaluation::get_n_basis_functions(), libMesh::RBConstruction::get_Nmax(), libMesh::RBConstruction::get_preevaluate_thetas_flag(), libMesh::RBConstruction::get_rb_evaluation(), libMesh::RBEvaluation::greedy_param_list, libMesh::RBConstruction::greedy_termination_test(), libMesh::RBParametrized::initialize_parameters(), libMesh::out, libMesh::RBConstruction::preevaluate_thetas(), libMesh::RBParametrized::print_parameters(), libMesh::Real, libMesh::RBEvaluation::resize_data_structures(), libMesh::RBConstruction::skip_residual_in_train_reduced_basis, libMesh::RBConstruction::truth_solve(), libMesh::RBConstruction::update_greedy_param_list(), libMesh::RBConstruction::update_residual_terms(), libMesh::RBConstruction::update_system(), and libMesh::RBConstruction::use_empty_rb_solve_in_greedy.

Referenced by libMesh::RBConstruction::train_reduced_basis().

◆ train_reduced_basis_with_POD()

void libMesh::RBConstruction::train_reduced_basis_with_POD ( )
inherited

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.

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}
numeric_index_type get_n_training_samples() const
Get the number of global training samples.
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...
boost::multiprecision::float128 real(const boost::multiprecision::float128 in)

References libMesh::RBConstructionBase< LinearImplicitSystem >::_normalize_solution_snapshots, libMesh::RBEvaluation::basis_functions, libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), libMesh::RBConstruction::delta_N, libMesh::DenseMatrix< T >::el(), libMesh::RBEvaluation::get_n_basis_functions(), libMesh::RBParametrized::get_n_params(), libMesh::RBConstructionBase< LinearImplicitSystem >::get_n_training_samples(), libMesh::RBConstruction::get_Nmax(), libMesh::RBConstruction::get_non_dirichlet_inner_product_matrix_if_avail(), libMesh::RBConstruction::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::out, libMesh::PARALLEL, std::real(), libMesh::Real, libMesh::RBConstruction::recompute_all_residual_terms(), libMesh::RBConstruction::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(), libMesh::RBConstruction::truth_solve(), libMesh::RBConstruction::update_system(), and libMesh::SparseMatrix< T >::vector_mult().

Referenced by libMesh::RBConstruction::train_reduced_basis().

◆ truth_assembly()

void TransientRBConstruction::truth_assembly ( )
overridevirtual

Assemble the truth system in the transient linear case.

Reimplemented from libMesh::RBConstruction.

Definition at line 400 of file transient_rb_construction.C.

401{
402 LOG_SCOPE("truth_assembly()", "TransientRBConstruction");
403
404 this->matrix->close();
405
406 this->matrix->zero();
407 this->rhs->zero();
408
409 const RBParameters & mu = get_parameters();
410
411 TransientRBThetaExpansion & trans_theta_expansion =
412 cast_ref<TransientRBThetaExpansion &>(get_rb_theta_expansion());
413
414 const unsigned int Q_a = trans_theta_expansion.get_n_A_terms();
415 const unsigned int Q_f = trans_theta_expansion.get_n_F_terms();
416
417 const Real dt = get_delta_t();
418 const Real euler_theta = get_euler_theta();
419
420 {
421 // We should have already assembled the matrices
422 // and vectors in the affine expansion, so
423 // just use them
424
427
428 std::unique_ptr<NumericVector<Number>> temp_vec = NumericVector<Number>::build(this->comm());
429 temp_vec->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
430
431 for (unsigned int q_a=0; q_a<Q_a; q_a++)
432 {
433 matrix->add(euler_theta*trans_theta_expansion.eval_A_theta(q_a,mu), *get_Aq(q_a));
434
435 get_Aq(q_a)->vector_mult(*temp_vec, *current_local_solution);
436 temp_vec->scale( -(1.-euler_theta)*trans_theta_expansion.eval_A_theta(q_a,mu) );
437 rhs->add(*temp_vec);
438 }
439
440 for (unsigned int q_f=0; q_f<Q_f; q_f++)
441 {
442 *temp_vec = *get_Fq(q_f);
443 temp_vec->scale( get_control(get_time_step())*trans_theta_expansion.eval_F_theta(q_f,mu) );
444 rhs->add(*temp_vec);
445 }
446
447 }
448
449 this->matrix->close();
450 this->rhs->close();
451}
Real get_control(const unsigned int k) const
Get/set the RHS control.
void mass_matrix_scaled_matvec(Number scalar, NumericVector< Number > &dest, NumericVector< Number > &arg)
Perform a matrix-vector multiplication with the current mass matrix and store the result in dest.

References libMesh::SparseMatrix< T >::add(), libMesh::NumericVector< T >::add(), add_scaled_mass_matrix(), libMesh::NumericVector< T >::build(), libMesh::NumericVector< T >::close(), libMesh::SparseMatrix< T >::close(), libMesh::ParallelObject::comm(), libMesh::System::current_local_solution, libMesh::RBThetaExpansion::eval_A_theta(), libMesh::RBThetaExpansion::eval_F_theta(), libMesh::RBConstruction::get_Aq(), libMesh::RBTemporalDiscretization::get_control(), libMesh::RBTemporalDiscretization::get_delta_t(), libMesh::RBTemporalDiscretization::get_euler_theta(), libMesh::RBConstruction::get_Fq(), libMesh::RBThetaExpansion::get_n_A_terms(), libMesh::RBThetaExpansion::get_n_F_terms(), libMesh::RBParametrized::get_parameters(), libMesh::RBConstruction::get_rb_theta_expansion(), libMesh::RBTemporalDiscretization::get_time_step(), mass_matrix_scaled_matvec(), libMesh::ImplicitSystem::matrix, libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), libMesh::PARALLEL, libMesh::Real, libMesh::ExplicitSystem::rhs, libMesh::SparseMatrix< T >::vector_mult(), libMesh::NumericVector< T >::zero(), and libMesh::SparseMatrix< T >::zero().

Referenced by truth_solve().

◆ truth_solve()

Real TransientRBConstruction::truth_solve ( int  write_interval)
overridevirtual

Perform a truth solve at the current parameter.

Reimplemented from libMesh::RBConstruction.

Definition at line 516 of file transient_rb_construction.C.

517{
518 LOG_SCOPE("truth_solve()", "TransientRBConstruction");
519
520 const RBParameters & mu = get_parameters();
521 const unsigned int n_time_steps = get_n_time_steps();
522
523 // // NumericVector for computing true L2 error
524 // std::unique_ptr<NumericVector<Number>> temp = NumericVector<Number>::build();
525 // temp->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
526
527 // Apply initial condition again.
529 set_time_step(0);
530
531 // Now compute the truth outputs
532 for (unsigned int n=0; n<get_rb_theta_expansion().get_n_outputs(); n++)
533 {
534 truth_outputs_all_k[n][0] = 0.;
535 for (unsigned int q_l=0; q_l<get_rb_theta_expansion().get_n_output_terms(n); q_l++)
536 {
539 }
540 }
541
542 // Load initial projection error into temporal_data dense matrix
545
546 for (unsigned int time_level=1; time_level<=n_time_steps; time_level++)
547 {
548 set_time_step(time_level);
549
551
552 // We assume that the truth assembly has been attached to the system
554
555 // truth_assembly assembles into matrix and rhs, so use those for the solve
557
558 // The matrix doesn't change at each timestep, so we
559 // can set reuse_preconditioner == true
560 linear_solver->reuse_preconditioner(true);
561
563 {
565 }
566
567 // Now compute the truth outputs
568 for (unsigned int n=0; n<get_rb_theta_expansion().get_n_outputs(); n++)
569 {
570 truth_outputs_all_k[n][time_level] = 0.;
571 for (unsigned int q_l=0; q_l<get_rb_theta_expansion().get_n_output_terms(n); q_l++)
572 {
573 truth_outputs_all_k[n][time_level] +=
575 }
576 }
577
578 // load projection error into column _k of temporal_data matrix
581
582 if ((write_interval > 0) && (time_level%write_interval == 0))
583 {
584 libMesh::out << std::endl << "Truth solve, plotting time step " << time_level << std::endl;
585
586 std::ostringstream file_name;
587
588 file_name << "truth.e.";
589 file_name << std::setw(3)
590 << std::setprecision(0)
591 << std::setfill('0')
592 << std::right
593 << time_level;
594
595#ifdef LIBMESH_HAVE_EXODUS_API
596 ExodusII_IO(get_mesh()).write_equation_systems (file_name.str(),
597 this->get_equation_systems());
598#endif
599 }
600 }
601
602 // Set reuse_preconditioner back to false for subsequent solves.
603 linear_solver->reuse_preconditioner(false);
604
605 // Get the L2 norm of the truth solution at time-level _K
606 // Useful for normalizing our true error data
608 Real final_truth_L2_norm = libmesh_real(std::sqrt(inner_product_storage_vector->dot(*solution)));
609
610
611 return final_truth_L2_norm;
612}
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() override
Assemble the truth system in the transient linear case.
Number set_error_temporal_data()
Set column k (i.e.

References libMesh::RBConstruction::assert_convergence, libMesh::RBConstruction::check_convergence(), compute_truth_projection_error, libMesh::System::current_local_solution, libMesh::NumericVector< T >::dot(), libMesh::RBThetaExpansion::eval_output_theta(), libMesh::LinearImplicitSystem::get_linear_solver(), libMesh::System::get_mesh(), libMesh::RBThetaExpansion::get_n_output_terms(), libMesh::RBThetaExpansion::get_n_outputs(), libMesh::RBTemporalDiscretization::get_n_time_steps(), libMesh::RBConstruction::get_output_vector(), libMesh::RBParametrized::get_parameters(), libMesh::RBConstruction::get_rb_theta_expansion(), initialize_truth(), libMesh::RBConstructionBase< LinearImplicitSystem >::inner_product_storage_vector, L2_matrix, libMesh::libmesh_real(), libMesh::ImplicitSystem::linear_solver, libMesh::ImplicitSystem::matrix, libMesh::TransientSystem< RBConstruction >::old_local_solution, libMesh::out, libMesh::Real, libMesh::ExplicitSystem::rhs, set_error_temporal_data(), libMesh::RBTemporalDiscretization::set_time_step(), libMesh::System::solution, libMesh::RBConstruction::solve_for_matrix_and_rhs(), truth_assembly(), truth_outputs_all_k, and libMesh::ExodusII_IO::write_equation_systems().

◆ 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.

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}

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(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), LinearElasticityWithContact::compute_stresses(), compute_stresses(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::GMVIO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), DMlibMeshFunction(), DMlibMeshJacobian(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::CondensedEigenSystem::get_eigenpair(), initialize_truth(), libMesh::Euler2Solver::integrate_adjoint_refinement_error_estimate(), libMesh::EulerSolver::integrate_adjoint_refinement_error_estimate(), libMesh::NewtonSolver::line_search(), libMesh::RBConstruction::load_basis_function(), libMesh::RBConstruction::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::FileSolutionHistory::retrieve(), libMesh::MemorySolutionHistory::retrieve(), ParsedFEMFunctionTest::setUp(), libMesh::NewtonSolver::solve(), libMesh::ExplicitSystem::solve(), libMesh::LinearImplicitSystem::solve(), libMesh::NonlinearImplicitSystem::solve(), libMesh::OptimizationSystem::solve(), libMesh::ClawSystem::solve_conservation_law(), libMesh::RBConstruction::solve_for_matrix_and_rhs(), libMesh::DirectSolutionTransfer::transfer(), libMesh::MeshFunctionSolutionTransfer::transfer(), and update_current_local_solution().

◆ 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.

734{
735 parallel_object_only();
736
737 global_soln.resize (solution->size());
738
739 solution->localize (global_soln);
740}

References libMesh::System::solution.

Referenced by libMesh::ExactSolution::_compute_error(), libMesh::ExactErrorEstimator::estimate_error(), main(), and libMesh::InterMeshProjection::project_system_vectors().

◆ 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.

746{
747 parallel_object_only();
748
749 global_soln.resize (solution->size());
750
751 solution->localize_to_one (global_soln, dest_proc);
752}

References libMesh::System::solution.

◆ update_greedy_param_list()

void libMesh::RBConstruction::update_greedy_param_list ( )
protectedinherited

Update the list of Greedily chosen parameters with current_parameters.

Definition at line 1602 of file rb_construction.C.

1603{
1605}

References libMesh::RBParametrized::get_parameters(), libMesh::RBConstruction::get_rb_evaluation(), and libMesh::RBEvaluation::greedy_param_list.

Referenced by libMesh::RBConstruction::train_reduced_basis_with_greedy().

◆ update_RB_initial_condition_all_N()

void TransientRBConstruction::update_RB_initial_condition_all_N ( )

Compute the L2 projection of the initial condition onto the RB space for 1 <= N <= RB_size and store each projection in RB_initial_condition_matrix.

Definition at line 1101 of file transient_rb_construction.C.

1102{
1103 LOG_SCOPE("update_RB_initial_condition_all_N()", "TransientRBConstruction");
1104
1105 TransientRBEvaluation & trans_rb_eval = cast_ref<TransientRBEvaluation &>(get_rb_evaluation());
1106
1107 // Load the initial condition into the solution vector
1109
1110 std::unique_ptr<NumericVector<Number>> temp1 = NumericVector<Number>::build(this->comm());
1111 temp1->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
1112
1113 std::unique_ptr<NumericVector<Number>> temp2 = NumericVector<Number>::build(this->comm());
1114 temp2->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
1115
1116
1117 unsigned int RB_size = get_rb_evaluation().get_n_basis_functions();
1118
1119 // First compute the right-hand side vector for the L2 projection
1120 L2_matrix->vector_mult(*temp1, *solution);
1121
1122 for (unsigned int i=(RB_size-delta_N); i<RB_size; i++)
1123 {
1124 RB_ic_proj_rhs_all_N(i) = temp1->dot(get_rb_evaluation().get_basis_function(i));
1125 }
1126
1127
1128 // Now compute the projection for each N
1129 DenseMatrix<Number> RB_L2_matrix_N;
1130 DenseVector<Number> RB_rhs_N;
1131 for (unsigned int N=(RB_size-delta_N); N<RB_size; N++)
1132 {
1133 // We have to index here by N+1 since the loop index is zero-based.
1134 trans_rb_eval.RB_L2_matrix.get_principal_submatrix(N+1, RB_L2_matrix_N);
1135
1137
1138 DenseVector<Number> RB_ic_N(N+1);
1139
1140 // Now solve the linear system
1141 RB_L2_matrix_N.lu_solve(RB_rhs_N, RB_ic_N);
1142
1143 // Load RB_ic_N into RB_initial_condition_all_N
1144 trans_rb_eval.RB_initial_condition_all_N[N] = RB_ic_N;
1145
1146 // Compute the L2 error for the RB initial condition
1147 // This part is dependent on the truth space.
1148
1149 // load the RB solution into temp1
1150 temp1->zero();
1151 for (unsigned int i=0; i<N+1; i++)
1152 {
1153 temp1->add(RB_ic_N(i), get_rb_evaluation().get_basis_function(i));
1154 }
1155
1156 // subtract truth initial condition from RB_ic_N
1157 temp1->add(-1., *solution);
1158
1159 // Compute L2 norm error, i.e. sqrt(M(solution,solution))
1160 temp2->zero();
1161 L2_matrix->vector_mult(*temp2, *temp1);
1162
1163 trans_rb_eval.initial_L2_error_all_N[N] = libmesh_real(std::sqrt(temp2->dot(*temp1)));
1164 }
1165}
void get_principal_subvector(unsigned int sub_n, DenseVector< T > &dest) const
Puts the principal subvector of size sub_n (i.e.

References libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), libMesh::RBConstruction::delta_N, libMesh::DenseVector< T >::dot(), libMesh::RBEvaluation::get_n_basis_functions(), libMesh::DenseMatrix< T >::get_principal_submatrix(), libMesh::DenseVector< T >::get_principal_subvector(), libMesh::RBConstruction::get_rb_evaluation(), libMesh::TransientRBEvaluation::initial_L2_error_all_N, initialize_truth(), L2_matrix, libMesh::libmesh_real(), libMesh::DenseMatrix< T >::lu_solve(), libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), libMesh::PARALLEL, RB_ic_proj_rhs_all_N, libMesh::TransientRBEvaluation::RB_initial_condition_all_N, libMesh::TransientRBEvaluation::RB_L2_matrix, libMesh::System::solution, and libMesh::DenseVector< T >::zero().

Referenced by update_system().

◆ update_RB_system_matrices()

void TransientRBConstruction::update_RB_system_matrices ( )
overrideprotectedvirtual

Compute the reduced basis matrices for the current basis.

Reimplemented from libMesh::RBConstruction.

Definition at line 908 of file transient_rb_construction.C.

909{
910 LOG_SCOPE("update_RB_system_matrices()", "TransientRBConstruction");
911
913
914 TransientRBEvaluation & trans_rb_eval = cast_ref<TransientRBEvaluation &>(get_rb_evaluation());
915
916 TransientRBThetaExpansion & trans_theta_expansion =
917 cast_ref<TransientRBThetaExpansion &>(get_rb_theta_expansion());
918 const unsigned int Q_m = trans_theta_expansion.get_n_M_terms();
919
920 unsigned int RB_size = get_rb_evaluation().get_n_basis_functions();
921
922 std::unique_ptr<NumericVector<Number>> temp = NumericVector<Number>::build(this->comm());
923 temp->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
924
925 for (unsigned int i=(RB_size-delta_N); i<RB_size; i++)
926 {
927 for (unsigned int j=0; j<RB_size; j++)
928 {
929 // Compute reduced L2 matrix
930 temp->zero();
931 L2_matrix->vector_mult(*temp, get_rb_evaluation().get_basis_function(j));
932
934 trans_rb_eval.RB_L2_matrix(i,j) = value;
935 if (i!=j)
936 {
937 // The L2 matrix is assumed
938 // to be symmetric
939 trans_rb_eval.RB_L2_matrix(j,i) = value;
940 }
941
942 for (unsigned int q_m=0; q_m<Q_m; q_m++)
943 {
944 // Compute reduced M_q matrix
945 temp->zero();
946 get_M_q(q_m)->vector_mult(*temp, get_rb_evaluation().get_basis_function(j));
947
948 value = (get_rb_evaluation().get_basis_function(i)).dot(*temp);
949 trans_rb_eval.RB_M_q_vector[q_m](i,j) = value;
950
951 if (i!=j)
952 {
953 // Each mass matrix term is assumed
954 // to be symmetric
955 trans_rb_eval.RB_M_q_vector[q_m](j,i) = value;
956 }
957 }
958
959 }
960 }
961}
virtual void update_RB_system_matrices()
Compute the reduced basis matrices for the current basis.

References libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), libMesh::RBConstruction::delta_N, libMesh::NumericVector< T >::dot(), libMesh::RBEvaluation::get_basis_function(), get_M_q(), libMesh::RBEvaluation::get_n_basis_functions(), libMesh::TransientRBThetaExpansion::get_n_M_terms(), libMesh::RBConstruction::get_rb_evaluation(), libMesh::RBConstruction::get_rb_theta_expansion(), L2_matrix, libMesh::System::n_dofs(), libMesh::System::n_local_dofs(), libMesh::PARALLEL, libMesh::TransientRBEvaluation::RB_L2_matrix, libMesh::TransientRBEvaluation::RB_M_q_vector, libMesh::RBConstruction::update_RB_system_matrices(), value, libMesh::SparseMatrix< T >::vector_mult(), and libMesh::DenseMatrix< T >::zero().

◆ update_residual_terms()

void TransientRBConstruction::update_residual_terms ( bool  compute_inner_products)
overrideprotectedvirtual

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

Reimplemented from libMesh::RBConstruction.

Definition at line 966 of file transient_rb_construction.C.

967{
968 LOG_SCOPE("update_residual_terms()", "TransientRBConstruction");
969
970 Parent::update_residual_terms(compute_inner_products);
971
972 TransientRBEvaluation & trans_rb_eval = cast_ref<TransientRBEvaluation &>(get_rb_evaluation());
973
974 TransientRBThetaExpansion & trans_theta_expansion =
975 cast_ref<TransientRBThetaExpansion &>(get_rb_theta_expansion());
976
977 const unsigned int Q_m = trans_theta_expansion.get_n_M_terms();
978 const unsigned int Q_a = trans_theta_expansion.get_n_A_terms();
979 const unsigned int Q_f = trans_theta_expansion.get_n_F_terms();
980
981 unsigned int RB_size = get_rb_evaluation().get_n_basis_functions();
982
983 for (unsigned int q_m=0; q_m<Q_m; q_m++)
984 {
985 for (unsigned int i=(RB_size-delta_N); i<RB_size; i++)
986 {
987 // Initialize the vectors when we need them
988 if (!trans_rb_eval.M_q_representor[q_m][i])
989 {
990 trans_rb_eval.M_q_representor[q_m][i] = NumericVector<Number>::build(this->comm());
991 trans_rb_eval.M_q_representor[q_m][i]->init (this->n_dofs(), this->n_local_dofs(), false, PARALLEL);
992 }
993
994 libmesh_assert(trans_rb_eval.M_q_representor[q_m][i]->size() == this->n_dofs() &&
995 trans_rb_eval.M_q_representor[q_m][i]->local_size() == this->n_local_dofs() );
996
997 rhs->zero();
998 M_q_vector[q_m]->vector_mult(*rhs, get_rb_evaluation().get_basis_function(i));
999
1000 if (!is_quiet())
1001 libMesh::out << "Starting solve i="
1002 << i << " in TransientRBConstruction::update_residual_terms() at "
1003 << Utility::get_timestamp() << std::endl;
1004
1006
1009
1010 if (!is_quiet())
1011 {
1012 libMesh::out << "Finished solve i="
1013 << i << " in TransientRBConstruction::update_residual_terms() at "
1014 << Utility::get_timestamp() << std::endl;
1015
1017 << " iterations, final residual "
1018 << this->final_linear_residual() << std::endl;
1019 }
1020
1021 *trans_rb_eval.M_q_representor[q_m][i] = *solution;
1022 }
1023 }
1024
1025 // Now compute and store the inner products if requested
1026 if (compute_inner_products)
1027 {
1028 for (unsigned int q_f=0; q_f<Q_f; q_f++)
1029 {
1031
1032 for (unsigned int i=(RB_size-delta_N); i<RB_size; i++)
1033 {
1034 for (unsigned int q_m=0; q_m<Q_m; q_m++)
1035 {
1036 trans_rb_eval.Fq_Mq_representor_innerprods[q_f][q_m][i] =
1037 trans_rb_eval.M_q_representor[q_m][i]->dot(*inner_product_storage_vector);
1038 } // end for q_m
1039 } // end for i
1040 } // end for q_f
1041
1042 unsigned int q=0;
1043 for (unsigned int q_m1=0; q_m1<Q_m; q_m1++)
1044 {
1045 for (unsigned int q_m2=q_m1; q_m2<Q_m; q_m2++)
1046 {
1047 for (unsigned int i=(RB_size-delta_N); i<RB_size; i++)
1048 {
1049 for (unsigned int j=0; j<RB_size; j++)
1050 {
1052
1053 trans_rb_eval.Mq_Mq_representor_innerprods[q][i][j] =
1054 trans_rb_eval.M_q_representor[q_m1][i]->dot(*inner_product_storage_vector);
1055
1056 if (i != j)
1057 {
1059 *trans_rb_eval.M_q_representor[q_m2][i]);
1060
1061 trans_rb_eval.Mq_Mq_representor_innerprods[q][j][i] =
1062 trans_rb_eval.M_q_representor[q_m1][j]->dot(*inner_product_storage_vector);
1063 }
1064 } // end for j
1065 } // end for i
1066 q++;
1067 } // end for q_m2
1068 } // end for q_m1
1069
1070
1071 for (unsigned int i=(RB_size-delta_N); i<RB_size; i++)
1072 {
1073 for (unsigned int j=0; j<RB_size; j++)
1074 {
1075 for (unsigned int q_a=0; q_a<Q_a; q_a++)
1076 {
1077 for (unsigned int q_m=0; q_m<Q_m; q_m++)
1078 {
1080 *trans_rb_eval.M_q_representor[q_m][j]);
1081
1082 trans_rb_eval.Aq_Mq_representor_innerprods[q_a][q_m][i][j] =
1083 trans_rb_eval.Aq_representor[q_a][i]->dot(*inner_product_storage_vector);
1084
1085 if (i != j)
1086 {
1088 *trans_rb_eval.M_q_representor[q_m][i]);
1089
1090 trans_rb_eval.Aq_Mq_representor_innerprods[q_a][q_m][j][i] =
1091 trans_rb_eval.Aq_representor[q_a][j]->dot(*inner_product_storage_vector);
1092 }
1093 } // end for q_m
1094 } // end for q_a
1095 } // end for j
1096 } // end for i
1097 } // end if (compute_inner_products)
1098}

References libMesh::TransientRBEvaluation::Aq_Mq_representor_innerprods, libMesh::RBEvaluation::Aq_representor, libMesh::RBConstruction::assert_convergence, libMesh::NumericVector< T >::build(), libMesh::RBConstruction::check_convergence(), libMesh::ParallelObject::comm(), libMesh::RBConstruction::delta_N, libMesh::LinearImplicitSystem::final_linear_residual(), libMesh::TransientRBEvaluation::Fq_Mq_representor_innerprods, libMesh::RBConstruction::Fq_representor, libMesh::RBThetaExpansion::get_n_A_terms(), libMesh::RBEvaluation::get_n_basis_functions(), libMesh::RBThetaExpansion::get_n_F_terms(), libMesh::TransientRBThetaExpansion::get_n_M_terms(), libMesh::RBConstruction::get_non_dirichlet_inner_product_matrix_if_avail(), libMesh::RBConstruction::get_rb_evaluation(), libMesh::RBConstruction::get_rb_theta_expansion(), libMesh::Utility::get_timestamp(), libMesh::RBConstruction::inner_product_matrix, libMesh::RBConstruction::inner_product_solver, libMesh::RBConstructionBase< LinearImplicitSystem >::inner_product_storage_vector, libMesh::RBConstructionBase< LinearImplicitSystem >::is_quiet(), libMesh::libmesh_assert(), libMesh::TransientRBEvaluation::M_q_representor, M_q_vector, libMesh::TransientRBEvaluation::Mq_Mq_representor_innerprods, libMesh::System::n_dofs(), libMesh::LinearImplicitSystem::n_linear_iterations(), libMesh::System::n_local_dofs(), libMesh::out, libMesh::PARALLEL, libMesh::ExplicitSystem::rhs, libMesh::System::solution, libMesh::RBConstruction::solve_for_matrix_and_rhs(), libMesh::RBConstruction::update_residual_terms(), libMesh::SparseMatrix< T >::vector_mult(), and libMesh::NumericVector< T >::zero().

◆ update_system()

void TransientRBConstruction::update_system ( )
overrideprotectedvirtual

Update the system after enriching the RB space.

Reimplemented from libMesh::RBConstruction.

Definition at line 867 of file transient_rb_construction.C.

868{
869 // If delta_N is set to zero, there is nothing to update
870 if (get_delta_N() == 0)
871 return;
872
874
875 libMesh::out << "Updating RB initial conditions" << std::endl;
877}
void update_RB_initial_condition_all_N()
Compute the L2 projection of the initial condition onto the RB space for 1 <= N <= RB_size and store ...

References libMesh::RBConstruction::get_delta_N(), libMesh::out, update_RB_initial_condition_all_N(), and libMesh::RBConstruction::update_system().

Referenced by add_IC_to_RB_space(), and enrich_RB_space().

◆ 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 2109 of file system.C.

2110{
2111 // Call the user-provided assembly function,
2112 // if it was provided
2113 if (_assemble_system_function != nullptr)
2115
2116 // ...or the user-provided assembly object.
2117 else if (_assemble_system_object != nullptr)
2119}
virtual void assemble()=0
Assembly function.

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

◆ 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 2123 of file system.C.

2124{
2125 // Call the user-provided constraint function,
2126 // if it was provided
2127 if (_constrain_system_function!= nullptr)
2129
2130 // ...or the user-provided constraint object.
2131 else if (_constrain_system_object != nullptr)
2133}
virtual void constrain()=0
Constraint function.

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

◆ 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 2095 of file system.C.

2096{
2097 // Call the user-provided initialization function,
2098 // if it was provided
2099 if (_init_system_function != nullptr)
2101
2102 // ...or the user-provided initialization object.
2103 else if (_init_system_object != nullptr)
2105}
virtual void initialize()=0
Initialization function.

Referenced by libMesh::NewmarkSystem::initial_conditions(), and libMesh::System::reinit_mesh().

◆ 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 2137 of file system.C.

2138{
2139 // Call the user-provided quantity of interest function,
2140 // if it was provided
2141 if (_qoi_evaluate_function != nullptr)
2142 this->_qoi_evaluate_function(_equation_systems, this->name(), qoi_indices);
2143
2144 // ...or the user-provided QOI function object.
2145 else if (_qoi_evaluate_object != nullptr)
2146 this->_qoi_evaluate_object->qoi(qoi_indices);
2147}
virtual void qoi(const QoISet &qoi_indices)=0
Quantity of interest function.

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

◆ 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 2151 of file system.C.

2154{
2155 // Call the user-provided quantity of interest derivative,
2156 // if it was provided
2157 if (_qoi_evaluate_derivative_function != nullptr)
2159 (_equation_systems, this->name(), qoi_indices, include_liftfunc,
2160 apply_constraints);
2161
2162 // ...or the user-provided QOI derivative function object.
2163 else if (_qoi_evaluate_derivative_object != nullptr)
2165 (qoi_indices, include_liftfunc, apply_constraints);
2166}
virtual void qoi_derivative(const QoISet &qoi_indices, bool include_liftfunc, bool apply_constraints)=0
Quantity of interest derivative function.

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

◆ variable()

const Variable & libMesh::System::variable ( unsigned int  var) const
inherited

Return a constant reference to Variable var.

Definition at line 2704 of file system.C.

2705{
2706 return this->get_dof_map().variable(i);
2707}

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(), main(), libMesh::DifferentiablePhysics::nonlocal_mass_residual(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SortAndCopy::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectInteriors::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::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().

◆ variable_group()

const VariableGroup & libMesh::System::variable_group ( unsigned int  vg) const
inherited

Return a constant reference to VariableGroup vg.

Definition at line 2709 of file system.C.

2710{
2711 return this->get_dof_map().variable_group(vg);
2712}
const VariableGroup & variable_group(const unsigned int c) const
Definition dof_map.h:2348

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

◆ 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.

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

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(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), LinearElasticityWithContact::compute_stresses(), compute_stresses(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::GMVIO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::ExactErrorEstimator::estimate_error(), fe_assembly(), libMesh::ExactErrorEstimator::find_squared_element_error(), AssemblyPointLoadX::get_nodal_rhs_values(), AssemblyPointLoadY::get_nodal_rhs_values(), AssemblyPointLoadZ::get_nodal_rhs_values(), CoupledSystemQoI::init_context(), LargeDeformationElasticity::jacobian(), libMesh::HDGProblem::jacobian(), line_print(), main(), LinearElasticityWithContact::move_mesh(), OverlappingCouplingFunctor::operator()(), libMesh::System::read_header(), LargeDeformationElasticity::residual(), libMesh::HDGProblem::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().

◆ 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.

2476{
2477 return variable_scalar_number(this->variable_number(var), component);
2478}

References libMesh::System::variable_number(), and libMesh::System::variable_scalar_number().

Referenced by libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::ExactErrorEstimator::find_squared_element_error(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectInteriors::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()(), and libMesh::System::variable_scalar_number().

◆ 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 2715 of file system.C.

2717{
2718 return this->get_dof_map().variable_scalar_number(var_num, component);
2719}
unsigned int variable_scalar_number(unsigned int var_num, unsigned int component) const
Definition dof_map.h:2974

◆ 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 2721 of file system.C.

2722{
2723 return this->get_dof_map().variable_type(i);
2724}

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_shell(), assemble_stokes(), libMesh::FEMContext::attach_quadrature_rules(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::ExactSolution::compute_error(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::GMVIO::copy_nodal_solution(), libMesh::DGFEMContext::DGFEMContext(), libMesh::JumpErrorEstimator::estimate_error(), fe_assembly(), libMesh::FEMContext::find_hardest_fe_type(), libMesh::EquationSystems::find_variable_numbers_by_predicate(), form_functionA(), form_functionB(), form_matrixA(), libMesh::FEMSystem::init_context(), libMesh::FEMContext::init_internal_data(), OverlappingCouplingFunctor::operator()(), RationalMapTest< elem_type >::setUp(), FETestBase< order, family, elem_type, build_nx, CaseName >::setUp(), EquationSystemsTest::testBadVarNames(), FETest< order, family, elem_type, CaseName >::testCustomReinit(), FETest< order, family, elem_type, CaseName >::testFEInterface(), 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().

◆ 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 2726 of file system.C.

2727{
2728 return this->get_dof_map().variable_type(var);
2729}

◆ 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.

1161{
1162 const auto it = _vector_is_adjoint.find(vec_name);
1164 return it->second;
1165}

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

Referenced by libMesh::InterMeshProjection::project_system_vectors(), and libMesh::System::restrict_vectors().

◆ vector_name() [1/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.

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

References libMesh::System::_vectors, libMesh::NumericVector< T >::get(), libMesh::libmesh_assert(), libMesh::System::vectors_begin(), and libMesh::System::vectors_end().

◆ vector_name() [2/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.

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}

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

Referenced by libMesh::AdjointRefinementEstimator::estimate_error(), and main().

◆ 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.

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}

References libMesh::System::_vector_projections.

Referenced by libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::MemoryHistoryData::store_vectors(), SystemsTest::testAddVectorProjChange(), SystemsTest::testAddVectorTypeChange(), and SystemsTest::testPostInitAddVectorTypeChange().

◆ vectors_begin() [1/2]

System::vectors_iterator libMesh::System::vectors_begin ( )
inlineinherited

◆ 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.

2512{
2513 return _vectors.begin();
2514}

References libMesh::System::_vectors.

◆ vectors_end() [1/2]

System::vectors_iterator libMesh::System::vectors_end ( )
inlineinherited

◆ 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.

2524{
2525 return _vectors.end();
2526}

References libMesh::System::_vectors.

◆ 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.

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))
271 libmesh_assert(!this->get_dof_map().has_adjoint_dirichlet_boundaries(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))
382 this->get_dof_map().enforce_constraints_exactly
384 /* homogeneous = */ true);
385#endif
386
387 return totalrval;
388}
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.
virtual void get_transpose(SparseMatrix< T > &dest) const =0
Copies the transpose of the matrix into dest, which may be *this.
NumericVector< Number > & add_weighted_sensitivity_adjoint_solution(unsigned int i=0)
Definition system.C:1252

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

◆ 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.

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}
NumericVector< Number > & add_weighted_sensitivity_solution()
Definition system.C:1199

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

◆ write_discrete_parameter_values_to_file()

void libMesh::RBParametrized::write_discrete_parameter_values_to_file ( const std::string &  file_name,
const bool  write_binary_data 
)
privateinherited

Write out the discrete parameter values to file.

Definition at line 230 of file rb_parametrized.C.

232{
233 // write out the discrete parameters, if we have any
234 if (get_n_discrete_params() > 0)
235 {
236 // The writing mode: ENCODE for binary, WRITE for ASCII
237 XdrMODE mode = write_binary_data ? ENCODE : WRITE;
238
239 Xdr discrete_parameters_out(file_name, mode);
240 unsigned int n_discrete_params = get_n_discrete_params();
241 discrete_parameters_out << n_discrete_params;
242
243 // Note: the following loops are not candidates for structured
244 // bindings syntax because the Xdr APIs which they call are not
245 // defined for const references. We must therefore make copies
246 // to call these functions.
247 for (const auto & pr : get_discrete_parameter_values())
248 {
249 std::string param_name = pr.first;
250 auto n_discrete_values = cast_int<unsigned int>(pr.second.size());
251 discrete_parameters_out << param_name << n_discrete_values;
252
253 for (unsigned int i=0; i<n_discrete_values; i++)
254 {
255 Real discrete_value = pr.second[i];
256 discrete_parameters_out << discrete_value;
257 }
258 }
259 }
260}

References libMesh::ENCODE, libMesh::RBParametrized::get_discrete_parameter_values(), libMesh::RBParametrized::get_n_discrete_params(), libMesh::Real, and libMesh::WRITE.

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

◆ 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 1117 of file system_io.C.

1120{
1154 libmesh_assert (io.writing());
1155
1156
1157 // Only write the header information
1158 // if we are processor 0.
1159 if (this->get_mesh().processor_id() != 0)
1160 return;
1161
1162 std::string comment;
1163
1164 // 5.)
1165 // Write the number of variables in the system
1166
1167 {
1168 // set up the comment
1169 comment = "# No. of Variables in System \"";
1170 comment += this->name();
1171 comment += "\"";
1172
1173 unsigned int nv = this->n_vars();
1174 io.data (nv, comment);
1175 }
1176
1177
1178 for (auto var : make_range(this->n_vars()))
1179 {
1180 // 6.)
1181 // Write the name of the var-th variable
1182 {
1183 // set up the comment
1184 comment = "# Name, Variable No. ";
1185 comment += std::to_string(var);
1186 comment += ", System \"";
1187 comment += this->name();
1188 comment += "\"";
1189
1190 std::string var_name = this->variable_name(var);
1191 io.data (var_name, comment);
1192 }
1193
1194 // 6.1.) Variable subdomains
1195 {
1196 // set up the comment
1197 comment = "# Subdomains, Variable \"";
1198 comment += this->variable_name(var);
1199 comment += "\", System \"";
1200 comment += this->name();
1201 comment += "\"";
1202
1203 const std::set<subdomain_id_type> & domains = this->variable(var).active_subdomains();
1204 std::vector<subdomain_id_type> domain_array;
1205 domain_array.assign(domains.begin(), domains.end());
1206 io.data (domain_array, comment);
1207 }
1208
1209 // 7.)
1210 // Write the approximation order of the var-th variable
1211 // in this system
1212 {
1213 // set up the comment
1214 comment = "# Approximation Order, Variable \"";
1215 comment += this->variable_name(var);
1216 comment += "\", System \"";
1217 comment += this->name();
1218 comment += "\"";
1219
1220 int order = static_cast<int>(this->variable_type(var).order);
1221 io.data (order, comment);
1222 }
1223
1224
1225#ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
1226
1227 // do the same for radial_order
1228 {
1229 comment = "# Radial Approximation Order, Variable \"";
1230 comment += this->variable_name(var);
1231 comment += "\", System \"";
1232 comment += this->name();
1233 comment += "\"";
1234
1235 int rad_order = static_cast<int>(this->variable_type(var).radial_order);
1236 io.data (rad_order, comment);
1237 }
1238
1239#endif
1240
1241 // Write the Finite Element type of the var-th variable
1242 // in this System
1243 {
1244 // set up the comment
1245 comment = "# FE Family, Variable \"";
1246 comment += this->variable_name(var);
1247 comment += "\", System \"";
1248 comment += this->name();
1249 comment += "\"";
1250
1251 const FEType & type = this->variable_type(var);
1252 int fam = static_cast<int>(type.family);
1253 io.data (fam, comment);
1254
1255#ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
1256
1257 comment = "# Radial FE Family, Variable \"";
1258 comment += this->variable_name(var);
1259 comment += "\", System \"";
1260 comment += this->name();
1261 comment += "\"";
1262
1263 int radial_fam = static_cast<int>(type.radial_family);
1264 io.data (radial_fam, comment);
1265
1266 comment = "# Infinite Mapping Type, Variable \"";
1267 comment += this->variable_name(var);
1268 comment += "\", System \"";
1269 comment += this->name();
1270 comment += "\"";
1271
1272 int i_map = static_cast<int>(type.inf_map);
1273 io.data (i_map, comment);
1274#endif
1275 }
1276 } // end of the variable loop
1277
1278 // 8.)
1279 // Write the number of additional vectors in the System.
1280 // If write_additional_data==false, then write zero for
1281 // the number of additional vectors.
1282 {
1283 {
1284 // set up the comment
1285 comment = "# No. of Additional Vectors, System \"";
1286 comment += this->name();
1287 comment += "\"";
1288
1289 unsigned int nvecs = write_additional_data ? this->n_vectors () : 0;
1290 io.data (nvecs, comment);
1291 }
1292
1293 if (write_additional_data)
1294 {
1295 unsigned int cnt=0;
1296 for (const auto & [vec_name, vec] : _vectors)
1297 {
1298 // 9.)
1299 // write the name of the cnt-th additional vector
1300 const std::string dth_vector = std::to_string(cnt++)+"th vector";
1301 comment = "# Name of " + dth_vector;
1302 std::string nonconst_vec_name = vec_name; // Stupid XDR API
1303
1304 io.data (nonconst_vec_name, comment);
1305 int vec_projection = _vector_projections.at(vec_name);
1306 comment = "# Whether to do projections for " + dth_vector;
1307 io.data (vec_projection, comment);
1308 int vec_type = vec->type();
1309 comment = "# Parallel type of " + dth_vector;
1310 io.data (vec_type, comment);
1311 }
1312 }
1313 }
1314}
OrderWrapper radial_order
The approximation order in radial direction of the infinite element.
Definition fe_type.h:263
const std::string & variable_name(const unsigned int i) const
Definition system.C:2679

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

◆ 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 1318 of file system_io.C.

1320{
1340 // PerfLog pl("IO Performance",false);
1341 // pl.push("write_parallel_data");
1342 // std::size_t total_written_size = 0;
1343
1344 std::string comment;
1345
1346 libmesh_assert (io.writing());
1347
1348 std::vector<Number> io_buffer; io_buffer.reserve(this->solution->local_size());
1349
1350 // build the ordered nodes and element maps.
1351 // when writing/reading parallel files we need to iterate
1352 // over our nodes/elements in order of increasing global id().
1353 // however, this is not guaranteed to be ordering we obtain
1354 // by using the node_iterators/element_iterators directly.
1355 // so build a set, sorted by id(), that provides the ordering.
1356 // further, for memory economy build the set but then transfer
1357 // its contents to vectors, which will be sorted.
1358 std::vector<const DofObject *> ordered_nodes, ordered_elements;
1359 {
1360 std::set<const DofObject *, CompareDofObjectsByID>
1361 ordered_nodes_set (this->get_mesh().local_nodes_begin(),
1362 this->get_mesh().local_nodes_end());
1363
1364 ordered_nodes.insert(ordered_nodes.end(),
1365 ordered_nodes_set.begin(),
1366 ordered_nodes_set.end());
1367 }
1368 {
1369 std::set<const DofObject *, CompareDofObjectsByID>
1370 ordered_elements_set (this->get_mesh().local_elements_begin(),
1371 this->get_mesh().local_elements_end());
1372
1373 ordered_elements.insert(ordered_elements.end(),
1374 ordered_elements_set.begin(),
1375 ordered_elements_set.end());
1376 }
1377
1378 const unsigned int sys_num = this->number();
1379 const unsigned int nv = this->n_vars();
1380
1381 // Loop over each non-SCALAR variable and each node, and write out the value.
1382 for (unsigned int var=0; var<nv; var++)
1383 if (this->variable(var).type().family != SCALAR)
1384 {
1385 // First write the node DOF values
1386 for (const auto & node : ordered_nodes)
1387 for (auto comp : make_range(node->n_comp(sys_num,var)))
1388 {
1389 libmesh_assert_not_equal_to (node->dof_number(sys_num, var, comp),
1391
1392 io_buffer.push_back((*this->solution)(node->dof_number(sys_num, var, comp)));
1393 }
1394
1395 // Then write the element DOF values
1396 for (const auto & elem : ordered_elements)
1397 for (auto comp : make_range(elem->n_comp(sys_num,var)))
1398 {
1399 libmesh_assert_not_equal_to (elem->dof_number(sys_num, var, comp),
1401
1402 io_buffer.push_back((*this->solution)(elem->dof_number(sys_num, var, comp)));
1403 }
1404 }
1405
1406 // Finally, write the SCALAR data on the last processor
1407 for (auto var : make_range(this->n_vars()))
1408 if (this->variable(var).type().family == SCALAR)
1409 {
1410 if (this->processor_id() == (this->n_processors()-1))
1411 {
1412 const DofMap & dof_map = this->get_dof_map();
1413 std::vector<dof_id_type> SCALAR_dofs;
1414 dof_map.SCALAR_dof_indices(SCALAR_dofs, var);
1415
1416 for (auto dof : SCALAR_dofs)
1417 io_buffer.push_back((*this->solution)(dof));
1418 }
1419 }
1420
1421 // 9.)
1422 //
1423 // Actually write the reordered solution vector
1424 // for the ith system to disk
1425
1426 // set up the comment
1427 {
1428 comment = "# System \"";
1429 comment += this->name();
1430 comment += "\" Solution Vector";
1431 }
1432
1433 io.data (io_buffer, comment);
1434
1435 // total_written_size += io_buffer.size();
1436
1437 // Only write additional vectors if wanted
1438 if (write_additional_data)
1439 {
1440 for (auto & [vec_name, vec] : _vectors)
1441 {
1442 io_buffer.clear();
1443 io_buffer.reserve(vec->local_size());
1444
1445 // Loop over each non-SCALAR variable and each node, and write out the value.
1446 for (unsigned int var=0; var<nv; var++)
1447 if (this->variable(var).type().family != SCALAR)
1448 {
1449 // First write the node DOF values
1450 for (const auto & node : ordered_nodes)
1451 for (auto comp : make_range(node->n_comp(sys_num,var)))
1452 {
1453 libmesh_assert_not_equal_to (node->dof_number(sys_num, var, comp),
1455
1456 io_buffer.push_back((*vec)(node->dof_number(sys_num, var, comp)));
1457 }
1458
1459 // Then write the element DOF values
1460 for (const auto & elem : ordered_elements)
1461 for (auto comp : make_range(elem->n_comp(sys_num,var)))
1462 {
1463 libmesh_assert_not_equal_to (elem->dof_number(sys_num, var, comp),
1465
1466 io_buffer.push_back((*vec)(elem->dof_number(sys_num, var, comp)));
1467 }
1468 }
1469
1470 // Finally, write the SCALAR data on the last processor
1471 for (auto var : make_range(this->n_vars()))
1472 if (this->variable(var).type().family == SCALAR)
1473 {
1474 if (this->processor_id() == (this->n_processors()-1))
1475 {
1476 const DofMap & dof_map = this->get_dof_map();
1477 std::vector<dof_id_type> SCALAR_dofs;
1478 dof_map.SCALAR_dof_indices(SCALAR_dofs, var);
1479
1480 for (auto dof : SCALAR_dofs)
1481 io_buffer.push_back((*vec)(dof));
1482 }
1483 }
1484
1485 // 10.)
1486 //
1487 // Actually write the reordered additional vector
1488 // for this system to disk
1489
1490 // set up the comment
1491 {
1492 comment = "# System \"";
1493 comment += this->name();
1494 comment += "\" Additional Vector \"";
1495 comment += vec_name;
1496 comment += "\"";
1497 }
1498
1499 io.data (io_buffer, comment);
1500
1501 // total_written_size += io_buffer.size();
1502 }
1503 }
1504
1505 // const Real
1506 // dt = pl.get_elapsed_time(),
1507 // rate = total_written_size*sizeof(Number)/dt;
1508
1509 // libMesh::err << "Write " << total_written_size << " \"Number\" values\n"
1510 // << " Elapsed time = " << dt << '\n'
1511 // << " Rate = " << rate/1.e6 << "(MB/sec)\n\n";
1512
1513 // pl.pop("write_parallel_data");
1514}

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

◆ 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.

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_parameter_ranges_to_file(const std::string &file_name, const bool write_binary)
Write out the parameter ranges to file.
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.

References libMesh::RBParametrized::write_discrete_parameter_values_to_file(), and libMesh::RBParametrized::write_parameter_ranges_to_file().

Referenced by libMesh::RBEvaluation::legacy_write_offline_data_to_files(), and libMesh::RBSCMEvaluation::legacy_write_offline_data_to_files().

◆ write_parameter_ranges_to_file()

void libMesh::RBParametrized::write_parameter_ranges_to_file ( const std::string &  file_name,
const bool  write_binary 
)
privateinherited

Write out the parameter ranges to file.

Definition at line 193 of file rb_parametrized.C.

195{
196 // The writing mode: ENCODE for binary, WRITE for ASCII
197 XdrMODE mode = write_binary_data ? ENCODE : WRITE;
198
199 // Write out the parameter ranges
200 Xdr parameter_ranges_out(file_name, mode);
201 unsigned int n_continuous_params = get_n_continuous_params();
202 parameter_ranges_out << n_continuous_params;
203
204 // Note: the following loops are not candidates for structured
205 // bindings syntax because the Xdr APIs which they call are not
206 // defined for const references. We must therefore make copies to
207 // call these functions.
208 for (const auto & pr : get_parameters_min())
209 {
210 std::string param_name = pr.first;
211 if (!is_discrete_parameter(param_name))
212 {
213 Real param_value = get_parameters_min().get_value(param_name);
214 parameter_ranges_out << param_name << param_value;
215 }
216 }
217 for (const auto & pr : get_parameters_max())
218 {
219 std::string param_name = pr.first;
220 if (!is_discrete_parameter(param_name))
221 {
222 Real param_value = get_parameters_max().get_value(param_name);
223 parameter_ranges_out << param_name << param_value;
224 }
225 }
226
227 parameter_ranges_out.close();
228}
unsigned int get_n_continuous_params() const
Get the number of continuous parameters.

References libMesh::Xdr::close(), libMesh::ENCODE, libMesh::RBParametrized::get_n_continuous_params(), libMesh::RBParametrized::get_parameters_max(), libMesh::RBParametrized::get_parameters_min(), libMesh::RBParameters::get_value(), libMesh::RBParametrized::is_discrete_parameter(), libMesh::Real, and libMesh::WRITE.

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

◆ write_riesz_representors_to_files()

void TransientRBConstruction::write_riesz_representors_to_files ( const std::string &  riesz_representors_dir,
const bool  write_binary_residual_representors 
)
overridevirtual

Write out all the Riesz representor data to files.

Override to write out transient data too.

Reimplemented from libMesh::RBConstruction.

Definition at line 1244 of file transient_rb_construction.C.

1246{
1247 LOG_SCOPE("write_riesz_representors_to_files()", "TransientRBConstruction");
1248
1249 // Write out the M_q_representors. These are useful to have when restarting,
1250 // so you don't have to recompute them all over again. There should be
1251 // this->rb_eval->get_n_basis_functions() of these.
1252 libMesh::out << "Writing out the M_q_representors..." << std::endl;
1253
1254 std::ostringstream file_name;
1255 const std::string riesz_representor_suffix = (write_binary_residual_representors ? ".xdr" : ".dat");
1256
1257 TransientRBEvaluation & trans_rb_eval = cast_ref<TransientRBEvaluation &>(get_rb_evaluation());
1258
1259 const unsigned int istop = trans_rb_eval.get_n_basis_functions();
1260 const unsigned int istart = istop-get_delta_N();
1261
1262 for (std::size_t q=0; q<trans_rb_eval.M_q_representor.size(); ++q)
1263 for (unsigned int i=istart; i<istop; ++i)
1264 {
1265 libMesh::out << "Writing out M_q_representor[" << q << "][" << i << "]..." << std::endl;
1266 libmesh_assert(trans_rb_eval.M_q_representor[q][i]);
1267
1268 file_name.str(""); // reset filename
1269 file_name << riesz_representors_dir << "/M_q_representor" << i << riesz_representor_suffix;
1270
1271 {
1272 // No need to copy!
1273 //*solution = *(M_q_representor[q][i]);
1274 trans_rb_eval.M_q_representor[q][i]->swap(*solution);
1275
1276 Xdr mr_data(file_name.str(),
1277 write_binary_residual_representors ? ENCODE : WRITE);
1278
1279 write_serialized_data(mr_data, false);
1280
1281 // Synchronize before moving on
1282 this->comm().barrier();
1283
1284 // Swap back.
1285 trans_rb_eval.M_q_representor[q][i]->swap(*solution);
1286
1287 // TODO: bzip the resulting file? See $LIBMESH_DIR/src/mesh/unstructured_mesh.C
1288 // for the system call, be sure to do it only on one processor, etc.
1289 }
1290 }
1291}
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:1518

References libMesh::Parallel::Communicator::barrier(), libMesh::ParallelObject::comm(), libMesh::ENCODE, libMesh::RBConstruction::get_delta_N(), libMesh::RBEvaluation::get_n_basis_functions(), libMesh::RBConstruction::get_rb_evaluation(), libMesh::libmesh_assert(), libMesh::TransientRBEvaluation::M_q_representor, libMesh::out, libMesh::System::solution, libMesh::WRITE, and libMesh::System::write_serialized_data().

◆ write_SCALAR_dofs()

unsigned int libMesh::System::write_SCALAR_dofs ( const NumericVector< Number > &  vec,
const unsigned int  var,
Xdr io 
) const
privateinherited

Writes the SCALAR dofs associated with var to the stream io.

Returns
The number of values written.

Definition at line 1912 of file system_io.C.

1915{
1916 unsigned int written_length=0;
1917 std::vector<Number> vals; // The raw values for the local objects in the current block
1918 // Collect the SCALARs for the current variable
1919 if (this->processor_id() == (this->n_processors()-1))
1920 {
1921 const DofMap & dof_map = this->get_dof_map();
1922 std::vector<dof_id_type> SCALAR_dofs;
1923 dof_map.SCALAR_dof_indices(SCALAR_dofs, var);
1924 const unsigned int n_scalar_dofs = cast_int<unsigned int>
1925 (SCALAR_dofs.size());
1926
1927 for (unsigned int i=0; i<n_scalar_dofs; i++)
1928 {
1929 vals.push_back( vec(SCALAR_dofs[i]) );
1930 }
1931 }
1932
1933#ifdef LIBMESH_HAVE_MPI
1934 if (this->n_processors() > 1)
1935 {
1936 const Parallel::MessageTag val_tag =
1937 this->comm().get_unique_tag(1);
1938
1939 // Post the receive on processor 0
1940 if (this->processor_id() == 0)
1941 {
1942 this->comm().receive(this->n_processors()-1, vals, val_tag);
1943 }
1944
1945 // Send the data to processor 0
1946 if (this->processor_id() == (this->n_processors()-1))
1947 {
1948 this->comm().send(0, vals, val_tag);
1949 }
1950 }
1951#endif
1952
1953 // -------------------------------------------------------
1954 // Write the output on processor 0.
1955 if (this->processor_id() == 0)
1956 {
1957 const unsigned int vals_size =
1958 cast_int<unsigned int>(vals.size());
1959 io.data_stream (vals.data(), vals_size);
1960 written_length += vals_size;
1961 }
1962
1963 return written_length;
1964}

References libMesh::ParallelObject::comm(), libMesh::Xdr::data_stream(), libMesh::System::get_dof_map(), libMesh::Parallel::Communicator::get_unique_tag(), libMesh::ParallelObject::n_processors(), libMesh::ParallelObject::processor_id(), libMesh::Parallel::Communicator::receive(), libMesh::DofMap::SCALAR_dof_indices(), and libMesh::Parallel::Communicator::send().

Referenced by libMesh::System::write_serialized_vector(), and libMesh::System::write_serialized_vectors().

◆ write_serialized_blocked_dof_objects()

template<typename iterator_type >
std::size_t libMesh::System::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
privateinherited

Writes an output vector to the stream io for a set of DofObjects.

This method uses blocked output and is safe to call on a distributed memory-mesh.

Returns
The number of values written

Definition at line 1626 of file system_io.C.

1632{
1633 parallel_object_only();
1634
1635 //-------------------------------------------------------
1636 // General order: (IO format 0.7.4 & greater)
1637 //
1638 // for (objects ...)
1639 // for (vecs ....)
1640 // for (vars ....)
1641 // for (comps ...)
1642 //
1643 // where objects are nodes or elements, sorted to be
1644 // partition independent,
1645 // vecs are one or more *identically distributed* solution
1646 // coefficient vectors, vars are one or more variables
1647 // to write, and comps are all the components for said
1648 // vars on the object.
1649
1650 // We will write all variables unless requested otherwise.
1651 std::vector<unsigned int> vars_to_write(1, var_to_write);
1652
1653 if (var_to_write == libMesh::invalid_uint)
1654 {
1655 vars_to_write.clear(); vars_to_write.reserve(this->n_vars());
1656 for (auto var : make_range(this->n_vars()))
1657 vars_to_write.push_back(var);
1658 }
1659
1660 const dof_id_type io_blksize = cast_int<dof_id_type>
1661 (std::min(max_io_blksize, static_cast<std::size_t>(n_objs)));
1662
1663 const unsigned int
1664 sys_num = this->number(),
1665 num_vecs = cast_int<unsigned int>(vecs.size()),
1666 num_blks = cast_int<unsigned int>(std::ceil(static_cast<double>(n_objs)/
1667 static_cast<double>(io_blksize)));
1668
1669 // libMesh::out << "io_blksize = " << io_blksize
1670 // << ", num_objects = " << n_objs
1671 // << ", num_blks = " << num_blks
1672 // << std::endl;
1673
1674 std::size_t written_length=0; // The numer of values written. This will be returned
1675 std::vector<std::vector<dof_id_type>> xfer_ids(num_blks); // The global IDs and # of components for the local objects in all blocks
1676 std::vector<std::vector<Number>> send_vals(num_blks); // The raw values for the local objects in all blocks
1677 std::vector<Parallel::Request>
1678 id_requests(num_blks), val_requests(num_blks); // send request handle for each block
1679 std::vector<Parallel::MessageTag>
1680 id_tags(num_blks), val_tags(num_blks); // tag number for each block
1681
1682 // ------------------------------------------------------
1683 // First pass - count the number of objects in each block
1684 // traverse all the objects and figure out which block they
1685 // will ultimately live in.
1686 std::vector<unsigned int>
1687 xfer_ids_size (num_blks,0),
1688 send_vals_size (num_blks,0);
1689
1690 for (iterator_type it=begin; it!=end; ++it)
1691 {
1692 const dof_id_type
1693 id = (*it)->id(),
1694 block = id/io_blksize;
1695
1696 libmesh_assert_less (block, num_blks);
1697
1698 xfer_ids_size[block] += 2; // for each object, we store its id, as well as the total number of components for all variables
1699
1700 unsigned int n_comp_tot=0;
1701
1702 for (const auto & var : vars_to_write)
1703 n_comp_tot += (*it)->n_comp(sys_num, var); // for each variable, we will store the nonzero components
1704
1705 send_vals_size[block] += n_comp_tot*num_vecs;
1706 }
1707
1708 //-----------------------------------------
1709 // Collect the values for all local objects,
1710 // binning them into 'blocks' that will be
1711 // sent to processor 0
1712 for (unsigned int blk=0; blk<num_blks; blk++)
1713 {
1714 // libMesh::out << "Writing object block " << blk << std::endl;
1715
1716 // Each processor should build up its transfer buffers for its
1717 // local objects in [first_object,last_object).
1718 const dof_id_type
1719 first_object = blk*io_blksize,
1720 last_object = std::min(cast_int<dof_id_type>((blk+1)*io_blksize), n_objs);
1721
1722 // convenience
1723 std::vector<dof_id_type> & ids (xfer_ids[blk]);
1724 std::vector<Number> & vals (send_vals[blk]);
1725
1726 // we now know the number of values we will store for each block,
1727 // so we can do efficient preallocation
1728 ids.clear(); ids.reserve (xfer_ids_size[blk]);
1729 vals.clear(); vals.reserve (send_vals_size[blk]);
1730
1731 if (send_vals_size[blk] != 0) // only send if we have nonzero components to write
1732 for (iterator_type it=begin; it!=end; ++it)
1733 if (((*it)->id() >= first_object) && // object in [first_object,last_object)
1734 ((*it)->id() < last_object))
1735 {
1736 ids.push_back((*it)->id());
1737
1738 // count the total number of nonzeros transferred for this object
1739 {
1740 unsigned int n_comp_tot=0;
1741
1742 for (const auto & var : vars_to_write)
1743 n_comp_tot += (*it)->n_comp(sys_num, var);
1744
1745 ids.push_back (n_comp_tot*num_vecs); // even if 0 - processor 0 has no way of knowing otherwise...
1746 }
1747
1748 // pack the values to send
1749 for (const auto & vec : vecs)
1750 for (const auto & var : vars_to_write)
1751 {
1752 const unsigned int n_comp = (*it)->n_comp(sys_num, var);
1753
1754 for (unsigned int comp=0; comp<n_comp; comp++)
1755 {
1756 libmesh_assert_greater_equal ((*it)->dof_number(sys_num, var, comp), vec->first_local_index());
1757 libmesh_assert_less ((*it)->dof_number(sys_num, var, comp), vec->last_local_index());
1758 vals.push_back((*vec)((*it)->dof_number(sys_num, var, comp)));
1759 }
1760 }
1761 }
1762
1763#ifdef LIBMESH_HAVE_MPI
1764 id_tags[blk] = this->comm().get_unique_tag(100*num_blks + blk);
1765 val_tags[blk] = this->comm().get_unique_tag(200*num_blks + blk);
1766
1767 // nonblocking send the data for this block
1768 this->comm().send (0, ids, id_requests[blk], id_tags[blk]);
1769 this->comm().send (0, vals, val_requests[blk], val_tags[blk]);
1770#endif
1771 }
1772
1773
1774 if (this->processor_id() == 0)
1775 {
1776 std::vector<std::vector<dof_id_type>> recv_ids (this->n_processors());
1777 std::vector<std::vector<Number>> recv_vals (this->n_processors());
1778 std::vector<unsigned int> obj_val_offsets; // map to traverse entry-wise rather than processor-wise
1779 std::vector<Number> output_vals; // The output buffer for the current block
1780
1781 // a ThreadedIO object to perform asynchronous file IO
1782 ThreadedIO<Number> threaded_io(io, output_vals);
1783 std::unique_ptr<Threads::Thread> async_io;
1784
1785 for (unsigned int blk=0; blk<num_blks; blk++)
1786 {
1787 // Each processor should build up its transfer buffers for its
1788 // local objects in [first_object,last_object).
1789 const dof_id_type
1790 first_object = cast_int<dof_id_type>(blk*io_blksize),
1791 last_object = std::min(cast_int<dof_id_type>((blk+1)*io_blksize), n_objs),
1792 n_objects_blk = last_object - first_object;
1793
1794 // offset array. this will define where each object's values
1795 // map into the actual output_vals buffer. this must get
1796 // 0-initialized because 0-component objects are not actually sent
1797 obj_val_offsets.resize (n_objects_blk); std::fill (obj_val_offsets.begin(), obj_val_offsets.end(), 0);
1798
1799 std::size_t n_val_recvd_blk=0;
1800
1801 // receive this block of data from all processors.
1802 for (processor_id_type comm_step=0, tnp=this->n_processors(); comm_step != tnp; ++comm_step)
1803 {
1804#ifdef LIBMESH_HAVE_MPI
1805 // blocking receive indices for this block, imposing no particular order on processor
1806 Parallel::Status id_status (this->comm().probe (Parallel::any_source, id_tags[blk]));
1807 std::vector<dof_id_type> & ids (recv_ids[id_status.source()]);
1808 this->comm().receive (id_status.source(), ids, id_tags[blk]);
1809#else
1810 std::vector<dof_id_type> & ids (recv_ids[0]);
1811 ids = xfer_ids[blk];
1812#endif
1813
1814 // note its possible we didn't receive values for objects in
1815 // this block if they have no components allocated.
1816 for (std::size_t idx=0, sz=ids.size(); idx<sz; idx+=2)
1817 {
1818 const dof_id_type
1819 local_idx = ids[idx+0]-first_object,
1820 n_vals_tot_allvecs = ids[idx+1];
1821
1822 libmesh_assert_less (local_idx, n_objects_blk);
1823 libmesh_assert_less (local_idx, obj_val_offsets.size());
1824
1825 obj_val_offsets[local_idx] = n_vals_tot_allvecs;
1826 }
1827
1828#ifdef LIBMESH_HAVE_MPI
1829 // blocking receive values for this block, imposing no particular order on processor
1830 Parallel::Status val_status (this->comm().probe (Parallel::any_source, val_tags[blk]));
1831 std::vector<Number> & vals (recv_vals[val_status.source()]);
1832 this->comm().receive (val_status.source(), vals, val_tags[blk]);
1833#else
1834 // straight copy without MPI
1835 std::vector<Number> & vals (recv_vals[0]);
1836 vals = send_vals[blk];
1837#endif
1838
1839 n_val_recvd_blk += vals.size();
1840 }
1841
1842 // We need the offsets into the output_vals vector for each object.
1843 // fortunately, this is simply the partial sum of the total number
1844 // of components for each object
1845 std::partial_sum(obj_val_offsets.begin(), obj_val_offsets.end(),
1846 obj_val_offsets.begin());
1847
1848 // wait on any previous asynchronous IO - this *must* complete before
1849 // we start messing with the output_vals buffer!
1850 if (async_io.get()) async_io->join();
1851
1852 // this is the actual output buffer that will be written to disk.
1853 // at ths point we finally know wha size it will be.
1854 output_vals.resize(n_val_recvd_blk);
1855
1856 // pack data from all processors into output values
1857 for (auto proc : make_range(this->n_processors()))
1858 {
1859 const std::vector<dof_id_type> & ids (recv_ids [proc]);
1860 const std::vector<Number> & vals(recv_vals[proc]);
1861 std::vector<Number>::const_iterator proc_vals(vals.begin());
1862
1863 for (std::size_t idx=0, sz=ids.size(); idx<sz; idx+=2)
1864 {
1865 const dof_id_type
1866 local_idx = ids[idx+0]-first_object,
1867 n_vals_tot_allvecs = ids[idx+1];
1868
1869 // put this object's data into the proper location
1870 // in the output buffer
1871 std::vector<Number>::iterator out_vals(output_vals.begin());
1872 if (local_idx != 0)
1873 std::advance (out_vals, obj_val_offsets[local_idx-1]);
1874
1875 for (unsigned int val=0; val<n_vals_tot_allvecs; val++, ++out_vals, ++proc_vals)
1876 {
1877 libmesh_assert (out_vals != output_vals.end());
1878 libmesh_assert (proc_vals != vals.end());
1879 *out_vals = *proc_vals;
1880 }
1881 }
1882 }
1883
1884 // output_vals buffer is now filled for this block.
1885 // write it to disk
1886 async_io = std::make_unique<Threads::Thread>(threaded_io);
1887 written_length += output_vals.size();
1888 }
1889
1890 // wait on any previous asynchronous IO - this *must* complete before
1891 // our stuff goes out of scope
1892 async_io->join();
1893 }
1894
1895 Parallel::wait(id_requests);
1896 Parallel::wait(val_requests);
1897
1898 // we need some synchronization here. Because this method
1899 // can be called for a range of nodes, then a range of elements,
1900 // we need some mechanism to prevent processors from racing past
1901 // to the next range and overtaking ongoing communication. one
1902 // approach would be to figure out unique tags for each range,
1903 // but for now we just impose a barrier here. And might as
1904 // well have it do some useful work.
1905 this->comm().broadcast(written_length);
1906
1907 return written_length;
1908}

References TIMPI::any_source, libMesh::Parallel::Communicator::broadcast(), libMesh::ParallelObject::comm(), libMesh::Parallel::Communicator::get_unique_tag(), libMesh::invalid_uint, libMesh::libmesh_assert(), libMesh::make_range(), libMesh::ParallelObject::n_processors(), libMesh::System::n_vars(), libMesh::System::number(), libMesh::ParallelObject::processor_id(), libMesh::Parallel::Communicator::receive(), libMesh::Parallel::Communicator::send(), TIMPI::Status::source(), and TIMPI::wait().

Referenced by libMesh::System::write_serialized_vector(), and libMesh::System::write_serialized_vectors().

◆ 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 1518 of file system_io.C.

1520{
1534 parallel_object_only();
1535 std::string comment;
1536
1537 // PerfLog pl("IO Performance",false);
1538 // pl.push("write_serialized_data");
1539 // std::size_t total_written_size = 0;
1540
1541 // total_written_size +=
1542 this->write_serialized_vector(io, *this->solution);
1543
1544 // set up the comment
1545 if (this->processor_id() == 0)
1546 {
1547 comment = "# System \"";
1548 comment += this->name();
1549 comment += "\" Solution Vector";
1550
1551 io.comment (comment);
1552 }
1553
1554 // Only write additional vectors if wanted
1555 if (write_additional_data)
1556 {
1557 for (auto & pair : this->_vectors)
1558 {
1559 // total_written_size +=
1560 this->write_serialized_vector(io, *pair.second);
1561
1562 // set up the comment
1563 if (this->processor_id() == 0)
1564 {
1565 comment = "# System \"";
1566 comment += this->name();
1567 comment += "\" Additional Vector \"";
1568 comment += pair.first;
1569 comment += "\"";
1570 io.comment (comment);
1571 }
1572 }
1573 }
1574
1575 // const Real
1576 // dt = pl.get_elapsed_time(),
1577 // rate = total_written_size*sizeof(Number)/dt;
1578
1579 // libMesh::out << "Write " << total_written_size << " \"Number\" values\n"
1580 // << " Elapsed time = " << dt << '\n'
1581 // << " Rate = " << rate/1.e6 << "(MB/sec)\n\n";
1582
1583 // pl.pop("write_serialized_data");
1584
1585
1586
1587
1588 // // test the new method
1589 // {
1590 // std::vector<std::string> names;
1591 // std::vector<NumericVector<Number> *> vectors_to_write;
1592
1593 // names.push_back("Solution Vector");
1594 // vectors_to_write.push_back(this->solution.get());
1595
1596 // // Only write additional vectors if wanted
1597 // if (write_additional_data)
1598 // {
1599 // std::map<std::string, NumericVector<Number> *>::const_iterator
1600 // pos = _vectors.begin();
1601
1602 // for (; pos != this->_vectors.end(); ++pos)
1603 // {
1604 // names.push_back("Additional Vector " + pos->first);
1605 // vectors_to_write.push_back(pos->second);
1606 // }
1607 // }
1608
1609 // total_written_size =
1610 // this->write_serialized_vectors (io, names, vectors_to_write);
1611
1612 // const Real
1613 // dt2 = pl.get_elapsed_time(),
1614 // rate2 = total_written_size*sizeof(Number)/(dt2-dt);
1615
1616 // libMesh::out << "Write (new) " << total_written_size << " \"Number\" values\n"
1617 // << " Elapsed time = " << (dt2-dt) << '\n'
1618 // << " Rate = " << rate2/1.e6 << "(MB/sec)\n\n";
1619
1620 // }
1621}
dof_id_type write_serialized_vector(Xdr &io, const NumericVector< Number > &vec) const
Writes a vector for this System.
Definition system_io.C:1968

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::RBConstruction::write_riesz_representors_to_files(), and write_riesz_representors_to_files().

◆ write_serialized_vector()

dof_id_type libMesh::System::write_serialized_vector ( Xdr io,
const NumericVector< Number > &  vec 
) const
privateinherited

Writes a vector for this System.

This method may safely be called on a distributed-memory mesh.

Returns
The number of values written.

Definition at line 1968 of file system_io.C.

1970{
1971 parallel_object_only();
1972
1973 libmesh_assert (io.writing());
1974
1975 dof_id_type vec_length = vec.size();
1976 if (this->processor_id() == 0) io.data (vec_length, "# vector length");
1977
1978 dof_id_type written_length = 0;
1979
1980 //---------------------------------
1981 // Collect the values for all nodes
1982 written_length += cast_int<dof_id_type>
1983 (this->write_serialized_blocked_dof_objects (std::vector<const NumericVector<Number> *>(1,&vec),
1984 this->get_mesh().n_nodes(),
1985 this->get_mesh().local_nodes_begin(),
1986 this->get_mesh().local_nodes_end(),
1987 io));
1988
1989 //------------------------------------
1990 // Collect the values for all elements
1991 written_length += cast_int<dof_id_type>
1992 (this->write_serialized_blocked_dof_objects (std::vector<const NumericVector<Number> *>(1,&vec),
1993 this->get_mesh().n_elem(),
1994 this->get_mesh().local_elements_begin(),
1995 this->get_mesh().local_elements_end(),
1996 io));
1997
1998 //-------------------------------------------
1999 // Finally loop over all the SCALAR variables
2000 for (auto var : make_range(this->n_vars()))
2001 if (this->variable(var).type().family == SCALAR)
2002 {
2003 written_length +=
2004 this->write_SCALAR_dofs (vec, var, io);
2005 }
2006
2007 if (this->processor_id() == 0)
2008 libmesh_assert_equal_to (written_length, vec_length);
2009
2010 return written_length;
2011}
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:1626
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:1912

References libMesh::Xdr::data(), libMesh::FEType::family, libMesh::System::get_mesh(), libMesh::libmesh_assert(), libMesh::make_range(), n_nodes, libMesh::System::n_vars(), libMesh::ParallelObject::processor_id(), libMesh::SCALAR, libMesh::NumericVector< T >::size(), libMesh::Variable::type(), libMesh::System::variable(), libMesh::System::write_SCALAR_dofs(), libMesh::System::write_serialized_blocked_dof_objects(), and libMesh::Xdr::writing().

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

◆ 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 2111 of file system_io.C.

2113{
2114 parallel_object_only();
2115
2116 libmesh_assert (io.writing());
2117
2118 // Cache these - they are not free!
2119 const dof_id_type
2120 n_nodes = this->get_mesh().n_nodes(),
2121 n_elem = this->get_mesh().n_elem();
2122
2123 std::size_t written_length = 0;
2124
2125 if (this->processor_id() == 0)
2126 {
2127 unsigned int
2128 n_vec = cast_int<unsigned int>(vectors.size());
2130 vec_size = vectors.empty() ? 0 : vectors[0]->size();
2131 // Set the number of vectors
2132 io.data(n_vec, "# number of vectors");
2133 // Set the buffer size
2134 io.data(vec_size, "# vector length");
2135 }
2136
2137 //---------------------------------
2138 // Collect the values for all nodes
2139 written_length +=
2141 n_nodes,
2142 this->get_mesh().local_nodes_begin(),
2143 this->get_mesh().local_nodes_end(),
2144 io);
2145
2146 //------------------------------------
2147 // Collect the values for all elements
2148 written_length +=
2150 n_elem,
2151 this->get_mesh().local_elements_begin(),
2152 this->get_mesh().local_elements_end(),
2153 io);
2154
2155 //-------------------------------------------
2156 // Finally loop over all the SCALAR variables
2157 for (const NumericVector<Number> * vec : vectors)
2158 for (auto var : make_range(this->n_vars()))
2159 if (this->variable(var).type().family == SCALAR)
2160 {
2161 libmesh_assert_not_equal_to (vec, 0);
2162
2163 written_length +=
2164 this->write_SCALAR_dofs (*vec, var, io);
2165 }
2166
2167 return written_length;
2168}

References libMesh::Xdr::data(), libMesh::FEType::family, libMesh::System::get_mesh(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::MeshBase::n_elem(), libMesh::MeshBase::n_nodes(), n_nodes, libMesh::System::n_vars(), libMesh::ParallelObject::processor_id(), libMesh::SCALAR, libMesh::Variable::type(), 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().

◆ zero_constrained_dofs_on_vector()

void libMesh::RBConstruction::zero_constrained_dofs_on_vector ( NumericVector< Number > &  vector) const
inherited

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.

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

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

◆ 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.

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.
1475 (mesh.active_local_element_stored_range(),
1476 [sys_num, var_num, &v](const ConstElemRange & range)
1477 {
1478 for (const Elem * elem : range)
1479 {
1480 unsigned int n_comp = elem->n_comp(sys_num,var_num);
1481 for (unsigned int i=0; i<n_comp; i++)
1482 {
1483 const dof_id_type index = elem->dof_number(sys_num,var_num,i);
1484 v.set(index,0.0);
1485 }
1486 }
1487 });
1488}

References libMesh::System::get_mesh(), mesh, libMesh::System::n_vars(), libMesh::System::number(), libMesh::Threads::parallel_for(), and libMesh::NumericVector< T >::set().

Member Data Documentation

◆ _active

bool libMesh::System::_active
privateinherited

Flag stating if the system is active or not.

Definition at line 2252 of file system.h.

Referenced by libMesh::System::activate(), libMesh::System::active(), and libMesh::System::deactivate().

◆ _additional_data_written

unsigned int libMesh::System::_additional_data_written
privateinherited

This flag is used only when reading in a system from file.

Based on the system header, it keeps track of how many additional vectors were actually written for this file.

Definition at line 2313 of file system.h.

Referenced by libMesh::System::read_header(), libMesh::System::read_parallel_data(), and libMesh::System::read_serialized_data().

◆ _assemble_system_function

void(* libMesh::System::_assemble_system_function) (EquationSystems &es, const std::string &name)
privateinherited

Function that assembles the system.

Definition at line 2176 of file system.h.

◆ _assemble_system_object

Assembly* libMesh::System::_assemble_system_object
privateinherited

Object that assembles the system.

Definition at line 2182 of file system.h.

◆ _basic_system_only

bool libMesh::System::_basic_system_only
privateinherited

Holds true if the components of more advanced system types (e.g.

system matrices) should not be initialized.

Definition at line 2300 of file system.h.

Referenced by libMesh::System::init_data(), libMesh::System::reinit(), libMesh::System::reinit_mesh(), and libMesh::System::set_basic_system_only().

◆ _communicator

const Parallel::Communicator& libMesh::ParallelObject::_communicator
protectedinherited

◆ _constrain_system_function

void(* libMesh::System::_constrain_system_function) (EquationSystems &es, const std::string &name)
privateinherited

Function to impose constraints.

Definition at line 2187 of file system.h.

◆ _constrain_system_object

Constraint* libMesh::System::_constrain_system_object
privateinherited

Object that constrains the system.

Definition at line 2193 of file system.h.

◆ _control

std::vector<Real> libMesh::RBTemporalDiscretization::_control
privateinherited

The RHS control (scalar function of time).

A function h(t) that is used in the RHS as h(t)*f(x, \( \mu \)). See Martin Grepl's thesis

Definition at line 130 of file rb_temporal_discretization.h.

Referenced by libMesh::RBTemporalDiscretization::get_control(), libMesh::RBTemporalDiscretization::pull_temporal_discretization_data(), libMesh::RBTemporalDiscretization::set_control(), and libMesh::RBTemporalDiscretization::set_n_time_steps().

◆ _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_time_step

unsigned int libMesh::RBTemporalDiscretization::_current_time_step
privateinherited

◆ _current_training_parameter_index

unsigned int libMesh::RBConstruction::_current_training_parameter_index
privateinherited

The current training parameter index during reduced basis training.

Definition at line 1011 of file rb_construction.h.

Referenced by libMesh::RBConstruction::get_current_training_parameter_index(), and libMesh::RBConstruction::set_current_training_parameter_index().

◆ _delta_t

Real libMesh::RBTemporalDiscretization::_delta_t
privateinherited

◆ _discrete_parameter_values

std::map<std::string, std::vector<Real> > libMesh::RBParametrized::_discrete_parameter_values
privateinherited

Map that defines the allowable values of any discrete parameters.

Definition at line 250 of file rb_parametrized.h.

Referenced by libMesh::RBParametrized::get_discrete_parameter_values(), libMesh::RBParametrized::initialize_parameters(), and libMesh::RBParametrized::is_discrete_parameter().

◆ _dof_map

std::unique_ptr<DofMap> libMesh::System::_dof_map
privateinherited

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

◆ _equation_systems

EquationSystems& libMesh::System::_equation_systems
privateinherited

Constant reference to the EquationSystems object used for the simulation.

Definition at line 2231 of file system.h.

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

◆ _euler_theta

Real libMesh::RBTemporalDiscretization::_euler_theta
privateinherited

The parameter that determines the generalized Euler scheme discretization that we employ.

euler_theta = 0 —> Forward Euler euler_theta = 0.5 —> Crank-Nicolson euler_theta = 1 —> Backward Euler

Definition at line 113 of file rb_temporal_discretization.h.

Referenced by libMesh::RBTemporalDiscretization::get_euler_theta(), and libMesh::RBTemporalDiscretization::set_euler_theta().

◆ _evaluated_thetas

std::vector<std::vector<Number> > libMesh::RBConstruction::_evaluated_thetas
privateinherited

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 libMesh::RBConstruction::get_evaluated_thetas(), and libMesh::RBConstruction::preevaluate_thetas().

◆ _final_linear_residual

Real libMesh::LinearImplicitSystem::_final_linear_residual
protectedinherited

◆ _first_local_index

numeric_index_type libMesh::RBConstructionBase< LinearImplicitSystem >::_first_local_index
privateinherited

The first sample-vector index from the global vector which is stored in the _training_parameters on this processor.

_n_local_training_samples is equivalent to the .size() of any vector in _training_parameters.

Definition at line 313 of file rb_construction_base.h.

◆ _hide_output

bool libMesh::System::_hide_output
privateinherited

Are we allowed to write this system to file? If _hide_output is true, then EquationSystems::write will ignore this system.

Definition at line 2338 of file system.h.

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

◆ _init_system_function

void(* libMesh::System::_init_system_function) (EquationSystems &es, const std::string &name)
privateinherited

Function that initializes the system.

Definition at line 2165 of file system.h.

◆ _init_system_object

Initialization* libMesh::System::_init_system_object
privateinherited

Object that initializes the system.

Definition at line 2171 of file system.h.

◆ _is_initialized

bool libMesh::System::_is_initialized
privateinherited

true when additional vectors and variables do not require immediate initialization, false otherwise.

Definition at line 2306 of file system.h.

Referenced by libMesh::System::add_vector(), libMesh::System::clear(), libMesh::System::compare(), libMesh::System::init_data(), and libMesh::System::is_initialized().

◆ _matrices

std::map<std::string, std::unique_ptr<SparseMatrix<Number> >, std::less<> > libMesh::System::_matrices
privateinherited

◆ _matrices_initialized

bool libMesh::System::_matrices_initialized
privateinherited

false when additional matrices being added require initialization, true otherwise.

Definition at line 2287 of file system.h.

Referenced by libMesh::System::can_add_matrices(), libMesh::System::clear(), libMesh::System::init_matrices(), libMesh::System::late_matrix_init(), and libMesh::System::prefer_hash_table_matrix_assembly().

◆ _matrix_types

std::map<std::string, ParallelType, std::less<> > libMesh::System::_matrix_types
privateinherited

Holds the types of the matrices.

Definition at line 2282 of file system.h.

Referenced by libMesh::System::add_matrix(), libMesh::System::add_matrix(), libMesh::System::add_matrix(), and libMesh::System::init_matrices().

◆ _mesh

MeshBase& libMesh::System::_mesh
privateinherited

Constant reference to the mesh data structure used for the simulation.

Definition at line 2237 of file system.h.

Referenced by libMesh::System::get_mesh(), libMesh::System::get_mesh(), and libMesh::System::reinit_constraints().

◆ _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_global_training_samples

numeric_index_type libMesh::RBConstructionBase< LinearImplicitSystem >::_n_global_training_samples
privateinherited

Definition at line 315 of file rb_construction_base.h.

◆ _n_linear_iterations

unsigned int libMesh::LinearImplicitSystem::_n_linear_iterations
protectedinherited

◆ _n_local_training_samples

numeric_index_type libMesh::RBConstructionBase< LinearImplicitSystem >::_n_local_training_samples
privateinherited

Definition at line 314 of file rb_construction_base.h.

◆ _n_objects [1/2]

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

◆ _n_objects [2/2]

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

◆ _n_time_steps

unsigned int libMesh::RBTemporalDiscretization::_n_time_steps
privateinherited

◆ _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.

◆ _preevaluate_thetas_completed

bool libMesh::RBConstruction::_preevaluate_thetas_completed
privateinherited

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 libMesh::RBConstruction::preevaluate_thetas(), and libMesh::RBConstruction::reset_preevaluate_thetas_completed().

◆ _preevaluate_thetas_flag

bool libMesh::RBConstruction::_preevaluate_thetas_flag
privateinherited

Flag to indicate if we preevaluate the theta functions.

Definition at line 999 of file rb_construction.h.

Referenced by libMesh::RBConstruction::get_preevaluate_thetas_flag(), and libMesh::RBConstruction::set_preevaluate_thetas_flag().

◆ _prefer_hash_table_matrix_assembly

bool libMesh::System::_prefer_hash_table_matrix_assembly
privateinherited

Whether to use hash table matrix assembly if the matrix sub-classes support it.

Definition at line 2348 of file system.h.

Referenced by libMesh::System::init_matrices(), and libMesh::System::prefer_hash_table_matrix_assembly().

◆ _prefix_with_name

bool libMesh::System::_prefix_with_name
privateinherited

Whether we are name prefixing solver options.

Definition at line 2358 of file system.h.

Referenced by libMesh::System::prefix_with_name(), and libMesh::System::prefix_with_name().

◆ _qoi

std::vector<Number> libMesh::System::_qoi
privateinherited

Values of the quantities of interest.

This vector needs to be both resized and filled by the user before any quantity of interest assembly is done and before any sensitivities are calculated. Use the get_qoi_values() accessor to get these values.

Definition at line 2367 of file system.h.

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

◆ _qoi_error_estimates

std::vector<Number> libMesh::System::_qoi_error_estimates
privateinherited

Vector to hold error estimates for qois, either from a steady state calculation, or from a single unsteady solver timestep.

Used by the library after resizing to match the size of the qoi vector. User code can use this for accumulating error estimates for example. Use the set_qoi_error_estimate()/get_qoi_error_estimate_value() accessors to set/get these values.

Definition at line 2377 of file system.h.

◆ _qoi_evaluate_derivative_function

void(* libMesh::System::_qoi_evaluate_derivative_function) (EquationSystems &es, const std::string &name, const QoISet &qoi_indices, bool include_liftfunc, bool apply_constraints)
privateinherited

Function to evaluate quantity of interest derivative.

Definition at line 2210 of file system.h.

◆ _qoi_evaluate_derivative_object

QOIDerivative* libMesh::System::_qoi_evaluate_derivative_object
privateinherited

Object to compute derivatives of quantities of interest.

Definition at line 2219 of file system.h.

◆ _qoi_evaluate_function

void(* libMesh::System::_qoi_evaluate_function) (EquationSystems &es, const std::string &name, const QoISet &qoi_indices)
privateinherited

Function to evaluate quantity of interest.

Definition at line 2198 of file system.h.

◆ _qoi_evaluate_object

QOI* libMesh::System::_qoi_evaluate_object
privateinherited

Object to compute quantities of interest.

Definition at line 2205 of file system.h.

◆ _require_sparsity_pattern

bool libMesh::System::_require_sparsity_pattern
privateinherited

Whether any of our matrices require an initial sparsity pattern computation in order to determine preallocation.

Definition at line 2353 of file system.h.

Referenced by libMesh::System::init_matrices(), and libMesh::System::reinit().

◆ _sc_system_matrix

StaticCondensation* libMesh::ImplicitSystem::_sc_system_matrix
privateinherited

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

◆ _solution_projection

bool libMesh::System::_solution_projection
privateinherited

Holds true if the solution vector should be projected onto a changed grid, false if it should be zeroed.

This is true by default.

Definition at line 2294 of file system.h.

Referenced by libMesh::System::project_solution_on_reinit(), and libMesh::System::restrict_vectors().

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

◆ _sys_name

const std::string libMesh::System::_sys_name
privateinherited

A name associated with this system.

Definition at line 2242 of file system.h.

Referenced by libMesh::System::clear(), libMesh::System::compare(), and libMesh::System::name().

◆ _sys_number

const unsigned int libMesh::System::_sys_number
privateinherited

The number associated with this system.

Definition at line 2247 of file system.h.

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

◆ _training_parameters

std::map<std::string, std::vector<RBParameter> > libMesh::RBConstructionBase< LinearImplicitSystem >::_training_parameters
privateinherited

The training samples for each parameter.

When serial_training_set is true, the map contains all samples of all parameters. Otherwise, the sample vectors will only contain the values for the local samples as defined by _first_local_index and _n_local_training_samples. Mapped from parameter_name -> sample_vector -> value_vector.

Definition at line 306 of file rb_construction_base.h.

◆ _training_parameters_initialized

bool libMesh::RBConstructionBase< LinearImplicitSystem >::_training_parameters_initialized
privateinherited

Boolean flag to indicate whether or not the parameter ranges have been initialized.

Definition at line 297 of file rb_construction_base.h.

◆ _training_parameters_random_seed

int libMesh::RBConstructionBase< LinearImplicitSystem >::_training_parameters_random_seed
privateinherited

If < 0, use std::time() * processor_id() to seed the random number generator for the training parameters (default).

If >= 0, use the provided value * processor_id() as the random number generator seed.

Definition at line 323 of file rb_construction_base.h.

◆ _untransformed_basis_functions

std::vector<std::unique_ptr<NumericVector<Number> > > libMesh::RBConstruction::_untransformed_basis_functions
privateinherited

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 libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::RBConstruction::enrich_RB_space(), and libMesh::RBConstruction::update_residual_terms().

◆ _untransformed_solution

std::unique_ptr<NumericVector<Number> > libMesh::RBConstruction::_untransformed_solution
privateinherited

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 libMesh::RBConstruction::enrich_RB_space(), and libMesh::RBConstruction::truth_solve().

◆ _vector_is_adjoint

std::map<std::string, int, std::less<> > libMesh::System::_vector_is_adjoint
privateinherited

Holds non-negative if a vector by that name should be projected using adjoint constraints/BCs, -1 if primal.

Definition at line 2272 of file system.h.

Referenced by libMesh::System::add_vector(), libMesh::System::clear(), libMesh::System::remove_vector(), libMesh::System::set_vector_as_adjoint(), and libMesh::System::vector_is_adjoint().

◆ _vector_projections

std::map<std::string, bool, std::less<> > libMesh::System::_vector_projections
privateinherited

Holds true if a vector by that name should be projected onto a changed grid, false if it should be zeroed.

Definition at line 2266 of file system.h.

Referenced by libMesh::System::add_vector(), libMesh::System::clear(), libMesh::System::remove_vector(), libMesh::System::restrict_vectors(), libMesh::System::set_vector_preservation(), libMesh::System::vector_preservation(), and libMesh::System::write_header().

◆ _vectors

std::map<std::string, std::unique_ptr<NumericVector<Number> >, std::less<> > libMesh::System::_vectors
privateinherited

◆ _written_var_indices

std::vector<unsigned int> libMesh::System::_written_var_indices
privateinherited

This vector is used only when reading in a system from file.

Based on the system header, it keeps track of any index remapping between variable names in the data file and variable names in the already-constructed system. I.e. if we have a system with variables "A1", "A2", "B1", and "B2", but we read in a data file with only "A1" and "B1" defined, then we don't want to try and read in A2 or B2, and we don't want to assign A1 and B1 values to different dof indices.

Definition at line 2325 of file system.h.

Referenced by libMesh::System::read_header(), libMesh::System::read_parallel_data(), libMesh::System::read_serialized_blocked_dof_objects(), and libMesh::System::read_serialized_vector().

◆ abs_training_tolerance

Real libMesh::RBConstruction::abs_training_tolerance
privateinherited

◆ adjoint_already_solved

bool libMesh::System::adjoint_already_solved
privateinherited

Has the adjoint problem already been solved? If the user sets adjoint_already_solved to true, we won't waste time solving it again.

Definition at line 2332 of file system.h.

Referenced by libMesh::System::is_adjoint_already_solved(), and libMesh::System::set_adjoint_already_solved().

◆ Aq_vector

std::vector<std::unique_ptr<SparseMatrix<Number> > > libMesh::RBConstruction::Aq_vector
privateinherited

Vector storing the Q_a matrices from the affine expansion.

Definition at line 936 of file rb_construction.h.

Referenced by libMesh::RBConstruction::allocate_data_structures(), libMesh::RBConstruction::clear(), and libMesh::RBConstruction::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::System::disable_cache(), libMesh::ImplicitSystem::disable_cache(), main(), libMesh::RBConstruction::RBConstruction(), libMesh::RBSCMConstruction::RBSCMConstruction(), libMesh::ImplicitSystem::sensitivity_solve(), libMesh::CondensedEigenSystem::solve(), libMesh::EigenSystem::solve(), and libMesh::LinearImplicitSystem::solve().

◆ assert_convergence

bool libMesh::RBConstruction::assert_convergence
protectedinherited

◆ compute_RB_inner_product

bool libMesh::RBConstruction::compute_RB_inner_product
inherited

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 TransientRBConstruction(), and libMesh::RBConstruction::update_RB_system_matrices().

◆ compute_truth_projection_error

bool libMesh::TransientRBConstruction::compute_truth_projection_error

Boolean flag that indicates whether we will compute the projection error for the truth solution into the RB space (at every time level).

This typically only needs to true during a call to train_reduced_basis.

Definition at line 307 of file transient_rb_construction.h.

Referenced by train_reduced_basis(), and truth_solve().

◆ 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::NonlinearImplicitSystem::assembly(), libMesh::VariationalSmootherSystem::assembly(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::System::clear(), 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::PetscNonlinearSolver< Number >::force_new_preconditioner(), libMesh::StaticCondensation::init(), libMesh::System::init_data(), 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(), libMesh::RBConstruction::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(), FETest< order, family, elem_type, CaseName >::testGradU(), FETest< order, family, elem_type, CaseName >::testGradUComp(), FETest< order, family, elem_type, CaseName >::testHessU(), FETest< order, family, elem_type, CaseName >::testHessUComp(), FETest< order, family, elem_type, CaseName >::testU(), libMesh::BoundaryVolumeSolutionTransfer::transfer_boundary_volume(), truth_assembly(), 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
protectedinherited

◆ energy_inner_product_coeffs

std::vector<Number> libMesh::RBConstruction::energy_inner_product_coeffs
privateinherited

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 libMesh::RBConstruction::assemble_inner_product_matrix(), and libMesh::RBConstruction::set_energy_inner_product().

◆ exit_on_repeated_greedy_parameters

bool libMesh::RBConstruction::exit_on_repeated_greedy_parameters
inherited

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 libMesh::RBConstruction::greedy_termination_test(), and TransientRBConstruction().

◆ extra_linear_solver

LinearSolver<Number>* libMesh::RBConstruction::extra_linear_solver
inherited

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 libMesh::RBConstruction::enrich_basis_from_rhs_terms(), and libMesh::RBConstruction::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 libMesh::JumpErrorEstimator::estimate_error(), CurlCurlSystem::init_data(), and set_system_parameters().

◆ Fq_representor

std::vector<std::unique_ptr<NumericVector<Number> > > libMesh::RBConstruction::Fq_representor
inherited

◆ Fq_representor_innerprods

std::vector<Number> libMesh::RBConstruction::Fq_representor_innerprods
inherited

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 libMesh::RBConstruction::allocate_data_structures(), and libMesh::RBConstruction::compute_Fq_representor_innerprods().

◆ Fq_representor_innerprods_computed

bool libMesh::RBConstruction::Fq_representor_innerprods_computed
inherited

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 libMesh::RBConstruction::clear(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::read_riesz_representors_from_files(), and libMesh::RBConstruction::recompute_all_residual_terms().

◆ Fq_vector

std::vector<std::unique_ptr<NumericVector<Number> > > libMesh::RBConstruction::Fq_vector
privateinherited

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 libMesh::RBConstruction::allocate_data_structures(), libMesh::RBConstruction::clear(), and libMesh::RBConstruction::get_Fq().

◆ impose_internal_fluxes

bool libMesh::RBConstruction::impose_internal_fluxes
inherited

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 libMesh::RBConstruction::add_scaled_matrix_and_vector().

◆ init_filename

std::string libMesh::TransientRBConstruction::init_filename

The filename of the file containing the initial condition projected onto the truth mesh.

Definition at line 313 of file transient_rb_construction.h.

Referenced by initialize_truth(), print_info(), and process_parameters_file().

◆ inner_product_assembly

ElemAssembly* libMesh::RBConstruction::inner_product_assembly
privateinherited

◆ inner_product_matrix

std::unique_ptr<SparseMatrix<Number> > libMesh::RBConstruction::inner_product_matrix
inherited

◆ inner_product_solver

std::unique_ptr<LinearSolver<Number> > libMesh::RBConstruction::inner_product_solver
inherited

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 libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::RBConstruction::initialize_rb_construction(), update_residual_terms(), and libMesh::RBConstruction::update_residual_terms().

◆ inner_product_storage_vector

std::unique_ptr<NumericVector<Number> > libMesh::RBConstructionBase< LinearImplicitSystem >::inner_product_storage_vector
protectedinherited

We keep an extra temporary vector that is useful for performing inner products (avoids unnecessary memory allocation/deallocation).

Definition at line 288 of file rb_construction_base.h.

◆ L2_assembly

ElemAssembly* libMesh::TransientRBConstruction::L2_assembly
protected

Function pointer for assembling the L2 matrix.

Definition at line 399 of file transient_rb_construction.h.

Referenced by assemble_L2_matrix(), get_L2_assembly(), and set_L2_assembly().

◆ L2_matrix

std::unique_ptr<SparseMatrix<Number> > libMesh::TransientRBConstruction::L2_matrix

◆ linear_solver

std::unique_ptr<LinearSolver<Number> > libMesh::ImplicitSystem::linear_solver
mutableinherited

◆ M_q_vector

std::vector<std::unique_ptr<SparseMatrix<Number> > > libMesh::TransientRBConstruction::M_q_vector

Vector storing the Q_m matrices from the mass operator.

Definition at line 281 of file transient_rb_construction.h.

Referenced by allocate_data_structures(), clear(), get_M_q(), and update_residual_terms().

◆ 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(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::ContinuationSystem::continuation_solve(), libMesh::ImplicitSystem::create_static_condensation_system_matrix(), DMCreateMatrix_libMesh(), DMlibMeshJacobian(), libMesh::RBConstruction::enrich_basis_from_rhs_terms(), fill_dirichlet_bc(), libMesh::ImplicitSystem::forward_qoi_parameter_sensitivity(), libMesh::ImplicitSystem::get_system_matrix(), 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::EigenTimeSolver::solve(), libMesh::NewtonSolver::solve(), libMesh::PetscDiffSolver::solve(), libMesh::LinearImplicitSystem::solve(), libMesh::NonlinearImplicitSystem::solve(), libMesh::FrequencySystem::solve(), libMesh::NoxNonlinearSolver< T >::solve(), libMesh::ClawSystem::solve_conservation_law(), libMesh::ContinuationSystem::solve_tangent(), libMesh::RBConstruction::truth_assembly(), truth_assembly(), libMesh::RBConstruction::truth_solve(), truth_solve(), libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve(), and libMesh::ImplicitSystem::weighted_sensitivity_solve().

◆ max_truth_solves

int libMesh::TransientRBConstruction::max_truth_solves
protected

Maximum number of truth solves in the POD-Greedy.

This can be different from Nmax in the transient case since we may add more than one basis function per truth solve. If negative, it's ignored.

Definition at line 394 of file transient_rb_construction.h.

Referenced by get_max_truth_solves(), print_info(), process_parameters_file(), and set_max_truth_solves().

◆ Nmax

unsigned int libMesh::RBConstruction::Nmax
protectedinherited

◆ non_dirichlet_Aq_vector

std::vector<std::unique_ptr<SparseMatrix<Number> > > libMesh::RBConstruction::non_dirichlet_Aq_vector
privateinherited

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 libMesh::RBConstruction::allocate_data_structures(), libMesh::RBConstruction::clear(), and libMesh::RBConstruction::get_non_dirichlet_Aq().

◆ non_dirichlet_Fq_vector

std::vector<std::unique_ptr<NumericVector<Number> > > libMesh::RBConstruction::non_dirichlet_Fq_vector
privateinherited

◆ non_dirichlet_inner_product_matrix

std::unique_ptr<SparseMatrix<Number> > libMesh::RBConstruction::non_dirichlet_inner_product_matrix
privateinherited

◆ non_dirichlet_L2_matrix

std::unique_ptr<SparseMatrix<Number> > libMesh::TransientRBConstruction::non_dirichlet_L2_matrix

The L2 matrix without Dirichlet conditions enforced.

(This is only computed if store_non_dirichlet_operators == true.)

Definition at line 276 of file transient_rb_construction.h.

Referenced by allocate_data_structures(), assemble_misc_matrices(), and get_all_matrices().

◆ non_dirichlet_M_q_vector

std::vector<std::unique_ptr<SparseMatrix<Number> > > libMesh::TransientRBConstruction::non_dirichlet_M_q_vector

We sometimes also need a second set of M_q matrices that do not have the Dirichlet boundary conditions enforced.

Definition at line 288 of file transient_rb_construction.h.

Referenced by allocate_data_structures(), clear(), and get_non_dirichlet_M_q().

◆ non_dirichlet_outputs_vector

std::vector<std::vector<std::unique_ptr<NumericVector<Number> > > > libMesh::RBConstruction::non_dirichlet_outputs_vector
privateinherited

◆ nonzero_initialization

bool libMesh::TransientRBConstruction::nonzero_initialization

Boolean flag to indicate whether we are using a non-zero initialization.

If we are, then an initialization function must be attached to the system.

Definition at line 300 of file transient_rb_construction.h.

Referenced by add_IC_to_RB_space(), initialize_truth(), print_info(), and process_parameters_file().

◆ normalize_rb_bound_in_greedy

bool libMesh::RBConstruction::normalize_rb_bound_in_greedy
privateinherited

◆ old_local_solution

NumericVector<Number>* libMesh::TransientSystem< RBConstruction >::old_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.

Definition at line 126 of file transient_system.h.

◆ older_local_solution

NumericVector<Number>* libMesh::TransientSystem< RBConstruction >::older_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.

Definition at line 134 of file transient_system.h.

◆ output_dual_innerprods

std::vector<std::vector<Number > > libMesh::RBConstruction::output_dual_innerprods
inherited

The vector storing the dual norm inner product terms for each output.

Definition at line 560 of file rb_construction.h.

Referenced by libMesh::RBConstruction::allocate_data_structures(), and libMesh::RBConstruction::compute_output_dual_innerprods().

◆ output_dual_innerprods_computed

bool libMesh::RBConstruction::output_dual_innerprods_computed
protectedinherited

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 libMesh::RBConstruction::compute_output_dual_innerprods().

◆ outputs_vector

std::vector<std::vector<std::unique_ptr<NumericVector<Number> > > > libMesh::RBConstruction::outputs_vector
privateinherited

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 libMesh::RBConstruction::allocate_data_structures(), libMesh::RBConstruction::clear(), and libMesh::RBConstruction::get_output_vector().

◆ parameters

Parameters libMesh::System::parameters
inherited

◆ parameters_initialized

bool libMesh::RBParametrized::parameters_initialized
privateinherited

◆ parameters_max

RBParameters libMesh::RBParametrized::parameters_max
privateinherited

◆ parameters_min

RBParameters libMesh::RBParametrized::parameters_min
privateinherited

◆ POD_tol

Real libMesh::TransientRBConstruction::POD_tol
protected

If positive, this tolerance determines the number of POD modes we add to the space on a call to enrich_RB_space().

If negative, we add delta_N POD modes.

Definition at line 386 of file transient_rb_construction.h.

Referenced by enrich_RB_space(), get_POD_tol(), process_parameters_file(), and set_POD_tol().

◆ project_with_constraints

bool libMesh::System::project_with_constraints
privateinherited

Do we want to apply constraints while projecting vectors ?

Definition at line 2343 of file system.h.

Referenced by libMesh::System::get_project_with_constraints(), and libMesh::System::set_project_with_constraints().

◆ 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.

◆ rb_assembly_expansion

RBAssemblyExpansion* libMesh::RBConstruction::rb_assembly_expansion
privateinherited

◆ rb_eval

RBEvaluation* libMesh::RBConstruction::rb_eval
privateinherited

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 libMesh::RBConstruction::get_rb_evaluation(), libMesh::RBConstruction::get_rb_evaluation(), libMesh::RBConstruction::is_rb_eval_initialized(), and libMesh::RBConstruction::set_rb_evaluation().

◆ RB_ic_proj_rhs_all_N

DenseVector<Number> libMesh::TransientRBConstruction::RB_ic_proj_rhs_all_N
protected

The vector that stores the right-hand side for the initial condition projections.

Definition at line 405 of file transient_rb_construction.h.

Referenced by allocate_data_structures(), assemble_affine_expansion(), and update_RB_initial_condition_all_N().

◆ RB_training_type

std::string libMesh::RBConstruction::RB_training_type
privateinherited

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 libMesh::RBConstruction::get_RB_training_type(), and libMesh::RBConstruction::set_RB_training_type().

◆ rel_training_tolerance

Real libMesh::RBConstruction::rel_training_tolerance
privateinherited

◆ 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(), LinearElasticity::assemble(), libMesh::ImplicitSystem::assemble(), assemble(), 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(), assemble_poisson(), libMesh::ImplicitSystem::assemble_residual_derivatives(), assemble_shell(), assemble_shell(), assemble_stokes(), assemble_temperature_jump(), assemble_wave(), libMesh::FEMSystem::assembly(), libMesh::LinearImplicitSystem::assembly(), libMesh::NonlinearImplicitSystem::assembly(), libMesh::VariationalSmootherSystem::assembly(), assembly_with_dg_fem_context(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::ContinuationSystem::continuation_solve(), DMlibMeshFunction(), libMesh::RBConstruction::enrich_basis_from_rhs_terms(), fill_dirichlet_bc(), libMesh::ImplicitSystem::forward_qoi_parameter_sensitivity(), libMesh::NewtonSolver::line_search(), periodic_bc_test_poisson(), HeatSystem::perturb_accumulate_residuals(), libMesh::ImplicitSystem::qoi_parameter_hessian(), libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product(), libMesh::NewtonSolver::solve(), libMesh::PetscDiffSolver::solve(), libMesh::LinearImplicitSystem::solve(), libMesh::NonlinearImplicitSystem::solve(), libMesh::FrequencySystem::solve(), libMesh::ContinuationSystem::solve_tangent(), libMesh::RBConstruction::truth_assembly(), truth_assembly(), libMesh::RBConstruction::truth_solve(), truth_solve(), update_residual_terms(), libMesh::RBConstruction::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.

◆ skip_degenerate_sides

bool libMesh::RBConstruction::skip_degenerate_sides
inherited

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 libMesh::RBConstruction::add_scaled_matrix_and_vector().

◆ skip_residual_in_train_reduced_basis

bool libMesh::RBConstruction::skip_residual_in_train_reduced_basis
inherited

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 libMesh::RBConstruction::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(), add_IC_to_RB_space(), libMesh::AdaptiveTimeSolver::advance_timestep(), libMesh::NewmarkSolver::advance_timestep(), libMesh::UnsteadySolver::advance_timestep(), libMesh::ContinuationSystem::apply_predictor(), assemble_affine_expansion(), libMesh::FEMSystem::assembly(), libMesh::LinearImplicitSystem::assembly(), libMesh::VariationalSmootherSystem::assembly(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::RBConstruction::check_if_zero_truth_solve(), libMesh::System::clear(), libMesh::System::compare(), compute_enriched_soln(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::NewmarkSolver::compute_initial_accel(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), LinearElasticityWithContact::compute_stresses(), compute_stresses(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), libMesh::ContinuationSystem::continuation_solve(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::GMVIO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), create_wrapped_function(), DMCreateGlobalVector_libMesh(), DMlibMeshFunction(), DMlibMeshJacobian(), libMesh::UnsteadySolver::du(), libMesh::RBConstruction::enrich_RB_space(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::AdjointResidualErrorEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::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::System::init_data(), libMesh::VariationalSmootherSystem::init_data(), libMesh::ContinuationSystem::initialize_tangent(), initialize_truth(), libMesh::RBConstruction::load_basis_function(), libMesh::RBConstruction::load_rb_solution(), load_rb_solution(), main(), libMesh::DofMap::max_constraint_error(), libMesh::FEMSystem::mesh_position_get(), libMesh::ErrorVector::plot_error(), libMesh::RBConstruction::print_basis_function_orthogonality(), libMesh::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::RBConstruction::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(), set_error_temporal_data(), ParsedFEMFunctionTest::setUp(), setup(), WriteVecAndScalar::setupTests(), libMesh::NewtonSolver::solve(), libMesh::PetscDiffSolver::solve(), libMesh::TwostepTimeSolver::solve(), libMesh::LinearImplicitSystem::solve(), libMesh::NonlinearImplicitSystem::solve(), libMesh::FrequencySystem::solve(), libMesh::ClawSystem::solve_conservation_law(), libMesh::RBConstruction::solve_for_matrix_and_rhs(), libMesh::ContinuationSystem::solve_tangent(), libMesh::MemoryHistoryData::store_vectors(), ConstraintOperatorTest::test1DCoarseningOperator(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), ProjectSolutionTest::test_partial_project_solution(), SystemsTest::testBoundaryProjectCube(), ConstraintOperatorTest::testCoreform(), SystemsTest::testDofCouplingWithVarGroups(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), SystemsTest::testPostInitAddVector(), SystemsTest::testProjectCubeWithMeshFunction(), MeshInputTest::testProjectionRegression(), SystemsTest::testProjectScalarCoarsening(), WriteVecAndScalar::testSolution(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::DirectSolutionTransfer::transfer(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::BoundaryVolumeSolutionTransfer::transfer_boundary_volume(), libMesh::BoundaryVolumeSolutionTransfer::transfer_volume_boundary(), libMesh::RBConstruction::truth_solve(), truth_solve(), libMesh::System::update(), update_current_local_solution(), libMesh::System::update_global_solution(), libMesh::System::update_global_solution(), update_RB_initial_condition_all_N(), update_residual_terms(), libMesh::RBConstruction::update_residual_terms(), libMesh::ContinuationSystem::update_solution(), libMesh::NewmarkSystem::update_u_v_a(), libMesh::DTKAdapter::update_variable_values(), libMesh::System::write_parallel_data(), libMesh::RBConstruction::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
inherited

◆ store_non_dirichlet_operators

bool libMesh::RBConstruction::store_non_dirichlet_operators
inherited

◆ store_untransformed_basis

bool libMesh::RBConstruction::store_untransformed_basis
inherited

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 libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::RBConstruction::enrich_RB_space(), libMesh::RBConstruction::truth_solve(), and libMesh::RBConstruction::update_residual_terms().

◆ temporal_data

std::vector<std::unique_ptr<NumericVector<Number> > > libMesh::TransientRBConstruction::temporal_data
private

Dense matrix to store the data that we use for the temporal POD.

Definition at line 414 of file transient_rb_construction.h.

Referenced by allocate_data_structures(), clear(), enrich_RB_space(), get_error_temporal_data(), and set_error_temporal_data().

◆ 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 >::ProjectInteriors::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::System::reinit_constraints(), libMesh::UnsteadySolver::retrieve_timestep(), and libMesh::TwostepTimeSolver::solve().

◆ training_error_bounds

std::vector<Real> libMesh::RBConstruction::training_error_bounds
inherited

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 libMesh::RBConstruction::compute_max_error_bound().

◆ truth_outputs

std::vector<Number > libMesh::RBConstruction::truth_outputs
inherited

Vector storing the truth output values from the most recent truth solve.

Definition at line 554 of file rb_construction.h.

Referenced by libMesh::RBConstruction::allocate_data_structures(), and libMesh::RBConstruction::truth_solve().

◆ truth_outputs_all_k

std::vector<std::vector<Number> > libMesh::TransientRBConstruction::truth_outputs_all_k

The truth outputs for all time-levels from the most recent truth_solve.

Definition at line 294 of file transient_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
inherited

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 libMesh::RBConstruction::train_reduced_basis_with_greedy().

◆ use_energy_inner_product

bool libMesh::RBConstruction::use_energy_inner_product
privateinherited

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 libMesh::RBConstruction::assemble_inner_product_matrix(), libMesh::RBConstruction::get_inner_product_assembly(), libMesh::RBConstruction::set_energy_inner_product(), and libMesh::RBConstruction::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::NewmarkSolver::_general_residual(), libMesh::Euler2Solver::_general_residual(), libMesh::EulerSolver::_general_residual(), libMesh::SteadySolver::_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: