44 const std::string & sideset,
45 const std::string & eBlock,
48 using namespace workset_utils;
51 std::vector<stk::mesh::Entity> sideEntities;
63 std::vector<std::string> sideSets;
67 ss << e.what() <<
"\nChoose one of:\n";
68 for(std::size_t i=0;i<sideSets.size();i++)
69 ss <<
"\"" << sideSets[i] <<
"\"\n";
71 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
75 std::vector<std::string> elementBlocks;
79 ss << e.what() <<
"\nChoose one of:\n";
80 for(std::size_t i=0;i<elementBlocks.size();i++)
81 ss <<
"\"" << elementBlocks[i] <<
"\"\n";
83 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
85 catch(std::logic_error & e) {
87 ss << e.what() <<
"\nUnrecognized logic error.\n";
89 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
92 std::vector<stk::mesh::Entity> elements;
93 std::map<std::pair<unsigned,unsigned>,std::vector<std::size_t> > local_cell_ids;
96 std::vector<std::size_t> local_side_ids;
97 getSideElements(mesh, eBlock,
98 sideEntities,local_side_ids,elements);
101 for(std::size_t elm=0;elm<elements.size();++elm) {
102 stk::mesh::Entity element = elements[elm];
104 local_cell_ids[std::make_pair(subcell_dim,local_side_ids[elm])].push_back(mesh.
elementLocalId(element));
108 std::vector<std::size_t> local_subcell_ids, subcell_dim;
109 getSideElementCascade(mesh, eBlock,
110 sideEntities,subcell_dim,local_subcell_ids,elements);
113 for(std::size_t elm=0;elm<elements.size();++elm) {
114 stk::mesh::Entity element = elements[elm];
116 local_cell_ids[std::make_pair(subcell_dim[elm],local_subcell_ids[elm])].push_back(mesh.
elementLocalId(element));
124 if(elements.size()!=0) {
125 Teuchos::RCP<const shards::CellTopology> topo = mesh.
getCellTopology(eBlock);
128 Teuchos::RCP<std::vector<panzer::Workset> > worksets = Teuchos::rcp(
new std::vector<panzer::Workset>);
131 for(std::map<std::pair<unsigned,unsigned>,std::vector<std::size_t> >::const_iterator itr=local_cell_ids.begin();
132 itr!=local_cell_ids.end();++itr) {
134 if(itr->second.size()==0)
137 Kokkos::DynRankView<double,PHX::Device> nodes;
140 Teuchos::RCP<std::vector<panzer::Workset> > current
144 for(std::size_t w=0;w<current->size();w++) {
145 (*current)[w].subcell_dim = itr->first.first;
146 (*current)[w].subcell_index = itr->first.second;
150 worksets->insert(worksets->end(),current->begin(),current->end());
157 return Teuchos::rcp(
new std::vector<panzer::Workset>());
163 const std::string & blockid_a,
165 const std::string & blockid_b,
166 const std::string & sideset)
168 using namespace workset_utils;
171 std::vector<stk::mesh::Entity> sideEntities;
181 stk::mesh::Part * sidePart = mesh.
getSideset(sideset);
182 TEUCHOS_TEST_FOR_EXCEPTION(sidePart==0,std::logic_error,
183 "Unknown side set \"" << sideset <<
"\"");
185 stk::mesh::Selector side = *sidePart;
192 std::stringstream ss;
193 std::vector<std::string> elementBlocks;
197 ss << e.what() <<
"\nChoose one of:\n";
198 for(std::size_t i=0;i<elementBlocks.size();i++)
199 ss <<
"\"" << elementBlocks[i] <<
"\"\n";
201 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
203 catch(std::logic_error & e) {
204 std::stringstream ss;
205 ss << e.what() <<
"\nUnrecognized logic error.\n";
207 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
210 std::vector<stk::mesh::Entity> elements_a, elements_b;
211 std::vector<std::size_t> local_cell_ids_a, local_cell_ids_b;
212 std::vector<std::size_t> local_side_ids_a, local_side_ids_b;
215 getSideElements(mesh, blockid_a,blockid_b, sideEntities,
216 local_side_ids_a,elements_a,
217 local_side_ids_b,elements_b);
219 TEUCHOS_TEST_FOR_EXCEPTION(elements_a.size()!=elements_b.size(),std::logic_error,
220 "For a DG type boundary, the number of elements on the \"left\" and \"right\" is not the same.");
226 if(elements_a.size()==0)
227 return Teuchos::rcp(
new std::map<unsigned,panzer::Workset>);
232 for(std::size_t elm=0;elm<elements_a.size();++elm) {
233 stk::mesh::Entity element_a = elements_a[elm];
234 stk::mesh::Entity element_b = elements_b[elm];
240 Kokkos::DynRankView<double,PHX::Device> node_coordinates_a, node_coordinates_b;
245 return buildBCWorkset(needs_a,blockid_a, local_cell_ids_a, local_side_ids_a, node_coordinates_a,
246 needs_b,blockid_b, local_cell_ids_b, local_side_ids_b, node_coordinates_b);
252 const std::string & eblockID,
253 const std::string & sidesetID)
255 using namespace workset_utils;
258 std::vector<stk::mesh::Entity> sideEntities;
266 std::stringstream ss;
267 std::vector<std::string> sideSets;
271 ss << e.what() <<
"\nChoose one of:\n";
272 for(std::size_t i=0;i<sideSets.size();i++)
273 ss <<
"\"" << sideSets[i] <<
"\"\n";
275 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
278 std::stringstream ss;
279 std::vector<std::string> elementBlocks;
283 ss << e.what() <<
"\nChoose one of:\n";
284 for(std::size_t i=0;i<elementBlocks.size();i++)
285 ss <<
"\"" << elementBlocks[i] <<
"\"\n";
287 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
289 catch(std::logic_error & e) {
290 std::stringstream ss;
291 ss << e.what() <<
"\nUnrecognized logic error.\n";
293 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
296 std::vector<stk::mesh::Entity> elements;
297 std::vector<std::size_t> local_cell_ids;
298 std::vector<std::size_t> local_side_ids;
299 getSideElements(mesh, eblockID,sideEntities,local_side_ids,elements);
302 for(std::size_t elm=0;elm<elements.size();++elm) {
303 stk::mesh::Entity element = elements[elm];
312 if(elements.size()!=0) {
313 Teuchos::RCP<const shards::CellTopology> topo
316 Kokkos::DynRankView<double,PHX::Device> nodes;
322 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 &node_coordinates, const bool populate_value_arrays=true)