52 #include "Shards_Array.hpp"
53 #include "Teuchos_oblackholestream.hpp"
54 #include "Teuchos_RCP.hpp"
55 #include "Teuchos_GlobalMPISession.hpp"
58 using namespace Intrepid;
60 SHARDS_ARRAY_DIM_TAG_SIMPLE_DECLARATION( Cell )
61 SHARDS_ARRAY_DIM_TAG_SIMPLE_IMPLEMENTATION( Cell )
63 SHARDS_ARRAY_DIM_TAG_SIMPLE_DECLARATION( Field )
64 SHARDS_ARRAY_DIM_TAG_SIMPLE_IMPLEMENTATION( Field )
66 SHARDS_ARRAY_DIM_TAG_SIMPLE_DECLARATION( Point )
67 SHARDS_ARRAY_DIM_TAG_SIMPLE_IMPLEMENTATION( Point )
69 SHARDS_ARRAY_DIM_TAG_SIMPLE_DECLARATION( Dim )
70 SHARDS_ARRAY_DIM_TAG_SIMPLE_IMPLEMENTATION( Dim )
72 #define INTREPID_TEST_COMMAND( S ) \
77 catch (const std::logic_error & err) { \
78 *outStream << "Expected Error ----------------------------------------------------------------\n"; \
79 *outStream << err.what() << '\n'; \
80 *outStream << "-------------------------------------------------------------------------------" << "\n\n"; \
85 int main(
int argc,
char *argv[]) {
87 Teuchos::GlobalMPISession mpiSession(&argc, &argv);
90 int iprint = argc - 1;
92 Teuchos::RCP<std::ostream> outStream;
93 Teuchos::oblackholestream bhs;
96 outStream = Teuchos::rcp(&std::cout,
false);
98 outStream = Teuchos::rcp(&bhs,
false);
101 Teuchos::oblackholestream oldFormatState;
102 oldFormatState.copyfmt(std::cout);
105 <<
"===============================================================================\n" \
107 <<
"| Unit Test FieldContainer |\n" \
109 <<
"| 1) Testing usage of various constructors / wrappers |\n" \
110 <<
"| 2) Testing usage of resize |\n" \
112 <<
"| Questions? Contact Pavel Bochev (pbboche@sandia.gov) or |\n" \
113 <<
"| Denis Ridzal (dridzal@sandia.gov). |\n" \
115 <<
"| Intrepid's website: http://trilinos.sandia.gov/packages/intrepid |\n" \
116 <<
"| Trilinos website: http://trilinos.sandia.gov |\n" \
118 <<
"===============================================================================\n";
124 double zero = INTREPID_TOL;
129 Teuchos::Array<int> dimensions;
132 <<
"===============================================================================\n"\
133 <<
"| TEST 1: Constructors / Wrappers for a particular rank-4 container |\n"\
134 <<
"===============================================================================\n\n";
139 dimensions.resize(4);
146 Teuchos::Array<double> data(dimensions[0]*dimensions[1]*dimensions[2]*dimensions[3]);
152 fc_array(1,1,1,1) = 1.0;
154 if (std::abs(data[dimensions[1]*dimensions[2]*dimensions[3] + dimensions[2]*dimensions[3] + dimensions[3] + 1]) > zero) {
155 *outStream <<
"\n\nError in constructor using Array (ArrayView) and deep copy.\n\n";
160 if (std::abs((fc_array.getData())[dimensions[1]*dimensions[2]*dimensions[3] +
161 dimensions[2]*dimensions[3] + dimensions[3] + 1] - fc_array(1,1,1,1)) > zero) {
162 *outStream <<
"\n\nError in getData() member of FieldContainer.\n\n";
167 Teuchos::RCP< Teuchos::Array<double> > rcp_to_data = rcpFromRef(data);
168 Teuchos::ArrayRCP<double> arrayrcp = Teuchos::arcp(rcp_to_data);
172 fc_arrayrcp_deep(1,1,1,1) = 1.0;
174 if (std::abs(data[dimensions[1]*dimensions[2]*dimensions[3] + dimensions[2]*dimensions[3] + dimensions[3] + 1]) > zero) {
175 *outStream <<
"\n\nError in constructor using ArrayRCP (ArrayView) and deep copy.\n\n";
182 fc_arrayrcp_shallow(1,1,1,1) = 1.0;
184 if (std::abs(data[dimensions[1]*dimensions[2]*dimensions[3] + dimensions[2]*dimensions[3] + dimensions[3] + 1] - fc_arrayrcp_shallow(1,1,1,1)) > zero) {
185 *outStream <<
"\n\nError in constructor using ArrayRCP and shallow copy.\n\n";
192 fc_scalarptr_deep(1,1,1,1) = 2.0;
194 if (std::abs(data[dimensions[1]*dimensions[2]*dimensions[3] + dimensions[2]*dimensions[3] + dimensions[3] + 1] - 1.0) > zero) {
195 *outStream <<
"\n\nError in constructor using Scalar* and deep copy.\n\n";
202 fc_scalarptr_shallow(1,1,1,1) = 2.0;
204 if (std::abs(data[dimensions[1]*dimensions[2]*dimensions[3] + dimensions[2]*dimensions[3] + dimensions[3] + 1] - fc_scalarptr_shallow(1,1,1,1)) > zero) {
205 *outStream <<
"\n\nError in constructor using Scalar* and shallow copy.\n\n";
210 shards::Array<double,shards::NaturalOrder,Cell,Field,Point,Dim> shards_array(data.getRawPtr(),dimensions[0],dimensions[1],dimensions[2],dimensions[3]);
213 fc_shards_deep(1,1,1,1) = 3.0;
215 if (std::abs(data[dimensions[1]*dimensions[2]*dimensions[3] + dimensions[2]*dimensions[3] + dimensions[3] + 1] - 2.0) > zero) {
216 *outStream <<
"\n\nError in constructor using shards::Array and deep copy.\n\n";
223 fc_shards_shallow(1,1,1,1) = 3.0;
225 if (std::abs(data[dimensions[1]*dimensions[2]*dimensions[3] + dimensions[2]*dimensions[3] + dimensions[3] + 1] - fc_shards_shallow(1,1,1,1)) > zero) {
226 *outStream <<
"\n\nError in constructor using shards::Array and shallow copy.\n\n";
234 <<
"===============================================================================\n"\
235 <<
"| TEST 1 cont'd: Run through constructors / wrappers of various ranks |\n"\
236 <<
"===============================================================================\n\n";
238 for (
int rank=0; rank<10; rank++) {
239 dimensions.resize(rank);
244 for (
int dim=0; dim<rank; dim++) {
246 total_size *= dimensions[dim];
250 Teuchos::Array<double> data(total_size);
255 Teuchos::RCP< Teuchos::Array<double> > rcp_to_data = rcpFromRef(data);
256 Teuchos::ArrayRCP<double> arrayrcp = Teuchos::arcp(rcp_to_data);
269 Teuchos::Array<double> data(2*2*2*2*2*2);
270 shards::Array<double,shards::NaturalOrder,Cell> shards_array_c(&data[0],2);
271 shards::Array<double,shards::NaturalOrder,Cell,Field> shards_array_cf(&data[0],2,2);
272 shards::Array<double,shards::NaturalOrder,Cell,Field,Point> shards_array_cfp(&data[0],2,2,2);
273 shards::Array<double,shards::NaturalOrder,Cell,Field,Point,Dim> shards_array_cfpd(&data[0],2,2,2,2);
274 shards::Array<double,shards::NaturalOrder,Cell,Field,Point,Dim,Dim> shards_array_cfpdd(&data[0],2,2,2,2,2);
275 shards::Array<double,shards::NaturalOrder,Cell,Field,Point,Dim,Dim,Dim> shards_array_cfpddd(&data[0],2,2,2,2,2,2);
293 <<
"===============================================================================\n"\
294 <<
"| TEST 2: Usage of resize |\n"\
295 <<
"===============================================================================\n\n";
299 dimensions.resize(5);
310 Teuchos::Array<double> data(dimensions[0]*dimensions[1]*dimensions[2]*dimensions[3]*dimensions[4]);
315 double mod_entry = 1.0;
316 fc_array(1,1,1,1,1) = mod_entry;
317 int enumeration = fc_array.getEnumeration(1,1,1,1,1);
321 fc_array.resize(dimensions[0]*dimensions[1], dimensions[2], dimensions[3], dimensions[4]);
323 fc_array.getMultiIndex(d0,d1,d2,d3, enumeration);
324 if (std::abs(fc_array(d0,d1,d2,d3) - mod_entry) > zero) {
325 *outStream <<
"\n\nError in resize.\n\n";
331 fc_array.resize(dimensions[0]*dimensions[1]*dimensions[2], dimensions[3], dimensions[4]);
333 fc_array.getMultiIndex(d0,d1,d2, enumeration);
334 if (std::abs(fc_array(d0,d1,d2) - mod_entry) > zero) {
335 *outStream <<
"\n\nError in resize.\n\n";
341 fc_array.resize(dimensions[0]*dimensions[1]*dimensions[2]*dimensions[3], dimensions[4]);
343 fc_array.getMultiIndex(d0,d1, enumeration);
344 if (std::abs(fc_array(d0,d1) - mod_entry) > zero) {
345 *outStream <<
"\n\nError in resize.\n\n";
351 fc_array.resize(dimensions[0]*dimensions[1]*dimensions[2]*dimensions[3]*dimensions[4]);
353 fc_array.getMultiIndex(d0, enumeration);
354 if (std::abs(fc_array(d0) - mod_entry) > zero) {
355 *outStream <<
"\n\nError in resize.\n\n";
360 data.assign(dimensions[0]*dimensions[1]*dimensions[2]*dimensions[3]*dimensions[4], 3.0);
361 shards::Array<double,shards::NaturalOrder,Cell,Field,Point,Dim,Dim>
362 shards_array(data.getRawPtr(),dimensions[0],dimensions[1],dimensions[2],dimensions[3],dimensions[4]);
365 fc_shards_shallow.resize(4,4,4,4,4);
366 fc_shards_shallow.resize(4*4*4*4*4);
369 *outStream <<
"\n\nError in resize.\n\n";
378 catch (
const std::logic_error & err) {
379 *outStream <<
"UNEXPECTED ERROR !!! ----------------------------------------------------------\n";
380 *outStream << err.what() <<
"\n";
381 *outStream <<
"-------------------------------------------------------------------------------" <<
"\n\n";
386 std::cout <<
"End Result: TEST FAILED\n";
388 std::cout <<
"End Result: TEST PASSED\n";
391 std::cout.copyfmt(oldFormatState);
Header file for utility class to provide multidimensional containers.