mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
BUG: overset: support GAMG. Fixes #2559
Note that there is no support for using GAMG with mass-correction.
This commit is contained in:
@ -36,6 +36,18 @@ void Foam::pairGAMGAgglomeration::agglomerate
|
|||||||
const scalarField& faceWeights
|
const scalarField& faceWeights
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
const label nFaces = mesh.lduAddr().lowerAddr().size();
|
||||||
|
if (faceWeights.size() != nFaces)
|
||||||
|
{
|
||||||
|
FatalErrorInFunction
|
||||||
|
<< "Supplied number of face weights " << faceWeights.size()
|
||||||
|
<< " does not correspond to the number of faces " << nFaces << endl
|
||||||
|
<< "This may be because of using a geometry-based"
|
||||||
|
<< " agglomeration method instead of a matrix-based one"
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Start geometric agglomeration from the given faceWeights
|
// Start geometric agglomeration from the given faceWeights
|
||||||
scalarField* faceWeightsPtr = const_cast<scalarField*>(&faceWeights);
|
scalarField* faceWeightsPtr = const_cast<scalarField*>(&faceWeights);
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2021 OpenCFD Ltd.
|
Copyright (C) 2021-2022 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -61,7 +61,53 @@ Foam::oversetGAMGInterface::oversetGAMGInterface
|
|||||||
index,
|
index,
|
||||||
coarseInterfaces
|
coarseInterfaces
|
||||||
)
|
)
|
||||||
{}
|
{
|
||||||
|
// Problem:
|
||||||
|
// - we only want the oversetGAMGInterfaceField
|
||||||
|
// - but this needs a oversetGAMGInterface of at least size 1
|
||||||
|
// (since faceRestrictAddressing cannot have -1 or so in it - it
|
||||||
|
// can only have >= 0 i.e. we cannot agglomerate into nothing)
|
||||||
|
// - note that the end result is not used - the (current) corresponding
|
||||||
|
// oversetGAMGInterfaceField has dummy updateInterfaceMatrix.
|
||||||
|
|
||||||
|
// Construct face agglomeration from cell agglomeration. Code same as
|
||||||
|
// in e.g. cyclicAMIGAMGInterface.
|
||||||
|
{
|
||||||
|
// From coarse face to cell
|
||||||
|
DynamicList<label> dynFaceCells(localRestrictAddressing.size());
|
||||||
|
|
||||||
|
// From face to coarse face
|
||||||
|
DynamicList<label> dynFaceRestrictAddressing
|
||||||
|
(
|
||||||
|
localRestrictAddressing.size()
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<label> masterToCoarseFace(localRestrictAddressing.size());
|
||||||
|
|
||||||
|
for (const label curMaster : localRestrictAddressing)
|
||||||
|
{
|
||||||
|
const auto iter = masterToCoarseFace.cfind(curMaster);
|
||||||
|
|
||||||
|
if (iter.found())
|
||||||
|
{
|
||||||
|
// Already have coarse face
|
||||||
|
dynFaceRestrictAddressing.append(iter.val());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// New coarse face
|
||||||
|
const label coarseI = dynFaceCells.size();
|
||||||
|
|
||||||
|
dynFaceRestrictAddressing.append(coarseI);
|
||||||
|
dynFaceCells.append(curMaster);
|
||||||
|
masterToCoarseFace.insert(curMaster, coarseI);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
faceCells_.transfer(dynFaceCells);
|
||||||
|
faceRestrictAddressing_.transfer(dynFaceRestrictAddressing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|||||||
@ -18,10 +18,18 @@ solvers
|
|||||||
{
|
{
|
||||||
T
|
T
|
||||||
{
|
{
|
||||||
solver PBiCGStab;
|
|
||||||
preconditioner DILU;
|
|
||||||
tolerance 1e-10;
|
tolerance 1e-10;
|
||||||
relTol 0;
|
relTol 0;
|
||||||
|
|
||||||
|
solver PBiCGStab;
|
||||||
|
preconditioner DILU;
|
||||||
|
|
||||||
|
//// Note: GAMG not supported with massCorrection switched on
|
||||||
|
//solver GAMG;
|
||||||
|
//smoother GaussSeidel;
|
||||||
|
//nCellsInCoarsestLevel 1;
|
||||||
|
//// Important: overset adds faces so use matrix-based agglomerator
|
||||||
|
//agglomerator algebraicPair;
|
||||||
}
|
}
|
||||||
|
|
||||||
cellDisplacement
|
cellDisplacement
|
||||||
|
|||||||
Reference in New Issue
Block a user