43 #ifndef PANZER_STK_PROJECT_FIELD_IMPL_HPP
44 #define PANZER_STK_PROJECT_FIELD_IMPL_HPP
46 #include "Teuchos_Assert.hpp"
47 #include "Phalanx_DataLayout.hpp"
49 #include "Intrepid2_ProjectionTools.hpp"
50 #include "Intrepid2_OrientationTools.hpp"
54 #include "Kokkos_ViewFactory.hpp"
56 #include "Teuchos_FancyOStream.hpp"
58 namespace panzer_stk {
60 template<
typename EvalT,
typename Traits>
64 srcBasis_(src), dstBasis_(dst)
69 static_assert(std::is_same<EvalT,panzer::Traits::Residual>::value);
74 if (outName ==
"") outName = inName;
76 this->addEvaluatedField(
result_);
81 this->addNonConstDependentField(
source_);
83 this->setName(
"Project Field");
87 local_orts_ = Kokkos::DynRankView<Intrepid2::Orientation,PHX::Device>(
"orts",maxWorksetSize);
92 template<
typename EvalT,
typename Traits>
98 orientations_ = d.orientations_;
102 template<
typename EvalT,
typename Traits>
108 if (workset.num_cells<=0)
return;
111 using pts = Intrepid2::ProjectionTools<PHX::Device>;
113 size_t numCells = workset.num_cells;
114 const auto cell_range = std::pair<int,int>(0,numCells);
116 auto sub_local_orts = Kokkos::subview(local_orts_,cell_range);
117 auto orts_host = Kokkos::create_mirror_view(sub_local_orts);
120 if (orientations_ == Teuchos::null) {
122 for (
size_t i=0; i < numCells; ++i)
123 orts_host(i) = Intrepid2::Orientation();
125 for (
size_t i=0; i < numCells; ++i)
126 orts_host(i) = orientations_->at(workset.cell_local_ids[i]);
128 Kokkos::deep_copy(sub_local_orts,orts_host);
135 auto sub_result = Kokkos::subview(result_.get_view(),cell_range,Kokkos::ALL());
136 auto sub_source = Kokkos::subview(source_.get_view(),cell_range,Kokkos::ALL());
138 pts::projectField(sub_result,dstBasis.
get(),
139 sub_source,srcBasis.
get(),sub_local_orts);
PHX::MDField< double, panzer::Cell, panzer::BASIS > source_
ProjectField(const std::string &inName, Teuchos::RCP< panzer::PureBasis > src, Teuchos::RCP< panzer::PureBasis > dst, std::string outname="")
Teuchos::RCP< const panzer::PureBasis > srcBasis_
Teuchos::RCP< const panzer::PureBasis > dstBasis_
PHX::MDField< double, panzer::Cell, panzer::BASIS > result_
void postRegistrationSetup(typename Traits::SetupData d, PHX::FieldManager< Traits > &fm)
void evaluateFields(typename Traits::EvalData d)
Kokkos::DynRankView< Intrepid2::Orientation, PHX::Device > local_orts_
Teuchos::RCP< PHX::DataLayout > functional
<Cell,Basis> or <Cell,Basis>