1 #ifndef __Panzer_STK_ResponseEvaluatorFactory_SolutionWriter_impl_hpp__ 2 #define __Panzer_STK_ResponseEvaluatorFactory_SolutionWriter_impl_hpp__ 5 #include "Panzer_STK_ScatterFields.hpp" 6 #include "Panzer_STK_ScatterVectorFields.hpp" 7 #include "Panzer_PointValues_Evaluator.hpp" 8 #include "Panzer_BasisValues_Evaluator.hpp" 9 #include "Panzer_DOF.hpp" 12 #include <unordered_set> 20 Response_STKDummy(
const std::string & rn)
22 virtual void scatterResponse() {}
23 virtual void initializeResponse() {}
26 Response_STKDummy(
const Response_STKDummy &);
30 template <
typename EvalT>
34 return Teuchos::rcp(
new Response_STKDummy(responseName));
37 template <
typename EvalT>
42 const Teuchos::ParameterList & user_data)
const 47 typedef std::pair<std::string,RCP<const panzer::PureBasis> > StrConstPureBasisPair;
50 std::unordered_set<std::string> scaledFieldsHash = scaledFieldsHash_;
52 std::map<std::string,RCP<const panzer::PureBasis> > bases;
53 std::map<std::string,std::vector<std::string> > basisBucket;
55 const std::map<std::string,RCP<panzer::PureBasis> > & nc_bases = physicsBlock.
getBases();
56 bases.insert(nc_bases.begin(),nc_bases.end());
59 std::vector<StrConstPureBasisPair> allFields;
63 if(!addCoordinateFields_ && addSolutionFields_) {
69 std::vector<std::string> removedFields;
70 const std::vector<std::vector<std::string> > & coord_fields = physicsBlock.
getCoordinateDOFs();
71 for(std::size_t c=0;c<coord_fields.size();c++)
72 for(std::size_t d=0;d<coord_fields[c].size();d++)
73 removedFields.push_back(coord_fields[c][d]);
76 deleteRemovedFields(removedFields,allFields);
78 else if(addCoordinateFields_ && !addSolutionFields_) {
80 const std::vector<std::vector<std::string> > & coord_fields = physicsBlock.
getCoordinateDOFs();
83 for(std::size_t c=0;c<coord_fields.size();c++) {
84 for(std::size_t d=0;d<coord_fields[c].size();d++) {
85 Teuchos::RCP<panzer::PureBasis>
basis =
86 Teuchos::rcp_const_cast<
panzer::PureBasis>(fieldLib->lookupBasis(coord_fields[c][d]));
89 allFields.push_back(std::make_pair(coord_fields[c][d],
basis));
93 else if(addSolutionFields_)
97 if(addSolutionFields_)
101 for(std::size_t i=0;i<additionalFields_.size();i++)
102 bases[additionalFields_[i].second->name()] = additionalFields_[i].second;
104 allFields.insert(allFields.end(),additionalFields_.begin(),additionalFields_.end());
106 deleteRemovedFields(removedFields_,allFields);
108 bucketByBasisType(allFields,basisBucket);
112 RCP<panzer::PointRule> centroidRule;
113 for(std::map<std::string,Teuchos::RCP<const panzer::PureBasis> >::const_iterator itr=bases.begin();
114 itr!=bases.end();++itr) {
116 if(itr->second->isVectorBasis()) {
120 Kokkos::DynRankView<double,PHX::Device> centroid;
124 RCP<PHX::Evaluator<panzer::Traits> > evaluator =
125 rcp(
new panzer::PointValues_Evaluator<EvalT,panzer::Traits>(centroidRule,centroid));
126 this->
template registerEvaluator<EvalT>(fm, evaluator);
135 for(std::map<std::string,std::vector<std::string> >::const_iterator itr=basisBucket.begin();
136 itr!=basisBucket.end();++itr) {
138 std::string basisName = itr->first;
139 const std::vector<std::string> & fields = itr->second;
141 std::map<std::string,Teuchos::RCP<const panzer::PureBasis> >::const_iterator found = bases.find(basisName);
142 TEUCHOS_TEST_FOR_EXCEPTION(found==bases.end(),std::logic_error,
143 "Could not find basis \""+basisName+
"\"!");
144 Teuchos::RCP<const panzer::PureBasis>
basis = found->second;
147 std::vector<double>
scalars(fields.size(),1.0);
148 for(std::size_t f=0;f<fields.size();f++) {
149 std::unordered_map<std::string,double>::const_iterator f2s_itr = fieldToScalar_.find(fields[f]);
153 if(f2s_itr!=fieldToScalar_.end()) {
155 scaledFieldsHash.erase(fields[f]);
163 std::string fields_concat =
"";
164 for(std::size_t f=0;f<fields.size();f++) {
165 fields_concat += fields[f];
168 Teuchos::RCP<PHX::Evaluator<panzer::Traits> > eval =
173 this->
template registerEvaluator<EvalT>(fm, eval);
174 fm.template requireField<EvalT>(*eval->evaluatedFields()[0]);
177 TEUCHOS_ASSERT(centroidRule!=Teuchos::null);
181 Teuchos::RCP<PHX::Evaluator<panzer::Traits> > evaluator
182 = Teuchos::rcp(
new panzer::BasisValues_Evaluator<EvalT,panzer::Traits>(centroidRule,
basis));
183 this->
template registerEvaluator<EvalT>(fm, evaluator);
187 std::string fields_concat =
"";
188 for(std::size_t f=0;f<fields.size();f++) {
189 Teuchos::ParameterList p;
190 p.set(
"Name",fields[f]);
191 p.set(
"Basis",
basis);
192 p.set(
"Point Rule",centroidRule.getConst());
193 Teuchos::RCP<PHX::Evaluator<panzer::Traits> > evaluator
196 this->
template registerEvaluator<EvalT>(fm, evaluator);
198 fields_concat += fields[f];
203 Teuchos::RCP<PHX::Evaluator<panzer::Traits> > evaluator
204 = Teuchos::rcp(
new ScatterVectorFields<EvalT,panzer::Traits>(
"STK HCURL Scatter Basis " +
basis->name()+
": "+fields_concat,
207 this->
template registerEvaluator<EvalT>(fm, evaluator);
208 fm.template requireField<EvalT>(*evaluator->evaluatedFields()[0]);
212 TEUCHOS_ASSERT(centroidRule!=Teuchos::null);
216 Teuchos::RCP<PHX::Evaluator<panzer::Traits> > evaluator
217 = Teuchos::rcp(
new panzer::BasisValues_Evaluator<EvalT,panzer::Traits>(centroidRule,
basis));
218 this->
template registerEvaluator<EvalT>(fm, evaluator);
222 std::string fields_concat =
"";
223 for(std::size_t f=0;f<fields.size();f++) {
224 Teuchos::ParameterList p;
225 p.set(
"Name",fields[f]);
226 p.set(
"Basis",
basis);
227 p.set(
"Point Rule",centroidRule.getConst());
228 Teuchos::RCP<PHX::Evaluator<panzer::Traits> > evaluator
231 this->
template registerEvaluator<EvalT>(fm, evaluator);
233 fields_concat += fields[f];
238 Teuchos::RCP<PHX::Evaluator<panzer::Traits> > evaluator
239 = Teuchos::rcp(
new ScatterVectorFields<EvalT,panzer::Traits>(
"STK HDIV Scatter Basis " +
basis->name()+
": "+fields_concat,
242 this->
template registerEvaluator<EvalT>(fm, evaluator);
243 fm.template requireField<EvalT>(*evaluator->evaluatedFields()[0]);
249 Teuchos::FancyOStream out(Teuchos::rcpFromRef(std::cout));
250 out.setOutputToRootOnly(0);
252 for(std::unordered_set<std::string>::const_iterator itr=scaledFieldsHash.begin();
253 itr!=scaledFieldsHash.end();itr++) {
254 out <<
"WARNING: STK Solution Writer did not scale the field \"" << *itr <<
"\" " 255 <<
"because it was not written." << std::endl;
259 template <
typename EvalT>
262 std::map<std::string,std::vector<std::string> > & basisBucket)
265 for(std::size_t i=0;i<providedDofs.size();i++) {
266 std::string fieldName = providedDofs[i].first;
267 Teuchos::RCP<const panzer::PureBasis>
basis = providedDofs[i].second;
269 basisBucket[
basis->name()].push_back(fieldName);
273 template <
typename EvalT>
277 Kokkos::DynRankView<double,PHX::Device> & centroid)
const 280 using Teuchos::rcp_dynamic_cast;
282 centroid = Kokkos::DynRankView<double,PHX::Device>(
"centroid",1,baseDimension);
285 for(std::map<std::string,RCP<const panzer::PureBasis> >::const_iterator itr=bases.begin();
286 itr!=bases.end();++itr) {
289 RCP<Intrepid2::Basis<double,Kokkos::DynRankView<double,PHX::Device> > > intrepidBasis = itr->second->getIntrepid2Basis();
290 RCP<Intrepid2::DofCoordsInterface<Kokkos::DynRankView<double,PHX::Device> > > basisCoords
291 = rcp_dynamic_cast<Intrepid2::DofCoordsInterface<Kokkos::DynRankView<double,PHX::Device> > >(intrepidBasis);
293 if(basisCoords==Teuchos::null)
297 Kokkos::DynRankView<double,PHX::Device> coords(
"coords",intrepidBasis->getCardinality(),
298 intrepidBasis->getBaseCellTopology().getDimension());
299 basisCoords->getDofCoords(coords);
300 TEUCHOS_ASSERT(coords.rank()==2);
301 TEUCHOS_ASSERT(coords.extent_int(1)==baseDimension);
303 for(
int i=0;i<coords.extent_int(0);i++)
304 for(
int d=0;d<coords.extent_int(1);d++)
305 centroid(0,d) += coords(i,d);
308 for(
int d=0;d<coords.extent_int(1);d++)
309 centroid(0,d) /= coords.dimension(0);
315 TEUCHOS_ASSERT(
false);
318 template <
typename EvalT>
322 fieldToScalar_[fieldName] = fieldScalar;
325 template <
typename EvalT>
329 if(PHX::typeAsString<EvalT>()==PHX::typeAsString<panzer::Traits::Residual>())
335 template <
typename EvalT>
339 additionalFields_.push_back(std::make_pair(fieldName,
basis));
342 template <
typename EvalT>
345 std::vector<std::pair<std::string,Teuchos::RCP<const panzer::PureBasis> > > & fields)
const 351 fields.erase(std::remove_if(fields.begin(),fields.end(),functor),fields.end());
void computeReferenceCentroid(const std::map< std::string, Teuchos::RCP< const panzer::PureBasis > > &bases, int baseDimension, Kokkos::DynRankView< double, PHX::Device > ¢roid) const
Object that contains information on the physics and discretization of a block of elements with the SA...
Kokkos::View< const double *, PHX::Device > scalars
virtual Teuchos::RCP< panzer::ResponseBase > buildResponseObject(const std::string &responseName) const
virtual void buildAndRegisterEvaluators(const std::string &responseName, PHX::FieldManager< panzer::Traits > &fm, const panzer::PhysicsBlock &physicsBlock, const Teuchos::ParameterList &user_data) const
PHX::MDField< ScalarT > vector
void addAdditionalField(const std::string &fieldName, const Teuchos::RCP< const panzer::PureBasis > &basis)
Interpolates basis DOF values to IP DOF Curl values.
int baseCellDimension() const
Dimension of the base cell. NOT the dimension of the local side, even if the side() method returns tr...
virtual bool typeSupported() const
Teuchos::RCP< STK_Interface > mesh_
void scaleField(const std::string &fieldName, double fieldScalar)
Teuchos::RCP< const FieldLibraryBase > getFieldLibraryBase() const
const std::vector< std::vector< std::string > > & getCoordinateDOFs() const
const panzer::CellData & cellData() const
static void bucketByBasisType(const std::vector< std::pair< std::string, Teuchos::RCP< const panzer::PureBasis > > > &providedDofs, std::map< std::string, std::vector< std::string > > &basisBucket)
const std::vector< StrPureBasisPair > & getProvidedDOFs() const
const std::map< std::string, Teuchos::RCP< panzer::PureBasis > > & getBases() const
Returns the unique set of bases, key is the unique panzer::PureBasis::name() of the basis...
Teuchos::RCP< const panzer::PureBasis > basis
Interpolates basis DOF values to IP DOF values.
void deleteRemovedFields(const std::vector< std::string > &removedFields, std::vector< std::pair< std::string, Teuchos::RCP< const panzer::PureBasis > > > &fields) const
Delete from the argument all the fields that are in the removedFields array.
Description and data layouts associated with a particular basis.
const std::vector< StrPureBasisPair > & getTangentFields() const
Returns list of tangent fields from DOFs and tangent param names.
std::vector< std::string > removedFields_