BUG: GAMG: revert to non-energy preserving when processor agglomerating

This commit is contained in:
mattijs
2013-07-16 09:07:38 +01:00
parent 4b750266d3
commit d5d242a630
3 changed files with 67 additions and 14 deletions

View File

@ -222,7 +222,19 @@ class GAMGSolver
const label levelI
);
//- Interpolate the correction after injected prolongation
//- Interpolate the correction after injected prolongation
void interpolate
(
scalarField& psi,
scalarField& Apsi,
const lduMatrix& m,
const FieldField<Field, scalar>& interfaceBouCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
const direction cmpt
) const;
//- Interpolate the correction after injected prolongation and
/// re-normalise
void interpolate
(
scalarField& psi,

View File

@ -34,8 +34,6 @@ void Foam::GAMGSolver::interpolate
const lduMatrix& m,
const FieldField<Field, scalar>& interfaceBouCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
const labelList& restrictAddressing,
const scalarField& psiC,
const direction cmpt
) const
{
@ -81,6 +79,34 @@ void Foam::GAMGSolver::interpolate
{
psiPtr[celli] = -ApsiPtr[celli]/(diagPtr[celli]);
}
}
void Foam::GAMGSolver::interpolate
(
scalarField& psi,
scalarField& Apsi,
const lduMatrix& m,
const FieldField<Field, scalar>& interfaceBouCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
const labelList& restrictAddressing,
const scalarField& psiC,
const direction cmpt
) const
{
interpolate
(
psi,
Apsi,
m,
interfaceBouCoeffs,
interfaces,
cmpt
);
register const label nCells = m.diag().size();
scalar* __restrict__ psiPtr = psi.begin();
const scalar* const __restrict__ diagPtr = m.diag().begin();
register const label nCCells = psiC.size();
scalarField corrC(nCCells, 0);

View File

@ -315,17 +315,32 @@ void Foam::GAMGSolver::Vcycle
if (interpolateCorrection_) //&& leveli < coarsestLevel - 2)
{
interpolate
(
coarseCorrFields[leveli],
ACfRef,
matrixLevels_[leveli],
interfaceLevelsBouCoeffs_[leveli],
interfaceLevels_[leveli],
agglomeration_.restrictAddressing(leveli + 1),
coarseCorrFields[leveli + 1],
cmpt
);
if (coarseCorrFields.set(leveli+1))
{
interpolate
(
coarseCorrFields[leveli],
ACfRef,
matrixLevels_[leveli],
interfaceLevelsBouCoeffs_[leveli],
interfaceLevels_[leveli],
agglomeration_.restrictAddressing(leveli + 1),
coarseCorrFields[leveli + 1],
cmpt
);
}
else
{
interpolate
(
coarseCorrFields[leveli],
ACfRef,
matrixLevels_[leveli],
interfaceLevelsBouCoeffs_[leveli],
interfaceLevels_[leveli],
cmpt
);
}
}
// Scale coarse-grid correction field