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;
277 Kokkos::DynRankView<double,PHX::Device> & centroid)
const
280 using Teuchos::rcp_dynamic_cast;
282 centroid = Kokkos::DynRankView<double,PHX::Device>(
"centroid",1,baseDimension);
283 auto l_centroid = centroid;
286 for(std::map<std::string,RCP<const panzer::PureBasis> >::const_iterator itr=bases.begin();
287 itr!=bases.end();++itr) {
289 RCP<Intrepid2::Basis<PHX::exec_space,double,double>> intrepidBasis = itr->second->getIntrepid2Basis();
292 Kokkos::DynRankView<double,PHX::Device> coords(
"coords",intrepidBasis->getCardinality(),
293 intrepidBasis->getBaseCellTopology().getDimension());
294 intrepidBasis->getDofCoords(coords);
295 TEUCHOS_ASSERT(coords.rank()==2);
296 TEUCHOS_ASSERT(coords.extent_int(1)==baseDimension);
298 Kokkos::parallel_for(coords.extent_int(0), KOKKOS_LAMBDA (
int i) {
299 for(
int d=0;d<coords.extent_int(1);d++)
300 l_centroid(0,d) += coords(i,d)/coords.extent(0);
308 TEUCHOS_ASSERT(
false);