Skip to content

Commit 552890e

Browse files
committed
patchkernel: add tracking of interfaces during adaptation/partitioning
1 parent 9e70a47 commit 552890e

File tree

7 files changed

+205
-60
lines changed

7 files changed

+205
-60
lines changed

src/patchkernel/patch_kernel.cpp

+135-32
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ std::vector<adaption::Info> PatchKernel::update(bool trackAdaption, bool squeeze
629629
}
630630

631631
// Finalize alterations
632-
finalizeAlterations(squeezeStorage);
632+
mergeAdaptionInfo(finalizeAlterations(trackAdaption, squeezeStorage), adaptionData);
633633

634634
// Spawn
635635
bool spawnNeeed = (getSpawnStatus() == SPAWN_NEEDED);
@@ -795,7 +795,9 @@ std::vector<adaption::Info> PatchKernel::adaptionPrepare(bool trackAdaption)
795795
- new ghost cells that have been created;
796796
- new ghost vertices that have been created;
797797
- ghost cells that have been deleted;
798-
- ghost vertices that have been deleted.
798+
- ghost vertices that have been deleted;
799+
- new interfaces that have been created;
800+
- interfaces that have been deleted.
799801
800802
\param trackAdaption if set to true the function will return the changes
801803
done to the patch during the adaption
@@ -818,10 +820,10 @@ std::vector<adaption::Info> PatchKernel::adaptionAlter(bool trackAdaption, bool
818820
}
819821

820822
// Adapt the patch
821-
adaptionData = _adaptionAlter(trackAdaption);
823+
mergeAdaptionInfo(_adaptionAlter(trackAdaption), adaptionData);
822824

823825
// Finalize patch alterations
824-
finalizeAlterations(squeezeStorage);
826+
mergeAdaptionInfo(finalizeAlterations(trackAdaption, squeezeStorage), adaptionData);
825827

826828
// Update the status
827829
setAdaptionStatus(ADAPTION_ALTERED);
@@ -864,11 +866,15 @@ void PatchKernel::settleAdaptionMarkers()
864866
/*!
865867
Finalize patch alterations.
866868
869+
\param trackAdaption if set to true the function will return the changes
870+
that will be performed in the alter step
867871
\param squeezeStorage if set to true patch data structures will be
868872
squeezed
869873
*/
870-
void PatchKernel::finalizeAlterations(bool squeezeStorage)
874+
std::vector<adaption::Info> PatchKernel::finalizeAlterations(bool trackAdaption, bool squeezeStorage)
871875
{
876+
std::vector<adaption::Info> adaptionData;
877+
872878
// Flush vertex data structures
873879
m_vertices.flush();
874880

@@ -890,7 +896,7 @@ void PatchKernel::finalizeAlterations(bool squeezeStorage)
890896
// Update interfaces
891897
bool interfacesDirty = areInterfacesDirty();
892898
if (interfacesDirty) {
893-
updateInterfaces();
899+
mergeAdaptionInfo(updateInterfaces(false, trackAdaption), adaptionData);
894900
}
895901

896902
// Flush interfaces data structures
@@ -917,6 +923,8 @@ void PatchKernel::finalizeAlterations(bool squeezeStorage)
917923
m_cells.sync();
918924
m_interfaces.sync();
919925
m_vertices.sync();
926+
927+
return adaptionData;
920928
}
921929

922930
/*!
@@ -1063,43 +1071,79 @@ void PatchKernel::resetCells()
10631071
10641072
This function doesn't change the build strategy, it only resets the
10651073
existing interface.
1074+
1075+
\param trackAdaption if set to true the changes to the patch will be
1076+
tracked
10661077
*/
1067-
void PatchKernel::resetInterfaces()
1078+
std::vector<adaption::Info> PatchKernel::resetInterfaces(bool trackAdaption)
10681079
{
1080+
std::vector<adaption::Info> adaptionData;
1081+
10691082
// Early return if no interfaces have been built
10701083
if (getInterfacesBuildStrategy() == INTERFACES_NONE) {
1071-
return;
1084+
return adaptionData;
10721085
}
10731086

10741087
// Reset the interfaces
1075-
_resetInterfaces(false);
1088+
adaptionData = _resetInterfaces(trackAdaption, false);
10761089

10771090
// Mark cell interfaces as dirty
10781091
setCellAlterationFlags(FLAG_INTERFACES_DIRTY);
10791092

10801093
// Clear list of altered interfaces
10811094
m_alteredInterfaces.clear();
1095+
1096+
return adaptionData;
10821097
}
10831098

