annular_domain.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-2022 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_ANNULAR_DOMAIN_HEADER
27#define OOMPH_ANNULAR_DOMAIN_HEADER
28
29// Generic oomph-lib includes
30#include "../generic/quadtree.h"
31#include "../generic/domain.h"
32#include "../generic/geom_objects.h"
33
34namespace oomph
35{
36 //=================================================================
37 /// Annular domain
38 //=================================================================
39 class AnnularDomain : public Domain
40 {
41 public:
42 /// Constructor: Specify azimuthal fraction (1.0 is 360 degrees)
43 /// number of macro elements in azimuthal and radial direction,
44 /// inner radius and thickness. Rotate mesh by angle phi.
45 AnnularDomain(const double& azimuthal_fraction,
46 const unsigned& ntheta,
47 const unsigned& nr,
48 const double& a,
49 const double& h,
50 const double& phi)
51 : Azimuthal_fraction(azimuthal_fraction),
52 Inner_radius(a),
53 Thickness(h),
54 Ntheta(ntheta),
55 Nr(nr),
56 Phi(phi)
57 {
58 const unsigned n_macro = ntheta * nr;
59 Macro_element_pt.resize(n_macro);
60
61 // Create the macro elements
62 for (unsigned i = 0; i < n_macro; i++)
63 {
65 }
66 }
67
68 /// Broken copy constructor
69 AnnularDomain(const AnnularDomain&) = delete;
70
71 /// Broken assignment operator
72 void operator=(const AnnularDomain&) = delete;
73
74 /// Destructor: Empty; cleanup done in base class
76
77
78 /// Vector representation of the i_macro-th macro element
79 /// boundary i_direct (N/S/W/E) at time level t
80 /// (t=0: present; t>0: previous):
81 /// f(s).
82 void macro_element_boundary(const unsigned& t,
83 const unsigned& i_macro,
84 const unsigned& i_direct,
85 const Vector<double>& s,
87
88 private:
89 /// Azimuthal fraction
91
92 /// Inner radius
94
95 /// Thickness
96 double Thickness;
97
98 /// Number of macro elements in azimuthal direction
99 unsigned Ntheta;
100
101 /// Number of macro elements in radial direction
102 unsigned Nr;
103
104 /// Rotation angle
105 double Phi;
106 };
107
108
109 /// //////////////////////////////////////////////////////////////////////
110 /// //////////////////////////////////////////////////////////////////////
111 /// //////////////////////////////////////////////////////////////////////
112
113
114 //=================================================================
115 /// Vector representation of the imacro-th macro element
116 /// boundary idirect (N/S/W/E) at time level t
117 /// (t=0: present; t>0: previous): f(s)
118 //=================================================================
120 const unsigned& imacro,
121 const unsigned& idirect,
122 const Vector<double>& s,
124 {
125 using namespace QuadTreeNames;
126
127 // Get coordinates of macro element
128 unsigned i_theta = imacro % Ntheta;
129 unsigned i_r = (imacro - i_theta) / Ntheta;
130
131 // Angle and radius limits
132 double theta_lo = Azimuthal_fraction * 2.0 * MathematicalConstants::Pi *
133 double(i_theta) / double(Ntheta);
134
135 double theta_hi = Azimuthal_fraction * 2.0 * MathematicalConstants::Pi *
136 double(i_theta + 1) / double(Ntheta);
137
138 // Revert direction (convoluted -- don't ask. It mirrors what happens
139 // in the mesh...
140 theta_lo = -MathematicalConstants::Pi +
142 theta_hi = -MathematicalConstants::Pi +
144
145 double r_lo = Inner_radius + Thickness * double(i_r) / double(Nr);
146 double r_hi = Inner_radius + Thickness * double(i_r + 1) / double(Nr);
147
148 // Actual radius and angle
149 double r = 0.0;
150 double theta = 0.0;
151
152 // Which direction?
153 switch (idirect)
154 {
155 case N:
156
157 theta = theta_lo + 0.5 * (s[0] + 1.0) * (theta_hi - theta_lo);
158 r = r_hi;
159
160 break;
161
162 case S:
163
164 theta = theta_lo + 0.5 * (s[0] + 1.0) * (theta_hi - theta_lo);
165 r = r_lo;
166
167 break;
168
169 case W:
170
171 theta = theta_lo;
172 r = r_lo + 0.5 * (s[0] + 1.0) * (r_hi - r_lo);
173
174 break;
175
176 case E:
177
178 theta = theta_hi;
179 r = r_lo + 0.5 * (s[0] + 1.0) * (r_hi - r_lo);
180
181 break;
182
183 default:
184 std::ostringstream error_stream;
185 error_stream << "idirect is " << idirect << " not one of N, S, W, E"
186 << std::endl;
187
188 throw OomphLibError(
189 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
190 }
191
192 f[0] = r * cos(theta + Phi);
193 f[1] = r * sin(theta + Phi);
194 }
195
196} // namespace oomph
197
198#endif
static char t char * s
Definition: cfortran.h:568
cstr elem_len * i
Definition: cfortran.h:603
char t
Definition: cfortran.h:568
Annular domain.
double Phi
Rotation angle.
unsigned Nr
Number of macro elements in radial direction.
AnnularDomain(const AnnularDomain &)=delete
Broken copy constructor.
double Thickness
Thickness.
double Inner_radius
Inner radius.
unsigned Ntheta
Number of macro elements in azimuthal direction.
~AnnularDomain()
Destructor: Empty; cleanup done in base class.
AnnularDomain(const double &azimuthal_fraction, const unsigned &ntheta, const unsigned &nr, const double &a, const double &h, const double &phi)
Constructor: Specify azimuthal fraction (1.0 is 360 degrees) number of macro elements in azimuthal an...
double Azimuthal_fraction
Azimuthal fraction.
void macro_element_boundary(const unsigned &t, const unsigned &i_macro, const unsigned &i_direct, const Vector< double > &s, Vector< double > &f)
Vector representation of the i_macro-th macro element boundary i_direct (N/S/W/E) at time level t (t=...
void operator=(const AnnularDomain &)=delete
Broken assignment operator.
Base class for Domains with curvilinear and/or time-dependent boundaries. Domain boundaries are typic...
Definition: domain.h:67
Vector< MacroElement * > Macro_element_pt
Vector of pointers to macro elements.
Definition: domain.h:301
An OomphLibError object which should be thrown when an run-time error is encountered....
QMacroElement specialised to 2 spatial dimensions.
const double Pi
50 digits from maple
//////////////////////////////////////////////////////////////////// ////////////////////////////////...