54 const Teuchos::RCP<
const Teuchos::Comm<int>> comm)
57 std::vector<std::string> block_ids;
63 std::vector<shards::CellTopology> ebt;
65 dimension = ebt[0].getDimension();
67 int my_rank = comm->getRank();
69 int nprocs = comm->getSize();
72 if ( dimension == 1 ) {
75 }
else if ( dimension == 2 ){
82 std::vector<GlobalOrdinal> element_GIDS;
83 for (
size_t iblk = 0 ; iblk < block_ids.size(); ++iblk) {
84 const std::vector<LocalOrdinal> &block_elems = conn.
getElementBlock(block_ids[iblk]);
85 for (
size_t i=0; i<block_elems.size(); ++i) {
87 element_GIDS.push_back(*connectivity);
90 Teuchos::RCP<const Map> elem_map =
91 Teuchos::RCP<Map>(
new Map(Teuchos::OrdinalTraits<GlobalOrdinal>::invalid(), &element_GIDS[0], element_GIDS.size(), 0, comm ));
94 Teuchos::RCP<const Map> face_map,owned_face_map;
95 if ( dimension == 1 ) {
98 }
else if ( dimension == 2 ){
106 std::vector<GlobalOrdinal> face_GIDS;
107 std::set<GlobalOrdinal> set_of_face_GIDS;
108 for (
size_t iblk = 0 ; iblk < block_ids.size(); ++iblk) {
109 const std::vector<LocalOrdinal> &block_elems = conn.
getElementBlock(block_ids[iblk]);
110 for (
size_t i=0; i<block_elems.size(); ++i) {
112 const panzer::GlobalOrdinal * connectivity = conn.
getConnectivity(block_elems[i]);
113 for (
int iface=0; iface<n_conn; ++iface)
114 set_of_face_GIDS.insert(connectivity[iface]);
117 face_GIDS.insert(face_GIDS.begin(), set_of_face_GIDS.begin(), set_of_face_GIDS.end());
119 face_map = Teuchos::RCP<Map>(
new Map(Teuchos::OrdinalTraits<GlobalOrdinal>::invalid(), &face_GIDS[0], face_GIDS.size(), 0, comm ));
120 owned_face_map = Tpetra::createOneToOne(face_map);
126 Teuchos::RCP<GOMultiVector> owned_face2elem_mv = Teuchos::RCP<GOMultiVector>(
new GOMultiVector(owned_face_map, 8));
127 Teuchos::RCP<GOMultiVector> face2elem_mv = Teuchos::RCP<GOMultiVector>(
new GOMultiVector(face_map, 8));
129 face2elem_mv->putScalar(-1-shift);
131 auto f2e = face2elem_mv->getLocalViewHost(Tpetra::Access::ReadWrite);
132 auto b1 = Kokkos::subview(f2e,Kokkos::ALL(),0);
133 auto e1 = Kokkos::subview(f2e,Kokkos::ALL(),1);
134 auto p1 = Kokkos::subview(f2e,Kokkos::ALL(),2);
135 auto l1 = Kokkos::subview(f2e,Kokkos::ALL(),3);
136 auto b2 = Kokkos::subview(f2e,Kokkos::ALL(),4);
137 auto e2 = Kokkos::subview(f2e,Kokkos::ALL(),5);
138 auto p2 = Kokkos::subview(f2e,Kokkos::ALL(),6);
139 auto l2 = Kokkos::subview(f2e,Kokkos::ALL(),7);
141 GlobalOrdinal my_elem = 0;
142 for (
size_t iblk = 0 ; iblk < block_ids.size(); ++iblk) {
143 const std::vector<LocalOrdinal> &block_elems = conn.
getElementBlock(block_ids[iblk]);
144 for (
size_t i=0; i<block_elems.size(); ++i) {
146 const panzer::GlobalOrdinal * connectivity = conn.
getConnectivity(block_elems[i]);
147 for (
int iface=0; iface<n_conn; ++iface) {
148 LocalOrdinal f = face_map->getLocalElement(connectivity[iface]);
154 e1[f] = elem_map->getGlobalElement(my_elem)+shift;
155 p1[f] = my_rank+shift;
157 }
else if (b2[f] < 0){
159 e2[f] = elem_map->getGlobalElement(my_elem)+shift;
160 p2[f] = my_rank+shift;
171 Import imp(owned_face_map, face_map);
172 Export exp(face_map, owned_face_map);
173 owned_face2elem_mv->doExport(*face2elem_mv, exp, Tpetra::ADD);
176 auto f2e = face2elem_mv->getLocalViewHost(Tpetra::Access::ReadWrite);
177 auto b1 = Kokkos::subview(f2e,Kokkos::ALL(),0);
178 auto e1 = Kokkos::subview(f2e,Kokkos::ALL(),1);
179 auto p1 = Kokkos::subview(f2e,Kokkos::ALL(),2);
180 auto l1 = Kokkos::subview(f2e,Kokkos::ALL(),3);
181 auto b2 = Kokkos::subview(f2e,Kokkos::ALL(),4);
182 auto e2 = Kokkos::subview(f2e,Kokkos::ALL(),5);
183 auto p2 = Kokkos::subview(f2e,Kokkos::ALL(),6);
184 auto l2 = Kokkos::subview(f2e,Kokkos::ALL(),7);
186 auto of2e = owned_face2elem_mv->getLocalViewHost(Tpetra::Access::ReadWrite);
187 auto ob1 = Kokkos::subview(of2e,Kokkos::ALL(),0);
188 auto oe1 = Kokkos::subview(of2e,Kokkos::ALL(),1);
189 auto op1 = Kokkos::subview(of2e,Kokkos::ALL(),2);
190 auto ol1 = Kokkos::subview(of2e,Kokkos::ALL(),3);
191 auto ob2 = Kokkos::subview(of2e,Kokkos::ALL(),4);
192 auto oe2 = Kokkos::subview(of2e,Kokkos::ALL(),5);
193 auto op2 = Kokkos::subview(of2e,Kokkos::ALL(),6);
194 auto ol2 = Kokkos::subview(of2e,Kokkos::ALL(),7);
199 for (
size_t i=0; i<ob1.size();++i){
202 assert(b1[i] >= shift);
204 LocalOrdinal shared_local_id = face_map->getLocalElement(owned_face_map->getGlobalElement(i));
206 if (ob1[i] == b1[shared_local_id] && ob2[i] == b2[shared_local_id] &&
207 oe1[i] == e1[shared_local_id] && oe2[i] == e2[shared_local_id]) {
214 if (ob1[i] < b1[shared_local_id] || oe1[i] < e1[shared_local_id]) {
218 if ( ob1[i] > b1[shared_local_id] || oe1[i] > e1[shared_local_id]) {
220 assert(ob2[i] < 0 && oe2[i] < 0);
221 ob2[i] = ob1[i] - b1[shared_local_id];
222 oe2[i] = oe1[i] - e1[shared_local_id];
223 op2[i] = op1[i] - p1[shared_local_id];
224 ol2[i] = ol1[i] - l1[shared_local_id];
226 ob1[i] = b1[shared_local_id];
227 oe1[i] = e1[shared_local_id];
228 op1[i] = p1[shared_local_id];
229 ol1[i] = l1[shared_local_id];
231 assert(op1[i] >=0 && op2[i] >= 0 && op1[i] < nprocs+shift && op2[i] < nprocs+shift);
235 face2elem_mv->doImport(*owned_face2elem_mv, imp, Tpetra::REPLACE);
240 face_map_ = face_map;
241 LocalOrdinal nfaces = face_map_->getLocalNumElements();
242 elems_by_face_ = PHX::View<GlobalOrdinal *[2]>(
"FaceToElement::elems_by_face_", nfaces);
243 lidx_by_face_ = PHX::View<int *[2]>(
"FaceToElement::elems_by_face_", nfaces);
244 blocks_by_face_ = PHX::View<int *[2]> (
"FaceToElement::blocks_by_face_", nfaces);
245 procs_by_face_ = PHX::View<int *[2]> (
"FaceToElement::procs_by_face_", nfaces);
246 auto elems_by_face_h = Kokkos::create_mirror_view(elems_by_face_);
247 auto blocks_by_face_h = Kokkos::create_mirror_view(blocks_by_face_);
248 auto procs_by_face_h = Kokkos::create_mirror_view(procs_by_face_);
249 auto lidx_by_face_h = Kokkos::create_mirror_view(lidx_by_face_);
251 auto f2e = face2elem_mv->getLocalViewHost(Tpetra::Access::ReadWrite);
252 auto b1 = Kokkos::subview(f2e,Kokkos::ALL(),0);
253 auto e1 = Kokkos::subview(f2e,Kokkos::ALL(),1);
254 auto p1 = Kokkos::subview(f2e,Kokkos::ALL(),2);
255 auto l1 = Kokkos::subview(f2e,Kokkos::ALL(),3);
256 auto b2 = Kokkos::subview(f2e,Kokkos::ALL(),4);
257 auto e2 = Kokkos::subview(f2e,Kokkos::ALL(),5);
258 auto p2 = Kokkos::subview(f2e,Kokkos::ALL(),6);
259 auto l2 = Kokkos::subview(f2e,Kokkos::ALL(),7);
261 for (LocalOrdinal i=0; i< nfaces; ++i) {
262 elems_by_face_h (i,0) = e1[i]-shift;
263 elems_by_face_h (i,1) = e2[i]-shift;
264 blocks_by_face_h(i,0) = b1[i]-shift;
265 blocks_by_face_h(i,1) = b2[i]-shift;
266 procs_by_face_h (i,0) = p1[i]-shift;
267 procs_by_face_h (i,1) = p2[i]-shift;
268 lidx_by_face_h (i,0) = l1[i]-shift;
269 lidx_by_face_h (i,1) = l2[i]-shift;
271 if(elems_by_face_h (i,0) < 0){
272 elems_by_face_h (i,0) = -1;
274 if(elems_by_face_h (i,1) < 0){
275 elems_by_face_h (i,1) = -1;
278 Kokkos::deep_copy(elems_by_face_, elems_by_face_h);
279 Kokkos::deep_copy(blocks_by_face_, blocks_by_face_h);
280 Kokkos::deep_copy(procs_by_face_, procs_by_face_h);
281 Kokkos::deep_copy(lidx_by_face_, lidx_by_face_h);