60 this->
normFactor(psi, tsource(), Apsi, finestCorrection);
62 if ((
log_ >= 2) || (debug >= 2))
128 (scratch1.
size() ? scratch1 : Apsi),
129 (scratch2.
size() ? scratch2 : finestCorrection),
138 finestResidual = tsource();
139 finestResidual -= Apsi;
147 if ((
log_ >= 2) || (debug >= 2))
172void Foam::GAMGSolver::Vcycle
191 const label coarsestLevel = matrixLevels_.size() - 1;
194 agglomeration_.restrictField(coarseSources[0], finestResidual, 0,
true);
196 if (nPreSweeps_ && ((log_ >= 2) || (debug >= 2)))
198 Pout<<
"Pre-smoothing scaling factors: ";
203 for (label leveli = 0; leveli < coarsestLevel; leveli++)
205 if (coarseSources.
set(leveli + 1))
211 coarseCorrFields[leveli] = 0.0;
213 smoothers[leveli + 1].scalarSmooth
215 coarseCorrFields[leveli],
216 coarseSources[leveli],
220 nPreSweeps_ + preSweepsLevelMultiplier_*leveli,
228 coarseCorrFields[leveli].size()
233 if (scaleCorrection_ && leveli < coarsestLevel - 1)
237 coarseCorrFields[leveli],
242 matrixLevels_[leveli],
243 interfaceLevelsBouCoeffs_[leveli],
244 interfaceLevels_[leveli],
245 coarseSources[leveli],
251 matrixLevels_[leveli].Amul
257 coarseCorrFields[leveli],
258 interfaceLevelsBouCoeffs_[leveli],
259 interfaceLevels_[leveli],
263 coarseSources[leveli] -= ACf;
267 agglomeration_.restrictField
269 coarseSources[leveli + 1],
270 coarseSources[leveli],
277 if (nPreSweeps_ && ((log_ >= 2) || (debug >= 2)))
284 if (coarseCorrFields.
set(coarsestLevel))
288 coarseCorrFields[coarsestLevel],
289 coarseSources[coarsestLevel]
293 if ((log_ >= 2) || (debug >= 2))
295 Pout<<
"Post-smoothing scaling factors: ";
303 for (label leveli = coarsestLevel - 1; leveli >= 0; leveli--)
305 if (coarseCorrFields.
set(leveli))
313 coarseCorrFields[leveli].size()
320 preSmoothedCoarseCorrField = coarseCorrFields[leveli];
323 agglomeration_.prolongField
325 coarseCorrFields[leveli],
327 coarseCorrFields.
set(leveli + 1)
328 ? coarseCorrFields[leveli + 1]
340 coarseCorrFields[leveli].size()
348 if (interpolateCorrection_)
350 if (coarseCorrFields.
set(leveli+1))
354 coarseCorrFields[leveli],
356 matrixLevels_[leveli],
357 interfaceLevelsBouCoeffs_[leveli],
358 interfaceLevels_[leveli],
359 agglomeration_.restrictAddressing(leveli + 1),
360 coarseCorrFields[leveli + 1],
368 coarseCorrFields[leveli],
370 matrixLevels_[leveli],
371 interfaceLevelsBouCoeffs_[leveli],
372 interfaceLevels_[leveli],
383 && (interpolateCorrection_ || leveli < coarsestLevel - 1)
388 coarseCorrFields[leveli],
390 matrixLevels_[leveli],
391 interfaceLevelsBouCoeffs_[leveli],
392 interfaceLevels_[leveli],
393 coarseSources[leveli],
402 coarseCorrFields[leveli] += preSmoothedCoarseCorrField;
405 smoothers[leveli + 1].scalarSmooth
407 coarseCorrFields[leveli],
408 coarseSources[leveli],
412 nPostSweeps_ + postSweepsLevelMultiplier_*leveli,
420 agglomeration_.prolongField
428 if (interpolateCorrection_)
437 agglomeration_.restrictAddressing(0),
443 if (scaleCorrection_)
460 psi[i] += finestCorrection[i];
473void Foam::GAMGSolver::initVcycle
475 PtrList<solveScalarField>& coarseCorrFields,
476 PtrList<solveScalarField>& coarseSources,
477 PtrList<lduMatrix::smoother>& smoothers,
482 label maxSize = matrix_.diag().size();
484 coarseCorrFields.setSize(matrixLevels_.size());
485 coarseSources.setSize(matrixLevels_.size());
486 smoothers.setSize(matrixLevels_.size() + 1);
503 forAll(matrixLevels_, leveli)
505 if (agglomeration_.nCells(leveli) >= 0)
507 label nCoarseCells = agglomeration_.nCells(leveli);
512 if (matrixLevels_.set(leveli))
514 const lduMatrix& mat = matrixLevels_[leveli];
516 label nCoarseCells = mat.diag().size();
518 maxSize =
max(maxSize, nCoarseCells);
528 matrixLevels_[leveli],
529 interfaceLevelsBouCoeffs_[leveli],
530 interfaceLevelsIntCoeffs_[leveli],
531 interfaceLevels_[leveli],
538 if (maxSize > matrix_.diag().size())
541 scratch1.setSize(maxSize);
542 scratch2.setSize(maxSize);
553 dictionary
dict(IStringStream(
"solver PCG; preconditioner DIC;")());
567 dictionary
dict(IStringStream(
"solver PBiCGStab; preconditioner DILU;")());
575void Foam::GAMGSolver::solveCoarsestLevel
581 const label coarsestLevel = matrixLevels_.size() - 1;
583 const label coarseComm = matrixLevels_[coarsestLevel].mesh().comm();
585 if (directSolveCoarsest_)
587 PrecisionAdaptor<scalar, solveScalar> tcorrField(coarsestCorrField);
589 coarsestLUMatrixPtr_->solve
592 ConstPrecisionAdaptor<scalar, solveScalar>(coarsestSource)()
696 coarsestCorrField = 0;
699 coarsestSolverPtr_->scalarSolve
706 if ((log_ >= 2) || debug)
A const Field/List wrapper with possible data conversion.
SubField< solveScalar > subField
Declare type of subField.
A non-const Field/List wrapper with possible data conversion.
A list of pointers to objects of type <T>, with allocation/deallocation management of the pointers....
const T * set(const label i) const
static autoPtr< Time > New()
Construct (dummy) Time - no functionObjects or libraries.
void size(const label n)
Older name for setAddressableSize.
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
entry * add(entry *entryPtr, bool mergeEntry=false)
Add a new entry.
const lduMatrix & matrix_
label maxIter_
Maximum number of iterations in the solver.
scalar tolerance_
Final convergence tolerance.
lduInterfaceFieldPtrsList interfaces_
const FieldField< Field, scalar > & interfaceBouCoeffs_
label minIter_
Minimum number of iterations in the solver.
const lduMatrix & matrix() const noexcept
solveScalarField::cmptType normFactor(const solveScalarField &psi, const solveScalarField &source, const solveScalarField &Apsi, solveScalarField &tmpField) const
int log_
Level of verbosity in the solver output statements.
scalar relTol_
Convergence tolerance relative to the initial.
void setResidualField(const scalarField &residual, const word &fieldName, const bool initial) const
void Amul(solveScalarField &, const tmp< solveScalarField > &, const FieldField< Field, scalar > &, const lduInterfaceFieldPtrsList &, const direction cmpt) const
Matrix multiplication with updated interfaces.
OSstream & masterStream(const label communicator)
const volScalarField & psi
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
messageStream Info
Information stream (stdout output on master, null elsewhere)
SolverPerformance< scalar > solverPerformance
SolverPerformance instantiated for a scalar.
Ostream & endl(Ostream &os)
Add newline and flush stream.
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
Field< solveScalar > solveScalarField
bool interpolate(const vector &p1, const vector &p2, const vector &o, vector &n, scalar l)
typeOfMag< Type >::type gSumMag(const FieldField< Field, Type > &f)
prefixOSstream Pout
OSstream wrapped stdout (std::cout) with parallel prefix.
#define forAll(list, i)
Loop across all elements in list.