61 this->
normFactor(psi, tsource(), Apsi, finestCorrection);
129 (scratch1.
size() ? scratch1 : Apsi),
130 (scratch2.
size() ? scratch2 : finestCorrection),
139 finestResidual = tsource();
140 finestResidual -= Apsi;
173 void Foam::GAMGSolver::Vcycle
192 const label coarsestLevel = matrixLevels_.size() - 1;
195 agglomeration_.restrictField(coarseSources[0], finestResidual, 0,
true);
197 if (nPreSweeps_ && ((log_ >= 2) || (
debug >= 2)))
199 Pout<<
"Pre-smoothing scaling factors: ";
204 for (label leveli = 0; leveli < coarsestLevel; leveli++)
206 if (coarseSources.
set(leveli + 1))
212 coarseCorrFields[leveli] = 0.0;
214 smoothers[leveli + 1].scalarSmooth
216 coarseCorrFields[leveli],
217 coarseSources[leveli],
221 nPreSweeps_ + preSweepsLevelMultiplier_*leveli,
228 if (scaleCorrection_ && leveli < coarsestLevel - 1)
233 coarseCorrFields[leveli].size()
238 coarseCorrFields[leveli],
239 const_cast<solveScalarField&>
243 matrixLevels_[leveli],
244 interfaceLevelsBouCoeffs_[leveli],
245 interfaceLevels_[leveli],
246 coarseSources[leveli],
253 matrixLevels_[leveli].residual
255 coarseSources[leveli],
256 coarseCorrFields[leveli],
257 ConstPrecisionAdaptor<scalar, solveScalar>
259 coarseSources[leveli]
261 interfaceLevelsBouCoeffs_[leveli],
262 interfaceLevels_[leveli],
268 agglomeration_.restrictField
270 coarseSources[leveli + 1],
271 coarseSources[leveli],
278 if (nPreSweeps_ && ((log_ >= 2) || (
debug >= 2)))
285 if (coarseCorrFields.
set(coarsestLevel))
289 coarseCorrFields[coarsestLevel],
290 coarseSources[coarsestLevel]
294 if ((log_ >= 2) || (
debug >= 2))
296 Pout<<
"Post-smoothing scaling factors: ";
304 for (label leveli = coarsestLevel - 1; leveli >= 0; leveli--)
306 if (coarseCorrFields.
set(leveli))
314 coarseCorrFields[leveli].size()
321 preSmoothedCoarseCorrField = coarseCorrFields[leveli];
324 agglomeration_.prolongField
326 coarseCorrFields[leveli],
328 coarseCorrFields.
set(leveli + 1)
329 ? coarseCorrFields[leveli + 1]
341 coarseCorrFields[leveli].size()
349 if (interpolateCorrection_)
353 coarseCorrFields.
set(leveli+1)
355 matrixLevels_[leveli].mesh().comm()
356 == matrixLevels_[leveli+1].mesh().comm()
364 coarseCorrFields[leveli],
366 matrixLevels_[leveli],
367 interfaceLevelsBouCoeffs_[leveli],
368 interfaceLevels_[leveli],
369 agglomeration_.restrictAddressing(leveli + 1),
370 coarseCorrFields[leveli + 1],
378 coarseCorrFields[leveli],
380 matrixLevels_[leveli],
381 interfaceLevelsBouCoeffs_[leveli],
382 interfaceLevels_[leveli],
393 && (interpolateCorrection_ || leveli < coarsestLevel - 1)
398 coarseCorrFields[leveli],
400 matrixLevels_[leveli],
401 interfaceLevelsBouCoeffs_[leveli],
402 interfaceLevels_[leveli],
403 coarseSources[leveli],
412 coarseCorrFields[leveli] += preSmoothedCoarseCorrField;
415 smoothers[leveli + 1].scalarSmooth
417 coarseCorrFields[leveli],
418 coarseSources[leveli],
422 nPostSweeps_ + postSweepsLevelMultiplier_*leveli,
430 agglomeration_.prolongField
438 if (interpolateCorrection_)
447 agglomeration_.restrictAddressing(0),
453 if (scaleCorrection_)
470 psi[i] += finestCorrection[i];
483 void Foam::GAMGSolver::initVcycle
485 PtrList<solveScalarField>& coarseCorrFields,
486 PtrList<solveScalarField>& coarseSources,
487 PtrList<lduMatrix::smoother>& smoothers,
492 label maxSize = matrix_.diag().size();
494 coarseCorrFields.setSize(matrixLevels_.size());
495 coarseSources.setSize(matrixLevels_.size());
496 smoothers.setSize(matrixLevels_.size() + 1);
513 forAll(matrixLevels_, leveli)
515 if (agglomeration_.nCells(leveli) >= 0)
517 label nCoarseCells = agglomeration_.nCells(leveli);
522 if (matrixLevels_.set(leveli))
524 const lduMatrix& mat = matrixLevels_[leveli];
526 label nCoarseCells = mat.diag().size();
528 maxSize =
max(maxSize, nCoarseCells);
538 matrixLevels_[leveli],
539 interfaceLevelsBouCoeffs_[leveli],
540 interfaceLevelsIntCoeffs_[leveli],
541 interfaceLevels_[leveli],
548 if (maxSize > matrix_.diag().size())
551 scratch1.setSize(maxSize);
552 scratch2.setSize(maxSize);
563 dictionary
dict(IStringStream(
"solver PCG; preconditioner DIC;")());
577 dictionary
dict(IStringStream(
"solver PBiCGStab; preconditioner DILU;")());
585 void Foam::GAMGSolver::solveCoarsestLevel
591 const label coarsestLevel = matrixLevels_.size() - 1;
593 const label coarseComm = matrixLevels_[coarsestLevel].mesh().comm();
595 if (directSolveCoarsest_)
597 PrecisionAdaptor<scalar, solveScalar> tcorrField(coarsestCorrField);
599 coarsestLUMatrixPtr_->solve
602 ConstPrecisionAdaptor<scalar, solveScalar>(coarsestSource)()
706 coarsestCorrField = 0;
709 coarsestSolverPtr_->scalarSolve
716 if ((log_ >= 2) ||
debug)
void size(const label n)
Older name for setAddressableSize.
Field< solveScalar > solveScalarField
A list of keyword definitions, which are a keyword followed by a number of values (eg...
bool interpolate(const vector &p1, const vector &p2, const vector &o, vector &n, scalar l)
void setResidualField(const scalarField &residual, const word &fieldName, const bool initial) const
Set the residual field using an IOField on the object registry if it exists.
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
const FieldField< Field, scalar > & interfaceBouCoeffs_
const lduMatrix & matrix() const noexcept
Ostream & endl(Ostream &os)
Add newline and flush stream.
entry * add(entry *entryPtr, bool mergeEntry=false)
Add a new entry.
virtual solverPerformance solve(scalarField &psi, const scalarField &source, const direction cmpt=0) const
Solve.
A non-const Field/List wrapper with possible data conversion.
int log_
Verbosity level for solver output statements.
label minIter_
Minimum number of iterations in the solver.
#define forAll(list, i)
Loop across all elements in list.
scalar tolerance_
Final convergence tolerance.
void Amul(solveScalarField &, const tmp< solveScalarField > &, const FieldField< Field, scalar > &, const lduInterfaceFieldPtrsList &, const direction cmpt) const
Matrix multiplication with updated interfaces.
label maxIter_
Maximum number of iterations in the solver.
A const Field/List wrapper with possible data conversion.
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
const T * set(const label i) const
Return const pointer to element (can be nullptr), or nullptr for out-of-range access (ie...
const lduMatrix & matrix_
int debug
Static debugging option.
Container< Type > & ref() const
Return non-const reference to the contents of a non-null managed pointer.
lduInterfaceFieldPtrsList interfaces_
solveScalarField::cmptType normFactor(const solveScalarField &psi, const solveScalarField &source, const solveScalarField &Apsi, solveScalarField &tmpField, const lduMatrix::normTypes normType) const
Return the matrix norm using the specified norm method.
typeOfMag< Type >::type gSumMag(const FieldField< Field, Type > &f)
OSstream & masterStream(const label communicator)
Return OSstream for output operations on the master process only, Snull on other processes.
A list of pointers to objects of type <T>, with allocation/deallocation management of the pointers...
static autoPtr< smoother > New(const word &fieldName, const lduMatrix &matrix, const FieldField< Field, scalar > &interfaceBouCoeffs, const FieldField< Field, scalar > &interfaceIntCoeffs, const lduInterfaceFieldPtrsList &interfaces, const dictionary &solverControls)
Return a new smoother.
messageStream Info
Information stream (stdout output on master, null elsewhere)
SubField< solveScalar > subField
Declare type of subField.
const volScalarField & psi
prefixOSstream Pout
OSstream wrapped stdout (std::cout) with parallel prefix.
SolverPerformance< scalar > solverPerformance
SolverPerformance instantiated for a scalar.
scalar relTol_
Convergence tolerance relative to the initial.