10841099
/*!
10851100
Internal function to reset the interfaces of the patch.
10861101
10871102
This function doesn't change the alteration flags.
10881103
1104+
\param trackAdaption if set to true the changes to the patch will be
1105+
tracked
10891106
\param release if it's true the memory hold by the interfaces will be
10901107
released, otherwise the interfaces will be reset but their memory will
10911108
not be released
10921109
*/
1093-
void PatchKernel::_resetInterfaces(bool release)
1110+
std::vector<adaption::Info> PatchKernel::_resetInterfaces(bool trackAdaption, bool release)
10941111
{
1112+
// Reset cell interfaces
10951113
for (auto &cell : m_cells) {
10961114
cell.resetInterfaces(!release);
10971115
}
10981116

1117+
// Track deleted interfaces
1118+
adaption::InfoCollection adaptionData;
1119+
if (trackAdaption) {
1120+
// Identify interior interfaces
1121+
std::unordered_set<long> internalInterfaces;
1122+
for (CellConstIterator cellItr = internalCellBegin(); cellItr != internalCellEnd(); ++cellItr) {
1123+
const Cell &cell = *cellItr;
1124+
const int nCellInterfaces = cell.getInterfaceCount();
1125+
const long *cellInterfaces = cell.getInterfaces();
1126+
for (int k = 0; k < nCellInterfaces; ++k) {
1127+
long interfaceId = cellInterfaces[k];
1128+
internalInterfaces.insert(interfaceId);
1129+
}
1130+
}
1131+
1132+
// Track interfaces that will be deleted
1133+
//
1134+
// Only interfaces on interior cells will be tracked.
1135+
std::size_t adaptionInfoId = adaptionData.insert(adaption::TYPE_DELETION, adaption::ENTITY_INTERFACE);
1136+
adaption::Info &adaptionInfo = adaptionData[adaptionInfoId];
1137+
adaptionInfo.previous = std::vector<long>(internalInterfaces.begin(), internalInterfaces.end());
1138+
}
1139+
1140+
// Delete interfaces
10991141
m_interfaces.clear(release);
11001142
if (m_interfaceIdGenerator) {
11011143
m_interfaceIdGenerator->reset();
11021144
}
1145+
1146+
return adaptionData.dump();
11031147
}
11041148

11051149
/*!
@@ -6335,9 +6379,12 @@ void PatchKernel::buildInterfaces()
63356379
adjacencies are not yet initialized an exception is thrown.
63366380
63376381
\param strategy is the build strategy that will be used
6382+
\param trackAdaption if set to true the changes to the patch will be tracked
63386383
*/
6339-
void PatchKernel::initializeInterfaces(InterfacesBuildStrategy strategy)
6384+
std::vector<adaption::Info> PatchKernel::initializeInterfaces(InterfacesBuildStrategy strategy, bool trackAdaption)
63406385
{
6386+
std::vector<adaption::Info> adaptionData;
6387+
63416388
// Interfaces need adjacencies
63426389
if (getAdjacenciesBuildStrategy() == ADJACENCIES_NONE) {
63436390
throw std::runtime_error ("Adjacencies are mandatory for building the interfaces.");
@@ -6349,10 +6396,10 @@ void PatchKernel::initializeInterfaces(InterfacesBuildStrategy strategy)
63496396
// Early return if we don't need interfaces
63506397
if (strategy == INTERFACES_NONE) {
63516398
if (currentStrategy != INTERFACES_NONE) {
6352-
destroyInterfaces();
6399+
mergeAdaptionInfo(destroyInterfaces(trackAdaption), adaptionData);
63536400
}
63546401

6355-
return;
6402+
return adaptionData;
63566403
}
63576404

63586405
// Update the build strategy
@@ -6361,30 +6408,35 @@ void PatchKernel::initializeInterfaces(InterfacesBuildStrategy strategy)
63616408
}
63626409

63636410
// Reset interfaces
6364-
resetInterfaces();
6411+
mergeAdaptionInfo(resetInterfaces(trackAdaption), adaptionData);
63656412

63666413
// Update the interfaces
6367-
updateInterfaces();
6414+
mergeAdaptionInfo(updateInterfaces(false, trackAdaption), adaptionData);
6415+
6416+
return adaptionData;
63686417
}
63696418

