ENH: cyclicGAMGInterface.C: cleaner algorithm

This commit is contained in:
mattijs
2011-10-28 15:24:25 +01:00
parent e5a635c8b1
commit 38c1e9aedd

View File

@ -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++;
}
}
}
} }