/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd.
-------------------------------------------------------------------------------
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::nonBlockingGaussSeidelSmoother
Group
grpLduMatrixSmoothers
Description
Variant of gaussSeidelSmoother that expects processor boundary
cells to be sorted last and so can block later. Only when the
cells are actually visited does it need the results to be present.
It is expected that there is little benefit to be gained from doing
this on a patch by patch basis since the number of processor interfaces
is quite small and the overhead of checking whether a processor interface
is finished might be quite high (call into mpi). Also this would
require a dynamic memory allocation to store the state of the outstanding
requests.
SourceFiles
nonBlockingGaussSeidelSmoother.C
\*---------------------------------------------------------------------------*/
#ifndef nonBlockingGaussSeidelSmoother_H
#define nonBlockingGaussSeidelSmoother_H
#include "lduMatrix.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class nonBlockingGaussSeidelSmoother Declaration
\*---------------------------------------------------------------------------*/
class nonBlockingGaussSeidelSmoother
:
public lduMatrix::smoother
{
// Private data
//- Starting cell when to block
label blockStart_;
public:
//- Runtime type information
TypeName("nonBlockingGaussSeidel");
// Constructors
//- Construct from components
nonBlockingGaussSeidelSmoother
(
const word& fieldName,
const lduMatrix& matrix,
const FieldField& interfaceBouCoeffs,
const FieldField& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
const dictionary& solverControls
);
// Member Functions
//- Smooth for the given number of sweeps
static void smooth
(
const word& fieldName,
solveScalarField& psi,
const lduMatrix& matrix,
const label blockStart,
const solveScalarField& source,
const FieldField& interfaceBouCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
const direction cmpt,
const label nSweeps
);
//- Smooth the solution for a given number of sweeps
virtual void smooth
(
solveScalarField& psi,
const scalarField& Source,
const direction cmpt,
const label nSweeps
) const;
//- Smooth the solution for a given number of sweeps
virtual void scalarSmooth
(
solveScalarField& psi,
const solveScalarField& source,
const direction cmpt,
const label nSweeps
) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //