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 #ifndef LIBMESH_RB_ASSEMBLY_EXPANSION_H 21 #define LIBMESH_RB_ASSEMBLY_EXPANSION_H 22 23 // libMesh includes 24 #include "libmesh/reference_counted_object.h" 25 26 // C++ includes 27 #include <vector> 28 #include <memory> 29 30 namespace libMesh 31 { 32 33 // Forward declarations 34 class ElemAssembly; 35 class FEMContext; 36 37 /** 38 * This class stores the set of ElemAssembly functor objects that define 39 * the "parameter-independent expansion" of a PDE. 40 * 41 * \author David J. Knezevic 42 * \date 2011 43 */ 44 class RBAssemblyExpansion : public ReferenceCountedObject<RBAssemblyExpansion> 45 { 46 public: 47 48 /** 49 * Constructor. 50 */ 51 RBAssemblyExpansion(); 52 53 /** 54 * Destructor. 55 */ ~RBAssemblyExpansion()56 virtual ~RBAssemblyExpansion() {} 57 58 /** 59 * Perform the specified A interior assembly. 60 */ 61 void perform_A_interior_assembly(unsigned int q, 62 FEMContext & context); 63 64 /** 65 * Perform the specified A boundary assembly. 66 */ 67 void perform_A_boundary_assembly(unsigned int q, 68 FEMContext & context); 69 70 /** 71 * Perform the specified F interior assembly. 72 */ 73 void perform_F_interior_assembly(unsigned int q, 74 FEMContext & context); 75 76 /** 77 * Perform the specified F boundary assembly. 78 */ 79 void perform_F_boundary_assembly(unsigned int q, 80 FEMContext & context); 81 82 /** 83 * Perform the specified output assembly. 84 */ 85 void perform_output_interior_assembly(unsigned int output_index, 86 unsigned int q_l, 87 FEMContext & context); 88 89 /** 90 * Perform the specified output assembly. 91 */ 92 void perform_output_boundary_assembly(unsigned int output_index, 93 unsigned int q_l, 94 FEMContext & context); 95 96 /** 97 * Get Q_a, the number of terms in the affine 98 * expansion for the bilinear form. 99 */ 100 unsigned int get_n_A_terms() const; 101 102 /** 103 * Get Q_f, the number of terms in the affine 104 * expansion for the right-hand side. 105 */ 106 unsigned int get_n_F_terms() const; 107 108 /** 109 * Get n_outputs, the number output functionals. 110 */ 111 unsigned int get_n_outputs() const; 112 113 /** 114 * Get the number of affine terms associated with the specified output. 115 */ 116 unsigned int get_n_output_terms(unsigned int output_index) const; 117 118 /** 119 * Attach ElemAssembly object for the left-hand side 120 * (both interior and boundary assembly). 121 */ 122 void attach_A_assembly(ElemAssembly * Aq_assembly); 123 124 /** 125 * Attach multiple ElemAssembly objects for the left-hand side 126 * (both interior and boundary assembly). 127 */ 128 void attach_multiple_A_assembly(std::vector<std::unique_ptr<ElemAssembly>> & Aq_assembly); 129 130 /** 131 * Attach ElemAssembly object for the right-hand side 132 * (both interior and boundary assembly). 133 */ 134 void attach_F_assembly(ElemAssembly * Fq_assembly); 135 136 /** 137 * Attach multiple ElemAssembly objects for the right-hand side 138 * (both interior and boundary assembly). 139 */ 140 void attach_multiple_F_assembly(std::vector<std::unique_ptr<ElemAssembly>> & Fq_assembly); 141 142 /** 143 * Attach ElemAssembly object for an output 144 * (both interior and boundary assembly). 145 * In this case we pass in vector arguments to allow for Q_l > 1. 146 */ 147 virtual void attach_output_assembly(std::vector<std::unique_ptr<ElemAssembly>> & output_assembly); 148 149 /** 150 * Attach ElemAssembly object for an output 151 * (both interior and boundary assembly). 152 * In this case we pass in vector arguments to allow for Q_l > 1. 153 */ 154 virtual void attach_output_assembly(std::vector<ElemAssembly *> output_assembly); 155 156 /** 157 * Attach ElemAssembly object for an output 158 * (both interior and boundary assembly). 159 * This function provides simpler syntax in the case that Q_l = 1; we 160 * do not need to use a vector in this case. 161 */ 162 virtual void attach_output_assembly(ElemAssembly * output_assembly); 163 164 /** 165 * Return a reference to the specified A_assembly object. 166 */ 167 ElemAssembly & get_A_assembly(unsigned int q); 168 169 /** 170 * Return a reference to the specified F_assembly object. 171 */ 172 ElemAssembly & get_F_assembly(unsigned int q); 173 174 /** 175 * Return a reference to the specified output assembly object. 176 */ 177 ElemAssembly & get_output_assembly(unsigned int output_index, unsigned int q_l); 178 179 private: 180 181 /** 182 * Vectors storing the function pointers to the assembly 183 * routines for the affine operators, both interior and boundary 184 * assembly. 185 */ 186 std::vector<ElemAssembly *> _A_assembly_vector; 187 188 /** 189 * Vector storing the function pointers to the assembly 190 * routines for the rhs affine vectors. 191 */ 192 std::vector<ElemAssembly *> _F_assembly_vector; 193 194 /** 195 * Vector storing the function pointers to the assembly 196 * routines for the outputs. Element interior part. 197 */ 198 std::vector<std::vector<ElemAssembly *>> _output_assembly_vector; 199 }; 200 201 } 202 203 #endif // LIBMESH_RB_ASSEMBLY_EXPANSION_H 204