diff --git a/include/overset/TiogaBlock.h b/include/overset/TiogaBlock.h index 324ba9369..d614eb471 100644 --- a/include/overset/TiogaBlock.h +++ b/include/overset/TiogaBlock.h @@ -178,8 +178,14 @@ class TiogaBlock /** Update iblanks after connectivity updates */ - void update_iblanks( + void update_iblanks(); + /** Update fringe and hole node vectors + */ + void update_fringe_and_hole_nodes( std::vector&, std::vector&); + /** Update the Tioga view of iblanks prior to donor-to-receptor interpolation + */ + void update_tioga_iblanks(); /** Update element iblanks after connectivity updates */ diff --git a/src/overset/TiogaBlock.C b/src/overset/TiogaBlock.C index 14a725de9..fda25ac88 100644 --- a/src/overset/TiogaBlock.C +++ b/src/overset/TiogaBlock.C @@ -224,7 +224,27 @@ TiogaBlock::update_connectivity() } void -TiogaBlock::update_iblanks( +TiogaBlock::update_iblanks() +{ + ScalarIntFieldType* ibf = + meta_.get_field(stk::topology::NODE_RANK, "iblank"); + + stk::mesh::Selector mesh_selector = get_node_selector(blkParts_); + const stk::mesh::BucketVector& mbkts = + bulk_.get_buckets(stk::topology::NODE_RANK, mesh_selector); + + auto& ibnode = bdata_.iblank_.h_view; + int ip = 0; + for (auto b : mbkts) { + int* ib = stk::mesh::field_data(*ibf, *b); + for (size_t in = 0; in < b->size(); in++) { + ib[in] = ibnode(ip++); + } + } +} + +void +TiogaBlock::update_fringe_and_hole_nodes( std::vector& holeNodes, std::vector& fringeNodes) { @@ -240,8 +260,6 @@ TiogaBlock::update_iblanks( for (auto b : mbkts) { int* ib = stk::mesh::field_data(*ibf, *b); for (size_t in = 0; in < b->size(); in++) { - ib[in] = ibnode(ip++); - if (ib[in] == 0) { holeNodes.push_back((*b)[in]); } else if (ib[in] == -1) { @@ -251,6 +269,26 @@ TiogaBlock::update_iblanks( } } +void +TiogaBlock::update_tioga_iblanks() +{ + ScalarIntFieldType* ibf = + meta_.get_field(stk::topology::NODE_RANK, "iblank"); + + stk::mesh::Selector mesh_selector = get_node_selector(blkParts_); + const stk::mesh::BucketVector& mbkts = + bulk_.get_buckets(stk::topology::NODE_RANK, mesh_selector); + + auto& ibnode = bdata_.iblank_.h_view; + int ip = 0; + for (auto b : mbkts) { + int* ib = stk::mesh::field_data(*ibf, *b); + for (size_t in = 0; in < b->size(); in++) { + ibnode(ip++) = ib[in]; + } + } +} + void TiogaBlock::update_iblank_cell() { diff --git a/src/overset/TiogaSTKIface.C b/src/overset/TiogaSTKIface.C index 3fbbb8837..7667ab211 100644 --- a/src/overset/TiogaSTKIface.C +++ b/src/overset/TiogaSTKIface.C @@ -164,8 +164,7 @@ TiogaSTKIface::post_connectivity_work(const bool isDecoupled) { for (auto& tb : blocks_) { // Update IBLANK information at nodes and elements - tb->update_iblanks( - oversetManager_.holeNodes_, oversetManager_.fringeNodes_); + tb->update_iblanks(); tb->update_iblank_cell(); // For each block determine donor elements that needs to be ghosted to other @@ -178,7 +177,17 @@ TiogaSTKIface::post_connectivity_work(const bool isDecoupled) sierra::nalu::ScalarIntFieldType* ibf = meta_.get_field(stk::topology::NODE_RANK, "iblank"); std::vector pvec{ibf}; - stk::mesh::copy_owned_to_shared(bulk_, pvec); + stk::mesh::parallel_min(bulk_, {ibf}); + + for (auto& tb : blocks_) { + // Call update_iblanks again to assign holeNodes and fringeNodes vectors + // after iblanks on shared nodes are corrected + tb->update_fringe_and_hole_nodes( + oversetManager_.holeNodes_, oversetManager_.fringeNodes_); + // Return the corrected iblank field to Tioga prior to donor-to-receptor + // interpolation + tb->update_tioga_iblanks(); + } post_connectivity_sync();