libMesh
rb_evaluation.C
Go to the documentation of this file.
1 // rbOOmit: An implementation of the Certified Reduced Basis method.
2 // Copyright (C) 2009, 2010 David J. Knezevic
3 
4 // This file is part of rbOOmit.
5 
6 // rbOOmit is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
10 
11 // rbOOmit is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
15 
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 
20 // rbOOmit includes
21 #include "libmesh/rb_evaluation.h"
22 #include "libmesh/rb_theta_expansion.h"
23 
24 // libMesh includes
25 #include "libmesh/libmesh_common.h"
26 #include "libmesh/libmesh_version.h"
27 #include "libmesh/system.h"
28 #include "libmesh/numeric_vector.h"
29 #include "libmesh/libmesh_logging.h"
30 #include "libmesh/xdr_cxx.h"
31 #include "libmesh/mesh_tools.h"
32 #include "libmesh/utility.h"
33 
34 // TIMPI includes
35 #include "timpi/communicator.h"
36 
37 // C/C++ includes
38 #include <sys/types.h>
39 #include <sys/stat.h>
40 #include <errno.h>
41 #include <fstream>
42 #include <sstream>
43 #include <iomanip>
44 
45 namespace libMesh
46 {
47 
49  :
50  ParallelObject(comm_in),
51  evaluate_RB_error_bound(true),
52  compute_RB_inner_product(false),
53  rb_theta_expansion(nullptr)
54 {
55 }
56 
57 RBEvaluation::~RBEvaluation() = default;
58 
60 {
61  LOG_SCOPE("clear()", "RBEvaluation");
62 
63  // Clear the basis functions
64  basis_functions.clear();
66 
68 
69  // Clear the Greedy param list
70  for (auto & plist : greedy_param_list)
71  plist.clear();
72  greedy_param_list.clear();
73 }
74 
75 void RBEvaluation::set_n_basis_functions(unsigned int n_bfs)
76 {
77  basis_functions.resize(n_bfs);
78 }
79 
81 {
82  rb_theta_expansion = &rb_theta_expansion_in;
83 }
84 
86 {
87  libmesh_error_msg_if(!is_rb_theta_expansion_initialized(),
88  "Error: rb_theta_expansion hasn't been initialized yet");
89 
90  return *rb_theta_expansion;
91 }
92 
94 {
95  libmesh_error_msg_if(!is_rb_theta_expansion_initialized(),
96  "Error: rb_theta_expansion hasn't been initialized yet");
97 
98  return *rb_theta_expansion;
99 }
100 
102 {
103  if (rb_theta_expansion)
104  {
105  return true;
106  }
107  else
108  {
109  return false;
110  }
111 }
112 
113 void RBEvaluation::resize_data_structures(const unsigned int Nmax,
114  bool resize_error_bound_data)
115 {
116  LOG_SCOPE("resize_data_structures()", "RBEvaluation");
117 
118  libmesh_error_msg_if(Nmax < this->get_n_basis_functions(),
119  "Error: Cannot set Nmax to be less than the current number of basis functions.");
120 
121  // Resize/clear inner product matrix
123  RB_inner_product_matrix.resize(Nmax,Nmax);
124 
125  // Allocate dense matrices for RB solves
127 
128  for (unsigned int q=0; q<rb_theta_expansion->get_n_A_terms(); q++)
129  {
130  // Initialize the memory for the RB matrices
131  RB_Aq_vector[q].resize(Nmax,Nmax);
132  }
133 
135 
136  for (unsigned int q=0; q<rb_theta_expansion->get_n_F_terms(); q++)
137  {
138  // Initialize the memory for the RB vectors
139  RB_Fq_vector[q].resize(Nmax);
140  }
141 
142 
143  // Initialize the RB output vectors
145  for (unsigned int n=0; n<rb_theta_expansion->get_n_outputs(); n++)
146  {
148  for (unsigned int q_l=0; q_l<rb_theta_expansion->get_n_output_terms(n); q_l++)
149  {
150  RB_output_vectors[n][q_l].resize(Nmax);
151  }
152  }
153 
154  // Initialize vectors storing output data
156 
157 
158  if (resize_error_bound_data)
159  {
160  // Initialize vectors for the norms of the Fq representors
161  unsigned int Q_f_hat = rb_theta_expansion->get_n_F_terms()*(rb_theta_expansion->get_n_F_terms()+1)/2;
162  Fq_representor_innerprods.resize(Q_f_hat);
163 
164  // Initialize vectors for the norms of the representors
166  for (unsigned int i=0; i<rb_theta_expansion->get_n_F_terms(); i++)
167  {
169  for (unsigned int j=0; j<rb_theta_expansion->get_n_A_terms(); j++)
170  {
171  Fq_Aq_representor_innerprods[i][j].resize(Nmax, 0.);
172  }
173  }
174 
175  unsigned int Q_a_hat = rb_theta_expansion->get_n_A_terms()*(rb_theta_expansion->get_n_A_terms()+1)/2;
176  Aq_Aq_representor_innerprods.resize(Q_a_hat);
177  for (unsigned int i=0; i<Q_a_hat; i++)
178  {
179  Aq_Aq_representor_innerprods[i].resize(Nmax);
180  for (unsigned int j=0; j<Nmax; j++)
181  {
182  Aq_Aq_representor_innerprods[i][j].resize(Nmax, 0.);
183  }
184  }
185 
187 
188  // Resize the output dual norm vectors
190  for (unsigned int n=0; n<rb_theta_expansion->get_n_outputs(); n++)
191  {
192  unsigned int Q_l_hat = rb_theta_expansion->get_n_output_terms(n)*(rb_theta_expansion->get_n_output_terms(n)+1)/2;
193  output_dual_innerprods[n].resize(Q_l_hat);
194  }
195 
196  // Clear and resize the vector of Aq_representors
198 
200  for (unsigned int q_a=0; q_a<rb_theta_expansion->get_n_A_terms(); q_a++)
201  {
202  Aq_representor[q_a].resize(Nmax);
203  }
204  }
205 }
206 
208 {
209  libmesh_assert_less (i, basis_functions.size());
210 
211  return *(basis_functions[i]);
212 }
213 
215 {
216  libmesh_assert_less (i, basis_functions.size());
217 
218  return *(basis_functions[i]);
219 }
220 
222 {
223  return rb_solve(N, nullptr);
224 }
225 
227  const std::vector<Number> * evaluated_thetas)
228 {
229  LOG_SCOPE("rb_solve()", "RBEvaluation");
230 
231  libmesh_error_msg_if(N > get_n_basis_functions(),
232  "ERROR: N cannot be larger than the number of basis functions in rb_solve");
233 
234  // In case the theta functions have been pre-evaluated, first check the size for consistency. The
235  // size of the input "evaluated_thetas" vector must match the sum of the "A", "F", and "output" terms
236  // in the expansion.
237  this->check_evaluated_thetas_size(evaluated_thetas);
238 
239  const RBParameters & mu = get_parameters();
240 
241  // Resize (and clear) the solution vector
242  RB_solution.resize(N);
243 
244  // Assemble the RB system
245  DenseMatrix<Number> RB_system_matrix(N,N);
246  RB_system_matrix.zero();
247 
248  DenseMatrix<Number> RB_Aq_a;
249  for (unsigned int q_a=0; q_a<rb_theta_expansion->get_n_A_terms(); q_a++)
250  {
251  RB_Aq_vector[q_a].get_principal_submatrix(N, RB_Aq_a);
252 
253  if (evaluated_thetas)
254  RB_system_matrix.add((*evaluated_thetas)[q_a], RB_Aq_a);
255  else
256  RB_system_matrix.add(rb_theta_expansion->eval_A_theta(q_a, mu), RB_Aq_a);
257  }
258 
259  // Assemble the RB rhs
260  DenseVector<Number> RB_rhs(N);
261  RB_rhs.zero();
262 
263  DenseVector<Number> RB_Fq_f;
264  for (unsigned int q_f=0; q_f<rb_theta_expansion->get_n_F_terms(); q_f++)
265  {
266  RB_Fq_vector[q_f].get_principal_subvector(N, RB_Fq_f);
267 
268  if (evaluated_thetas)
269  RB_rhs.add((*evaluated_thetas)[q_f+rb_theta_expansion->get_n_A_terms()], RB_Fq_f);
270  else
271  RB_rhs.add(rb_theta_expansion->eval_F_theta(q_f, mu), RB_Fq_f);
272  }
273 
274  // Solve the linear system
275  if (N > 0)
276  {
277  RB_system_matrix.lu_solve(RB_rhs, RB_solution);
278  }
279 
280  // Place to store the output of get_principal_subvector() calls
281  DenseVector<Number> RB_output_vector_N;
282 
283  // Evaluate RB outputs
284  unsigned int output_counter = 0;
285  for (unsigned int n=0; n<rb_theta_expansion->get_n_outputs(); n++)
286  {
287  RB_outputs[n] = 0.;
288  for (unsigned int q_l=0; q_l<rb_theta_expansion->get_n_output_terms(n); q_l++)
289  {
290  RB_output_vectors[n][q_l].get_principal_subvector(N, RB_output_vector_N);
291 
292  // Compute dot product with current output vector and RB_solution
293  auto dot_prod = RB_output_vector_N.dot(RB_solution);
294 
295  // Determine the coefficient depending on whether or not
296  // pre-evaluated thetas were provided. Note that if
297  // pre-evaluated thetas were provided, they must come after
298  // the "A" and "F" thetas and be in "row-major" order. In
299  // other words, there is a possibly "ragged" 2D array of
300  // output thetas ordered by output index "n" and term index
301  // "q_l" which is accessed in row-major order.
302  auto coeff = evaluated_thetas ?
303  (*evaluated_thetas)[output_counter + rb_theta_expansion->get_n_A_terms() + rb_theta_expansion->get_n_F_terms()] :
305 
306  // Finally, accumulate the result in RB_outputs[n]
307  RB_outputs[n] += coeff * dot_prod;
308 
309  // Go to next output
310  output_counter++;
311  }
312  }
313 
314  if (evaluate_RB_error_bound) // Calculate the error bounds
315  {
316  // Evaluate the dual norm of the residual for RB_solution_vector
317  Real epsilon_N = compute_residual_dual_norm(N, evaluated_thetas);
318 
319  // Get lower bound for coercivity constant
320  const Real alpha_LB = get_stability_lower_bound();
321  // alpha_LB needs to be positive to get a valid error bound
322  libmesh_assert_greater ( alpha_LB, 0. );
323 
324  // Evaluate the (absolute) error bound
325  Real abs_error_bound = epsilon_N / residual_scaling_denom(alpha_LB);
326 
327  // Now compute the output error bounds
328  for (unsigned int n=0; n<rb_theta_expansion->get_n_outputs(); n++)
329  RB_output_error_bounds[n] = abs_error_bound * this->eval_output_dual_norm(n, evaluated_thetas);
330 
331  return abs_error_bound;
332  }
333  else // Don't calculate the error bounds
334  {
335  // Just return -1. if we did not compute the error bound
336  return -1.;
337  }
338 }
339 
341 {
342  // Normalize the error based on the error bound in the
343  // case of an empty reduced basis. The error bound is based
344  // on the residual F - AU, so with an empty basis this gives
345  // a value based on the norm of F at the current parameters.
346 
347  Real normalization = rb_solve(0);
348  return normalization;
349 }
350 
352 {
353  return compute_residual_dual_norm(N, nullptr);
354 }
355 
357  const std::vector<Number> * evaluated_thetas)
358 {
359  LOG_SCOPE("compute_residual_dual_norm()", "RBEvaluation");
360 
361  // In case the theta functions have been pre-evaluated, first check the size for consistency
362  this->check_evaluated_thetas_size(evaluated_thetas);
363 
364  // If evaluated_thetas is provided, then mu is not actually used for anything
365  const RBParameters & mu = get_parameters();
366 
367  const unsigned int n_A_terms = rb_theta_expansion->get_n_A_terms();
368  const unsigned int n_F_terms = rb_theta_expansion->get_n_F_terms();
369 
370  // Use the stored representor inner product values
371  // to evaluate the residual norm
372  Number residual_norm_sq = 0.;
373 
374  // Lambdas to help with evaluating F_theta and A_theta functions
375  // using either the pre-evaluated thetas (if provided) or by calling
376  // eval_{F,A}_theta()
377  auto eval_F = [&](unsigned int index)
378  {
379  return (evaluated_thetas) ? (*evaluated_thetas)[index + n_A_terms] : rb_theta_expansion->eval_F_theta(index, mu);
380  };
381  auto eval_A = [&](unsigned int index)
382  {
383  return (evaluated_thetas) ? (*evaluated_thetas)[index] : rb_theta_expansion->eval_A_theta(index, mu);
384  };
385 
386  unsigned int q=0;
387  for (unsigned int q_f1=0; q_f1<n_F_terms; q_f1++)
388  {
389  const Number val_q_f1 = eval_F(q_f1);
390 
391  for (unsigned int q_f2=q_f1; q_f2<n_F_terms; q_f2++)
392  {
393  const Number val_q_f2 = eval_F(q_f2);
394 
395  Real delta = (q_f1==q_f2) ? 1. : 2.;
396  residual_norm_sq += delta * libmesh_real(val_q_f1 * libmesh_conj(val_q_f2) * Fq_representor_innerprods[q] );
397 
398  q++;
399  }
400  }
401 
402  for (unsigned int q_f=0; q_f<n_F_terms; q_f++)
403  {
404  const Number val_q_f = eval_F(q_f);
405 
406  for (unsigned int q_a=0; q_a<n_A_terms; q_a++)
407  {
408  const Number val_q_a = eval_A(q_a);
409 
410  for (unsigned int i=0; i<N; i++)
411  {
412  Real delta = 2.;
413  residual_norm_sq +=
414  delta * libmesh_real( val_q_f * libmesh_conj(val_q_a) *
416  }
417  }
418  }
419 
420  q=0;
421  for (unsigned int q_a1=0; q_a1<n_A_terms; q_a1++)
422  {
423  const Number val_q_a1 = eval_A(q_a1);
424 
425  for (unsigned int q_a2=q_a1; q_a2<n_A_terms; q_a2++)
426  {
427  const Number val_q_a2 = eval_A(q_a2);
428 
429  Real delta = (q_a1==q_a2) ? 1. : 2.;
430 
431  for (unsigned int i=0; i<N; i++)
432  {
433  for (unsigned int j=0; j<N; j++)
434  {
435  residual_norm_sq +=
436  delta * libmesh_real( libmesh_conj(val_q_a1) * val_q_a2 *
438  }
439  }
440 
441  q++;
442  }
443  }
444 
445  if (libmesh_real(residual_norm_sq) < 0.)
446  {
447  // libMesh::out << "Warning: Square of residual norm is negative "
448  // << "in RBSystem::compute_residual_dual_norm()" << std::endl;
449 
450  // Sometimes this is negative due to rounding error,
451  // but when this occurs the error is on the order of 1.e-10,
452  // so shouldn't affect error bound much...
453  residual_norm_sq = std::abs(residual_norm_sq);
454  }
455 
456  return std::sqrt( libmesh_real(residual_norm_sq) );
457 }
458 
460 {
461  // Return a default value of 1, this function should
462  // be overloaded to specify a problem-dependent stability
463  // factor lower bound
464  return 1.;
465 }
466 
468 {
469  // Here we implement the residual scaling for a coercive
470  // problem.
471  return alpha_LB;
472 }
473 
474 #ifdef LIBMESH_ENABLE_DEPRECATED
476 {
477  libmesh_deprecated();
478 
479  // Call non-deprecated version of this function, ignoring input mu
480  return this->eval_output_dual_norm(n, nullptr);
481 }
482 #endif // LIBMESH_ENABLE_DEPRECATED
483 
485  const std::vector<Number> * evaluated_thetas)
486 {
487  // Return value
488  Number output_bound_sq = 0.;
489 
490  // mu is only used if evaluated_thetas == nullptr
491  const RBParameters & mu = this->get_parameters();
492 
493  // Index into output_dual_innerprods
494  unsigned int q=0;
495  for (unsigned int q_l1=0; q_l1<rb_theta_expansion->get_n_output_terms(n); q_l1++)
496  {
497  for (unsigned int q_l2=q_l1; q_l2<rb_theta_expansion->get_n_output_terms(n); q_l2++)
498  {
499  Real delta = (q_l1==q_l2) ? 1. : 2.;
500 
501  Number val_l1 =
502  evaluated_thetas ?
505 
506  Number val_l2 =
507  evaluated_thetas ?
510 
511  output_bound_sq += delta * libmesh_real(
512  libmesh_conj(val_l1) * val_l2 * output_dual_innerprods[n][q]);
513 
514  q++;
515  }
516  }
517 
518  return libmesh_real(std::sqrt( output_bound_sq ));
519 }
520 
522 {
523  Aq_representor.clear();
524 }
525 
526 void RBEvaluation::legacy_write_offline_data_to_files(const std::string & directory_name,
527  const bool write_binary_data)
528 {
529  LOG_SCOPE("legacy_write_offline_data_to_files()", "RBEvaluation");
530 
531  // Get the number of basis functions
532  unsigned int n_bfs = get_n_basis_functions();
533 
534  // The writing mode: ENCODE for binary, WRITE for ASCII
535  XdrMODE mode = write_binary_data ? ENCODE : WRITE;
536 
537  // The suffix to use for all the files that are written out
538  const std::string suffix = write_binary_data ? ".xdr" : ".dat";
539 
540  if (this->processor_id() == 0)
541  {
542 
543  // Make a directory to store all the data files
544  Utility::mkdir(directory_name.c_str());
545  // if (mkdir(directory_name.c_str(), 0777) == -1)
546  // {
547  // libMesh::out << "In RBEvaluation::write_offline_data_to_files, directory "
548  // << directory_name << " already exists, overwriting contents." << std::endl;
549  // }
550 
551  // First, write out how many basis functions we have generated
552  std::ostringstream file_name;
553  {
554  file_name << directory_name << "/n_bfs" << suffix;
555  Xdr n_bfs_out(file_name.str(), mode);
556  n_bfs_out << n_bfs;
557  n_bfs_out.close();
558  }
559 
560  // Write out the parameter ranges
561  file_name.str("");
562  file_name << directory_name << "/parameter_ranges" << suffix;
563  std::string continuous_param_file_name = file_name.str();
564 
565  // Write out the discrete parameter values
566  file_name.str("");
567  file_name << directory_name << "/discrete_parameter_values" << suffix;
568  std::string discrete_param_file_name = file_name.str();
569 
570  write_parameter_data_to_files(continuous_param_file_name,
571  discrete_param_file_name,
572  write_binary_data);
573 
574  // Write out Fq representor norm data
575  file_name.str("");
576  file_name << directory_name << "/Fq_innerprods" << suffix;
577  Xdr RB_Fq_innerprods_out(file_name.str(), mode);
578  unsigned int Q_f_hat = rb_theta_expansion->get_n_F_terms()*(rb_theta_expansion->get_n_F_terms()+1)/2;
579  for (unsigned int i=0; i<Q_f_hat; i++)
580  {
581  RB_Fq_innerprods_out << Fq_representor_innerprods[i];
582  }
583  RB_Fq_innerprods_out.close();
584 
585  // Write out output data
586  for (unsigned int n=0; n<rb_theta_expansion->get_n_outputs(); n++)
587  {
588  file_name.str("");
589  file_name << directory_name << "/output_";
590  file_name << std::setw(3)
591  << std::setprecision(0)
592  << std::setfill('0')
593  << std::right
594  << n;
595 
596  file_name << "_dual_innerprods" << suffix;
597  Xdr output_dual_innerprods_out(file_name.str(), mode);
598 
599  unsigned int Q_l_hat = rb_theta_expansion->get_n_output_terms(n)*(rb_theta_expansion->get_n_output_terms(n)+1)/2;
600  for (unsigned int q=0; q<Q_l_hat; q++)
601  {
602  output_dual_innerprods_out << output_dual_innerprods[n][q];
603  }
604  output_dual_innerprods_out.close();
605  }
606 
607 
608  // Write out output data to multiple files
609  for (unsigned int n=0; n<rb_theta_expansion->get_n_outputs(); n++)
610  {
611  for (unsigned int q_l=0; q_l<rb_theta_expansion->get_n_output_terms(n); q_l++)
612  {
613  file_name.str("");
614  file_name << directory_name << "/output_";
615  file_name << std::setw(3)
616  << std::setprecision(0)
617  << std::setfill('0')
618  << std::right
619  << n;
620  file_name << "_";
621  file_name << std::setw(3)
622  << std::setprecision(0)
623  << std::setfill('0')
624  << std::right
625  << q_l;
626  file_name << suffix;
627  Xdr output_n_out(file_name.str(), mode);
628 
629  for (unsigned int j=0; j<n_bfs; j++)
630  {
631  output_n_out << RB_output_vectors[n][q_l](j);
632  }
633  output_n_out.close();
634  }
635  }
636 
638  {
639  // Next write out the inner product matrix
640  file_name.str("");
641  file_name << directory_name << "/RB_inner_product_matrix" << suffix;
642  Xdr RB_inner_product_matrix_out(file_name.str(), mode);
643  for (unsigned int i=0; i<n_bfs; i++)
644  {
645  for (unsigned int j=0; j<n_bfs; j++)
646  {
647  RB_inner_product_matrix_out << RB_inner_product_matrix(i,j);
648  }
649  }
650  RB_inner_product_matrix_out.close();
651  }
652 
653  // Next write out the Fq vectors
654  for (unsigned int q_f=0; q_f<rb_theta_expansion->get_n_F_terms(); q_f++)
655  {
656  file_name.str("");
657  file_name << directory_name << "/RB_F_";
658  file_name << std::setw(3)
659  << std::setprecision(0)
660  << std::setfill('0')
661  << std::right
662  << q_f;
663  file_name << suffix;
664  Xdr RB_Fq_f_out(file_name.str(), mode);
665 
666  for (unsigned int i=0; i<n_bfs; i++)
667  {
668  RB_Fq_f_out << RB_Fq_vector[q_f](i);
669  }
670  RB_Fq_f_out.close();
671  }
672 
673  // Next write out the Aq matrices
674  for (unsigned int q_a=0; q_a<rb_theta_expansion->get_n_A_terms(); q_a++)
675  {
676  file_name.str("");
677  file_name << directory_name << "/RB_A_";
678  file_name << std::setw(3)
679  << std::setprecision(0)
680  << std::setfill('0')
681  << std::right
682  << q_a;
683  file_name << suffix;
684  Xdr RB_Aq_a_out(file_name.str(), mode);
685 
686  for (unsigned int i=0; i<n_bfs; i++)
687  {
688  for (unsigned int j=0; j<n_bfs; j++)
689  {
690  RB_Aq_a_out << RB_Aq_vector[q_a](i,j);
691  }
692  }
693  RB_Aq_a_out.close();
694  }
695 
696  // Next write out Fq_Aq representor norm data
697  file_name.str("");
698  file_name << directory_name << "/Fq_Aq_innerprods" << suffix;
699  Xdr RB_Fq_Aq_innerprods_out(file_name.str(), mode);
700 
701  for (unsigned int q_f=0; q_f<rb_theta_expansion->get_n_F_terms(); q_f++)
702  {
703  for (unsigned int q_a=0; q_a<rb_theta_expansion->get_n_A_terms(); q_a++)
704  {
705  for (unsigned int i=0; i<n_bfs; i++)
706  {
707  RB_Fq_Aq_innerprods_out << Fq_Aq_representor_innerprods[q_f][q_a][i];
708  }
709  }
710  }
711  RB_Fq_Aq_innerprods_out.close();
712 
713  // Next write out Aq_Aq representor norm data
714  file_name.str("");
715  file_name << directory_name << "/Aq_Aq_innerprods" << suffix;
716  Xdr RB_Aq_Aq_innerprods_out(file_name.str(), mode);
717 
718  unsigned int Q_a_hat = rb_theta_expansion->get_n_A_terms()*(rb_theta_expansion->get_n_A_terms()+1)/2;
719  for (unsigned int i=0; i<Q_a_hat; i++)
720  {
721  for (unsigned int j=0; j<n_bfs; j++)
722  {
723  for (unsigned int l=0; l<n_bfs; l++)
724  {
725  RB_Aq_Aq_innerprods_out << Aq_Aq_representor_innerprods[i][j][l];
726  }
727  }
728  }
729  RB_Aq_Aq_innerprods_out.close();
730 
731  // Also, write out the greedily selected parameters
732  {
733  file_name.str("");
734  file_name << directory_name << "/greedy_params" << suffix;
735  Xdr greedy_params_out(file_name.str(), mode);
736 
737  for (const auto & param : greedy_param_list)
738  for (const auto & pr : param)
739  for (const auto & value_vector : pr.second)
740  {
741  // Need to make a copy of the value so that it's not const
742  // Xdr is not templated on const's
743  libmesh_error_msg_if(value_vector.size() != 1,
744  "Error: multi-value RB parameters are not yet supported here.");
745  Real param_value = value_vector[0];
746  greedy_params_out << param_value;
747  }
748  greedy_params_out.close();
749  }
750 
751  }
752 }
753 
754 void RBEvaluation::legacy_read_offline_data_from_files(const std::string & directory_name,
755  bool read_error_bound_data,
756  const bool read_binary_data)
757 {
758  LOG_SCOPE("legacy_read_offline_data_from_files()", "RBEvaluation");
759 
760  // The reading mode: DECODE for binary, READ for ASCII
761  XdrMODE mode = read_binary_data ? DECODE : READ;
762 
763  // The suffix to use for all the files that are written out
764  const std::string suffix = read_binary_data ? ".xdr" : ".dat";
765 
766  // The string stream we'll use to make the file names
767  std::ostringstream file_name;
768 
769  // First, find out how many basis functions we had when Greedy terminated
770  unsigned int n_bfs;
771  {
772  file_name << directory_name << "/n_bfs" << suffix;
773  assert_file_exists(file_name.str());
774 
775  Xdr n_bfs_in(file_name.str(), mode);
776  n_bfs_in >> n_bfs;
777  n_bfs_in.close();
778  }
779  resize_data_structures(n_bfs, read_error_bound_data);
780 
781  // Read in the parameter ranges
782  file_name.str("");
783  file_name << directory_name << "/parameter_ranges" << suffix;
784  std::string continuous_param_file_name = file_name.str();
785 
786  // Read in the discrete parameter values
787  file_name.str("");
788  file_name << directory_name << "/discrete_parameter_values" << suffix;
789  std::string discrete_param_file_name = file_name.str();
790  read_parameter_data_from_files(continuous_param_file_name,
791  discrete_param_file_name,
792  read_binary_data);
793 
794  // Read in output data in multiple files
795  for (unsigned int n=0; n<rb_theta_expansion->get_n_outputs(); n++)
796  {
797  for (unsigned int q_l=0; q_l<rb_theta_expansion->get_n_output_terms(n); q_l++)
798  {
799  file_name.str("");
800  file_name << directory_name << "/output_";
801  file_name << std::setw(3)
802  << std::setprecision(0)
803  << std::setfill('0')
804  << std::right
805  << n;
806  file_name << "_";
807  file_name << std::setw(3)
808  << std::setprecision(0)
809  << std::setfill('0')
810  << std::right
811  << q_l;
812  file_name << suffix;
813  assert_file_exists(file_name.str());
814 
815  Xdr output_n_in(file_name.str(), mode);
816 
817  for (unsigned int j=0; j<n_bfs; j++)
818  {
819  Number value;
820  output_n_in >> value;
821  RB_output_vectors[n][q_l](j) = value;
822  }
823  output_n_in.close();
824  }
825  }
826 
828  {
829  // Next read in the inner product matrix
830  file_name.str("");
831  file_name << directory_name << "/RB_inner_product_matrix" << suffix;
832  assert_file_exists(file_name.str());
833 
834  Xdr RB_inner_product_matrix_in(file_name.str(), mode);
835 
836  for (unsigned int i=0; i<n_bfs; i++)
837  {
838  for (unsigned int j=0; j<n_bfs; j++)
839  {
840  Number value;
841  RB_inner_product_matrix_in >> value;
843  }
844  }
845  RB_inner_product_matrix_in.close();
846  }
847 
848  // Next read in the Fq vectors
849  for (unsigned int q_f=0; q_f<rb_theta_expansion->get_n_F_terms(); q_f++)
850  {
851  file_name.str("");
852  file_name << directory_name << "/RB_F_";
853  file_name << std::setw(3)
854  << std::setprecision(0)
855  << std::setfill('0')
856  << std::right
857  << q_f;
858  file_name << suffix;
859  assert_file_exists(file_name.str());
860 
861  Xdr RB_Fq_f_in(file_name.str(), mode);
862 
863  for (unsigned int i=0; i<n_bfs; i++)
864  {
865  Number value;
866  RB_Fq_f_in >> value;
867  RB_Fq_vector[q_f](i) = value;
868  }
869  RB_Fq_f_in.close();
870  }
871 
872  // Next read in the Aq matrices
873  for (unsigned int q_a=0; q_a<rb_theta_expansion->get_n_A_terms(); q_a++)
874  {
875  file_name.str("");
876  file_name << directory_name << "/RB_A_";
877  file_name << std::setw(3)
878  << std::setprecision(0)
879  << std::setfill('0')
880  << std::right
881  << q_a;
882  file_name << suffix;
883  assert_file_exists(file_name.str());
884 
885  Xdr RB_Aq_a_in(file_name.str(), mode);
886 
887  for (unsigned int i=0; i<n_bfs; i++)
888  {
889  for (unsigned int j=0; j<n_bfs; j++)
890  {
891  Number value;
892  RB_Aq_a_in >> value;
893  RB_Aq_vector[q_a](i,j) = value;
894  }
895  }
896  RB_Aq_a_in.close();
897  }
898 
899 
900  if (read_error_bound_data)
901  {
902  // Next read in Fq representor norm data
903  file_name.str("");
904  file_name << directory_name << "/Fq_innerprods" << suffix;
905  assert_file_exists(file_name.str());
906 
907  Xdr RB_Fq_innerprods_in(file_name.str(), mode);
908 
909  unsigned int Q_f_hat = rb_theta_expansion->get_n_F_terms()*(rb_theta_expansion->get_n_F_terms()+1)/2;
910  for (unsigned int i=0; i<Q_f_hat; i++)
911  {
912  RB_Fq_innerprods_in >> Fq_representor_innerprods[i];
913  }
914  RB_Fq_innerprods_in.close();
915 
916  // Read in output data
917  for (unsigned int n=0; n<rb_theta_expansion->get_n_outputs(); n++)
918  {
919  file_name.str("");
920  file_name << directory_name << "/output_";
921  file_name << std::setw(3)
922  << std::setprecision(0)
923  << std::setfill('0')
924  << std::right
925  << n;
926  file_name << "_dual_innerprods" << suffix;
927  assert_file_exists(file_name.str());
928 
929  Xdr output_dual_innerprods_in(file_name.str(), mode);
930 
931  unsigned int Q_l_hat = rb_theta_expansion->get_n_output_terms(n)*(rb_theta_expansion->get_n_output_terms(n)+1)/2;
932  for (unsigned int q=0; q<Q_l_hat; q++)
933  {
934  output_dual_innerprods_in >> output_dual_innerprods[n][q];
935  }
936  output_dual_innerprods_in.close();
937  }
938 
939 
940  // Next read in Fq_Aq representor norm data
941  file_name.str("");
942  file_name << directory_name << "/Fq_Aq_innerprods" << suffix;
943  assert_file_exists(file_name.str());
944 
945  Xdr RB_Fq_Aq_innerprods_in(file_name.str(), mode);
946 
947  for (unsigned int q_f=0; q_f<rb_theta_expansion->get_n_F_terms(); q_f++)
948  {
949  for (unsigned int q_a=0; q_a<rb_theta_expansion->get_n_A_terms(); q_a++)
950  {
951  for (unsigned int i=0; i<n_bfs; i++)
952  {
953  RB_Fq_Aq_innerprods_in >> Fq_Aq_representor_innerprods[q_f][q_a][i];
954  }
955  }
956  }
957  RB_Fq_Aq_innerprods_in.close();
958 
959  // Next read in Aq_Aq representor norm data
960  file_name.str("");
961  file_name << directory_name << "/Aq_Aq_innerprods" << suffix;
962  assert_file_exists(file_name.str());
963 
964  Xdr RB_Aq_Aq_innerprods_in(file_name.str(), mode);
965 
966  unsigned int Q_a_hat = rb_theta_expansion->get_n_A_terms()*(rb_theta_expansion->get_n_A_terms()+1)/2;
967  for (unsigned int i=0; i<Q_a_hat; i++)
968  {
969  for (unsigned int j=0; j<n_bfs; j++)
970  {
971  for (unsigned int l=0; l<n_bfs; l++)
972  {
973  RB_Aq_Aq_innerprods_in >> Aq_Aq_representor_innerprods[i][j][l];
974  }
975  }
976  }
977  RB_Aq_Aq_innerprods_in.close();
978  }
979 
980  // Resize basis_functions even if we don't read them in so that
981  // get_n_bfs() returns the correct value. Initialize the pointers
982  // to nullptr.
983  basis_functions.clear();
984  set_n_basis_functions(n_bfs);
985 }
986 
987 void RBEvaluation::assert_file_exists(const std::string & file_name)
988 {
989  libmesh_error_msg_if(!std::ifstream(file_name.c_str()), "File missing: " << file_name);
990 }
991 
993  const std::string & directory_name,
994  const bool write_binary_basis_functions)
995 {
996  LOG_SCOPE("write_out_basis_functions()", "RBEvaluation");
997 
998  std::vector<NumericVector<Number>*> basis_functions_ptrs;
999  for (std::size_t i=0; i<basis_functions.size(); i++)
1000  {
1001  basis_functions_ptrs.push_back(basis_functions[i].get());
1002  }
1003 
1004  write_out_vectors(sys,
1005  basis_functions_ptrs,
1006  directory_name,
1007  "bf",
1008  write_binary_basis_functions);
1009 }
1010 
1012  std::vector<NumericVector<Number>*> & vectors,
1013  const std::string & directory_name,
1014  const std::string & data_name,
1015  const bool write_binary_vectors)
1016 {
1017  LOG_SCOPE("write_out_vectors()", "RBEvaluation");
1018 
1019  if (sys.comm().rank() == 0)
1020  {
1021  // Make a directory to store all the data files
1022  Utility::mkdir(directory_name.c_str());
1023  }
1024 
1025  // Make sure processors are synced up before we begin
1026  sys.comm().barrier();
1027 
1028  std::ostringstream file_name;
1029  const std::string basis_function_suffix = (write_binary_vectors ? ".xdr" : ".dat");
1030 
1031  file_name << directory_name << "/" << data_name << "_data" << basis_function_suffix;
1032  Xdr bf_data(file_name.str(),
1033  write_binary_vectors ? ENCODE : WRITE);
1034 
1035  // Following EquationSystems::write(), we should only write the header information
1036  // if we're proc 0
1037  if (sys.comm().rank() == 0)
1038  {
1039  std::string version("libMesh-" + libMesh::get_io_compatibility_version());
1040 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
1041  version += " with infinite elements";
1042 #endif
1043  bf_data.data(version ,"# File Format Identifier");
1044 
1045  sys.write_header(bf_data, /*(unused arg)*/ version, /*write_additional_data=*/false);
1046  }
1047 
1048  // Following EquationSystemsIO::write, we use a temporary numbering (node major)
1049  // before writing out the data
1051 
1052  // Write all vectors at once.
1053  {
1054  // Note the API wants pointers to constant vectors, hence this...
1055  std::vector<const NumericVector<Number> *> bf_out;
1056  for (const auto & vec : vectors)
1057  bf_out.push_back(vec);
1058 
1059  // for (auto & val : vectors)
1060  // bf_out.push_back(val);
1061  sys.write_serialized_vectors (bf_data, bf_out);
1062  }
1063 
1064 
1065  // set the current version
1066  bf_data.set_version(LIBMESH_VERSION_ID(LIBMESH_MAJOR_VERSION,
1067  LIBMESH_MINOR_VERSION,
1068  LIBMESH_MICRO_VERSION));
1069 
1070 
1071  // Undo the temporary renumbering
1073 }
1074 
1076  const std::string & directory_name,
1077  const bool read_binary_basis_functions)
1078 {
1079  LOG_SCOPE("read_in_basis_functions()", "RBEvaluation");
1080 
1081  read_in_vectors(sys,
1083  directory_name,
1084  "bf",
1085  read_binary_basis_functions);
1086 }
1087 
1089  std::vector<std::unique_ptr<NumericVector<Number>>> & vectors,
1090  const std::string & directory_name,
1091  const std::string & data_name,
1092  const bool read_binary_vectors)
1093 {
1094  std::vector<std::vector<std::unique_ptr<NumericVector<Number>>> *> vectors_vec;
1095  vectors_vec.push_back(&vectors);
1096 
1097  std::vector<std::string> directory_name_vec;
1098  directory_name_vec.push_back(directory_name);
1099 
1100  std::vector<std::string> data_name_vec;
1101  data_name_vec.push_back(data_name);
1102 
1104  vectors_vec,
1105  directory_name_vec,
1106  data_name_vec,
1107  read_binary_vectors);
1108 }
1109 
1111  std::vector<std::vector<std::unique_ptr<NumericVector<Number>>> *> multiple_vectors,
1112  const std::vector<std::string> & multiple_directory_names,
1113  const std::vector<std::string> & multiple_data_names,
1114  const bool read_binary_vectors)
1115 {
1116  LOG_SCOPE("read_in_vectors_from_multiple_files()", "RBEvaluation");
1117 
1118  std::size_t n_files = multiple_vectors.size();
1119  std::size_t n_directories = multiple_directory_names.size();
1120  libmesh_assert((n_files == n_directories) && (n_files == multiple_data_names.size()));
1121 
1122  if (n_files == 0)
1123  return;
1124 
1125  // Make sure processors are synced up before we begin
1126  sys.comm().barrier();
1127 
1128  std::ostringstream file_name;
1129  const std::string basis_function_suffix = (read_binary_vectors ? ".xdr" : ".dat");
1130 
1131  // Following EquationSystemsIO::read, we use a temporary numbering (node major)
1132  // before writing out the data. For the sake of efficiency, we do this once for
1133  // all the vectors that we read in.
1135 
1136  for (std::size_t data_index=0; data_index<n_directories; data_index++)
1137  {
1138  std::vector<std::unique_ptr<NumericVector<Number>>> & vectors = *multiple_vectors[data_index];
1139 
1140  // Allocate storage for each vector
1141  for (auto & vec : vectors)
1142  {
1143  // vectors should all be nullptr, otherwise we get a memory leak when
1144  // we create the new vectors in RBEvaluation::read_in_vectors.
1145  libmesh_error_msg_if(vec, "Non-nullptr vector passed to read_in_vectors_from_multiple_files");
1146 
1147  vec = NumericVector<Number>::build(sys.comm());
1148 
1149  vec->init (sys.n_dofs(),
1150  sys.n_local_dofs(),
1151  false,
1152  PARALLEL);
1153  }
1154 
1155  file_name.str("");
1156  file_name << multiple_directory_names[data_index]
1157  << "/" << multiple_data_names[data_index]
1158  << "_data" << basis_function_suffix;
1159 
1160  // On processor zero check to be sure the file exists
1161  if (sys.comm().rank() == 0)
1162  {
1163  struct stat stat_info;
1164  int stat_result = stat(file_name.str().c_str(), &stat_info);
1165 
1166  libmesh_error_msg_if(stat_result != 0, "File does not exist: " << file_name.str());
1167  }
1168 
1169  assert_file_exists(file_name.str());
1170  Xdr vector_data(file_name.str(),
1171  read_binary_vectors ? DECODE : READ);
1172 
1173  // Read the header data. This block of code is based on EquationSystems::_read_impl.
1174  {
1175  std::string version;
1176  vector_data.data(version);
1177 
1178  const std::string libMesh_label = "libMesh-";
1179  std::string::size_type lm_pos = version.find(libMesh_label);
1180  libmesh_error_msg_if(lm_pos == std::string::npos, "version info missing in Xdr header");
1181 
1182  std::istringstream iss(version.substr(lm_pos + libMesh_label.size()));
1183  int ver_major = 0, ver_minor = 0, ver_patch = 0;
1184  char dot;
1185  iss >> ver_major >> dot >> ver_minor >> dot >> ver_patch;
1186  vector_data.set_version(LIBMESH_VERSION_ID(ver_major, ver_minor, ver_patch));
1187 
1188  // Actually read the header data. When we do this, set read_header=false
1189  // so that we do not reinit sys, since we assume that it has already been
1190  // set up properly (e.g. the appropriate variables have already been added).
1191  sys.read_header(vector_data, version, /*read_header=*/false, /*read_additional_data=*/false);
1192  }
1193 
1194  // Comply with the System::read_serialized_vectors() interface which uses dumb pointers.
1195  std::vector<NumericVector<Number> *> vec_in;
1196  for (auto & vec : vectors)
1197  vec_in.push_back(vec.get());
1198 
1199  sys.read_serialized_vectors (vector_data, vec_in);
1200  }
1201 
1202  // Undo the temporary renumbering
1204 }
1205 
1206 void RBEvaluation::check_evaluated_thetas_size(const std::vector<Number> * evaluated_thetas) const
1207 {
1208  if (rb_theta_expansion && evaluated_thetas)
1209  {
1210  auto actual_size = evaluated_thetas->size();
1211  auto expected_size =
1215 
1216  libmesh_error_msg_if(actual_size != expected_size,
1217  "ERROR: Evaluated thetas vector has size " <<
1218  actual_size << ", but we expected " <<
1219  rb_theta_expansion->get_n_A_terms() << " A term(s), " <<
1220  rb_theta_expansion->get_n_F_terms() << " F term(s), and " <<
1221  rb_theta_expansion->get_total_n_output_terms() << " output term(s), " <<
1222  "for a total of " << expected_size << " terms.");
1223  }
1224 }
1225 
1226 } // namespace libMesh
T libmesh_real(T a)
std::vector< std::vector< std::unique_ptr< NumericVector< Number > > > > Aq_representor
Vector storing the residual representors associated with the left-hand side.
bool compute_RB_inner_product
Boolean flag to indicate whether we compute the RB_inner_product_matrix.
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...
virtual void write_out_basis_functions(System &sys, const std::string &directory_name="offline_data", const bool write_binary_basis_functions=true)
Write out all the basis functions to file.
boostcopy::enable_if_c< ScalarTraits< T2 >::value, void >::type add(const T2 factor, const DenseVector< T3 > &vec)
Adds factor times vec to this vector.
Definition: dense_vector.h:477
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.
Definition: dense_vector.h:420
T libmesh_conj(T a)
unsigned int get_n_F_terms() const
Get Q_f, the number of terms in the affine expansion for the right-hand side.
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.
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 write_header(Xdr &io, std::string_view version, const bool write_additional_data) const
Writes the basic data header for this System.
Definition: system_io.C:1267
virtual void zero() override final
Sets all elements of the matrix to 0 and resets any decomposition flag which may have been previously...
Definition: dense_matrix.h:911
DenseMatrix< Number > RB_inner_product_matrix
The inner product matrix.
void resize(const unsigned int n)
Resize the vector.
Definition: dense_vector.h:396
void close()
Closes the file if it is open.
Definition: xdr_cxx.C:277
std::vector< std::unique_ptr< NumericVector< Number > > > basis_functions
The libMesh vectors storing the finite element coefficients of the RB basis functions.
void barrier() const
virtual Real compute_residual_dual_norm(const unsigned int N)
Compute the dual norm of the residual for the solution saved in RB_solution_vector.
processor_id_type rank() const
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form.
const Parallel::Communicator & comm() const
virtual void fix_broken_node_and_element_numbering()=0
There is no reason for a user to ever call this function.
int mkdir(const char *pathname)
Create a directory.
Definition: utility.C:152
std::vector< std::vector< Number > > output_dual_innerprods
The vector storing the dual norm inner product terms for each output.
virtual Real get_error_bound_normalization()
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.
static void read_in_vectors_from_multiple_files(System &sys, std::vector< std::vector< std::unique_ptr< NumericVector< Number >>> *> multiple_vectors, const std::vector< std::string > &multiple_directory_names, const std::vector< std::string > &multiple_data_names, const bool read_binary_vectors)
Performs read_in_vectors for a list of directory names and data names.
The libMesh namespace provides an interface to certain functionality in the library.
dof_id_type n_local_dofs() const
Definition: system.C:158
std::vector< RBParameters > greedy_param_list
The list of parameters selected by the Greedy algorithm in generating the Reduced Basis associated wi...
static void read_in_vectors(System &sys, std::vector< std::unique_ptr< NumericVector< Number >>> &vectors, const std::string &directory_name, const std::string &data_name, const bool read_binary_vectors)
Same as read_in_basis_functions, except in this case we pass in the vectors to be written...
unsigned int output_index_1D(unsigned int n, unsigned int q_l) const
Computes the one-dimensional index for output n, term q_l implied by a "row-major" ordering of the ou...
unsigned int get_n_outputs() const
Get n_outputs, the number output functionals.
const MeshBase & get_mesh() const
Definition: system.h:2358
This class stores the set of RBTheta functor objects that define the "parameter-dependent expansion" ...
dof_id_type n_dofs() const
Definition: system.C:121
RBEvaluation(const Parallel::Communicator &comm)
Constructor.
Definition: rb_evaluation.C:48
XdrMODE
Defines an enum for read/write mode in Xdr format.
Definition: enum_xdr_mode.h:35
void data(T &a, std::string_view comment="")
Inputs or outputs a single value.
Definition: xdr_cxx.C:778
std::vector< DenseVector< Number > > RB_Fq_vector
Dense vector for the RHS.
static void write_out_vectors(System &sys, std::vector< NumericVector< Number > *> &vectors, const std::string &directory_name="offline_data", const std::string &data_name="bf", const bool write_binary_basis_functions=true)
Same as write_out_basis_functions, except in this case we pass in the vectors to be written...
std::string get_io_compatibility_version()
Specifier for I/O file compatibility features.
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...
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.
Definition: system_io.C:97
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.
Manages consistently variables, degrees of freedom, and coefficient vectors.
Definition: system.h:96
boostcopy::enable_if_c< ScalarTraits< T2 >::value, void >::type add(const T2 factor, const DenseMatrix< T3 > &mat)
Adds factor times mat to this matrix.
NumericVector< Number > & get_basis_function(unsigned int i)
Get a reference to the i^th basis function.
libmesh_assert(ctx)
virtual Number eval_F_theta(unsigned int q, const RBParameters &mu) const
Evaluate theta_q_f at the current parameter.
std::vector< Real > RB_output_error_bounds
const RBParameters & get_parameters() const
Get the current parameters.
virtual void read_in_basis_functions(System &sys, const std::string &directory_name="offline_data", const bool read_binary_basis_functions=true)
Read in all the basis functions from file.
virtual void set_n_basis_functions(unsigned int n_bfs)
Set the number of basis functions.
Definition: rb_evaluation.C:75
This class is part of the rbOOmit framework.
Definition: rb_parameters.h:52
std::size_t read_serialized_vectors(Xdr &io, const std::vector< NumericVector< Number > *> &vectors) const
Read a number of identically distributed vectors.
Definition: system_io.C:2165
void globally_renumber_nodes_and_elements(MeshBase &)
There is no reason for a user to ever call this function.
Definition: mesh_tools.C:2542
An object whose state is distributed along a set of processors.
virtual Real residual_scaling_denom(Real alpha_LB)
Specifies the residual scaling on the denominator to be used in the a posteriori error bound...
void set_rb_theta_expansion(RBThetaExpansion &rb_theta_expansion_in)
Set the RBThetaExpansion object.
Definition: rb_evaluation.C:80
This class implements a C++ interface to the XDR (eXternal Data Representation) format.
Definition: xdr_cxx.h:67
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::size_t write_serialized_vectors(Xdr &io, const std::vector< const NumericVector< Number > *> &vectors) const
Serialize & write a number of identically distributed vectors.
Definition: system_io.C:2261
virtual Real rb_solve(unsigned int N)
Perform online solve with the N RB basis functions, for the set of parameters in current_params, where 0 <= N <= RB_size.
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
Definition: dense_vector.h:492
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.
unsigned int get_total_n_output_terms() const
Returns the total number of affine terms associated with all outputs.
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 clear() override
Clear this RBEvaluation object.
Definition: rb_evaluation.C:59
static const bool value
Definition: xdr_io.C:54
void resize(const unsigned int new_m, const unsigned int new_n)
Resizes the matrix to the specified size and calls zero().
Definition: dense_matrix.h:895
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...
void check_evaluated_thetas_size(const std::vector< Number > *evaluated_thetas) const
For interfaces like rb_solve() and compute_residual_dual_norm() that optinally take a vector of "pre-...
std::vector< Number > RB_outputs
The vectors storing the RB output values and corresponding error bounds.
processor_id_type processor_id() const
RBThetaExpansion * rb_theta_expansion
A pointer to to the object that stores the theta expansion.
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the rb_theta_expansion.
Definition: rb_evaluation.C:85
std::vector< std::vector< std::vector< Number > > > Aq_Aq_representor_innerprods
bool is_rb_theta_expansion_initialized() const
std::vector< std::vector< DenseVector< Number > > > RB_output_vectors
The vectors storing the RB output vectors.