mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: cyclicGAMGInterface.C: cleaner algorithm
This commit is contained in:
@ -25,7 +25,8 @@ License
|
|||||||
|
|
||||||
#include "cyclicGAMGInterface.H"
|
#include "cyclicGAMGInterface.H"
|
||||||
#include "addToRunTimeSelectionTable.H"
|
#include "addToRunTimeSelectionTable.H"
|
||||||
#include "Map.H"
|
#include "labelPair.H"
|
||||||
|
#include "HashTable.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -62,180 +63,65 @@ Foam::cyclicGAMGInterface::cyclicGAMGInterface
|
|||||||
),
|
),
|
||||||
fineCyclicInterface_(refCast<const cyclicLduInterface>(fineInterface))
|
fineCyclicInterface_(refCast<const cyclicLduInterface>(fineInterface))
|
||||||
{
|
{
|
||||||
// Make a lookup table of entries for owner/neighbour
|
// From coarse face to coarse cell
|
||||||
Map<SLList<label> > neighboursTable
|
DynamicList<label> dynFaceCells(localRestrictAddressing.size());
|
||||||
|
// From fine face to coarse face
|
||||||
|
DynamicList<label> dynFaceRestrictAddressing
|
||||||
(
|
(
|
||||||
localRestrictAddressing.size()
|
localRestrictAddressing.size()
|
||||||
);
|
);
|
||||||
|
|
||||||
// Table of face-sets to be agglomerated
|
// From coarse cell pair to coarse face
|
||||||
Map<SLList<SLList<label> > > faceFaceTable
|
HashTable<label, labelPair, labelPair::Hash<> > cellsToCoarseFace
|
||||||
(
|
(
|
||||||
localRestrictAddressing.size()
|
2*localRestrictAddressing.size()
|
||||||
);
|
);
|
||||||
|
|
||||||
label nCoarseFaces = 0;
|
|
||||||
|
|
||||||
forAll(localRestrictAddressing, ffi)
|
forAll(localRestrictAddressing, ffi)
|
||||||
{
|
{
|
||||||
label curMaster = -1;
|
labelPair cellPair;
|
||||||
label curSlave = -1;
|
|
||||||
|
|
||||||
// Do switching on master/slave indexes based on the owner/neighbour of
|
// Do switching on master/slave indexes based on the owner/neighbour of
|
||||||
// the processor index such that both sides get the same answer.
|
// the processor index such that both sides get the same answer.
|
||||||
if (owner())
|
if (owner())
|
||||||
{
|
{
|
||||||
// Master side
|
// Master side
|
||||||
curMaster = localRestrictAddressing[ffi];
|
cellPair = labelPair
|
||||||
curSlave = neighbourRestrictAddressing[ffi];
|
(
|
||||||
|
localRestrictAddressing[ffi],
|
||||||
|
neighbourRestrictAddressing[ffi]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Slave side
|
// Slave side
|
||||||
curMaster = neighbourRestrictAddressing[ffi];
|
cellPair = labelPair
|
||||||
curSlave = localRestrictAddressing[ffi];
|
(
|
||||||
|
neighbourRestrictAddressing[ffi],
|
||||||
|
localRestrictAddressing[ffi]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Look for the master cell. If it has already got a face,
|
HashTable<label, labelPair, labelPair::Hash<> >::const_iterator fnd =
|
||||||
// add the coefficient to the face. If not, create a new face.
|
cellsToCoarseFace.find(cellPair);
|
||||||
if (neighboursTable.found(curMaster))
|
|
||||||
|
if (fnd == cellsToCoarseFace.end())
|
||||||
{
|
{
|
||||||
// Check all current neighbours to see if the current slave already
|
// New coarse face
|
||||||
// exists and if so, add the fine face to the agglomeration.
|
label coarseI = dynFaceCells.size();
|
||||||
|
dynFaceRestrictAddressing.append(coarseI);
|
||||||
SLList<label>& curNbrs = neighboursTable.find(curMaster)();
|
dynFaceCells.append(localRestrictAddressing[ffi]);
|
||||||
|
cellsToCoarseFace.insert(cellPair, coarseI);
|
||||||
SLList<SLList<label> >& curFaceFaces =
|
|
||||||
faceFaceTable.find(curMaster)();
|
|
||||||
|
|
||||||
bool nbrFound = false;
|
|
||||||
|
|
||||||
SLList<label>::iterator nbrsIter = curNbrs.begin();
|
|
||||||
|
|
||||||
SLList<SLList<label> >::iterator faceFacesIter =
|
|
||||||
curFaceFaces.begin();
|
|
||||||
|
|
||||||
for
|
|
||||||
(
|
|
||||||
;
|
|
||||||
nbrsIter != curNbrs.end(), faceFacesIter != curFaceFaces.end();
|
|
||||||
++nbrsIter, ++faceFacesIter
|
|
||||||
)
|
|
||||||
{
|
|
||||||
if (nbrsIter() == curSlave)
|
|
||||||
{
|
|
||||||
nbrFound = true;
|
|
||||||
faceFacesIter().append(ffi);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!nbrFound)
|
|
||||||
{
|
|
||||||
curNbrs.append(curSlave);
|
|
||||||
curFaceFaces.append(ffi);
|
|
||||||
|
|
||||||
// New coarse face created
|
|
||||||
nCoarseFaces++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// This master has got no neighbours yet. Add a neighbour
|
// Already have coarse face
|
||||||
// and a coefficient, thus creating a new face
|
dynFaceRestrictAddressing.append(fnd());
|
||||||
neighboursTable.insert(curMaster, SLList<label>(curSlave));
|
|
||||||
faceFaceTable.insert(curMaster, SLList<SLList<label> >(ffi));
|
|
||||||
|
|
||||||
// New coarse face created
|
|
||||||
nCoarseFaces++;
|
|
||||||
}
|
|
||||||
} // end for all fine faces
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
faceCells_.setSize(nCoarseFaces, -1);
|
|
||||||
faceRestrictAddressing_.setSize(localRestrictAddressing.size());
|
|
||||||
|
|
||||||
labelList contents = neighboursTable.toc();
|
|
||||||
|
|
||||||
// Reset face counter for re-use
|
|
||||||
nCoarseFaces = 0;
|
|
||||||
|
|
||||||
if (owner())
|
|
||||||
{
|
|
||||||
// On master side, the owner addressing is stored in table of contents
|
|
||||||
forAll(contents, masterI)
|
|
||||||
{
|
|
||||||
SLList<label>& curNbrs = neighboursTable.find(contents[masterI])();
|
|
||||||
|
|
||||||
SLList<SLList<label> >& curFaceFaces =
|
|
||||||
faceFaceTable.find(contents[masterI])();
|
|
||||||
|
|
||||||
SLList<label>::iterator nbrsIter = curNbrs.begin();
|
|
||||||
SLList<SLList<label> >::iterator faceFacesIter =
|
|
||||||
curFaceFaces.begin();
|
|
||||||
|
|
||||||
for
|
|
||||||
(
|
|
||||||
;
|
|
||||||
nbrsIter != curNbrs.end(), faceFacesIter != curFaceFaces.end();
|
|
||||||
++nbrsIter, ++faceFacesIter
|
|
||||||
)
|
|
||||||
{
|
|
||||||
faceCells_[nCoarseFaces] = contents[masterI];
|
|
||||||
|
|
||||||
for
|
|
||||||
(
|
|
||||||
SLList<label>::iterator facesIter = faceFacesIter().begin();
|
|
||||||
facesIter != faceFacesIter().end();
|
|
||||||
++facesIter
|
|
||||||
)
|
|
||||||
{
|
|
||||||
faceRestrictAddressing_[facesIter()] = nCoarseFaces;
|
|
||||||
}
|
|
||||||
|
|
||||||
nCoarseFaces++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// On slave side, the owner addressing is stored in linked lists
|
|
||||||
forAll(contents, masterI)
|
|
||||||
{
|
|
||||||
SLList<label>& curNbrs = neighboursTable.find(contents[masterI])();
|
|
||||||
|
|
||||||
SLList<SLList<label> >& curFaceFaces =
|
faceCells_.transfer(dynFaceCells);
|
||||||
faceFaceTable.find(contents[masterI])();
|
faceRestrictAddressing_.transfer(dynFaceRestrictAddressing);
|
||||||
|
|
||||||
SLList<label>::iterator nbrsIter = curNbrs.begin();
|
|
||||||
|
|
||||||
SLList<SLList<label> >::iterator faceFacesIter =
|
|
||||||
curFaceFaces.begin();
|
|
||||||
|
|
||||||
for
|
|
||||||
(
|
|
||||||
;
|
|
||||||
nbrsIter != curNbrs.end(), faceFacesIter != curFaceFaces.end();
|
|
||||||
++nbrsIter, ++faceFacesIter
|
|
||||||
)
|
|
||||||
{
|
|
||||||
faceCells_[nCoarseFaces] = nbrsIter();
|
|
||||||
|
|
||||||
for
|
|
||||||
(
|
|
||||||
SLList<label>::iterator facesIter = faceFacesIter().begin();
|
|
||||||
facesIter != faceFacesIter().end();
|
|
||||||
++facesIter
|
|
||||||
)
|
|
||||||
{
|
|
||||||
faceRestrictAddressing_[facesIter()] = nCoarseFaces;
|
|
||||||
}
|
|
||||||
|
|
||||||
nCoarseFaces++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user