30ProjectField(
const std::string & inName, Teuchos::RCP<panzer::PureBasis> src,
31 Teuchos::RCP<panzer::PureBasis> dst, std::string outName):
32 srcBasis_(src), dstBasis_(dst)
37 static_assert(std::is_same<EvalT,panzer::Traits::Residual>::value);
39 Teuchos::RCP<PHX::DataLayout> srcBasis_layout =
srcBasis_->functional;
40 Teuchos::RCP<PHX::DataLayout> dstBasis_layout =
dstBasis_->functional;
42 if (outName ==
"") outName = inName;
43 result_ = PHX::MDField<ScalarT,Cell,BASIS>(outName,dstBasis_layout);
44 this->addEvaluatedField(
result_);
48 source_ = PHX::MDField<ScalarT,Cell,BASIS>(inName,srcBasis_layout);
49 this->addNonConstDependentField(
source_);
51 this->setName(
"Project Field");
54 auto maxWorksetSize =
srcBasis_->functional->extent(0);
55 local_orts_ = Kokkos::DynRankView<Intrepid2::Orientation,PHX::Device>(
"orts",maxWorksetSize);
76 if (workset.num_cells<=0)
return;
79 using pts = Intrepid2::ProjectionTools<PHX::Device>;
81 size_t numCells = workset.num_cells;
82 const auto cell_range = std::pair<int,int>(0,numCells);
84 auto sub_local_orts = Kokkos::subview(local_orts_,cell_range);
85 auto orts_host = Kokkos::create_mirror_view(sub_local_orts);
88 if (orientations_ == Teuchos::null) {
90 for (
size_t i=0; i < numCells; ++i)
91 orts_host(i) = Intrepid2::Orientation();
93 for (
size_t i=0; i < numCells; ++i)
94 orts_host(i) = orientations_->at(workset.cell_local_ids[i]);
96 Kokkos::deep_copy(sub_local_orts,orts_host);
99 Teuchos::RCP<Intrepid2::Basis<PHX::exec_space,double,double> > dstBasis = dstBasis_->getIntrepid2Basis();
100 Teuchos::RCP<Intrepid2::Basis<PHX::exec_space,double,double> > srcBasis = srcBasis_->getIntrepid2Basis();
103 auto sub_result = Kokkos::subview(result_.get_view(),cell_range,Kokkos::ALL());
104 auto sub_source = Kokkos::subview(source_.get_view(),cell_range,Kokkos::ALL());
106 pts::projectField(sub_result,dstBasis.get(),
107 sub_source,srcBasis.get(),sub_local_orts);