52 const Teuchos::ParameterList& )
const
57 typedef std::pair<std::string,RCP<const panzer::PureBasis> > StrConstPureBasisPair;
60 std::unordered_set<std::string> scaledFieldsHash = scaledFieldsHash_;
62 std::map<std::string,RCP<const panzer::PureBasis> > bases;
63 std::map<std::string,std::vector<std::string> > basisBucket;
65 const std::map<std::string,RCP<panzer::PureBasis> > & nc_bases = physicsBlock.
getBases();
66 bases.insert(nc_bases.begin(),nc_bases.end());
69 std::vector<StrConstPureBasisPair> allFields;
73 if(!addCoordinateFields_ && addSolutionFields_) {
79 std::vector<std::string> removedFields;
80 const std::vector<std::vector<std::string> > & coord_fields = physicsBlock.
getCoordinateDOFs();
81 for(std::size_t c=0;c<coord_fields.size();c++)
82 for(std::size_t d=0;d<coord_fields[c].size();d++)
83 removedFields.push_back(coord_fields[c][d]);
86 deleteRemovedFields(removedFields,allFields);
88 else if(addCoordinateFields_ && !addSolutionFields_) {
90 const std::vector<std::vector<std::string> > & coord_fields = physicsBlock.
getCoordinateDOFs();
93 for(std::size_t c=0;c<coord_fields.size();c++) {
94 for(std::size_t d=0;d<coord_fields[c].size();d++) {
95 Teuchos::RCP<panzer::PureBasis> basis =
96 Teuchos::rcp_const_cast<panzer::PureBasis>(fieldLib->lookupBasis(coord_fields[c][d]));
99 allFields.push_back(std::make_pair(coord_fields[c][d],basis));
103 else if(addSolutionFields_)
107 if(addSolutionFields_)
111 for(std::size_t i=0;i<additionalFields_.size();i++)
112 bases[additionalFields_[i].second->name()] = additionalFields_[i].second;
114 allFields.insert(allFields.end(),additionalFields_.begin(),additionalFields_.end());
116 deleteRemovedFields(removedFields_,allFields);
118 bucketByBasisType(allFields,basisBucket);
122 RCP<panzer::PointRule> centroidRule;
123 for(std::map<std::string,Teuchos::RCP<const panzer::PureBasis> >::const_iterator itr=bases.begin();
124 itr!=bases.end();++itr) {
126 if(itr->second->isVectorBasis()) {
130 Kokkos::DynRankView<double,PHX::Device> centroid;
134 RCP<PHX::Evaluator<panzer::Traits> > evaluator =
136 this->
template registerEvaluator<EvalT>(fm, evaluator);
145 for(std::map<std::string,std::vector<std::string> >::const_iterator itr=basisBucket.begin();
146 itr!=basisBucket.end();++itr) {
148 std::string basisName = itr->first;
149 const std::vector<std::string> & fields = itr->second;
151 std::map<std::string,Teuchos::RCP<const panzer::PureBasis> >::const_iterator found = bases.find(basisName);
152 TEUCHOS_TEST_FOR_EXCEPTION(found==bases.end(),std::logic_error,
153 "Could not find basis \""+basisName+
"\"!");
154 Teuchos::RCP<const panzer::PureBasis> basis = found->second;
157 std::vector<double> scalars(fields.size(),1.0);
158 for(std::size_t f=0;f<fields.size();f++) {
159 std::unordered_map<std::string,double>::const_iterator f2s_itr = fieldToScalar_.find(fields[f]);
163 if(f2s_itr!=fieldToScalar_.end()) {
164 scalars[f] = f2s_itr->second;
165 scaledFieldsHash.erase(fields[f]);
173 std::string fields_concat =
"";
174 for(std::size_t f=0;f<fields.size();f++) {
175 fields_concat += fields[f];
178 Teuchos::RCP<PHX::Evaluator<panzer::Traits> > eval =
180 mesh_, basis, fields,scalars));
183 this->
template registerEvaluator<EvalT>(fm, eval);
184 fm.template requireField<EvalT>(*eval->evaluatedFields()[0]);
187 TEUCHOS_ASSERT(centroidRule!=Teuchos::null);
191 Teuchos::RCP<PHX::Evaluator<panzer::Traits> > evaluator
193 this->
template registerEvaluator<EvalT>(fm, evaluator);
197 std::string fields_concat =
"";
198 for(std::size_t f=0;f<fields.size();f++) {
199 Teuchos::ParameterList p;
200 p.set(
"Name",fields[f]);
201 p.set(
"Basis",basis);
202 p.set(
"Point Rule",centroidRule.getConst());
203 Teuchos::RCP<PHX::Evaluator<panzer::Traits> > evaluator
206 this->
template registerEvaluator<EvalT>(fm, evaluator);
208 fields_concat += fields[f];
213 Teuchos::RCP<PHX::Evaluator<panzer::Traits> > evaluator
215 mesh_,centroidRule,fields,scalars));
217 this->
template registerEvaluator<EvalT>(fm, evaluator);
218 fm.template requireField<EvalT>(*evaluator->evaluatedFields()[0]);
222 TEUCHOS_ASSERT(centroidRule!=Teuchos::null);
226 Teuchos::RCP<PHX::Evaluator<panzer::Traits> > evaluator
228 this->
template registerEvaluator<EvalT>(fm, evaluator);
232 std::string fields_concat =
"";
233 for(std::size_t f=0;f<fields.size();f++) {
234 Teuchos::ParameterList p;
235 p.set(
"Name",fields[f]);
236 p.set(
"Basis",basis);
237 p.set(
"Point Rule",centroidRule.getConst());
238 Teuchos::RCP<PHX::Evaluator<panzer::Traits> > evaluator
241 this->
template registerEvaluator<EvalT>(fm, evaluator);
243 fields_concat += fields[f];
248 Teuchos::RCP<PHX::Evaluator<panzer::Traits> > evaluator
250 mesh_,centroidRule,fields,scalars));
252 this->
template registerEvaluator<EvalT>(fm, evaluator);
253 fm.template requireField<EvalT>(*evaluator->evaluatedFields()[0]);
259 Teuchos::FancyOStream out(Teuchos::rcpFromRef(std::cout));
260 out.setOutputToRootOnly(0);
262 for(std::unordered_set<std::string>::const_iterator itr=scaledFieldsHash.begin();
263 itr!=scaledFieldsHash.end();itr++) {
264 out <<
"WARNING: STK Solution Writer did not scale the field \"" << *itr <<
"\" "
265 <<
"because it was not written." << std::endl;
287 Kokkos::DynRankView<double,PHX::Device> & centroid)
const
290 using Teuchos::rcp_dynamic_cast;
292 centroid = Kokkos::DynRankView<double,PHX::Device>(
"centroid",1,baseDimension);
293 auto l_centroid = centroid;
296 for(std::map<std::string,RCP<const panzer::PureBasis> >::const_iterator itr=bases.begin();
297 itr!=bases.end();++itr) {
299 RCP<Intrepid2::Basis<PHX::exec_space,double,double>> intrepidBasis = itr->second->getIntrepid2Basis();
302 Kokkos::DynRankView<double,PHX::Device> coords(
"coords",intrepidBasis->getCardinality(),
303 intrepidBasis->getBaseCellTopology().getDimension());
304 intrepidBasis->getDofCoords(coords);
305 TEUCHOS_ASSERT(coords.rank()==2);
306 TEUCHOS_ASSERT(coords.extent_int(1)==baseDimension);
308 Kokkos::parallel_for(coords.extent_int(0), KOKKOS_LAMBDA (
int i) {
309 for(
int d=0;d<coords.extent_int(1);d++)
310 l_centroid(0,d) += coords(i,d)/coords.extent(0);
318 TEUCHOS_ASSERT(
false);