11#ifndef PANZER_DOF_GRADIENT_IMPL_HPP
12#define PANZER_DOF_GRADIENT_IMPL_HPP
18#include "Intrepid2_FunctionSpaceTools.hpp"
24 template <
typename ScalarT,
typename ArrayT>
25 struct evaluateGrad_withSens {
26 using scratch_view = Kokkos::View<ScalarT*,typename PHX::DevLayout<ScalarT>::type,
typename PHX::ExecutionSpace::scratch_memory_space,Kokkos::MemoryUnmanaged>;
27 using team_policy = Kokkos::TeamPolicy<PHX::ExecutionSpace>::member_type;
29 PHX::MDField<ScalarT> dof_grad_;
30 PHX::MDField<const ScalarT,Cell,Point> dof_value_;
31 const ArrayT grad_basis_;
32 const int num_fields_;
33 const int num_points_;
36 const bool use_shared_memory_;
38 evaluateGrad_withSens(PHX::MDField<ScalarT> dof_grad,
39 PHX::MDField<const ScalarT,Cell,Point> dof_value,
40 const ArrayT grad_basis,
41 const bool use_shared_memory) :
43 dof_value_(dof_value),
44 grad_basis_(grad_basis),
45 num_fields_(grad_basis.extent(1)),
46 num_points_(grad_basis.extent(2)),
47 space_dim_(grad_basis.extent(3)),
48 fad_size_(Sacado::dimension_scalar(dof_grad.get_view())),
49 use_shared_memory_(use_shared_memory) {}
51 KOKKOS_INLINE_FUNCTION
52 void operator() (
const team_policy& team)
const
54 const int cell = team.league_rank();
56 if (not use_shared_memory_) {
57 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,num_points_), [&] (
const int& pt) {
58 for (
int d=0; d<space_dim_; ++d) {
61 dof_grad_(cell,pt,d) = dof_value_(cell, 0) * grad_basis_(cell, 0, pt, d);
62 for (
int bf=1; bf<num_fields_; ++bf)
63 dof_grad_(cell,pt,d) += dof_value_(cell, bf) * grad_basis_(cell, bf, pt, d);
67 scratch_view dof_values;
68 scratch_view point_values;
69 if (Sacado::IsADType<ScalarT>::value) {
70 dof_values = scratch_view(team.team_shmem(),num_fields_,fad_size_);
71 point_values = scratch_view(team.team_shmem(),num_points_,fad_size_);
74 dof_values = scratch_view(team.team_shmem(),num_fields_);
75 point_values = scratch_view(team.team_shmem(),num_points_);
78 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,num_fields_), [&] (
const int& dof) {
79 dof_values(dof) = dof_value_(cell,dof);
83 for (
int dim=0; dim < space_dim_; ++dim) {
84 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,num_points_), [&] (
const int& pt) {
85 point_values(pt) = 0.0;
88 for (
int dof=0; dof<num_fields_; ++dof) {
89 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,num_points_), [&] (
const int& pt) {
90 point_values(pt) += dof_values(dof) * grad_basis_(cell,dof,pt,dim);
94 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,num_points_), [&] (
const int& pt) {
95 dof_grad_(cell,pt,dim) = point_values(pt);
101 size_t team_shmem_size(
int )
const
103 if (not use_shared_memory_)
107 if (Sacado::IsADType<ScalarT>::value)
108 bytes = scratch_view::shmem_size(num_fields_,fad_size_) + scratch_view::shmem_size(num_points_,fad_size_);
110 bytes = scratch_view::shmem_size(num_fields_) + scratch_view::shmem_size(num_points_);
118template<
typename EvalT,
typename Traits>
121 const Teuchos::ParameterList& p) :
129 Teuchos::RCP<const PureBasis> basis
130 = p.get< Teuchos::RCP<BasisIRLayout> >(
"Basis")->getBasis();
133 TEUCHOS_TEST_FOR_EXCEPTION(!basis->supportsGrad(),std::logic_error,
134 "DOFGradient: Basis of type \"" << basis->name() <<
"\" does not support GRAD");
139 std::string n =
"DOFGradient: " +
dof_gradient.fieldTag().name() +
" ("+PHX::print<EvalT>()+
")";
144template<
typename EvalT,
typename TRAITS>
147 const PHX::FieldTag & output,
157 TEUCHOS_TEST_FOR_EXCEPTION(
bd_.getType()!=
"HGrad",std::logic_error,
158 "DOFGradient: Basis of type \"" <<
bd_.getType() <<
"\" does not support GRAD");
163 std::string n =
"DOFGradient: " +
dof_gradient.fieldTag().name() +
" ("+PHX::print<EvalT>()+
")";
168template<
typename EvalT,
typename Traits>
180template<
typename EvalT,
typename Traits>
197 Kokkos::parallel_for(
"panzer::DOFGradient::evaluateFields", policy, eval);
ConstArray_CellBasisIPDim getGradBasisValues(const bool weighted, const bool cache=true, const bool force=false) const
Get the gradient of the basis evaluated at mesh points.
PHX::MDField< const Scalar, Cell, BASIS, IP, Dim > ConstArray_CellBasisIPDim
Array_CellBasisIPDim grad_basis
PHX::MDField< ScalarT > dof_gradient
panzer::IntegrationDescriptor id_
panzer::BasisDescriptor bd_
DOFGradient(const Teuchos::ParameterList &p)
void postRegistrationSetup(typename TRAITS::SetupData d, PHX::FieldManager< TRAITS > &fm)
PHX::MDField< const ScalarT, Cell, Point > dof_value
void evaluateFields(typename TRAITS::EvalData d)
WorksetDetailsAccessor wda
static HP & inst()
Private ctor.
bool useSharedMemory() const
Kokkos::TeamPolicy< TeamPolicyProperties... > teamPolicy(const int &league_size)
Returns a TeamPolicy for hierarchic parallelism.
int num_cells
DEPRECATED - use: numCells().
std::vector< std::string >::size_type getBasisIndex(std::string basis_name, const panzer::Workset &workset, WorksetDetailsAccessor &wda)
Returns the index in the workset bases for a particular BasisIRLayout name.
Teuchos::RCP< const std::vector< panzer::Workset > > worksets_
All worksets that will be evaluated over the lifetime of this evaluator.
const panzer::Workset & EvalData
Data type passed to PHX::Evaluator::evaluateFields(): a single workset holding the cell data for one ...
const SD & SetupData
Data type passed to PHX::Evaluator::postRegistrationSetup().