43 #ifndef PANZER_RESPONSE_SCATTER_EVALUATOR_EXTREMEVALUE_IMPL_HPP
44 #define PANZER_RESPONSE_SCATTER_EVALUATOR_EXTREMEVALUE_IMPL_HPP
49 #include "PanzerDiscFE_config.hpp"
51 #include "Phalanx_Evaluator_Macros.hpp"
52 #include "Phalanx_MDField.hpp"
53 #include "Phalanx_DataLayout_MDALayout.hpp"
62 #include "Intrepid2_FunctionSpaceTools.hpp"
64 #include "Thyra_SpmdVectorBase.hpp"
65 #include "Teuchos_ArrayRCP.hpp"
67 #include "Kokkos_ViewFactory.hpp"
71 template<
typename EvalT,
typename Traits,
typename LO,
typename GO>
74 const std::string & responseName,
75 const std::string & fieldName,
76 const int fieldComponent,
82 : responseName_(responseName)
83 , fieldName_(fieldName)
84 , fieldComponent_(fieldComponent)
87 , topology_(ir.topology)
88 , globalIndexer_(indexer)
89 , scatterObj_(probeScatter)
97 this->addDependentField(
field_);
107 std::string dummyName =
113 std::string n =
"Probe Response Scatter: " + responseName;
117 template<
typename EvalT,
typename Traits,
typename LO,
typename GO>
129 template<
typename EvalT,
typename Traits,
typename LO,
typename GO>
133 typedef Intrepid2::CellTools<PHX::exec_space> CTD;
134 typedef Intrepid2::FunctionSpaceTools<PHX::exec_space> FST;
136 const int num_points = 1;
137 Kokkos::DynRankView<int,PHX::Device> inCell(
"inCell", this->wda(d).cell_vertex_coordinates.extent_int(0), num_points);
138 Kokkos::DynRankView<double,PHX::Device> physical_points_cell(
"physical_points_cell", this->wda(d).cell_vertex_coordinates.extent_int(0), num_points, num_dim);
139 for (panzer::index_t cell(0); cell < d.
num_cells; ++cell)
140 for (
size_t dim=0; dim<num_dim; ++dim)
141 physical_points_cell(cell,0,dim) = point_[dim];
143 const double tol = 1.0e-12;
144 CTD::checkPointwiseInclusion(inCell,
145 physical_points_cell,
146 this->wda(d).cell_vertex_coordinates.get_view(),
152 bool haveProbe =
false;
153 for (index_t cell=0; cell<static_cast<int>(d.
num_cells); ++cell) {
160 if (inCell(cell,0) == 1) {
173 const size_t num_vertex = this->wda(d).cell_vertex_coordinates.extent(1);
174 Kokkos::DynRankView<double,PHX::Device> cell_coords(
175 "cell_coords", 1, num_vertex, num_dim);
176 for (
size_t i=0; i<num_vertex; ++i) {
177 for (
size_t j=0; j<num_dim; ++j) {
178 cell_coords(0,i,j) = this->wda(d).cell_vertex_coordinates(cellIndex_,i,j);
181 Kokkos::DynRankView<double,PHX::Device> physical_points(
182 "physical_points", 1, 1, num_dim);
183 for (
size_t i=0; i<num_dim; ++i)
184 physical_points(0,0,i) = physical_points_cell(0,0,i);
185 Kokkos::DynRankView<double,PHX::Device> reference_points(
186 "reference_points", 1, 1, num_dim);
187 CTD::mapToReferenceFrame(reference_points, physical_points, cell_coords,
189 Kokkos::DynRankView<double,PHX::Device> reference_points_cell(
190 "reference_points_cell", 1, num_dim);
191 for (
size_t i=0; i<num_dim; ++i)
192 reference_points_cell(0,i) = reference_points(0,0,i);
199 Kokkos::DynRankView<double,PHX::Device>
200 ref_basis_values(
"ref_basis_values", num_basis, 1);
201 basis_->getIntrepid2Basis()->getValues(ref_basis_values,
202 reference_points_cell,
203 Intrepid2::OPERATOR_VALUE);
206 FST::HGRADtransformVALUE<double>(basis_values_, ref_basis_values);
213 Kokkos::DynRankView<double,PHX::Device> ref_basis_values(
214 "ref_basis_values", num_basis, 1, num_dim);
215 basis_->getIntrepid2Basis()->getValues(ref_basis_values,
216 reference_points_cell,
217 Intrepid2::OPERATOR_VALUE);
220 Kokkos::DynRankView<double,PHX::Device>
jac
221 (
"jac", 1, 1, num_dim, num_dim);
222 CTD::setJacobian(jac, reference_points, cell_coords, *topology_);
223 Kokkos::DynRankView<double,PHX::Device> basis_values_vec(
224 "basis_values_vec", 1, num_basis, 1, num_dim);
226 Kokkos::DynRankView<double,PHX::Device> jac_inv(
227 "jac_inv", 1, 1, num_dim, num_dim);
228 CTD::setJacobianInv(jac_inv, jac);
229 FST::HCURLtransformVALUE<double>(basis_values_vec, jac_inv,
233 Kokkos::DynRankView<double,PHX::Device> jac_det(
235 CTD::setJacobianDet(jac_det, jac);
236 FST::HDIVtransformVALUE<double>(basis_values_vec,
jac, jac_det,
241 std::vector<double> orientation;
242 globalIndexer_->getElementOrientation(cellIndex_, orientation);
243 std::string blockId = this->wda(d).block_id;
244 int fieldNum = globalIndexer_->getFieldNum(fieldName_);
245 const std::vector<int> & elmtOffset =
246 globalIndexer_->getGIDFieldOffsets(blockId,fieldNum);
249 for (
size_t i=0; i<num_basis; ++i) {
250 int offset = elmtOffset[i];
251 basis_values_(0,i,0) =
252 orientation[offset] * basis_values_vec(0,i,0,fieldComponent_);
260 template<
typename EvalT,
typename Traits,
typename LO,
typename GO>
265 const bool haveProbe = computeBasisValues(d);
271 Kokkos::DynRankView<ScalarT,typename PHX::DevLayout<ScalarT>::type,PHX::Device> field_coeffs =
274 for (
size_t i=0; i<num_basis; ++i)
275 field_coeffs(0,i) = field_(cellIndex_,i);
278 Kokkos::DynRankView<ScalarT,typename PHX::DevLayout<ScalarT>::type,PHX::Device> field_val =
280 Intrepid2::FunctionSpaceTools<PHX::exec_space>::evaluate(
281 field_val, field_coeffs, basis_values_);
282 responseObj_->value = field_val(0,0);
283 responseObj_->have_probe =
true;
286 template <
typename LO,
typename GO>
291 using Teuchos::rcp_dynamic_cast;
292 using Thyra::SpmdVectorBase;
301 rcp_dynamic_cast<SpmdVectorBase<double> >(this->
responseObj_->getGhostedVector());
302 dgdx->getNonconstLocalData(ptrFromRef(local_dgdx));
307 this->responseObj_->have_probe,
Teuchos::RCP< const panzer::PureBasis > basis_
Teuchos::RCP< GlobalEvaluationDataContainer > gedc
Kokkos::DynRankView< typename InputArray::value_type, PHX::Device > createDynRankView(const InputArray &a, const std::string &name, const DimensionPack...dims)
Wrapper to simplify Panzer use of Sacado ViewFactory.
PHX::MDField< const ScalarT, Cell, BASIS > field_
Teuchos::Array< double > point_
Teuchos::RCP< PHX::FieldTag > scatterHolder_
void preEvaluate(typename Traits::PreEvalData d)
bool computeBasisValues(typename Traits::EvalData d)
static std::string buildLookupName(const std::string &responseName)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
void evaluateFields(typename Traits::EvalData d)
Kokkos::DynRankView< double, PHX::Device > basis_values_
Teuchos::RCP< Response_Probe< EvalT > > responseObj_
#define TEUCHOS_ASSERT(assertion_test)
Teuchos::RCP< PHX::DataLayout > functional
<Cell,Basis> or <Cell,Basis>
ResponseScatterEvaluator_ProbeBase(const std::string &responseName, const std::string &fieldName, const int fieldComponent, const Teuchos::Array< double > &point, const IntegrationRule &ir, const Teuchos::RCP< const PureBasis > &basis, const Teuchos::RCP< const panzer::UniqueGlobalIndexer< LO, GO > > &indexer, const Teuchos::RCP< ProbeScatterBase > &probeScatter)
A constructor with concrete arguments instead of a parameter list.
Teuchos::RCP< ProbeScatterBase > scatterObj_