diff --git a/applications/test/lduMatrix/Make/files b/applications/test/lduMatrix/Make/files deleted file mode 100644 index 69b87cfc1e..0000000000 --- a/applications/test/lduMatrix/Make/files +++ /dev/null @@ -1,3 +0,0 @@ -Test-lduMatrix3.C - -EXE = $(FOAM_USER_APPBIN)/Test-lduMatrix diff --git a/applications/test/lduMatrix/Make/options b/applications/test/lduMatrix/Make/options deleted file mode 100644 index 725122ea1d..0000000000 --- a/applications/test/lduMatrix/Make/options +++ /dev/null @@ -1,4 +0,0 @@ -EXE_INC = \ - -I$(LIB_SRC)/finiteVolume/lnInclude - -EXE_LIBS = -lfiniteVolume diff --git a/applications/test/lduMatrix/Test-lduMatrix.C b/applications/test/lduMatrix/Test-lduMatrix.C deleted file mode 100644 index 6bd557e09f..0000000000 --- a/applications/test/lduMatrix/Test-lduMatrix.C +++ /dev/null @@ -1,163 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | - \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. - \\/ M anipulation | -------------------------------------------------------------------------------- -License - This file is part of OpenFOAM. - - OpenFOAM is free software: you can redistribute it and/or modify it - 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 "argList.H" -#include "Time.H" -#include "fvMesh.H" -#include "volFields.H" -#include "LduMatrix.H" -#include "diagTensorField.H" -#include "TPCG.H" -#include "TPBiCG.H" -#include "NoPreconditioner.H" - -using namespace Foam; - -typedef Foam::LduMatrix - lduVectorMatrix; -defineNamedTemplateTypeNameAndDebug(lduVectorMatrix, 0); - -typedef Foam::DiagonalSolver - lduVectorDiagonalSolver; -defineNamedTemplateTypeNameAndDebug(lduVectorDiagonalSolver, 0); - -template<> -const vector lduVectorMatrix::great_(1e15, 1e15, 1e15); - -template<> -const vector lduVectorMatrix::small_(1e-15, 1e-15, 1e-15); - -namespace Foam -{ - typedef LduMatrix::preconditioner - lduVectorPreconditioner; - defineTemplateRunTimeSelectionTable(lduVectorPreconditioner, symMatrix); - defineTemplateRunTimeSelectionTable(lduVectorPreconditioner, asymMatrix); - - typedef LduMatrix::smoother - lduVectorSmoother; - defineTemplateRunTimeSelectionTable(lduVectorSmoother, symMatrix); - defineTemplateRunTimeSelectionTable(lduVectorSmoother, asymMatrix); - - typedef LduMatrix::solver - lduVectorSolver; - defineTemplateRunTimeSelectionTable(lduVectorSolver, symMatrix); - defineTemplateRunTimeSelectionTable(lduVectorSolver, asymMatrix); - - typedef TPCG TPCGVector; - defineNamedTemplateTypeNameAndDebug(TPCGVector, 0); - - LduMatrix::solver:: - addsymMatrixConstructorToTable - addTPCGSymMatrixConstructorToTable_; - - typedef TPBiCG TPBiCGVector; - defineNamedTemplateTypeNameAndDebug(TPBiCGVector, 0); - - LduMatrix::solver:: - addasymMatrixConstructorToTable - addTPBiCGSymMatrixConstructorToTable_; - - typedef NoPreconditioner NoPreconditionerVector; - defineNamedTemplateTypeNameAndDebug(NoPreconditionerVector, 0); - - LduMatrix::preconditioner:: - addsymMatrixConstructorToTable - addNoPreconditionerSymMatrixConstructorToTable_; - - LduMatrix::preconditioner:: - addasymMatrixConstructorToTable - addNoPreconditionerAsymMatrixConstructorToTable_; -} - - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -// Main program: - -int main(int argc, char *argv[]) -{ - -# include "setRootCase.H" - -# include "createTime.H" -# include "createMesh.H" - - volVectorField psi - ( - IOobject - ( - "U", - runTime.timeName(), - mesh, - IOobject::MUST_READ, - IOobject::AUTO_WRITE - ), - mesh - ); - - lduVectorMatrix testMatrix(mesh); - testMatrix.diag() = 2*pTraits::one; - testMatrix.source() = pTraits::one; - testMatrix.upper() = 0.1; - testMatrix.lower() = -0.1; - - Info<< testMatrix << endl; - - FieldField boundaryCoeffs(0); - FieldField internalCoeffs(0); - - autoPtr testMatrixSolver = - lduVectorMatrix::solver::New - ( - psi.name(), - testMatrix, - boundaryCoeffs, - internalCoeffs, - psi.boundaryField().interfaces(), - IStringStream - ( - "PBiCG" - "{" - " preconditioner none;" - " tolerance (1e-05 1e-05 1e-05);" - " relTol (0 0 0);" - "}" - )() - ); - - lduVectorMatrix::solverPerformance solverPerf = - testMatrixSolver->solve(psi); - - solverPerf.print(); - - Info<< psi << endl; - - Info<< "End\n" << endl; - - return 0; -} - - -// ************************************************************************* // diff --git a/applications/test/lduMatrix/Test-lduMatrix2.C b/applications/test/lduMatrix/Test-lduMatrix2.C deleted file mode 100644 index 6ca6ec3f02..0000000000 --- a/applications/test/lduMatrix/Test-lduMatrix2.C +++ /dev/null @@ -1,163 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | - \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. - \\/ M anipulation | -------------------------------------------------------------------------------- -License - This file is part of OpenFOAM. - - OpenFOAM is free software: you can redistribute it and/or modify it - 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 "argList.H" -#include "Time.H" -#include "fvMesh.H" -#include "volFields.H" -#include "LduMatrix.H" -#include "tensorField.H" -#include "TPCG.H" -#include "TPBiCG.H" -#include "NoPreconditioner.H" - -using namespace Foam; - -typedef Foam::LduMatrix - lduVectorMatrix; -defineNamedTemplateTypeNameAndDebug(lduVectorMatrix, 0); - -typedef Foam::DiagonalSolver - lduVectorDiagonalSolver; -defineNamedTemplateTypeNameAndDebug(lduVectorDiagonalSolver, 0); - -template<> -const vector lduVectorMatrix::great_(1e15, 1e15, 1e15); - -template<> -const vector lduVectorMatrix::small_(1e-15, 1e-15, 1e-15); - -namespace Foam -{ - typedef LduMatrix::preconditioner - lduVectorPreconditioner; - defineTemplateRunTimeSelectionTable(lduVectorPreconditioner, symMatrix); - defineTemplateRunTimeSelectionTable(lduVectorPreconditioner, asymMatrix); - - typedef LduMatrix::smoother - lduVectorSmoother; - defineTemplateRunTimeSelectionTable(lduVectorSmoother, symMatrix); - defineTemplateRunTimeSelectionTable(lduVectorSmoother, asymMatrix); - - typedef LduMatrix::solver - lduVectorSolver; - defineTemplateRunTimeSelectionTable(lduVectorSolver, symMatrix); - defineTemplateRunTimeSelectionTable(lduVectorSolver, asymMatrix); - - typedef TPCG TPCGVector; - defineNamedTemplateTypeNameAndDebug(TPCGVector, 0); - - LduMatrix::solver:: - addsymMatrixConstructorToTable - addTPCGSymMatrixConstructorToTable_; - - typedef TPBiCG TPBiCGVector; - defineNamedTemplateTypeNameAndDebug(TPBiCGVector, 0); - - LduMatrix::solver:: - addasymMatrixConstructorToTable - addTPBiCGSymMatrixConstructorToTable_; - - typedef NoPreconditioner NoPreconditionerVector; - defineNamedTemplateTypeNameAndDebug(NoPreconditionerVector, 0); - - LduMatrix::preconditioner:: - addsymMatrixConstructorToTable - addNoPreconditionerSymMatrixConstructorToTable_; - - LduMatrix::preconditioner:: - addasymMatrixConstructorToTable - addNoPreconditionerAsymMatrixConstructorToTable_; -} - - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -// Main program: - -int main(int argc, char *argv[]) -{ - -# include "setRootCase.H" - -# include "createTime.H" -# include "createMesh.H" - - volVectorField psi - ( - IOobject - ( - "U", - runTime.timeName(), - mesh, - IOobject::MUST_READ, - IOobject::AUTO_WRITE - ), - mesh - ); - - lduVectorMatrix testMatrix(mesh); - testMatrix.diag() = 2*I; - testMatrix.source() = pTraits::one; - testMatrix.upper() = 0.1; - testMatrix.lower() = -0.1; - - Info<< testMatrix << endl; - - FieldField boundaryCoeffs(0); - FieldField internalCoeffs(0); - - autoPtr testMatrixSolver = - lduVectorMatrix::solver::New - ( - psi.name(), - testMatrix, - //boundaryCoeffs, - //internalCoeffs, - //psi.boundaryField().interfaces(), - IStringStream - ( - "PBiCG" - "{" - " preconditioner none;" - " tolerance (1e-05 1e-05 1e-05);" - " relTol (0 0 0);" - "}" - )() - ); - - lduVectorMatrix::solverPerformance solverPerf = - testMatrixSolver->solve(psi); - - solverPerf.print(); - - Info<< psi << endl; - - Info<< "End\n" << endl; - - return 0; -} - - -// ************************************************************************* // diff --git a/applications/test/lduMatrix/Test-lduMatrix3.C b/applications/test/lduMatrix/Test-lduMatrix3.C deleted file mode 100644 index 7874c57c39..0000000000 --- a/applications/test/lduMatrix/Test-lduMatrix3.C +++ /dev/null @@ -1,148 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | - \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. - \\/ M anipulation | -------------------------------------------------------------------------------- -License - This file is part of OpenFOAM. - - OpenFOAM is free software: you can redistribute it and/or modify it - 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 . - -Application - icoFoam - -Description - Transient solver for incompressible, laminar flow of Newtonian fluids. - -\*---------------------------------------------------------------------------*/ - -#include "fvCFD.H" -#include "LduMatrix.H" -#include "diagTensorField.H" - -typedef LduMatrix lduVectorMatrix; - - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -int main(int argc, char *argv[]) -{ - -# include "setRootCase.H" - -# include "createTime.H" -# include "createMesh.H" -# include "createFields.H" -# include "initContinuityErrs.H" - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - - Info<< "\nStarting time loop\n" << endl; - - while (runTime.loop()) - { - Info<< "Time = " << runTime.timeName() << nl << endl; - -# include "readPISOControls.H" -# include "CourantNo.H" - - fvVectorMatrix UEqn - ( - fvm::ddt(U) - + fvm::div(phi, U) - - fvm::laplacian(nu, U) - ); - - fvVectorMatrix UEqnp(UEqn == -fvc::grad(p)); - - lduVectorMatrix U3Eqnp(mesh); - U3Eqnp.diag() = UEqnp.diag(); - U3Eqnp.upper() = UEqnp.upper(); - U3Eqnp.lower() = UEqnp.lower(); - U3Eqnp.source() = UEqnp.source(); - - UEqnp.addBoundaryDiag(U3Eqnp.diag(), 0); - UEqnp.addBoundarySource(U3Eqnp.source(), false); - - autoPtr U3EqnpSolver = - lduVectorMatrix::solver::New - ( - U.name(), - U3Eqnp, - dictionary - ( - IStringStream - ( - "{" - " solver PBiCG;" - " preconditioner DILU;" - " tolerance (1e-13 1e-13 1e-13);" - " relTol (0 0 0);" - "}" - )() - ) - ); - - U3EqnpSolver->solve(U).print(Info); - - // --- PISO loop - - for (int corr=0; corr >& compactMap, + Ostream& os +) const +{ + os << "Layout:" << endl + << "local (processor " << Pstream::myProcNo() << "):" << endl + << " start : 0" << endl + << " size : " << localSize << endl; + + label offset = localSize; + forAll(compactMap, procI) + { + if (procI != Pstream::myProcNo()) + { + os << "processor " << procI << ':' << endl + << " start : " << offset << endl + << " size : " << compactMap[procI].size() << endl; + + offset += compactMap[procI].size(); + } + } + forAll(transformElements_, trafoI) + { + os << "transform " << trafoI << ':' << endl + << " start : " << transformStart_[trafoI] << endl + << " size : " << transformElements_[trafoI].size() << endl; + } +} + + +// Construct per processor compact addressing of the global elements +// needed. The ones from the local processor are not included since +// these are always all needed. +void Foam::mapDistribute::calcCompactAddressing +( + const globalIndex& globalNumbering, + const labelList& elements, + List >& compactMap +) const +{ + compactMap.setSize(Pstream::nProcs()); + + // Count all (non-local) elements needed. Just for presizing map. + labelList nNonLocal(Pstream::nProcs(), 0); + + forAll(elements, i) + { + label globalIndex = elements[i]; + + if (globalIndex != -1 && !globalNumbering.isLocal(globalIndex)) + { + label procI = globalNumbering.whichProcID(globalIndex); + nNonLocal[procI]++; + } + } + + forAll(compactMap, procI) + { + compactMap[procI].clear(); + if (procI != Pstream::myProcNo()) + { + compactMap[procI].resize(2*nNonLocal[procI]); + } + } + + + // Collect all (non-local) elements needed. + forAll(elements, i) + { + label globalIndex = elements[i]; + + if (globalIndex != -1 && !globalNumbering.isLocal(globalIndex)) + { + label procI = globalNumbering.whichProcID(globalIndex); + label index = globalNumbering.toLocal(procI, globalIndex); + label nCompact = compactMap[procI].size(); + compactMap[procI].insert(index, nCompact); + } + } +} + + +void Foam::mapDistribute::calcCompactAddressing +( + const globalIndex& globalNumbering, + const labelListList& cellCells, + List >& compactMap +) const +{ + compactMap.setSize(Pstream::nProcs()); + + // Count all (non-local) elements needed. Just for presizing map. + labelList nNonLocal(Pstream::nProcs(), 0); + + forAll(cellCells, cellI) + { + const labelList& cCells = cellCells[cellI]; + + forAll(cCells, i) + { + label globalIndex = cCells[i]; + + if (globalIndex != -1 && !globalNumbering.isLocal(globalIndex)) + { + label procI = globalNumbering.whichProcID(globalIndex); + nNonLocal[procI]++; + } + } + } + + forAll(compactMap, procI) + { + compactMap[procI].clear(); + if (procI != Pstream::myProcNo()) + { + compactMap[procI].resize(2*nNonLocal[procI]); + } + } + + + // Collect all (non-local) elements needed. + forAll(cellCells, cellI) + { + const labelList& cCells = cellCells[cellI]; + + forAll(cCells, i) + { + label globalIndex = cCells[i]; + + if (globalIndex != -1 && !globalNumbering.isLocal(globalIndex)) + { + label procI = globalNumbering.whichProcID(globalIndex); + label index = globalNumbering.toLocal(procI, globalIndex); + label nCompact = compactMap[procI].size(); + compactMap[procI].insert(index, nCompact); + } + } + } +} + + +void Foam::mapDistribute::exchangeAddressing +( + const globalIndex& globalNumbering, + labelList& elements, + List >& compactMap, + labelList& compactStart +) +{ + // The overall compact addressing is + // - myProcNo data first (uncompacted) + // - all other processors consecutively + + compactStart.setSize(Pstream::nProcs()); + compactStart[Pstream::myProcNo()] = 0; + constructSize_ = globalNumbering.localSize(); + forAll(compactStart, procI) + { + if (procI != Pstream::myProcNo()) + { + compactStart[procI] = constructSize_; + constructSize_ += compactMap[procI].size(); + } + } + + + + // Find out what to receive/send in compact addressing. + + // What I want to receive is what others have to send + labelListList wantedRemoteElements(Pstream::nProcs()); + // Compact addressing for received data + constructMap_.setSize(Pstream::nProcs()); + forAll(compactMap, procI) + { + if (procI == Pstream::myProcNo()) + { + // All my own elements are used + label nLocal = globalNumbering.localSize(); + wantedRemoteElements[procI] = identity(nLocal); + constructMap_[procI] = identity(nLocal); + } + else + { + // Remote elements wanted from processor procI + labelList& remoteElem = wantedRemoteElements[procI]; + labelList& localElem = constructMap_[procI]; + remoteElem.setSize(compactMap[procI].size()); + localElem.setSize(compactMap[procI].size()); + label i = 0; + forAllIter(Map