52 template<
class Scalar,
class ArrayScalar>
54 const EPointType pointType ):
56 coeffs_( (n+1)*(n+2)*(n+3)/2 , n*(n+1)*(n+3)/2 )
58 const int N = n*(n+1)*(n+3)/2;
62 = shards::CellTopology(shards::getCellTopologyData<shards::Tetrahedron<4> >() );
68 const int littleN = n*(n+1)*(n+2)/2;
69 const int bigN = (n+1)*(n+2)*(n+3)/2;
70 const int start_PkH = (n-1)*n*(n+1)/6;
71 const int dim_PkH = n*(n+1)*(n+2)/6 - start_PkH;
72 const int scalarLittleN = littleN/3;
73 const int scalarBigN = bigN/3;
79 Teuchos::SerialDenseMatrix<int,Scalar> V1(bigN, N);
91 for (
int i=0;i<scalarLittleN;i++) {
92 for (
int k=0;k<3;k++) {
93 V1(i+k*scalarBigN,i+k*scalarLittleN) = 1.0;
106 Phis_.getValues( phisAtCubPoints , cubPoints , OPERATOR_VALUE );
110 for (
int i=0;i<dim_PkH;i++) {
111 for (
int j=0;j<scalarBigN;j++) {
112 V1(j,littleN+i) = 0.0;
113 for (
int d=0;d<3;d++) {
115 V1(j+d*scalarBigN,littleN+i) +=
116 cubWeights(k) * cubPoints(k,d)
117 * phisAtCubPoints(start_PkH+i,k)
118 * phisAtCubPoints(j,k);
126 Teuchos::SerialDenseMatrix<int,Scalar> V2(N , bigN);
128 shards::CellTopology faceTop(shards::getCellTopologyData<shards::Triangle<3> >() );
134 PointTools::getLattice<Scalar,FieldContainer<Scalar> >( twoDPts ,
151 Scalar normal[][4] = { {0.0,0.5,-0.5,0.0},
153 {0.0,0.5,0.0,-0.5} };
155 for (
int i=0;i<4;i++) {
162 Phis_.getValues( phisAtFacePoints , facePts , OPERATOR_VALUE );
165 for (
int j=0;j<numPtsPerFace;j++) {
167 for (
int k=0;k<scalarBigN;k++) {
168 for (
int l=0;l<3;l++) {
169 V2(numPtsPerFace*i+j,k+l*scalarBigN) = normal[l][i] * phisAtFacePoints(k,j);
185 PointTools::getLattice<Scalar,FieldContainer<Scalar> >( internalPoints ,
192 Phis_.getValues( phisAtInternalPoints , internalPoints , OPERATOR_VALUE );
195 for (
int i=0;i<numInternalPoints;i++) {
196 for (
int j=0;j<scalarBigN;j++) {
197 for (
int k=0;k<3;k++) {
198 V2(4*numPtsPerFace+k*numInternalPoints+i,k*scalarBigN+j) = phisAtInternalPoints(j,i);
204 Teuchos::SerialDenseMatrix<int,Scalar> Vsdm( N , N );
207 Vsdm.multiply( Teuchos::NO_TRANS , Teuchos::NO_TRANS , 1.0 , V2 , V1 , 0.0 );
213 Teuchos::SerialDenseSolver<int,Scalar> solver;
214 solver.setMatrix( rcp( &Vsdm ,
false ) );
218 Teuchos::SerialDenseMatrix<int,Scalar> Csdm( bigN , N );
219 Csdm.multiply( Teuchos::NO_TRANS , Teuchos::NO_TRANS , 1.0 , V1 , Vsdm , 0.0 );
223 for (
int i=0;i<bigN;i++) {
224 for (
int j=0;j<N;j++) {
230 template<
class Scalar,
class ArrayScalar>
241 int *tags =
new int[ tagSize * this->getCardinality() ];
243 const int deg = this->getDegree();
245 const int numPtsPerFace = deg*(deg+1)/2;
248 for (
int f=0;f<4;f++) {
249 for (
int i=0;i<numPtsPerFace;i++) {
250 tag_cur[0] = 2; tag_cur[1] = f; tag_cur[2] = i; tag_cur[3] = numPtsPerFace;
257 const int numInternalDof = this->getCardinality() - 4 * numPtsPerFace;
258 int internalDofCur=0;
259 for (
int i=4*numPtsPerFace;i<this->getCardinality();i++) {
260 tag_cur[0] = 3; tag_cur[1] = 0; tag_cur[2] = internalDofCur; tag_cur[3] = numInternalDof;
266 Intrepid::setOrdinalTagData(
this -> tagToOrdinal_,
267 this -> ordinalToTag_,
269 this -> basisCardinality_,
281 template<
class Scalar,
class ArrayScalar>
283 const ArrayScalar & inputPoints,
284 const EOperator operatorType)
const {
287 #ifdef HAVE_INTREPID_DEBUG
288 Intrepid::getValues_HDIV_Args<Scalar, ArrayScalar>(outputValues,
291 this -> getBaseCellTopology(),
292 this -> getCardinality() );
294 const int numPts = inputPoints.dimension(0);
295 const int deg =
this -> getDegree();
296 const int scalarBigN = (deg+1)*(deg+2)*(deg+3)/6;
299 switch (operatorType) {
303 Phis_.getValues( phisCur , inputPoints , OPERATOR_VALUE );
305 for (
int i=0;i<outputValues.dimension(0);i++) {
306 for (
int j=0;j<outputValues.dimension(1);j++) {
307 for (
int l=0;l<3;l++) {
308 outputValues(i,j,l) = 0.0;
310 for (
int k=0;k<scalarBigN;k++) {
311 for (
int l=0;l<3;l++) {
312 outputValues(i,j,l) += coeffs_(k+l*scalarBigN,i) * phisCur(k,j);
322 Phis_.getValues( phisCur , inputPoints , OPERATOR_GRAD );
323 for (
int i=0;i<outputValues.dimension(0);i++) {
324 for (
int j=0;j<outputValues.dimension(1);j++) {
325 outputValues(i,j) = 0.0;
326 for (
int k=0;k<scalarBigN;k++) {
327 outputValues(i,j) += coeffs_(k,i) * phisCur(k,j,0);
328 outputValues(i,j) += coeffs_(k+scalarBigN,i) * phisCur(k,j,1);
329 outputValues(i,j) += coeffs_(k+2*scalarBigN,i) * phisCur(k,j,2);
336 TEUCHOS_TEST_FOR_EXCEPTION(
true , std::invalid_argument,
337 ">>> ERROR (Basis_HDIV_TET_In_FEM): Operator type not implemented");
341 catch (std::invalid_argument &exception){
342 TEUCHOS_TEST_FOR_EXCEPTION(
true , std::invalid_argument,
343 ">>> ERROR (Basis_HDIV_TET_In_FEM): Operator type not implemented");
350 template<
class Scalar,
class ArrayScalar>
352 const ArrayScalar & inputPoints,
353 const ArrayScalar & cellVertices,
354 const EOperator operatorType)
const {
355 TEUCHOS_TEST_FOR_EXCEPTION( (
true), std::logic_error,
356 ">>> ERROR (Basis_HDIV_TET_In_FEM): FEM Basis calling an FVD member function");
virtual void initializeTags()
Initializes tagToOrdinal_ and ordinalToTag_ lookup arrays.
FieldContainer< Scalar > coeffs_
expansion coefficients of the nodal basis in terms of the orthgonal one
virtual void getCubature(ArrayPoint &cubPoints, ArrayWeight &cubWeights) const
Returns cubature points and weights (return arrays must be pre-sized/pre-allocated).
EBasis basisType_
Type of the basis.
Defines direct integration rules on a tetrahedron.
bool basisTagsAreSet_
"true" if tagToOrdinal_ and ordinalToTag_ have been initialized
virtual int getNumPoints() const
Returns the number of cubature points.
ECoordinates basisCoordinates_
The coordinate system for which the basis is defined.
void getValues(ArrayScalar &outputValues, const ArrayScalar &inputPoints, const EOperator operatorType) const
Evaluation of a FEM basis on a reference Tetrahedron cell.
Basis_HDIV_TET_In_FEM(const int n, const EPointType pointType)
Constructor.
shards::CellTopology basisCellTopology_
Base topology of the cells for which the basis is defined. See the Shards package http://trilinos...
Basis_HGRAD_TET_Cn_FEM_ORTH< Scalar, FieldContainer< Scalar > > Phis_
Orthogonal basis out of which the nodal basis is constructed.
virtual const shards::CellTopology getBaseCellTopology() const
Returns the base cell topology for which the basis is defined. See Shards documentation http://trilin...
int basisDegree_
Degree of the largest complete polynomial space that can be represented by the basis.
int basisCardinality_
Cardinality of the basis, i.e., the number of basis functions/degrees-of-freedom. ...