macro_element.h
Go to the documentation of this file.
1// LIC// ====================================================================
2// LIC// This file forms part of oomph-lib, the object-oriented,
3// LIC// multi-physics finite-element library, available
4// LIC// at http://www.oomph-lib.org.
5// LIC//
6// LIC// Copyright (C) 2006-2025 Matthias Heil and Andrew Hazel
7// LIC//
8// LIC// This library is free software; you can redistribute it and/or
9// LIC// modify it under the terms of the GNU Lesser General Public
10// LIC// License as published by the Free Software Foundation; either
11// LIC// version 2.1 of the License, or (at your option) any later version.
12// LIC//
13// LIC// This library is distributed in the hope that it will be useful,
14// LIC// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// LIC// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16// LIC// Lesser General Public License for more details.
17// LIC//
18// LIC// You should have received a copy of the GNU Lesser General Public
19// LIC// License along with this library; if not, write to the Free Software
20// LIC// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21// LIC// 02110-1301 USA.
22// LIC//
23// LIC// The authors may be contacted at oomph-lib@maths.man.ac.uk.
24// LIC//
25// LIC//====================================================================
26#ifndef OOMPH_MACROELEMENT_HEADER
27#define OOMPH_MACROELEMENT_HEADER
28
29
30// Config header
31#ifdef HAVE_CONFIG_H
32#include <oomph-lib-config.h>
33#endif
34
35#ifdef OOMPH_HAS_MPI
36#include "mpi.h"
37#endif
38
39// oomph-lib headers
40#include "Vector.h"
41#include "oomph_utilities.h"
42#include "quadtree.h"
43#include "octree.h"
44
45namespace oomph
46{
47 class Domain;
48
49 //================================================================
50 /// Base class for MacroElement s that are used during mesh refinement
51 /// in domains with curvlinear and/or time-dependent
52 /// boundaries; see the description of the Domain class for more
53 /// details.
54 ///
55 /// A macro element provides a parametrisation of a sub-domain
56 /// by providing a mapping between a set of local coordinates
57 /// \f$ {\bf S} \f$ and global coordinates \f$ {\bf r} ({\bf S}) \f$ . This
58 /// must be implemented in the function
59 ///
60 /// \code MacroElement::macro_map(...) \endcode
61 ///
62 /// The time-dependent version of the macro map returns the mapping
63 /// from local to global coordinates: \f$ {\bf r} (t,{\bf S}) \f$
64 /// where t is the discrete timelevel: t=0: current time; t>0:
65 /// previous timestep.
66 ///
67 /// The MacroElement s establish the current (and previous) domain
68 /// shape via member function pointers to the Domain 's
69 /// \code Domain::macro_element_boundary(...) \endcode
70 /// member function.
71 //=================================================================
73 {
74 public:
75 /// Constructor: Pass pointer to Domain and the number of the
76 /// MacroElement within that Domain.
84
85 /// Default constructor (empty and broken)
87 {
88 throw OomphLibError("Don't call empty constructor for MacroElement!",
91 }
92
93
94 /// Broken copy constructor
96
97 /// Broken assignment operator
98 void operator=(const MacroElement&) = delete;
99
100 /// Empty destructor
102 {
103#ifdef LEAK_CHECK
105#endif
106 }
107
108
109 /// Plot: x,y (or x,y,z) at current time in tecplot
110 /// format
111 void output(std::ostream& outfile, const int& nplot)
112 {
113 unsigned t = 0;
115 }
116
117
118 /// Plot: x,y (or x,y,z) in tecplot format at time level t
119 /// (t=0: current; t>0: previous)
120 virtual void output(const unsigned& t,
121 std::ostream& outfile,
122 const unsigned& nplot) = 0;
123
124
125 /// The mapping from local to global coordinates at the current time : r(s)
127 {
128 // Evaluate at current timestep
129 unsigned t = 0;
130 macro_map(t, s, r);
131 }
132
133
134 /// The time-dependent mapping from local to global coordinates:
135 /// r(t,s).
136 /// t is the discrete timelevel: t=0: current time; t>0: previous timestep.
137 virtual void macro_map(const unsigned& t,
138 const Vector<double>& s,
139 Vector<double>& r) = 0;
140
141
142 /// Get global position r(s) at continuous time value, t.
143 virtual void macro_map(const double& t,
144 const Vector<double>& s,
146 {
147 // Create an output stream
148 std::ostringstream error_message_stream;
149
150 // Create an error message
151 error_message_stream << "The function macro_map(...) is broken virtual\n"
152 << "If you need it, please implement it!"
153 << std::endl;
154
155 // Throw an error
159 } // End of macro_map
160
161
162 /// Output all macro element boundaries as tecplot zones
163 virtual void output_macro_element_boundaries(std::ostream& outfile,
164 const unsigned& nplot) = 0;
165
166
167 /// the jacobian of the mapping from the macro coordinates to the
168 /// global
169 /// coordinates
171 const unsigned& t, const Vector<double>& s, DenseMatrix<double>& jacobian)
172 {
173 // error message stream
174 std::ostringstream error_message;
175 error_message << "assemble_macro_to_eulerian_jacobian(...) not \n"
176 << "implemented for this element\n"
177 << std::endl;
178 // throw error
179 throw OomphLibError(
181 }
182
183
184 /// Assembles the second derivative jacobian of the mapping from the
185 /// macro coordinates to the global coordinates
187 const unsigned& t,
188 const Vector<double>& s,
190 {
191 // error message stream
192 std::ostringstream error_message;
193 error_message << "assemble_macro_to_eulerian_jacobian2(...) not \n"
194 << "implemented for this element\n"
195 << std::endl;
196 // throw error
197 throw OomphLibError(
199 }
200
201
202 /// Assembles the jacobian of the mapping from the macro coordinates
203 /// to
204 /// the global coordinates
206 DenseMatrix<double>& jacobian)
207 {
208 unsigned t = 0;
210 }
211
212
213 /// Assembles the second derivative jacobian of the mapping from the
214 /// macro coordinates to the global coordinates
221
222 /// Access function to the Macro_element_number
224 {
226 }
227
228 /// Access function to the Domain_pt
230 {
231 return Domain_pt;
232 }
233
234 protected:
235 /// Pointer to domain
237
238 /// What is the number of the current macro element within its domain
240 };
241
242
243 ///////////////////////////////////////////////////////////////////////////
244 ///////////////////////////////////////////////////////////////////////////
245 ///////////////////////////////////////////////////////////////////////////
246
247
248 //================================================================
249 /// QMacroElement
250 ///
251 /// QMacroElements are MacroElement s with linear/quadrilateral/hexahedral
252 /// shape. This class is empty and simply establishes the dimension
253 /// as the template parameter.
254 //=================================================================
255 template<int DIM>
257 {
258 };
259
260
261 //================================================================
262 /// QMacroElement specialised to 2 spatial dimensions.
263 ///
264 /// The macro element mapping is based on the member function pointer
265 /// to the associated Domain 's
266 /// \code Domain::macro_element_boundary(...) \endcode
267 /// function which provides a parametrisation of the macro element's
268 /// boundaries in the form:
269 /// \f[ {\bf f}_{i} (t,{\bf S}) \f]
270 /// where
271 /// - \f$ i \f$ labels the boundary (N/S/W/E)
272 /// - \f$ {\bf S} \in [-1,1]^1 \f$ is the (1D) Vector of local coordinate(s)
273 /// along the boundary.
274 /// - \f$ {\bf f} \f$ is the position Vector to the boundary.
275 /// - \f$ t \f$ is the time level (t=0: current; t>0 previous timestep)
276 //=================================================================
277 template<>
278 class QMacroElement<2> : public MacroElement
279 {
280 public:
281 /// Constructor: Pass the pointer to the domain and the macro
282 /// element's number within this domain
285
286
287 /// Default constructor (empty and broken)
289 {
290 throw OomphLibError("Don't call empty constructor for QMacroElement!",
293 }
294
295 /// Broken copy constructor
297
298 /// Broken assignment operator
299 void operator=(const QMacroElement&) = delete;
300
301 /// Empty destructor
302 virtual ~QMacroElement() {};
303
304 /// Plot: x,y in tecplot format at time level t (t=0: current;
305 /// t>0: previous)
306 void output(const unsigned& t, std::ostream& outfile, const unsigned& nplot)
307 {
308 Vector<double> x(2), f(2);
309 outfile << "ZONE I=" << nplot << ", J=" << nplot << std::endl;
310 for (unsigned i = 0; i < nplot; i++)
311 {
312 x[1] = -1.0 + 2.0 * double(i) / double(nplot - 1);
313 for (unsigned j = 0; j < nplot; j++)
314 {
315 x[0] = -1.0 + 2.0 * double(j) / double(nplot - 1);
316 macro_map(t, x, f);
317 outfile << f[0] << " " << f[1] << std::endl;
318 }
319 }
320 }
321
322
323 /// Output all macro element boundaries as tecplot zones
324 void output_macro_element_boundaries(std::ostream& outfile,
325 const unsigned& nplot);
326
327 /// Get global position r(S) at discrete time level t.
328 /// t=0: Present time; t>0: previous timestep.
329 void macro_map(const unsigned& t,
330 const Vector<double>& S,
332
333
334 /// Get global position r(s) at continuous time value, t.
335 void macro_map(const double& t, const Vector<double>& s, Vector<double>& r);
336
337
338 /// assemble the jacobian of the mapping from the macro coordinates to
339 /// the global coordinates
341 const unsigned& t,
342 const Vector<double>& s,
343 DenseMatrix<double>& jacobian);
344
345
346 /// Assembles the second derivative jacobian of the mapping from the
347 /// macro coordinates to global coordinates x
349 const unsigned& t,
350 const Vector<double>& s,
352 };
353
354
355 //================================================================
356 /// QMacroElement specialised to 3 spatial dimensions.
357 ///
358 /// The macro element mapping is based on the member function pointer
359 /// to the associated Domain 's
360 /// \code Domain::macro_element_boundary(...) \endcode
361 /// function which provides a parametrisation of the macro element's
362 /// boundaries in the form:
363 /// \f[ {\bf f}_{i} (t,{\bf S}) \f]
364 /// where
365 /// - \f$ i \f$ labels the boundary (L/R/D/U/B/F)
366 /// - \f$ {\bf S} \in [-1,1]^2 \f$ is the (2D) Vector of local coordinate(s)
367 /// along the boundary.
368 /// - \f$ {\bf f} \f$ is the position Vector to the boundary.
369 /// - \f$ t \f$ is the time level (t=0: current; t>0 previous timestep)
370 //=================================================================
371 template<>
372 class QMacroElement<3> : public MacroElement
373 {
374 public:
375 /// Constructor: Pass the pointer to the domain and the macro
376 /// element's number within this domain
379
380 /// Default constructor (empty and broken)
382 {
383 throw OomphLibError("Don't call empty constructor for QMacroElement!",
386 }
387
388 /// Broken copy constructor
390
391 /// Broken assignment operator
392 void operator=(const QMacroElement&) = delete;
393
394 /// Empty destructor
395 virtual ~QMacroElement() {};
396
397
398 /// Plot: x,y in tecplot format at time level t (t=0: current;
399 /// t>0: previous)
400 void output(const unsigned& t, std::ostream& outfile, const unsigned& nplot)
401 {
402 Vector<double> x(3), f(3);
403
404 outfile << "ZONE I=" << nplot << ", J=" << nplot << ", k=" << nplot
405 << std::endl;
406 for (unsigned i = 0; i < nplot; i++)
407 {
408 x[2] = -1.0 + 2.0 * double(i) / double(nplot - 1);
409
410 for (unsigned j = 0; j < nplot; j++)
411 {
412 x[1] = -1.0 + 2.0 * double(j) / double(nplot - 1);
413
414 for (unsigned k = 0; k < nplot; k++)
415 {
416 x[0] = -1.0 + 2.0 * double(k) / double(nplot - 1);
417
418 macro_map(t, x, f);
419
420 outfile << f[0] << " " << f[1] << " " << f[2] << std::endl;
421 }
422 }
423 }
424 }
425
426
427 /// Output all macro element boundaries as tecplot zones
428 void output_macro_element_boundaries(std::ostream& outfile,
429 const unsigned& nplot);
430
431 /// Get global position r(S) at discrete time level t.
432 /// t=0: Present time; t>0: previous timestep.
433 void macro_map(const unsigned& t,
434 const Vector<double>& S,
436 };
437
438} // namespace oomph
439
440#endif
static char t char * s
Definition cfortran.h:568
cstr elem_len * i
Definition cfortran.h:603
char t
Definition cfortran.h:568
Base class for Domains with curvilinear and/or time-dependent boundaries. Domain boundaries are typic...
Definition domain.h:67
Base class for MacroElement s that are used during mesh refinement in domains with curvlinear and/or ...
Domain * Domain_pt
Pointer to domain.
virtual void assemble_macro_to_eulerian_jacobian2(const unsigned &t, const Vector< double > &s, DenseMatrix< double > &jacobian2)
Assembles the second derivative jacobian of the mapping from the macro coordinates to the global coor...
void assemble_macro_to_eulerian_jacobian(const Vector< double > &s, DenseMatrix< double > &jacobian)
Assembles the jacobian of the mapping from the macro coordinates to the global coordinates.
virtual void output(const unsigned &t, std::ostream &outfile, const unsigned &nplot)=0
Plot: x,y (or x,y,z) in tecplot format at time level t (t=0: current; t>0: previous)
virtual void macro_map(const double &t, const Vector< double > &s, Vector< double > &r)
Get global position r(s) at continuous time value, t.
virtual void output_macro_element_boundaries(std::ostream &outfile, const unsigned &nplot)=0
Output all macro element boundaries as tecplot zones.
void operator=(const MacroElement &)=delete
Broken assignment operator.
virtual void macro_map(const unsigned &t, const Vector< double > &s, Vector< double > &r)=0
The time-dependent mapping from local to global coordinates: r(t,s). t is the discrete timelevel: t=0...
void macro_map(const Vector< double > &s, Vector< double > &r)
The mapping from local to global coordinates at the current time : r(s)
void output(std::ostream &outfile, const int &nplot)
Plot: x,y (or x,y,z) at current time in tecplot format.
unsigned Macro_element_number
What is the number of the current macro element within its domain.
Domain *& domain_pt()
Access function to the Domain_pt.
virtual ~MacroElement()
Empty destructor.
unsigned & macro_element_number()
Access function to the Macro_element_number.
virtual void assemble_macro_to_eulerian_jacobian(const unsigned &t, const Vector< double > &s, DenseMatrix< double > &jacobian)
the jacobian of the mapping from the macro coordinates to the global coordinates
MacroElement(Domain *domain_pt, const unsigned &macro_element_number)
Constructor: Pass pointer to Domain and the number of the MacroElement within that Domain.
MacroElement(const MacroElement &dummy)=delete
Broken copy constructor.
void assemble_macro_to_eulerian_jacobian2(const Vector< double > &s, DenseMatrix< double > &jacobian2)
Assembles the second derivative jacobian of the mapping from the macro coordinates to the global coor...
MacroElement()
Default constructor (empty and broken)
An OomphLibError object which should be thrown when an run-time error is encountered....
void output(const unsigned &t, std::ostream &outfile, const unsigned &nplot)
Plot: x,y in tecplot format at time level t (t=0: current; t>0: previous)
void operator=(const QMacroElement &)=delete
Broken assignment operator.
QMacroElement(const QMacroElement &dummy)=delete
Broken copy constructor.
virtual ~QMacroElement()
Empty destructor.
QMacroElement(Domain *domain_pt, const unsigned &macro_element_number)
Constructor: Pass the pointer to the domain and the macro element's number within this domain.
QMacroElement()
Default constructor (empty and broken)
QMacroElement(Domain *domain_pt, const unsigned &macro_element_number)
Constructor: Pass the pointer to the domain and the macro element's number within this domain.
QMacroElement()
Default constructor (empty and broken)
void output(const unsigned &t, std::ostream &outfile, const unsigned &nplot)
Plot: x,y in tecplot format at time level t (t=0: current; t>0: previous)
virtual ~QMacroElement()
Empty destructor.
QMacroElement(const QMacroElement &dummy)=delete
Broken copy constructor.
void operator=(const QMacroElement &)=delete
Broken assignment operator.
TAdvectionDiffusionReactionElement<NREAGENT,DIM,NNODE_1D> elements are isoparametric triangular DIM-d...
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).