63706419
/*!
63716420
Update the interfaces of the patch.
63726421
63736422
\param forcedUpdated if set to true, bounding box information will be
63746423
updated also if they are not marked as dirty
6424+
\param trackAdaption if set to true the changes to the patch will be tracked
63756425
*/
6376-
void PatchKernel::updateInterfaces(bool forcedUpdated)
6426+
std::vector<adaption::Info> PatchKernel::updateInterfaces(bool forcedUpdated, bool trackAdaption)
63776427
{
6428+
std::vector<adaption::Info> adaptionData;
6429+
63786430
// Early return if interfaces are not built
63796431
InterfacesBuildStrategy currentStrategy = getInterfacesBuildStrategy();
63806432
if (currentStrategy == INTERFACES_NONE) {
6381-
return;
6433+
return adaptionData;
63826434
}
63836435

63846436
// Check if the interfaces are dirty
63856437
bool interfacesDirty = areInterfacesDirty();
63866438
if (!interfacesDirty && !forcedUpdated) {
6387-
return;
6439+
return adaptionData;
63886440
}
63896441

63906442
// Interfaces need up-to-date adjacencies
@@ -6398,10 +6450,10 @@ void PatchKernel::updateInterfaces(bool forcedUpdated)
63986450
setExpert(true);
63996451

64006452
// Prune stale interfaces
6401-
pruneStaleInterfaces();
6453+
mergeAdaptionInfo(pruneStaleInterfaces(trackAdaption), adaptionData);
64026454

64036455
// Update interfaces
6404-
_updateInterfaces();
6456+
mergeAdaptionInfo(_updateInterfaces(trackAdaption), adaptionData);
64056457

64066458
// Interfaces are now updated
64076459
unsetCellAlterationFlags(FLAG_INTERFACES_DIRTY);
@@ -6410,25 +6462,32 @@ void PatchKernel::updateInterfaces(bool forcedUpdated)
64106462
// Set original advanced editing status
64116463
setExpert(originalExpertStatus);
64126464
} else {
6413-
initializeInterfaces(currentStrategy);
6465+
mergeAdaptionInfo(initializeInterfaces(currentStrategy, trackAdaption), adaptionData);
64146466
}
6467+
6468+
return adaptionData;
64156469
}
64166470

64176471
/*!
64186472
Destroy the interfaces.
64196473
64206474
After deleting the interfaces, this function changes the build strategy
64216475
to "None".
6476+
6477+
\param trackAdaption if set to true the changes to the patch will be
6478+
tracked
64226479
*/
6423-
void PatchKernel::destroyInterfaces()
6480+
std::vector<adaption::Info> PatchKernel::destroyInterfaces(bool trackAdaption)
64246481
{
6482+
std::vector<adaption::Info> adaptionData;
6483+
64256484
// Early return if no interfaces have been built
64266485
if (getInterfacesBuildStrategy() == INTERFACES_NONE) {
6427-
return;
6486+
return adaptionData;
64286487
}
64296488

6430-
// Destroy the interfaces
6431-
_resetInterfaces(true);
6489+
// Reset the interfaces
6490+
adaptionData = _resetInterfaces(trackAdaption, true);
64326491

64336492
// Clear list of cells with dirty interfaces
64346493
unsetCellAlterationFlags(FLAG_INTERFACES_DIRTY);
@@ -6438,19 +6497,26 @@ void PatchKernel::destroyInterfaces()
64386497

64396498
// Set interface build strategy
64406499
setInterfacesBuildStrategy(INTERFACES_NONE);
6500+
6501+
return adaptionData;
64416502
}
64426503

