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();
std::vector< std::vector< std::vector< Number > > > Mq_Mq_representor_innerprods
bool compute_RB_inner_product
Boolean flag to indicate whether we compute the RB_inner_product_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.
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 Number eval_A_theta(unsigned int q, const RBParameters &mu) const
Evaluate theta_q_a at the current parameter.
bool evaluate_RB_error_bound
Boolean to indicate whether we evaluate a posteriori error bounds when rb_solve is called...
void set_delta_t(const Real delta_t_in)
boostcopy::enable_if_c< ScalarTraits< T2 >::value, void >::type add(const T2 factor, const DenseVector< T3 > &vec)
Adds factor times vec to this vector.
std::vector< Number > Fq_representor_innerprods
Vectors storing the residual representor inner products to be used in computing the residuals online...
virtual void zero() override final
Set every element in the vector to 0.
unsigned int get_n_F_terms() const
Get Q_f, the number of terms in the affine expansion for the right-hand side.
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.
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.
DenseVector< Number > RB_solution
The RB solution vector.
Number cached_Fq_term
Cached residual terms.
DenseMatrix< Number > RB_LHS_matrix
Cached data for subsequent solves.
virtual void zero() override final
Sets all elements of the matrix to 0 and resets any decomposition flag which may have been previously...
virtual void clear_riesz_representors() override
Clear all the Riesz representors that are used to compute the RB residual (and hence error bound)...
std::vector< DenseMatrix< Number > > RB_M_q_vector
Dense matrices for the RB mass matrices.
void resize(const unsigned int n)
Resize the vector.
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...
DenseVector< Number > old_RB_solution
The RB solution at the previous time-level.
DenseMatrix< Number > cached_Aq_Aq_matrix
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form.
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.
This class stores the set of RBTheta functor objects that define the "parameter-dependent expansion" ...
The libMesh namespace provides an interface to certain functionality in the library.
virtual Number eval_M_theta(unsigned int q, const RBParameters &mu) const
Evaluate theta at the current parameter.
Real get_delta_t() const
Get/set delta_t, the time-step size.
unsigned int get_n_outputs() const
Get n_outputs, the number output functionals.
virtual Real get_error_bound_normalization() override
Real get_euler_theta() const
Get/set euler_theta, parameter that determines the temporal discretization.
DenseVector< Number > cached_Fq_Mq_vector
void set_time_step(const unsigned int k)
XdrMODE
Defines an enum for read/write mode in Xdr format.
DenseVector< Number > RB_RHS_save
std::vector< DenseVector< Number > > RB_Fq_vector
Dense vector for the RHS.
std::vector< std::vector< std::unique_ptr< NumericVector< Number > > > > M_q_representor
Vector storing the mass matrix representors.
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...
bool _rb_solve_data_cached
Check that the data has been cached in case of using rb_solve_again.
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.
virtual Real get_stability_lower_bound()
Get a lower bound for the stability constant (e.g.
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...
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.
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 unsigned int get_n_M_terms() const
Get Q_m, the number of terms in the affine expansion for the mass operator.
DenseVector< Number > cached_Fq_Aq_vector
boostcopy::enable_if_c< ScalarTraits< T2 >::value, void >::type add(const T2 factor, const DenseMatrix< T3 > &mat)
Adds factor times mat to this matrix.
virtual Number eval_F_theta(unsigned int q, const RBParameters &mu) const
Evaluate theta_q_f at the current parameter.
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...
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.
const RBParameters & get_parameters() const
Get the current parameters.
std::vector< Real > error_bound_all_k
The error bound data for all time-levels from the most recent rb_solve.
unsigned int get_time_step() const
Get/set the current time-step.
virtual void clear() override
Clear this TransientRBEvaluation object.
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...
This class implements a C++ interface to the XDR (eXternal Data Representation) format.
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...
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...
std::vector< DenseVector< Number > > RB_initial_condition_all_N
The RB initial conditions (i.e.
DenseMatrix< Number > cached_Mq_Mq_matrix
This class is part of the rbOOmit framework.
virtual void clear_riesz_representors()
Clear all the Riesz representors that are used to compute the RB residual (and hence error bound)...
CompareTypes< T, T2 >::supertype dot(const DenseVector< T2 > &vec) const
std::vector< DenseMatrix< Number > > RB_Aq_vector
Dense matrices for the RB computations.
void lu_solve(const DenseVector< T > &b, DenseVector< T > &x)
Solve the system Ax=b given the input vector b.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
unsigned int get_n_output_terms(unsigned int output_index) const
Get the number of affine terms associated with the specified output.
Real eval_output_dual_norm(unsigned int n, const RBParameters &mu)
Evaluate the dual norm of output n for the current parameters.
static void assert_file_exists(const std::string &file_name)
Helper function that checks if file_name exists.
virtual unsigned int get_n_basis_functions() const
Get the current number of basis functions.
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.
std::vector< DenseVector< Number > > RB_temporal_solution_data
Array storing the solution data at each time level from the most recent solve.
virtual void clear() override
Clear this RBEvaluation object.
void resize(const unsigned int new_m, const unsigned int new_n)
Resizes the matrix to the specified size and calls zero().
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...
void set_euler_theta(const Real euler_theta_in)
DenseMatrix< Number > RB_RHS_matrix
std::vector< std::vector< Number > > RB_outputs_all_k
The RB outputs for all time-levels from the most recent rb_solve.
virtual unsigned int size() const override final
unsigned int get_n_time_steps() const
Get/set the total number of time-steps.
virtual ~TransientRBEvaluation()
std::vector< std::vector< std::vector< std::vector< Number > > > > Aq_Mq_representor_innerprods
void set_n_time_steps(const unsigned int K)
processor_id_type processor_id() const
TransientRBEvaluation(const Parallel::Communicator &comm_in)
Constructor.
Real get_control(const unsigned int k) const
Get/set the RHS control.
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, where 0 <= N <= RB_size.
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the rb_theta_expansion.
DenseMatrix< Number > RB_L2_matrix
Dense RB L2 matrix.
void vector_mult(DenseVector< T > &dest, const DenseVector< T > &arg) const
Performs the matrix-vector multiplication, dest := (*this) * arg.
std::vector< std::vector< std::vector< Number > > > Aq_Aq_representor_innerprods
std::vector< std::vector< DenseVector< Number > > > RB_output_vectors
The vectors storing the RB output vectors.