51 template<
class Scalar,
class ArrayScalar>
53 const ArrayScalar & ptsClosed ,
54 const ArrayScalar & ptsOpen):
55 closedBasis_( order , ptsClosed ),
56 openBasis_( order-1 , ptsOpen ) ,
57 closedPts_( ptsClosed ),
61 this ->
basisCardinality_ = 2 * closedBasis_.getCardinality() * openBasis_.getCardinality();
62 this ->
basisCellTopology_ = shards::CellTopology(shards::getCellTopologyData<shards::Quadrilateral<4> >() );
67 Array<Array<RCP<Basis<Scalar,ArrayScalar > > > > bases(2);
68 bases[0].resize(2); bases[1].resize(2);
69 bases[0][0] = rcp( &openBasis_ ,
false );
70 bases[0][1] = rcp( &closedBasis_ ,
false );
71 bases[1][0] = rcp( &closedBasis_ ,
false );
72 bases[1][1] = rcp( &openBasis_ ,
false );
73 this->setBases( bases );
78 template<
class Scalar,
class ArrayScalar>
80 closedBasis_( order , pointType==POINTTYPE_SPECTRAL?POINTTYPE_SPECTRAL:POINTTYPE_EQUISPACED ),
81 openBasis_( order-1 , pointType==POINTTYPE_SPECTRAL?POINTTYPE_SPECTRAL_OPEN:POINTTYPE_EQUISPACED ) ,
82 closedPts_( order+1 , 1 ),
86 this ->
basisCardinality_ = 2 * closedBasis_.getCardinality() * openBasis_.getCardinality();
87 this ->
basisCellTopology_ = shards::CellTopology(shards::getCellTopologyData<shards::Quadrilateral<4> >() );
92 PointTools::getLattice<Scalar,FieldContainer<Scalar> >( closedPts_ ,
93 shards::CellTopology(shards::getCellTopologyData<shards::Line<2> >()) ,
96 pointType==POINTTYPE_SPECTRAL?POINTTYPE_WARPBLEND:POINTTYPE_EQUISPACED );
98 if (pointType == POINTTYPE_SPECTRAL)
100 PointTools::getGaussPoints<Scalar,FieldContainer<Scalar> >( openPts_ ,
105 PointTools::getLattice<Scalar,FieldContainer<Scalar> >( openPts_ ,
106 shards::CellTopology(shards::getCellTopologyData<shards::Line<2> >()) ,
109 POINTTYPE_EQUISPACED );
112 Array<Array<RCP<Basis<Scalar,ArrayScalar > > > > bases(2);
113 bases[0].resize(2); bases[1].resize(2);
114 bases[0][0] = rcp( &openBasis_ ,
false );
115 bases[0][1] = rcp( &closedBasis_ ,
false );
116 bases[1][0] = rcp( &closedBasis_ ,
false );
117 bases[1][1] = rcp( &openBasis_ ,
false );
118 this->setBases( bases );
122 template<
class Scalar,
class ArrayScalar>
131 std::vector<int> tags( tagSize * this->getCardinality() );
133 const std::vector<std::vector<int> >& closedDofTags = closedBasis_.getAllDofTags();
134 const std::vector<std::vector<int> >& openDofTags = openBasis_.getAllDofTags();
136 std::map<int,std::map<int,int> > total_dof_per_entity;
137 std::map<int,std::map<int,int> > current_dof_per_entity;
139 for (
int i=0;i<4;i++) {
140 total_dof_per_entity[0][i] = 0;
141 current_dof_per_entity[0][i] = 0;
143 for (
int i=0;i<4;i++) {
144 total_dof_per_entity[1][i] = 0;
145 current_dof_per_entity[1][i] = 0;
147 total_dof_per_entity[2][0] = 0;
148 current_dof_per_entity[2][0] = 0;
151 for (
int i=0;i<4;i++) {
152 total_dof_per_entity[1][i] = openBasis_.getCardinality();
155 total_dof_per_entity[2][0] = this->getCardinality() - 4 * openBasis_.getCardinality();
160 for (
int j=0;j<closedBasis_.getCardinality();j++)
162 const int cdim = closedDofTags[j][0];
163 const int cent = closedDofTags[j][1];
164 for (
int i=0;i<openBasis_.getCardinality();i++)
166 const int odim = openDofTags[i][0];
167 const int oent = openDofTags[i][1];
171 tags[4*tagcur] = dofdim;
172 tags[4*tagcur+1] = dofent;
173 tags[4*tagcur+2] = current_dof_per_entity[dofdim][dofent];
174 current_dof_per_entity[dofdim][dofent]++;
175 tags[4*tagcur+3] = total_dof_per_entity[dofdim][dofent];
182 for (
int j=0;j<openBasis_.getCardinality();j++)
184 const int odim = openDofTags[j][0];
185 const int oent = openDofTags[j][1];
186 for (
int i=0;i<closedBasis_.getCardinality();i++)
188 const int cdim = closedDofTags[i][0];
189 const int cent = closedDofTags[i][1];
193 tags[4*tagcur] = dofdim;
194 tags[4*tagcur+1] = dofent;
195 tags[4*tagcur+2] = current_dof_per_entity[dofdim][dofent];
196 current_dof_per_entity[dofdim][dofent]++;
197 tags[4*tagcur+3] = total_dof_per_entity[dofdim][dofent];
203 Intrepid::setOrdinalTagData(
this -> tagToOrdinal_,
204 this -> ordinalToTag_,
206 this -> basisCardinality_,
214 template<
class Scalar,
class ArrayScalar>
216 const ArrayScalar & inputPoints,
217 const EOperator operatorType)
const {
220 #ifdef HAVE_INTREPID_DEBUG
221 Intrepid::getValues_HCURL_Args<Scalar, ArrayScalar>(outputValues,
224 this -> getBaseCellTopology(),
225 this -> getCardinality() );
229 int dim0 = inputPoints.dimension(0);
235 for (
int i=0;i<dim0;i++) {
236 xPoints(i,0) = inputPoints(i,0);
237 yPoints(i,0) = inputPoints(i,1);
240 switch (operatorType) {
248 closedBasis_.getValues( closedBasisValsXPts , xPoints , OPERATOR_VALUE );
249 closedBasis_.getValues( closedBasisValsYPts , yPoints , OPERATOR_VALUE );
250 openBasis_.getValues( openBasisValsXPts , xPoints , OPERATOR_VALUE );
251 openBasis_.getValues( openBasisValsYPts , yPoints , OPERATOR_VALUE );
255 for (
int j=0;j<closedBasis_.getCardinality();j++)
257 for (
int i=0;i<openBasis_.getCardinality();i++)
259 for (
int l=0;l<dim0;l++)
261 outputValues(bfcur,l,0) = closedBasisValsYPts(j,l) * openBasisValsXPts(i,l);
262 outputValues(bfcur,l,1) = 0.0;
269 for (
int j=0;j<openBasis_.getCardinality();j++)
271 for (
int i=0;i<closedBasis_.getCardinality();i++)
273 for (
int l=0;l<dim0;l++)
275 outputValues(bfcur,l,0) = 0.0;
276 outputValues(bfcur,l,1) = openBasisValsYPts(j,l) * closedBasisValsXPts(i,l);
290 closedBasis_.getValues( closedBasisDerivsXPts , xPoints , OPERATOR_D1 );
291 closedBasis_.getValues( closedBasisDerivsYPts , yPoints , OPERATOR_D1 );
292 openBasis_.getValues( openBasisValsXPts , xPoints , OPERATOR_VALUE );
293 openBasis_.getValues( openBasisValsYPts , yPoints , OPERATOR_VALUE );
298 for (
int j=0;j<closedBasis_.getCardinality();j++)
300 for (
int i=0;i<openBasis_.getCardinality();i++)
302 for (
int l=0;l<dim0;l++) {
303 outputValues(bfcur,l) = -closedBasisDerivsYPts(j,l,0) * openBasisValsXPts(i,l);
310 for (
int j=0;j<openBasis_.getCardinality();j++)
312 for (
int i=0;i<closedBasis_.getCardinality();i++)
314 for (
int l=0;l<dim0;l++)
316 outputValues(bfcur,l) = closedBasisDerivsXPts(i,l,0) * openBasisValsYPts(j,l);
324 TEUCHOS_TEST_FOR_EXCEPTION( (operatorType == OPERATOR_DIV), std::invalid_argument,
325 ">>> ERROR (Basis_HCURL_QUAD_In_FEM): DIV is invalid operator for HCURL Basis Functions");
329 TEUCHOS_TEST_FOR_EXCEPTION( (operatorType == OPERATOR_GRAD), std::invalid_argument,
330 ">>> ERROR (Basis_HCURL_QUAD_In_FEM): GRAD is invalid operator for HCURL Basis Functions");
343 TEUCHOS_TEST_FOR_EXCEPTION( ( (operatorType == OPERATOR_D1) ||
344 (operatorType == OPERATOR_D2) ||
345 (operatorType == OPERATOR_D3) ||
346 (operatorType == OPERATOR_D4) ||
347 (operatorType == OPERATOR_D5) ||
348 (operatorType == OPERATOR_D6) ||
349 (operatorType == OPERATOR_D7) ||
350 (operatorType == OPERATOR_D8) ||
351 (operatorType == OPERATOR_D9) ||
352 (operatorType == OPERATOR_D10) ),
353 std::invalid_argument,
354 ">>> ERROR (Basis_HCURL_QUAD_In_FEM): Invalid operator type");
358 TEUCHOS_TEST_FOR_EXCEPTION( ( (operatorType != OPERATOR_VALUE) &&
359 (operatorType != OPERATOR_GRAD) &&
360 (operatorType != OPERATOR_CURL) &&
361 (operatorType != OPERATOR_CURL) &&
362 (operatorType != OPERATOR_D1) &&
363 (operatorType != OPERATOR_D2) &&
364 (operatorType != OPERATOR_D3) &&
365 (operatorType != OPERATOR_D4) &&
366 (operatorType != OPERATOR_D5) &&
367 (operatorType != OPERATOR_D6) &&
368 (operatorType != OPERATOR_D7) &&
369 (operatorType != OPERATOR_D8) &&
370 (operatorType != OPERATOR_D9) &&
371 (operatorType != OPERATOR_D10) ),
372 std::invalid_argument,
373 ">>> ERROR (Basis_HCURL_QUAD_In_FEM): Invalid operator type");
379 template<
class Scalar,
class ArrayScalar>
381 const ArrayScalar & inputPoints,
382 const ArrayScalar & cellVertices,
383 const EOperator operatorType)
const {
384 TEUCHOS_TEST_FOR_EXCEPTION( (
true), std::logic_error,
385 ">>> ERROR (Basis_HCURL_QUAD_In_FEM): FEM Basis calling an FVD member function");
388 template<
class Scalar,
class ArrayScalar>
394 for (
int j=0;j<closedPts_.dimension(0);j++)
396 for (
int i=0;i<openPts_.dimension(0);i++)
398 DofCoords(cur,0) = openPts_(i,0);
399 DofCoords(cur,1) = closedPts_(j,0);
405 for (
int j=0;j<openPts_.dimension(0);j++)
407 for (
int i=0;i<closedPts_.dimension(0);i++)
409 DofCoords(cur,0) = closedPts_(i,0);
410 DofCoords(cur,1) = openPts_(j,0);
EBasis basisType_
Type of the basis.
static void lineProduct2d(const int dim0, const int entity0, const int dim1, const int entity1, int &resultdim, int &resultentity)
bool basisTagsAreSet_
"true" if tagToOrdinal_ and ordinalToTag_ have been initialized
virtual void getDofCoords(ArrayScalar &DofCoords) const
Returns spatial locations (coordinates) of degrees of freedom on a reference cell; defined for interp...
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 Quadrilateral cell.
shards::CellTopology basisCellTopology_
Base topology of the cells for which the basis is defined. See the Shards package http://trilinos...
void initializeTags()
Initializes tagToOrdinal_ and ordinalToTag_ lookup arrays.
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. ...
Basis_HCURL_QUAD_In_FEM(int order, const ArrayScalar &ptsClosed, const ArrayScalar &ptsOpen)
Constructor.