45 matrix_.Amul(Apsi, psi, interfaceBouCoeffs_, interfaces_, cmpt);
52 scalar normFactor = this->normFactor(psi, source, Apsi, finestCorrection);
56 Pout<<
" Normalisation factor = " << normFactor <<
endl;
80 initVcycle(coarseCorrFields, coarseSources, smoothers);
98 matrix_.Amul(Apsi, psi, interfaceBouCoeffs_, interfaces_, cmpt);
99 finestResidual = source;
100 finestResidual -= Apsi;
119 void Foam::GAMGSolver::Vcycle
134 const label coarsestLevel = matrixLevels_.
size() - 1;
137 agglomeration_.
restrictField(coarseSources[0], finestResidual, 0);
139 if (debug >= 2 && nPreSweeps_)
141 Pout<<
"Pre-smoothing scaling factors: ";
146 for (label leveli = 0; leveli < coarsestLevel; leveli++)
152 coarseCorrFields[leveli] = 0.0;
154 smoothers[leveli + 1].smooth
156 coarseCorrFields[leveli],
157 coarseSources[leveli],
165 coarseCorrFields[leveli].size()
170 if (scaleCorrection_ && leveli < coarsestLevel - 1)
172 scalar
sf = scalingFactor
174 const_cast<scalarField&>(ACf.operator
const scalarField&()),
175 matrixLevels_[leveli],
176 coarseCorrFields[leveli],
177 interfaceLevelsBouCoeffs_[leveli],
178 interfaceLevels_[leveli],
179 coarseSources[leveli],
188 coarseCorrFields[leveli] *=
sf;
192 matrixLevels_[leveli].Amul
194 const_cast<scalarField&>(ACf.operator
const scalarField&()),
195 coarseCorrFields[leveli],
196 interfaceLevelsBouCoeffs_[leveli],
197 interfaceLevels_[leveli],
201 coarseSources[leveli] -= ACf;
207 coarseSources[leveli + 1],
208 coarseSources[leveli],
213 if (debug >= 2 && nPreSweeps_)
222 coarseCorrFields[coarsestLevel],
223 coarseSources[coarsestLevel]
229 Pout<<
"Post-smoothing scaling factors: ";
234 for (label leveli = coarsestLevel - 1; leveli >= 0; leveli--)
242 coarseCorrFields[leveli].size()
248 preSmoothedCoarseCorrField.assign(coarseCorrFields[leveli]);
253 coarseCorrFields[leveli],
254 coarseCorrFields[leveli + 1],
260 if (scaleCorrection_ && leveli < coarsestLevel - 1)
266 coarseCorrFields[leveli].size()
269 scalar sf = scalingFactor
271 const_cast<scalarField&>(ACf.operator
const scalarField&()),
272 matrixLevels_[leveli],
273 coarseCorrFields[leveli],
274 interfaceLevelsBouCoeffs_[leveli],
275 interfaceLevels_[leveli],
276 coarseSources[leveli],
286 coarseCorrFields[leveli] *=
sf;
292 coarseCorrFields[leveli] += preSmoothedCoarseCorrField;
295 smoothers[leveli + 1].smooth
297 coarseCorrFields[leveli],
298 coarseSources[leveli],
300 nPostSweeps_ + leveli
312 if (scaleCorrection_)
315 scalar fsf = scalingFactor
333 psi[i] += fsf*finestCorrection[i];
340 psi[i] += finestCorrection[i];
354 void Foam::GAMGSolver::initVcycle
356 PtrList<scalarField>& coarseCorrFields,
357 PtrList<scalarField>& coarseSources,
358 PtrList<lduMatrix::smoother>& smoothers
361 coarseCorrFields.setSize(matrixLevels_.size());
362 coarseSources.setSize(matrixLevels_.size());
363 smoothers.setSize(matrixLevels_.size() + 1);
380 forAll (matrixLevels_, leveli)
387 agglomeration_.meshLevel(leveli + 1).lduAddr().size()
396 agglomeration_.meshLevel(leveli + 1).lduAddr().size()
406 matrixLevels_[leveli],
407 interfaceLevelsBouCoeffs_[leveli],
408 interfaceLevelsIntCoeffs_[leveli],
409 interfaceLevels_[leveli],
417 void Foam::GAMGSolver::solveCoarsestLevel
423 if (directSolveCoarsest_)
425 coarsestCorrField = coarsestSource;
426 coarsestLUMatrixPtr_->solve(coarsestCorrField);
430 const label coarsestLevel = matrixLevels_.size() - 1;
431 coarsestCorrField = 0;
432 lduMatrix::solverPerformance coarseSolverPerf;
434 if (matrixLevels_[coarsestLevel].asymmetric())
436 coarseSolverPerf = BICCG
439 matrixLevels_[coarsestLevel],
440 interfaceLevelsBouCoeffs_[coarsestLevel],
441 interfaceLevelsIntCoeffs_[coarsestLevel],
442 interfaceLevels_[coarsestLevel],
453 coarseSolverPerf = ICCG
456 matrixLevels_[coarsestLevel],
457 interfaceLevelsBouCoeffs_[coarsestLevel],
458 interfaceLevelsIntCoeffs_[coarsestLevel],
459 interfaceLevels_[coarsestLevel],
471 coarseSolverPerf.print();