Skip to content
Snippets Groups Projects
Commit 43ac6073 authored by Henry's avatar Henry
Browse files

GAMGSolverInterpolate: Correct interpolate for conservation

such that the sum of the values in the fines cells is equal to the value in the coarse cell
parent e9932a0b
Branches
Tags
No related merge requests found
...@@ -230,7 +230,8 @@ class GAMGSolver ...@@ -230,7 +230,8 @@ class GAMGSolver
const lduMatrix& m, const lduMatrix& m,
const FieldField<Field, scalar>& interfaceBouCoeffs, const FieldField<Field, scalar>& interfaceBouCoeffs,
const lduInterfaceFieldPtrsList& interfaces, const lduInterfaceFieldPtrsList& interfaces,
const scalarField& source, const labelList& restrictAddressing,
const scalarField& psiC,
const direction cmpt const direction cmpt
) const; ) const;
......
...@@ -34,7 +34,8 @@ void Foam::GAMGSolver::interpolate ...@@ -34,7 +34,8 @@ void Foam::GAMGSolver::interpolate
const lduMatrix& m, const lduMatrix& m,
const FieldField<Field, scalar>& interfaceBouCoeffs, const FieldField<Field, scalar>& interfaceBouCoeffs,
const lduInterfaceFieldPtrsList& interfaces, const lduInterfaceFieldPtrsList& interfaces,
const scalarField& source, const labelList& restrictAddressing,
const scalarField& psiC,
const direction cmpt const direction cmpt
) const ) const
{ {
...@@ -80,6 +81,30 @@ void Foam::GAMGSolver::interpolate ...@@ -80,6 +81,30 @@ void Foam::GAMGSolver::interpolate
{ {
psiPtr[celli] = -ApsiPtr[celli]/(diagPtr[celli]); psiPtr[celli] = -ApsiPtr[celli]/(diagPtr[celli]);
} }
register const label nCCells = psiC.size();
scalarField corrC(nCCells, 0);
scalarField diagC(nCCells, 0);
for (register label celli=0; celli<nCells; celli++)
{
corrC[restrictAddressing[celli]] += diagPtr[celli]*psiPtr[celli];
diagC[restrictAddressing[celli]] += diagPtr[celli];
//corrC[restrictAddressing[celli]] += psiPtr[celli]/diagPtr[celli];
//diagC[restrictAddressing[celli]] += 1.0/diagPtr[celli];
//corrC[restrictAddressing[celli]] += psiPtr[celli];
//diagC[restrictAddressing[celli]] += 1.0;
}
for (register label ccelli=0; ccelli<nCCells; ccelli++)
{
corrC[ccelli] = psiC[ccelli] - corrC[ccelli]/diagC[ccelli];
}
for (register label celli=0; celli<nCells; celli++)
{
psiPtr[celli] += corrC[restrictAddressing[celli]];
}
} }
......
...@@ -313,7 +313,7 @@ void Foam::GAMGSolver::Vcycle ...@@ -313,7 +313,7 @@ void Foam::GAMGSolver::Vcycle
scalarField& ACfRef = scalarField& ACfRef =
const_cast<scalarField&>(ACf.operator const scalarField&()); const_cast<scalarField&>(ACf.operator const scalarField&());
if (interpolateCorrection_) if (interpolateCorrection_ && leveli < coarsestLevel - 2)
{ {
interpolate interpolate
( (
...@@ -322,7 +322,8 @@ void Foam::GAMGSolver::Vcycle ...@@ -322,7 +322,8 @@ void Foam::GAMGSolver::Vcycle
matrixLevels_[leveli], matrixLevels_[leveli],
interfaceLevelsBouCoeffs_[leveli], interfaceLevelsBouCoeffs_[leveli],
interfaceLevels_[leveli], interfaceLevels_[leveli],
coarseSources[leveli], agglomeration_.restrictAddressing(leveli + 1),
coarseCorrFields[leveli + 1],
cmpt cmpt
); );
} }
...@@ -382,7 +383,8 @@ void Foam::GAMGSolver::Vcycle ...@@ -382,7 +383,8 @@ void Foam::GAMGSolver::Vcycle
matrix_, matrix_,
interfaceBouCoeffs_, interfaceBouCoeffs_,
interfaces_, interfaces_,
finestResidual, agglomeration_.restrictAddressing(0),
coarseCorrFields[0],
cmpt cmpt
); );
} }
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment