43 #ifndef PANZER_DOF_GRADIENT_IMPL_HPP
44 #define PANZER_DOF_GRADIENT_IMPL_HPP
49 #include "Intrepid2_FunctionSpaceTools.hpp"
55 template <
typename ScalarT,
typename ArrayT>
56 struct evaluateGrad_withSens {
57 evaluateGrad_withSens (PHX::MDField<ScalarT> dof_grad,
58 PHX::MDField<const ScalarT,Cell,Point>
dof_value,
59 const ArrayT grad_basis) :
62 KOKKOS_INLINE_FUNCTION
63 void operator() (
const size_t &cell)
const
70 for (
int d=0; d<spaceDim; d++) {
88 template<
typename EvalT,
typename Traits>
92 use_descriptors_(false),
95 dof_gradient( p.get<
std::string>(
"Gradient Name"),
104 "DOFGradient: Basis of type \"" << basis->name() <<
"\" does not support GRAD");
109 std::string n =
"DOFGradient: " +
dof_gradient.fieldTag().name() +
" ("+PHX::typeAsString<EvalT>()+
")";
114 template<
typename EvalT,
typename TRAITS>
117 const PHX::FieldTag & output,
120 : use_descriptors_(true)
124 , dof_gradient(output)
128 "DOFGradient: Basis of type \"" <<
bd_.
getType() <<
"\" does not support GRAD");
133 std::string n =
"DOFGradient: " +
dof_gradient.fieldTag().name() +
" ("+PHX::typeAsString<EvalT>()+
")";
138 template<
typename EvalT,
typename Traits>
146 this->utils.setFieldData(dof_gradient,fm);
148 if(not use_descriptors_)
153 template<
typename EvalT,
typename Traits>
163 : *this->wda(workset).bases[basis_index];
165 typedef decltype(basisValues.
grad_basis) ArrayT;
167 evaluateGrad_withSens<ScalarT, ArrayT> eval(dof_gradient,
dof_value,basisValues.
grad_basis);
168 Kokkos::parallel_for(workset.
num_cells, eval);