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>
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++) {
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;
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);
143 "Could not find basis \""+basisName+
"\"!");
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];
173 this->
template registerEvaluator<EvalT>(fm, eval);
174 fm.template requireField<EvalT>(*eval->evaluatedFields()[0]);
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++) {
190 p.
set(
"Name",fields[f]);
192 p.
set(
"Point Rule",centroidRule.getConst());
196 this->
template registerEvaluator<EvalT>(fm, evaluator);
198 fields_concat += fields[f];
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]);
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++) {
225 p.
set(
"Name",fields[f]);
227 p.
set(
"Point Rule",centroidRule.getConst());
231 this->
template registerEvaluator<EvalT>(fm, evaluator);
233 fields_concat += fields[f];
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]);
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;
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);
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);
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>
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
std::string name() const
A unique key that is the combination of the basis type and basis order.
Object that contains information on the physics and discretization of a block of elements with the SA...
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
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...
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
virtual bool typeSupported() const
virtual Teuchos::RCP< const panzer::PureBasis > lookupBasis(const std::string &fieldName) const =0
Get the basis associated with a particular field.
Teuchos::RCP< STK_Interface > mesh_
void scaleField(const std::string &fieldName, double fieldScalar)
EElementSpace getElementSpace() const
Teuchos::RCP< const FieldLibraryBase > getFieldLibraryBase() const
basic_FancyOStream & setOutputToRootOnly(const int rootRank)
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.
#define TEUCHOS_ASSERT(assertion_test)
std::vector< std::string > removedFields_