114 (scratch1.
size() ? scratch1 : Apsi),
115 (scratch2.
size() ? scratch2 : finestCorrection),
124 finestResidual = source;
125 finestResidual -= Apsi;
151 void Foam::GAMGSolver::Vcycle
170 const label coarsestLevel = matrixLevels_.size() - 1;
173 agglomeration_.restrictField(coarseSources[0], finestResidual, 0,
true);
175 if (debug >= 2 && nPreSweeps_)
177 Pout<<
"Pre-smoothing scaling factors: ";
182 for (
label leveli = 0; leveli < coarsestLevel; leveli++)
184 if (coarseSources.
set(leveli + 1))
190 coarseCorrFields[leveli] = 0.0;
192 smoothers[leveli + 1].smooth
194 coarseCorrFields[leveli],
195 coarseSources[leveli],
199 nPreSweeps_ + preSweepsLevelMultiplier_*leveli,
207 coarseCorrFields[leveli].size()
212 if (scaleCorrection_ && leveli < coarsestLevel - 1)
216 coarseCorrFields[leveli],
221 matrixLevels_[leveli],
222 interfaceLevelsBouCoeffs_[leveli],
223 interfaceLevels_[leveli],
224 coarseSources[leveli],
230 matrixLevels_[leveli].Amul
236 coarseCorrFields[leveli],
237 interfaceLevelsBouCoeffs_[leveli],
238 interfaceLevels_[leveli],
242 coarseSources[leveli] -= ACf;
246 agglomeration_.restrictField
248 coarseSources[leveli + 1],
249 coarseSources[leveli],
256 if (debug >= 2 && nPreSweeps_)
263 if (coarseCorrFields.
set(coarsestLevel))
267 coarseCorrFields[coarsestLevel],
268 coarseSources[coarsestLevel]
274 Pout<<
"Post-smoothing scaling factors: ";
282 for (
label leveli = coarsestLevel - 1; leveli >= 0; leveli--)
284 if (coarseCorrFields.
set(leveli))
292 coarseCorrFields[leveli].size()
299 preSmoothedCoarseCorrField = coarseCorrFields[leveli];
302 agglomeration_.prolongField
304 coarseCorrFields[leveli],
306 coarseCorrFields.
set(leveli + 1)
307 ? coarseCorrFields[leveli + 1]
319 coarseCorrFields[leveli].size()
324 if (interpolateCorrection_)
326 if (coarseCorrFields.
set(leveli+1))
330 coarseCorrFields[leveli],
332 matrixLevels_[leveli],
333 interfaceLevelsBouCoeffs_[leveli],
334 interfaceLevels_[leveli],
335 agglomeration_.restrictAddressing(leveli + 1),
336 coarseCorrFields[leveli + 1],
344 coarseCorrFields[leveli],
346 matrixLevels_[leveli],
347 interfaceLevelsBouCoeffs_[leveli],
348 interfaceLevels_[leveli],
359 && (interpolateCorrection_ || leveli < coarsestLevel - 1)
364 coarseCorrFields[leveli],
366 matrixLevels_[leveli],
367 interfaceLevelsBouCoeffs_[leveli],
368 interfaceLevels_[leveli],
369 coarseSources[leveli],
378 coarseCorrFields[leveli] += preSmoothedCoarseCorrField;
381 smoothers[leveli + 1].smooth
383 coarseCorrFields[leveli],
384 coarseSources[leveli],
388 nPostSweeps_ + postSweepsLevelMultiplier_*leveli,
396 agglomeration_.prolongField
404 if (interpolateCorrection_)
413 agglomeration_.restrictAddressing(0),
419 if (scaleCorrection_)
436 psi[i] += finestCorrection[i];
449 void Foam::GAMGSolver::initVcycle
451 PtrList<scalarField>& coarseCorrFields,
452 PtrList<scalarField>& coarseSources,
453 PtrList<lduMatrix::smoother>& smoothers,
458 label maxSize = matrix_.diag().size();
460 coarseCorrFields.setSize(matrixLevels_.size());
461 coarseSources.setSize(matrixLevels_.size());
462 smoothers.setSize(matrixLevels_.size() + 1);
479 forAll(matrixLevels_, leveli)
481 if (agglomeration_.nCells(leveli) >= 0)
483 label nCoarseCells = agglomeration_.nCells(leveli);
485 coarseSources.set(leveli,
new scalarField(nCoarseCells));
488 if (matrixLevels_.set(leveli))
490 const lduMatrix& mat = matrixLevels_[leveli];
492 label nCoarseCells = mat.diag().size();
494 maxSize =
max(maxSize, nCoarseCells);
496 coarseCorrFields.set(leveli,
new scalarField(nCoarseCells));
504 matrixLevels_[leveli],
505 interfaceLevelsBouCoeffs_[leveli],
506 interfaceLevelsIntCoeffs_[leveli],
507 interfaceLevels_[leveli],
514 if (maxSize > matrix_.diag().size())
517 scratch1.setSize(maxSize);
518 scratch2.setSize(maxSize);
529 dictionary
dict(IStringStream(
"solver PCG; preconditioner DIC;")());
543 dictionary
dict(IStringStream(
"solver PBiCGStab; preconditioner DILU;")());
551 void Foam::GAMGSolver::solveCoarsestLevel
557 const label coarsestLevel = matrixLevels_.size() - 1;
559 label coarseComm = matrixLevels_[coarsestLevel].mesh().comm();
561 if (directSolveCoarsest_)
563 coarsestLUMatrixPtr_->solve(coarsestCorrField, coarsestSource);
666 coarsestCorrField = 0;
669 if (matrixLevels_[coarsestLevel].diagonal())
671 coarseSolverPerf = diagonalSolver
674 matrixLevels_[coarsestLevel],
675 interfaceLevelsBouCoeffs_[coarsestLevel],
676 interfaceLevelsIntCoeffs_[coarsestLevel],
677 interfaceLevels_[coarsestLevel],
678 PBiCGStabSolverDict(tolerance_, relTol_)
685 else if (matrixLevels_[coarsestLevel].asymmetric())
687 coarseSolverPerf = PBiCGStab
690 matrixLevels_[coarsestLevel],
691 interfaceLevelsBouCoeffs_[coarsestLevel],
692 interfaceLevelsIntCoeffs_[coarsestLevel],
693 interfaceLevels_[coarsestLevel],
694 PBiCGStabSolverDict(tolerance_, relTol_)
703 coarseSolverPerf = PCG
706 matrixLevels_[coarsestLevel],
707 interfaceLevelsBouCoeffs_[coarsestLevel],
708 interfaceLevelsIntCoeffs_[coarsestLevel],
709 interfaceLevels_[coarsestLevel],
710 PCGsolverDict(tolerance_, relTol_)
720 coarseSolverPerf.print(
Info(coarseComm));
#define forAll(list, i)
Loop across all elements in list.
SubField< scalar > subField
Declare type of subField.
virtual solverPerformance solve(scalarField &psi, const scalarField &source, const direction cmpt=0) const
Solve.
void size(const label)
Override size to be inconsistent with allocated storage.
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
bool set(const label) const
Is element set.
A list of keywords followed by any number of values (e.g. words and numbers) or sub-dictionaries.
bool add(entry *, bool mergeEntry=false)
Add a new entry.
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.
const lduMatrix & matrix_
label maxIter_
Maximum number of iterations in the solver.
scalar tolerance_
Final convergence tolerance.
scalar normFactor(const scalarField &psi, const scalarField &source, const scalarField &Apsi, scalarField &tmpField) const
Return the matrix norm used to normalise the residual for the.
lduInterfaceFieldPtrsList interfaces_
const FieldField< Field, scalar > & interfaceBouCoeffs_
label minIter_
Minimum number of iterations in the solver.
scalar relTol_
Convergence tolerance relative to the initial.
const lduMatrix & matrix() const
void Amul(scalarField &, const tmp< scalarField > &, const FieldField< Field, scalar > &, const lduInterfaceFieldPtrsList &, const direction cmpt) const
Matrix multiplication with updated interfaces.
Foam::fvMesh mesh(Foam::IOobject(regionName, runTime.name(), runTime, Foam::IOobject::MUST_READ), false)
const volScalarField & psi
static tmp< SurfaceField< Type > > interpolate(const VolField< Type > &tvf, const surfaceScalarField &faceFlux, Istream &schemeData)
Interpolate field onto faces using scheme given by Istream.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
scalar gSumMag(const FieldField< Field, Type > &f)
Ostream & endl(Ostream &os)
Add newline and flush stream.
SolverPerformance< scalar > solverPerformance
SolverPerformance instantiated for a scalar.
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
layerAndWeight min(const layerAndWeight &a, const layerAndWeight &b)
layerAndWeight max(const layerAndWeight &a, const layerAndWeight &b)
prefixOSstream Pout(cout, "Pout")