Nektar++
NodalPrismEvenlySpaced.cpp
Go to the documentation of this file.
1///////////////////////////////////////////////////////////////////////////////
2//
3// File: NodalPrismEvenlySpaced.cpp
4//
5// For more information, please see: http://www.nektar.info
6//
7// The MIT License
8//
9// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
10// Department of Aeronautics, Imperial College London (UK), and Scientific
11// Computing and Imaging Institute, University of Utah (USA).
12//
13// Permission is hereby granted, free of charge, to any person obtaining a
14// copy of this software and associated documentation files (the "Software"),
15// to deal in the Software without restriction, including without limitation
16// the rights to use, copy, modify, merge, publish, distribute, sublicense,
17// and/or sell copies of the Software, and to permit persons to whom the
18// Software is furnished to do so, subject to the following conditions:
19//
20// The above copyright notice and this permission notice shall be included
21// in all copies or substantial portions of the Software.
22//
23// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29// DEALINGS IN THE SOFTWARE.
30//
31// Description: 3D Nodal Prism Evenly Spaced Point Definitions
32//
33///////////////////////////////////////////////////////////////////////////////
34
36#include <vector>
37
39{
43
44namespace
45{
46bool isVertex(size_t x, size_t y, size_t z, size_t npts)
47{
48 return (x == 0 && y == 0 && z == 0) ||
49 (x == (npts - 1) && y == 0 && z == 0) ||
50 (x == (npts - 1) && y == (npts - 1) && z == 0) ||
51 (x == 0 && y == (npts - 1) && z == 0) ||
52 (x == 0 && y == 0 && z == (npts - 1)) ||
53 (x == 0 && y == (npts - 1) && z == (npts - 1));
54}
55
56bool isEdge_01([[maybe_unused]] size_t x, size_t y, size_t z,
57 [[maybe_unused]] size_t npts)
58{
59 return y == 0 && z == 0;
60}
61
62bool isEdge_12(size_t x, [[maybe_unused]] size_t y, size_t z, size_t npts)
63{
64 return x == (npts - 1) && z == 0;
65}
66
67bool isEdge_23([[maybe_unused]] size_t x, size_t y, size_t z, size_t npts)
68{
69 return y == (npts - 1) && z == 0;
70}
71
72bool isEdge_30(size_t x, [[maybe_unused]] size_t y, size_t z,
73 [[maybe_unused]] size_t npts)
74{
75 return x == 0 && z == 0;
76}
77
78bool isEdge_04(size_t x, size_t y, [[maybe_unused]] size_t z,
79 [[maybe_unused]] size_t npts)
80{
81 return x == 0 && y == 0;
82}
83
84bool isEdge_14(size_t x, size_t y, size_t z, size_t npts)
85{
86 return x + z == (npts - 1) && y == 0;
87}
88
89bool isEdge_25(size_t x, size_t y, size_t z, size_t npts)
90{
91 return x + z == (npts - 1) && y == (npts - 1);
92}
93
94bool isEdge_35(size_t x, size_t y, [[maybe_unused]] size_t z, size_t npts)
95{
96 return x == 0 && y == (npts - 1);
97}
98
99bool isEdge_45(size_t x, [[maybe_unused]] size_t y, size_t z, size_t npts)
100{
101 return x == 0 && z == (npts - 1);
102}
103
104bool isEdge(size_t x, size_t y, size_t z, size_t npts)
105{
106 return isEdge_01(x, y, z, npts) || isEdge_12(x, y, z, npts) ||
107 isEdge_23(x, y, z, npts) || isEdge_30(x, y, z, npts) ||
108 isEdge_04(x, y, z, npts) || isEdge_14(x, y, z, npts) ||
109 isEdge_25(x, y, z, npts) || isEdge_35(x, y, z, npts) ||
110 isEdge_45(x, y, z, npts);
111}
112
113bool isFace_0123([[maybe_unused]] size_t x, [[maybe_unused]] size_t y, size_t z,
114 [[maybe_unused]] size_t npts)
115{
116 return z == 0;
117}
118
119bool isFace_014([[maybe_unused]] size_t x, size_t y, [[maybe_unused]] size_t z,
120 [[maybe_unused]] size_t npts)
121{
122 return y == 0;
123}
124
125bool isFace_1254(size_t x, [[maybe_unused]] size_t y, size_t z, size_t npts)
126{
127 return x + z == npts - 1;
128}
129
130bool isFace_325([[maybe_unused]] size_t x, size_t y, [[maybe_unused]] size_t z,
131 size_t npts)
132{
133 return y == (npts - 1);
134}
135
136bool isFace_0354(size_t x, [[maybe_unused]] size_t y, [[maybe_unused]] size_t z,
137 [[maybe_unused]] size_t npts)
138{
139 return x == 0;
140}
141
142bool isFace(size_t x, size_t y, size_t z, size_t npts)
143{
144 return isFace_0123(x, y, z, npts) || isFace_014(x, y, z, npts) ||
145 isFace_1254(x, y, z, npts) || isFace_325(x, y, z, npts) ||
146 isFace_0354(x, y, z, npts);
147}
148} // namespace
149
150// Calculate evenly spaced number of points
152{
153 // Allocate the storage for points
155
156 // Populate m_points
157 size_t npts = GetNumPoints();
158 NekDouble delta = 2.0 / (npts - 1.0);
159 for (size_t z = 0, index = 0; z < npts; ++z)
160 {
161 for (size_t y = 0; y < npts; ++y)
162 {
163 for (size_t x = 0; x < npts - z; ++x, ++index)
164 {
165 NekDouble xi = -1.0 + x * delta;
166 NekDouble yi = -1.0 + y * delta;
167 NekDouble zi = -1.0 + z * delta;
168
169 m_points[0][index] = xi;
170 m_points[1][index] = yi;
171 m_points[2][index] = zi;
172 }
173 }
174 }
175
178 npts - 1, m_points[0], m_points[1], m_points[2]);
179}
180
182{
183 size_t npts = GetNumPoints();
184 using std::vector;
185 vector<int> vertex;
186 vector<int> iEdge_01; // interior edge 0
187 vector<int> iEdge_12; // interior edge 1
188 vector<int> iEdge_23; // interior edge 2
189 vector<int> iEdge_30; // interior edge 3
190 vector<int> iEdge_04; // interior edge 4
191 vector<int> iEdge_14; // interior edge 5
192 vector<int> iEdge_25; // interior edge 6
193 vector<int> iEdge_35; // interior edge 7
194 vector<int> iEdge_45; // interior edge 8
195 vector<int> iFace_0123; // interior face 0
196 vector<int> iFace_014; // interior face 1
197 vector<int> iFace_1254; // interior face 2
198 vector<int> iFace_325; // interior face 3
199 vector<int> iFace_0354; // interior face 4
200 vector<int> interiorVolumePoints; // interior volume points
201 vector<int> map;
202
203 // Build the lattice prism left to right - bottom to top
204 for (size_t z = 0, index = 0; z < npts; ++z)
205 {
206 for (size_t y = 0; y < npts; ++y)
207 {
208 for (size_t x = 0; x < npts - z; ++x, ++index)
209 {
210 if (isVertex(x, y, z, npts))
211 {
212 vertex.push_back(index);
213 }
214 else if (isEdge(x, y, z, npts))
215 {
216 if (isEdge_01(x, y, z, npts))
217 {
218 iEdge_01.push_back(index);
219 }
220 else if (isEdge_12(x, y, z, npts))
221 {
222 iEdge_12.push_back(index);
223 }
224 else if (isEdge_23(x, y, z, npts))
225 {
226 iEdge_23.push_back(index);
227 }
228 else if (isEdge_30(x, y, z, npts))
229 {
230 iEdge_30.push_back(index);
231 }
232 else if (isEdge_04(x, y, z, npts))
233 {
234 iEdge_04.push_back(index);
235 }
236 else if (isEdge_14(x, y, z, npts))
237 {
238 iEdge_14.push_back(index);
239 }
240 else if (isEdge_25(x, y, z, npts))
241 {
242 iEdge_25.push_back(index);
243 }
244 else if (isEdge_35(x, y, z, npts))
245 {
246 iEdge_35.push_back(index);
247 }
248 else if (isEdge_45(x, y, z, npts))
249 {
250 iEdge_45.push_back(index);
251 }
252 }
253 else if (isFace(x, y, z, npts))
254 {
255 if (isFace_0123(x, y, z, npts))
256 {
257 iFace_0123.push_back(index);
258 }
259 else if (isFace_014(x, y, z, npts))
260 {
261 iFace_014.push_back(index);
262 }
263 else if (isFace_1254(x, y, z, npts))
264 {
265 iFace_1254.push_back(index);
266 }
267 else if (isFace_325(x, y, z, npts))
268 {
269 iFace_325.push_back(index);
270 }
271 else if (isFace_0354(x, y, z, npts))
272 {
273 iFace_0354.push_back(index);
274 }
275 }
276 else
277 {
278 interiorVolumePoints.push_back(index);
279 }
280 }
281 }
282 }
283
284 for (size_t n = 0; n < vertex.size(); ++n)
285 {
286 map.push_back(vertex[n]);
287 }
288
289 for (size_t n = 0; n < iEdge_01.size(); ++n)
290 {
291 map.push_back(iEdge_01[n]);
292 }
293
294 for (size_t n = 0; n < iEdge_12.size(); ++n)
295 {
296 map.push_back(iEdge_12[n]);
297 }
298
299 for (size_t n = 0; n < iEdge_23.size(); ++n)
300 {
301 map.push_back(iEdge_23[n]);
302 }
303
304 for (size_t n = 0; n < iEdge_30.size(); ++n)
305 {
306 map.push_back(iEdge_30[n]);
307 }
308
309 for (size_t n = 0; n < iEdge_04.size(); ++n)
310 {
311 map.push_back(iEdge_04[n]);
312 }
313
314 for (size_t n = 0; n < iEdge_14.size(); ++n)
315 {
316 map.push_back(iEdge_14[n]);
317 }
318
319 for (size_t n = 0; n < iEdge_25.size(); ++n)
320 {
321 map.push_back(iEdge_25[n]);
322 }
323
324 for (size_t n = 0; n < iEdge_35.size(); ++n)
325 {
326 map.push_back(iEdge_35[n]);
327 }
328
329 for (size_t n = 0; n < iEdge_45.size(); ++n)
330 {
331 map.push_back(iEdge_45[n]);
332 }
333
334 for (size_t n = 0; n < iFace_0123.size(); ++n)
335 {
336 map.push_back(iFace_0123[n]);
337 }
338
339 for (size_t n = 0; n < iFace_014.size(); ++n)
340 {
341 map.push_back(iFace_014[n]);
342 }
343
344 for (size_t n = 0; n < iFace_1254.size(); ++n)
345 {
346 map.push_back(iFace_1254[n]);
347 }
348
349 for (size_t n = 0; n < iFace_325.size(); ++n)
350 {
351 map.push_back(iFace_325[n]);
352 }
353
354 for (size_t n = 0; n < iFace_0354.size(); ++n)
355 {
356 map.push_back(iFace_0354[n]);
357 }
358
359 for (size_t n = 0; n < interiorVolumePoints.size(); ++n)
360 {
361 map.push_back(interiorVolumePoints[n]);
362 }
363
364 Array<OneD, NekDouble> points[3];
368
369 for (size_t index = 0; index < map.size(); ++index)
370 {
371 points[0][index] = m_points[0][index];
372 points[1][index] = m_points[1][index];
373 points[2][index] = m_points[2][index];
374 }
375
376 for (size_t index = 0; index < map.size(); ++index)
377 {
378 m_points[0][index] = points[0][map[index]];
379 m_points[1][index] = points[1][map[index]];
380 m_points[2][index] = points[2][map[index]];
381 }
382}
383
385{
386 // Allocate the storage for points
388
389 typedef DataType T;
390
391 // Solve the Vandermonde system of integrals for the weight vector
392 NekVector<T> w = m_util->GetWeights();
393
394 m_weights = Array<OneD, T>(w.GetRows(), w.GetPtr());
395}
396
397// ////////////////////////////////////////
398// CalculateInterpMatrix()
403{
405 xi[0] = xia;
406 xi[1] = yia;
407 xi[2] = zia;
408
409 std::shared_ptr<NekMatrix<NekDouble>> mat =
410 m_util->GetInterpolationMatrix(xi);
411 Vmath::Vcopy(mat->GetRows() * mat->GetColumns(), mat->GetRawPtr(), 1,
412 &interp[0], 1);
413}
414
415// ////////////////////////////////////////
416// CalculateDerivMatrix()
418{
419 // Allocate the derivative matrix.
420 PointsBaseType::v_CalculateDerivMatrix();
421
422 m_derivmatrix[0] = m_util->GetDerivMatrix(0);
423 m_derivmatrix[1] = m_util->GetDerivMatrix(1);
424 m_derivmatrix[2] = m_util->GetDerivMatrix(2);
425}
426
427std::shared_ptr<PointsBaseType> NodalPrismEvenlySpaced::Create(
428 const PointsKey &key)
429{
430 std::shared_ptr<PointsBaseType> returnval(
432
433 returnval->Initialize();
434
435 return returnval;
436}
437} // namespace Nektar::LibUtilities
bool RegisterCreator(const KeyType &key, const CreateFuncType &createFunc)
Register the given function and associate it with the key. The return value is just to facilitate cal...
Definition: NekManager.hpp:168
void CalculateInterpMatrix(const Array< OneD, const NekDouble > &xi, const Array< OneD, const NekDouble > &yi, const Array< OneD, const NekDouble > &zi, Array< OneD, NekDouble > &interp)
static std::shared_ptr< PointsBaseType > Create(const PointsKey &key)
Array< OneD, DataType > m_points[3]
Storage for the point locations, allowing for up to a 3D points storage.
Definition: Points.h:356
MatrixSharedPtrType m_derivmatrix[3]
Derivative matrices.
Definition: Points.h:362
Array< OneD, DataType > m_weights
Quadrature weights for the weights.
Definition: Points.h:358
Defines a specification for a set of points.
Definition: Points.h:50
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
PointsManagerT & PointsManager(void)
@ eNodalPrismEvenlySpaced
3D Evenly-spaced points on a Prism
Definition: PointsType.h:86
std::vector< double > w(NPUPPER)
std::vector< double > z(NPUPPER)
double NekDouble
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.hpp:825