diff --git a/src/OpenFOAM/Make/files b/src/OpenFOAM/Make/files index 1fc63beb1b..641773d3b6 100644 --- a/src/OpenFOAM/Make/files +++ b/src/OpenFOAM/Make/files @@ -383,6 +383,8 @@ $(lduMatrix)/solvers/smoothSolver/smoothSolver.C $(lduMatrix)/solvers/PCG/PCG.C $(lduMatrix)/solvers/PBiCG/PBiCG.C $(lduMatrix)/solvers/PBiCGStab/PBiCGStab.C +$(lduMatrix)/solvers/PPCG/PPCG.C +$(lduMatrix)/solvers/PPCR/PPCR.C $(lduMatrix)/smoothers/GaussSeidel/GaussSeidelSmoother.C $(lduMatrix)/smoothers/symGaussSeidel/symGaussSeidelSmoother.C diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/PstreamReduceOps.H b/src/OpenFOAM/db/IOstreams/Pstreams/PstreamReduceOps.H index 414e9097b0..2741d562bd 100644 --- a/src/OpenFOAM/db/IOstreams/Pstreams/PstreamReduceOps.H +++ b/src/OpenFOAM/db/IOstreams/Pstreams/PstreamReduceOps.H @@ -156,6 +156,21 @@ void reduce NotImplemented; } +// Non-blocking version of reduce. Sets request. +template +void reduce +( + T Value[], + const int size, + const BinaryOp& bop, + const int tag, + const label comm, + label& request +) +{ + NotImplemented; +} + // Insist there are specialisations for the common reductions of scalar(s) void reduce @@ -199,6 +214,16 @@ void reduce label& request ); +void reduce +( + scalar Value[], + const int size, + const sumOp& bop, + const int tag, + const label comm, + label& request +); + #if defined(WM_SPDP) void reduce @@ -241,6 +266,16 @@ void reduce const label comm, label& request ); + +void reduce +( + solveScalar Value[], + const int size, + const sumOp& bop, + const int tag, + const label comm, + label& request +); #endif diff --git a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrix.H b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrix.H index 46b77b6fc8..36ced7f8c3 100644 --- a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrix.H +++ b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrix.H @@ -708,7 +708,8 @@ public: const lduInterfaceFieldPtrsList& interfaces, const solveScalarField& psiif, solveScalarField& result, - const direction cmpt + const direction cmpt, + const label startRequest // starting request (for non-blocking) ) const; //- Set the residual field using an IOField on the object registry diff --git a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixATmul.C b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixATmul.C index 3ea9464e74..2bb8e1ee84 100644 --- a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixATmul.C +++ b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixATmul.C @@ -56,6 +56,8 @@ void Foam::lduMatrix::Amul const scalar* const __restrict__ upperPtr = upper().begin(); const scalar* const __restrict__ lowerPtr = lower().begin(); + const label startRequest = Pstream::nRequests(); + // Initialise the update of interfaced interfaces initMatrixInterfaces ( @@ -90,7 +92,8 @@ void Foam::lduMatrix::Amul interfaces, psi, Apsi, - cmpt + cmpt, + startRequest ); tpsi.clear(); @@ -119,6 +122,8 @@ void Foam::lduMatrix::Tmul const scalar* const __restrict__ lowerPtr = lower().begin(); const scalar* const __restrict__ upperPtr = upper().begin(); + const label startRequest = Pstream::nRequests(); + // Initialise the update of interfaced interfaces initMatrixInterfaces ( @@ -151,7 +156,8 @@ void Foam::lduMatrix::Tmul interfaces, psi, Tpsi, - cmpt + cmpt, + startRequest ); tpsi.clear(); @@ -240,6 +246,8 @@ void Foam::lduMatrix::residual // To compensate for this, it is necessary to turn the // sign of the contribution. + const label startRequest = Pstream::nRequests(); + // Initialise the update of interfaced interfaces initMatrixInterfaces ( @@ -274,7 +282,8 @@ void Foam::lduMatrix::residual interfaces, psi, rA, - cmpt + cmpt, + startRequest ); } diff --git a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixUpdateMatrixInterfaces.C b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixUpdateMatrixInterfaces.C index 9ecaaf12ce..776a97bab0 100644 --- a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixUpdateMatrixInterfaces.C +++ b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixUpdateMatrixInterfaces.C @@ -106,7 +106,8 @@ void Foam::lduMatrix::updateMatrixInterfaces const lduInterfaceFieldPtrsList& interfaces, const solveScalarField& psiif, solveScalarField& result, - const direction cmpt + const direction cmpt, + const label startRequest ) const { if (Pstream::defaultCommsType == Pstream::commsTypes::blocking) @@ -183,7 +184,7 @@ void Foam::lduMatrix::updateMatrixInterfaces else { // Block for all requests and remove storage - UPstream::waitRequests(); + UPstream::waitRequests(startRequest); } } diff --git a/src/OpenFOAM/matrices/lduMatrix/smoothers/GaussSeidel/GaussSeidelSmoother.C b/src/OpenFOAM/matrices/lduMatrix/smoothers/GaussSeidel/GaussSeidelSmoother.C index f9ee057603..a547ad3cb1 100644 --- a/src/OpenFOAM/matrices/lduMatrix/smoothers/GaussSeidel/GaussSeidelSmoother.C +++ b/src/OpenFOAM/matrices/lduMatrix/smoothers/GaussSeidel/GaussSeidelSmoother.C @@ -115,6 +115,8 @@ void Foam::GaussSeidelSmoother::smooth { bPrime = source; + const label startRequest = Pstream::nRequests(); + matrix_.initMatrixInterfaces ( false, @@ -132,7 +134,8 @@ void Foam::GaussSeidelSmoother::smooth interfaces_, psi, bPrime, - cmpt + cmpt, + startRequest ); solveScalar psii; diff --git a/src/OpenFOAM/matrices/lduMatrix/smoothers/nonBlockingGaussSeidel/nonBlockingGaussSeidelSmoother.C b/src/OpenFOAM/matrices/lduMatrix/smoothers/nonBlockingGaussSeidel/nonBlockingGaussSeidelSmoother.C index c438aa641a..3884e17d19 100644 --- a/src/OpenFOAM/matrices/lduMatrix/smoothers/nonBlockingGaussSeidel/nonBlockingGaussSeidelSmoother.C +++ b/src/OpenFOAM/matrices/lduMatrix/smoothers/nonBlockingGaussSeidel/nonBlockingGaussSeidelSmoother.C @@ -142,6 +142,8 @@ void Foam::nonBlockingGaussSeidelSmoother::smooth { bPrime = source; + const label startRequest = Pstream::nRequests(); + matrix_.initMatrixInterfaces ( false, @@ -190,7 +192,8 @@ void Foam::nonBlockingGaussSeidelSmoother::smooth interfaces_, psi, bPrime, - cmpt + cmpt, + startRequest ); // Update rest of the cells diff --git a/src/OpenFOAM/matrices/lduMatrix/smoothers/symGaussSeidel/symGaussSeidelSmoother.C b/src/OpenFOAM/matrices/lduMatrix/smoothers/symGaussSeidel/symGaussSeidelSmoother.C index 00bc5c9016..ef3703bc1e 100644 --- a/src/OpenFOAM/matrices/lduMatrix/smoothers/symGaussSeidel/symGaussSeidelSmoother.C +++ b/src/OpenFOAM/matrices/lduMatrix/smoothers/symGaussSeidel/symGaussSeidelSmoother.C @@ -115,6 +115,8 @@ void Foam::symGaussSeidelSmoother::smooth { bPrime = source; + const label startRequest = Pstream::nRequests(); + matrix_.initMatrixInterfaces ( false, @@ -132,7 +134,8 @@ void Foam::symGaussSeidelSmoother::smooth interfaces_, psi, bPrime, - cmpt + cmpt, + startRequest ); solveScalar psii; diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverInterpolate.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverInterpolate.C index 01d410117b..1620a7b7fe 100644 --- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverInterpolate.C +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverInterpolate.C @@ -52,6 +52,8 @@ void Foam::GAMGSolver::interpolate Apsi = 0; solveScalar* __restrict__ ApsiPtr = Apsi.begin(); + const label startRequest = Pstream::nRequests(); + m.initMatrixInterfaces ( true, @@ -76,7 +78,8 @@ void Foam::GAMGSolver::interpolate interfaces, psi, Apsi, - cmpt + cmpt, + startRequest ); const label nCells = m.diag().size(); diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/PPCG/PPCG.C b/src/OpenFOAM/matrices/lduMatrix/solvers/PPCG/PPCG.C new file mode 100644 index 0000000000..4e3418e14b --- /dev/null +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/PPCG/PPCG.C @@ -0,0 +1,299 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 M. Janssens +------------------------------------------------------------------------------- +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 "PPCG.H" +#include "PrecisionAdaptor.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(PPCG, 0); + + lduMatrix::solver::addsymMatrixConstructorToTable + addPPCGSymMatrixConstructorToTable_; +} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::PPCG::gSumMagProd +( + FixedList& globalSum, + const solveScalarField& a, + const solveScalarField& b, + const solveScalarField& c, + const solveScalarField& sumMag, + label& outstandingRequest, + const label comm +) const +{ + const label nCells = a.size(); + + globalSum = 0.0; + for (label cell=0; cell(), + Pstream::msgType(), + comm, + outstandingRequest + ); + } +} + + +Foam::solverPerformance Foam::PPCG::scalarSolve +( + solveScalarField& psi, + const solveScalarField& source, + const direction cmpt, + const bool cgMode +) const +{ + // --- Setup class containing solver performance data + solverPerformance solverPerf + ( + lduMatrix::preconditioner::getName(controlDict_) + type(), + fieldName_ + ); + + const label comm = matrix().mesh().comm(); + const label nCells = psi.size(); + solveScalarField w(nCells); + + // --- Calculate A.psi + matrix_.Amul(w, psi, interfaceBouCoeffs_, interfaces_, cmpt); + + // --- Calculate initial residual field + solveScalarField r(source - w); + + // --- Calculate normalisation factor + solveScalarField p(nCells); + const solveScalar normFactor = this->normFactor(psi, source, w, p); + + if (lduMatrix::debug >= 2) + { + Info<< " Normalisation factor = " << normFactor << endl; + } + + // --- Select and construct the preconditioner + autoPtr preconPtr = + lduMatrix::preconditioner::New + ( + *this, + controlDict_ + ); + + // --- Precondition residual (= u0) + solveScalarField u(nCells); + preconPtr->precondition(u, r, cmpt); + + // --- Calculate A*u - reuse w + matrix_.Amul(w, u, interfaceBouCoeffs_, interfaces_, cmpt); + + + // State + solveScalarField s(nCells); + solveScalarField q(nCells); + solveScalarField z(nCells); + + solveScalarField m(nCells); + + FixedList globalSum; + label outstandingRequest = -1; + if (cgMode) + { + // --- Start global reductions for inner products + gSumMagProd(globalSum, u, r, w, r, outstandingRequest, comm); + + // --- Precondition residual + preconPtr->precondition(m, w, cmpt); + } + else + { + // --- Precondition residual + preconPtr->precondition(m, w, cmpt); + + // --- Start global reductions for inner products + gSumMagProd(globalSum, w, u, m, r, outstandingRequest, comm); + } + + // --- Calculate A*m + solveScalarField n(nCells); + matrix_.Amul(n, m, interfaceBouCoeffs_, interfaces_, cmpt); + + solveScalar alpha = 0.0; + solveScalar gamma = 0.0; + + // --- Solver iteration + for + ( + solverPerf.nIterations() = 0; + solverPerf.nIterations() < maxIter_; + solverPerf.nIterations()++ + ) + { + // Make sure gamma,delta are available + if (Pstream::parRun()) + { + Pstream::waitRequest(outstandingRequest); + outstandingRequest = -1; + } + + const solveScalar gammaOld = gamma; + gamma = globalSum[0]; + const solveScalar delta = globalSum[1]; + + solverPerf.finalResidual() = globalSum[2]/normFactor; + if (solverPerf.nIterations() == 0) + { + solverPerf.initialResidual() = solverPerf.finalResidual(); + } + + // Check convergence (bypass if not enough iterations yet) + if + ( + (minIter_ <= 0 || solverPerf.nIterations() >= minIter_) + && solverPerf.checkConvergence(tolerance_, relTol_) + ) + { + break; + } + + + if (solverPerf.nIterations() == 0) + { + alpha = gamma/delta; + z = n; + q = m; + s = w; + p = u; + } + else + { + const solveScalar beta = gamma/gammaOld; + alpha = gamma/(delta-beta*gamma/alpha); + + for (label cell=0; cellprecondition(m, w, cmpt); + } + else + { + // --- Precondition residual + preconPtr->precondition(m, w, cmpt); + + // --- Start global reductions for inner products + gSumMagProd(globalSum, w, u, m, r, outstandingRequest, comm); + } + + // --- Calculate A*m + matrix_.Amul(n, m, interfaceBouCoeffs_, interfaces_, cmpt); + } + + return solverPerf; +} + + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::PPCG::PPCG +( + const word& fieldName, + const lduMatrix& matrix, + const FieldField& interfaceBouCoeffs, + const FieldField& interfaceIntCoeffs, + const lduInterfaceFieldPtrsList& interfaces, + const dictionary& solverControls +) +: + lduMatrix::solver + ( + fieldName, + matrix, + interfaceBouCoeffs, + interfaceIntCoeffs, + interfaces, + solverControls + ) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::solverPerformance Foam::PPCG::solve +( + scalarField& psi_s, + const scalarField& source, + const direction cmpt +) const +{ + PrecisionAdaptor tpsi(psi_s); + return scalarSolve + ( + tpsi.ref(), + ConstPrecisionAdaptor(source)(), + cmpt, + true // operate in conjugate-gradient mode + ); +} + + +// ************************************************************************* // diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/PPCG/PPCG.H b/src/OpenFOAM/matrices/lduMatrix/solvers/PPCG/PPCG.H new file mode 100644 index 0000000000..1eccefc322 --- /dev/null +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/PPCG/PPCG.H @@ -0,0 +1,147 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 M. Janssens +------------------------------------------------------------------------------- +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 . + +Class + Foam::PPCG + +Description + Preconditioned pipelined conjugate gradient solver for symmetric + lduMatrices using a run-time selectable preconditioner. + + Reference: + \verbatim + P. Ghysels, W. Vanroose. + "Hiding global synchronization latency in the + preconditioned Conjugate Gradient algorithm" + \endverbatim + and implementation details from + \verbatim + Paul Eller, William Gropp + "Scalable Non-blocking Preconditioned Conjugate Gradient Methods" + \endverbatim + +SourceFiles + PPCG.C + +\*---------------------------------------------------------------------------*/ + +#ifndef PPCG_H +#define PPCG_H + +#include "lduMatrix.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class PPCG Declaration +\*---------------------------------------------------------------------------*/ + +class PPCG +: + public lduMatrix::solver +{ + // Private Member Functions + + //- Non-blocking version of sum(a*b), sum(a*c), sum(mag(sumMag)) + void gSumMagProd + ( + FixedList& globalSum, + const solveScalarField& a, + const solveScalarField& b, + const solveScalarField& c, + const solveScalarField& sumMag, + label& outstandingRequest, + const label comm + ) const; + + //- Disallow default bitwise copy construct + PPCG(const PPCG&); + + //- Disallow default bitwise assignment + void operator=(const PPCG&); + + +protected: + + //- CG solver. Operates either in conjugate-gradient mode or + // conjugate residual + solverPerformance scalarSolve + ( + solveScalarField& psi, + const solveScalarField& source, + const direction cmpt, + const bool cgMode + ) const; + + +public: + + //- Runtime type information + TypeName("PPCG"); + + + // Constructors + + //- Construct from matrix components and solver controls + PPCG + ( + const word& fieldName, + const lduMatrix& matrix, + const FieldField& interfaceBouCoeffs, + const FieldField& interfaceIntCoeffs, + const lduInterfaceFieldPtrsList& interfaces, + const dictionary& solverControls + ); + + + //- Destructor + virtual ~PPCG() + {} + + + // Member Functions + + //- Solve the matrix with this solver + virtual solverPerformance solve + ( + scalarField& psi, + const scalarField& source, + const direction cmpt=0 + ) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/PPCR/PPCR.C b/src/OpenFOAM/matrices/lduMatrix/solvers/PPCR/PPCR.C new file mode 100644 index 0000000000..903c2b3962 --- /dev/null +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/PPCR/PPCR.C @@ -0,0 +1,86 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 M. Janssens +------------------------------------------------------------------------------- +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 "PPCR.H" +#include "PrecisionAdaptor.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(PPCR, 0); + + lduMatrix::solver::addsymMatrixConstructorToTable + addPPCRSymMatrixConstructorToTable_; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::PPCR::PPCR +( + const word& fieldName, + const lduMatrix& matrix, + const FieldField& interfaceBouCoeffs, + const FieldField& interfaceIntCoeffs, + const lduInterfaceFieldPtrsList& interfaces, + const dictionary& solverControls +) +: + PPCG + ( + fieldName, + matrix, + interfaceBouCoeffs, + interfaceIntCoeffs, + interfaces, + solverControls + ) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::solverPerformance Foam::PPCR::solve +( + scalarField& psi_s, + const scalarField& source, + const direction cmpt +) const +{ + PrecisionAdaptor tpsi(psi_s); + return PPCG::scalarSolve + ( + tpsi.ref(), + ConstPrecisionAdaptor(source)(), + cmpt, + false // operate in residual mode + ); +} + + +// ************************************************************************* // diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/PPCR/PPCR.H b/src/OpenFOAM/matrices/lduMatrix/solvers/PPCR/PPCR.H new file mode 100644 index 0000000000..6ca55463cb --- /dev/null +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/PPCR/PPCR.H @@ -0,0 +1,125 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 M. Janssens +------------------------------------------------------------------------------- +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 . + +Class + Foam::PPCR + +Description + Preconditioned pipelined conjugate residuals solver for symmetric + lduMatrices using a run-time selectable preconditioner. + + Reference: + \verbatim + P. Ghysels, W. Vanroose. + "Hiding global synchronization latency in the + preconditioned Conjugate Gradient algorithm" + \endverbatim + and implementation details from + \verbatim + Paul Eller, William Gropp + "Scalable Non-blocking Preconditioned Conjugate Gradient Methods" + \endverbatim + +See also + PPCG + +SourceFiles + PPCR.C + +\*---------------------------------------------------------------------------*/ + +#ifndef PPCR_H +#define PPCR_H + +#include "PPCG.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class PPCR Declaration +\*---------------------------------------------------------------------------*/ + +class PPCR +: + public PPCG +{ + // Private Member Functions + + //- Disallow default bitwise copy construct + PPCR(const PPCR&); + + //- Disallow default bitwise assignment + void operator=(const PPCR&); + + +public: + + //- Runtime type information + TypeName("PPCR"); + + + // Constructors + + //- Construct from matrix components and solver controls + PPCR + ( + const word& fieldName, + const lduMatrix& matrix, + const FieldField& interfaceBouCoeffs, + const FieldField& interfaceIntCoeffs, + const lduInterfaceFieldPtrsList& interfaces, + const dictionary& solverControls + ); + + + //- Destructor + virtual ~PPCR() + {} + + + // Member Functions + + //- Solve the matrix with this solver + virtual solverPerformance solve + ( + scalarField& psi, + const scalarField& source, + const direction cmpt=0 + ) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/Pstream/dummy/UPstream.C b/src/Pstream/dummy/UPstream.C index bf7d9af6e8..cc7bcfd940 100644 --- a/src/Pstream/dummy/UPstream.C +++ b/src/Pstream/dummy/UPstream.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2018 OpenFOAM Foundation - Copyright (C) 2016-2019 OpenCFD Ltd. + Copyright (C) 2016-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -96,6 +96,18 @@ void Foam::reduce(scalar&, const sumOp&, const int, const label, label&) {} +void Foam::reduce +( + scalar[], + const int, + const sumOp&, + const int, + const label, + label& +) +{} + + #if defined(WM_SPDP) void Foam::reduce ( @@ -138,9 +150,20 @@ void Foam::reduce label& request ) {} +void Foam::reduce +( + solveScalar[], + const int, + const sumOp&, + const int, + const label, + label& +) +{} #endif + void Foam::UPstream::allToAll ( const labelUList& sendData, diff --git a/src/Pstream/mpi/PstreamGlobals.C b/src/Pstream/mpi/PstreamGlobals.C index 490863dbb7..a5c9f5c87f 100644 --- a/src/Pstream/mpi/PstreamGlobals.C +++ b/src/Pstream/mpi/PstreamGlobals.C @@ -30,6 +30,7 @@ License // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // Foam::DynamicList Foam::PstreamGlobals::outstandingRequests_; +Foam::DynamicList Foam::PstreamGlobals::freedRequests_; int Foam::PstreamGlobals::nTags_ = 0; diff --git a/src/Pstream/mpi/PstreamGlobals.H b/src/Pstream/mpi/PstreamGlobals.H index f881f5a88e..b3e9501d58 100644 --- a/src/Pstream/mpi/PstreamGlobals.H +++ b/src/Pstream/mpi/PstreamGlobals.H @@ -50,6 +50,7 @@ namespace PstreamGlobals //- Outstanding non-blocking operations. extern DynamicList outstandingRequests_; +extern DynamicList