64436504
/*!
64446505
Prune stale interfaces.
64456506
64466507
The list of cells to process and the list of stale interfaces are filled
64476508
during cell deletion.
6509+
6510+
\param trackAdaption if set to true the changes to the patch will be tracked
6511+
\result If the adaption is tracked, returns a vector of adaption::Info
6512+
with all the changes done to the patch during the adaption, otherwise an
6513+
empty vector will be returned.
64486514
*/
6449-
void PatchKernel::pruneStaleInterfaces()
6515+
std::vector<adaption::Info> PatchKernel::pruneStaleInterfaces(bool trackAdaption)
64506516
{
64516517
// Early return if no interfaces have been built
64526518
if (getInterfacesBuildStrategy() == INTERFACES_NONE) {
6453-
return;
6519+
return std::vector<adaption::Info>();
64546520
}
64556521

64566522
// Remove dangling interfaces from cells
@@ -6495,15 +6561,27 @@ void PatchKernel::pruneStaleInterfaces()
64956561
danglingInterfaces.push_back(interfaceId);
64966562
}
64976563
deleteInterfaces(danglingInterfaces);
6564+
6565+
// Track changes
6566+
adaption::InfoCollection adaptionData;
6567+
if (trackAdaption) {
6568+
std::size_t adaptionInfoId = adaptionData.insert(adaption::TYPE_DELETION, adaption::ENTITY_INTERFACE);
6569+
adaption::Info &adaptionInfo = adaptionData[adaptionInfoId];
6570+
adaptionInfo.previous = std::move(danglingInterfaces);
6571+
}
6572+
6573+
return adaptionData.dump();
64986574
}
64996575

65006576
/*!
65016577
Internal function to update the interfaces of the patch.
65026578
65036579
The function will process the cells whose interfaces have been marked as
65046580
dirty.
6581+
6582+
\param trackAdaption if set to true the changes to the patch will be tracked
65056583
*/
6506-
void PatchKernel::_updateInterfaces()
6584+
std::vector<adaption::Info> PatchKernel::_updateInterfaces(bool trackAdaption)
65076585
{
65086586
// Update interfaces
65096587
//
@@ -6516,6 +6594,7 @@ void PatchKernel::_updateInterfaces()
65166594
//
65176595
// On border faces of internal cells we need to build an interface, also
65186596
// if there are no adjacencies.
6597+
std::vector<long> createdInterfaces;
65196598
for (const auto &entry : m_alteredCells) {
65206599
AlterationFlags cellAlterationFlags = entry.second;
65216600
if (!testAlterationFlags(cellAlterationFlags, FLAG_INTERFACES_DIRTY)) {
@@ -6545,14 +6624,35 @@ void PatchKernel::_updateInterfaces()
65456624

65466625
int neighFace = findAdjoinNeighFace(cell, face, *neigh);
65476626

6548-
buildCellInterface(&cell, face, neigh, neighFace);
6627+
// Build the interface
6628+
InterfaceIterator interfaceIterator = buildCellInterface(&cell, face, neigh, neighFace);
6629+
6630+
// Track changes
6631+
if (trackAdaption) {
6632+
createdInterfaces.push_back(interfaceIterator.getId());
6633+
}
65496634
}
65506635
} else if (nFaceInterfaces == 0) {
65516636
// Internal borderes need an interface
6552-
buildCellInterface(&cell, face, nullptr, -1);
6637+
InterfaceIterator interfaceIterator = buildCellInterface(&cell, face, nullptr, -1);
6638+
6639+
// Track changes
6640+
if (trackAdaption) {
6641+
createdInterfaces.push_back(interfaceIterator.getId());
6642+
}
65536643
}
65546644
}
65556645
}
6646+
6647+
// Track changes
6648+
adaption::InfoCollection adaptionData;
6649+
if (trackAdaption) {
6650+
std::size_t adaptionInfoId = adaptionData.insert(adaption::TYPE_CREATION, adaption::ENTITY_INTERFACE);
6651+
adaption::Info &adaptionInfo = adaptionData[adaptionInfoId];
6652+
adaptionInfo.current = std::move(createdInterfaces);
6653+
}
6654+
6655+
return adaptionData.dump();
65566656
}
65576657

65586658
/*!
@@ -8342,12 +8442,15 @@ void PatchKernel::mergeAdaptionInfo(std::vector<adaption::Info> &&source, std::v
83428442
{
83438443
if (source.empty()) {
83448444
return;
8345-
} else if (destination.empty()) {
8445+
}
8446+
8447+
if (destination.empty()) {
83468448
destination.swap(source);
83478449
return;
83488450
}
83498451

8350-
throw std::runtime_error ("Unable to merge the adaption info.");
8452+
destination.insert(destination.end(), std::make_move_iterator(source.begin()), std::make_move_iterator(source.end()));
8453+
source.clear();
83518454
}
83528455

83538456
}

0 commit comments

Comments
 (0)