50 #include "Teuchos_oblackholestream.hpp"
51 #include "Teuchos_RCP.hpp"
52 #include "Teuchos_GlobalMPISession.hpp"
55 using namespace Intrepid;
57 #define INTREPID_TEST_COMMAND( S , throwCounter, nException ) \
63 catch (const std::logic_error & err) { \
65 *outStream << "Expected Error " << nException << " -------------------------------------------------------------\n"; \
66 *outStream << err.what() << '\n'; \
67 *outStream << "-------------------------------------------------------------------------------" << "\n\n"; \
71 int main(
int argc,
char *argv[]) {
73 Teuchos::GlobalMPISession mpiSession(&argc, &argv);
77 int iprint = argc - 1;
78 Teuchos::RCP<std::ostream> outStream;
79 Teuchos::oblackholestream bhs;
81 outStream = Teuchos::rcp(&std::cout,
false);
83 outStream = Teuchos::rcp(&bhs,
false);
86 Teuchos::oblackholestream oldFormatState;
87 oldFormatState.copyfmt(std::cout);
90 <<
"===============================================================================\n" \
92 <<
"| Unit Test (Basis_HDIV_WEDGE_I1_FEM) |\n" \
94 <<
"| 1) Conversion of Dof tags into Dof ordinals and back |\n" \
95 <<
"| 2) Basis values for VALUE and DIV operators |\n" \
97 <<
"| Questions? Contact Pavel Bochev (pbboche@sandia.gov), |\n" \
98 <<
"| Denis Ridzal (dridzal@sandia.gov), |\n" \
99 <<
"| Kara Peterson (kjpeter@sandia.gov). |\n" \
101 <<
"| Intrepid's website: http://trilinos.sandia.gov/packages/intrepid |\n" \
102 <<
"| Trilinos website: http://trilinos.sandia.gov |\n" \
104 <<
"===============================================================================\n"\
105 <<
"| TEST 1: Basis creation, exception testing |\n"\
106 <<
"===============================================================================\n";
114 int throwCounter = 0;
118 wedgeNodes(0,0) = 0.0; wedgeNodes(0,1) = 0.0; wedgeNodes(0,2) = -1.0;
119 wedgeNodes(1,0) = 1.0; wedgeNodes(1,1) = 0.0; wedgeNodes(1,2) = -1.0;
120 wedgeNodes(2,0) = 0.0; wedgeNodes(2,1) = 1.0; wedgeNodes(2,2) = -1.0;
121 wedgeNodes(3,0) = 0.0; wedgeNodes(3,1) = 0.0; wedgeNodes(3,2) = 1.0;
122 wedgeNodes(4,0) = 1.0; wedgeNodes(4,1) = 0.0; wedgeNodes(4,2) = 1.0;
123 wedgeNodes(5,0) = 0.0; wedgeNodes(5,1) = 1.0; wedgeNodes(5,2) = 1.0;
125 wedgeNodes(6,0) = 0.25; wedgeNodes(6,1) = 0.5; wedgeNodes(6,2) = -1.0;
126 wedgeNodes(7,0) = 0.5; wedgeNodes(7,1) = 0.25; wedgeNodes(7,2) = 0.0;
127 wedgeNodes(8,0) = 0.25; wedgeNodes(8,1) = 0.25; wedgeNodes(8,2) = 1.0;
128 wedgeNodes(9,0) = 0.25; wedgeNodes(9,1) = 0.0; wedgeNodes(9,2) = 0.75;
129 wedgeNodes(10,0)= 0.0; wedgeNodes(10,1)= 0.5; wedgeNodes(10,2)= -0.25;
130 wedgeNodes(11,0)= 0.5; wedgeNodes(11,1)= 0.5; wedgeNodes(11,2)= 0.0;
140 INTREPID_TEST_COMMAND( wedgeBasis.
getValues(vals, wedgeNodes, OPERATOR_GRAD), throwCounter, nException );
143 INTREPID_TEST_COMMAND( wedgeBasis.
getValues(vals, wedgeNodes, OPERATOR_CURL), throwCounter, nException );
148 INTREPID_TEST_COMMAND( wedgeBasis.
getDofOrdinal(3,0,0), throwCounter, nException );
150 INTREPID_TEST_COMMAND( wedgeBasis.
getDofOrdinal(1,1,1), throwCounter, nException );
152 INTREPID_TEST_COMMAND( wedgeBasis.
getDofOrdinal(0,4,1), throwCounter, nException );
154 INTREPID_TEST_COMMAND( wedgeBasis.
getDofTag(11), throwCounter, nException );
156 INTREPID_TEST_COMMAND( wedgeBasis.
getDofTag(-1), throwCounter, nException );
158 #ifdef HAVE_INTREPID_DEBUG
162 INTREPID_TEST_COMMAND( wedgeBasis.
getValues(vals, badPoints1, OPERATOR_VALUE), throwCounter, nException );
166 INTREPID_TEST_COMMAND( wedgeBasis.
getValues(vals, badPoints2, OPERATOR_VALUE), throwCounter, nException );
170 INTREPID_TEST_COMMAND( wedgeBasis.
getValues(badVals1, wedgeNodes, OPERATOR_VALUE), throwCounter, nException );
174 INTREPID_TEST_COMMAND( wedgeBasis.
getValues(badVals2, wedgeNodes, OPERATOR_DIV), throwCounter, nException );
178 INTREPID_TEST_COMMAND( wedgeBasis.
getValues(badVals3, wedgeNodes, OPERATOR_VALUE), throwCounter, nException );
182 INTREPID_TEST_COMMAND( wedgeBasis.
getValues(badVals4, wedgeNodes, OPERATOR_DIV), throwCounter, nException );
186 INTREPID_TEST_COMMAND( wedgeBasis.
getValues(badVals5, wedgeNodes, OPERATOR_VALUE), throwCounter, nException );
190 INTREPID_TEST_COMMAND( wedgeBasis.
getValues(badVals6, wedgeNodes, OPERATOR_DIV), throwCounter, nException );
194 INTREPID_TEST_COMMAND( wedgeBasis.
getValues(badVals7, wedgeNodes, OPERATOR_VALUE), throwCounter, nException );
198 catch (
const std::logic_error & err) {
199 *outStream <<
"UNEXPECTED ERROR !!! ----------------------------------------------------------\n";
200 *outStream << err.what() <<
'\n';
201 *outStream <<
"-------------------------------------------------------------------------------" <<
"\n\n";
206 if (throwCounter != nException) {
208 *outStream << std::setw(70) <<
"^^^^----FAILURE!" <<
"\n";
213 <<
"===============================================================================\n"\
214 <<
"| TEST 2: correctness of tag to enum and enum to tag lookups |\n"\
215 <<
"===============================================================================\n";
218 std::vector<std::vector<int> > allTags = wedgeBasis.
getAllDofTags();
221 for (
unsigned i = 0; i < allTags.size(); i++) {
222 int bfOrd = wedgeBasis.
getDofOrdinal(allTags[i][0], allTags[i][1], allTags[i][2]);
224 std::vector<int> myTag = wedgeBasis.
getDofTag(bfOrd);
225 if( !( (myTag[0] == allTags[i][0]) &&
226 (myTag[1] == allTags[i][1]) &&
227 (myTag[2] == allTags[i][2]) &&
228 (myTag[3] == allTags[i][3]) ) ) {
230 *outStream << std::setw(70) <<
"^^^^----FAILURE!" <<
"\n";
231 *outStream <<
" getDofOrdinal( {"
232 << allTags[i][0] <<
", "
233 << allTags[i][1] <<
", "
234 << allTags[i][2] <<
", "
235 << allTags[i][3] <<
"}) = " << bfOrd <<
" but \n";
236 *outStream <<
" getDofTag(" << bfOrd <<
") = { "
240 << myTag[3] <<
"}\n";
245 for(
int bfOrd = 0; bfOrd < wedgeBasis.
getCardinality(); bfOrd++) {
246 std::vector<int> myTag = wedgeBasis.
getDofTag(bfOrd);
247 int myBfOrd = wedgeBasis.
getDofOrdinal(myTag[0], myTag[1], myTag[2]);
248 if( bfOrd != myBfOrd) {
250 *outStream << std::setw(70) <<
"^^^^----FAILURE!" <<
"\n";
251 *outStream <<
" getDofTag(" << bfOrd <<
") = { "
255 << myTag[3] <<
"} but getDofOrdinal({"
259 << myTag[3] <<
"} ) = " << myBfOrd <<
"\n";
263 catch (
const std::logic_error & err){
264 *outStream << err.what() <<
"\n\n";
270 <<
"===============================================================================\n"\
271 <<
"| TEST 3: correctness of basis function values |\n"\
272 <<
"===============================================================================\n";
274 outStream -> precision(20);
277 double basisValues[] = {
278 0, -0.500000, 0, 0, 0, 0, -0.500000, 0, 0, 0, 0, -2.00000, 0, 0, 0, \
279 0.500000, -0.500000, 0, 0.500000, 0, 0, 0, 0, 0, 0, 0, -2.00000, 0, \
280 0, 0, 0, 0, 0, 0, 0.500000, 0, -0.500000, 0.500000, 0, 0, 0, \
281 -2.00000, 0, 0, 0, 0, -0.500000, 0, 0, 0, 0, -0.500000, 0, 0, 0, 0, \
282 0, 0, 0, 2.00000, 0.500000, -0.500000, 0, 0.500000, 0, 0, 0, 0, 0, 0, \
283 0, 0, 0, 0, 2.00000, 0, 0, 0, 0, 0.500000, 0, -0.500000, 0.500000, 0, \
284 0, 0, 0, 0, 0, 2.00000, 0.125000, -0.250000, 0, 0.125000, 0.250000, \
285 0, -0.375000, 0.250000, 0, 0, 0, -2.00000, 0, 0, 0, 0.250000, \
286 -0.375000, 0, 0.250000, 0.125000, 0, -0.250000, 0.125000, 0, 0, 0, \
287 -1.00000, 0, 0, 1.00000, 0.125000, -0.375000, 0, 0.125000, 0.125000, \
288 0, -0.375000, 0.125000, 0, 0, 0, 0, 0, 0, 2.00000, 0.125000, \
289 -0.500000, 0, 0.125000, 0, 0, -0.375000, 0, 0, 0, 0, -0.250000, 0, 0, \
290 1.75000, 0, -0.250000, 0, 0, 0.250000, 0, -0.500000, 0.250000, 0, 0, \
291 0, -1.25000, 0, 0, 0.750000, 0.250000, -0.250000, 0, 0.250000, \
292 0.250000, 0, -0.250000, 0.250000, 0, 0, 0, -1.00000, 0, 0, 1.00000};
295 double basisDivs[] = {
297 1.0, 1.0, 1.0, 1.0, 1.0,
298 1.0, 1.0, 1.0, 1.0, 1.0,
299 1.0, 1.0, 1.0, 1.0, 1.0,
300 1.0, 1.0, 1.0, 1.0, 1.0,
301 1.0, 1.0, 1.0, 1.0, 1.0,
302 1.0, 1.0, 1.0, 1.0, 1.0,
304 1.0, 1.0, 1.0, 1.0, 1.0,
305 1.0, 1.0, 1.0, 1.0, 1.0,
306 1.0, 1.0, 1.0, 1.0, 1.0,
307 1.0, 1.0, 1.0, 1.0, 1.0,
308 1.0, 1.0, 1.0, 1.0, 1.0,
309 1.0, 1.0, 1.0, 1.0, 1.0
316 int numPoints = wedgeNodes.dimension(0);
323 vals.
resize(numFields, numPoints, spaceDim);
324 wedgeBasis.
getValues(vals, wedgeNodes, OPERATOR_VALUE);
325 for (
int i = 0; i < numFields; i++) {
326 for (
int j = 0; j < numPoints; j++) {
327 for (
int k = 0; k < spaceDim; k++) {
328 int l = k + i * spaceDim + j * spaceDim * numFields;
329 if (std::abs(vals(i,j,k) - basisValues[l]) > INTREPID_TOL) {
331 *outStream << std::setw(70) <<
"^^^^----FAILURE!" <<
"\n";
334 *outStream <<
" At multi-index { ";
335 *outStream << i <<
" ";*outStream << j <<
" ";*outStream << k <<
" ";
336 *outStream <<
"} computed value: " << vals(i,j,k)
337 <<
" but reference value: " << basisValues[l] <<
"\n";
345 vals.
resize(numFields, numPoints);
346 wedgeBasis.
getValues(vals, wedgeNodes, OPERATOR_DIV);
347 for (
int i = 0; i < numFields; i++) {
348 for (
int j = 0; j < numPoints; j++) {
349 int l = i + j * numFields;
350 if (std::abs(vals(i,j) - basisDivs[l]) > INTREPID_TOL) {
352 *outStream << std::setw(70) <<
"^^^^----FAILURE!" <<
"\n";
355 *outStream <<
" At multi-index { ";
356 *outStream << i <<
" ";*outStream << j <<
" ";
357 *outStream <<
"} computed divergence component: " << vals(i,j)
358 <<
" but reference divergence component: " << basisDivs[l] <<
"\n";
366 catch (
const std::logic_error & err) {
367 *outStream << err.what() <<
"\n\n";
372 std::cout <<
"End Result: TEST FAILED\n";
374 std::cout <<
"End Result: TEST PASSED\n";
377 std::cout.copyfmt(oldFormatState);
virtual const std::vector< int > & getDofTag(const int dofOrd)
DoF ordinal to DoF tag lookup.
virtual int getCardinality() const
Returns cardinality of the basis.
virtual const std::vector< std::vector< int > > & getAllDofTags()
Retrieves all DoF tags.
Header file for utility class to provide multidimensional containers.
Implementation of the default H(div)-compatible FEM basis of degree 1 on Wedge cell.
void getValues(ArrayScalar &outputValues, const ArrayScalar &inputPoints, const EOperator operatorType) const
Evaluation of a FEM basis on a reference Wedge cell.
Header file for the Intrepid::HDIV_WEDGE_I1_FEM class.
void resize(const int dim0)
Resizes FieldContainer to a rank-1 container with the specified dimension, initialized by 0...
virtual int getDofOrdinal(const int subcDim, const int subcOrd, const int subcDofOrd)
DoF tag to ordinal lookup.
virtual const shards::CellTopology getBaseCellTopology() const
Returns the base cell topology for which the basis is defined. See Shards documentation http://trilin...