43 #ifndef __Panzer_ReorderADValues_Evaluator_impl_hpp__
44 #define __Panzer_ReorderADValues_Evaluator_impl_hpp__
48 #include "Teuchos_Assert.hpp"
49 #include "Teuchos_FancyOStream.hpp"
53 #include "Phalanx_DataLayout.hpp"
55 template<
typename EvalT,
typename TRAITS>
58 const std::vector<std::string> & inFieldNames,
67 for (std::size_t eq = 0; eq < inFieldNames.size(); ++eq) {
72 this->addDependentField(inFields_[eq]);
73 this->addEvaluatedField(outFields_[eq]);
76 this->setName(outPrefix+
" Reorder AD Values");
80 template<
typename EvalT,
typename TRAITS>
83 const std::vector<std::string> & inFieldNames,
84 const std::vector<std::string> & inDOFs,
85 const std::vector<std::string> & outDOFs,
95 for (std::size_t eq = 0; eq < inFieldNames.size(); ++eq) {
100 this->addDependentField(inFields_[eq]);
101 this->addEvaluatedField(outFields_[eq]);
104 this->setName(
"Reorder AD Values");
108 template<
typename EvalT,
typename TRAITS>
112 for(std::size_t i = 0; i < inFields_.size(); ++i)
113 outFields_[i].deep_copy(inFields_[i]);
120 template<
typename TRAITS>
123 const std::vector<std::string> & inFieldNames,
125 const std::string & elementBlock,
134 for (std::size_t eq = 0; eq < inFieldNames.size(); ++eq) {
140 this->addEvaluatedField(outFields_[eq]);
143 buildSrcToDestMap(elementBlock,
147 this->setName(outPrefix+
" Reorder AD Values");
152 template<
typename TRAITS>
155 const std::vector<std::string> & inFieldNames,
156 const std::vector<std::string> & inDOFs,
157 const std::vector<std::string> & outDOFs,
159 const std::string & elementBlock,
167 std::map<int,int> fieldNumberMaps;
168 for (std::size_t eq = 0; eq < inFieldNames.size(); ++eq) {
173 this->addDependentField(inFields_[eq]);
174 this->addEvaluatedField(outFields_[eq]);
176 this->addUnsharedField(outFields_[eq].fieldTag().clone());
180 for(std::size_t i=0;i<inDOFs.size();i++) {
181 int srcFieldNum = indexerSrc.
getFieldNum(inDOFs[i]);
182 int dstFieldNum = indexerDest.
getFieldNum(outDOFs[i]);
186 fieldNumberMaps[srcFieldNum] = dstFieldNum;
189 buildSrcToDestMap(elementBlock,
194 this->setName(
"Reorder AD Values");
198 template<
typename TRAITS>
203 for(std::size_t fieldIndex = 0; fieldIndex < inFields_.size(); ++fieldIndex) {
205 const auto & inField_v = inFields_[fieldIndex].get_view();
206 const auto & outField_v = outFields_[fieldIndex].get_view();
207 const auto & dstFromSrcMap_v = dstFromSrcMapView_;
209 if(inField_v.size()>0) {
211 const auto rank = inField_v.rank();
213 Kokkos::parallel_for(
"ReorderADValues: Jacobian rank 2",workset.num_cells,KOKKOS_LAMBDA(
const int& i){
214 outField_v(i).val() = inField_v(i).val();
215 for (
size_t dx = 0; dx < dstFromSrcMap_v.size(); ++dx)
216 outField_v(i).fastAccessDx(dx) = inField_v(i).fastAccessDx(dstFromSrcMap_v(dx));
220 Kokkos::MDRangePolicy<PHX::Device,Kokkos::Rank<2>> policy({0,0},{
static_cast<int64_t
>(workset.num_cells),static_cast<int64_t>(inField_v.extent(1))});
221 Kokkos::parallel_for(
"ReorderADValues: Jacobian rank 2",policy,KOKKOS_LAMBDA(
const int& i,
const int& j){
222 outField_v(i,j).val() = inField_v(i,j).val();
223 for (
size_t dx = 0; dx < dstFromSrcMap_v.size(); ++dx)
224 outField_v(i,j).fastAccessDx(dx) = inField_v(i,j).fastAccessDx(dstFromSrcMap_v(dx));
228 Kokkos::MDRangePolicy<PHX::Device,Kokkos::Rank<3>> policy({0,0,0},{
static_cast<int64_t
>(workset.num_cells),
229 static_cast<int64_t>(inField_v.extent(1)),static_cast<int64_t>(inField_v.extent(2))});
230 Kokkos::parallel_for(
"ReorderADValues: Jacobian rank 2",policy,KOKKOS_LAMBDA(
const int& i,
const int& j,
const int& k){
231 outField_v(i,j,k).val() = inField_v(i,j,k).val();
232 for (
size_t dx = 0; dx < dstFromSrcMap_v.size(); ++dx)
233 outField_v(i,j,k).fastAccessDx(dx) = inField_v(i,j,k).fastAccessDx(dstFromSrcMap_v(dx));
237 Kokkos::MDRangePolicy<PHX::Device,Kokkos::Rank<4>> policy({0,0,0,0},{
static_cast<int64_t
>(workset.num_cells),
238 static_cast<int64_t>(inField_v.extent(1)),static_cast<int64_t>(inField_v.extent(2)),
239 static_cast<int64_t>(inField_v.extent(3))});
240 Kokkos::parallel_for(
"ReorderADValues: Jacobian rank 2",policy,KOKKOS_LAMBDA(
const int& i,
const int& j,
const int& k,
const int& l){
241 outField_v(i,j,k,l).val() = inField_v(i,j,k,l).val();
242 for (
size_t dx = 0; dx < dstFromSrcMap_v.size(); ++dx)
243 outField_v(i,j,k,l).fastAccessDx(dx) = inField_v(i,j,k,l).fastAccessDx(dstFromSrcMap_v(dx));
247 Kokkos::MDRangePolicy<PHX::Device,Kokkos::Rank<5>> policy({0,0,0,0,0},{
static_cast<int64_t
>(workset.num_cells),
248 static_cast<int64_t>(inField_v.extent(1)),static_cast<int64_t>(inField_v.extent(2)),
249 static_cast<int64_t>(inField_v.extent(3)),static_cast<int64_t>(inField_v.extent(4))});
250 Kokkos::parallel_for(
"ReorderADValues: Jacobian rank 2",policy,KOKKOS_LAMBDA(
const int& i,
const int& j,
const int& k,
const int& l,
const int& m){
251 outField_v(i,j,k,l,m).val() = inField_v(i,j,k,l,m).val();
252 for (
size_t dx = 0; dx < dstFromSrcMap_v.size(); ++dx)
253 outField_v(i,j,k,l,m).fastAccessDx(dx) = inField_v(i,j,k,l,m).fastAccessDx(dstFromSrcMap_v(dx));
264 template<
typename TRAITS>
279 std::map<int,int> fieldNumberMaps;
280 for(std::size_t i=0;i<dstFieldsNum.size();i++) {
281 std::string fieldName = indexerDest.
getFieldString(dstFieldsNum[i]);
283 int srcFieldNum = indexerSrc.
getFieldNum(fieldName);
285 fieldNumberMaps[srcFieldNum] = dstFieldsNum[i];
287 out <<
"Warning: Reorder AD Values can't find field \"" << fieldName <<
"\"" << std::endl;
290 buildSrcToDestMap(elementBlock,fieldNumberMaps,indexerSrc,indexerDest);
294 template<
typename TRAITS>
297 const std::map<int,int> & fieldNumberMaps,
302 std::map<int,int> offsetMap;
303 for(std::map<int,int>::const_iterator itr=fieldNumberMaps.begin();
304 itr!=fieldNumberMaps.end();++itr) {
305 int srcField = itr->first;
306 int dstField = itr->second;
308 const std::vector<int> & srcOffsets = indexerSrc.
getGIDFieldOffsets(elementBlock,srcField);
309 const std::vector<int> & dstOffsets = indexerDest.
getGIDFieldOffsets(elementBlock,dstField);
313 for(std::size_t i=0;i<srcOffsets.size();i++) {
314 offsetMap[srcOffsets[i]] = dstOffsets[i];
318 maxDest = dstOffsets[i]>maxDest ? dstOffsets[i] : maxDest;
324 std::vector<int> dstFromSrcMap(maxDest+1,-1);
325 for(std::map<int,int>::const_iterator itr=offsetMap.begin();
326 itr!=offsetMap.end();++itr) {
327 dstFromSrcMap[itr->second] = itr->first;
331 auto dfsm_host = Kokkos::create_mirror_view(Kokkos::HostSpace(),dstFromSrcMapView_);
332 for (
size_t i=0; i < dstFromSrcMapView_.size(); ++i)
333 dfsm_host(i) = dstFromSrcMap[i];
335 Kokkos::deep_copy(dstFromSrcMapView_,dfsm_host);
virtual const std::string & getFieldString(int num) const =0
Reverse lookup of the field string from a field number.
virtual Teuchos::RCP< Teuchos::Comm< int > > getComm() const =0
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
std::vector< PHX::MDField< ScalarT > > outFields_
void evaluateFields(typename TRAITS::EvalData d)
std::vector< PHX::MDField< const ScalarT > > inFields_
virtual int getFieldNum(const std::string &str) const =0
Get the number used for access to this field.
basic_FancyOStream & setOutputToRootOnly(const int rootRank)
Reorders the ad values of a specified field to match a different unique global indexer.
virtual const std::vector< int > & getGIDFieldOffsets(const std::string &blockId, int fieldNum) const =0
Use the field pattern so that you can find a particular field in the GIDs array.
virtual const std::vector< int > & getBlockFieldNumbers(const std::string &blockId) const =0
ReorderADValues_Evaluator(const std::string &outPrefix, const std::vector< std::string > &inFieldNames, const std::vector< Teuchos::RCP< PHX::DataLayout > > &fieldLayouts, const std::string &elementBlock, const GlobalIndexer &indexerSrc, const GlobalIndexer &indexerDest)
#define TEUCHOS_ASSERT(assertion_test)