76 const std::string & sideset,
77 const std::string & eBlock,
80 using namespace workset_utils;
83 std::vector<stk::mesh::Entity> sideEntities;
95 std::vector<std::string> sideSets;
99 ss << e.what() <<
"\nChoose one of:\n";
100 for(std::size_t i=0;i<sideSets.size();i++)
101 ss <<
"\"" << sideSets[i] <<
"\"\n";
103 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
106 std::stringstream ss;
107 std::vector<std::string> elementBlocks;
111 ss << e.what() <<
"\nChoose one of:\n";
112 for(std::size_t i=0;i<elementBlocks.size();i++)
113 ss <<
"\"" << elementBlocks[i] <<
"\"\n";
115 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
117 catch(std::logic_error & e) {
118 std::stringstream ss;
119 ss << e.what() <<
"\nUnrecognized logic error.\n";
121 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
124 std::vector<stk::mesh::Entity> elements;
125 std::map<std::pair<unsigned,unsigned>,std::vector<std::size_t> > local_cell_ids;
128 std::vector<std::size_t> local_side_ids;
129 getSideElements(mesh, eBlock,
130 sideEntities,local_side_ids,elements);
133 for(std::size_t elm=0;elm<elements.size();++elm) {
134 stk::mesh::Entity element = elements[elm];
136 local_cell_ids[std::make_pair(subcell_dim,local_side_ids[elm])].push_back(mesh.
elementLocalId(element));
140 std::vector<std::size_t> local_subcell_ids, subcell_dim;
141 getSideElementCascade(mesh, eBlock,
142 sideEntities,subcell_dim,local_subcell_ids,elements);
145 for(std::size_t elm=0;elm<elements.size();++elm) {
146 stk::mesh::Entity element = elements[elm];
148 local_cell_ids[std::make_pair(subcell_dim[elm],local_subcell_ids[elm])].push_back(mesh.
elementLocalId(element));
156 if(elements.size()!=0) {
157 Teuchos::RCP<const shards::CellTopology> topo = mesh.
getCellTopology(eBlock);
160 Teuchos::RCP<std::vector<panzer::Workset> > worksets = Teuchos::rcp(
new std::vector<panzer::Workset>);
163 for(std::map<std::pair<unsigned,unsigned>,std::vector<std::size_t> >::const_iterator itr=local_cell_ids.begin();
164 itr!=local_cell_ids.end();++itr) {
166 if(itr->second.size()==0)
169 Kokkos::DynRankView<double,PHX::Device> vertices;
172 Teuchos::RCP<std::vector<panzer::Workset> > current
176 for(std::size_t w=0;w<current->size();w++) {
177 (*current)[w].subcell_dim = itr->first.first;
178 (*current)[w].subcell_index = itr->first.second;
182 worksets->insert(worksets->end(),current->begin(),current->end());
189 return Teuchos::rcp(
new std::vector<panzer::Workset>());
195 const std::string & blockid_a,
197 const std::string & blockid_b,
198 const std::string & sideset)
200 using namespace workset_utils;
203 std::vector<stk::mesh::Entity> sideEntities;
213 stk::mesh::Part * sidePart = mesh.
getSideset(sideset);
214 TEUCHOS_TEST_FOR_EXCEPTION(sidePart==0,std::logic_error,
215 "Unknown side set \"" << sideset <<
"\"");
217 stk::mesh::Selector side = *sidePart;
224 std::stringstream ss;
225 std::vector<std::string> elementBlocks;
229 ss << e.what() <<
"\nChoose one of:\n";
230 for(std::size_t i=0;i<elementBlocks.size();i++)
231 ss <<
"\"" << elementBlocks[i] <<
"\"\n";
233 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
235 catch(std::logic_error & e) {
236 std::stringstream ss;
237 ss << e.what() <<
"\nUnrecognized logic error.\n";
239 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
242 std::vector<stk::mesh::Entity> elements_a, elements_b;
243 std::vector<std::size_t> local_cell_ids_a, local_cell_ids_b;
244 std::vector<std::size_t> local_side_ids_a, local_side_ids_b;
247 getSideElements(mesh, blockid_a,blockid_b, sideEntities,
248 local_side_ids_a,elements_a,
249 local_side_ids_b,elements_b);
251 TEUCHOS_TEST_FOR_EXCEPTION(elements_a.size()!=elements_b.size(),std::logic_error,
252 "For a DG type boundary, the number of elements on the \"left\" and \"right\" is not the same.");
258 if(elements_a.size()==0)
259 return Teuchos::rcp(
new std::map<unsigned,panzer::Workset>);
264 for(std::size_t elm=0;elm<elements_a.size();++elm) {
265 stk::mesh::Entity element_a = elements_a[elm];
266 stk::mesh::Entity element_b = elements_b[elm];
272 Kokkos::DynRankView<double,PHX::Device> vertex_coordinates_a, vertex_coordinates_b;
277 return buildBCWorkset(needs_a,blockid_a, local_cell_ids_a, local_side_ids_a, vertex_coordinates_a,
278 needs_b,blockid_b, local_cell_ids_b, local_side_ids_b, vertex_coordinates_b);
284 const std::string & eblockID,
285 const std::string & sidesetID)
287 using namespace workset_utils;
290 std::vector<stk::mesh::Entity> sideEntities;
295 mesh.
getMySides(sidesetID,eblockID,sideEntities);
298 std::stringstream ss;
299 std::vector<std::string> sideSets;
303 ss << e.what() <<
"\nChoose one of:\n";
304 for(std::size_t i=0;i<sideSets.size();i++)
305 ss <<
"\"" << sideSets[i] <<
"\"\n";
307 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
310 std::stringstream ss;
311 std::vector<std::string> elementBlocks;
315 ss << e.what() <<
"\nChoose one of:\n";
316 for(std::size_t i=0;i<elementBlocks.size();i++)
317 ss <<
"\"" << elementBlocks[i] <<
"\"\n";
319 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
321 catch(std::logic_error & e) {
322 std::stringstream ss;
323 ss << e.what() <<
"\nUnrecognized logic error.\n";
325 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
328 std::vector<stk::mesh::Entity> elements;
329 std::vector<std::size_t> local_cell_ids;
330 std::vector<std::size_t> local_side_ids;
331 getSideElements(mesh, eblockID,
332 sideEntities,local_side_ids,elements);
335 for(std::size_t elm=0;elm<elements.size();++elm) {
336 stk::mesh::Entity element = elements[elm];
345 if(elements.size()!=0) {
346 Teuchos::RCP<const shards::CellTopology> topo
349 Kokkos::DynRankView<double,PHX::Device> vertices;
355 return Teuchos::null;
Teuchos::RCP< std::map< unsigned, Workset > > buildBCWorkset(const WorksetNeeds &needs, const std::string &elementBlock, const std::vector< std::size_t > &local_cell_ids, const std::vector< std::size_t > &local_side_ids, const ArrayT &vertex_coordinates, const bool populate_value_arrays=true)