43 #ifndef PANZER_BasisValues_Evaluator_IMPL_HPP 44 #define PANZER_BasisValues_Evaluator_IMPL_HPP 53 template<
typename EvalT,
typename Traits>
56 const Teuchos::ParameterList& p)
57 : derivativesRequired_(true)
59 Teuchos::RCP<const panzer::PointRule> pointRule
60 = p.get< Teuchos::RCP<const panzer::PointRule> >(
"Point Rule");
61 Teuchos::RCP<const panzer::PureBasis> inBasis
62 = p.get<Teuchos::RCP<const panzer::PureBasis> >(
"Basis");
64 bool derivativesRequired =
true;
65 if(p.isType<
bool>(
"Derivatives Required"))
66 derivativesRequired = p.get<
bool>(
"Derivatives Required");
68 initialize(pointRule,inBasis,derivativesRequired);
72 template <
typename EvalT,
typename TRAITST>
74 const Teuchos::RCP<const panzer::PureBasis> & inBasis)
75 : derivativesRequired_(true)
77 bool derivativesRequired =
true;
78 initialize(pointRule,inBasis,derivativesRequired);
82 template <
typename EvalT,
typename TRAITST>
84 const Teuchos::RCP<const panzer::PureBasis> & inBasis,
85 bool derivativesRequired)
86 : derivativesRequired_(true)
88 initialize(pointRule,inBasis,derivativesRequired);
92 template <
typename EvalT,
typename TRAITST>
94 const Teuchos::RCP<const panzer::PureBasis> & inBasis,
95 bool derivativesRequired)
98 derivativesRequired_ = derivativesRequired;
100 int space_dim = basis->dimension();
108 constPointValues = pointValues;
109 this->addDependentField(constPointValues.coords_ref);
110 this->addDependentField(constPointValues.jac);
111 this->addDependentField(constPointValues.jac_inv);
112 this->addDependentField(constPointValues.jac_det);
116 Teuchos::RCP<panzer::BasisIRLayout> layout = Teuchos::rcp(
new panzer::BasisIRLayout(basis,*pointRule));
117 basisValues = Teuchos::rcp(
new BasisValues2<ScalarT>(basis->name()+
"_"+pointRule->getName()+
"_",
false));
118 basisValues->setupArrays(layout,derivativesRequired_);
123 this->addEvaluatedField(basisValues->basis_ref_scalar);
124 this->addEvaluatedField(basisValues->basis_scalar);
126 if(derivativesRequired) {
127 this->addEvaluatedField(basisValues->grad_basis_ref);
128 this->addEvaluatedField(basisValues->grad_basis);
133 this->addEvaluatedField(basisValues->basis_ref_vector);
134 this->addEvaluatedField(basisValues->basis_vector);
136 if(derivativesRequired && space_dim==2) {
137 this->addEvaluatedField(basisValues->curl_basis_ref_scalar);
138 this->addEvaluatedField(basisValues->curl_basis_scalar);
140 else if(derivativesRequired && space_dim==3) {
141 this->addEvaluatedField(basisValues->curl_basis_ref_vector);
142 this->addEvaluatedField(basisValues->curl_basis_vector);
147 this->addEvaluatedField(basisValues->basis_ref_vector);
148 this->addEvaluatedField(basisValues->basis_vector);
150 if(derivativesRequired) {
151 this->addEvaluatedField(basisValues->div_basis_ref);
152 this->addEvaluatedField(basisValues->div_basis);
156 std::string n =
"BasisValues_Evaluator: " +basis->name() +
"_" + pointRule->getName();
161 template<
typename EvalT,
typename Traits>
168 int space_dim = basis->dimension();
172 basisValues->setExtendedDimensions(fm.template getKokkosExtendedDataTypeDimensions<EvalT>());
175 this->utils.setFieldData(pointValues.coords_ref,fm);
176 this->utils.setFieldData(pointValues.jac,fm);
177 this->utils.setFieldData(pointValues.jac_inv,fm);
178 this->utils.setFieldData(pointValues.jac_det,fm);
183 this->utils.setFieldData(basisValues->basis_ref_scalar,fm);
184 this->utils.setFieldData(basisValues->basis_scalar,fm);
186 if(derivativesRequired_) {
187 this->utils.setFieldData(basisValues->grad_basis_ref,fm);
188 this->utils.setFieldData(basisValues->grad_basis,fm);
193 this->utils.setFieldData(basisValues->basis_ref_vector,fm);
194 this->utils.setFieldData(basisValues->basis_vector,fm);
196 if(derivativesRequired_ && space_dim==2) {
197 this->utils.setFieldData(basisValues->curl_basis_ref_scalar,fm);
198 this->utils.setFieldData(basisValues->curl_basis_scalar,fm);
200 else if(derivativesRequired_ && space_dim==3) {
201 this->utils.setFieldData(basisValues->curl_basis_ref_vector,fm);
202 this->utils.setFieldData(basisValues->curl_basis_vector,fm);
207 this->utils.setFieldData(basisValues->basis_ref_vector,fm);
208 this->utils.setFieldData(basisValues->basis_vector,fm);
210 if(derivativesRequired_) {
211 this->utils.setFieldData(basisValues->div_basis_ref,fm);
212 this->utils.setFieldData(basisValues->div_basis,fm);
219 template<
typename EvalT,
typename Traits>
226 basisValues->evaluateValues(pointValues.coords_ref,
229 pointValues.jac_inv);
232 if(basis->requiresOrientations()) {
235 std::vector<Intrepid2::Orientation> ortPerWorkset;
236 for (index_t c=0;c<workset.
num_cells;++c)
237 ortPerWorkset.push_back((*orientations)[details.
cell_local_ids[c]]);
239 basisValues->applyOrientations(ortPerWorkset);
Teuchos::RCP< const std::vector< Intrepid2::Orientation > > orientations_
BasisValues_Evaluator(const Teuchos::ParameterList &p)
void setupArrays(const Teuchos::RCP< const panzer::PointRule > &pr)
Sizes/allocates memory for arrays.
void initialize(const Teuchos::RCP< const panzer::PointRule > &pointRule, const Teuchos::RCP< const panzer::PureBasis > &basis, bool derivativesRequired)
Initialization method to unify the constructors.
void evaluateFields(typename Traits::EvalData d)
void postRegistrationSetup(typename Traits::SetupData d, PHX::FieldManager< Traits > &fm)
std::vector< GO > cell_local_ids