mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: masterCoarsest: demo case for processorAgglom. See !645
This commit is contained in:
@ -1,5 +1,3 @@
|
|||||||
/* lduPrimitiveMesh.C */
|
|
||||||
|
|
||||||
laplacianFoam.C
|
laplacianFoam.C
|
||||||
|
|
||||||
EXE = $(FOAM_APPBIN)/laplacianFoam
|
EXE = $(FOAM_APPBIN)/laplacianFoam
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -688,15 +688,6 @@ Foam::lduPrimitiveMesh::lduPrimitiveMesh
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Still external (non proc) interface
|
// Still external (non proc) interface
|
||||||
//FatalErrorInFunction
|
|
||||||
//WarningInFunction
|
|
||||||
// << "At mesh from processor " << procIDs[procMeshI]
|
|
||||||
// << " have interface " << intI
|
|
||||||
// << " of unhandled type " << ldui.type()
|
|
||||||
// << " with size:" << ldui.faceCells().size()
|
|
||||||
// //<< exit(FatalError);
|
|
||||||
// << endl;
|
|
||||||
|
|
||||||
procToGlobal[procMeshI].append(intI);
|
procToGlobal[procMeshI].append(intI);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -739,7 +730,6 @@ Foam::lduPrimitiveMesh::lduPrimitiveMesh
|
|||||||
Pout<< endl;
|
Pout<< endl;
|
||||||
|
|
||||||
Pout<< "Remaining interfaces:" << endl;
|
Pout<< "Remaining interfaces:" << endl;
|
||||||
//forAllConstIters(unmergedMap, iter)
|
|
||||||
for (const auto& iter : unmergedMap.csorted())
|
for (const auto& iter : unmergedMap.csorted())
|
||||||
{
|
{
|
||||||
Pout<< " agglom procEdge:" << iter.key() << endl;
|
Pout<< " agglom procEdge:" << iter.key() << endl;
|
||||||
|
|||||||
@ -1450,374 +1450,6 @@ Foam::mapDistributeBase::mapDistributeBase
|
|||||||
constructSize_ = constructi;
|
constructSize_ = constructi;
|
||||||
}
|
}
|
||||||
|
|
||||||
//XXXXXXXX
|
|
||||||
/*
|
|
||||||
Foam::mapDistributeBase::mapDistributeBase
|
|
||||||
(
|
|
||||||
const UPtrList<const mapDistributeBase>& maps,
|
|
||||||
const labelList& localRanks,
|
|
||||||
const label newComm,
|
|
||||||
const labelListList& newToOldRanks,// from newComm to comm_
|
|
||||||
labelList& startOfLocal,
|
|
||||||
List<Map<label>>& compactMaps
|
|
||||||
)
|
|
||||||
:
|
|
||||||
constructSize_(0),
|
|
||||||
subHasFlip_(false),
|
|
||||||
constructHasFlip_(false),
|
|
||||||
comm_(-1),
|
|
||||||
schedulePtr_(nullptr)
|
|
||||||
{
|
|
||||||
if (maps.empty())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
comm_ = newComm;
|
|
||||||
subHasFlip_ = maps[0].subHasFlip();
|
|
||||||
constructHasFlip_ = maps[0].constructHasFlip();
|
|
||||||
|
|
||||||
const label nNewRanks = newToOldRanks.size();
|
|
||||||
const label myNewRank = UPstream::myProcNo(newComm);
|
|
||||||
if (nNewRanks != UPstream::nProcs(newComm))
|
|
||||||
{
|
|
||||||
FatalErrorInFunction<< "nNewRanks:" << nNewRanks
|
|
||||||
<< " nProcs:" << UPstream::nProcs(newComm)
|
|
||||||
<< exit(FatalError);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (localRanks.size() != maps.size())
|
|
||||||
{
|
|
||||||
FatalErrorInFunction
|
|
||||||
<< "Number of maps:" << maps.size()
|
|
||||||
<< " number of localRanks:" << localRanks.size()
|
|
||||||
<< exit(FatalError);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sanity checks
|
|
||||||
const auto& map0 = maps[0];
|
|
||||||
forAll(maps, mapi)
|
|
||||||
{
|
|
||||||
const auto& map = maps[mapi];
|
|
||||||
|
|
||||||
if
|
|
||||||
(
|
|
||||||
(map.comm() != map0.comm())
|
|
||||||
|| (map.subHasFlip() != map0.subHasFlip())
|
|
||||||
|| (map.constructHasFlip() != map0.constructHasFlip())
|
|
||||||
)
|
|
||||||
{
|
|
||||||
FatalErrorInFunction
|
|
||||||
<< "Maps should all be the same form"
|
|
||||||
<< " Map " << mapi
|
|
||||||
<< " has comm:" << map.comm()
|
|
||||||
<< " subHasFlip:" << map.subHasFlip()
|
|
||||||
<< " constructHasFlip:" << map.constructHasFlip()
|
|
||||||
<< " which is different from map 0"
|
|
||||||
<< exit(FatalError);
|
|
||||||
}
|
|
||||||
|
|
||||||
const label localRank = localRanks[mapi];
|
|
||||||
const auto& constructOwn = maps[mapi].constructMap()[localRank];
|
|
||||||
forAll(constructOwn, i)
|
|
||||||
{
|
|
||||||
if (constructOwn[i] != i)
|
|
||||||
{
|
|
||||||
FatalErrorInFunction
|
|
||||||
<< "Maps constructMap not identity."
|
|
||||||
<< " Map " << mapi
|
|
||||||
<< " constructMap:" << flatOutput(constructOwn)
|
|
||||||
<< exit(FatalError);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
constructMap_.resize_nocopy(nNewRanks);
|
|
||||||
subMap_.resize_nocopy(nNewRanks);
|
|
||||||
|
|
||||||
|
|
||||||
// Store starts. All local data gets appended.
|
|
||||||
startOfLocal.setSize(maps.size()+1);
|
|
||||||
compactMaps.resize_nocopy(maps.size());
|
|
||||||
|
|
||||||
label constructi = 0;
|
|
||||||
forAll(maps, mapi)
|
|
||||||
{
|
|
||||||
startOfLocal[mapi] = constructi;
|
|
||||||
|
|
||||||
const label localRank = localRanks[mapi];
|
|
||||||
const auto& map = maps[mapi].constructMap()[localRank];
|
|
||||||
|
|
||||||
//Pout<< "map:" << mapi << " has localRank:" << localRank
|
|
||||||
// << " and local size:" << map.size()
|
|
||||||
// << " and starts at:" << constructi << endl;
|
|
||||||
|
|
||||||
// Presize compaction array
|
|
||||||
const label nRemote = maps[mapi].constructSize()-map.size();
|
|
||||||
compactMaps[mapi].resize(2*nRemote);
|
|
||||||
|
|
||||||
constructi += map.size();
|
|
||||||
}
|
|
||||||
startOfLocal.last() = constructi;
|
|
||||||
|
|
||||||
|
|
||||||
// Determine start of constructed remote data. This is used to get the
|
|
||||||
// local offset which can then be used to get the relative subMap location.
|
|
||||||
labelListList startOfRemote(maps.size());
|
|
||||||
forAll(maps, mapi)
|
|
||||||
{
|
|
||||||
const label nOldProcs = maps[mapi].constructMap().size();
|
|
||||||
labelList& starts = startOfRemote[mapi];
|
|
||||||
|
|
||||||
starts.setSize(nOldProcs, labelMax);
|
|
||||||
forAll(maps[mapi].constructMap(), oldProci)
|
|
||||||
{
|
|
||||||
const labelList& map = maps[mapi].constructMap()[oldProci];
|
|
||||||
forAll(map, i)
|
|
||||||
{
|
|
||||||
const label index
|
|
||||||
(
|
|
||||||
constructHasFlip_
|
|
||||||
? mag(map[i])-1
|
|
||||||
: map[i]
|
|
||||||
);
|
|
||||||
starts[oldProci] = min(starts[oldProci], index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Adjust the submaps. Only the ones going to now remote processors
|
|
||||||
// need to be kept.
|
|
||||||
|
|
||||||
subMap_[myNewRank] = identity(startOfLocal.last());
|
|
||||||
constructMap_[myNewRank] = subMap_[myNewRank];
|
|
||||||
|
|
||||||
// Do (still) remote sub data. Get sent in processor order
|
|
||||||
forAll(newToOldRanks, newProci)
|
|
||||||
{
|
|
||||||
if (newProci != myNewRank)
|
|
||||||
{
|
|
||||||
const auto& oldProcs = newToOldRanks[newProci];
|
|
||||||
|
|
||||||
label allSize = 0;
|
|
||||||
for (const label oldProci : oldProcs)
|
|
||||||
{
|
|
||||||
forAll(maps, mapi)
|
|
||||||
{
|
|
||||||
const auto& map = maps[mapi].subMap()[oldProci];
|
|
||||||
allSize += map.size();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
labelList& mySub = subMap_[newProci];
|
|
||||||
mySub.resize_nocopy(allSize);
|
|
||||||
|
|
||||||
allSize = 0;
|
|
||||||
forAll(maps, mapi)
|
|
||||||
{
|
|
||||||
for (const label oldProci : oldProcs)
|
|
||||||
{
|
|
||||||
const auto& map = maps[mapi].subMap()[oldProci];
|
|
||||||
|
|
||||||
if (!map.size())
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
SubList<label> slice(mySub, map.size(), allSize);
|
|
||||||
forAll(map, i)
|
|
||||||
{
|
|
||||||
// old slot (map[i]) becomes new slot by adding the
|
|
||||||
// offset
|
|
||||||
if (subHasFlip_ && map[i] < 0)
|
|
||||||
{
|
|
||||||
slice[i] = map[i]-startOfLocal[mapi];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
slice[i] = map[i]+startOfLocal[mapi];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
allSize += map.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
//Pout<< "for map:" << mapi
|
|
||||||
// << " done all oldProcs:" << oldProcs
|
|
||||||
// << " and have combined sub:"
|
|
||||||
// << flatOutput(SubList<label>(mySub, allSize)) << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Adjust mapping for now local construct data
|
|
||||||
{
|
|
||||||
const auto& oldProcs = newToOldRanks[myNewRank];
|
|
||||||
|
|
||||||
for (const label oldProci : oldProcs)
|
|
||||||
{
|
|
||||||
forAll(maps, mapi)
|
|
||||||
{
|
|
||||||
if (oldProci != localRanks[mapi])
|
|
||||||
{
|
|
||||||
// Old-local never in compactMap since already in
|
|
||||||
// startOfLocal
|
|
||||||
|
|
||||||
const auto& map = maps[mapi].constructMap()[oldProci];
|
|
||||||
const label sourceMapi = localRanks.find(oldProci);
|
|
||||||
const auto& subMap = maps[sourceMapi].subMap()[oldProci];
|
|
||||||
|
|
||||||
|
|
||||||
// So:
|
|
||||||
// - sourceMapi is sending to oldProci the subMap[oldProci]
|
|
||||||
// elements
|
|
||||||
// - mapi is receiving (in same order) and inserting them
|
|
||||||
// into constructMap[oldProci]
|
|
||||||
|
|
||||||
const label offset = startOfLocal[sourceMapi];
|
|
||||||
// Construct map starts after the local data
|
|
||||||
const label nMapLocal = startOfRemote[mapi][oldProci];
|
|
||||||
|
|
||||||
auto& cptMap = compactMaps[mapi];
|
|
||||||
forAll(map, i)
|
|
||||||
{
|
|
||||||
// old slot position
|
|
||||||
const label index
|
|
||||||
(
|
|
||||||
constructHasFlip_
|
|
||||||
? mag(map[i])-1
|
|
||||||
: map[i]
|
|
||||||
);
|
|
||||||
// this was say the nth element in the data received
|
|
||||||
// from sourceMapi so work out the relative index in
|
|
||||||
// the constructMap and work out what element was
|
|
||||||
// received and put it in the correct new location.
|
|
||||||
const label newIndex = subMap[index-nMapLocal]+offset;
|
|
||||||
|
|
||||||
// Note: should always warn for duplicates? Or only if
|
|
||||||
// different?
|
|
||||||
if
|
|
||||||
(
|
|
||||||
!cptMap.insert(index, newIndex)
|
|
||||||
&& cptMap[index] != newIndex
|
|
||||||
)
|
|
||||||
{
|
|
||||||
FatalErrorInFunction<< "Duplicate insertion"
|
|
||||||
<< "From oldProc:" << oldProci
|
|
||||||
<< " on map:" << mapi
|
|
||||||
<< " at index:" << i
|
|
||||||
<< " have construct slot:" << index
|
|
||||||
<< " new index:" << newIndex
|
|
||||||
<< " but already have entry:" << cptMap[index]
|
|
||||||
<< " on for that slot"
|
|
||||||
<< exit(FatalError);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Do (still) remote construct data. (construct-maps are where the received
|
|
||||||
// data gets stored in the flat list). Store mapping from old slot to new
|
|
||||||
// slot.
|
|
||||||
forAll(newToOldRanks, newProci)
|
|
||||||
{
|
|
||||||
if (newProci != myNewRank)
|
|
||||||
{
|
|
||||||
const auto& oldProcs = newToOldRanks[newProci];
|
|
||||||
|
|
||||||
label allSize = 0;
|
|
||||||
for (const label oldProci : oldProcs)
|
|
||||||
{
|
|
||||||
forAll(maps, mapi)
|
|
||||||
{
|
|
||||||
const auto& map = maps[mapi].constructMap()[oldProci];
|
|
||||||
allSize += map.size();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
labelList& myConstruct = constructMap_[newProci];
|
|
||||||
myConstruct.resize_nocopy(allSize);
|
|
||||||
|
|
||||||
allSize = 0;
|
|
||||||
for (const label oldProci : oldProcs)
|
|
||||||
{
|
|
||||||
forAll(maps, mapi)
|
|
||||||
{
|
|
||||||
const auto& map = maps[mapi].constructMap()[oldProci];
|
|
||||||
|
|
||||||
if (!map.size())
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const label nMapLocal = startOfRemote[mapi][oldProci];
|
|
||||||
SubList<label> slice(myConstruct, map.size(), allSize);
|
|
||||||
auto& cptMap = compactMaps[mapi];
|
|
||||||
forAll(map, i)
|
|
||||||
{
|
|
||||||
// Construct maps are slots into the old data
|
|
||||||
const label index
|
|
||||||
(
|
|
||||||
constructHasFlip_
|
|
||||||
? mag(map[i])-1
|
|
||||||
: map[i]
|
|
||||||
);
|
|
||||||
// Equivalent index into the new data
|
|
||||||
const label newIndex = (map[i]-nMapLocal) + constructi;
|
|
||||||
|
|
||||||
slice[i] = newIndex;
|
|
||||||
|
|
||||||
if
|
|
||||||
(
|
|
||||||
!cptMap.insert(index, newIndex)
|
|
||||||
&& cptMap[index] != newIndex
|
|
||||||
)
|
|
||||||
{
|
|
||||||
FatalErrorInFunction<< "Duplicate insertion"
|
|
||||||
<< "From oldProc:" << oldProci
|
|
||||||
<< " on map:" << mapi
|
|
||||||
<< " at index:" << i
|
|
||||||
<< " have construct slot:" << index
|
|
||||||
<< " new index:" << newIndex
|
|
||||||
<< " but already have entry:" << cptMap[index]
|
|
||||||
<< " on for that slot"
|
|
||||||
<< exit(FatalError);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
constructi += map.size();
|
|
||||||
allSize += map.size();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
constructSize_ = constructi;
|
|
||||||
|
|
||||||
//Pout<< "constructSize:" << constructSize_ << endl;
|
|
||||||
//Pout<< "startOfLocal:" << flatOutput(startOfLocal) << endl;
|
|
||||||
//Pout<< "compactMaps:" << flatOutput(compactMaps) << endl;
|
|
||||||
//Pout<< "subMap:" << endl;
|
|
||||||
//forAll(subMap_, newRanki)
|
|
||||||
//{
|
|
||||||
// Pout<< " Sending to " << newRanki << " "
|
|
||||||
// << flatOutput(subMap_[newRanki]) << endl;
|
|
||||||
//}
|
|
||||||
//Pout<< "constructMap:" << endl;
|
|
||||||
//forAll(constructMap_, newRanki)
|
|
||||||
//{
|
|
||||||
// Pout<< " Recieving from " << newRanki << " "
|
|
||||||
// << flatOutput(constructMap_[newRanki]) << endl;
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
//XXXXXXX
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
|||||||
@ -9,6 +9,6 @@ runApplication blockMesh
|
|||||||
|
|
||||||
runApplication decomposePar
|
runApplication decomposePar
|
||||||
|
|
||||||
runParallel $(getApplication)
|
runParallel $(getApplication) -debug-switch GAMGAgglomeration
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
|
|||||||
@ -0,0 +1,3 @@
|
|||||||
|
Variant of implicitAMI that does
|
||||||
|
- no implicit AMI
|
||||||
|
- but processor agglomeration
|
||||||
@ -19,8 +19,15 @@ solvers
|
|||||||
{
|
{
|
||||||
T
|
T
|
||||||
{
|
{
|
||||||
solver PCG;
|
//solver PCG;
|
||||||
preconditioner DIC;
|
//preconditioner DIC;
|
||||||
|
|
||||||
|
//- Processor agglomeration with cyclicAMI
|
||||||
|
solver GAMG;
|
||||||
|
nCellsInCoarsestLevel 1;
|
||||||
|
smoother GaussSeidel;
|
||||||
|
processorAgglomerator masterCoarsest;
|
||||||
|
|
||||||
tolerance 1e-06;
|
tolerance 1e-06;
|
||||||
relTol 0;
|
relTol 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user