extruded_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-2023 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_EXTRUDED_MACRO_ELEMENT_HEADER
27 #define OOMPH_EXTRUDED_MACRO_ELEMENT_HEADER
28 
29 // Config header generated by autoconfig
30 #ifdef HAVE_CONFIG_H
31 #include <oomph-lib-config.h>
32 #endif
33 
34 #ifdef OOMPH_HAS_MPI
35 #include "mpi.h"
36 #endif
37 
38 // oomph-lib headers
39 #include "Vector.h"
40 #include "macro_element.h"
41 #include "oomph_utilities.h"
42 #include "quadtree.h"
43 #include "octree.h"
44 
45 namespace oomph
46 {
47  class ExtrudedDomain;
48 
49  //===================================================================
50  ///
51  ///
52  ///
53  /// DRAIG: FILL IN COMPLETE DESCRIPTION ONCE FINISHED...
54  ///
55  ///
56  ///
57  //===================================================================
58  class ExtrudedMacroElement : public virtual MacroElement
59  {
60  public:
61  /// Constructor: Pass pointer to ExtrudedDomain and the ID number
62  /// of the ExtrudedMacroElement within that ExtrudedDomain.
63  /// NOTE: The base class MacroElement requires a pointer to a Domain
64  /// object. However, the ExtrudedDomain class has not yet been defined
65  /// which means the compiler cannot know yet that its derives from Domain.
66  /// To avoid a compiler error a null pointer is passed to the base class
67  /// MacroElement.
69  unsigned macro_element_number)
72  {
73 #ifdef LEAK_CHECK
74  LeakCheckNames::ExtrudedMacroElement_build += 1;
75 #endif
76  } // End of ExtrudedMacroElement
77 
78 
79  /// Default constructor (empty and broken)
81  {
82  // Throw an error!
83  throw OomphLibError(
84  "Don't call empty constructor for ExtrudedMacroElement!",
85  OOMPH_CURRENT_FUNCTION,
86  OOMPH_EXCEPTION_LOCATION);
87  } // End of ExtrudedMacroElement
88 
89 
90  /// Broken copy constructor
92 
93  /// Broken assignment operator
94  void operator=(const ExtrudedMacroElement&) = delete;
95 
96  /// Empty destructor
98  {
99 #ifdef LEAK_CHECK
100  LeakCheckNames::ExtrudedMacroElement_build -= 1;
101 #endif
102  } // End of ~ExtrudedMacroElement
103 
104 
105  /// Access function to the ExtrudedDomain
107  {
108  // Return a pointer to the extruded domain within which this extruded
109  // macro element lies
110  return Extruded_domain_pt;
111  } // End of extruded_domain_pt
112 
113  protected:
114  /// Pointer to the extruded domain
116  };
117 
118  /// ////////////////////////////////////////////////////////////////////////
119  /// ////////////////////////////////////////////////////////////////////////
120  /// ////////////////////////////////////////////////////////////////////////
121 
122  //===================================================================
123  /// QExtrudedMacroElement
124  ///
125  /// QExtrudedMacroElements are ExtrudedMacroElements with
126  /// linear/quadrilateral/hexahedral shape. This class is empty and
127  /// simply establishes the dimension as the template parameter.
128  //===================================================================
129  template<int DIM>
131  {
132  };
133 
134  //===================================================================
135  ///
136  ///
137  ///
138  /// DRAIG: FILL IN COMPLETE DESCRIPTION ONCE FINISHED...
139  ///
140  ///
141  ///
142  //===================================================================
143  template<>
145  {
146  public:
147  /// Constructor: Pass the pointer to the domain and the ID
148  /// number of this extruded macro element
150  const unsigned& macro_element_number)
153  {
154  }
155 
156  /// Default constructor (empty and broken)
158  {
159  // Create an error message
160  std::string error =
161  "Don't call empty constructor for QExtrudedMacroElement!";
162 
163  // Throw the error message
164  throw OomphLibError(
165  error, OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
166  } // End of QExtrudedMacroElement
167 
168 
169  /// Broken copy constructor
171 
172  /// Broken assignment operator
173  void operator=(const QExtrudedMacroElement&) = delete;
174 
175  /// Empty destructor
177 
178  /// Plot: x,y,t in tecplot format
179  void output(const unsigned& t, std::ostream& outfile, const unsigned& nplot)
180  {
181  // Make sure that t=0 otherwise this doesn't make sense
182  if (t != 0)
183  {
184  // Create an output stream
185  std::ostringstream error_message_stream;
186 
187  // Create an error message
188  error_message_stream << "This output function outputs a space-time\n"
189  << "representation of the solution. As such, it\n"
190  << "does not make sense to output the solution\n"
191  << "at a previous time level!" << std::endl;
192 
193  // Throw an error
194  throw OomphLibError(error_message_stream.str(),
195  OOMPH_CURRENT_FUNCTION,
196  OOMPH_EXCEPTION_LOCATION);
197  }
198 
199  // Storage for the local (space-time) coordinates
200  Vector<double> s(3, 0.0);
201 
202  // Storage for the global (space-time) coordinates
203  Vector<double> x(3, 0.0);
204 
205  // Output the header
206  outfile << "ZONE I=" << nplot << ", J=" << nplot << ", K=" << nplot
207  << std::endl;
208 
209  // Loop over the plot points in the t-direction
210  for (unsigned i = 0; i < nplot; i++)
211  {
212  // Calculate the time value
213  // s[2]=-1.0+2.0*double(i)/double(nplot-1);
214  s[2] = -1.0 + 2.0 * double(i) / double(nplot - 1);
215 
216  // Loop over the plot points in the y-direction
217  for (unsigned j = 0; j < nplot; j++)
218  {
219  // Calculate the y value
220  s[1] = -1.0 + 2.0 * double(j) / double(nplot - 1);
221 
222  // Loop over the plot points in the x-direction
223  for (unsigned k = 0; k < nplot; k++)
224  {
225  // Calculate the x value
226  s[0] = -1.0 + 2.0 * double(k) / double(nplot - 1);
227 
228  // Get the corresponding global space-time coordinates.
229  // NOTE: Calling the macro_map function from the base class requires
230  // the time level. To make the call function normally, we simply
231  // pass the argument t=0 and the appropriate function will be
232  // called.
233  macro_map(t, s, x);
234 
235  // Output the global coordinates
236  outfile << x[0] << " " << x[1] << " " << x[2] << " " << 0.0
237  << std::endl;
238  }
239  } // for (unsigned j=0;j<nplot;j++)
240  } // for (unsigned i=0;i<nplot;i++)
241  } // End of output
242 
243 
244  /// Get the global position r(s) at the continuous time, t
245  void macro_map(const unsigned& t,
246  const Vector<double>& s,
247  Vector<double>& r);
248 
249 
250  /// Output all macro element boundaries as tecplot zones
251  void output_macro_element_boundaries(std::ostream& outfile,
252  const unsigned& nplot);
253  };
254 } // End of namespace oomph
255 
256 #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 ExtrudedDomains with curvilinear and/or time-dependent boundaries. ExtrudedDomain boun...
DRAIG: FILL IN COMPLETE DESCRIPTION ONCE FINISHED...
ExtrudedMacroElement()
Default constructor (empty and broken)
virtual ~ExtrudedMacroElement()
Empty destructor.
ExtrudedDomain * Extruded_domain_pt
Pointer to the extruded domain.
ExtrudedDomain *& extruded_domain_pt()
Access function to the ExtrudedDomain.
ExtrudedMacroElement(ExtrudedDomain *extruded_domain_pt, unsigned macro_element_number)
Constructor: Pass pointer to ExtrudedDomain and the ID number of the ExtrudedMacroElement within that...
ExtrudedMacroElement(const ExtrudedMacroElement &dummy)=delete
Broken copy constructor.
void operator=(const ExtrudedMacroElement &)=delete
Broken assignment operator.
Base class for MacroElement s that are used during mesh refinement in domains with curvlinear and/or ...
Definition: macro_element.h:73
virtual void output_macro_element_boundaries(std::ostream &outfile, const unsigned &nplot)=0
Output all macro element boundaries as tecplot zones.
void macro_map(const Vector< double > &s, Vector< double > &r)
The mapping from local to global coordinates at the current time : r(s)
Domain *& domain_pt()
Access function to the Domain_pt.
unsigned & macro_element_number()
Access function to the Macro_element_number.
An OomphLibError object which should be thrown when an run-time error is encountered....
void operator=(const QExtrudedMacroElement &)=delete
Broken assignment operator.
QExtrudedMacroElement(ExtrudedDomain *domain_pt, const unsigned &macro_element_number)
Constructor: Pass the pointer to the domain and the ID number of this extruded macro element.
virtual ~QExtrudedMacroElement()
Empty destructor.
void output(const unsigned &t, std::ostream &outfile, const unsigned &nplot)
Plot: x,y,t in tecplot format.
QExtrudedMacroElement()
Default constructor (empty and broken)
QExtrudedMacroElement(const QExtrudedMacroElement &dummy)=delete
Broken copy constructor.
//////////////////////////////////////////////////////////////////////// ////////////////////////////...
std::string string(const unsigned &i)
Return the i-th string or "" if the relevant string hasn't been defined.
//////////////////////////////////////////////////////////////////// ////////////////////////////////...