00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef PHX_DATA_LAYOUT_MDALAYOUT_DEF
00033 #define PHX_DATA_LAYOUT_MDALAYOUT_DEF
00034
00035 #include <iostream>
00036 #include <sstream>
00037 #include <typeinfo>
00038 #include "Teuchos_TestForException.hpp"
00039
00040
00041 namespace PHX{
00042
00043 template<> struct
00044 Check_num_ctor_arguments_equal_to_num_template_arguments<8,8> {};
00045 template<> struct
00046 Check_num_ctor_arguments_equal_to_num_template_arguments<7,7> {};
00047 template<> struct
00048 Check_num_ctor_arguments_equal_to_num_template_arguments<6,6> {};
00049 template<> struct
00050 Check_num_ctor_arguments_equal_to_num_template_arguments<5,5> {};
00051 template<> struct
00052 Check_num_ctor_arguments_equal_to_num_template_arguments<4,4> {};
00053 template<> struct
00054 Check_num_ctor_arguments_equal_to_num_template_arguments<3,3> {};
00055 template<> struct
00056 Check_num_ctor_arguments_equal_to_num_template_arguments<2,2> {};
00057 template<> struct
00058 Check_num_ctor_arguments_equal_to_num_template_arguments<1,1> {};
00059 }
00060
00061 namespace PHX{
00062
00063 template<typename T0, typename T1, typename T2, typename T3,
00064 typename T4, typename T5, typename T6, typename T7>
00065 struct DLTagList
00066 { enum { Rank = 8 }; };
00067
00068 template<typename T0, typename T1, typename T2, typename T3,
00069 typename T4, typename T5, typename T6>
00070 struct DLTagList<T0,T1,T2,T3,T4,T5,T6,void>
00071 { enum { Rank = 7 }; };
00072
00073 template<typename T0, typename T1, typename T2, typename T3,
00074 typename T4, typename T5>
00075 struct DLTagList<T0,T1,T2,T3,T4,T5,void,void>
00076 { enum { Rank = 6 }; };
00077
00078 template<typename T0, typename T1, typename T2, typename T3,
00079 typename T4>
00080 struct DLTagList<T0,T1,T2,T3,T4,void,void,void>
00081 { enum { Rank = 5 }; };
00082
00083 template<typename T0, typename T1, typename T2, typename T3>
00084 struct DLTagList<T0,T1,T2,T3,void,void,void,void>
00085 { enum { Rank = 4 }; };
00086
00087 template<typename T0, typename T1, typename T2>
00088 struct DLTagList<T0,T1,T2,void,void,void,void,void>
00089 { enum { Rank = 3 }; };
00090
00091 template<typename T0, typename T1>
00092 struct DLTagList<T0,T1,void,void,void,void,void,void>
00093 { enum { Rank = 2 }; };
00094
00095 template<typename T0>
00096 struct DLTagList<T0,void,void,void,void,void,void,void>
00097 { enum { Rank = 1 }; };
00098 }
00099
00100 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00101 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00102 PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00103 MDALayout(size_type size1, size_type size2, size_type size3,
00104 size_type size4, size_type size5, size_type size6,
00105 size_type size7, size_type size8)
00106 {
00107 PHX::Check_num_ctor_arguments_equal_to_num_template_arguments<Rank,8>();
00108
00109 m_dim_size[0] = size1;
00110 m_dim_size[1] = size2;
00111 m_dim_size[2] = size3;
00112 m_dim_size[3] = size4;
00113 m_dim_size[4] = size5;
00114 m_dim_size[5] = size6;
00115 m_dim_size[6] = size7;
00116 m_dim_size[7] = size8;
00117
00118 m_dim_name.push_back(Tag0::tag().name());
00119 m_dim_name.push_back(Tag1::tag().name());
00120 m_dim_name.push_back(Tag2::tag().name());
00121 m_dim_name.push_back(Tag3::tag().name());
00122 m_dim_name.push_back(Tag4::tag().name());
00123 m_dim_name.push_back(Tag5::tag().name());
00124 m_dim_name.push_back(Tag6::tag().name());
00125 m_dim_name.push_back(Tag7::tag().name());
00126
00127 m_size = size1 * size2 * size3 * size4 * size5 * size6 * size7 * size8;
00128
00129 m_identifier = this->createIdentifier();
00130 }
00131
00132
00133 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00134 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00135 PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00136 MDALayout(size_type size1, size_type size2, size_type size3,
00137 size_type size4, size_type size5, size_type size6,
00138 size_type size7)
00139 {
00140 PHX::Check_num_ctor_arguments_equal_to_num_template_arguments<Rank,7>();
00141
00142 m_dim_size[0] = size1;
00143 m_dim_size[1] = size2;
00144 m_dim_size[2] = size3;
00145 m_dim_size[3] = size4;
00146 m_dim_size[4] = size5;
00147 m_dim_size[5] = size6;
00148 m_dim_size[6] = size7;
00149
00150 m_dim_name.push_back(Tag0::tag().name());
00151 m_dim_name.push_back(Tag1::tag().name());
00152 m_dim_name.push_back(Tag2::tag().name());
00153 m_dim_name.push_back(Tag3::tag().name());
00154 m_dim_name.push_back(Tag4::tag().name());
00155 m_dim_name.push_back(Tag5::tag().name());
00156 m_dim_name.push_back(Tag6::tag().name());
00157
00158 m_size = size1 * size2 * size3 * size4 * size5 * size6 * size7;
00159
00160 m_identifier = this->createIdentifier();
00161 }
00162
00163
00164 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00165 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00166 PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00167 MDALayout(size_type size1, size_type size2, size_type size3,
00168 size_type size4, size_type size5, size_type size6)
00169 {
00170 PHX::Check_num_ctor_arguments_equal_to_num_template_arguments<Rank,6>();
00171
00172 m_dim_size[0] = size1;
00173 m_dim_size[1] = size2;
00174 m_dim_size[2] = size3;
00175 m_dim_size[3] = size4;
00176 m_dim_size[4] = size5;
00177 m_dim_size[5] = size6;
00178
00179 m_dim_name.push_back(Tag0::tag().name());
00180 m_dim_name.push_back(Tag1::tag().name());
00181 m_dim_name.push_back(Tag2::tag().name());
00182 m_dim_name.push_back(Tag3::tag().name());
00183 m_dim_name.push_back(Tag4::tag().name());
00184 m_dim_name.push_back(Tag5::tag().name());
00185
00186 m_size = size1 * size2 * size3 * size4 * size5 * size6;
00187
00188 m_identifier = this->createIdentifier();
00189 }
00190
00191
00192 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00193 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00194 PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00195 MDALayout(size_type size1, size_type size2, size_type size3,
00196 size_type size4, size_type size5)
00197 {
00198 PHX::Check_num_ctor_arguments_equal_to_num_template_arguments<Rank,5>();
00199
00200 m_dim_size[0] = size1;
00201 m_dim_size[1] = size2;
00202 m_dim_size[2] = size3;
00203 m_dim_size[3] = size4;
00204 m_dim_size[4] = size5;
00205
00206 m_dim_name.push_back(Tag0::tag().name());
00207 m_dim_name.push_back(Tag1::tag().name());
00208 m_dim_name.push_back(Tag2::tag().name());
00209 m_dim_name.push_back(Tag3::tag().name());
00210 m_dim_name.push_back(Tag4::tag().name());
00211
00212 m_size = size1 * size2 * size3 * size4 * size5;
00213
00214 m_identifier = this->createIdentifier();
00215 }
00216
00217
00218 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00219 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00220 PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00221 MDALayout(size_type size1, size_type size2, size_type size3,
00222 size_type size4)
00223 {
00224 PHX::Check_num_ctor_arguments_equal_to_num_template_arguments<Rank,4>();
00225
00226 m_dim_size[0] = size1;
00227 m_dim_size[1] = size2;
00228 m_dim_size[2] = size3;
00229 m_dim_size[3] = size4;
00230
00231 m_dim_name.push_back(Tag0::tag().name());
00232 m_dim_name.push_back(Tag1::tag().name());
00233 m_dim_name.push_back(Tag2::tag().name());
00234 m_dim_name.push_back(Tag3::tag().name());
00235
00236 m_size = size1 * size2 * size3 * size4;
00237
00238 m_identifier = this->createIdentifier();
00239 }
00240
00241
00242 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00243 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00244 PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00245 MDALayout(size_type size1, size_type size2, size_type size3)
00246 {
00247 PHX::Check_num_ctor_arguments_equal_to_num_template_arguments<Rank,3>();
00248
00249 m_dim_size[0] = size1;
00250 m_dim_size[1] = size2;
00251 m_dim_size[2] = size3;
00252
00253 m_dim_name.push_back(Tag0::tag().name());
00254 m_dim_name.push_back(Tag1::tag().name());
00255 m_dim_name.push_back(Tag2::tag().name());
00256
00257 m_size = size1 * size2 * size3;
00258
00259 m_identifier = this->createIdentifier();
00260 }
00261
00262
00263 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00264 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00265 PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00266 MDALayout(size_type size1, size_type size2)
00267 {
00268 PHX::Check_num_ctor_arguments_equal_to_num_template_arguments<Rank,2>();
00269
00270 m_dim_size[0] = size1;
00271 m_dim_size[1] = size2;
00272
00273 m_dim_name.push_back(Tag0::tag().name());
00274 m_dim_name.push_back(Tag1::tag().name());
00275
00276 m_size = size1 * size2;
00277
00278 m_identifier = this->createIdentifier();
00279 }
00280
00281
00282 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00283 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00284 PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00285 MDALayout(size_type size1)
00286 {
00287 PHX::Check_num_ctor_arguments_equal_to_num_template_arguments<Rank,1>();
00288
00289 m_dim_size[0] = size1;
00290
00291 m_dim_name.push_back(Tag0::tag().name());
00292
00293 m_size = size1;
00294
00295 m_identifier = this->createIdentifier();
00296 }
00297
00298
00299 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00300 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00301 bool PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00302 operator==(const PHX::DataLayout& right) const
00303 {
00304 const PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>* tmp = 0;
00305 tmp = dynamic_cast< const PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>* >(&right);
00306
00307 if (tmp == 0)
00308 return false;
00309
00310 for (size_type i=0; i < Rank; ++i)
00311 if (m_dim_size[i] != tmp->m_dim_size[i])
00312 return false;
00313
00314 return (this->size() == tmp->size());
00315 }
00316
00317
00318 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00319 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00320 PHX::DataLayout::size_type
00321 PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::rank() const
00322 { return Rank; }
00323
00324
00325 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00326 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00327 void PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00328 dimensions(std::vector<size_type>& dim) const
00329 {
00330 dim.resize(Rank);
00331 for(std::size_t i=0; i < dim.size(); ++i)
00332 dim[i] = m_dim_size[i];
00333 }
00334
00335
00336 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00337 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00338 PHX::DataLayout::size_type PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00339 size() const
00340 { return m_size; }
00341
00342
00343 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00344 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00345 std::string PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00346 identifier() const
00347 {
00348 return m_identifier;
00349 }
00350
00351
00352 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00353 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00354 PHX::DataLayout::size_type
00355 PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00356 dimension(size_type ordinal) const
00357 {
00358 if (ordinal > Rank-1 || ordinal < 0) {
00359 std::ostringstream os;
00360 os << "Requested Ordinal " << ordinal
00361 << " is outside the valid range of 0 - " << Rank - 1
00362 << " in DataLayout object:\n"
00363 << m_identifier << std::endl;
00364 TEST_FOR_EXCEPTION(ordinal > Rank-1 || ordinal < 0,
00365 std::logic_error, os.str());
00366 }
00367
00368 return m_dim_size[ordinal];
00369 }
00370
00371
00372 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00373 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00374 void PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00375 print(std::ostream& os, int offset) const
00376 {
00377 os << m_identifier;
00378 }
00379
00380
00381 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00382 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00383 std::string PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00384 createIdentifier()
00385 {
00386 std::ostringstream os;
00387 os << "MDA<";
00388 for (std::size_t i=0; i < m_dim_name.size(); ++i) {
00389 if (i > 0)
00390 os << ",";
00391 os << std::string(m_dim_name[i]);
00392 }
00393 os << ">(";
00394 for (size_type i=0; i < Rank; ++i) {
00395 if (i > 0)
00396 os << ",";
00397 os << m_dim_size[i];
00398 }
00399 os << ")";
00400
00401 return os.str();
00402 }
00403
00404
00405 template<typename Tag0, typename Tag1, typename Tag2, typename Tag3,
00406 typename Tag4, typename Tag5, typename Tag6, typename Tag7>
00407 std::ostream& PHX::operator<<(std::ostream& os,
00408 const PHX::MDALayout<Tag0,Tag1,Tag2,Tag3,Tag4,
00409 Tag5,Tag6,Tag7>& v)
00410 {
00411 v.print(os,0);
00412 return os;
00413 }
00414
00415
00416
00417 #endif