diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createControls.H b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createControls.H deleted file mode 100644 index 320608dfcf..0000000000 --- a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createControls.H +++ /dev/null @@ -1,4 +0,0 @@ -bool ddtCorr -( - pimple.dict().getOrDefault("ddtCorr", true) -); diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/readControls.H b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/readControls.H deleted file mode 100644 index 83b43ffbf1..0000000000 --- a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/readControls.H +++ /dev/null @@ -1,9 +0,0 @@ -#include "readTimeControls.H" - -correctPhi = pimple.dict().getOrDefault("correctPhi", false); - -checkMeshCourantNo = - pimple.dict().getOrDefault("checkMeshCourantNo", false); - - -ddtCorr = pimple.dict().getOrDefault("ddtCorr", true); diff --git a/applications/solvers/heatTransfer/buoyantPimpleFoam/overBuoyantPimpleDyMFoam/readControls.H b/applications/solvers/heatTransfer/buoyantPimpleFoam/overBuoyantPimpleDyMFoam/readControls.H deleted file mode 100644 index 83b43ffbf1..0000000000 --- a/applications/solvers/heatTransfer/buoyantPimpleFoam/overBuoyantPimpleDyMFoam/readControls.H +++ /dev/null @@ -1,9 +0,0 @@ -#include "readTimeControls.H" - -correctPhi = pimple.dict().getOrDefault("correctPhi", false); - -checkMeshCourantNo = - pimple.dict().getOrDefault("checkMeshCourantNo", false); - - -ddtCorr = pimple.dict().getOrDefault("ddtCorr", true); diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createControls.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createControls.H deleted file mode 100644 index eec5afdfc8..0000000000 --- a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createControls.H +++ /dev/null @@ -1,26 +0,0 @@ -#include "createTimeControls.H" - -bool correctPhi -( - pimple.dict().getOrDefault("correctPhi", false) -); - -bool checkMeshCourantNo -( - pimple.dict().getOrDefault("checkMeshCourantNo", false) -); - -bool massFluxInterpolation -( - pimple.dict().getOrDefault("massFluxInterpolation", false) -); - -bool adjustFringe -( - pimple.dict().getOrDefault("oversetAdjustPhi", false) -); - -bool ddtCorr -( - pimple.dict().getOrDefault("ddtCorr", true) -); diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/interpolatedFaces.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/interpolatedFaces.H deleted file mode 100644 index 1bc385c90a..0000000000 --- a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/interpolatedFaces.H +++ /dev/null @@ -1,273 +0,0 @@ -// Interpolation used -interpolationCellPoint UInterpolator(HbyA); - -// Determine faces on outside of interpolated cells -bitSet isOwnerInterpolatedFace(mesh.nInternalFaces()); -bitSet isNeiInterpolatedFace(mesh.nInternalFaces()); - -// Determine donor cells -labelListList donorCell(mesh.nInternalFaces()); - -scalarListList weightCellCells(mesh.nInternalFaces()); - -// Interpolated HbyA faces -vectorField UIntFaces(mesh.nInternalFaces(), Zero); - -// Determine receptor neighbour cells -labelList receptorNeigCell(mesh.nInternalFaces(), -1); - -{ - const cellCellStencilObject& overlap = Stencil::New(mesh); - const labelList& cellTypes = overlap.cellTypes(); - const labelIOList& zoneID = overlap.zoneID(); - - label nZones = gMax(zoneID)+1; - PtrList meshParts(nZones); - labelList nCellsPerZone(nZones, Zero); - - // A mesh subset for each zone - forAll(meshParts, zonei) - { - meshParts.set - ( - zonei, - // Select cells where the zoneID == zonei - new fvMeshSubset(mesh, zonei, zoneID) - ); - } - - for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++) - { - label ownType = cellTypes[mesh.faceOwner()[faceI]]; - label neiType = cellTypes[mesh.faceNeighbour()[faceI]]; - if - ( - ownType == cellCellStencil::INTERPOLATED - && neiType == cellCellStencil::CALCULATED - ) - { - isOwnerInterpolatedFace.set(faceI); - - const vector& fc = mesh.faceCentres()[faceI]; - - for (label zoneI = 0; zoneI < nZones; zoneI++) - { - if (zoneI != zoneID[mesh.faceOwner()[faceI]]) - { - const fvMesh& partMesh = meshParts[zoneI].subMesh(); - const labelList& cellMap = meshParts[zoneI].cellMap(); - label cellI = partMesh.findCell(fc); - - if (cellI != -1) - { - // Determine weights - labelList stencil(partMesh.cellCells()[cellI]); - - stencil.append(cellI); - - label st = stencil.size(); - - donorCell[faceI].setSize(st); - - weightCellCells[faceI].setSize(st); - - scalarField weights(st); - - forAll(stencil, i) - { - scalar d = mag - ( - partMesh.cellCentres()[stencil[i]] - - fc - ); - weights[i] = 1.0/d; - donorCell[faceI][i] = cellMap[stencil[i]]; - } - weights /= sum(weights); - - weightCellCells[faceI] = weights; - - forAll(stencil, i) - { - UIntFaces[faceI] += - weightCellCells[faceI][i] - *UInterpolator.interpolate - ( - fc, - donorCell[faceI][i] - ); - } - - break; - } - } - } - - receptorNeigCell[faceI] = mesh.faceNeighbour()[faceI]; - } - else if - ( - ownType == cellCellStencil::CALCULATED - && neiType == cellCellStencil::INTERPOLATED - ) - { - isNeiInterpolatedFace.set(faceI); - - const vector& fc = mesh.faceCentres()[faceI]; - for (label zoneI = 0; zoneI < nZones; zoneI++) - { - if (zoneI != zoneID[mesh.faceNeighbour()[faceI]]) - { - const fvMesh& partMesh = meshParts[zoneI].subMesh(); - const labelList& cellMap = meshParts[zoneI].cellMap(); - label cellI = partMesh.findCell(fc); - - if (cellI != -1) - { - // Determine weights - labelList stencil(partMesh.cellCells()[cellI]); - - stencil.append(cellI); - - label st = stencil.size(); - - donorCell[faceI].setSize(st); - - weightCellCells[faceI].setSize(st); - - scalarField weights(st); - - forAll(stencil, i) - { - scalar d = mag - ( - partMesh.cellCentres()[stencil[i]] - - fc - ); - weights[i] = 1.0/d; - donorCell[faceI][i] = cellMap[stencil[i]]; - } - weights /= sum(weights); - - weightCellCells[faceI] = weights; - - forAll(stencil, i) - { - UIntFaces[faceI] += - weightCellCells[faceI][i] - *UInterpolator.interpolate - ( - fc, - donorCell[faceI][i] - ); - } - - break; - } - } - } - - receptorNeigCell[faceI] = mesh.faceOwner()[faceI]; - } - } -} - -// contravariant U -vectorField U1Contrav(mesh.nInternalFaces(), Zero); - -surfaceVectorField faceNormals(mesh.Sf()/mesh.magSf()); - -forAll(isNeiInterpolatedFace, faceI) -{ - label cellId = -1; - if (isNeiInterpolatedFace.test(faceI)) - { - cellId = mesh.faceNeighbour()[faceI]; - } - else if (isOwnerInterpolatedFace.test(faceI)) - { - cellId = mesh.faceOwner()[faceI]; - } - - if (cellId != -1) - { - const vector& n = faceNormals[faceI]; - vector n1(Zero); - - // 2-D cases - if (mesh.nSolutionD() == 2) - { - for (direction cmpt=0; cmpt mag(n.y()) && mag(n.x()) > mag(n.z())) - { - n1 = vector(n.y(), -n.x(), 0); - } - else if (mag(n.y()) > mag(n.z())) - { - n1 = vector(0, n.z(), -n.y()); - } - else - { - n1 = vector(-n.z(), 0, n.x()); - } - } - n1.normalise(); - - const vector n2 = normalised(n ^ n1); - - tensor rot = - tensor - ( - n.x() ,n.y(), n.z(), - n1.x() ,n1.y(), n1.z(), - n2.x() ,n2.y(), n2.z() - ); - -// tensor rot = -// tensor -// ( -// n & x ,n & y, n & z, -// n1 & x ,n1 & y, n1 & z, -// n2 & x ,n2 & y, n2 & z -// ); - - U1Contrav[faceI].x() = - 2*transform(rot, UIntFaces[faceI]).x() - - transform(rot, HbyA[receptorNeigCell[faceI]]).x(); - - U1Contrav[faceI].y() = transform(rot, HbyA[cellId]).y(); - - U1Contrav[faceI].z() = transform(rot, HbyA[cellId]).z(); - - HbyA[cellId] = transform(inv(rot), U1Contrav[faceI]); - } -} diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/readControls.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/readControls.H deleted file mode 100644 index 238a3e5c8f..0000000000 --- a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/readControls.H +++ /dev/null @@ -1,10 +0,0 @@ -#include "readTimeControls.H" - -correctPhi = pimple.dict().getOrDefault("correctPhi", false); - -checkMeshCourantNo = pimple.dict().getOrDefault("checkMeshCourantNo", false); - -massFluxInterpolation = - pimple.dict().getOrDefault("massFluxInterpolation", false); - -ddtCorr = pimple.dict().getOrDefault("ddtCorr", true); diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/createDyMControls.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/createDyMControls.H deleted file mode 100644 index 584b8eca25..0000000000 --- a/applications/solvers/multiphase/interFoam/overInterDyMFoam/createDyMControls.H +++ /dev/null @@ -1,30 +0,0 @@ -bool correctPhi -( - pimple.dict().getOrDefault("correctPhi", true) -); - -bool checkMeshCourantNo -( - pimple.dict().getOrDefault("checkMeshCourantNo", false) -); - -bool moveMeshOuterCorrectors -( - pimple.dict().getOrDefault("moveMeshOuterCorrectors", false) -); - - -bool massFluxInterpolation -( - pimple.dict().getOrDefault("massFluxInterpolation", false) -); - -bool adjustFringe -( - pimple.dict().getOrDefault("oversetAdjustPhi", false) -); - -bool ddtCorr -( - pimple.dict().getOrDefault("ddtCorr", true) -); diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/readControls.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/readControls.H deleted file mode 100644 index 78eb3cccb9..0000000000 --- a/applications/solvers/multiphase/interFoam/overInterDyMFoam/readControls.H +++ /dev/null @@ -1,16 +0,0 @@ -#include "readTimeControls.H" - -correctPhi = pimple.dict().getOrDefault("correctPhi", false); - -checkMeshCourantNo = - pimple.dict().getOrDefault("checkMeshCourantNo", false); - -moveMeshOuterCorrectors = - pimple.dict().getOrDefault("moveMeshOuterCorrectors", false); - -massFluxInterpolation = - pimple.dict().getOrDefault("massFluxInterpolation", false); - -ddtCorr = pimple.dict().getOrDefault("ddtCorr", true); - -adjustFringe = pimple.dict().getOrDefault("oversetAdjustPhi", false); diff --git a/src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.C b/src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.C deleted file mode 100644 index 8d1df08a54..0000000000 --- a/src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.C +++ /dev/null @@ -1,795 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | - \\ / A nd | www.openfoam.com - \\/ M anipulation | -------------------------------------------------------------------------------- - Copyright (C) 2014-2020 OpenCFD Ltd. -------------------------------------------------------------------------------- -License - This file is part of OpenFOAM. - - OpenFOAM is free software: you can redistribute it and/or modify i - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - OpenFOAM is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - for more details. - - You should have received a copy of the GNU General Public License - along with OpenFOAM. If not, see . - -\*---------------------------------------------------------------------------*/ - -#include "dynamicOversetFvMesh.H" -#include "addToRunTimeSelectionTable.H" -#include "cellCellStencilObject.H" -#include "zeroGradientFvPatchFields.H" -#include "lduPrimitiveProcessorInterface.H" -#include "globalIndex.H" - -// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // - -namespace Foam -{ - defineTypeNameAndDebug(dynamicOversetFvMesh, 0); - addToRunTimeSelectionTable(dynamicFvMesh, dynamicOversetFvMesh, IOobject); - addToRunTimeSelectionTable(dynamicFvMesh, dynamicOversetFvMesh, doInit); -} - - -// * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * * // - -bool Foam::dynamicOversetFvMesh::updateAddressing() const -{ - const cellCellStencilObject& overlap = Stencil::New(*this); - - // The (processor-local part of the) stencil determines the local - // faces to add to the matrix. tbd: parallel - const labelListList& stencil = overlap.cellStencil(); - - // Get the base addressing - //const lduAddressing& baseAddr = dynamicMotionSolverFvMesh::lduAddr(); - const lduAddressing& baseAddr = dynamicFvMesh::lduAddr(); - - // Add to the base addressing - labelList lowerAddr; - labelList upperAddr; - label nExtraFaces; - - const globalIndex globalNumbering(baseAddr.size()); - labelListList localFaceCells; - labelListList remoteFaceCells; - - labelList globalCellIDs(overlap.cellInterpolationMap().constructSize()); - forAll(baseAddr, cellI) - { - globalCellIDs[cellI] = globalNumbering.toGlobal(cellI); - } - overlap.cellInterpolationMap().distribute(globalCellIDs); - - - reverseFaceMap_ = fvMeshPrimitiveLduAddressing::addAddressing - ( - baseAddr, - stencil, - nExtraFaces, - lowerAddr, - upperAddr, - stencilFaces_, - globalNumbering, - globalCellIDs, - localFaceCells, - remoteFaceCells - ); - - if (debug) - { - Pout<< "dynamicOversetFvMesh::update() : extended addressing from" - << " nFaces:" << baseAddr.lowerAddr().size() - << " to nFaces:" << lowerAddr.size() - << " nExtraFaces:" << nExtraFaces << endl; - } - - - // Now for the tricky bits. We want to hand out processor faces according - // to the localFaceCells/remoteFaceCells. Ultimately we need - // per entry in stencil: - // - the patch (or -1 for internal faces) - // - the face (is either an internal face index or a patch face index) - - stencilPatches_.setSize(stencilFaces_.size()); - - // Per processor to owner (local)/neighbour (remote) - List> procOwner(Pstream::nProcs()); - List> dynProcNeighbour(Pstream::nProcs()); - forAll(stencil, celli) - { - const labelList& nbrs = stencil[celli]; - stencilPatches_[celli].setSize(nbrs.size()); - stencilPatches_[celli] = -1; - - forAll(nbrs, nbri) - { - if (stencilFaces_[celli][nbri] == -1) - { - const label nbrCelli = nbrs[nbri]; - label globalNbr = globalCellIDs[nbrCelli]; - label proci = globalNumbering.whichProcID(globalNbr); - label remoteCelli = globalNumbering.toLocal(proci, globalNbr); - - // Overwrite the face to be a patch face - stencilFaces_[celli][nbri] = procOwner[proci].size(); - stencilPatches_[celli][nbri] = proci; - procOwner[proci].append(celli); - dynProcNeighbour[proci].append(remoteCelli); - - //Pout<< "From neighbour proc:" << proci - // << " allocating patchFace:" << stencilFaces_[celli][nbri] - // << " to get remote cell " << remoteCelli - // << " onto local cell " << celli << endl; - } - } - } - labelListList procNeighbour(dynProcNeighbour.size()); - forAll(procNeighbour, i) - { - procNeighbour[i] = std::move(dynProcNeighbour[i]); - } - labelListList mySendCells; - Pstream::exchange(procNeighbour, mySendCells); - - label nbri = 0; - forAll(procOwner, proci) - { - if (procOwner[proci].size()) - { - nbri++; - } - if (mySendCells[proci].size()) - { - nbri++; - } - } - remoteStencilInterfaces_.setSize(nbri); - nbri = 0; - - // E.g. if proc1 needs some data from proc2 and proc2 needs some data from - // proc1. We first want the pair : proc1 receive and proc2 send - // and then the pair : proc1 send, proc2 receive - - - labelList procToInterface(Pstream::nProcs(), -1); - - forAll(procOwner, proci) - { - if (proci < Pstream::myProcNo() && procOwner[proci].size()) - { - if (debug) - { - Pout<< "Adding interface " << nbri - << " to receive my " << procOwner[proci].size() - << " from " << proci << endl; - } - procToInterface[proci] = nbri; - remoteStencilInterfaces_.set - ( - nbri++, - new lduPrimitiveProcessorInterface - ( - procOwner[proci], - Pstream::myProcNo(), - proci, - tensorField(0), - Pstream::msgType()+2 - ) - ); - } - else if (proci > Pstream::myProcNo() && mySendCells[proci].size()) - { - if (debug) - { - Pout<< "Adding interface " << nbri - << " to send my " << mySendCells[proci].size() - << " to " << proci << endl; - } - remoteStencilInterfaces_.set - ( - nbri++, - new lduPrimitiveProcessorInterface - ( - mySendCells[proci], - Pstream::myProcNo(), - proci, - tensorField(0), - Pstream::msgType()+2 - ) - ); - } - } - forAll(procOwner, proci) - { - if (proci > Pstream::myProcNo() && procOwner[proci].size()) - { - if (debug) - { - Pout<< "Adding interface " << nbri - << " to receive my " << procOwner[proci].size() - << " from " << proci << endl; - } - procToInterface[proci] = nbri; - remoteStencilInterfaces_.set - ( - nbri++, - new lduPrimitiveProcessorInterface - ( - procOwner[proci], - Pstream::myProcNo(), - proci, - tensorField(0), - Pstream::msgType()+3 - ) - ); - } - else if (proci < Pstream::myProcNo() && mySendCells[proci].size()) - { - if (debug) - { - Pout<< "Adding interface " << nbri - << " to send my " << mySendCells[proci].size() - << " to " << proci << endl; - } - remoteStencilInterfaces_.set - ( - nbri++, - new lduPrimitiveProcessorInterface - ( - mySendCells[proci], - Pstream::myProcNo(), - proci, - tensorField(0), - Pstream::msgType()+3 - ) - ); - } - } - - - // Rewrite stencilPatches now we know the actual interface (procToInterface) - for (auto& patches : stencilPatches_) - { - for (auto& interface : patches) - { - if (interface != -1) - { - interface = procToInterface[interface]+boundary().size(); - } - } - } - - - // Get addressing and interfaces of all interfaces - - - List patchAddr; - { - const fvBoundaryMesh& fvp = boundary(); - - patchAddr.setSize(fvp.size() + remoteStencilInterfaces_.size()); - - //allInterfaces_ = dynamicMotionSolverFvMesh::interfaces(); - allInterfaces_ = dynamicFvMesh::interfaces(); - allInterfaces_.setSize(patchAddr.size()); - - forAll(fvp, patchI) - { - patchAddr[patchI] = &fvp[patchI].faceCells(); - } - forAll(remoteStencilInterfaces_, i) - { - label patchI = fvp.size()+i; - const lduPrimitiveProcessorInterface& pp = - remoteStencilInterfaces_[i]; - - //Pout<< "at patch:" << patchI - // << " have procPatch:" << pp.type() - // << " from:" << pp.myProcNo() - // << " to:" << pp.neighbProcNo() - // << " with fc:" << pp.faceCells().size() << endl; - - patchAddr[patchI] = &pp.faceCells(); - allInterfaces_.set(patchI, &pp); - } - } - const lduSchedule ps - ( - lduPrimitiveMesh::nonBlockingSchedule - ( - allInterfaces_ - ) - ); - - lduPtr_.reset - ( - new fvMeshPrimitiveLduAddressing - ( - nCells(), - std::move(lowerAddr), - std::move(upperAddr), - patchAddr, - ps - ) - ); - - - // Check - if (debug) - { - const lduAddressing& addr = lduPtr_(); //this->lduAddr(); - - Pout<< "Adapted addressing:" - << " lower:" << addr.lowerAddr().size() - << " upper:" << addr.upperAddr().size() << endl; - - // Using lduAddressing::patch - forAll(patchAddr, patchI) - { - Pout<< " " << patchI << "\tpatchAddr:" - << addr.patchAddr(patchI).size() - << endl; - } - - // Using interfaces - const lduInterfacePtrsList& iFaces = allInterfaces_; - Pout<< "Adapted interFaces:" << iFaces.size() << endl; - forAll(iFaces, patchI) - { - if (iFaces.set(patchI)) - { - Pout<< " " << patchI << "\tinterface:" - << iFaces[patchI].type() << endl; - } - } - } - - return true; -} - - -Foam::scalar Foam::dynamicOversetFvMesh::cellAverage -( - const labelList& types, - const labelList& nbrTypes, - const scalarField& norm, - const scalarField& nbrNorm, - const label celli, - bitSet& isFront -) const -{ - const labelList& own = faceOwner(); - const labelList& nei = faceNeighbour(); - const cell& cFaces = cells()[celli]; - - scalar avg = 0.0; - label n = 0; - label nFront = 0; - for (const label facei : cFaces) - { - if (isInternalFace(facei)) - { - label nbrCelli = (own[facei] == celli ? nei[facei] : own[facei]); - if (norm[nbrCelli] == -GREAT) - { - // Invalid neighbour. Add to front - if (isFront.set(facei)) - { - nFront++; - } - } - else - { - // Valid neighbour. Add to average - avg += norm[nbrCelli]; - n++; - } - } - else - { - if (nbrNorm[facei-nInternalFaces()] == -GREAT) - { - if (isFront.set(facei)) - { - nFront++; - } - } - else - { - avg += nbrNorm[facei-nInternalFaces()]; - n++; - } - } - } - - if (n > 0) - { - return avg/n; - } - else - { - return norm[celli]; - } -} - - -void Foam::dynamicOversetFvMesh::writeAgglomeration -( - const GAMGAgglomeration& agglom -) const -{ - labelList cellToCoarse(identity(nCells())); - labelListList coarseToCell(invertOneToMany(nCells(), cellToCoarse)); - - // Write initial agglomeration - { - volScalarField scalarAgglomeration - ( - IOobject - ( - "agglomeration", - this->time().timeName(), - *this, - IOobject::NO_READ, - IOobject::NO_WRITE, - false - ), - *this, - dimensionedScalar(dimless, Zero) - ); - scalarField& fld = scalarAgglomeration.primitiveFieldRef(); - forAll(fld, celli) - { - fld[celli] = cellToCoarse[celli]; - } - fld /= max(fld); - correctBoundaryConditions - < - volScalarField, - oversetFvPatchField - >(scalarAgglomeration.boundaryFieldRef(), false); - scalarAgglomeration.write(); - - Info<< "Writing initial cell distribution to " - << this->time().timeName() << endl; - } - - - for (label level = 0; level < agglom.size(); level++) - { - const labelList& addr = agglom.restrictAddressing(level); - label coarseSize = max(addr)+1; - - Info<< "Level : " << level << endl - << returnReduce(addr.size(), sumOp