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_MD_FIELD_DEF_H
00033 #define PHX_MD_FIELD_DEF_H
00034
00035 #include <algorithm>
00036 #include <sstream>
00037 #include "Teuchos_TestForException.hpp"
00038 #include "Phalanx_Print_Utilities.hpp"
00039
00040
00041 #ifdef PHX_DEBUG
00042 template<typename DataT, PHX::ArrayOrder Order,
00043 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00044 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00045 const std::string PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::m_field_tag_error_msg =
00046 "Error - PHX::MDField::fieldTag() - No tag has been set!";
00047
00048 template<typename DataT, PHX::ArrayOrder Order,
00049 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00050 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00051 const std::string PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::m_field_data_error_msg =
00052 "Error - PHX::MDField::operator[] - No data has been set! Please call getFieldData(this) on all PHX::MDField objects in providers!";
00053 #endif
00054
00055
00056 template<typename DataT, PHX::ArrayOrder Order,
00057 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00058 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00059 PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00060 MDField(const std::string& name, const Teuchos::RCP<PHX::DataLayout>& t) :
00061 m_tag(name,t)
00062 #ifdef PHX_DEBUG
00063 , m_tag_set(true),
00064 m_data_set(false)
00065 #endif
00066 { }
00067
00068
00069 template<typename DataT, PHX::ArrayOrder Order,
00070 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00071 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00072 PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00073 MDField(const PHX::Tag<DataT>& v) :
00074 m_tag(v)
00075 #ifdef PHX_DEBUG
00076 ,m_tag_set(true),
00077 m_data_set(false)
00078 #endif
00079 { }
00080
00081
00082 template<typename DataT, PHX::ArrayOrder Order,
00083 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00084 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00085 PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00086 MDField() :
00087 m_tag("???", Teuchos::null)
00088 #ifdef PHX_DEBUG
00089 ,m_tag_set(false),
00090 m_data_set(false)
00091 #endif
00092 { }
00093
00094
00095 template<typename DataT, PHX::ArrayOrder Order,
00096 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00097 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00098 PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00099 ~MDField()
00100 { }
00101
00102
00103 template<typename DataT, PHX::ArrayOrder Order,
00104 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00105 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00106 inline
00107 const PHX::FieldTag&
00108 PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00109 fieldTag() const
00110 {
00111 #ifdef PHX_DEBUG
00112 TEST_FOR_EXCEPTION(!m_tag_set, std::logic_error, m_field_tag_error_msg);
00113 #endif
00114 return m_tag;
00115 }
00116
00117
00118 template<typename DataT, PHX::ArrayOrder Order,
00119 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00120 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00121 inline
00122 DataT& PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00123 operator()(size_type index1, size_type index2, size_type index3,
00124 size_type index4, size_type index5, size_type index6,
00125 size_type index7, size_type index8)
00126 {
00127 #ifdef PHX_DEBUG
00128 TEST_FOR_EXCEPTION(!m_data_set, std::logic_error, m_field_data_error_msg);
00129 #endif
00130 return m_field_data(index1,index2,index3,index4,index5,index6,index7,index8);
00131 }
00132
00133
00134 template<typename DataT, PHX::ArrayOrder Order,
00135 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00136 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00137 inline
00138 DataT& PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00139 operator()(size_type index1, size_type index2, size_type index3,
00140 size_type index4, size_type index5, size_type index6,
00141 size_type index7)
00142 {
00143 #ifdef PHX_DEBUG
00144 TEST_FOR_EXCEPTION(!m_data_set, std::logic_error, m_field_data_error_msg);
00145 #endif
00146 return m_field_data(index1,index2,index3,index4,index5,index6,index7);
00147 }
00148
00149
00150 template<typename DataT, PHX::ArrayOrder Order,
00151 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00152 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00153 inline
00154 DataT& PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00155 operator()(size_type index1, size_type index2, size_type index3,
00156 size_type index4, size_type index5, size_type index6)
00157 {
00158 #ifdef PHX_DEBUG
00159 TEST_FOR_EXCEPTION(!m_data_set, std::logic_error, m_field_data_error_msg);
00160 #endif
00161 return m_field_data(index1,index2,index3,index4,index5,index6);
00162 }
00163
00164
00165 template<typename DataT, PHX::ArrayOrder Order,
00166 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00167 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00168 inline
00169 DataT& PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00170 operator()(size_type index1, size_type index2, size_type index3,
00171 size_type index4, size_type index5)
00172 {
00173 #ifdef PHX_DEBUG
00174 TEST_FOR_EXCEPTION(!m_data_set, std::logic_error, m_field_data_error_msg);
00175 #endif
00176 return m_field_data(index1,index2,index3,index4,index5);
00177 }
00178
00179
00180 template<typename DataT, PHX::ArrayOrder Order,
00181 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00182 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00183 inline
00184 DataT& PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00185 operator()(size_type index1, size_type index2, size_type index3,
00186 size_type index4)
00187 {
00188 #ifdef PHX_DEBUG
00189 TEST_FOR_EXCEPTION(!m_data_set, std::logic_error, m_field_data_error_msg);
00190 #endif
00191 return m_field_data(index1,index2,index3,index4);
00192 }
00193
00194
00195 template<typename DataT, PHX::ArrayOrder Order,
00196 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00197 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00198 inline
00199 DataT& PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00200 operator()(size_type index1, size_type index2, size_type index3)
00201 {
00202 #ifdef PHX_DEBUG
00203 TEST_FOR_EXCEPTION(!m_data_set, std::logic_error, m_field_data_error_msg);
00204 #endif
00205 return m_field_data(index1,index2,index3);
00206 }
00207
00208
00209 template<typename DataT, PHX::ArrayOrder Order,
00210 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00211 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00212 inline
00213 DataT& PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00214 operator()(size_type index1, size_type index2)
00215 {
00216 #ifdef PHX_DEBUG
00217 TEST_FOR_EXCEPTION(!m_data_set, std::logic_error, m_field_data_error_msg);
00218 #endif
00219 return m_field_data(index1,index2);
00220 }
00221
00222
00223 template<typename DataT, PHX::ArrayOrder Order,
00224 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00225 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00226 inline
00227 DataT& PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00228 operator()(size_type index1)
00229 {
00230 #ifdef PHX_DEBUG
00231 TEST_FOR_EXCEPTION(!m_data_set, std::logic_error, m_field_data_error_msg);
00232 #endif
00233 return m_field_data(index1);
00234 }
00235
00236
00237 template<typename DataT, PHX::ArrayOrder Order,
00238 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00239 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00240 inline
00241 DataT& PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00242 operator[](size_type index)
00243 {
00244 #ifdef PHX_DEBUG
00245 TEST_FOR_EXCEPTION(!m_data_set, std::logic_error, m_field_data_error_msg);
00246 #endif
00247 return m_field_data[index];
00248 }
00249
00250
00251 template<typename DataT, PHX::ArrayOrder Order,
00252 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00253 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00254 inline
00255 typename PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::size_type
00256 PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00257 dimension(size_type ord) const
00258 {
00259 #ifdef PHX_DEBUG
00260 TEST_FOR_EXCEPTION(!m_tag_set, std::logic_error, m_field_data_error_msg);
00261 TEST_FOR_EXCEPTION(!m_data_set, std::logic_error, m_field_data_error_msg);
00262 #endif
00263 return m_field_data.dimension(ord);
00264 }
00265
00266
00267 template<typename DataT, PHX::ArrayOrder Order,
00268 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00269 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00270 inline
00271 void PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00272 dimensions(std::vector<size_type>& dims)
00273 {
00274 #ifdef PHX_DEBUG
00275 TEST_FOR_EXCEPTION(!m_tag_set, std::logic_error, m_field_data_error_msg);
00276 TEST_FOR_EXCEPTION(!m_data_set, std::logic_error, m_field_data_error_msg);
00277 #endif
00278 m_field_data.dimensions(dims);
00279 }
00280
00281
00282 template<typename DataT, PHX::ArrayOrder Order,
00283 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00284 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00285 inline
00286 typename PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::size_type
00287 PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::size() const
00288 {
00289 #ifdef PHX_DEBUG
00290 TEST_FOR_EXCEPTION(!m_data_set, std::logic_error, m_field_data_error_msg);
00291 #endif
00292 return m_field_data.size();
00293 }
00294
00295
00296 template<typename DataT, PHX::ArrayOrder Order,
00297 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00298 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00299 void PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00300 setFieldTag(const PHX::Tag<DataT>& v)
00301 {
00302 #ifdef PHX_DEBUG
00303 m_tag_set = true;
00304 #endif
00305 m_tag = v;
00306 }
00307
00308
00309 template<typename DataT, PHX::ArrayOrder Order,
00310 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00311 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00312 void PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00313 setFieldData(const Teuchos::ArrayRCP<DataT>& d)
00314 {
00315 #ifdef PHX_DEBUG
00316 TEST_FOR_EXCEPTION(!m_tag_set, std::logic_error, m_field_tag_error_msg);
00317 m_data_set = true;
00318 #endif
00319
00320 m_array_rcp = d;
00321
00322 std::vector<size_type> data_layout_dim;
00323 m_tag.dataLayout().dimensions(data_layout_dim);
00324
00325 std::vector<size_type> array_dim;
00326 size_type num_cells = d.size() / m_tag.dataLayout().size();
00327
00328 if (Order == PHX::NaturalOrder)
00329 array_dim.push_back(num_cells);
00330 for (std::size_t i = 0; i < data_layout_dim.size(); ++i)
00331 array_dim.push_back(data_layout_dim[i]);
00332 if (Order == PHX::FortranOrder)
00333 array_dim.push_back(num_cells);
00334
00335 TEST_FOR_EXCEPTION(array_dim.size() != (data_layout_dim.size() + 1),
00336 std::logic_error,
00337 "Rank mismatch between array_dim and data_layout_dim! Please check your ArrayOrder. It must be Natural or Reverse!");
00338
00339 if (array_type::Rank != (data_layout_dim.size() + 1) ) {
00340 std::ostringstream os;
00341 os << "Array rank must be equal to the DataLayout rank + 1.\n"
00342 << "Array rank = " << array_type::Rank
00343 << ", data layout rank = " << data_layout_dim.size() << " + 1 = "
00344 << (data_layout_dim.size() + 1) << std::endl
00345 << "Offending MDField:\n"
00346 << *this << std::endl;
00347 TEST_FOR_EXCEPTION(array_type::Rank != (data_layout_dim.size() + 1),
00348 std::logic_error, os.str());
00349 }
00350
00351 typename
00352 PHX::Array<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>
00353 array(d.get(), &array_dim[0]);
00354
00355 m_field_data = array;
00356
00357 }
00358
00359
00360 template<typename DataT, PHX::ArrayOrder Order,
00361 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00362 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00363 void PHX::MDField<DataT,Order,Tag0,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>::
00364 print(std::ostream& os, bool printValues) const
00365 {
00366
00367 std::vector<const char*> dim_names;
00368
00369 PHX::PrintDimension<Tag0,array_type> pd0;
00370 pd0.addName(dim_names);
00371 PHX::PrintDimension<Tag1,array_type> pd1;
00372 pd1.addName(dim_names);
00373 PHX::PrintDimension<Tag2,array_type> pd2;
00374 pd2.addName(dim_names);
00375 PHX::PrintDimension<Tag3,array_type> pd3;
00376 pd3.addName(dim_names);
00377 PHX::PrintDimension<Tag4,array_type> pd4;
00378 pd4.addName(dim_names);
00379 PHX::PrintDimension<Tag5,array_type> pd5;
00380 pd5.addName(dim_names);
00381 PHX::PrintDimension<Tag6,array_type> pd6;
00382 pd6.addName(dim_names);
00383 PHX::PrintDimension<Tag7,array_type> pd7;
00384 pd7.addName(dim_names);
00385
00386 os << "MDField<";
00387
00388 for (std::size_t i=0; i < dim_names.size(); ++i) {
00389 if (i > 0)
00390 os << ",";
00391 os << std::string(dim_names[i]);
00392 }
00393 os << ">(";
00394 for (std::size_t i=0; i < dim_names.size(); ++i) {
00395 if (i > 0)
00396 os << ",";
00397 os << m_field_data.dimension(i);
00398 }
00399 os << "): ";
00400
00401 os << m_tag;
00402
00403 if (printValues) {
00404 os << std::endl;
00405 for (std::size_t i = 0; i < m_field_data.size(); ++i)
00406 os << "value[" << i << "] = " << m_field_data[i] << std::endl;
00407 }
00408
00409 }
00410
00411
00412 template<typename DataT, PHX::ArrayOrder Order,
00413 typename Tag0,typename Tag1, typename Tag2, typename Tag3,
00414 typename Tag4,typename Tag5, typename Tag6, typename Tag7>
00415 std::ostream& PHX::operator<<(std::ostream& os,
00416 const PHX::MDField<DataT,Order,Tag0,Tag1,
00417 Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>& f)
00418 {
00419 f.print(os, false);
00420 return os;
00421 }
00422
00423
00424
00425 #endif