Intrepid
Intrepid_HDIV_TET_I1_FEMDef.hpp
Go to the documentation of this file.
1 // @HEADER
2 // ************************************************************************
3 //
4 // Intrepid Package
5 // Copyright (2007) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Pavel Bochev (pbboche@sandia.gov)
38 // Denis Ridzal (dridzal@sandia.gov), or
39 // Kara Peterson (kjpeter@sandia.gov)
40 //
41 // ************************************************************************
42 // @HEADER
43 
49 namespace Intrepid {
50 
51 template<class Scalar, class ArrayScalar>
53  {
54  this -> basisCardinality_ = 4;
55  this -> basisDegree_ = 1;
56  this -> basisCellTopology_ = shards::CellTopology(shards::getCellTopologyData<shards::Tetrahedron<4> >() );
57  this -> basisType_ = BASIS_FEM_DEFAULT;
58  this -> basisCoordinates_ = COORDINATES_CARTESIAN;
59  this -> basisTagsAreSet_ = false;
60  }
61 
62 template<class Scalar, class ArrayScalar>
64 
65  // Basis-dependent intializations
66  int tagSize = 4; // size of DoF tag
67  int posScDim = 0; // position in the tag, counting from 0, of the subcell dim
68  int posScOrd = 1; // position in the tag, counting from 0, of the subcell ordinal
69  int posDfOrd = 2; // position in the tag, counting from 0, of DoF ordinal relative to the subcell
70 
71  // An array with local DoF tags assigned to basis functions, in the order of their local enumeration
72  int tags[] = {
73  2, 0, 0, 1,
74  2, 1, 0, 1,
75  2, 2, 0, 1,
76  2, 3, 0, 1,
77  };
78 
79  // Basis-independent function sets tag and enum data in tagToOrdinal_ and ordinalToTag_ arrays:
80  Intrepid::setOrdinalTagData(this -> tagToOrdinal_,
81  this -> ordinalToTag_,
82  tags,
83  this -> basisCardinality_,
84  tagSize,
85  posScDim,
86  posScOrd,
87  posDfOrd);
88 }
89 
90 
91 
92 template<class Scalar, class ArrayScalar>
94  const ArrayScalar & inputPoints,
95  const EOperator operatorType) const {
96 
97 // Verify arguments
98 #ifdef HAVE_INTREPID_DEBUG
99  Intrepid::getValues_HDIV_Args<Scalar, ArrayScalar>(outputValues,
100  inputPoints,
101  operatorType,
102  this -> getBaseCellTopology(),
103  this -> getCardinality() );
104 #endif
105 
106  // Number of evaluation points = dim 0 of inputPoints
107  int dim0 = inputPoints.dimension(0);
108 
109  // Temporaries: (x,y,z) coordinates of the evaluation point
110  Scalar x = 0.0;
111  Scalar y = 0.0;
112  Scalar z = 0.0;
113 
114  switch (operatorType) {
115  case OPERATOR_VALUE:
116  for (int i0 = 0; i0 < dim0; i0++) {
117  x = inputPoints(i0, 0);
118  y = inputPoints(i0, 1);
119  z = inputPoints(i0, 2);
120 
121  // outputValues is a rank-3 array with dimensions (basisCardinality_, dim0, spaceDim)
122  outputValues(0, i0, 0) = 2.0*x;
123  outputValues(0, i0, 1) = 2.0*(y - 1.0);
124  outputValues(0, i0, 2) = 2.0*z;
125 
126  outputValues(1, i0, 0) = 2.0*x;
127  outputValues(1, i0, 1) = 2.0*y;
128  outputValues(1, i0, 2) = 2.0*z;
129 
130  outputValues(2, i0, 0) = 2.0*(x - 1.0);
131  outputValues(2, i0, 1) = 2.0*y;
132  outputValues(2, i0, 2) = 2.0*z;
133 
134  outputValues(3, i0, 0) = 2.0*x;
135  outputValues(3, i0, 1) = 2.0*y;
136  outputValues(3, i0, 2) = 2.0*(z - 1.0);
137  }
138  break;
139 
140  case OPERATOR_DIV:
141  // outputValues is a rank-2 array with dimensions (basisCardinality_, dim0)
142  for (int i0 = 0; i0 < dim0; i0++) {
143  outputValues(0, i0) = 6.0;
144  outputValues(1, i0) = 6.0;
145  outputValues(2, i0) = 6.0;
146  outputValues(3, i0) = 6.0;
147  }
148  break;
149 
150  case OPERATOR_CURL:
151  TEUCHOS_TEST_FOR_EXCEPTION( (operatorType == OPERATOR_CURL), std::invalid_argument,
152  ">>> ERROR (Basis_HDIV_TET_I1_FEM): CURL is invalid operator for HDIV Basis Functions");
153  break;
154 
155  case OPERATOR_GRAD:
156  TEUCHOS_TEST_FOR_EXCEPTION( (operatorType == OPERATOR_GRAD), std::invalid_argument,
157  ">>> ERROR (Basis_HDIV_TET_I1_FEM): GRAD is invalid operator for HDIV Basis Functions");
158  break;
159 
160  case OPERATOR_D1:
161  case OPERATOR_D2:
162  case OPERATOR_D3:
163  case OPERATOR_D4:
164  case OPERATOR_D5:
165  case OPERATOR_D6:
166  case OPERATOR_D7:
167  case OPERATOR_D8:
168  case OPERATOR_D9:
169  case OPERATOR_D10:
170  TEUCHOS_TEST_FOR_EXCEPTION( ( (operatorType == OPERATOR_D1) ||
171  (operatorType == OPERATOR_D2) ||
172  (operatorType == OPERATOR_D3) ||
173  (operatorType == OPERATOR_D4) ||
174  (operatorType == OPERATOR_D5) ||
175  (operatorType == OPERATOR_D6) ||
176  (operatorType == OPERATOR_D7) ||
177  (operatorType == OPERATOR_D8) ||
178  (operatorType == OPERATOR_D9) ||
179  (operatorType == OPERATOR_D10) ),
180  std::invalid_argument,
181  ">>> ERROR (Basis_HDIV_TET_I1_FEM): Invalid operator type");
182  break;
183 
184  default:
185  TEUCHOS_TEST_FOR_EXCEPTION( ( (operatorType != OPERATOR_VALUE) &&
186  (operatorType != OPERATOR_GRAD) &&
187  (operatorType != OPERATOR_CURL) &&
188  (operatorType != OPERATOR_DIV) &&
189  (operatorType != OPERATOR_D1) &&
190  (operatorType != OPERATOR_D2) &&
191  (operatorType != OPERATOR_D3) &&
192  (operatorType != OPERATOR_D4) &&
193  (operatorType != OPERATOR_D5) &&
194  (operatorType != OPERATOR_D6) &&
195  (operatorType != OPERATOR_D7) &&
196  (operatorType != OPERATOR_D8) &&
197  (operatorType != OPERATOR_D9) &&
198  (operatorType != OPERATOR_D10) ),
199  std::invalid_argument,
200  ">>> ERROR (Basis_HDIV_TET_I1_FEM): Invalid operator type");
201  }
202 }
203 
204 
205 
206 template<class Scalar, class ArrayScalar>
208  const ArrayScalar & inputPoints,
209  const ArrayScalar & cellVertices,
210  const EOperator operatorType) const {
211  TEUCHOS_TEST_FOR_EXCEPTION( (true), std::logic_error,
212  ">>> ERROR (Basis_HDIV_TET_I1_FEM): FEM Basis calling an FVD member function");
213  }
214 
215 template<class Scalar, class ArrayScalar>
216 void Basis_HDIV_TET_I1_FEM<Scalar, ArrayScalar>::getDofCoords(ArrayScalar & DofCoords) const {
217 #ifdef HAVE_INTREPID_DEBUG
218  // Verify rank of output array.
219  TEUCHOS_TEST_FOR_EXCEPTION( !(DofCoords.rank() == 2), std::invalid_argument,
220  ">>> ERROR: (Intrepid::Basis_HDIV_TET_I1_FEM::getDofCoords) rank = 2 required for DofCoords array");
221  // Verify 0th dimension of output array.
222  TEUCHOS_TEST_FOR_EXCEPTION( !( DofCoords.dimension(0) == this -> basisCardinality_ ), std::invalid_argument,
223  ">>> ERROR: (Intrepid::Basis_HDIV_TET_I1_FEM::getDofCoords) mismatch in number of DoF and 0th dimension of DofCoords array");
224  // Verify 1st dimension of output array.
225  TEUCHOS_TEST_FOR_EXCEPTION( !( DofCoords.dimension(1) == (int)(this -> basisCellTopology_.getDimension()) ), std::invalid_argument,
226  ">>> ERROR: (Intrepid::Basis_HDIV_TET_I1_FEM::getDofCoords) incorrect reference cell (1st) dimension in DofCoords array");
227 #endif
228 
229  DofCoords(0,0) = 1.0/3.0; DofCoords(0,1) = 0.0; DofCoords(0,2) = 1.0/3.0;
230  DofCoords(1,0) = 1.0/3.0; DofCoords(1,1) = 1.0/3.0; DofCoords(1,2) = 1.0/3.0;
231  DofCoords(2,0) = 0.0; DofCoords(2,1) = 1.0/3.0; DofCoords(2,2) = 1.0/3.0;
232  DofCoords(3,0) = 1.0/3.0; DofCoords(3,1) = 1.0/3.0; DofCoords(3,2) = 0.0;
233 }
234 
235 }// namespace Intrepid
void getValues(ArrayScalar &outputValues, const ArrayScalar &inputPoints, const EOperator operatorType) const
Evaluation of a FEM basis on a reference Tetrahedron cell.
void initializeTags()
Initializes tagToOrdinal_ and ordinalToTag_ lookup arrays.
void getDofCoords(ArrayScalar &DofCoords) const
Returns spatial locations (coordinates) of degrees of freedom on a reference Tetrahedron.