1 #ifndef INTREPID_HGRAD_HEX_I2_FEMDEF_HPP 2 #define INTREPID_HGRAD_HEX_I2_FEMDEF_HPP 54 template<
class Scalar,
class ArrayScalar>
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;
67 template<
class Scalar,
class ArrayScalar>
77 int tags[] = { 0, 0, 0, 1,
101 this -> ordinalToTag_,
103 this -> basisCardinality_,
112 template<
class Scalar,
class ArrayScalar>
114 const ArrayScalar & inputPoints,
118 #ifdef HAVE_INTREPID_DEBUG 119 Intrepid::getValues_HGRAD_Args<Scalar, ArrayScalar>(outputValues,
122 this -> getBaseCellTopology(),
123 this -> getCardinality() );
127 int dim0 = inputPoints.dimension(0);
134 switch (operatorType) {
137 for (
int i0 = 0; i0 < dim0; i0++) {
138 x = inputPoints(i0, 0);
139 y = inputPoints(i0, 1);
140 z = inputPoints(i0, 2);
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);
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);
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);
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);
171 for (
int i0 = 0; i0 < dim0; i0++) {
172 x = inputPoints(i0,0);
173 y = inputPoints(i0,1);
174 z = inputPoints(i0,2);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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");
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");
271 for (
int i0 = 0; i0 < dim0; i0++) {
272 x = inputPoints(i0,0);
273 y = inputPoints(i0,1);
274 z = inputPoints(i0,2);
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);
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);
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);
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);
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);
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);
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);
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);
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;
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;
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;
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;
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);
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);
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);
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);
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;
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;
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;
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;
421 for (
int i0 = 0; i0 < dim0; i0++) {
422 x = inputPoints(i0,0);
423 y = inputPoints(i0,1);
424 z = inputPoints(i0,2);
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
661 for (
int i0 = 0; i0 < dim0; i0++) {
662 x = inputPoints(i0,0);
663 y = inputPoints(i0,1);
664 z = inputPoints(i0,2);
666 outputValues( 0, i0, 4) = 0.25;
667 outputValues( 0, i0, 7) = 0.25;
668 outputValues( 0, i0, 8) = 0.25;
670 outputValues( 1, i0, 4) = 0.25;
671 outputValues( 1, i0, 7) = -0.25;
672 outputValues( 1, i0, 8) = -0.25;
674 outputValues( 2, i0, 4) = -0.25;
675 outputValues( 2, i0, 7) = -0.25;
676 outputValues( 2, i0, 8) = 0.25;
678 outputValues( 3, i0, 4) = -0.25;
679 outputValues( 3, i0, 7) = 0.25;
680 outputValues( 3, i0, 8) = -0.25;
682 outputValues( 4, i0, 4) = -0.25;
683 outputValues( 4, i0, 7) = -0.25;
684 outputValues( 4, i0, 8) = 0.25;
686 outputValues( 5, i0, 4) = -0.25;
687 outputValues( 5, i0, 7) = 0.25;
688 outputValues( 5, i0, 8) = -0.25;
690 outputValues( 6, i0, 4) = 0.25;
691 outputValues( 6, i0, 7) = 0.25;
692 outputValues( 6, i0, 8) = 0.25;
694 outputValues( 7, i0, 4) = 0.25;
695 outputValues( 7, i0, 7) = -0.25;
696 outputValues( 7, i0, 8) = -0.25;
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;
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;
736 ">>> ERROR (Basis_HGRAD_HEX_I2_FEM): Invalid operator type");
742 template<
class Scalar,
class ArrayScalar>
744 const ArrayScalar & inputPoints,
745 const ArrayScalar & cellVertices,
747 TEUCHOS_TEST_FOR_EXCEPTION( (
true), std::logic_error,
748 ">>> ERROR (Basis_HGRAD_HEX_I2_FEM): FEM Basis calling an FVD member function");
751 template<
class Scalar,
class ArrayScalar>
753 #ifdef HAVE_INTREPID_DEBUG 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");
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");
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");
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;
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;
void initializeTags()
Initializes tagToOrdinal_ and ordinalToTag_ lookup arrays.
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.
void getDofCoords(ArrayScalar &DofCoords) const
Returns spatial locations (coordinates) of degrees of freedom on a reference Quadrilateral.
void getValues(ArrayScalar &outputValues, const ArrayScalar &inputPoints, const EOperator operatorType) const
Evaluation of a FEM basis on a reference Hexahedron cell.
EOperator
Enumeration of primitive operators available in Intrepid. Primitive operators act on reconstructed fu...
int getDkCardinality(const EOperator operatorType, const int spaceDim)
Returns cardinality of Dk, i.e., the number of all derivatives of order k.
int isValidOperator(const EOperator operatorType)
Verifies validity of an operator enum.
Basis_HGRAD_HEX_I2_FEM()
Constructor.