1 #ifndef INTREPID_HGRAD_HEX_C1_FEMDEF_HPP 2 #define INTREPID_HGRAD_HEX_C1_FEMDEF_HPP 54 template<
class Scalar,
class ArrayScalar>
57 this -> basisCardinality_ = 8;
58 this -> basisDegree_ = 1;
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,
88 this -> ordinalToTag_,
90 this -> basisCardinality_,
99 template<
class Scalar,
class ArrayScalar>
101 const ArrayScalar & inputPoints,
105 #ifdef HAVE_INTREPID_DEBUG 106 Intrepid::getValues_HGRAD_Args<Scalar, ArrayScalar>(outputValues,
109 this -> getBaseCellTopology(),
110 this -> getCardinality() );
114 int dim0 = inputPoints.dimension(0);
121 switch (operatorType) {
124 for (
int i0 = 0; i0 < dim0; i0++) {
125 x = inputPoints(i0, 0);
126 y = inputPoints(i0, 1);
127 z = inputPoints(i0, 2);
130 outputValues(0, i0) = (1.0 - x)*(1.0 - y)*(1.0 - z)/8.0;
131 outputValues(1, i0) = (1.0 + x)*(1.0 - y)*(1.0 - z)/8.0;
132 outputValues(2, i0) = (1.0 + x)*(1.0 + y)*(1.0 - z)/8.0;
133 outputValues(3, i0) = (1.0 - x)*(1.0 + y)*(1.0 - z)/8.0;
135 outputValues(4, i0) = (1.0 - x)*(1.0 - y)*(1.0 + z)/8.0;
136 outputValues(5, i0) = (1.0 + x)*(1.0 - y)*(1.0 + z)/8.0;
137 outputValues(6, i0) = (1.0 + x)*(1.0 + y)*(1.0 + z)/8.0;
138 outputValues(7, i0) = (1.0 - x)*(1.0 + y)*(1.0 + z)/8.0;
144 for (
int i0 = 0; i0 < dim0; i0++) {
145 x = inputPoints(i0,0);
146 y = inputPoints(i0,1);
147 z = inputPoints(i0,2);
150 outputValues(0, i0, 0) = -(1.0 - y)*(1.0 - z)/8.0;
151 outputValues(0, i0, 1) = -(1.0 - x)*(1.0 - z)/8.0;
152 outputValues(0, i0, 2) = -(1.0 - x)*(1.0 - y)/8.0;
154 outputValues(1, i0, 0) = (1.0 - y)*(1.0 - z)/8.0;
155 outputValues(1, i0, 1) = -(1.0 + x)*(1.0 - z)/8.0;
156 outputValues(1, i0, 2) = -(1.0 + x)*(1.0 - y)/8.0;
158 outputValues(2, i0, 0) = (1.0 + y)*(1.0 - z)/8.0;
159 outputValues(2, i0, 1) = (1.0 + x)*(1.0 - z)/8.0;
160 outputValues(2, i0, 2) = -(1.0 + x)*(1.0 + y)/8.0;
162 outputValues(3, i0, 0) = -(1.0 + y)*(1.0 - z)/8.0;
163 outputValues(3, i0, 1) = (1.0 - x)*(1.0 - z)/8.0;
164 outputValues(3, i0, 2) = -(1.0 - x)*(1.0 + y)/8.0;
166 outputValues(4, i0, 0) = -(1.0 - y)*(1.0 + z)/8.0;
167 outputValues(4, i0, 1) = -(1.0 - x)*(1.0 + z)/8.0;
168 outputValues(4, i0, 2) = (1.0 - x)*(1.0 - y)/8.0;
170 outputValues(5, i0, 0) = (1.0 - y)*(1.0 + z)/8.0;
171 outputValues(5, i0, 1) = -(1.0 + x)*(1.0 + z)/8.0;
172 outputValues(5, i0, 2) = (1.0 + x)*(1.0 - y)/8.0;
174 outputValues(6, i0, 0) = (1.0 + y)*(1.0 + z)/8.0;
175 outputValues(6, i0, 1) = (1.0 + x)*(1.0 + z)/8.0;
176 outputValues(6, i0, 2) = (1.0 + x)*(1.0 + y)/8.0;
178 outputValues(7, i0, 0) = -(1.0 + y)*(1.0 + z)/8.0;
179 outputValues(7, i0, 1) = (1.0 - x)*(1.0 + z)/8.0;
180 outputValues(7, i0, 2) = (1.0 - x)*(1.0 + y)/8.0;
185 TEUCHOS_TEST_FOR_EXCEPTION( (operatorType == OPERATOR_CURL), std::invalid_argument,
186 ">>> ERROR (Basis_HGRAD_HEX_C1_FEM): CURL is invalid operator for rank-0 (scalar) functions in 3D");
190 TEUCHOS_TEST_FOR_EXCEPTION( (operatorType == OPERATOR_DIV), std::invalid_argument,
191 ">>> ERROR (Basis_HGRAD_HEX_C1_FEM): DIV is invalid operator for rank-0 (scalar) functions in 3D");
195 for (
int i0 = 0; i0 < dim0; i0++) {
196 x = inputPoints(i0,0);
197 y = inputPoints(i0,1);
198 z = inputPoints(i0,2);
201 outputValues(0, i0, 0) = 0.0;
202 outputValues(0, i0, 1) = (1.0 - z)/8.0;
203 outputValues(0, i0, 2) = (1.0 - y)/8.0;
204 outputValues(0, i0, 3) = 0.0;
205 outputValues(0, i0, 4) = (1.0 - x)/8.0;
206 outputValues(0, i0, 5) = 0.0;
208 outputValues(1, i0, 0) = 0.0;
209 outputValues(1, i0, 1) = -(1.0 - z)/8.0;
210 outputValues(1, i0, 2) = -(1.0 - y)/8.0;
211 outputValues(1, i0, 3) = 0.0;
212 outputValues(1, i0, 4) = (1.0 + x)/8.0;
213 outputValues(1, i0, 5) = 0.0;
215 outputValues(2, i0, 0) = 0.0;
216 outputValues(2, i0, 1) = (1.0 - z)/8.0;
217 outputValues(2, i0, 2) = -(1.0 + y)/8.0;
218 outputValues(2, i0, 3) = 0.0;
219 outputValues(2, i0, 4) = -(1.0 + x)/8.0;
220 outputValues(2, i0, 5) = 0.0;
222 outputValues(3, i0, 0) = 0.0;
223 outputValues(3, i0, 1) = -(1.0 - z)/8.0;
224 outputValues(3, i0, 2) = (1.0 + y)/8.0;
225 outputValues(3, i0, 3) = 0.0;
226 outputValues(3, i0, 4) = -(1.0 - x)/8.0;
227 outputValues(3, i0, 5) = 0.0;
230 outputValues(4, i0, 0) = 0.0;
231 outputValues(4, i0, 1) = (1.0 + z)/8.0;
232 outputValues(4, i0, 2) = -(1.0 - y)/8.0;
233 outputValues(4, i0, 3) = 0.0;
234 outputValues(4, i0, 4) = -(1.0 - x)/8.0;
235 outputValues(4, i0, 5) = 0.0;
237 outputValues(5, i0, 0) = 0.0;
238 outputValues(5, i0, 1) = -(1.0 + z)/8.0;
239 outputValues(5, i0, 2) = (1.0 - y)/8.0;
240 outputValues(5, i0, 3) = 0.0;
241 outputValues(5, i0, 4) = -(1.0 + x)/8.0;
242 outputValues(5, i0, 5) = 0.0;
244 outputValues(6, i0, 0) = 0.0;
245 outputValues(6, i0, 1) = (1.0 + z)/8.0;
246 outputValues(6, i0, 2) = (1.0 + y)/8.0;
247 outputValues(6, i0, 3) = 0.0;
248 outputValues(6, i0, 4) = (1.0 + x)/8.0;
249 outputValues(6, i0, 5) = 0.0;
251 outputValues(7, i0, 0) = 0.0;
252 outputValues(7, i0, 1) = -(1.0 + z)/8.0;
253 outputValues(7, i0, 2) = -(1.0 + y)/8.0;
254 outputValues(7, i0, 3) = 0.0;
255 outputValues(7, i0, 4) = (1.0 - x)/8.0;
256 outputValues(7, i0, 5) = 0.0;
271 this -> basisCellTopology_.getDimension() );
272 for(
int dofOrd = 0; dofOrd <
this -> basisCardinality_; dofOrd++) {
273 for (
int i0 = 0; i0 < dim0; i0++) {
274 for(
int dkOrd = 0; dkOrd < DkCardinality; dkOrd++){
275 outputValues(dofOrd, i0, dkOrd) = 0.0;
284 ">>> ERROR (Basis_HGRAD_HEX_C1_FEM): Invalid operator type");
290 template<
class Scalar,
class ArrayScalar>
292 const ArrayScalar & inputPoints,
293 const ArrayScalar & cellVertices,
295 TEUCHOS_TEST_FOR_EXCEPTION( (
true), std::logic_error,
296 ">>> ERROR (Basis_HGRAD_HEX_C1_FEM): FEM Basis calling an FVD member function");
299 template<
class Scalar,
class ArrayScalar>
301 #ifdef HAVE_INTREPID_DEBUG 303 TEUCHOS_TEST_FOR_EXCEPTION( !(DofCoords.rank() == 2), std::invalid_argument,
304 ">>> ERROR: (Intrepid::Basis_HGRAD_HEX_C1_FEM::getDofCoords) rank = 2 required for DofCoords array");
306 TEUCHOS_TEST_FOR_EXCEPTION( !( DofCoords.dimension(0) ==
this -> basisCardinality_ ), std::invalid_argument,
307 ">>> ERROR: (Intrepid::Basis_HGRAD_HEX_C1_FEM::getDofCoords) mismatch in number of DoF and 0th dimension of DofCoords array");
309 TEUCHOS_TEST_FOR_EXCEPTION( !( DofCoords.dimension(1) == (int)(
this -> basisCellTopology_.getDimension()) ), std::invalid_argument,
310 ">>> ERROR: (Intrepid::Basis_HGRAD_HEX_C1_FEM::getDofCoords) incorrect reference cell (1st) dimension in DofCoords array");
313 DofCoords(0,0) = -1.0; DofCoords(0,1) = -1.0; DofCoords(0,2) = -1.0;
314 DofCoords(1,0) = 1.0; DofCoords(1,1) = -1.0; DofCoords(1,2) = -1.0;
315 DofCoords(2,0) = 1.0; DofCoords(2,1) = 1.0; DofCoords(2,2) = -1.0;
316 DofCoords(3,0) = -1.0; DofCoords(3,1) = 1.0; DofCoords(3,2) = -1.0;
317 DofCoords(4,0) = -1.0; DofCoords(4,1) = -1.0; DofCoords(4,2) = 1.0;
318 DofCoords(5,0) = 1.0; DofCoords(5,1) = -1.0; DofCoords(5,2) = 1.0;
319 DofCoords(6,0) = 1.0; DofCoords(6,1) = 1.0; DofCoords(6,2) = 1.0;
320 DofCoords(7,0) = -1.0; DofCoords(7,1) = 1.0; DofCoords(7,2) = 1.0;
Basis_HGRAD_HEX_C1_FEM()
Constructor.
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.
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.
void getValues(ArrayScalar &outputValues, const ArrayScalar &inputPoints, const EOperator operatorType) const
Evaluation of a FEM basis on a reference Hexahedron cell.
void getDofCoords(ArrayScalar &DofCoords) const
Returns spatial locations (coordinates) of degrees of freedom on a reference Quadrilateral.