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>
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++) {
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);
114 itr!=bases.end();++itr) {
116 if(itr->second->isVectorBasis()) {
120 Kokkos::DynRankView<double,PHX::Device> 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()) {
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];
170 mesh_, basis, fields,scalars));
173 this->
template registerEvaluator<EvalT>(fm, eval);
174 fm.template requireField<EvalT>(*eval->evaluatedFields()[0]);
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]);
191 p.
set(
"Basis",basis);
196 this->
template registerEvaluator<EvalT>(fm, evaluator);
198 fields_concat += fields[f];
205 mesh_,centroidRule,fields,scalars));
207 this->
template registerEvaluator<EvalT>(fm, evaluator);
208 fm.template requireField<EvalT>(*evaluator->evaluatedFields()[0]);
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]);
226 p.
set(
"Basis",basis);
231 this->
template registerEvaluator<EvalT>(fm, evaluator);
233 fields_concat += fields[f];
240 mesh_,centroidRule,fields,scalars));
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);
286 itr!=bases.end();++itr) {
291 Kokkos::DynRankView<double,PHX::Device> coords(
"coords",intrepidBasis->getCardinality(),
292 intrepidBasis->getBaseCellTopology().getDimension());
293 intrepidBasis->getDofCoords(coords);
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);
312 template <
typename EvalT>
316 fieldToScalar_[fieldName] = fieldScalar;
319 template <
typename EvalT>
323 if(PHX::typeAsString<EvalT>()==PHX::typeAsString<panzer::Traits::Residual>())
329 template <
typename EvalT>
333 additionalFields_.push_back(std::make_pair(fieldName,basis));
336 template <
typename EvalT>
345 fields.erase(std::remove_if(fields.begin(),fields.end(),functor),fields.end());