Line data Source code
1 : /*
2 : * Copyright (c) 2010-2021: G-CSC, Goethe University Frankfurt
3 : * Authors: Andreas Vogel, Martin Stepniewski
4 : *
5 : * This file is part of UG4.
6 : *
7 : * UG4 is free software: you can redistribute it and/or modify it under the
8 : * terms of the GNU Lesser General Public License version 3 (as published by the
9 : * Free Software Foundation) with the following additional attribution
10 : * requirements (according to LGPL/GPL v3 §7):
11 : *
12 : * (1) The following notice must be displayed in the Appropriate Legal Notices
13 : * of covered and combined works: "Based on UG4 (www.ug4.org/license)".
14 : *
15 : * (2) The following notice must be displayed at a prominent place in the
16 : * terminal output of covered works: "Based on UG4 (www.ug4.org/license)".
17 : *
18 : * (3) The following bibliography is recommended for citation and must be
19 : * preserved in all covered files:
20 : * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively
21 : * parallel geometric multigrid solver on hierarchically distributed grids.
22 : * Computing and visualization in science 16, 4 (2013), 151-164"
23 : * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel
24 : * flexible software system for simulating pde based models on high performance
25 : * computers. Computing and visualization in science 16, 4 (2013), 165-179"
26 : *
27 : * This program is distributed in the hope that it will be useful,
28 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
29 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 : * GNU Lesser General Public License for more details.
31 : */
32 :
33 : #include "reference_element.h"
34 : #include "common/util/provider.h"
35 :
36 :
37 : namespace ug{
38 :
39 : ///////////////////////////////////////////////////////////////////////////////
40 : // Reference Element
41 : ///////////////////////////////////////////////////////////////////////////////
42 7 : ReferenceElement::ReferenceElement()
43 : {
44 35 : for(size_t d = 0; d < MAXDIM+1; ++d)
45 : {
46 28 : m_vNum[d] = 0;
47 :
48 364 : for(size_t obj = 0; obj < MAXOBJECTS; ++obj)
49 : {
50 336 : m_vRefElemType[d][obj] = ROID_UNKNOWN;
51 1680 : for(size_t d2 = 0; d2 < MAXDIM+1; ++d2)
52 1344 : m_vSubNum[d][obj][d2] = 0;
53 : }
54 : }
55 :
56 35 : for(size_t d = 0; d < MAXDIM+1; ++d)
57 364 : for(size_t obj = 0; obj < MAXOBJECTS; ++obj)
58 1680 : for(size_t d2 = 0; d2 < MAXDIM+1; ++d2)
59 17472 : for(size_t obj2 = 0; obj2 < MAXOBJECTS; ++obj2)
60 16128 : m_id[d][obj][d2][obj2] = -1;
61 :
62 70 : for(size_t roid = 0; roid < NUM_REFERENCE_OBJECTS; ++roid)
63 63 : m_vNumRefElem[roid] = 0;
64 7 : }
65 :
66 0 : void ReferenceElement::print_info() const
67 : {
68 : using namespace std;
69 :
70 0 : string GeomObjects[4] ={"Corner", "Edge", "Face", "Volume"};
71 :
72 : cout << "Reference Element Info: " << endl;
73 : cout << "----------------------- " << endl;
74 :
75 : cout << "Size: " << size() << endl;
76 0 : cout << "Dimension where Reference Element lives: " << dimension() << endl;
77 :
78 0 : for(int i = dimension(); i>=0 ;i--)
79 : cout << "Number of " << GeomObjects[i] << "s: " << num(i) << endl;
80 :
81 0 : for(int dim_i = dimension(); dim_i>=0 ;dim_i--)
82 : {
83 0 : for(size_t i=0; i < num(dim_i); i++)
84 : {
85 : cout << GeomObjects[dim_i] << " with id '" << i << "' contains the following GeomObjects:" << endl;
86 0 : for(int dim_j=dim_i; dim_j>= 0; dim_j--)
87 : {
88 0 : cout << num(dim_i,i,dim_j) << " " << GeomObjects[dim_j] << "s with id: ";
89 0 : for(size_t j=0; j< num(dim_i,i,dim_j); j++)
90 : {
91 0 : cout << id(dim_i,i,dim_j,j) << " ";
92 : }
93 : cout << endl;
94 : }
95 : }
96 : }
97 0 : }
98 :
99 : template <int d>
100 0 : void DimReferenceElement<d>::print_info() const
101 : {
102 : using namespace std;
103 :
104 0 : ReferenceElement::print_info();
105 :
106 0 : cout << "corners:\n";
107 0 : for(size_t i = 0; i< num(0); i++)
108 : {
109 0 : cout << i << ":" << corner(i) << "\n";
110 : }
111 0 : }
112 :
113 :
114 : ///////////////////////////////////////////////////////////////////////////////
115 : // Reference Element Provider
116 : ///////////////////////////////////////////////////////////////////////////////
117 :
118 : // register elements at factory
119 : const ReferenceElement* ReferenceElementProvider::m_vElem[NUM_REFERENCE_OBJECTS];
120 :
121 0 : ReferenceElementProvider::
122 : ReferenceElementProvider()
123 : {
124 : static bool bInit = false;
125 :
126 0 : if(!bInit)
127 : {
128 0 : bInit = true;
129 : bool bRes = true;
130 0 : bRes &= add_elem(Provider<ReferenceVertex>::get());
131 : // not adding for reference vertex
132 :
133 0 : bRes &= add_elem(Provider<ReferenceEdge>::get());
134 0 : bRes &= add_dim_elem<1>(Provider<ReferenceEdge>::get());
135 :
136 0 : bRes &= add_elem(Provider<ReferenceTriangle>::get());
137 0 : bRes &= add_dim_elem<2>(Provider<ReferenceTriangle>::get());
138 :
139 0 : bRes &= add_elem(Provider<ReferenceQuadrilateral>::get());
140 0 : bRes &= add_dim_elem<2>(Provider<ReferenceQuadrilateral>::get());
141 :
142 0 : bRes &= add_elem(Provider<ReferenceTetrahedron>::get());
143 0 : bRes &= add_dim_elem<3>(Provider<ReferenceTetrahedron>::get());
144 :
145 0 : bRes &= add_elem(Provider<ReferencePrism>::get());
146 0 : bRes &= add_dim_elem<3>(Provider<ReferencePrism>::get());
147 :
148 0 : bRes &= add_elem(Provider<ReferencePyramid>::get());
149 0 : bRes &= add_dim_elem<3>(Provider<ReferencePyramid>::get());
150 :
151 0 : bRes &= add_elem(Provider<ReferenceOctahedron>::get());
152 0 : bRes &= add_dim_elem<3>(Provider<ReferenceOctahedron>::get());
153 :
154 0 : bRes &= add_elem(Provider<ReferenceHexahedron>::get());
155 0 : bRes &= add_dim_elem<3>(Provider<ReferenceHexahedron>::get());
156 :
157 0 : if(!bRes) UG_THROW("Error while registering Reference Elements");
158 : }
159 0 : }
160 :
161 0 : bool ReferenceElementProvider::add_elem(const ReferenceElement& elem)
162 : {
163 : const ReferenceObjectID roid = elem.roid();
164 : UG_ASSERT(roid >= 0, "roid ="<<roid<<" wrong")
165 : UG_ASSERT(roid < NUM_REFERENCE_OBJECTS, "roid ="<<roid<<" wrong")
166 0 : m_vElem[roid] = &elem;
167 0 : return true;
168 : }
169 :
170 0 : const ReferenceElement& ReferenceElementProvider::get_elem(ReferenceObjectID roid)
171 : {
172 : UG_ASSERT(roid >= 0, "roid ="<<roid<<" wrong")
173 : UG_ASSERT(roid < NUM_REFERENCE_OBJECTS, "roid ="<<roid<<" wrong")
174 : UG_ASSERT(m_vElem[roid] != NULL, "Null pointer for roid ="<<roid);
175 0 : return *m_vElem[roid];
176 : }
177 :
178 : template <int dim>
179 0 : bool ReferenceElementProvider::add_dim_elem(const DimReferenceElement<dim>& elem)
180 : {
181 : const ReferenceObjectID roid = elem.roid();
182 : UG_ASSERT(roid >= 0, "roid ="<<roid<<" wrong")
183 : UG_ASSERT(roid < NUM_REFERENCE_OBJECTS, "roid ="<<roid<<" wrong")
184 0 : static const DimReferenceElement<dim>** vDimElem = get_vector<dim>();
185 0 : vDimElem[roid] = &elem;
186 0 : return true;
187 : }
188 :
189 :
190 : ///////////////////////////////////////////////////////////////////////////////
191 : // Explicit instantiations
192 : ///////////////////////////////////////////////////////////////////////////////
193 : template class DimReferenceElement<1>;
194 : template class DimReferenceElement<2>;
195 : template class DimReferenceElement<3>;
196 :
197 :
198 :
199 : ///////////////////////////////////////////////////////////////////////////////
200 : // ReferenceVertex
201 : ///////////////////////////////////////////////////////////////////////////////
202 0 : ReferenceVertex::ReferenceVertex()
203 : {
204 : // dimension
205 0 : m_dim = 0;
206 :
207 : // size
208 0 : m_size = 1.0;
209 :
210 : //number of Geometric Objects
211 0 : m_vNum[POINT] = 1;
212 :
213 : // number of Geometric Objects
214 0 : m_vSubNum[POINT][0][POINT] = 1;
215 :
216 0 : m_vRefElemType[POINT][0] = ROID_VERTEX;
217 :
218 : //reset m_id to -1
219 0 : for(int i=0; i<=dim; ++i)
220 0 : for(size_t j=0; j<MAXOBJECTS; ++j)
221 0 : for(int k=0; k<=dim; ++k)
222 0 : for(size_t l=0; l<MAXOBJECTS; l++)
223 : {
224 0 : m_id[i][j][k][l] = -1;
225 : }
226 :
227 : //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
228 0 : for(int i=0; i<=dim; ++i)
229 0 : for(size_t j=0; j<m_vNum[i]; ++j)
230 : {
231 0 : m_id[i][j][i][0] = j;
232 : }
233 :
234 : // Reference Element Types
235 0 : for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
236 : {
237 0 : m_vNumRefElem[i] = 0;
238 : }
239 0 : m_vNumRefElem[ROID_VERTEX] = 1;
240 0 : }
241 :
242 : ///////////////////////////////////////////////////////////////////////////////
243 : // ReferenceEdge
244 : ///////////////////////////////////////////////////////////////////////////////
245 :
246 1 : ReferenceEdge::ReferenceEdge()
247 : {
248 : // dimension
249 1 : m_dim = 1;
250 :
251 : // size
252 1 : m_size = 1.0;
253 :
254 : //number of Geometric Objects
255 1 : m_vNum[POINT] = 2;
256 1 : m_vNum[EDGE] = 1;
257 :
258 : // number of Geometric Objects
259 1 : m_vSubNum[EDGE][0][POINT] = 2;
260 1 : m_vSubNum[EDGE][0][EDGE] = 1;
261 :
262 1 : m_vRefElemType[EDGE][0] = ROID_EDGE;
263 :
264 3 : for(size_t i = 0; i < m_vNum[POINT]; ++i)
265 : {
266 2 : m_vSubNum[POINT][i][POINT] = 1;
267 2 : m_vSubNum[POINT][i][EDGE] = 1;
268 :
269 2 : m_vRefElemType[POINT][i] = ROID_VERTEX;
270 : }
271 :
272 : //reset m_id to -1
273 3 : for(int i=0; i<=dim; ++i)
274 26 : for(size_t j=0; j<MAXOBJECTS; ++j)
275 72 : for(int k=0; k<=dim; ++k)
276 624 : for(size_t l=0; l<MAXOBJECTS; l++)
277 : {
278 576 : m_id[i][j][k][l] = -1;
279 : }
280 :
281 : //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
282 3 : for(int i=0; i<=dim; ++i)
283 5 : for(size_t j=0; j<m_vNum[i]; ++j)
284 : {
285 3 : m_id[i][j][i][0] = j;
286 : }
287 :
288 : // Points <-> Face
289 3 : for(size_t i=0; i<m_vNum[POINT]; ++i)
290 : {
291 2 : m_id[EDGE][0][POINT][i] = i;
292 2 : m_id[POINT][i][EDGE][0] = 0;
293 : }
294 :
295 : // Reference Corners
296 1 : m_vCorner[0][0] = 0.0;
297 1 : m_vCorner[1][0] = 1.0;
298 :
299 1 : m_vCoInt[0][0] = 0;
300 1 : m_vCoInt[1][0] = 1;
301 :
302 : // Reference Element Types
303 10 : for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
304 : {
305 9 : m_vNumRefElem[i] = 0;
306 : }
307 1 : m_vNumRefElem[ROID_VERTEX] = 2;
308 1 : m_vNumRefElem[ROID_EDGE] = 1;
309 1 : }
310 :
311 : ///////////////////////////////////////////////////////////////////////////////
312 : // ReferenceTriangle
313 : ///////////////////////////////////////////////////////////////////////////////
314 :
315 1 : ReferenceTriangle::ReferenceTriangle()
316 : {
317 : // dimension
318 1 : m_dim = 2;
319 :
320 : // size
321 1 : m_size = 0.5;
322 :
323 : //number of Geometric Objects
324 1 : m_vNum[POINT] = 3;
325 1 : m_vNum[EDGE] = 3;
326 1 : m_vNum[FACE] = 1;
327 :
328 : // number of Geometric Objects
329 1 : m_vSubNum[FACE][0][POINT] = 3;
330 1 : m_vSubNum[FACE][0][EDGE] = 3;
331 1 : m_vSubNum[FACE][0][FACE] = 1;
332 :
333 1 : m_vRefElemType[FACE][0] = ROID_TRIANGLE;
334 :
335 4 : for(size_t i = 0; i < m_vNum[EDGE]; ++i)
336 : {
337 3 : m_vSubNum[EDGE][i][POINT] = 2;
338 3 : m_vSubNum[EDGE][i][EDGE] = 1;
339 3 : m_vSubNum[EDGE][i][FACE] = 1;
340 :
341 3 : m_vRefElemType[EDGE][i] = ROID_EDGE;
342 : }
343 :
344 4 : for(size_t i = 0; i < m_vNum[POINT]; ++i)
345 : {
346 3 : m_vSubNum[POINT][i][POINT] = 1;
347 3 : m_vSubNum[POINT][i][EDGE] = 2;
348 3 : m_vSubNum[POINT][i][FACE] = 1;
349 :
350 3 : m_vRefElemType[POINT][i] = ROID_VERTEX;
351 : }
352 :
353 : //reset m_id to -1
354 4 : for(int i=0; i<=dim; ++i)
355 39 : for(size_t j=0; j<MAXOBJECTS; ++j)
356 144 : for(int k=0; k<=dim; ++k)
357 1404 : for(size_t l=0; l<MAXOBJECTS; l++)
358 : {
359 1296 : m_id[i][j][k][l] = -1;
360 : }
361 :
362 : //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
363 4 : for(int i=0; i<=dim; ++i)
364 10 : for(size_t j=0; j<m_vNum[i]; ++j)
365 : {
366 7 : m_id[i][j][i][0] = j;
367 : }
368 :
369 : //Edges <-> Face
370 4 : for(size_t i=0; i<m_vNum[EDGE]; ++i)
371 : {
372 3 : m_id[FACE][0][EDGE][i] = i;
373 3 : m_id[EDGE][i][FACE][0] = 0;
374 : }
375 :
376 : // Points <-> Face
377 4 : for(size_t i=0; i<m_vNum[POINT]; ++i)
378 : {
379 3 : m_id[FACE][0][POINT][i] = i;
380 3 : m_id[POINT][i][FACE][0] = 0;
381 : }
382 :
383 : // Points of Edges
384 : // edge 0 = (0,1)
385 1 : m_id[EDGE][0][POINT][0] = 0;
386 1 : m_id[EDGE][0][POINT][1] = 1;
387 : // edge 1 = (1,2)
388 1 : m_id[EDGE][1][POINT][0] = 1;
389 1 : m_id[EDGE][1][POINT][1] = 2;
390 : // edge 2 = (2,0)
391 1 : m_id[EDGE][2][POINT][0] = 2;
392 1 : m_id[EDGE][2][POINT][1] = 0;
393 :
394 : // Edges of Point
395 1 : m_id[POINT][0][EDGE][0] = 2;
396 1 : m_id[POINT][0][EDGE][1] = 0;
397 :
398 1 : m_id[POINT][1][EDGE][0] = 0;
399 1 : m_id[POINT][1][EDGE][1] = 1;
400 :
401 1 : m_id[POINT][2][EDGE][0] = 1;
402 1 : m_id[POINT][2][EDGE][1] = 2;
403 :
404 :
405 : // Reference Corners
406 : m_vCorner[0] = MathVector<dim>(0.0, 0.0);
407 : m_vCorner[1] = MathVector<dim>(1.0, 0.0);
408 : m_vCorner[2] = MathVector<dim>(0.0, 1.0);
409 :
410 : m_vCoInt[0] = MathVector<dim,int>(0, 0);
411 : m_vCoInt[1] = MathVector<dim,int>(1, 0);
412 : m_vCoInt[2] = MathVector<dim,int>(0, 1);
413 :
414 : // Reference Element Types
415 10 : for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
416 : {
417 9 : m_vNumRefElem[i] = 0;
418 : }
419 1 : m_vNumRefElem[ROID_VERTEX] = 3;
420 1 : m_vNumRefElem[ROID_EDGE] = 3;
421 1 : m_vNumRefElem[ROID_TRIANGLE] = 1;
422 1 : }
423 :
424 : ///////////////////////////////////////////////////////////////////////////////
425 : // ReferenceQuadrilateral
426 : ///////////////////////////////////////////////////////////////////////////////
427 :
428 1 : ReferenceQuadrilateral::ReferenceQuadrilateral()
429 : {
430 : // dimension
431 1 : m_dim = 2;
432 :
433 : // size
434 1 : m_size = 1.0;
435 :
436 : //number of Geometric Objects
437 1 : m_vNum[POINT] = 4;
438 1 : m_vNum[EDGE] = 4;
439 1 : m_vNum[FACE] = 1;
440 :
441 : // number of Geometric Objects
442 1 : m_vSubNum[FACE][0][POINT] = 4;
443 1 : m_vSubNum[FACE][0][EDGE] = 4;
444 1 : m_vSubNum[FACE][0][FACE] = 1;
445 1 : m_vRefElemType[FACE][0] = ROID_QUADRILATERAL;
446 :
447 5 : for(size_t i = 0; i < m_vNum[EDGE]; ++i)
448 : {
449 4 : m_vSubNum[EDGE][i][EDGE] = 1;
450 4 : m_vSubNum[EDGE][i][POINT] = 2;
451 4 : m_vSubNum[EDGE][i][FACE] = 1;
452 :
453 4 : m_vRefElemType[EDGE][i] = ROID_EDGE;
454 : }
455 :
456 5 : for(size_t i = 0; i < m_vNum[EDGE]; ++i)
457 : {
458 4 : m_vSubNum[POINT][i][POINT] = 1;
459 4 : m_vSubNum[POINT][i][EDGE] = 2;
460 4 : m_vSubNum[POINT][i][FACE] = 1;
461 :
462 4 : m_vRefElemType[POINT][i] = ROID_VERTEX;
463 : }
464 :
465 : //reset m_id to -1
466 4 : for(int i=0; i<=dim; ++i)
467 39 : for(size_t j=0; j<MAXOBJECTS; ++j)
468 144 : for(int k=0; k<=dim; ++k)
469 1404 : for(size_t l=0; l<MAXOBJECTS; l++)
470 : {
471 1296 : m_id[i][j][k][l] = -1;
472 : }
473 :
474 : //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
475 4 : for(int d=0; d<=dim; ++d)
476 12 : for(size_t j=0; j<m_vNum[d]; ++j)
477 : {
478 9 : m_id[d][j][d][0] = j;
479 : }
480 :
481 : //Edges <-> Face
482 5 : for(size_t i=0; i<m_vNum[EDGE]; ++i)
483 : {
484 4 : m_id[FACE][0][EDGE][i] = i;
485 4 : m_id[EDGE][i][FACE][0] = 0;
486 : }
487 :
488 : // Points <-> Face
489 5 : for(size_t i=0; i<m_vNum[POINT]; ++i)
490 : {
491 4 : m_id[FACE][0][POINT][i] = i;
492 4 : m_id[POINT][i][FACE][0] = 0;
493 : }
494 :
495 : // Points of Edges
496 : // edge 0 = (0,1)
497 1 : m_id[EDGE][0][POINT][0] = 0;
498 1 : m_id[EDGE][0][POINT][1] = 1;
499 : // edge 1 = (1,2)
500 1 : m_id[EDGE][1][POINT][0] = 1;
501 1 : m_id[EDGE][1][POINT][1] = 2;
502 : // edge 2 = (2,3)
503 1 : m_id[EDGE][2][POINT][0] = 2;
504 1 : m_id[EDGE][2][POINT][1] = 3;
505 : // edge 3 = (3,0)
506 1 : m_id[EDGE][3][POINT][0] = 3;
507 1 : m_id[EDGE][3][POINT][1] = 0;
508 :
509 : // Edges of Point
510 1 : m_id[POINT][0][EDGE][0] = 3;
511 1 : m_id[POINT][0][EDGE][1] = 0;
512 :
513 1 : m_id[POINT][1][EDGE][0] = 0;
514 1 : m_id[POINT][1][EDGE][1] = 1;
515 :
516 1 : m_id[POINT][2][EDGE][0] = 1;
517 1 : m_id[POINT][2][EDGE][1] = 2;
518 :
519 1 : m_id[POINT][3][EDGE][0] = 2;
520 1 : m_id[POINT][3][EDGE][1] = 3;
521 :
522 : // Reference Corners
523 : m_vCorner[0] = MathVector<dim>(0.0, 0.0);
524 : m_vCorner[1] = MathVector<dim>(1.0, 0.0);
525 : m_vCorner[2] = MathVector<dim>(1.0, 1.0);
526 : m_vCorner[3] = MathVector<dim>(0.0, 1.0);
527 :
528 : m_vCoInt[0] = MathVector<dim,int>(0, 0);
529 : m_vCoInt[1] = MathVector<dim,int>(1, 0);
530 : m_vCoInt[2] = MathVector<dim,int>(1, 1);
531 : m_vCoInt[3] = MathVector<dim,int>(0, 1);
532 :
533 : // Reference Element Types
534 10 : for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
535 : {
536 9 : m_vNumRefElem[i] = 0;
537 : }
538 1 : m_vNumRefElem[ROID_VERTEX] = 4;
539 1 : m_vNumRefElem[ROID_EDGE] = 4;
540 1 : m_vNumRefElem[ROID_QUADRILATERAL] = 1;
541 1 : }
542 :
543 : ///////////////////////////////////////////////////////////////////////////////
544 : // ReferenceTetrahedron
545 : ///////////////////////////////////////////////////////////////////////////////
546 :
547 1 : ReferenceTetrahedron::ReferenceTetrahedron()
548 : {
549 : // dimension
550 1 : m_dim = 3;
551 :
552 : // size
553 1 : m_size = 1.0/6.0;
554 :
555 : //number of Geometric Objects
556 1 : m_vNum[POINT] = 4;
557 1 : m_vNum[EDGE] = 6;
558 1 : m_vNum[FACE] = 4;
559 1 : m_vNum[VOLUME] = 1;
560 :
561 : // number of Geometric Objects
562 1 : m_vSubNum[VOLUME][0][POINT] = 4;
563 1 : m_vSubNum[VOLUME][0][EDGE] = 6;
564 1 : m_vSubNum[VOLUME][0][FACE] = 4;
565 1 : m_vSubNum[VOLUME][0][VOLUME] = 1;
566 1 : m_vRefElemType[VOLUME][0] = ROID_TETRAHEDRON;
567 :
568 5 : for(size_t i = 0; i < m_vNum[FACE]; ++i)
569 : {
570 4 : m_vSubNum[FACE][i][POINT] = 3;
571 4 : m_vSubNum[FACE][i][EDGE] = 3;
572 4 : m_vSubNum[FACE][i][FACE] = 1;
573 4 : m_vSubNum[FACE][i][VOLUME] = 1;
574 :
575 4 : m_vRefElemType[FACE][i] = ROID_TRIANGLE;
576 : }
577 :
578 7 : for(size_t i = 0; i < m_vNum[EDGE]; ++i)
579 : {
580 6 : m_vSubNum[EDGE][i][POINT] = 2;
581 6 : m_vSubNum[EDGE][i][EDGE] = 1;
582 6 : m_vSubNum[EDGE][i][FACE] = 2;
583 6 : m_vSubNum[EDGE][i][VOLUME] = 1;
584 :
585 6 : m_vRefElemType[EDGE][i] = ROID_EDGE;
586 : }
587 :
588 5 : for(size_t i = 0; i < m_vNum[POINT]; ++i)
589 : {
590 4 : m_vSubNum[POINT][i][POINT] = 1;
591 4 : m_vSubNum[POINT][i][EDGE] = 3;
592 4 : m_vSubNum[POINT][i][FACE] = 3;
593 4 : m_vSubNum[POINT][i][VOLUME] = 1;
594 :
595 4 : m_vRefElemType[POINT][i] = ROID_VERTEX;
596 : }
597 :
598 : //reset m_id to -1
599 5 : for(int i=0; i<=dim; ++i)
600 52 : for(size_t j=0; j<MAXOBJECTS; ++j)
601 240 : for(int k=0; k<=dim; ++k)
602 2496 : for(size_t l=0; l<MAXOBJECTS; l++)
603 : {
604 2304 : m_id[i][j][k][l] = -1;
605 : }
606 :
607 : //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
608 5 : for(int i=0; i<=dim; ++i)
609 19 : for(size_t j=0; j<m_vNum[i]; ++j)
610 : {
611 15 : m_id[i][j][i][0] = j;
612 : }
613 :
614 : // Face <-> Volume
615 5 : for(size_t i=0; i<m_vNum[FACE]; ++i)
616 : {
617 4 : m_id[VOLUME][0][FACE][i] = i;
618 4 : m_id[FACE][i][VOLUME][0] = 0;
619 : }
620 :
621 : // Edge <-> Volume
622 7 : for(size_t i=0; i<m_vNum[EDGE]; ++i)
623 : {
624 6 : m_id[VOLUME][0][EDGE][i] = i;
625 6 : m_id[EDGE][i][VOLUME][0] = 0;
626 : }
627 :
628 : // Point <-> Volume
629 5 : for(size_t i=0; i<m_vNum[POINT]; ++i)
630 : {
631 4 : m_id[VOLUME][0][POINT][i] = i;
632 4 : m_id[POINT][i][VOLUME][0] = 0;
633 : }
634 :
635 : // Points <-> Faces
636 1 : m_id[FACE][0][POINT][0] = 0;
637 1 : m_id[FACE][0][POINT][1] = 2;
638 1 : m_id[FACE][0][POINT][2] = 1;
639 :
640 1 : m_id[FACE][1][POINT][0] = 1;
641 1 : m_id[FACE][1][POINT][1] = 2;
642 1 : m_id[FACE][1][POINT][2] = 3;
643 :
644 1 : m_id[FACE][2][POINT][0] = 0;
645 1 : m_id[FACE][2][POINT][1] = 3;
646 1 : m_id[FACE][2][POINT][2] = 2;
647 :
648 1 : m_id[FACE][3][POINT][0] = 0;
649 1 : m_id[FACE][3][POINT][1] = 1;
650 1 : m_id[FACE][3][POINT][2] = 3;
651 :
652 :
653 1 : m_id[POINT][0][FACE][0] = 0;
654 1 : m_id[POINT][0][FACE][1] = 2;
655 1 : m_id[POINT][0][FACE][2] = 3;
656 :
657 1 : m_id[POINT][1][FACE][0] = 0;
658 1 : m_id[POINT][1][FACE][1] = 3;
659 1 : m_id[POINT][1][FACE][2] = 1;
660 :
661 1 : m_id[POINT][2][FACE][0] = 0;
662 1 : m_id[POINT][2][FACE][1] = 1;
663 1 : m_id[POINT][2][FACE][2] = 2;
664 :
665 1 : m_id[POINT][3][FACE][0] = 3;
666 1 : m_id[POINT][3][FACE][1] = 2;
667 1 : m_id[POINT][3][FACE][2] = 1;
668 :
669 : // Edges <-> Faces
670 1 : m_id[FACE][0][EDGE][0] = 2;
671 1 : m_id[FACE][0][EDGE][1] = 1;
672 1 : m_id[FACE][0][EDGE][2] = 0;
673 :
674 1 : m_id[FACE][1][EDGE][0] = 1;
675 1 : m_id[FACE][1][EDGE][1] = 5;
676 1 : m_id[FACE][1][EDGE][2] = 4;
677 :
678 1 : m_id[FACE][2][EDGE][0] = 3;
679 1 : m_id[FACE][2][EDGE][1] = 5;
680 1 : m_id[FACE][2][EDGE][2] = 2;
681 :
682 1 : m_id[FACE][3][EDGE][0] = 0;
683 1 : m_id[FACE][3][EDGE][1] = 4;
684 1 : m_id[FACE][3][EDGE][2] = 3;
685 :
686 1 : m_id[EDGE][0][FACE][0] = 0;
687 1 : m_id[EDGE][0][FACE][1] = 3;
688 :
689 1 : m_id[EDGE][1][FACE][0] = 0;
690 1 : m_id[EDGE][1][FACE][1] = 1;
691 :
692 1 : m_id[EDGE][2][FACE][0] = 0;
693 1 : m_id[EDGE][2][FACE][1] = 2;
694 :
695 1 : m_id[EDGE][3][FACE][0] = 3;
696 1 : m_id[EDGE][3][FACE][1] = 2;
697 :
698 1 : m_id[EDGE][4][FACE][0] = 1;
699 1 : m_id[EDGE][4][FACE][1] = 3;
700 :
701 1 : m_id[EDGE][5][FACE][0] = 2;
702 1 : m_id[EDGE][5][FACE][1] = 1;
703 :
704 :
705 : // Points of Edges
706 : // edge 0 = (0,1)
707 1 : m_id[EDGE][0][POINT][0] = 0;
708 1 : m_id[EDGE][0][POINT][1] = 1;
709 : // edge 1 = (1,2)
710 1 : m_id[EDGE][1][POINT][0] = 1;
711 1 : m_id[EDGE][1][POINT][1] = 2;
712 : // edge 2 = (2,0)
713 1 : m_id[EDGE][2][POINT][0] = 2;
714 1 : m_id[EDGE][2][POINT][1] = 0;
715 : // edge 3 = (0,3)
716 1 : m_id[EDGE][3][POINT][0] = 0;
717 1 : m_id[EDGE][3][POINT][1] = 3;
718 : // edge 4 = (1,3)
719 1 : m_id[EDGE][4][POINT][0] = 1;
720 1 : m_id[EDGE][4][POINT][1] = 3;
721 : // edge 5 = (2,3)
722 1 : m_id[EDGE][5][POINT][0] = 2;
723 1 : m_id[EDGE][5][POINT][1] = 3;
724 :
725 : // Edges of Point
726 1 : m_id[POINT][0][EDGE][0] = 2;
727 1 : m_id[POINT][0][EDGE][1] = 0;
728 1 : m_id[POINT][0][EDGE][2] = 3;
729 :
730 1 : m_id[POINT][1][EDGE][0] = 0;
731 1 : m_id[POINT][1][EDGE][1] = 1;
732 1 : m_id[POINT][1][EDGE][2] = 4;
733 :
734 1 : m_id[POINT][2][EDGE][0] = 1;
735 1 : m_id[POINT][2][EDGE][1] = 2;
736 1 : m_id[POINT][2][EDGE][2] = 5;
737 :
738 1 : m_id[POINT][3][EDGE][0] = 3;
739 1 : m_id[POINT][3][EDGE][1] = 4;
740 1 : m_id[POINT][3][EDGE][2] = 5;
741 :
742 : // Reference Corners
743 : m_vCorner[0] = MathVector<dim>(0.0, 0.0, 0.0);
744 : m_vCorner[1] = MathVector<dim>(1.0, 0.0, 0.0);
745 : m_vCorner[2] = MathVector<dim>(0.0, 1.0, 0.0);
746 : m_vCorner[3] = MathVector<dim>(0.0, 0.0, 1.0);
747 :
748 : m_vCoInt[0] = MathVector<dim,int>(0, 0, 0);
749 : m_vCoInt[1] = MathVector<dim,int>(1, 0, 0);
750 : m_vCoInt[2] = MathVector<dim,int>(0, 1, 0);
751 : m_vCoInt[3] = MathVector<dim,int>(0, 0, 1);
752 :
753 : // Reference Element Types
754 10 : for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
755 : {
756 9 : m_vNumRefElem[i] = 0;
757 : }
758 1 : m_vNumRefElem[ROID_VERTEX] = 4;
759 1 : m_vNumRefElem[ROID_EDGE] = 6;
760 1 : m_vNumRefElem[ROID_TRIANGLE] = 4;
761 1 : m_vNumRefElem[ROID_TETRAHEDRON] = 1;
762 1 : }
763 :
764 : ///////////////////////////////////////////////////////////////////////////////
765 : // ReferencePyramid
766 : ///////////////////////////////////////////////////////////////////////////////
767 :
768 1 : ReferencePyramid::ReferencePyramid()
769 : {
770 : // dimension
771 1 : m_dim = 3;
772 :
773 : // size
774 1 : m_size = 1.0/3.0;
775 :
776 : //number of Geometric Objects
777 1 : m_vNum[POINT] = 5;
778 1 : m_vNum[EDGE] = 8;
779 1 : m_vNum[FACE] = 5;
780 1 : m_vNum[VOLUME] = 1;
781 :
782 : // number of Geometric Objects
783 1 : m_vSubNum[VOLUME][0][POINT] = 5;
784 1 : m_vSubNum[VOLUME][0][EDGE] = 8;
785 1 : m_vSubNum[VOLUME][0][FACE] = 5;
786 1 : m_vSubNum[VOLUME][0][VOLUME] = 1;
787 1 : m_vRefElemType[VOLUME][0] = ROID_PYRAMID;
788 :
789 1 : m_vSubNum[FACE][0][POINT] = 4;
790 1 : m_vSubNum[FACE][0][EDGE] = 4;
791 1 : m_vSubNum[FACE][0][FACE] = 1;
792 1 : m_vSubNum[FACE][0][VOLUME] = 1;
793 1 : m_vRefElemType[FACE][0] = ROID_QUADRILATERAL;
794 :
795 5 : for(size_t i = 1; i < m_vNum[FACE]; ++i)
796 : {
797 4 : m_vSubNum[FACE][i][POINT] = 3;
798 4 : m_vSubNum[FACE][i][EDGE] = 3;
799 4 : m_vSubNum[FACE][i][FACE] = 1;
800 4 : m_vSubNum[FACE][i][VOLUME] = 1;
801 :
802 4 : m_vRefElemType[FACE][i] = ROID_TRIANGLE;
803 : }
804 :
805 9 : for(size_t i = 0; i < m_vNum[EDGE]; ++i)
806 : {
807 8 : m_vSubNum[EDGE][i][POINT] = 2;
808 8 : m_vSubNum[EDGE][i][EDGE] = 1;
809 8 : m_vSubNum[EDGE][i][FACE] = 2;
810 8 : m_vSubNum[EDGE][i][VOLUME] = 1;
811 :
812 8 : m_vRefElemType[EDGE][i] = ROID_EDGE;
813 : }
814 :
815 5 : for(size_t i = 0; i < m_vNum[POINT] - 1; ++i)
816 : {
817 4 : m_vSubNum[POINT][i][POINT] = 1;
818 4 : m_vSubNum[POINT][i][EDGE] = 3;
819 4 : m_vSubNum[POINT][i][FACE] = 3;
820 4 : m_vSubNum[POINT][i][VOLUME] = 1;
821 :
822 4 : m_vRefElemType[POINT][i] = ROID_VERTEX;
823 : }
824 1 : m_vSubNum[POINT][4][POINT] = 1;
825 1 : m_vSubNum[POINT][4][EDGE] = 4;
826 1 : m_vSubNum[POINT][4][FACE] = 4;
827 1 : m_vSubNum[POINT][4][VOLUME] = 1;
828 :
829 1 : m_vRefElemType[POINT][4] = ROID_VERTEX;
830 :
831 : //reset m_id to -1
832 5 : for(int i=0; i<=dim; ++i)
833 52 : for(size_t j=0; j<MAXOBJECTS; ++j)
834 240 : for(int k=0; k<=dim; ++k)
835 2496 : for(size_t l=0; l<MAXOBJECTS; l++)
836 : {
837 2304 : m_id[i][j][k][l] = -1;
838 : }
839 :
840 : //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
841 5 : for(int i=0; i<=dim; ++i)
842 23 : for(size_t j=0; j<m_vNum[i]; ++j)
843 : {
844 19 : m_id[i][j][i][0] = j;
845 : }
846 :
847 : // Face <-> Volume
848 6 : for(size_t i=0; i<m_vNum[FACE]; ++i)
849 : {
850 5 : m_id[VOLUME][0][FACE][i] = i;
851 5 : m_id[FACE][i][VOLUME][0] = 0;
852 : }
853 :
854 : // Edge <-> Volume
855 9 : for(size_t i=0; i<m_vNum[EDGE]; ++i)
856 : {
857 8 : m_id[VOLUME][0][EDGE][i] = i;
858 8 : m_id[EDGE][i][VOLUME][0] = 0;
859 : }
860 :
861 : // Point <-> Volume
862 6 : for(size_t i=0; i<m_vNum[POINT]; ++i)
863 : {
864 5 : m_id[VOLUME][0][POINT][i] = i;
865 5 : m_id[POINT][i][VOLUME][0] = 0;
866 : }
867 :
868 : // Points <-> Faces
869 1 : m_id[FACE][0][POINT][0] = 0;
870 1 : m_id[FACE][0][POINT][1] = 3;
871 1 : m_id[FACE][0][POINT][2] = 2;
872 1 : m_id[FACE][0][POINT][3] = 1;
873 :
874 1 : m_id[FACE][1][POINT][0] = 0;
875 1 : m_id[FACE][1][POINT][1] = 1;
876 1 : m_id[FACE][1][POINT][2] = 4;
877 :
878 1 : m_id[FACE][2][POINT][0] = 1;
879 1 : m_id[FACE][2][POINT][1] = 2;
880 1 : m_id[FACE][2][POINT][2] = 4;
881 :
882 1 : m_id[FACE][3][POINT][0] = 2;
883 1 : m_id[FACE][3][POINT][1] = 3;
884 1 : m_id[FACE][3][POINT][2] = 4;
885 :
886 1 : m_id[FACE][4][POINT][0] = 3;
887 1 : m_id[FACE][4][POINT][1] = 0;
888 1 : m_id[FACE][4][POINT][2] = 4;
889 :
890 1 : m_id[POINT][0][FACE][0] = 0;
891 1 : m_id[POINT][0][FACE][1] = 4;//1;
892 1 : m_id[POINT][0][FACE][2] = 1;//4;
893 :
894 1 : m_id[POINT][1][FACE][0] = 0;
895 1 : m_id[POINT][1][FACE][1] = 1;
896 1 : m_id[POINT][1][FACE][2] = 2;
897 :
898 1 : m_id[POINT][2][FACE][0] = 0;
899 1 : m_id[POINT][2][FACE][1] = 2;
900 1 : m_id[POINT][2][FACE][2] = 3;
901 :
902 1 : m_id[POINT][3][FACE][0] = 0;
903 1 : m_id[POINT][3][FACE][1] = 3;
904 1 : m_id[POINT][3][FACE][2] = 4;
905 :
906 1 : m_id[POINT][4][FACE][0] = 1;
907 1 : m_id[POINT][4][FACE][1] = 2;
908 1 : m_id[POINT][4][FACE][2] = 3;
909 1 : m_id[POINT][4][FACE][3] = 4;
910 :
911 : // Edges <-> Faces
912 1 : m_id[FACE][0][EDGE][0] = 3;
913 1 : m_id[FACE][0][EDGE][1] = 2;
914 1 : m_id[FACE][0][EDGE][2] = 1;
915 1 : m_id[FACE][0][EDGE][3] = 0;
916 :
917 1 : m_id[FACE][1][EDGE][0] = 0;
918 1 : m_id[FACE][1][EDGE][1] = 5;
919 1 : m_id[FACE][1][EDGE][2] = 4;
920 :
921 1 : m_id[FACE][2][EDGE][0] = 1;
922 1 : m_id[FACE][2][EDGE][1] = 6;
923 1 : m_id[FACE][2][EDGE][2] = 5;
924 :
925 1 : m_id[FACE][3][EDGE][0] = 2;
926 1 : m_id[FACE][3][EDGE][1] = 7;
927 1 : m_id[FACE][3][EDGE][2] = 6;
928 :
929 1 : m_id[FACE][4][EDGE][0] = 3;
930 1 : m_id[FACE][4][EDGE][1] = 4;
931 1 : m_id[FACE][4][EDGE][2] = 7;
932 :
933 1 : m_id[EDGE][0][FACE][0] = 0;
934 1 : m_id[EDGE][0][FACE][1] = 1;
935 :
936 1 : m_id[EDGE][1][FACE][0] = 0;
937 1 : m_id[EDGE][1][FACE][1] = 2;
938 :
939 1 : m_id[EDGE][2][FACE][0] = 0;
940 1 : m_id[EDGE][2][FACE][1] = 3;
941 :
942 1 : m_id[EDGE][3][FACE][0] = 0;
943 1 : m_id[EDGE][3][FACE][1] = 4;
944 :
945 1 : m_id[EDGE][4][FACE][0] = 1;
946 1 : m_id[EDGE][4][FACE][1] = 4;
947 :
948 1 : m_id[EDGE][5][FACE][0] = 2;
949 1 : m_id[EDGE][5][FACE][1] = 1;
950 :
951 1 : m_id[EDGE][6][FACE][0] = 3;
952 1 : m_id[EDGE][6][FACE][1] = 2;
953 :
954 1 : m_id[EDGE][7][FACE][0] = 4;
955 1 : m_id[EDGE][7][FACE][1] = 3;
956 :
957 : // Points of Edges
958 : // edge 0 = (0,1)
959 1 : m_id[EDGE][0][POINT][0] = 0;
960 1 : m_id[EDGE][0][POINT][1] = 1;
961 : // edge 1 = (1,2)
962 1 : m_id[EDGE][1][POINT][0] = 1;
963 1 : m_id[EDGE][1][POINT][1] = 2;
964 : // edge 2 = (2,3)
965 1 : m_id[EDGE][2][POINT][0] = 2;
966 1 : m_id[EDGE][2][POINT][1] = 3;
967 : // edge 3 = (3,0)
968 1 : m_id[EDGE][3][POINT][0] = 3;
969 1 : m_id[EDGE][3][POINT][1] = 0;
970 : // edge 4 = (0,4)
971 1 : m_id[EDGE][4][POINT][0] = 0;
972 1 : m_id[EDGE][4][POINT][1] = 4;
973 : // edge 5 = (1,4)
974 1 : m_id[EDGE][5][POINT][0] = 1;
975 1 : m_id[EDGE][5][POINT][1] = 4;
976 : // edge 6 = (2,4)
977 1 : m_id[EDGE][6][POINT][0] = 2;
978 1 : m_id[EDGE][6][POINT][1] = 4;
979 : // edge 7 = (3,4)
980 1 : m_id[EDGE][7][POINT][0] = 3;
981 1 : m_id[EDGE][7][POINT][1] = 4;
982 :
983 : // Edges of Point
984 1 : m_id[POINT][0][EDGE][0] = 3;
985 1 : m_id[POINT][0][EDGE][1] = 0;
986 1 : m_id[POINT][0][EDGE][2] = 4;
987 :
988 1 : m_id[POINT][1][EDGE][0] = 0;
989 1 : m_id[POINT][1][EDGE][1] = 1;//5;
990 1 : m_id[POINT][1][EDGE][2] = 5;//1;
991 :
992 1 : m_id[POINT][2][EDGE][0] = 1;
993 1 : m_id[POINT][2][EDGE][1] = 2;//6;
994 1 : m_id[POINT][2][EDGE][2] = 6;//2;
995 :
996 1 : m_id[POINT][3][EDGE][0] = 2;
997 1 : m_id[POINT][3][EDGE][1] = 3;//7;
998 1 : m_id[POINT][3][EDGE][2] = 7;//3;
999 :
1000 1 : m_id[POINT][4][EDGE][0] = 4;
1001 1 : m_id[POINT][4][EDGE][1] = 5;
1002 1 : m_id[POINT][4][EDGE][2] = 6;
1003 1 : m_id[POINT][4][EDGE][3] = 7;
1004 :
1005 : // Reference Corners
1006 : m_vCorner[0] = MathVector<dim>(0.0, 0.0, 0.0);
1007 : m_vCorner[1] = MathVector<dim>(1.0, 0.0, 0.0);
1008 : m_vCorner[2] = MathVector<dim>(1.0, 1.0, 0.0);
1009 : m_vCorner[3] = MathVector<dim>(0.0, 1.0, 0.0);
1010 : m_vCorner[4] = MathVector<dim>(0.0, 0.0, 1.0);
1011 :
1012 : m_vCoInt[0] = MathVector<dim,int>(0, 0, 0);
1013 : m_vCoInt[1] = MathVector<dim,int>(1, 0, 0);
1014 : m_vCoInt[2] = MathVector<dim,int>(1, 1, 0);
1015 : m_vCoInt[3] = MathVector<dim,int>(0, 1, 0);
1016 : m_vCoInt[4] = MathVector<dim,int>(0, 0, 1);
1017 :
1018 : // Reference Element Types
1019 10 : for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
1020 : {
1021 9 : m_vNumRefElem[i] = 0;
1022 : }
1023 1 : m_vNumRefElem[ROID_VERTEX] = 5;
1024 1 : m_vNumRefElem[ROID_EDGE] = 8;
1025 1 : m_vNumRefElem[ROID_QUADRILATERAL] = 1;
1026 1 : m_vNumRefElem[ROID_TRIANGLE] = 4;
1027 1 : m_vNumRefElem[ROID_PYRAMID] = 1;
1028 1 : }
1029 :
1030 : ///////////////////////////////////////////////////////////////////////////////
1031 : // ReferencePrism
1032 : ///////////////////////////////////////////////////////////////////////////////
1033 :
1034 1 : ReferencePrism::ReferencePrism()
1035 : {
1036 : // dimension
1037 1 : m_dim = 3;
1038 :
1039 : // size
1040 1 : m_size = 0.5;
1041 :
1042 : //number of Geometric Objects
1043 1 : m_vNum[POINT] = 6;
1044 1 : m_vNum[EDGE] = 9;
1045 1 : m_vNum[FACE] = 5;
1046 1 : m_vNum[VOLUME] = 1;
1047 :
1048 : // number of Geometric Objects
1049 1 : m_vSubNum[VOLUME][0][POINT] = 6;
1050 1 : m_vSubNum[VOLUME][0][EDGE] = 9;
1051 1 : m_vSubNum[VOLUME][0][FACE] = 5;
1052 1 : m_vSubNum[VOLUME][0][VOLUME] = 1;
1053 1 : m_vRefElemType[VOLUME][0] = ROID_PRISM;
1054 :
1055 1 : m_vSubNum[FACE][0][POINT] = 3;
1056 1 : m_vSubNum[FACE][0][EDGE] = 3;
1057 1 : m_vSubNum[FACE][0][FACE] = 1;
1058 1 : m_vSubNum[FACE][0][VOLUME] = 1;
1059 1 : m_vRefElemType[FACE][0] = ROID_TRIANGLE;
1060 :
1061 1 : m_vSubNum[FACE][1][POINT] = 4;
1062 1 : m_vSubNum[FACE][1][EDGE] = 4;
1063 1 : m_vSubNum[FACE][1][FACE] = 1;
1064 1 : m_vSubNum[FACE][1][VOLUME] = 1;
1065 1 : m_vRefElemType[FACE][1] = ROID_QUADRILATERAL;
1066 :
1067 1 : m_vSubNum[FACE][2][POINT] = 4;
1068 1 : m_vSubNum[FACE][2][EDGE] = 4;
1069 1 : m_vSubNum[FACE][2][FACE] = 1;
1070 1 : m_vSubNum[FACE][2][VOLUME] = 1;
1071 1 : m_vRefElemType[FACE][2] = ROID_QUADRILATERAL;
1072 :
1073 1 : m_vSubNum[FACE][3][POINT] = 4;
1074 1 : m_vSubNum[FACE][3][EDGE] = 4;
1075 1 : m_vSubNum[FACE][3][FACE] = 1;
1076 1 : m_vSubNum[FACE][3][VOLUME] = 1;
1077 1 : m_vRefElemType[FACE][3] = ROID_QUADRILATERAL;
1078 :
1079 1 : m_vSubNum[FACE][4][POINT] = 3;
1080 1 : m_vSubNum[FACE][4][EDGE] = 3;
1081 1 : m_vSubNum[FACE][4][FACE] = 1;
1082 1 : m_vSubNum[FACE][4][VOLUME] = 1;
1083 1 : m_vRefElemType[FACE][4] = ROID_TRIANGLE;
1084 :
1085 10 : for(size_t i = 0; i < m_vNum[EDGE]; ++i)
1086 : {
1087 9 : m_vSubNum[EDGE][i][POINT] = 2;
1088 9 : m_vSubNum[EDGE][i][EDGE] = 1;
1089 9 : m_vSubNum[EDGE][i][FACE] = 2;
1090 9 : m_vSubNum[EDGE][i][VOLUME] = 1;
1091 :
1092 9 : m_vRefElemType[EDGE][i] = ROID_EDGE;
1093 : }
1094 :
1095 7 : for(size_t i = 0; i < m_vNum[POINT]; ++i)
1096 : {
1097 6 : m_vSubNum[POINT][i][POINT] = 1;
1098 6 : m_vSubNum[POINT][i][EDGE] = 3;
1099 6 : m_vSubNum[POINT][i][FACE] = 3;
1100 6 : m_vSubNum[POINT][i][VOLUME] = 1;
1101 :
1102 6 : m_vRefElemType[POINT][i] = ROID_VERTEX;
1103 : }
1104 :
1105 : //reset m_id to -1
1106 5 : for(int i=0; i<=dim; ++i)
1107 52 : for(size_t j=0; j<MAXOBJECTS; ++j)
1108 240 : for(int k=0; k<=dim; ++k)
1109 2496 : for(size_t l=0; l<MAXOBJECTS; l++)
1110 : {
1111 2304 : m_id[i][j][k][l] = -1;
1112 : }
1113 :
1114 : //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
1115 5 : for(int i=0; i<=dim; ++i)
1116 25 : for(size_t j=0; j<m_vNum[i]; ++j)
1117 : {
1118 21 : m_id[i][j][i][0] = j;
1119 : }
1120 :
1121 : // Face <-> Volume
1122 6 : for(size_t i=0; i<m_vNum[FACE]; ++i)
1123 : {
1124 5 : m_id[VOLUME][0][FACE][i] = i;
1125 5 : m_id[FACE][i][VOLUME][0] = 0;
1126 : }
1127 :
1128 : // Edge <-> Volume
1129 10 : for(size_t i=0; i<m_vNum[EDGE]; ++i)
1130 : {
1131 9 : m_id[VOLUME][0][EDGE][i] = i;
1132 9 : m_id[EDGE][i][VOLUME][0] = 0;
1133 : }
1134 :
1135 : // Point <-> Volume
1136 7 : for(size_t i=0; i<m_vNum[POINT]; ++i)
1137 : {
1138 6 : m_id[VOLUME][0][POINT][i] = i;
1139 6 : m_id[POINT][i][VOLUME][0] = 0;
1140 : }
1141 :
1142 : // Points <-> Faces
1143 1 : m_id[FACE][0][POINT][0] = 0;
1144 1 : m_id[FACE][0][POINT][1] = 2;
1145 1 : m_id[FACE][0][POINT][2] = 1;
1146 :
1147 1 : m_id[FACE][1][POINT][0] = 0;
1148 1 : m_id[FACE][1][POINT][1] = 1;
1149 1 : m_id[FACE][1][POINT][2] = 4;
1150 1 : m_id[FACE][1][POINT][3] = 3;
1151 :
1152 1 : m_id[FACE][2][POINT][0] = 1;
1153 1 : m_id[FACE][2][POINT][1] = 2;
1154 1 : m_id[FACE][2][POINT][2] = 5;
1155 1 : m_id[FACE][2][POINT][3] = 4;
1156 :
1157 1 : m_id[FACE][3][POINT][0] = 2;
1158 1 : m_id[FACE][3][POINT][1] = 0;
1159 1 : m_id[FACE][3][POINT][2] = 3;
1160 1 : m_id[FACE][3][POINT][3] = 5;
1161 :
1162 1 : m_id[FACE][4][POINT][0] = 3;
1163 1 : m_id[FACE][4][POINT][1] = 4;
1164 1 : m_id[FACE][4][POINT][2] = 5;
1165 :
1166 :
1167 1 : m_id[POINT][0][FACE][0] = 0;
1168 1 : m_id[POINT][0][FACE][1] = 3;
1169 1 : m_id[POINT][0][FACE][2] = 1;
1170 :
1171 1 : m_id[POINT][1][FACE][0] = 0;
1172 1 : m_id[POINT][1][FACE][1] = 1;
1173 1 : m_id[POINT][1][FACE][2] = 2;
1174 :
1175 1 : m_id[POINT][2][FACE][0] = 0;
1176 1 : m_id[POINT][2][FACE][1] = 2;
1177 1 : m_id[POINT][2][FACE][2] = 3;
1178 :
1179 1 : m_id[POINT][3][FACE][0] = 1;
1180 1 : m_id[POINT][3][FACE][1] = 3;
1181 1 : m_id[POINT][3][FACE][2] = 4;
1182 :
1183 1 : m_id[POINT][4][FACE][0] = 2;
1184 1 : m_id[POINT][4][FACE][1] = 1;
1185 1 : m_id[POINT][4][FACE][2] = 4;
1186 :
1187 1 : m_id[POINT][5][FACE][0] = 3;
1188 1 : m_id[POINT][5][FACE][1] = 2;
1189 1 : m_id[POINT][5][FACE][2] = 4;
1190 :
1191 : // Edges <-> Faces
1192 1 : m_id[FACE][0][EDGE][0] = 2;
1193 1 : m_id[FACE][0][EDGE][1] = 1;
1194 1 : m_id[FACE][0][EDGE][2] = 0;
1195 :
1196 1 : m_id[FACE][1][EDGE][0] = 0;
1197 1 : m_id[FACE][1][EDGE][1] = 4;
1198 1 : m_id[FACE][1][EDGE][2] = 6;
1199 1 : m_id[FACE][1][EDGE][3] = 3;
1200 :
1201 1 : m_id[FACE][2][EDGE][0] = 1;
1202 1 : m_id[FACE][2][EDGE][1] = 5;
1203 1 : m_id[FACE][2][EDGE][2] = 7;
1204 1 : m_id[FACE][2][EDGE][3] = 4;
1205 :
1206 1 : m_id[FACE][3][EDGE][0] = 2;
1207 1 : m_id[FACE][3][EDGE][1] = 3;
1208 1 : m_id[FACE][3][EDGE][2] = 8;
1209 1 : m_id[FACE][3][EDGE][3] = 5;
1210 :
1211 1 : m_id[FACE][4][EDGE][0] = 6;
1212 1 : m_id[FACE][4][EDGE][1] = 7;
1213 1 : m_id[FACE][4][EDGE][2] = 8;
1214 :
1215 1 : m_id[EDGE][0][FACE][0] = 0;
1216 1 : m_id[EDGE][0][FACE][1] = 1;
1217 :
1218 1 : m_id[EDGE][1][FACE][0] = 0;
1219 1 : m_id[EDGE][1][FACE][1] = 2;
1220 :
1221 1 : m_id[EDGE][2][FACE][0] = 0;
1222 1 : m_id[EDGE][2][FACE][1] = 3;
1223 :
1224 1 : m_id[EDGE][3][FACE][0] = 1;
1225 1 : m_id[EDGE][3][FACE][1] = 3;
1226 :
1227 1 : m_id[EDGE][4][FACE][0] = 2;
1228 1 : m_id[EDGE][4][FACE][1] = 1;
1229 :
1230 1 : m_id[EDGE][5][FACE][0] = 3;
1231 1 : m_id[EDGE][5][FACE][1] = 2;
1232 :
1233 1 : m_id[EDGE][6][FACE][0] = 1;
1234 1 : m_id[EDGE][6][FACE][1] = 4;
1235 :
1236 1 : m_id[EDGE][7][FACE][0] = 2;
1237 1 : m_id[EDGE][7][FACE][1] = 4;
1238 :
1239 1 : m_id[EDGE][8][FACE][0] = 3;
1240 1 : m_id[EDGE][8][FACE][1] = 4;
1241 :
1242 : // Points of Edges
1243 : // edge 0 = (0,1)
1244 1 : m_id[EDGE][0][POINT][0] = 0;
1245 1 : m_id[EDGE][0][POINT][1] = 1;
1246 : // edge 1 = (1,2)
1247 1 : m_id[EDGE][1][POINT][0] = 1;
1248 1 : m_id[EDGE][1][POINT][1] = 2;
1249 : // edge 2 = (2,0)
1250 1 : m_id[EDGE][2][POINT][0] = 2;
1251 1 : m_id[EDGE][2][POINT][1] = 0;
1252 : // edge 3 = (0,3)
1253 1 : m_id[EDGE][3][POINT][0] = 0;
1254 1 : m_id[EDGE][3][POINT][1] = 3;
1255 : // edge 4 = (1,3)
1256 1 : m_id[EDGE][4][POINT][0] = 1;
1257 1 : m_id[EDGE][4][POINT][1] = 4;
1258 : // edge 5 = (2,3)
1259 1 : m_id[EDGE][5][POINT][0] = 2;
1260 1 : m_id[EDGE][5][POINT][1] = 5;
1261 : // edge 6 = (3,4)
1262 1 : m_id[EDGE][6][POINT][0] = 3;
1263 1 : m_id[EDGE][6][POINT][1] = 4;
1264 : // edge 7 = (4,5)
1265 1 : m_id[EDGE][7][POINT][0] = 4;
1266 1 : m_id[EDGE][7][POINT][1] = 5;
1267 : // edge 8 = (5,3)
1268 1 : m_id[EDGE][8][POINT][0] = 5;
1269 1 : m_id[EDGE][8][POINT][1] = 3;
1270 :
1271 : // Edges of Point
1272 1 : m_id[POINT][0][EDGE][0] = 2;
1273 1 : m_id[POINT][0][EDGE][1] = 0;
1274 1 : m_id[POINT][0][EDGE][2] = 3;
1275 :
1276 1 : m_id[POINT][1][EDGE][0] = 0;
1277 1 : m_id[POINT][1][EDGE][1] = 1;
1278 1 : m_id[POINT][1][EDGE][2] = 4;
1279 :
1280 1 : m_id[POINT][2][EDGE][0] = 1;
1281 1 : m_id[POINT][2][EDGE][1] = 2;
1282 1 : m_id[POINT][2][EDGE][2] = 5;
1283 :
1284 1 : m_id[POINT][3][EDGE][0] = 3;
1285 1 : m_id[POINT][3][EDGE][1] = 6;
1286 1 : m_id[POINT][3][EDGE][2] = 8;
1287 :
1288 1 : m_id[POINT][4][EDGE][0] = 4;
1289 1 : m_id[POINT][4][EDGE][1] = 7;
1290 1 : m_id[POINT][4][EDGE][2] = 6;
1291 :
1292 1 : m_id[POINT][5][EDGE][0] = 5;
1293 1 : m_id[POINT][5][EDGE][1] = 8;
1294 1 : m_id[POINT][5][EDGE][2] = 7;
1295 :
1296 : // Reference Corners
1297 : m_vCorner[0] = MathVector<dim>(0.0, 0.0, 0.0);
1298 : m_vCorner[1] = MathVector<dim>(1.0, 0.0, 0.0);
1299 : m_vCorner[2] = MathVector<dim>(0.0, 1.0, 0.0);
1300 : m_vCorner[3] = MathVector<dim>(0.0, 0.0, 1.0);
1301 : m_vCorner[4] = MathVector<dim>(1.0, 0.0, 1.0);
1302 : m_vCorner[5] = MathVector<dim>(0.0, 1.0, 1.0);
1303 :
1304 : m_vCoInt[0] = MathVector<dim,int>(0, 0, 0);
1305 : m_vCoInt[1] = MathVector<dim,int>(1, 0, 0);
1306 : m_vCoInt[2] = MathVector<dim,int>(0, 1, 0);
1307 : m_vCoInt[3] = MathVector<dim,int>(0, 0, 1);
1308 : m_vCoInt[4] = MathVector<dim,int>(1, 0, 1);
1309 : m_vCoInt[5] = MathVector<dim,int>(0, 1, 1);
1310 :
1311 : // Reference Element Types
1312 10 : for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
1313 : {
1314 9 : m_vNumRefElem[i] = 0;
1315 : }
1316 1 : m_vNumRefElem[ROID_VERTEX] = 6;
1317 1 : m_vNumRefElem[ROID_EDGE] = 9;
1318 1 : m_vNumRefElem[ROID_TRIANGLE] = 2;
1319 1 : m_vNumRefElem[ROID_QUADRILATERAL] = 3;
1320 1 : m_vNumRefElem[ROID_PRISM] = 1;
1321 1 : }
1322 :
1323 : ///////////////////////////////////////////////////////////////////////////////
1324 : // ReferenceHexahedron
1325 : ///////////////////////////////////////////////////////////////////////////////
1326 :
1327 1 : ReferenceHexahedron::ReferenceHexahedron()
1328 : {
1329 : // dimension
1330 1 : m_dim = 3;
1331 :
1332 : // size
1333 1 : m_size = 1.0;
1334 :
1335 : //number of Geometric Objects
1336 1 : m_vNum[POINT] = 8;
1337 1 : m_vNum[EDGE] = 12;
1338 1 : m_vNum[FACE] = 6;
1339 1 : m_vNum[VOLUME] = 1;
1340 :
1341 : // number of Geometric Objects
1342 1 : m_vSubNum[VOLUME][0][POINT] = 8;
1343 1 : m_vSubNum[VOLUME][0][EDGE] = 12;
1344 1 : m_vSubNum[VOLUME][0][FACE] = 6;
1345 1 : m_vSubNum[VOLUME][0][VOLUME] = 1;
1346 1 : m_vRefElemType[VOLUME][0] = ROID_HEXAHEDRON;
1347 :
1348 7 : for(size_t i = 0; i < m_vNum[FACE]; ++i)
1349 : {
1350 6 : m_vSubNum[FACE][i][POINT] = 4;
1351 6 : m_vSubNum[FACE][i][EDGE] = 4;
1352 6 : m_vSubNum[FACE][i][FACE] = 1;
1353 6 : m_vSubNum[FACE][i][VOLUME] = 1;
1354 :
1355 6 : m_vRefElemType[FACE][i] = ROID_QUADRILATERAL;
1356 : }
1357 :
1358 13 : for(size_t i = 0; i < m_vNum[EDGE]; ++i)
1359 : {
1360 12 : m_vSubNum[EDGE][i][POINT] = 2;
1361 12 : m_vSubNum[EDGE][i][EDGE] = 1;
1362 12 : m_vSubNum[EDGE][i][FACE] = 2;
1363 12 : m_vSubNum[EDGE][i][VOLUME] = 1;
1364 :
1365 12 : m_vRefElemType[EDGE][i] = ROID_EDGE;
1366 : }
1367 :
1368 9 : for(size_t i = 0; i < m_vNum[POINT]; ++i)
1369 : {
1370 8 : m_vSubNum[POINT][i][POINT] = 1;
1371 8 : m_vSubNum[POINT][i][EDGE] = 3;
1372 8 : m_vSubNum[POINT][i][FACE] = 3;
1373 8 : m_vSubNum[POINT][i][VOLUME] = 1;
1374 :
1375 8 : m_vRefElemType[POINT][i] = ROID_VERTEX;
1376 : }
1377 :
1378 : //reset m_id to -1
1379 5 : for(int i=0; i<=dim; ++i)
1380 52 : for(size_t j=0; j<MAXOBJECTS; ++j)
1381 240 : for(int k=0; k<=dim; ++k)
1382 2496 : for(size_t l=0; l<MAXOBJECTS; l++)
1383 : {
1384 2304 : m_id[i][j][k][l] = -1;
1385 : }
1386 :
1387 : //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
1388 5 : for(int i=0; i<=dim; ++i)
1389 31 : for(size_t j=0; j<m_vNum[i]; ++j)
1390 : {
1391 27 : m_id[i][j][i][0] = j;
1392 : }
1393 :
1394 : // Face <-> Volume
1395 7 : for(size_t i=0; i<m_vNum[FACE]; ++i)
1396 : {
1397 6 : m_id[VOLUME][0][FACE][i] = i;
1398 6 : m_id[FACE][i][VOLUME][0] = 0;
1399 : }
1400 :
1401 : // Edge <-> Volume
1402 13 : for(size_t i=0; i<m_vNum[EDGE]; ++i)
1403 : {
1404 12 : m_id[VOLUME][0][EDGE][i] = i;
1405 12 : m_id[EDGE][i][VOLUME][0] = 0;
1406 : }
1407 :
1408 : // Point <-> Volume
1409 9 : for(size_t i=0; i<m_vNum[POINT]; ++i)
1410 : {
1411 8 : m_id[VOLUME][0][POINT][i] = i;
1412 8 : m_id[POINT][i][VOLUME][0] = 0;
1413 : }
1414 :
1415 : // Points <-> Faces
1416 1 : m_id[FACE][0][POINT][0] = 0;
1417 1 : m_id[FACE][0][POINT][1] = 3;
1418 1 : m_id[FACE][0][POINT][2] = 2;
1419 1 : m_id[FACE][0][POINT][3] = 1;
1420 :
1421 1 : m_id[FACE][1][POINT][0] = 0;
1422 1 : m_id[FACE][1][POINT][1] = 1;
1423 1 : m_id[FACE][1][POINT][2] = 5;
1424 1 : m_id[FACE][1][POINT][3] = 4;
1425 :
1426 1 : m_id[FACE][2][POINT][0] = 1;
1427 1 : m_id[FACE][2][POINT][1] = 2;
1428 1 : m_id[FACE][2][POINT][2] = 6;
1429 1 : m_id[FACE][2][POINT][3] = 5;
1430 :
1431 1 : m_id[FACE][3][POINT][0] = 2;
1432 1 : m_id[FACE][3][POINT][1] = 3;
1433 1 : m_id[FACE][3][POINT][2] = 7;
1434 1 : m_id[FACE][3][POINT][3] = 6;
1435 :
1436 1 : m_id[FACE][4][POINT][0] = 3;
1437 1 : m_id[FACE][4][POINT][1] = 0;
1438 1 : m_id[FACE][4][POINT][2] = 4;
1439 1 : m_id[FACE][4][POINT][3] = 7;
1440 :
1441 1 : m_id[FACE][5][POINT][0] = 4;
1442 1 : m_id[FACE][5][POINT][1] = 5;
1443 1 : m_id[FACE][5][POINT][2] = 6;
1444 1 : m_id[FACE][5][POINT][3] = 7;
1445 :
1446 1 : m_id[POINT][0][FACE][0] = 0;
1447 1 : m_id[POINT][0][FACE][1] = 4;
1448 1 : m_id[POINT][0][FACE][2] = 1;
1449 :
1450 1 : m_id[POINT][1][FACE][0] = 0;
1451 1 : m_id[POINT][1][FACE][1] = 1;
1452 1 : m_id[POINT][1][FACE][2] = 2;
1453 :
1454 1 : m_id[POINT][2][FACE][0] = 0;
1455 1 : m_id[POINT][2][FACE][1] = 2;
1456 1 : m_id[POINT][2][FACE][2] = 3;
1457 :
1458 1 : m_id[POINT][3][FACE][0] = 0;
1459 1 : m_id[POINT][3][FACE][1] = 3;
1460 1 : m_id[POINT][3][FACE][2] = 4;
1461 :
1462 1 : m_id[POINT][4][FACE][0] = 1;
1463 1 : m_id[POINT][4][FACE][1] = 4;
1464 1 : m_id[POINT][4][FACE][2] = 5;
1465 :
1466 1 : m_id[POINT][5][FACE][0] = 2;
1467 1 : m_id[POINT][5][FACE][1] = 1;
1468 1 : m_id[POINT][5][FACE][2] = 5;
1469 :
1470 1 : m_id[POINT][6][FACE][0] = 3;
1471 1 : m_id[POINT][6][FACE][1] = 2;
1472 1 : m_id[POINT][6][FACE][2] = 5;
1473 :
1474 1 : m_id[POINT][7][FACE][0] = 4;
1475 1 : m_id[POINT][7][FACE][1] = 3;
1476 1 : m_id[POINT][7][FACE][2] = 5;
1477 :
1478 : // Edges <-> Faces
1479 1 : m_id[FACE][0][EDGE][0] = 3;
1480 1 : m_id[FACE][0][EDGE][1] = 2;
1481 1 : m_id[FACE][0][EDGE][2] = 1;
1482 1 : m_id[FACE][0][EDGE][3] = 0;
1483 :
1484 1 : m_id[FACE][1][EDGE][0] = 0;
1485 1 : m_id[FACE][1][EDGE][1] = 5;
1486 1 : m_id[FACE][1][EDGE][2] = 8;
1487 1 : m_id[FACE][1][EDGE][3] = 4;
1488 :
1489 1 : m_id[FACE][2][EDGE][0] = 1;
1490 1 : m_id[FACE][2][EDGE][1] = 6;
1491 1 : m_id[FACE][2][EDGE][2] = 9;
1492 1 : m_id[FACE][2][EDGE][3] = 5;
1493 :
1494 1 : m_id[FACE][3][EDGE][0] = 2;
1495 1 : m_id[FACE][3][EDGE][1] = 7;
1496 1 : m_id[FACE][3][EDGE][2] = 10;
1497 1 : m_id[FACE][3][EDGE][3] = 6;
1498 :
1499 1 : m_id[FACE][4][EDGE][0] = 3;
1500 1 : m_id[FACE][4][EDGE][1] = 4;
1501 1 : m_id[FACE][4][EDGE][2] = 11;
1502 1 : m_id[FACE][4][EDGE][3] = 7;
1503 :
1504 1 : m_id[FACE][5][EDGE][0] = 8;
1505 1 : m_id[FACE][5][EDGE][1] = 9;
1506 1 : m_id[FACE][5][EDGE][2] = 10;
1507 1 : m_id[FACE][5][EDGE][3] = 11;
1508 :
1509 1 : m_id[EDGE][0][FACE][0] = 0;
1510 1 : m_id[EDGE][0][FACE][1] = 1;
1511 :
1512 1 : m_id[EDGE][1][FACE][0] = 0;
1513 1 : m_id[EDGE][1][FACE][1] = 2;
1514 :
1515 1 : m_id[EDGE][2][FACE][0] = 0;
1516 1 : m_id[EDGE][2][FACE][1] = 3;
1517 :
1518 1 : m_id[EDGE][3][FACE][0] = 0;
1519 1 : m_id[EDGE][3][FACE][1] = 4;
1520 :
1521 1 : m_id[EDGE][4][FACE][0] = 1;
1522 1 : m_id[EDGE][4][FACE][1] = 4;
1523 :
1524 1 : m_id[EDGE][5][FACE][0] = 2;
1525 1 : m_id[EDGE][5][FACE][1] = 1;
1526 :
1527 1 : m_id[EDGE][6][FACE][0] = 3;
1528 1 : m_id[EDGE][6][FACE][1] = 2;
1529 :
1530 1 : m_id[EDGE][7][FACE][0] = 4;
1531 1 : m_id[EDGE][7][FACE][1] = 3;
1532 :
1533 1 : m_id[EDGE][8][FACE][0] = 1;
1534 1 : m_id[EDGE][8][FACE][1] = 5;
1535 :
1536 1 : m_id[EDGE][9][FACE][0] = 2;
1537 1 : m_id[EDGE][9][FACE][1] = 5;
1538 :
1539 1 : m_id[EDGE][10][FACE][0] = 3;
1540 1 : m_id[EDGE][10][FACE][1] = 5;
1541 :
1542 1 : m_id[EDGE][11][FACE][0] = 4;
1543 1 : m_id[EDGE][11][FACE][1] = 5;
1544 :
1545 : // Points of Edges
1546 : // edge 0 = (0,1)
1547 1 : m_id[EDGE][0][POINT][0] = 0;
1548 1 : m_id[EDGE][0][POINT][1] = 1;
1549 : // edge 1 = (1,2)
1550 1 : m_id[EDGE][1][POINT][0] = 1;
1551 1 : m_id[EDGE][1][POINT][1] = 2;
1552 : // edge 2 = (2,3)
1553 1 : m_id[EDGE][2][POINT][0] = 2;
1554 1 : m_id[EDGE][2][POINT][1] = 3;
1555 : // edge 3 = (3,0)
1556 1 : m_id[EDGE][3][POINT][0] = 3;
1557 1 : m_id[EDGE][3][POINT][1] = 0;
1558 : // edge 4 = (0,4)
1559 1 : m_id[EDGE][4][POINT][0] = 0;
1560 1 : m_id[EDGE][4][POINT][1] = 4;
1561 : // edge 5 = (1,5)
1562 1 : m_id[EDGE][5][POINT][0] = 1;
1563 1 : m_id[EDGE][5][POINT][1] = 5;
1564 : // edge 6 = (2,6)
1565 1 : m_id[EDGE][6][POINT][0] = 2;
1566 1 : m_id[EDGE][6][POINT][1] = 6;
1567 : // edge 7 = (3,7)
1568 1 : m_id[EDGE][7][POINT][0] = 3;
1569 1 : m_id[EDGE][7][POINT][1] = 7;
1570 : // edge 8 = (4,5)
1571 1 : m_id[EDGE][8][POINT][0] = 4;
1572 1 : m_id[EDGE][8][POINT][1] = 5;
1573 : // edge 9 = (5,6)
1574 1 : m_id[EDGE][9][POINT][0] = 5;
1575 1 : m_id[EDGE][9][POINT][1] = 6;
1576 : // edge 10 = (6,7)
1577 1 : m_id[EDGE][10][POINT][0] = 6;
1578 1 : m_id[EDGE][10][POINT][1] = 7;
1579 : // edge 11 = (7,4)
1580 1 : m_id[EDGE][11][POINT][0] = 7;
1581 1 : m_id[EDGE][11][POINT][1] = 4;
1582 :
1583 : // Edges of Point
1584 1 : m_id[POINT][0][EDGE][0] = 3;
1585 1 : m_id[POINT][0][EDGE][1] = 0;
1586 1 : m_id[POINT][0][EDGE][2] = 4;
1587 :
1588 1 : m_id[POINT][1][EDGE][0] = 0;
1589 1 : m_id[POINT][1][EDGE][1] = 1;
1590 1 : m_id[POINT][1][EDGE][2] = 5;
1591 :
1592 1 : m_id[POINT][2][EDGE][0] = 1;
1593 1 : m_id[POINT][2][EDGE][1] = 2;
1594 1 : m_id[POINT][2][EDGE][2] = 6;
1595 :
1596 1 : m_id[POINT][3][EDGE][0] = 2;
1597 1 : m_id[POINT][3][EDGE][1] = 3;
1598 1 : m_id[POINT][3][EDGE][2] = 7;
1599 :
1600 1 : m_id[POINT][4][EDGE][0] = 4;
1601 1 : m_id[POINT][4][EDGE][1] = 8;
1602 1 : m_id[POINT][4][EDGE][2] = 11;
1603 :
1604 1 : m_id[POINT][5][EDGE][0] = 5;
1605 1 : m_id[POINT][5][EDGE][1] = 9;
1606 1 : m_id[POINT][5][EDGE][2] = 8;
1607 :
1608 1 : m_id[POINT][6][EDGE][0] = 6;
1609 1 : m_id[POINT][6][EDGE][1] = 10;
1610 1 : m_id[POINT][6][EDGE][2] = 9;
1611 :
1612 1 : m_id[POINT][7][EDGE][0] = 7;
1613 1 : m_id[POINT][7][EDGE][1] = 11;
1614 1 : m_id[POINT][7][EDGE][2] = 10;
1615 :
1616 : // Reference Corners
1617 : m_vCorner[0] = MathVector<dim>(0.0, 0.0, 0.0);
1618 : m_vCorner[1] = MathVector<dim>(1.0, 0.0, 0.0);
1619 : m_vCorner[2] = MathVector<dim>(1.0, 1.0, 0.0);
1620 : m_vCorner[3] = MathVector<dim>(0.0, 1.0, 0.0);
1621 : m_vCorner[4] = MathVector<dim>(0.0, 0.0, 1.0);
1622 : m_vCorner[5] = MathVector<dim>(1.0, 0.0, 1.0);
1623 : m_vCorner[6] = MathVector<dim>(1.0, 1.0, 1.0);
1624 : m_vCorner[7] = MathVector<dim>(0.0, 1.0, 1.0);
1625 :
1626 : m_vCoInt[0] = MathVector<dim,int>(0, 0, 0);
1627 : m_vCoInt[1] = MathVector<dim,int>(1, 0, 0);
1628 : m_vCoInt[2] = MathVector<dim,int>(1, 1, 0);
1629 : m_vCoInt[3] = MathVector<dim,int>(0, 1, 0);
1630 : m_vCoInt[4] = MathVector<dim,int>(0, 0, 1);
1631 : m_vCoInt[5] = MathVector<dim,int>(1, 0, 1);
1632 : m_vCoInt[6] = MathVector<dim,int>(1, 1, 1);
1633 : m_vCoInt[7] = MathVector<dim,int>(0, 1, 1);
1634 :
1635 : // Reference Element Types
1636 10 : for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
1637 : {
1638 9 : m_vNumRefElem[i] = 0;
1639 : }
1640 1 : m_vNumRefElem[ROID_VERTEX] = 8;
1641 1 : m_vNumRefElem[ROID_EDGE] = 12;
1642 1 : m_vNumRefElem[ROID_QUADRILATERAL] = 6;
1643 1 : m_vNumRefElem[ROID_HEXAHEDRON] = 1;
1644 1 : }
1645 :
1646 : ///////////////////////////////////////////////////////////////////////////////
1647 : // ReferenceOctahedron
1648 : ///////////////////////////////////////////////////////////////////////////////
1649 :
1650 0 : ReferenceOctahedron::ReferenceOctahedron()
1651 : {
1652 : // dimension
1653 0 : m_dim = 3;
1654 :
1655 : // size
1656 0 : m_size = 2.0/3.0;
1657 :
1658 : //number of Geometric Objects
1659 0 : m_vNum[POINT] = 6;
1660 0 : m_vNum[EDGE] = 12;
1661 0 : m_vNum[FACE] = 8;
1662 0 : m_vNum[VOLUME] = 1;
1663 :
1664 : // number of Geometric Objects
1665 0 : m_vSubNum[VOLUME][0][POINT] = 6;
1666 0 : m_vSubNum[VOLUME][0][EDGE] = 12;
1667 0 : m_vSubNum[VOLUME][0][FACE] = 8;
1668 0 : m_vSubNum[VOLUME][0][VOLUME] = 1;
1669 0 : m_vRefElemType[VOLUME][0] = ROID_OCTAHEDRON;
1670 :
1671 0 : for(size_t i = 0; i < m_vNum[FACE]; ++i)
1672 : {
1673 0 : m_vSubNum[FACE][i][POINT] = 3;
1674 0 : m_vSubNum[FACE][i][EDGE] = 3;
1675 0 : m_vSubNum[FACE][i][FACE] = 1;
1676 0 : m_vSubNum[FACE][i][VOLUME] = 1;
1677 :
1678 0 : m_vRefElemType[FACE][i] = ROID_TRIANGLE;
1679 : }
1680 :
1681 0 : for(size_t i = 0; i < m_vNum[EDGE]; ++i)
1682 : {
1683 0 : m_vSubNum[EDGE][i][POINT] = 2;
1684 0 : m_vSubNum[EDGE][i][EDGE] = 1;
1685 0 : m_vSubNum[EDGE][i][FACE] = 2;
1686 0 : m_vSubNum[EDGE][i][VOLUME] = 1;
1687 :
1688 0 : m_vRefElemType[EDGE][i] = ROID_EDGE;
1689 : }
1690 :
1691 0 : for(size_t i = 0; i < m_vNum[POINT]; ++i)
1692 : {
1693 0 : m_vSubNum[POINT][i][POINT] = 1;
1694 0 : m_vSubNum[POINT][i][EDGE] = 4;
1695 0 : m_vSubNum[POINT][i][FACE] = 4;
1696 0 : m_vSubNum[POINT][i][VOLUME] = 1;
1697 :
1698 0 : m_vRefElemType[POINT][i] = ROID_VERTEX;
1699 : }
1700 :
1701 : //reset m_id to -1
1702 0 : for(int i=0; i<=dim; ++i)
1703 0 : for(size_t j=0; j<MAXOBJECTS; ++j)
1704 0 : for(int k=0; k<=dim; ++k)
1705 0 : for(size_t l=0; l<MAXOBJECTS; l++)
1706 : {
1707 0 : m_id[i][j][k][l] = -1;
1708 : }
1709 :
1710 : //self references: (i.e. Point <-> Point, Edge <-> Edge, etc.)
1711 0 : for(int i=0; i<=dim; ++i)
1712 0 : for(size_t j=0; j<m_vNum[i]; ++j)
1713 : {
1714 0 : m_id[i][j][i][0] = j;
1715 : }
1716 :
1717 : // Face <-> Volume
1718 0 : for(size_t i=0; i<m_vNum[FACE]; ++i)
1719 : {
1720 0 : m_id[VOLUME][0][FACE][i] = i;
1721 0 : m_id[FACE][i][VOLUME][0] = 0;
1722 : }
1723 :
1724 : // Edge <-> Volume
1725 0 : for(size_t i=0; i<m_vNum[EDGE]; ++i)
1726 : {
1727 0 : m_id[VOLUME][0][EDGE][i] = i;
1728 0 : m_id[EDGE][i][VOLUME][0] = 0;
1729 : }
1730 :
1731 : // Point <-> Volume
1732 0 : for(size_t i=0; i<m_vNum[POINT]; ++i)
1733 : {
1734 0 : m_id[VOLUME][0][POINT][i] = i;
1735 0 : m_id[POINT][i][VOLUME][0] = 0;
1736 : }
1737 :
1738 : // Face -> Points (ccw)
1739 0 : m_id[FACE][0][POINT][0] = 0;
1740 0 : m_id[FACE][0][POINT][1] = 2;
1741 0 : m_id[FACE][0][POINT][2] = 1;
1742 :
1743 0 : m_id[FACE][1][POINT][0] = 0;
1744 0 : m_id[FACE][1][POINT][1] = 3;
1745 0 : m_id[FACE][1][POINT][2] = 2;
1746 :
1747 0 : m_id[FACE][2][POINT][0] = 0;
1748 0 : m_id[FACE][2][POINT][1] = 4;
1749 0 : m_id[FACE][2][POINT][2] = 3;
1750 :
1751 0 : m_id[FACE][3][POINT][0] = 0;
1752 0 : m_id[FACE][3][POINT][1] = 1;
1753 0 : m_id[FACE][3][POINT][2] = 4;
1754 :
1755 0 : m_id[FACE][4][POINT][0] = 1;
1756 0 : m_id[FACE][4][POINT][1] = 2;
1757 0 : m_id[FACE][4][POINT][2] = 5;
1758 :
1759 0 : m_id[FACE][5][POINT][0] = 2;
1760 0 : m_id[FACE][5][POINT][1] = 3;
1761 0 : m_id[FACE][5][POINT][2] = 5;
1762 :
1763 0 : m_id[FACE][6][POINT][0] = 3;
1764 0 : m_id[FACE][6][POINT][1] = 4;
1765 0 : m_id[FACE][6][POINT][2] = 5;
1766 :
1767 0 : m_id[FACE][7][POINT][0] = 4;
1768 0 : m_id[FACE][7][POINT][1] = 1;
1769 0 : m_id[FACE][7][POINT][2] = 5;
1770 :
1771 : // Points -> Faces (cw)
1772 0 : m_id[POINT][0][FACE][0] = 0;
1773 0 : m_id[POINT][0][FACE][1] = 1;
1774 0 : m_id[POINT][0][FACE][2] = 2;
1775 0 : m_id[POINT][0][FACE][3] = 3;
1776 :
1777 0 : m_id[POINT][1][FACE][0] = 0;
1778 0 : m_id[POINT][1][FACE][1] = 3;
1779 0 : m_id[POINT][1][FACE][2] = 7;
1780 0 : m_id[POINT][1][FACE][3] = 4;
1781 :
1782 0 : m_id[POINT][2][FACE][0] = 0;
1783 0 : m_id[POINT][2][FACE][1] = 4;
1784 0 : m_id[POINT][2][FACE][2] = 5;
1785 0 : m_id[POINT][2][FACE][3] = 1;
1786 :
1787 0 : m_id[POINT][3][FACE][0] = 1;
1788 0 : m_id[POINT][3][FACE][1] = 5;
1789 0 : m_id[POINT][3][FACE][2] = 6;
1790 0 : m_id[POINT][3][FACE][3] = 2;
1791 :
1792 0 : m_id[POINT][4][FACE][0] = 2;
1793 0 : m_id[POINT][4][FACE][1] = 6;
1794 0 : m_id[POINT][4][FACE][2] = 7;
1795 0 : m_id[POINT][4][FACE][3] = 3;
1796 :
1797 0 : m_id[POINT][5][FACE][0] = 4;
1798 0 : m_id[POINT][5][FACE][1] = 7;
1799 0 : m_id[POINT][5][FACE][2] = 6;
1800 0 : m_id[POINT][5][FACE][3] = 5;
1801 :
1802 : // Edges <-> Faces (ccw)
1803 0 : m_id[FACE][0][EDGE][0] = 1;
1804 0 : m_id[FACE][0][EDGE][1] = 4;
1805 0 : m_id[FACE][0][EDGE][2] = 0;
1806 :
1807 0 : m_id[FACE][1][EDGE][0] = 2;
1808 0 : m_id[FACE][1][EDGE][1] = 5;
1809 0 : m_id[FACE][1][EDGE][2] = 1;
1810 :
1811 0 : m_id[FACE][2][EDGE][0] = 3;
1812 0 : m_id[FACE][2][EDGE][1] = 6;
1813 0 : m_id[FACE][2][EDGE][2] = 2;
1814 :
1815 0 : m_id[FACE][3][EDGE][0] = 0;
1816 0 : m_id[FACE][3][EDGE][1] = 7;
1817 0 : m_id[FACE][3][EDGE][2] = 3;
1818 :
1819 0 : m_id[FACE][4][EDGE][0] = 4;
1820 0 : m_id[FACE][4][EDGE][1] = 9;
1821 0 : m_id[FACE][4][EDGE][2] = 8;
1822 :
1823 0 : m_id[FACE][5][EDGE][0] = 5;
1824 0 : m_id[FACE][5][EDGE][1] = 10;
1825 0 : m_id[FACE][5][EDGE][2] = 9;
1826 :
1827 0 : m_id[FACE][6][EDGE][0] = 6;
1828 0 : m_id[FACE][6][EDGE][1] = 11;
1829 0 : m_id[FACE][6][EDGE][2] = 10;
1830 :
1831 0 : m_id[FACE][7][EDGE][0] = 7;
1832 0 : m_id[FACE][7][EDGE][1] = 8;
1833 0 : m_id[FACE][7][EDGE][2] = 11;
1834 :
1835 0 : m_id[EDGE][0][FACE][0] = 0;
1836 0 : m_id[EDGE][0][FACE][1] = 3;
1837 :
1838 0 : m_id[EDGE][1][FACE][0] = 1;
1839 0 : m_id[EDGE][1][FACE][1] = 0;
1840 :
1841 0 : m_id[EDGE][2][FACE][0] = 2;
1842 0 : m_id[EDGE][2][FACE][1] = 1;
1843 :
1844 0 : m_id[EDGE][3][FACE][0] = 3;
1845 0 : m_id[EDGE][3][FACE][1] = 2;
1846 :
1847 0 : m_id[EDGE][4][FACE][0] = 0;
1848 0 : m_id[EDGE][4][FACE][1] = 4;
1849 :
1850 0 : m_id[EDGE][5][FACE][0] = 1;
1851 0 : m_id[EDGE][5][FACE][1] = 5;
1852 :
1853 0 : m_id[EDGE][6][FACE][0] = 2;
1854 0 : m_id[EDGE][6][FACE][1] = 6;
1855 :
1856 0 : m_id[EDGE][7][FACE][0] = 3;
1857 0 : m_id[EDGE][7][FACE][1] = 7;
1858 :
1859 0 : m_id[EDGE][8][FACE][0] = 4;
1860 0 : m_id[EDGE][8][FACE][1] = 7;
1861 :
1862 0 : m_id[EDGE][9][FACE][0] = 5;
1863 0 : m_id[EDGE][9][FACE][1] = 4;
1864 :
1865 0 : m_id[EDGE][10][FACE][0] = 6;
1866 0 : m_id[EDGE][10][FACE][1] = 5;
1867 :
1868 0 : m_id[EDGE][11][FACE][0] = 7;
1869 0 : m_id[EDGE][11][FACE][1] = 6;
1870 :
1871 : // Points of Edges
1872 : // edge 0 = (0,1)
1873 0 : m_id[EDGE][0][POINT][0] = 0;
1874 0 : m_id[EDGE][0][POINT][1] = 1;
1875 : // edge 1 = (0,2)
1876 0 : m_id[EDGE][1][POINT][0] = 0;
1877 0 : m_id[EDGE][1][POINT][1] = 2;
1878 : // edge 2 = (0,3)
1879 0 : m_id[EDGE][2][POINT][0] = 0;
1880 0 : m_id[EDGE][2][POINT][1] = 3;
1881 : // edge 3 = (0,4)
1882 0 : m_id[EDGE][3][POINT][0] = 0;
1883 0 : m_id[EDGE][3][POINT][1] = 4;
1884 : // edge 4 = (1,2)
1885 0 : m_id[EDGE][4][POINT][0] = 1;
1886 0 : m_id[EDGE][4][POINT][1] = 2;
1887 : // edge 5 = (2,3)
1888 0 : m_id[EDGE][5][POINT][0] = 2;
1889 0 : m_id[EDGE][5][POINT][1] = 3;
1890 : // edge 6 = (3,4)
1891 0 : m_id[EDGE][6][POINT][0] = 3;
1892 0 : m_id[EDGE][6][POINT][1] = 4;
1893 : // edge 7 = (4,1)
1894 0 : m_id[EDGE][7][POINT][0] = 4;
1895 0 : m_id[EDGE][7][POINT][1] = 1;
1896 : // edge 8 = (1,5)
1897 0 : m_id[EDGE][8][POINT][0] = 1;
1898 0 : m_id[EDGE][8][POINT][1] = 5;
1899 : // edge 9 = (2,5)
1900 0 : m_id[EDGE][9][POINT][0] = 2;
1901 0 : m_id[EDGE][9][POINT][1] = 5;
1902 : // edge 10 = (3,5)
1903 0 : m_id[EDGE][10][POINT][0] = 3;
1904 0 : m_id[EDGE][10][POINT][1] = 5;
1905 : // edge 11 = (4,5)
1906 0 : m_id[EDGE][11][POINT][0] = 4;
1907 0 : m_id[EDGE][11][POINT][1] = 5;
1908 :
1909 : // Edges of Point (ccw)
1910 0 : m_id[POINT][0][EDGE][0] = 0;
1911 0 : m_id[POINT][0][EDGE][1] = 3;
1912 0 : m_id[POINT][0][EDGE][2] = 2;
1913 0 : m_id[POINT][0][EDGE][3] = 1;
1914 :
1915 0 : m_id[POINT][1][EDGE][0] = 0;
1916 0 : m_id[POINT][1][EDGE][1] = 4;
1917 0 : m_id[POINT][1][EDGE][2] = 8;
1918 0 : m_id[POINT][1][EDGE][3] = 7;
1919 :
1920 0 : m_id[POINT][2][EDGE][0] = 1;
1921 0 : m_id[POINT][2][EDGE][1] = 5;
1922 0 : m_id[POINT][2][EDGE][2] = 9;
1923 0 : m_id[POINT][2][EDGE][3] = 4;
1924 :
1925 0 : m_id[POINT][3][EDGE][0] = 2;
1926 0 : m_id[POINT][3][EDGE][1] = 6;
1927 0 : m_id[POINT][3][EDGE][2] = 10;
1928 0 : m_id[POINT][3][EDGE][3] = 5;
1929 :
1930 0 : m_id[POINT][4][EDGE][0] = 3;
1931 0 : m_id[POINT][4][EDGE][1] = 7;
1932 0 : m_id[POINT][4][EDGE][2] = 11;
1933 0 : m_id[POINT][4][EDGE][3] = 6;
1934 :
1935 0 : m_id[POINT][5][EDGE][0] = 8;
1936 0 : m_id[POINT][5][EDGE][1] = 9;
1937 0 : m_id[POINT][5][EDGE][2] = 10;
1938 0 : m_id[POINT][5][EDGE][3] = 11;
1939 :
1940 : // Reference Corners
1941 : m_vCorner[0] = MathVector<dim>(0.0, 0.0,-1.0);
1942 : m_vCorner[1] = MathVector<dim>(0.0, 0.0, 0.0);
1943 : m_vCorner[2] = MathVector<dim>(1.0, 0.0, 0.0);
1944 : m_vCorner[3] = MathVector<dim>(1.0, 1.0, 0.0);
1945 : m_vCorner[4] = MathVector<dim>(0.0, 1.0, 0.0);
1946 : m_vCorner[5] = MathVector<dim>(0.0, 0.0, 1.0);
1947 :
1948 : m_vCoInt[0] = MathVector<dim,int>(0, 0,-1);
1949 : m_vCoInt[1] = MathVector<dim,int>(0, 0, 0);
1950 : m_vCoInt[2] = MathVector<dim,int>(1, 0, 0);
1951 : m_vCoInt[3] = MathVector<dim,int>(1, 1, 0);
1952 : m_vCoInt[4] = MathVector<dim,int>(0, 1, 0);
1953 : m_vCoInt[5] = MathVector<dim,int>(0, 0, 1);
1954 :
1955 : // Reference Element Types
1956 0 : for(int i = 0; i < NUM_REFERENCE_OBJECTS; ++i)
1957 : {
1958 0 : m_vNumRefElem[i] = 0;
1959 : }
1960 0 : m_vNumRefElem[ROID_VERTEX] = 6;
1961 0 : m_vNumRefElem[ROID_EDGE] = 12;
1962 0 : m_vNumRefElem[ROID_TRIANGLE] = 8;
1963 0 : m_vNumRefElem[ROID_OCTAHEDRON] = 1;
1964 0 : }
1965 :
1966 :
1967 : }; // end namespace ug
1968 :
|