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