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" 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& )
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 =
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()) {
154 scalars[f] = f2s_itr->second;
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 =
170 mesh_, basis, fields,scalars));
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
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
205 mesh_,centroidRule,fields,scalars));
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
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
240 mesh_,centroidRule,fields,scalars));
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>
261 bucketByBasisType(
const std::vector<std::pair<std::string,Teuchos::RCP<const panzer::PureBasis> > > & providedDofs,
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) {
288 RCP<Intrepid2::Basis<PHX::exec_space,double,double>> intrepidBasis = itr->second->getIntrepid2Basis();
291 Kokkos::DynRankView<double,PHX::Device> coords(
"coords",intrepidBasis->getCardinality(),
292 intrepidBasis->getBaseCellTopology().getDimension());
293 intrepidBasis->getDofCoords(coords);
294 TEUCHOS_ASSERT(coords.rank()==2);
295 TEUCHOS_ASSERT(coords.extent_int(1)==baseDimension);
297 for(
int i=0;i<coords.extent_int(0);i++)
298 for(
int d=0;d<coords.extent_int(1);d++)
299 centroid(0,d) += coords(i,d);
302 for(
int d=0;d<coords.extent_int(1);d++)
303 centroid(0,d) /= coords.extent(0);
309 TEUCHOS_ASSERT(
false);
312 template <
typename EvalT>
316 fieldToScalar_[fieldName] = fieldScalar;
319 template <
typename EvalT>
323 if(PHX::print<EvalT>()==PHX::print<panzer::Traits::Residual>())
329 template <
typename EvalT>
331 addAdditionalField(
const std::string & fieldName,
const Teuchos::RCP<const panzer::PureBasis> & basis)
333 additionalFields_.push_back(std::make_pair(fieldName,basis));
336 template <
typename EvalT>
339 std::vector<std::pair<std::string,Teuchos::RCP<const panzer::PureBasis> > > & fields)
const 345 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...
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
Interpolates basis DOF values to IP DOF values.
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
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...
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.
Interpolates basis DOF values to IP DOF values.
std::vector< std::string > removedFields_