Intrepid
Intrepid_HGRAD_HEX_I2_FEMDef.hpp
Go to the documentation of this file.
1#ifndef INTREPID_HGRAD_HEX_I2_FEMDEF_HPP
2#define INTREPID_HGRAD_HEX_I2_FEMDEF_HPP
3// @HEADER
4// ************************************************************************
5//
6// Intrepid Package
7// Copyright (2007) Sandia Corporation
8//
9// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
10// license for use of this work by or on behalf of the U.S. Government.
11//
12// Redistribution and use in source and binary forms, with or without
13// modification, are permitted provided that the following conditions are
14// met:
15//
16// 1. Redistributions of source code must retain the above copyright
17// notice, this list of conditions and the following disclaimer.
18//
19// 2. Redistributions in binary form must reproduce the above copyright
20// notice, this list of conditions and the following disclaimer in the
21// documentation and/or other materials provided with the distribution.
22//
23// 3. Neither the name of the Corporation nor the names of the
24// contributors may be used to endorse or promote products derived from
25// this software without specific prior written permission.
26//
27// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
28// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
31// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
32// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
33// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
34// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
35// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
36// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
37// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38//
39// Questions? Contact Pavel Bochev (pbboche@sandia.gov)
40// Denis Ridzal (dridzal@sandia.gov), or
41// Kara Peterson (kjpeter@sandia.gov)
42//
43// ************************************************************************
44// @HEADER
45
51namespace Intrepid {
52
53
54template<class Scalar, class ArrayScalar>
56 {
57 this -> basisCardinality_ = 20;
58 this -> basisDegree_ = 2;
59 this -> basisCellTopology_ = shards::CellTopology(shards::getCellTopologyData<shards::Hexahedron<8> >() );
60 this -> basisType_ = BASIS_FEM_DEFAULT;
61 this -> basisCoordinates_ = COORDINATES_CARTESIAN;
62 this -> basisTagsAreSet_ = false;
63 }
64
65
66
67template<class Scalar, class ArrayScalar>
69
70 // Basis-dependent intializations
71 int tagSize = 4; // size of DoF tag, i.e., number of fields in the tag
72 int posScDim = 0; // position in the tag, counting from 0, of the subcell dim
73 int posScOrd = 1; // position in the tag, counting from 0, of the subcell ordinal
74 int posDfOrd = 2; // position in the tag, counting from 0, of DoF ordinal relative to the subcell
75
76 // An array with local DoF tags assigned to basis functions, in the order of their local enumeration
77 int tags[] = { 0, 0, 0, 1, // Nodes 0 to 7 follow vertex order of the topology
78 0, 1, 0, 1,
79 0, 2, 0, 1,
80 0, 3, 0, 1,
81 0, 4, 0, 1,
82 0, 5, 0, 1,
83 0, 6, 0, 1,
84 0, 7, 0, 1,
85 1, 0, 0, 1, // Node 8 -> edge 0
86 1, 1, 0, 1, // Node 9 -> edge 1
87 1, 2, 0, 1, // Node 10 -> edge 2
88 1, 3, 0, 1, // Node 11 -> edge 3
89 1, 8, 0, 1, // Node 12 -> edge 8
90 1, 9, 0, 1, // Node 13 -> edge 9
91 1,10, 0, 1, // Node 14 -> edge 10
92 1,11, 0, 1, // Node 15 -> edge 11
93 1, 4, 0, 1, // Node 16 -> edge 4
94 1, 5, 0, 1, // Node 17 -> edge 5
95 1, 6, 0, 1, // Node 18 -> edge 6
96 1, 7, 0, 1, // Node 19 -> edge 7
97 };
98
99 // Basis-independent function sets tag and enum data in tagToOrdinal_ and ordinalToTag_ arrays:
100 Intrepid::setOrdinalTagData(this -> tagToOrdinal_,
101 this -> ordinalToTag_,
102 tags,
103 this -> basisCardinality_,
104 tagSize,
105 posScDim,
106 posScOrd,
107 posDfOrd);
108}
109
110
111
112template<class Scalar, class ArrayScalar>
114 const ArrayScalar & inputPoints,
115 const EOperator operatorType) const {
116
117 // Verify arguments
118#ifdef HAVE_INTREPID_DEBUG
119 Intrepid::getValues_HGRAD_Args<Scalar, ArrayScalar>(outputValues,
120 inputPoints,
121 operatorType,
122 this -> getBaseCellTopology(),
123 this -> getCardinality() );
124#endif
125
126 // Number of evaluation points = dim 0 of inputPoints
127 int dim0 = inputPoints.dimension(0);
128
129 // Temporaries: (x,y,z) coordinates of the evaluation point
130 Scalar x = 0.0;
131 Scalar y = 0.0;
132 Scalar z = 0.0;
133
134 switch (operatorType) {
135
136 case OPERATOR_VALUE:
137 for (int i0 = 0; i0 < dim0; i0++) {
138 x = inputPoints(i0, 0);
139 y = inputPoints(i0, 1);
140 z = inputPoints(i0, 2);
141
142 // outputValues is a rank-2 array with dimensions (basisCardinality_, dim0)
143 outputValues( 0, i0) = 0.125*(1.0 - x)*(1.0 - y)*(1.0 - z)*(-x - y - z - 2.0);
144 outputValues( 1, i0) = 0.125*(1.0 + x)*(1.0 - y)*(1.0 - z)*( x - y - z - 2.0);
145 outputValues( 2, i0) = 0.125*(1.0 + x)*(1.0 + y)*(1.0 - z)*( x + y - z - 2.0);
146 outputValues( 3, i0) = 0.125*(1.0 - x)*(1.0 + y)*(1.0 - z)*(-x + y - z - 2.0);
147 outputValues( 4, i0) = 0.125*(1.0 - x)*(1.0 - y)*(1.0 + z)*(-x - y + z - 2.0);
148 outputValues( 5, i0) = 0.125*(1.0 + x)*(1.0 - y)*(1.0 + z)*( x - y + z - 2.0);
149 outputValues( 6, i0) = 0.125*(1.0 + x)*(1.0 + y)*(1.0 + z)*( x + y + z - 2.0);
150 outputValues( 7, i0) = 0.125*(1.0 - x)*(1.0 + y)*(1.0 + z)*(-x + y + z - 2.0);
151
152 outputValues( 8, i0) = 0.25*(1.0 - x*x)*(1.0 - y)*(1.0 - z);
153 outputValues( 9, i0) = 0.25*(1.0 + x)*(1.0 - y*y)*(1.0 - z);
154 outputValues(10, i0) = 0.25*(1.0 - x*x)*(1.0 + y)*(1.0 - z);
155 outputValues(11, i0) = 0.25*(1.0 - x)*(1.0 - y*y)*(1.0 - z);
156
157 outputValues(12, i0) = 0.25*(1.0 - x)*(1.0 - y)*(1.0 - z*z);
158 outputValues(13, i0) = 0.25*(1.0 + x)*(1.0 - y)*(1.0 - z*z);
159 outputValues(14, i0) = 0.25*(1.0 + x)*(1.0 + y)*(1.0 - z*z);
160 outputValues(15, i0) = 0.25*(1.0 - x)*(1.0 + y)*(1.0 - z*z);
161
162 outputValues(16, i0) = 0.25*(1.0 - x*x)*(1.0 - y)*(1.0 + z);
163 outputValues(17, i0) = 0.25*(1.0 + x)*(1.0 - y*y)*(1.0 + z);
164 outputValues(18, i0) = 0.25*(1.0 - x*x)*(1.0 + y)*(1.0 + z);
165 outputValues(19, i0) = 0.25*(1.0 - x)*(1.0 - y*y)*(1.0 + z);
166 }
167 break;
168
169 case OPERATOR_GRAD:
170 case OPERATOR_D1:
171 for (int i0 = 0; i0 < dim0; i0++) {
172 x = inputPoints(i0,0);
173 y = inputPoints(i0,1);
174 z = inputPoints(i0,2);
175
176 // outputValues is a rank-3 array with dimensions (basisCardinality_, dim0, spaceDim)
177 outputValues(0, i0, 0) = -0.125*(1.0-y)*(1.0-z)*(-x-y-z-2.0) - 0.125*(1.0-x)*(1.0-y)*(1.0-z);
178 outputValues(0, i0, 1) = -0.125*(1.0-x)*(1.0-z)*(-x-y-z-2.0) - 0.125*(1.0-x)*(1.0-y)*(1.0-z);
179 outputValues(0, i0, 2) = -0.125*(1.0-x)*(1.0-y)*(-x-y-z-2.0) - 0.125*(1.0-x)*(1.0-y)*(1.0-z);
180
181 outputValues(1, i0, 0) = 0.125*(1.0-y)*(1.0-z)*( x-y-z-2.0) + 0.125*(1.0+x)*(1.0-y)*(1.0-z);
182 outputValues(1, i0, 1) = -0.125*(1.0+x)*(1.0-z)*( x-y-z-2.0) - 0.125*(1.0+x)*(1.0-y)*(1.0-z);
183 outputValues(1, i0, 2) = -0.125*(1.0+x)*(1.0-y)*( x-y-z-2.0) - 0.125*(1.0+x)*(1.0-y)*(1.0-z);
184
185 outputValues(2, i0, 0) = 0.125*(1.0+y)*(1.0-z)*( x+y-z-2.0) + 0.125*(1.0+x)*(1.0+y)*(1.0-z);
186 outputValues(2, i0, 1) = 0.125*(1.0+x)*(1.0-z)*( x+y-z-2.0) + 0.125*(1.0+x)*(1.0+y)*(1.0-z);
187 outputValues(2, i0, 2) = -0.125*(1.0+x)*(1.0+y)*( x+y-z-2.0) - 0.125*(1.0+x)*(1.0+y)*(1.0-z);
188
189 outputValues(3, i0, 0) = -0.125*(1.0+y)*(1.0-z)*(-x+y-z-2.0) - 0.125*(1.0-x)*(1.0+y)*(1.0-z);
190 outputValues(3, i0, 1) = 0.125*(1.0-x)*(1.0-z)*(-x+y-z-2.0) + 0.125*(1.0-x)*(1.0+y)*(1.0-z);
191 outputValues(3, i0, 2) = -0.125*(1.0-x)*(1.0+y)*(-x+y-z-2.0) - 0.125*(1.0-x)*(1.0+y)*(1.0-z);
192
193 outputValues(4, i0, 0) = -0.125*(1.0-y)*(1.0+z)*(-x-y+z-2.0) - 0.125*(1.0-x)*(1.0-y)*(1.0+z);
194 outputValues(4, i0, 1) = -0.125*(1.0-x)*(1.0+z)*(-x-y+z-2.0) - 0.125*(1.0-x)*(1.0-y)*(1.0+z);
195 outputValues(4, i0, 2) = 0.125*(1.0-x)*(1.0-y)*(-x-y+z-2.0) + 0.125*(1.0-x)*(1.0-y)*(1.0+z);
196
197 outputValues(5, i0, 0) = 0.125*(1.0-y)*(1.0+z)*( x-y+z-2.0) + 0.125*(1.0+x)*(1.0-y)*(1.0+z);
198 outputValues(5, i0, 1) = -0.125*(1.0+x)*(1.0+z)*( x-y+z-2.0) - 0.125*(1.0+x)*(1.0-y)*(1.0+z);
199 outputValues(5, i0, 2) = 0.125*(1.0+x)*(1.0-y)*( x-y+z-2.0) + 0.125*(1.0+x)*(1.0-y)*(1.0+z);
200
201 outputValues(6, i0, 0) = 0.125*(1.0+y)*(1.0+z)*( x+y+z-2.0) + 0.125*(1.0+x)*(1.0+y)*(1.0+z);
202 outputValues(6, i0, 1) = 0.125*(1.0+x)*(1.0+z)*( x+y+z-2.0) + 0.125*(1.0+x)*(1.0+y)*(1.0+z);
203 outputValues(6, i0, 2) = 0.125*(1.0+x)*(1.0+y)*( x+y+z-2.0) + 0.125*(1.0+x)*(1.0+y)*(1.0+z);
204
205 outputValues(7, i0, 0) = -0.125*(1.0+y)*(1.0+z)*(-x+y+z-2.0) - 0.125*(1.0-x)*(1.0+y)*(1.0+z);
206 outputValues(7, i0, 1) = 0.125*(1.0-x)*(1.0+z)*(-x+y+z-2.0) + 0.125*(1.0-x)*(1.0+y)*(1.0+z);
207 outputValues(7, i0, 2) = 0.125*(1.0-x)*(1.0+y)*(-x+y+z-2.0) + 0.125*(1.0-x)*(1.0+y)*(1.0+z);
208
209 outputValues(8, i0, 0) = -0.5*x*(1.0-y)*(1.0-z);
210 outputValues(8, i0, 1) = -0.25*(1.0-x*x)*(1.0-z);
211 outputValues(8, i0, 2) = -0.25*(1.0-x*x)*(1.0-y);
212
213 outputValues(9, i0, 0) = 0.25*(1.0-y*y)*(1.0-z);
214 outputValues(9, i0, 1) = -0.5*y*(1.0+x)*(1.0-z);
215 outputValues(9, i0, 2) = -0.25*(1.0+x)*(1.0-y*y);
216
217 outputValues(10, i0, 0) = -0.5*x*(1.0+y)*(1.0-z);
218 outputValues(10, i0, 1) = 0.25*(1.0-x*x)*(1.0-z);
219 outputValues(10, i0, 2) = -0.25*(1.0-x*x)*(1.0+y);
220
221 outputValues(11, i0, 0) = -0.25*(1.0-y*y)*(1.0-z);
222 outputValues(11, i0, 1) = -0.5*y*(1.0-x)*(1.0-z);
223 outputValues(11, i0, 2) = -0.25*(1.0-x)*(1.0-y*y);
224
225 outputValues(12, i0, 0) = -0.25*(1.0-y)*(1.0-z*z);
226 outputValues(12, i0, 1) = -0.25*(1.0-x)*(1.0-z*z);
227 outputValues(12, i0, 2) = -0.5*z*(1.0-x)*(1.0-y);
228
229 outputValues(13, i0, 0) = 0.25*(1.0-y)*(1.0-z*z);
230 outputValues(13, i0, 1) = -0.25*(1.0+x)*(1.0-z*z);
231 outputValues(13, i0, 2) = -0.5*z*(1.0+x)*(1.0-y);
232
233 outputValues(14, i0, 0) = 0.25*(1.0+y)*(1.0-z*z);
234 outputValues(14, i0, 1) = 0.25*(1.0+x)*(1.0-z*z);
235 outputValues(14, i0, 2) = -0.5*z*(1.0+x)*(1.0+y);
236
237 outputValues(15, i0, 0) = -0.25*(1.0+y)*(1.0-z*z);
238 outputValues(15, i0, 1) = 0.25*(1.0-x)*(1.0-z*z);
239 outputValues(15, i0, 2) = -0.5*z*(1.0-x)*(1.0+y);
240
241 outputValues(16, i0, 0) = -0.5*x*(1.0-y)*(1.0+z);
242 outputValues(16, i0, 1) = -0.25*(1.0-x*x)*(1.0+z);
243 outputValues(16, i0, 2) = 0.25*(1.0-x*x)*(1.0-y);
244
245 outputValues(17, i0, 0) = 0.25*(1.0-y*y)*(1.0+z);
246 outputValues(17, i0, 1) = -0.5*y*(1.0+x)*(1.0+z);
247 outputValues(17, i0, 2) = 0.25*(1.0+x)*(1.0-y*y);
248
249 outputValues(18, i0, 0) = -0.5*x*(1.0+y)*(1.0+z);
250 outputValues(18, i0, 1) = 0.25*(1.0-x*x)*(1.0+z);
251 outputValues(18, i0, 2) = 0.25*(1.0-x*x)*(1.0+y);
252
253 outputValues(19, i0, 0) = -0.25*(1.0-y*y)*(1.0+z);
254 outputValues(19, i0, 1) = -0.5*y*(1.0-x)*(1.0+z);
255 outputValues(19, i0, 2) = 0.25*(1.0-x)*(1.0-y*y);
256
257 }
258 break;
259
260 case OPERATOR_CURL:
261 TEUCHOS_TEST_FOR_EXCEPTION( (operatorType == OPERATOR_CURL), std::invalid_argument,
262 ">>> ERROR (Basis_HGRAD_HEX_I2_FEM): CURL is invalid operator for rank-0 (scalar) functions in 3D");
263 break;
264
265 case OPERATOR_DIV:
266 TEUCHOS_TEST_FOR_EXCEPTION( (operatorType == OPERATOR_DIV), std::invalid_argument,
267 ">>> ERROR (Basis_HGRAD_HEX_I2_FEM): DIV is invalid operator for rank-0 (scalar) functions in 3D");
268 break;
269
270 case OPERATOR_D2:
271 for (int i0 = 0; i0 < dim0; i0++) {
272 x = inputPoints(i0,0);
273 y = inputPoints(i0,1);
274 z = inputPoints(i0,2);
275
276 // outputValues is a rank-3 array with dimensions (basisCardinality_, dim0, D2Cardinality = 6)
277 outputValues(0, i0, 0) = 0.25*(1.0 - y)*(1.0 - z);
278 outputValues(0, i0, 1) = 0.125*(1.0 - z)*(-2.0*x - 2.0*y - z);
279 outputValues(0, i0, 2) = 0.125*(1.0 - y)*(-2.0*x - y - 2.0*z);
280 outputValues(0, i0, 3) = 0.25*(1.0 - x)*(1.0 - z);
281 outputValues(0, i0, 4) = 0.125*(1.0 - x)*(-x - 2.0*y - 2.0*z);
282 outputValues(0, i0, 5) = 0.25*(1.0 - x)*(1.0 - y);
283
284 outputValues(1, i0, 0) = 0.25*(1.0 - y)*(1.0 - z);
285 outputValues(1, i0, 1) = -0.125*(1.0 - z)*(2.0*x - 2.0*y - z);
286 outputValues(1, i0, 2) = -0.125*(1.0 - y)*(2.0*x - y - 2.0*z);
287 outputValues(1, i0, 3) = 0.25*(1.0 + x)*(1.0 - z);
288 outputValues(1, i0, 4) = 0.125*(1.0 + x)*(x - 2.0*y - 2.0*z);
289 outputValues(1, i0, 5) = 0.25*(1.0 + x)*(1.0 - y);
290
291 outputValues(2, i0, 0) = 0.25*(1.0 + y)*(1.0 - z);
292 outputValues(2, i0, 1) = 0.125*(1.0 - z)*(2.0*x + 2.0*y - z);
293 outputValues(2, i0, 2) = -0.125*(1.0 + y)*(2.0*x + y - 2.0*z);
294 outputValues(2, i0, 3) = 0.25*(1.0 + x)*(1.0 - z);
295 outputValues(2, i0, 4) = -0.125*(1.0 + x)*(x + 2.0*y - 2.0*z);
296 outputValues(2, i0, 5) = 0.25*(1.0 + x)*(1.0 + y);
297
298 outputValues(3, i0, 0) = 0.25*(1.0 + y)*(1.0 - z);
299 outputValues(3, i0, 1) = -0.125*(1.0 - z)*(-2.0*x + 2.0*y - z);
300 outputValues(3, i0, 2) = 0.125*(1.0 + y)*(-2.0*x + y - 2.0*z);
301 outputValues(3, i0, 3) = 0.25*(1.0 - x)*(1.0 - z);
302 outputValues(3, i0, 4) = -0.125*(1.0 - x)*(-x + 2.0*y - 2.0*z);
303 outputValues(3, i0, 5) = 0.25*(1.0 - x)*(1.0 + y);
304
305 outputValues(4, i0, 0) = 0.25*(1.0 - y)*(1.0 + z);
306 outputValues(4, i0, 1) = 0.125*(1.0 + z)*(-2.0*x - 2.0*y + z);
307 outputValues(4, i0, 2) = -0.125*(1.0 - y)*(-2.0*x - y + 2.0*z);
308 outputValues(4, i0, 3) = 0.25*(1.0 - x)*(1.0 + z);
309 outputValues(4, i0, 4) = -0.125*(1.0 - x)*(-x - 2.0*y + 2.0*z);
310 outputValues(4, i0, 5) = 0.25*(1.0 - x)*(1.0 - y);
311
312 outputValues(5, i0, 0) = 0.25*(1.0 - y)*(1.0 + z);
313 outputValues(5, i0, 1) = -0.125*(1.0 + z)*(2.0*x - 2.0*y + z);
314 outputValues(5, i0, 2) = 0.125*(1.0 - y)*(2.0*x - y + 2.0*z);
315 outputValues(5, i0, 3) = 0.25*(1.0 + x)*(1.0 + z);
316 outputValues(5, i0, 4) = -0.125*(1.0 + x)*(x - 2.0*y + 2.0*z);
317 outputValues(5, i0, 5) = 0.25*(1.0 + x)*(1.0 - y);
318
319 outputValues(6, i0, 0) = 0.25*(1.0 + y)*(1.0 + z);
320 outputValues(6, i0, 1) = 0.125*(1.0 + z)*(2.0*x + 2.0*y + z);
321 outputValues(6, i0, 2) = 0.125*(1.0 + y)*(2.0*x + y + 2.0*z);
322 outputValues(6, i0, 3) = 0.25*(1.0 + x)*(1.0 + z);
323 outputValues(6, i0, 4) = 0.125*(1.0 + x)*(x + 2.0*y + 2.0*z);
324 outputValues(6, i0, 5) = 0.25*(1.0 + x)*(1.0 + y);
325
326 outputValues(7, i0, 0) = 0.25*(1.0 + y)*(1.0 + z);
327 outputValues(7, i0, 1) = -0.125*(1.0 + z)*(-2.0*x + 2.0*y + z);
328 outputValues(7, i0, 2) = -0.125*(1.0 + y)*(-2.0*x + y + 2.0*z);
329 outputValues(7, i0, 3) = 0.25*(1.0 - x)*(1.0 + z);
330 outputValues(7, i0, 4) = 0.125*(1.0 - x)*(-x + 2.0*y + 2.0*z);
331 outputValues(7, i0, 5) = 0.25*(1.0 - x)*(1.0 + y);
332
333 outputValues(8, i0, 0) = -0.5*(1.0 - y)*(1.0 - z);
334 outputValues(8, i0, 1) = 0.5*x*(1.0 - z);
335 outputValues(8, i0, 2) = 0.5*x*(1.0 - y);
336 outputValues(8, i0, 3) = 0.0;
337 outputValues(8, i0, 4) = 0.25*(1.0 - x*x);
338 outputValues(8, i0, 5) = 0.0;
339
340 outputValues(9, i0, 0) = 0.0;
341 outputValues(9, i0, 1) = -0.5*y*(1.0 - z);
342 outputValues(9, i0, 2) = -0.25*(1.0 - y*y);
343 outputValues(9, i0, 3) = -0.5*(1.0 + x)*(1.0 - z);
344 outputValues(9, i0, 4) = 0.5*y*(1.0 + x);
345 outputValues(9, i0, 5) = 0.0;
346
347 outputValues(10, i0, 0) = -0.5*(1.0 + y)*(1.0 - z);
348 outputValues(10, i0, 1) = -0.5*x*(1.0 - z);
349 outputValues(10, i0, 2) = 0.5*x*(1.0 + y);
350 outputValues(10, i0, 3) = 0.0;
351 outputValues(10, i0, 4) = -0.25*(1.0 - x*x);
352 outputValues(10, i0, 5) = 0.0;
353
354 outputValues(11, i0, 0) = 0.0;
355 outputValues(11, i0, 1) = 0.5*y*(1.0 - z);
356 outputValues(11, i0, 2) = 0.25*(1.0 - y*y);
357 outputValues(11, i0, 3) = -0.5*(1.0 - x)*(1.0 - z);
358 outputValues(11, i0, 4) = 0.5*y*(1.0 - x);
359 outputValues(11, i0, 5) = 0.0;
360
361 outputValues(12, i0, 0) = 0.0;
362 outputValues(12, i0, 1) = 0.25*(1.0 - z*z);
363 outputValues(12, i0, 2) = 0.5*z*(1.0 - y);
364 outputValues(12, i0, 3) = 0.0;
365 outputValues(12, i0, 4) = 0.5*z*(1.0 - x);
366 outputValues(12, i0, 5) = -0.5*(1.0 - x)*(1.0 - y);
367
368 outputValues(13, i0, 0) = 0.0;
369 outputValues(13, i0, 1) = -0.25*(1.0 - z*z);
370 outputValues(13, i0, 2) = -0.5*z*(1.0 - y);
371 outputValues(13, i0, 3) = 0.0;
372 outputValues(13, i0, 4) = 0.5*z*(1.0 + x);
373 outputValues(13, i0, 5) = -0.5*(1.0 + x)*(1.0 - y);
374
375 outputValues(14, i0, 0) = 0.0;
376 outputValues(14, i0, 1) = 0.25*(1.0 - z*z);
377 outputValues(14, i0, 2) = -0.5*z*(1.0 + y);
378 outputValues(14, i0, 3) = 0.0;
379 outputValues(14, i0, 4) = -0.5*z*(1.0 + x);
380 outputValues(14, i0, 5) = -0.5*(1.0 + x)*(1.0 + y);
381
382 outputValues(15, i0, 0) = 0.0;
383 outputValues(15, i0, 1) = -0.25*(1.0 - z*z);
384 outputValues(15, i0, 2) = 0.5*z*(1.0 + y);
385 outputValues(15, i0, 3) = 0.0;
386 outputValues(15, i0, 4) = -0.5*z*(1.0 - x);
387 outputValues(14, i0, 5) = -0.5*(1.0 - x)*(1.0 + y);
388
389 outputValues(16, i0, 0) = -0.5*(1.0 - y)*(1.0 + z);
390 outputValues(16, i0, 1) = 0.5*x*(1.0 + z);
391 outputValues(16, i0, 2) = -0.5*x*(1.0 - y);
392 outputValues(16, i0, 3) = 0.0;
393 outputValues(16, i0, 4) = -0.25*(1.0 - x*x);
394 outputValues(16, i0, 5) = 0.0;
395
396 outputValues(17, i0, 0) = 0.0;
397 outputValues(17, i0, 1) = -0.5*y*(1.0 + z);
398 outputValues(17, i0, 2) = 0.25*(1.0 - y*y);
399 outputValues(17, i0, 3) = -0.5*(1.0 + x)*(1.0 + z);
400 outputValues(17, i0, 4) = -0.5*y*(1.0 + x);
401 outputValues(17, i0, 5) = 0.0;
402
403 outputValues(18, i0, 0) = -0.5*(1.0 + y)*(1.0 + z);
404 outputValues(18, i0, 1) = -0.5*x*(1.0 + z);
405 outputValues(18, i0, 2) = -0.5*x*(1.0 + y);
406 outputValues(18, i0, 3) = 0.0;
407 outputValues(18, i0, 4) = 0.25*(1.0 - x*x);
408 outputValues(18, i0, 5) = 0.0;
409
410 outputValues(19, i0, 0) = 0.0;
411 outputValues(19, i0, 1) = 0.5*y*(1.0 + z);
412 outputValues(19, i0, 2) = -0.25*(1.0 - y*y);
413 outputValues(19, i0, 3) = -0.5*(1.0 - x)*(1.0 + z);
414 outputValues(19, i0, 4) = -0.5*y*(1.0 - x);
415 outputValues(19, i0, 5) = 0.0;
416
417 }
418 break;
419
420 case OPERATOR_D3:
421 for (int i0 = 0; i0 < dim0; i0++) {
422 x = inputPoints(i0,0);
423 y = inputPoints(i0,1);
424 z = inputPoints(i0,2);
425
426 outputValues(0,i0, 0) = 0.0;
427 outputValues(0,i0, 1) = -0.25*(1.0 - z);
428 outputValues(0,i0, 2) = -0.25*(1.0 - y);
429 outputValues(0,i0, 3) = -0.25*(1.0 - z);
430 outputValues(0,i0, 4) = -0.125*(-2.0*x - 2.0*y - 2.0*z + 1.0);
431 outputValues(0,i0, 5) = -0.25*(1.0 - y);
432 outputValues(0,i0, 6) = 0.0;
433 outputValues(0,i0, 7) = -0.25*(1.0 - x);
434 outputValues(0,i0, 8) = -0.25*(1.0 - x);
435 outputValues(0,i0, 9) = 0.0;
436
437 outputValues(1,i0, 0) = 0.0;
438 outputValues(1,i0, 1) = -0.25*(1.0 - z);
439 outputValues(1,i0, 2) = -0.25*(1.0 - y);
440 outputValues(1,i0, 3) = 0.25*(1.0 - z);
441 outputValues(1,i0, 4) = 0.125*(2.0*x - 2.0*y - 2.0*z + 1.0);
442 outputValues(1,i0, 5) = 0.25*(1.0 - y);
443 outputValues(1,i0, 6) = 0.0;
444 outputValues(1,i0, 7) = -0.25*(1.0 + x);
445 outputValues(1,i0, 8) = -0.25*(1.0 + x);
446 outputValues(1,i0, 9) = 0.0;
447
448 outputValues(2,i0, 0) = 0.0;
449 outputValues(2,i0, 1) = 0.25*(1.0 - z);
450 outputValues(2,i0, 2) = -0.25*(1.0 + y);
451 outputValues(2,i0, 3) = 0.25*(1.0 - z);
452 outputValues(2,i0, 4) = -0.125*(2.0*x + 2.0*y - 2.0*z + 1.0);
453 outputValues(2,i0, 5) = 0.25*(1.0 + y);
454 outputValues(2,i0, 6) = 0.0;
455 outputValues(2,i0, 7) = -0.25*(1.0 + x);
456 outputValues(2,i0, 8) = 0.25*(1.0 + x);
457 outputValues(2,i0, 9) = 0.0;
458
459 outputValues(3,i0, 0) = 0.0;
460 outputValues(3,i0, 1) = 0.25*(1.0 - z);
461 outputValues(3,i0, 2) = -0.25*(1.0 + y);
462 outputValues(3,i0, 3) = -0.25*(1.0 - z);
463 outputValues(3,i0, 4) = 0.125*(-2.0*x + 2.0*y - 2.0*z + 1.0);
464 outputValues(3,i0, 5) = -0.25*(1.0 + y);
465 outputValues(3,i0, 6) = 0.0;
466 outputValues(3,i0, 7) = -0.25*(1.0 - x);
467 outputValues(3,i0, 8) = 0.25*(1.0 - x);
468 outputValues(3,i0, 9) = 0.0;
469
470 outputValues(4,i0, 0) = 0.0;
471 outputValues(4,i0, 1) = -0.25*(1.0 + z);
472 outputValues(4,i0, 2) = 0.25*(1.0 - y);
473 outputValues(4,i0, 3) = -0.25*(1.0 + z);
474 outputValues(4,i0, 4) = 0.125*(-2.0*x - 2.0*y + 2.0*z + 1.0);
475 outputValues(4,i0, 5) = -0.25*(1.0 - y);
476 outputValues(4,i0, 6) = 0.0;
477 outputValues(4,i0, 7) = 0.25*(1.0 - x);
478 outputValues(4,i0, 8) = -0.25*(1.0 - x);
479 outputValues(4,i0, 9) = 0.0;
480
481 outputValues(5,i0, 0) = 0.0;
482 outputValues(5,i0, 1) = -0.25*(1.0 + z);
483 outputValues(5,i0, 2) = 0.25*(1.0 - y);
484 outputValues(5,i0, 3) = 0.25*(1.0 + z);
485 outputValues(5,i0, 4) = -0.125*(2.0*x - 2.0*y + 2.0*z + 1.0);
486 outputValues(5,i0, 5) = 0.25*(1.0 - y);
487 outputValues(5,i0, 6) = 0.0;
488 outputValues(5,i0, 7) = 0.25*(1.0 + x);
489 outputValues(5,i0, 8) = -0.25*(1.0 + x);
490 outputValues(5,i0, 9) = 0.0;
491
492 outputValues(6,i0, 0) = 0.0;
493 outputValues(6,i0, 1) = 0.25*(1.0 + z);
494 outputValues(6,i0, 2) = 0.25*(1.0 + y);
495 outputValues(6,i0, 3) = 0.25*(1.0 + z);
496 outputValues(6,i0, 4) = 0.125*(2.0*x + 2.0*y + 2.0*z + 1.0);
497 outputValues(6,i0, 5) = 0.25*(1.0 + y);
498 outputValues(6,i0, 6) = 0.0;
499 outputValues(6,i0, 7) = 0.25*(1.0 + x);
500 outputValues(6,i0, 8) = 0.25*(1.0 + x);
501 outputValues(6,i0, 9) = 0.0;
502
503 outputValues(7,i0, 0) = 0.0;
504 outputValues(7,i0, 1) = 0.25*(1.0 + z);
505 outputValues(7,i0, 2) = 0.25*(1.0 + y);
506 outputValues(7,i0, 3) = -0.25*(1.0 + z);
507 outputValues(7,i0, 4) = -0.125*(-2.0*x + 2.0*y + 2.0*z + 1.0);
508 outputValues(7,i0, 5) = -0.25*(1.0 + y);
509 outputValues(7,i0, 6) = 0.0;
510 outputValues(7,i0, 7) = 0.25*(1.0 - x);
511 outputValues(7,i0, 8) = 0.25*(1.0 - x);
512 outputValues(7,i0, 9) = 0.0;
513
514 outputValues(8,i0, 0) = 0.0;
515 outputValues(8,i0, 1) = 0.5*(1.0 - z);
516 outputValues(8,i0, 2) = 0.5*(1.0 - y);
517 outputValues(8,i0, 3) = 0.0;
518 outputValues(8,i0, 4) = -0.5*x;
519 outputValues(8,i0, 5) = 0.0;
520 outputValues(8,i0, 6) = 0.0;
521 outputValues(8,i0, 7) = 0.0;
522 outputValues(8,i0, 8) = 0.0;
523 outputValues(8,i0, 9) = 0.0;
524
525 outputValues(9,i0, 0) = 0.0;
526 outputValues(9,i0, 1) = 0.0;
527 outputValues(9,i0, 2) = 0.0;
528 outputValues(9,i0, 3) = -0.5*(1.0 - z);
529 outputValues(9,i0, 4) = 0.5*y;
530 outputValues(9,i0, 5) = 0.0;
531 outputValues(9,i0, 6) = 0.0;
532 outputValues(9,i0, 7) = 0.5*(1.0 + x);
533 outputValues(9,i0, 8) = 0.0;
534 outputValues(9,i0, 9) = 0.0;
535
536 outputValues(10,i0, 0) = 0.0;
537 outputValues(10,i0, 1) = -0.5*(1.0 - z);
538 outputValues(10,i0, 2) = 0.5*(1.0 + y);
539 outputValues(10,i0, 3) = 0.0;
540 outputValues(10,i0, 4) = 0.5*x;
541 outputValues(10,i0, 5) = 0.0;
542 outputValues(10,i0, 6) = 0.0;
543 outputValues(10,i0, 7) = 0.0;
544 outputValues(10,i0, 8) = 0.0;
545 outputValues(10,i0, 9) = 0.0;
546
547 outputValues(11,i0, 0) = 0.0;
548 outputValues(11,i0, 1) = 0.0;
549 outputValues(11,i0, 2) = 0.0;
550 outputValues(11,i0, 3) = 0.5*(1.0 - z);
551 outputValues(11,i0, 4) = -0.5*y;
552 outputValues(11,i0, 5) = 0.0;
553 outputValues(11,i0, 6) = 0.0;
554 outputValues(11,i0, 7) = 0.5*(1.0 - x);
555 outputValues(11,i0, 8) = 0.0;
556 outputValues(11,i0, 9) = 0.0;
557
558 outputValues(12,i0, 0) = 0.0;
559 outputValues(12,i0, 1) = 0.0;
560 outputValues(12,i0, 2) = 0.0;
561 outputValues(12,i0, 3) = 0.0;
562 outputValues(12,i0, 4) = -0.5*z;
563 outputValues(12,i0, 5) = 0.5*(1.0 - y);
564 outputValues(12,i0, 6) = 0.0;
565 outputValues(12,i0, 7) = 0.0;
566 outputValues(12,i0, 8) = 0.5*(1.0 - x);
567 outputValues(12,i0, 9) = 0.0;
568
569 outputValues(13,i0, 0) = 0.0;
570 outputValues(13,i0, 1) = 0.0;
571 outputValues(13,i0, 2) = 0.0;
572 outputValues(13,i0, 3) = 0.0;
573 outputValues(13,i0, 4) = 0.5*z;
574 outputValues(13,i0, 5) = -0.5*(1.0 - y);
575 outputValues(13,i0, 6) = 0.0;
576 outputValues(13,i0, 7) = 0.0;
577 outputValues(13,i0, 8) = 0.5*(1.0 + x);
578 outputValues(13,i0, 9) = 0.0;
579
580 outputValues(14,i0, 0) = 0.0;
581 outputValues(14,i0, 1) = 0.0;
582 outputValues(14,i0, 2) = 0.0;
583 outputValues(14,i0, 3) = 0.0;
584 outputValues(14,i0, 4) = -0.5*z;
585 outputValues(14,i0, 5) = -0.5*(1.0 + y);
586 outputValues(14,i0, 6) = 0.0;
587 outputValues(14,i0, 7) = 0.0;
588 outputValues(14,i0, 8) = -0.5*(1.0 + x);
589 outputValues(14,i0, 9) = 0.0;
590
591 outputValues(15,i0, 0) = 0.0;
592 outputValues(15,i0, 1) = 0.0;
593 outputValues(15,i0, 2) = 0.0;
594 outputValues(15,i0, 3) = 0.0;
595 outputValues(15,i0, 4) = 0.5*z;
596 outputValues(15,i0, 5) = 0.5*(1.0 + y);
597 outputValues(15,i0, 6) = 0.0;
598 outputValues(15,i0, 7) = 0.0;
599 outputValues(15,i0, 8) = -0.5*(1.0 - x);
600 outputValues(15,i0, 9) = 0.0;
601
602 outputValues(16,i0, 0) = 0.0;
603 outputValues(16,i0, 1) = 0.5*(1.0 + z);
604 outputValues(16,i0, 2) = -0.5*(1.0 - y);
605 outputValues(16,i0, 3) = 0.0;
606 outputValues(16,i0, 4) = 0.5*x;
607 outputValues(16,i0, 5) = 0.0;
608 outputValues(16,i0, 6) = 0.0;
609 outputValues(16,i0, 7) = 0.0;
610 outputValues(16,i0, 8) = 0.0;
611 outputValues(16,i0, 9) = 0.0;
612
613 outputValues(17,i0, 0) = 0.0;
614 outputValues(17,i0, 1) = 0.0;
615 outputValues(17,i0, 2) = 0.0;
616 outputValues(17,i0, 3) = -0.5*(1.0 + z);
617 outputValues(17,i0, 4) = -0.5*y;
618 outputValues(17,i0, 5) = 0.0;
619 outputValues(17,i0, 6) = 0.0;
620 outputValues(17,i0, 7) = -0.5*(1.0 + x);
621 outputValues(17,i0, 8) = 0.0;
622 outputValues(17,i0, 9) = 0.0;
623
624 outputValues(18,i0, 0) = 0.0;
625 outputValues(18,i0, 1) = -0.5*(1.0 + z);
626 outputValues(18,i0, 2) = -0.5*(1.0 + y);
627 outputValues(18,i0, 3) = 0.0;
628 outputValues(18,i0, 4) = -0.5*x;
629 outputValues(18,i0, 5) = 0.0;
630 outputValues(18,i0, 6) = 0.0;
631 outputValues(18,i0, 7) = 0.0;
632 outputValues(18,i0, 8) = 0.0;
633 outputValues(18,i0, 9) = 0.0;
634
635 outputValues(19,i0, 0) = 0.0;
636 outputValues(19,i0, 1) = 0.0;
637 outputValues(19,i0, 2) = 0.0;
638 outputValues(19,i0, 3) = 0.5*(1.0 + z);
639 outputValues(19,i0, 4) = 0.5*y;
640 outputValues(19,i0, 5) = 0.0;
641 outputValues(19,i0, 6) = 0.0;
642 outputValues(19,i0, 7) = -0.5*(1.0 - x);
643 outputValues(19,i0, 8) = 0.0;
644 outputValues(19,i0, 9) = 0.0;
645
646 }
647 break;
648
649 case OPERATOR_D4:
650 {
651 // Intitialize array by zero and then fill only non-zero entries.
652 int DkCardinality = Intrepid::getDkCardinality(operatorType, this -> basisCellTopology_.getDimension() );
653 for(int dofOrd = 0; dofOrd < this -> basisCardinality_; dofOrd++) {
654 for (int i0 = 0; i0 < dim0; i0++) {
655 for(int dkOrd = 0; dkOrd < DkCardinality; dkOrd++){
656 outputValues(dofOrd, i0, dkOrd) = 0.0;
657 }
658 }
659 }
660
661 for (int i0 = 0; i0 < dim0; i0++) {
662 x = inputPoints(i0,0);
663 y = inputPoints(i0,1);
664 z = inputPoints(i0,2);
665
666 outputValues( 0, i0, 4) = 0.25;
667 outputValues( 0, i0, 7) = 0.25;
668 outputValues( 0, i0, 8) = 0.25;
669
670 outputValues( 1, i0, 4) = 0.25;
671 outputValues( 1, i0, 7) = -0.25;
672 outputValues( 1, i0, 8) = -0.25;
673
674 outputValues( 2, i0, 4) = -0.25;
675 outputValues( 2, i0, 7) = -0.25;
676 outputValues( 2, i0, 8) = 0.25;
677
678 outputValues( 3, i0, 4) = -0.25;
679 outputValues( 3, i0, 7) = 0.25;
680 outputValues( 3, i0, 8) = -0.25;
681
682 outputValues( 4, i0, 4) = -0.25;
683 outputValues( 4, i0, 7) = -0.25;
684 outputValues( 4, i0, 8) = 0.25;
685
686 outputValues( 5, i0, 4) = -0.25;
687 outputValues( 5, i0, 7) = 0.25;
688 outputValues( 5, i0, 8) = -0.25;
689
690 outputValues( 6, i0, 4) = 0.25;
691 outputValues( 6, i0, 7) = 0.25;
692 outputValues( 6, i0, 8) = 0.25;
693
694 outputValues( 7, i0, 4) = 0.25;
695 outputValues( 7, i0, 7) = -0.25;
696 outputValues( 7, i0, 8) = -0.25;
697
698 outputValues( 8, i0, 4) = -0.5;
699 outputValues( 9, i0, 7) = 0.5;
700 outputValues(10, i0, 4) = 0.5;
701 outputValues(11, i0, 7) = -0.5;
702 outputValues(12, i0, 8) = -0.5;
703 outputValues(13, i0, 8) = 0.5;
704 outputValues(14, i0, 8) = -0.5;
705 outputValues(15, i0, 8) = 0.5;
706 outputValues(16, i0, 4) = 0.5;
707 outputValues(17, i0, 7) = -0.5;
708 outputValues(18, i0, 4) = -0.5;
709 outputValues(19, i0, 7) = 0.5;
710 }
711 }
712 break;
713
714 case OPERATOR_D5:
715 case OPERATOR_D6:
716 case OPERATOR_D7:
717 case OPERATOR_D8:
718 case OPERATOR_D9:
719 case OPERATOR_D10:
720 {
721 // outputValues is a rank-3 array with dimensions (basisCardinality_, dim0, DkCardinality)
722 int DkCardinality = Intrepid::getDkCardinality(operatorType,
723 this -> basisCellTopology_.getDimension() );
724 for(int dofOrd = 0; dofOrd < this -> basisCardinality_; dofOrd++) {
725 for (int i0 = 0; i0 < dim0; i0++) {
726 for(int dkOrd = 0; dkOrd < DkCardinality; dkOrd++){
727 outputValues(dofOrd, i0, dkOrd) = 0.0;
728 }
729 }
730 }
731 }
732 break;
733
734 default:
735 TEUCHOS_TEST_FOR_EXCEPTION( !( Intrepid::isValidOperator(operatorType) ), std::invalid_argument,
736 ">>> ERROR (Basis_HGRAD_HEX_I2_FEM): Invalid operator type");
737 }
738}
739
740
741
742template<class Scalar, class ArrayScalar>
744 const ArrayScalar & inputPoints,
745 const ArrayScalar & cellVertices,
746 const EOperator operatorType) const {
747 TEUCHOS_TEST_FOR_EXCEPTION( (true), std::logic_error,
748 ">>> ERROR (Basis_HGRAD_HEX_I2_FEM): FEM Basis calling an FVD member function");
749 }
750
751template<class Scalar, class ArrayScalar>
753#ifdef HAVE_INTREPID_DEBUG
754 // Verify rank of output array.
755 TEUCHOS_TEST_FOR_EXCEPTION( !(DofCoords.rank() == 2), std::invalid_argument,
756 ">>> ERROR: (Intrepid::Basis_HGRAD_HEX_I2_FEM::getDofCoords) rank = 2 required for DofCoords array");
757 // Verify 0th dimension of output array.
758 TEUCHOS_TEST_FOR_EXCEPTION( !( DofCoords.dimension(0) == this -> basisCardinality_ ), std::invalid_argument,
759 ">>> ERROR: (Intrepid::Basis_HGRAD_HEX_I2_FEM::getDofCoords) mismatch in number of DoF and 0th dimension of DofCoords array");
760 // Verify 1st dimension of output array.
761 TEUCHOS_TEST_FOR_EXCEPTION( !( DofCoords.dimension(1) == (int)(this -> basisCellTopology_.getDimension()) ), std::invalid_argument,
762 ">>> ERROR: (Intrepid::Basis_HGRAD_HEX_I2_FEM::getDofCoords) incorrect reference cell (1st) dimension in DofCoords array");
763#endif
764
765 DofCoords(0,0) = -1.0; DofCoords(0,1) = -1.0; DofCoords(0,2) = -1.0;
766 DofCoords(1,0) = 1.0; DofCoords(1,1) = -1.0; DofCoords(1,2) = -1.0;
767 DofCoords(2,0) = 1.0; DofCoords(2,1) = 1.0; DofCoords(2,2) = -1.0;
768 DofCoords(3,0) = -1.0; DofCoords(3,1) = 1.0; DofCoords(3,2) = -1.0;
769 DofCoords(4,0) = -1.0; DofCoords(4,1) = -1.0; DofCoords(4,2) = 1.0;
770 DofCoords(5,0) = 1.0; DofCoords(5,1) = -1.0; DofCoords(5,2) = 1.0;
771 DofCoords(6,0) = 1.0; DofCoords(6,1) = 1.0; DofCoords(6,2) = 1.0;
772 DofCoords(7,0) = -1.0; DofCoords(7,1) = 1.0; DofCoords(7,2) = 1.0;
773
774 DofCoords(8,0) = 0.0; DofCoords(8,1) = -1.0; DofCoords(8,2) = -1.0;
775 DofCoords(9,0) = 1.0; DofCoords(9,1) = 0.0; DofCoords(9,2) = -1.0;
776 DofCoords(10,0) = 0.0; DofCoords(10,1) = 1.0; DofCoords(10,2) = -1.0;
777 DofCoords(11,0) = -1.0; DofCoords(11,1) = 0.0; DofCoords(11,2) = -1.0;
778 DofCoords(12,0) = -1.0; DofCoords(12,1) = -1.0; DofCoords(12,2) = 0.0;
779 DofCoords(13,0) = 1.0; DofCoords(13,1) = -1.0; DofCoords(13,2) = 0.0;
780 DofCoords(14,0) = 1.0; DofCoords(14,1) = 1.0; DofCoords(14,2) = 0.0;
781 DofCoords(15,0) = -1.0; DofCoords(15,1) = 1.0; DofCoords(15,2) = 0.0;
782 DofCoords(16,0) = 0.0; DofCoords(16,1) = -1.0; DofCoords(16,2) = 1.0;
783 DofCoords(17,0) = 1.0; DofCoords(17,1) = 0.0; DofCoords(17,2) = 1.0;
784 DofCoords(18,0) = 0.0; DofCoords(18,1) = 1.0; DofCoords(18,2) = 1.0;
785 DofCoords(19,0) = -1.0; DofCoords(19,1) = 0.0; DofCoords(19,2) = 1.0;
786}
787
788}// namespace Intrepid
789#endif
int isValidOperator(const EOperator operatorType)
Verifies validity of an operator enum.
void setOrdinalTagData(std::vector< std::vector< std::vector< int > > > &tagToOrdinal, std::vector< std::vector< int > > &ordinalToTag, const int *tags, const int basisCard, const int tagSize, const int posScDim, const int posScOrd, const int posDfOrd)
Fills ordinalToTag_ and tagToOrdinal_ by basis-specific tag data.
int getDkCardinality(const EOperator operatorType, const int spaceDim)
Returns cardinality of Dk, i.e., the number of all derivatives of order k.
void getDofCoords(ArrayScalar &DofCoords) const
Returns spatial locations (coordinates) of degrees of freedom on a reference Quadrilateral.
void initializeTags()
Initializes tagToOrdinal_ and ordinalToTag_ lookup arrays.
void getValues(ArrayScalar &outputValues, const ArrayScalar &inputPoints, const EOperator operatorType) const
Evaluation of a FEM basis on a reference Hexahedron cell.