111 (scratch1.
size() ? scratch1 : Apsi),
112 (scratch2.
size() ? scratch2 : finestCorrection),
121 finestResidual = source;
122 finestResidual -= Apsi;
148 void Foam::GAMGSolver::Vcycle
167 const label coarsestLevel = matrixLevels_.size() - 1;
170 agglomeration_.restrictField(coarseSources[0], finestResidual, 0,
true);
172 if (debug >= 2 && nPreSweeps_)
174 Pout<<
"Pre-smoothing scaling factors: ";
179 for (
label leveli = 0; leveli < coarsestLevel; leveli++)
181 if (coarseSources.
set(leveli + 1))
187 coarseCorrFields[leveli] = 0.0;
189 smoothers[leveli + 1].smooth
191 coarseCorrFields[leveli],
192 coarseSources[leveli],
196 nPreSweeps_ + preSweepsLevelMultiplier_*leveli,
204 coarseCorrFields[leveli].size()
209 if (scaleCorrection_ && leveli < coarsestLevel - 1)
213 coarseCorrFields[leveli],
218 matrixLevels_[leveli],
219 interfaceLevelsBouCoeffs_[leveli],
220 interfaceLevels_[leveli],
221 coarseSources[leveli],
227 matrixLevels_[leveli].Amul
233 coarseCorrFields[leveli],
234 interfaceLevelsBouCoeffs_[leveli],
235 interfaceLevels_[leveli],
239 coarseSources[leveli] -= ACf;
243 agglomeration_.restrictField
245 coarseSources[leveli + 1],
246 coarseSources[leveli],
253 if (debug >= 2 && nPreSweeps_)
260 if (coarseCorrFields.
set(coarsestLevel))
264 coarseCorrFields[coarsestLevel],
265 coarseSources[coarsestLevel]
271 Pout<<
"Post-smoothing scaling factors: ";
279 for (
label leveli = coarsestLevel - 1; leveli >= 0; leveli--)
281 if (coarseCorrFields.
set(leveli))
289 coarseCorrFields[leveli].size()
296 preSmoothedCoarseCorrField = coarseCorrFields[leveli];
299 agglomeration_.prolongField
301 coarseCorrFields[leveli],
303 coarseCorrFields.
set(leveli + 1)
304 ? coarseCorrFields[leveli + 1]
316 coarseCorrFields[leveli].size()
321 if (interpolateCorrection_)
323 if (coarseCorrFields.
set(leveli+1))
327 coarseCorrFields[leveli],
329 matrixLevels_[leveli],
330 interfaceLevelsBouCoeffs_[leveli],
331 interfaceLevels_[leveli],
332 agglomeration_.restrictAddressing(leveli + 1),
333 coarseCorrFields[leveli + 1],
341 coarseCorrFields[leveli],
343 matrixLevels_[leveli],
344 interfaceLevelsBouCoeffs_[leveli],
345 interfaceLevels_[leveli],
356 && (interpolateCorrection_ || leveli < coarsestLevel - 1)
361 coarseCorrFields[leveli],
363 matrixLevels_[leveli],
364 interfaceLevelsBouCoeffs_[leveli],
365 interfaceLevels_[leveli],
366 coarseSources[leveli],
375 coarseCorrFields[leveli] += preSmoothedCoarseCorrField;
378 smoothers[leveli + 1].smooth
380 coarseCorrFields[leveli],
381 coarseSources[leveli],
385 nPostSweeps_ + postSweepsLevelMultiplier_*leveli,
393 agglomeration_.prolongField
401 if (interpolateCorrection_)
410 agglomeration_.restrictAddressing(0),
416 if (scaleCorrection_)
433 psi[i] += finestCorrection[i];
446 void Foam::GAMGSolver::initVcycle
448 PtrList<scalarField>& coarseCorrFields,
449 PtrList<scalarField>& coarseSources,
450 PtrList<lduMatrix::smoother>& smoothers,
455 label maxSize = matrix_.diag().size();
457 coarseCorrFields.setSize(matrixLevels_.size());
458 coarseSources.setSize(matrixLevels_.size());
459 smoothers.setSize(matrixLevels_.size() + 1);
476 forAll(matrixLevels_, leveli)
478 if (agglomeration_.nCells(leveli) >= 0)
480 label nCoarseCells = agglomeration_.nCells(leveli);
482 coarseSources.set(leveli,
new scalarField(nCoarseCells));
485 if (matrixLevels_.set(leveli))
487 const lduMatrix& mat = matrixLevels_[leveli];
489 label nCoarseCells = mat.diag().size();
491 maxSize =
max(maxSize, nCoarseCells);
493 coarseCorrFields.set(leveli,
new scalarField(nCoarseCells));
501 matrixLevels_[leveli],
502 interfaceLevelsBouCoeffs_[leveli],
503 interfaceLevelsIntCoeffs_[leveli],
504 interfaceLevels_[leveli],
511 if (maxSize > matrix_.diag().size())
514 scratch1.setSize(maxSize);
515 scratch2.setSize(maxSize);
520 void Foam::GAMGSolver::solveCoarsestLevel
526 const label coarsestLevel = matrixLevels_.size() - 1;
528 label coarseComm = matrixLevels_[coarsestLevel].mesh().comm();
530 if (directSolveCoarsest_)
532 coarsestLUMatrixPtr_->solve
540 coarsestCorrField = 0;
549 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.
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.
Template function which returns the un-mangled name of a given type. Useful for types which do not ha...
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.
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.
scalar gSumMag(const UList< Type > &f, const label comm)
dimensioned< Type > min(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
prefixOSstream Pout(cout, "Pout")
dimensioned< Type > max(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)