43 #ifndef PANZER_DOF_IMPL_HPP 44 #define PANZER_DOF_IMPL_HPP 53 #include "Intrepid2_FunctionSpaceTools.hpp" 66 template<
typename EvalT,
typename TRAITS>
70 const std::string fieldName = p.get<std::string>(
"Name");
71 basis = p.get< Teuchos::RCP<const PureBasis> >(
"Basis");
72 Teuchos::RCP<const PointRule>
pointRule = p.get< Teuchos::RCP<const PointRule> >(
"Point Rule");
73 is_vector_basis =
basis->isVectorBasis();
75 std::string evalName = fieldName+
"_"+
pointRule->getName();
76 if(p.isType<
bool>(
"Use DOF Name")) {
77 if(p.get<
bool>(
"Use DOF Name"))
81 dof_basis = PHX::MDField<ScalarT,Cell,Point>(fieldName,
basis->functional);
83 this->addDependentField(dof_basis);
92 if(
basis->isScalarBasis()) {
93 dof_ip_scalar = PHX::MDField<ScalarT,Cell,Point>(
96 this->addEvaluatedField(dof_ip_scalar);
98 this->addDependentField(
basisValues->basis_ref_scalar);
101 else if(
basis->isVectorBasis()) {
102 dof_ip_vector = PHX::MDField<ScalarT,Cell,Point,Dim>(
105 this->addEvaluatedField(dof_ip_vector);
107 this->addDependentField(
basisValues->basis_ref_vector);
108 this->addDependentField(
basisValues->basis_vector);
111 { TEUCHOS_ASSERT(
false); }
113 std::string n =
"DOF_PointValues: " + dof_basis.fieldTag().name();
118 template<
typename EvalT,
typename TRAITS>
123 this->utils.setFieldData(dof_basis,fm);
125 if(!is_vector_basis) {
126 this->utils.setFieldData(dof_ip_scalar,fm);
129 this->utils.setFieldData(
basisValues->basis_ref_scalar,fm);
130 this->utils.setFieldData(
basisValues->basis_scalar,fm);
133 this->utils.setFieldData(dof_ip_vector,fm);
136 this->utils.setFieldData(
basisValues->basis_ref_vector,fm);
137 this->utils.setFieldData(
basisValues->basis_vector,fm);
142 template<
typename EvalT,
typename TRAITS>
148 if(is_vector_basis) {
149 int spaceDim =
basisValues->basis_vector.dimension(3);
152 Kokkos::parallel_for(workset.num_cells,functor);
156 Kokkos::parallel_for(workset.num_cells,functor);
161 Kokkos::parallel_for(workset.num_cells,functor);
172 template<
typename TRAITS>
176 const std::string fieldName = p.get<std::string>(
"Name");
177 basis = p.get< Teuchos::RCP<const PureBasis> >(
"Basis");
178 Teuchos::RCP<const PointRule>
pointRule = p.get< Teuchos::RCP<const PointRule> >(
"Point Rule");
181 if(p.isType<Teuchos::RCP<
const std::vector<int> > >(
"Jacobian Offsets Vector")) {
182 const std::vector<int> &
offsets = *p.get<Teuchos::RCP<const std::vector<int> > >(
"Jacobian Offsets Vector");
185 offsets_array = Kokkos::View<int*,PHX::Device>(
"offsets",
offsets.size());
186 for(std::size_t i=0;i<
offsets.size();i++)
189 accelerate_jacobian =
true;
192 accelerate_jacobian =
false;
194 std::string evalName = fieldName+
"_"+
pointRule->getName();
195 if(p.isType<
bool>(
"Use DOF Name")) {
196 if(p.get<
bool>(
"Use DOF Name"))
197 evalName = fieldName;
200 dof_basis = PHX::MDField<ScalarT,Cell,Point>(fieldName,
basis->functional);
211 if(
basis->isScalarBasis()) {
217 this->addDependentField(
basisValues->basis_ref_scalar);
218 this->addDependentField(
basisValues->basis_scalar);
220 else if(
basis->isVectorBasis()) {
226 this->addDependentField(
basisValues->basis_ref_vector);
227 this->addDependentField(
basisValues->basis_vector);
230 { TEUCHOS_ASSERT(
false); }
232 std::string n =
"DOF_PointValues: " +
dof_basis.fieldTag().name() +
" Jacobian";
237 template<
typename TRAITS>
248 this->utils.setFieldData(
basisValues->basis_ref_scalar,fm);
249 this->utils.setFieldData(
basisValues->basis_scalar,fm);
255 this->utils.setFieldData(
basisValues->basis_ref_vector,fm);
256 this->utils.setFieldData(
basisValues->basis_vector,fm);
261 template<
typename TRAITS>
266 if(accelerate_jacobian) {
267 int spaceDim =
basisValues->basis_vector.dimension(3);
270 Kokkos::parallel_for(workset.num_cells,functor);
274 Kokkos::parallel_for(workset.num_cells,functor);
278 int spaceDim =
basisValues->basis_vector.dimension(3);
281 Kokkos::parallel_for(workset.num_cells,functor);
285 Kokkos::parallel_for(workset.num_cells,functor);
290 if(accelerate_jacobian) {
292 Kokkos::parallel_for(workset.num_cells,functor);
296 Kokkos::parallel_for(workset.num_cells,functor);
Teuchos::RCP< BasisValues2< ScalarT > > basisValues
void evaluateFields(typename TRAITS::EvalData d)
PHX::MDField< ScalarT, Cell, Point, Dim > dof_ip_vector
PHX::MDField< ScalarT, Cell, Point > dof_basis
Teuchos::RCP< const panzer::PointRule > pointRule
Teuchos::RCP< const PureBasis > basis
void postRegistrationSetup(typename TRAITS::SetupData d, PHX::FieldManager< TRAITS > &fm)
Teuchos::RCP< BasisValues2< ScalarT > > basisValues
Teuchos::RCP< const panzer::PureBasis > basis
Interpolates basis DOF values to IP DOF values.
PHX::MDField< ScalarT, Cell, Point > dof_ip_scalar
DOF_PointValues(const Teuchos::ParameterList &p)
Kokkos::View< const int *, PHX::Device > offsets