21#include "libmesh/transient_rb_evaluation.h"
22#include "libmesh/transient_rb_theta_expansion.h"
25#include "libmesh/getpot.h"
26#include "libmesh/int_range.h"
27#include "libmesh/libmesh_logging.h"
28#include "libmesh/numeric_vector.h"
29#include "libmesh/xdr_cxx.h"
41 _rb_solve_data_cached(false)
66 bool resize_error_bound_data)
68 LOG_SCOPE(
"resize_data_structures()",
"TransientRBEvaluation");
79 const unsigned int Q_m = trans_theta_expansion.
get_n_M_terms();
80 const unsigned int Q_a = trans_theta_expansion.
get_n_A_terms();
81 const unsigned int Q_f = trans_theta_expansion.
get_n_F_terms();
85 for (
unsigned int q=0; q<Q_m; q++)
102 if (resize_error_bound_data)
106 for (
unsigned int i=0; i<Q_f; i++)
109 for (
unsigned int j=0; j<Q_m; j++)
115 unsigned int Q_m_hat = Q_m*(Q_m+1)/2;
117 for (
unsigned int i=0; i<Q_m_hat; i++)
120 for (
unsigned int j=0; j<Nmax; j++)
127 for (
unsigned int i=0; i<Q_a; i++)
130 for (
unsigned int j=0; j<Q_m; j++)
133 for (
unsigned int k=0; k<Nmax; k++)
144 for (
unsigned int q_m=0; q_m<Q_m; q_m++)
153 LOG_SCOPE(
"rb_solve()",
"TransientRBEvaluation");
156 "ERROR: N cannot be larger than the number of basis functions in rb_solve");
162 const unsigned int Q_m = trans_theta_expansion.
get_n_M_terms();
163 const unsigned int Q_a = trans_theta_expansion.
get_n_A_terms();
164 const unsigned int Q_f = trans_theta_expansion.
get_n_F_terms();
174 for (
unsigned int n=0; n<trans_theta_expansion.
get_n_outputs(); n++)
182 RB_mass_matrix_N.
zero();
184 for (
unsigned int q_m=0; q_m<Q_m; q_m++)
187 RB_mass_matrix_N.
add(trans_theta_expansion.
eval_M_theta(q_m, mu), RB_M_q_m);
200 for (
unsigned int q_a=0; q_a<Q_a; q_a++)
212 for (
unsigned int q_f=0; q_f<Q_f; q_f++)
239 for (
unsigned int time_level=0; time_level<=n_time_steps; time_level++)
249 for (
unsigned int n=0; n<trans_theta_expansion.
get_n_outputs(); n++)
261 Real error_bound_sum = 0.;
275 for (
unsigned int n=0; n<trans_theta_expansion.
get_n_outputs(); n++)
293 for (
unsigned int time_level=1; time_level<=n_time_steps; time_level++)
314 for (
unsigned int n=0; n<trans_theta_expansion.
get_n_outputs(); n++)
338 for (
unsigned int n=0; n<trans_theta_expansion.
get_n_outputs(); n++)
382 for (
unsigned int time_level=1; time_level<=n_time_steps; time_level++)
419 LOG_SCOPE(
"cache_online_residual_terms()",
"TransientRBEvaluation");
425 const unsigned int Q_m = trans_theta_expansion.
get_n_M_terms();
426 const unsigned int Q_a = trans_theta_expansion.
get_n_A_terms();
427 const unsigned int Q_f = trans_theta_expansion.
get_n_F_terms();
431 for (
unsigned int q_f1=0; q_f1<Q_f; q_f1++)
434 for (
unsigned int q_f2=q_f1; q_f2<Q_f; q_f2++)
436 Real delta = (q_f1==q_f2) ? 1. : 2.;
445 for (
unsigned int q_f=0; q_f<Q_f; q_f++)
448 for (
unsigned int q_a=0; q_a<Q_a; q_a++)
451 for (
unsigned int i=0; i<N; i++)
461 for (
unsigned int q_a1=0; q_a1<Q_a; q_a1++)
464 for (
unsigned int q_a2=q_a1; q_a2<Q_a; q_a2++)
467 Real delta = (q_a1==q_a2) ? 1. : 2.;
469 for (
unsigned int i=0; i<N; i++)
471 for (
unsigned int j=0; j<N; j++)
474 cached_theta_q_a1*cached_theta_q_a2*
483 for (
unsigned int q_f=0; q_f<Q_f; q_f++)
486 for (
unsigned int q_m=0; q_m<Q_m; q_m++)
489 for (
unsigned int i=0; i<N; i++)
497 for (
unsigned int q_a=0; q_a<Q_a; q_a++)
501 for (
unsigned int q_m=0; q_m<Q_m; q_m++)
505 for (
unsigned int i=0; i<N; i++)
507 for (
unsigned int j=0; j<N; j++)
517 for (
unsigned int q_m1=0; q_m1<Q_m; q_m1++)
520 for (
unsigned int q_m2=q_m1; q_m2<Q_m; q_m2++)
523 Real delta = (q_m1==q_m2) ? 1. : 2.;
525 for (
unsigned int i=0; i<N; i++)
527 for (
unsigned int j=0; j<N; j++)
530 cached_theta_q_m1*cached_theta_q_m2*
541 LOG_SCOPE(
"compute_residual_dual_norm()",
"TransientRBEvaluation");
552 for (
unsigned int i=0; i<N; i++)
564 for (
unsigned int i=0; i<N; i++)
565 for (
unsigned int j=0; j<N; j++)
575 libMesh::out <<
"Warning: Square of residual norm is negative "
576 <<
"in TransientRBEvaluation::compute_residual_dual_norm()" << std::endl;
581 residual_norm_sq = std::abs(residual_norm_sq);
589 LOG_SCOPE(
"uncached_compute_residual_dual_norm()",
"TransientRBEvaluation");
598 const unsigned int Q_m = trans_theta_expansion.
get_n_M_terms();
599 const unsigned int Q_a = trans_theta_expansion.
get_n_A_terms();
600 const unsigned int Q_f = trans_theta_expansion.
get_n_F_terms();
605 std::vector<Number> RB_u_euler_theta(N);
606 std::vector<Number> mass_coeffs(N);
607 for (
unsigned int i=0; i<N; i++)
614 Number residual_norm_sq = 0.;
617 for (
unsigned int q_f1=0; q_f1<Q_f; q_f1++)
620 for (
unsigned int q_f2=q_f1; q_f2<Q_f; q_f2++)
622 Real delta = (q_f1==q_f2) ? 1. : 2.;
629 for (
unsigned int q_f=0; q_f<Q_f; q_f++)
632 for (
unsigned int q_a=0; q_a<Q_a; q_a++)
635 for (
unsigned int i=0; i<N; i++)
637 residual_norm_sq += 2.*RB_u_euler_theta[i]*cached_theta_q_f*cached_theta_q_a*
644 for (
unsigned int q_a1=0; q_a1<Q_a; q_a1++)
647 for (
unsigned int q_a2=q_a1; q_a2<Q_a; q_a2++)
650 Real delta = (q_a1==q_a2) ? 1. : 2.;
652 for (
unsigned int i=0; i<N; i++)
654 for (
unsigned int j=0; j<N; j++)
656 residual_norm_sq += delta*RB_u_euler_theta[i]*RB_u_euler_theta[j]*
657 cached_theta_q_a1*cached_theta_q_a2*
667 for (
unsigned int q_m1=0; q_m1<Q_m; q_m1++)
670 for (
unsigned int q_m2=q_m1; q_m2<Q_m; q_m2++)
673 Real delta = (q_m1==q_m2) ? 1. : 2.;
675 for (
unsigned int i=0; i<N; i++)
677 for (
unsigned int j=0; j<N; j++)
679 residual_norm_sq += delta*mass_coeffs[i]*mass_coeffs[j]*
680 cached_theta_q_m1*cached_theta_q_m2*
688 for (
unsigned int q_f=0; q_f<Q_f; q_f++)
691 for (
unsigned int q_m=0; q_m<Q_m; q_m++)
694 for (
unsigned int i=0; i<N; i++)
701 for (
unsigned int q_a=0; q_a<Q_a; q_a++)
705 for (
unsigned int q_m=0; q_m<Q_m; q_m++)
709 for (
unsigned int i=0; i<N; i++)
711 for (
unsigned int j=0; j<N; j++)
713 residual_norm_sq += 2.*RB_u_euler_theta[i]*mass_coeffs[j]*
714 cached_theta_q_a*cached_theta_q_m*
723 libMesh::out <<
"Warning: Square of residual norm is negative "
724 <<
"in TransientRBEvaluation::compute_residual_dual_norm()" << std::endl;
729 residual_norm_sq = std::abs(residual_norm_sq);
739 const bool write_binary_data)
741 LOG_SCOPE(
"legacy_write_offline_data_to_files()",
"TransientRBEvaluation");
747 const unsigned int Q_m = trans_theta_expansion.
get_n_M_terms();
748 const unsigned int Q_a = trans_theta_expansion.
get_n_A_terms();
749 const unsigned int Q_f = trans_theta_expansion.
get_n_F_terms();
757 const std::string suffix = write_binary_data ?
".xdr" :
".dat";
761 std::ostringstream file_name;
765 file_name << directory_name <<
"/temporal_discretization_data" << suffix;
766 Xdr temporal_discretization_data_out(file_name.str(), mode);
768 Real real_value;
unsigned int int_value;
769 real_value =
get_delta_t(); temporal_discretization_data_out << real_value;
770 real_value =
get_euler_theta(); temporal_discretization_data_out << real_value;
771 int_value =
get_n_time_steps(); temporal_discretization_data_out << int_value;
772 int_value =
get_time_step(); temporal_discretization_data_out << int_value;
773 temporal_discretization_data_out.
close();
778 file_name << directory_name <<
"/RB_L2_matrix" << suffix;
779 Xdr RB_L2_matrix_out(file_name.str(), mode);
781 for (
unsigned int i=0; i<n_bfs; i++)
783 for (
unsigned int j=0; j<n_bfs; j++)
788 RB_L2_matrix_out.
close();
791 for (
unsigned int q_m=0; q_m<Q_m; q_m++)
794 file_name << directory_name <<
"/RB_M_";
795 file_name << std::setw(3)
796 << std::setprecision(0)
801 Xdr RB_M_q_m_out(file_name.str(), mode);
803 for (
unsigned int i=0; i<n_bfs; i++)
805 for (
unsigned int j=0; j<n_bfs; j++)
810 RB_M_q_m_out.
close();
816 file_name << directory_name <<
"/initial_conditions" << suffix;
817 Xdr initial_conditions_out(file_name.str(), mode);
819 file_name << directory_name <<
"/initial_L2_error" << suffix;
820 Xdr initial_L2_error_out(file_name.str(), mode);
822 for (
unsigned int i=0; i<n_bfs; i++)
825 for (
unsigned int j=0; j<=i; j++)
830 initial_conditions_out.
close();
831 initial_L2_error_out.
close();
835 file_name << directory_name <<
"/Fq_Mq_terms" << suffix;
836 Xdr RB_Fq_Mq_terms_out(file_name.str(), mode);
838 for (
unsigned int q_f=0; q_f<Q_f; q_f++)
840 for (
unsigned int q_m=0; q_m<Q_m; q_m++)
842 for (
unsigned int i=0; i<n_bfs; i++)
848 RB_Fq_Mq_terms_out.
close();
852 file_name << directory_name <<
"/Mq_Mq_terms" << suffix;
853 Xdr RB_Mq_Mq_terms_out(file_name.str(), mode);
855 unsigned int Q_m_hat = Q_m*(Q_m+1)/2;
856 for (
unsigned int q=0; q<Q_m_hat; q++)
858 for (
unsigned int i=0; i<n_bfs; i++)
860 for (
unsigned int j=0; j<n_bfs; j++)
866 RB_Mq_Mq_terms_out.
close();
870 file_name << directory_name <<
"/Aq_Mq_terms" << suffix;
871 Xdr RB_Aq_Mq_terms_out(file_name.str(), mode);
873 for (
unsigned int q_a=0; q_a<Q_a; q_a++)
875 for (
unsigned int q_m=0; q_m<Q_m; q_m++)
877 for (
unsigned int i=0; i<n_bfs; i++)
879 for (
unsigned int j=0; j<n_bfs; j++)
886 RB_Aq_Mq_terms_out.
close();
891 bool read_error_bound_data,
892 const bool read_binary_data)
894 LOG_SCOPE(
"legacy_read_offline_data_from_files()",
"TransientRBEvaluation");
900 const unsigned int Q_m = trans_theta_expansion.
get_n_M_terms();
901 const unsigned int Q_a = trans_theta_expansion.
get_n_A_terms();
902 const unsigned int Q_f = trans_theta_expansion.
get_n_F_terms();
912 const std::string suffix = read_binary_data ?
".xdr" :
".dat";
915 std::ostringstream file_name;
919 file_name << directory_name <<
"/temporal_discretization_data" << suffix;
922 Xdr temporal_discretization_data_in(file_name.str(), mode);
924 Real real_value;
unsigned int int_value;
925 temporal_discretization_data_in >> real_value;
set_delta_t(real_value);
926 temporal_discretization_data_in >> real_value;
set_euler_theta(real_value);
928 temporal_discretization_data_in >> int_value;
set_time_step(int_value);
929 temporal_discretization_data_in.
close();
932 file_name << directory_name <<
"/RB_L2_matrix" << suffix;
935 Xdr RB_L2_matrix_in(file_name.str(), mode);
937 for (
unsigned int i=0; i<n_bfs; i++)
939 for (
unsigned int j=0; j<n_bfs; j++)
942 RB_L2_matrix_in >>
value;
946 RB_L2_matrix_in.
close();
949 for (
unsigned int q_m=0; q_m<Q_m; q_m++)
952 file_name << directory_name <<
"/RB_M_";
953 file_name << std::setw(3)
954 << std::setprecision(0)
962 Xdr RB_M_q_m_in(file_name.str(), mode);
964 for (
unsigned int i=0; i<n_bfs; i++)
966 for (
unsigned int j=0; j<n_bfs; j++)
969 RB_M_q_m_in >>
value;
980 file_name << directory_name <<
"/initial_conditions" << suffix;
983 Xdr initial_conditions_in(file_name.str(), mode);
986 file_name << directory_name <<
"/initial_L2_error" << suffix;
989 Xdr initial_L2_error_in(file_name.str(), mode);
991 for (
unsigned int i=0; i<n_bfs; i++)
994 for (
unsigned int j=0; j<=i; j++)
999 initial_conditions_in.
close();
1000 initial_L2_error_in.
close();
1003 if (read_error_bound_data)
1007 file_name << directory_name <<
"/Fq_Mq_terms" << suffix;
1010 Xdr RB_Fq_Mq_terms_in(file_name.str(), mode);
1012 for (
unsigned int q_f=0; q_f<Q_f; q_f++)
1014 for (
unsigned int q_m=0; q_m<Q_m; q_m++)
1016 for (
unsigned int i=0; i<n_bfs; i++)
1022 RB_Fq_Mq_terms_in.
close();
1026 file_name << directory_name <<
"/Mq_Mq_terms" << suffix;
1029 Xdr RB_Mq_Mq_terms_in(file_name.str(), mode);
1031 unsigned int Q_m_hat = Q_m*(Q_m+1)/2;
1032 for (
unsigned int q=0; q<Q_m_hat; q++)
1034 for (
unsigned int i=0; i<n_bfs; i++)
1036 for (
unsigned int j=0; j<n_bfs; j++)
1042 RB_Mq_Mq_terms_in.
close();
1046 file_name << directory_name <<
"/Aq_Mq_terms" << suffix;
1049 Xdr RB_Aq_Mq_terms_in(file_name.str(), mode);
1051 for (
unsigned int q_a=0; q_a<Q_a; q_a++)
1053 for (
unsigned int q_m=0; q_m<Q_m; q_m++)
1055 for (
unsigned int i=0; i<n_bfs; i++)
1057 for (
unsigned int j=0; j<n_bfs; j++)
1064 RB_Aq_Mq_terms_in.
close();
Defines a dense matrix for use in Finite Element-type computations.
void vector_mult(DenseVector< T > &dest, const DenseVector< T > &arg) const
Performs the matrix-vector multiplication, dest := (*this) * arg.
void resize(const unsigned int new_m, const unsigned int new_n)
Resizes the matrix to the specified size and calls zero().
void lu_solve(const DenseVector< T > &b, DenseVector< T > &x)
Solve the system Ax=b given the input vector b.
void get_principal_submatrix(unsigned int sub_m, unsigned int sub_n, DenseMatrix< T > &dest) const
Put the sub_m x sub_n principal submatrix into dest.
std::enable_if< ScalarTraits< T2 >::value, void >::type add(const T2 factor, const DenseMatrix< T3 > &mat)
Adds factor times mat to this matrix.
virtual void zero() override final
Sets all elements of the matrix to 0 and resets any decomposition flag which may have been previously...
Defines a dense vector for use in Finite Element-type computations.
void resize(const unsigned int n)
Resize the vector.
virtual void zero() override final
Set every element in the vector to 0.
std::enable_if< ScalarTraits< T2 >::value, void >::type add(const T2 factor, const DenseVector< T3 > &vec)
Adds factor times vec to this vector.
void get_principal_subvector(unsigned int sub_n, DenseVector< T > &dest) const
Puts the principal subvector of size sub_n (i.e.
CompareTypes< T, T2 >::supertype dot(const DenseVector< T2 > &vec) const
virtual unsigned int size() const override final
processor_id_type processor_id() const
This class is part of the rbOOmit framework.
virtual Real residual_scaling_denom(Real alpha_LB)
Specifies the residual scaling on the denominator to be used in the a posteriori error bound.
virtual void legacy_write_offline_data_to_files(const std::string &directory_name="offline_data", const bool write_binary_data=true)
Write out all the data to text files in order to segregate the Offline stage from the Online stage.
std::vector< Number > Fq_representor_innerprods
Vectors storing the residual representor inner products to be used in computing the residuals online.
virtual void resize_data_structures(const unsigned int Nmax, bool resize_error_bound_data=true)
Resize and clear the data vectors corresponding to the value of Nmax.
bool compute_RB_inner_product
Boolean flag to indicate whether we compute the RB_inner_product_matrix.
virtual Real get_stability_lower_bound()
Get a lower bound for the stability constant (e.g.
bool evaluate_RB_error_bound
Boolean to indicate whether we evaluate a posteriori error bounds when rb_solve is called.
std::vector< std::vector< std::vector< Number > > > Aq_Aq_representor_innerprods
virtual unsigned int get_n_basis_functions() const
Get the current number of basis functions.
std::vector< std::vector< std::vector< Number > > > Fq_Aq_representor_innerprods
Vectors storing the residual representor inner products to be used in computing the residuals online.
std::vector< std::vector< DenseVector< Number > > > RB_output_vectors
The vectors storing the RB output vectors.
Real eval_output_dual_norm(unsigned int n, const std::vector< Number > *evaluated_thetas)
Evaluate the dual norm of output n for the current parameters, or using the pre-evaluted theta values...
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the rb_theta_expansion.
virtual void clear_riesz_representors()
Clear all the Riesz representors that are used to compute the RB residual (and hence error bound).
static void assert_file_exists(const std::string &file_name)
Helper function that checks if file_name exists.
virtual void clear() override
Clear this RBEvaluation object.
std::vector< DenseVector< Number > > RB_Fq_vector
Dense vector for the RHS.
DenseVector< Number > RB_solution
The RB solution vector.
virtual void legacy_read_offline_data_from_files(const std::string &directory_name="offline_data", bool read_error_bound_data=true, const bool read_binary_data=true)
Read in the saved Offline reduced basis data to initialize the system for Online solves.
std::vector< DenseMatrix< Number > > RB_Aq_vector
Dense matrices for the RB computations.
This class is part of the rbOOmit framework.
const RBParameters & get_parameters() const
Get the current parameters.
Real get_control(const unsigned int k) const
Get/set the RHS control.
void set_delta_t(const Real delta_t_in)
void set_euler_theta(const Real euler_theta_in)
void set_n_time_steps(const unsigned int K)
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.
void set_time_step(const unsigned int k)
unsigned int get_n_time_steps() const
Get/set the total number of time-steps.
unsigned int get_time_step() const
Get/set the current time-step.
virtual Number eval_F_theta(unsigned int q, const RBParameters &mu) const
Evaluate theta_q_f at the current parameter.
unsigned int get_n_F_terms() const
Get Q_f, the number of terms in the affine expansion for the right-hand side.
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form.
virtual Number eval_A_theta(unsigned int q, const RBParameters &mu) const
Evaluate theta_q_a at the current parameter.
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.
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 Real get_error_bound_normalization() override
std::vector< std::vector< Real > > RB_output_error_bounds_all_k
The error bounds for each RB output for all time-levels from the most recent rb_solve.
std::vector< std::vector< std::vector< std::vector< Number > > > > Aq_Mq_representor_innerprods
std::vector< std::vector< Number > > RB_outputs_all_k
The RB outputs for all time-levels from the most recent rb_solve.
DenseVector< Number > RB_RHS_save
virtual void clear() override
Clear this TransientRBEvaluation object.
Number cached_Fq_term
Cached residual terms.
std::vector< std::vector< std::vector< Number > > > Mq_Mq_representor_innerprods
virtual ~TransientRBEvaluation()
std::vector< std::vector< std::vector< Number > > > Fq_Mq_representor_innerprods
Vectors storing the residual representor inner products to be used in computing the residuals online.
void cache_online_residual_terms(const unsigned int N)
Helper function for caching the terms in the online residual assembly that do not change in time.
DenseMatrix< Number > RB_LHS_matrix
Cached data for subsequent solves.
std::vector< Real > error_bound_all_k
The error bound data for all time-levels from the most recent rb_solve.
DenseMatrix< Number > RB_L2_matrix
Dense RB L2 matrix.
virtual void resize_data_structures(const unsigned int Nmax, bool resize_error_bound_data=true) override
Resize and clear the data vectors corresponding to the value of Nmax.
DenseVector< Number > cached_Fq_Mq_vector
virtual Real uncached_compute_residual_dual_norm(const unsigned int N)
Compute the dual norm of the residual for the solution saved in RB_solution.
std::vector< std::vector< std::unique_ptr< NumericVector< Number > > > > M_q_representor
Vector storing the mass matrix representors.
DenseVector< Number > cached_Fq_Aq_vector
DenseMatrix< Number > cached_Aq_Mq_matrix
std::vector< Real > initial_L2_error_all_N
Vector storing initial L2 error for all 1 <= N <= RB_size.
bool _rb_solve_data_cached
Check that the data has been cached in case of using rb_solve_again.
TransientRBEvaluation(const Parallel::Communicator &comm_in)
Constructor.
std::vector< DenseMatrix< Number > > RB_M_q_vector
Dense matrices for the RB mass matrices.
DenseMatrix< Number > RB_RHS_matrix
DenseVector< Number > old_RB_solution
The RB solution at the previous time-level.
DenseMatrix< Number > cached_Aq_Aq_matrix
std::vector< DenseVector< Number > > RB_temporal_solution_data
Array storing the solution data at each time level from the most recent solve.
std::vector< DenseVector< Number > > RB_initial_condition_all_N
The RB initial conditions (i.e.
virtual Real rb_solve_again()
If a solve has already been performed, then we cached some data and we can perform a new solve much m...
virtual Real residual_scaling_numer(Real alpha_LB)
Specifies the residual scaling on the numerator to be used in the a posteriori error bound.
virtual Real compute_residual_dual_norm(const unsigned int N) override
Compute the dual norm of the residual for the solution saved in RB_solution_vector.
DenseMatrix< Number > cached_Mq_Mq_matrix
virtual void legacy_read_offline_data_from_files(const std::string &directory_name="offline_data", bool read_error_bound_data=true, const bool read_binary_data=true) override
Read in the saved Offline reduced basis data to initialize the system for Online solves.
virtual void clear_riesz_representors() override
Clear all the Riesz representors that are used to compute the RB residual (and hence error bound).
virtual void legacy_write_offline_data_to_files(const std::string &directory_name="offline_data", const bool write_binary_data=true) override
Write out all the data to text files in order to segregate the Offline stage from the Online stage.
virtual Real rb_solve(unsigned int N) override
Perform online solve with the N RB basis functions, for the set of parameters in current_params,...
This class stores the set of RBTheta functor objects that define the "parameter-dependent expansion" ...
virtual unsigned int get_n_M_terms() const
Get Q_m, the number of terms in the affine expansion for the mass operator.
virtual Number eval_M_theta(unsigned int q, const RBParameters &mu) const
Evaluate theta at the current parameter.
This class implements a C++ interface to the XDR (eXternal Data Representation) format.
void close()
Closes the file if it is open.
The libMesh namespace provides an interface to certain functionality in the library.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
XdrMODE
Defines an enum for read/write mode in Xdr format.
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...