Re-enable multiple immersed boundary patches
This commit is contained in:
parent
74eefa88c6
commit
5b90b47f5e
1 changed files with 70 additions and 39 deletions
|
@ -60,10 +60,29 @@ void Foam::immersedBoundaryFvPatch::makeCf(slicedSurfaceVectorField& Cf) const
|
||||||
// Insert the patch data for the immersed boundary
|
// Insert the patch data for the immersed boundary
|
||||||
// Note: use the face centres from the stand-alone patch within the IB
|
// Note: use the face centres from the stand-alone patch within the IB
|
||||||
// HJ, 30/Nov/2017
|
// HJ, 30/Nov/2017
|
||||||
Cf.boundaryField()[index()].UList::operator=
|
|
||||||
|
// NOTE: Loop though all ib boundaries in order to update the fields
|
||||||
|
// overwritten by reset. Needed for multiple IB patches (IG 2/Nov/2018)
|
||||||
|
const fvMesh& mesh = boundaryMesh().mesh();
|
||||||
|
forAll(mesh.boundary(), patchI)
|
||||||
|
{
|
||||||
|
if(isA<immersedBoundaryFvPatch>(mesh.boundary()[patchI]))
|
||||||
|
{
|
||||||
|
const immersedBoundaryFvPatch& curIbPatch = refCast
|
||||||
|
<
|
||||||
|
const immersedBoundaryFvPatch
|
||||||
|
>(mesh.boundary()[patchI]);
|
||||||
|
|
||||||
|
Cf.boundaryField()[patchI].UList::operator=
|
||||||
(
|
(
|
||||||
vectorField::subField(ibPolyPatch_.ibPatch().faceCentres(), size())
|
vectorField::subField
|
||||||
|
(
|
||||||
|
curIbPatch.ibPolyPatch().ibPatch().faceCentres(),
|
||||||
|
curIbPatch.size()
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -76,10 +95,29 @@ void Foam::immersedBoundaryFvPatch::makeSf(slicedSurfaceVectorField& Sf) const
|
||||||
// Note: use the corrected face areas from immersed boundary instead of
|
// Note: use the corrected face areas from immersed boundary instead of
|
||||||
// the stand-alone patch areas within the IB
|
// the stand-alone patch areas within the IB
|
||||||
// HJ, 30/Nov/2017
|
// HJ, 30/Nov/2017
|
||||||
Sf.boundaryField()[index()].UList::operator=
|
|
||||||
|
// NOTE: Loop though all ib boundaries in order to update the fields
|
||||||
|
// overwritten by reset. Needed for multiple IB patches (IG 2/Nov/2018)
|
||||||
|
const fvMesh& mesh = boundaryMesh().mesh();
|
||||||
|
forAll(mesh.boundary(), patchI)
|
||||||
|
{
|
||||||
|
if(isA<immersedBoundaryFvPatch>(mesh.boundary()[patchI]))
|
||||||
|
{
|
||||||
|
const immersedBoundaryFvPatch& curIbPatch = refCast
|
||||||
|
<
|
||||||
|
const immersedBoundaryFvPatch
|
||||||
|
>(mesh.boundary()[patchI]);
|
||||||
|
|
||||||
|
Sf.boundaryField()[patchI].UList::operator=
|
||||||
(
|
(
|
||||||
vectorField::subField(ibPolyPatch_.correctedIbPatchFaceAreas(), size())
|
vectorField::subField
|
||||||
|
(
|
||||||
|
curIbPatch.ibPolyPatch().correctedIbPatchFaceAreas(),
|
||||||
|
curIbPatch.size()
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -95,10 +133,29 @@ void Foam::immersedBoundaryFvPatch::makeC(slicedVolVectorField& C) const
|
||||||
// Insert the patch data for the immersed boundary
|
// Insert the patch data for the immersed boundary
|
||||||
// Note: use the face centres from the stand-alone patch within the IB
|
// Note: use the face centres from the stand-alone patch within the IB
|
||||||
// HJ, 30/Nov/2017
|
// HJ, 30/Nov/2017
|
||||||
C.boundaryField()[index()].UList::operator=
|
|
||||||
|
// NOTE: Loop though all ib boundaries in order to update the fields
|
||||||
|
// overwritten by reset. Needed for multiple IB patches (IG 2/Nov/2018)
|
||||||
|
const fvMesh& mesh = boundaryMesh().mesh();
|
||||||
|
forAll(mesh.boundary(), patchI)
|
||||||
|
{
|
||||||
|
if(isA<immersedBoundaryFvPatch>(mesh.boundary()[patchI]))
|
||||||
|
{
|
||||||
|
const immersedBoundaryFvPatch& curIbPatch = refCast
|
||||||
|
<
|
||||||
|
const immersedBoundaryFvPatch
|
||||||
|
>(mesh.boundary()[patchI]);
|
||||||
|
|
||||||
|
C.boundaryField()[patchI].UList::operator=
|
||||||
(
|
(
|
||||||
vectorField::subField(ibPolyPatch_.ibPatch().faceCentres(), size())
|
vectorField::subField
|
||||||
|
(
|
||||||
|
curIbPatch.ibPolyPatch().ibPatch().faceCentres(),
|
||||||
|
curIbPatch.size()
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -270,33 +327,7 @@ void Foam::immersedBoundaryFvPatch::makeDeltaCoeffs
|
||||||
void Foam::immersedBoundaryFvPatch::makeCorrVecs(fvsPatchVectorField& cv) const
|
void Foam::immersedBoundaryFvPatch::makeCorrVecs(fvsPatchVectorField& cv) const
|
||||||
{
|
{
|
||||||
// Set patch non-orthogonality correction to zero
|
// Set patch non-orthogonality correction to zero
|
||||||
// cv = vector::zero;
|
cv = vector::zero;
|
||||||
|
|
||||||
vectorField& cvIn = const_cast<vectorField&>(cv.internalField());
|
|
||||||
|
|
||||||
const fvMesh& mesh = boundaryMesh().mesh();
|
|
||||||
|
|
||||||
// Get face addressing
|
|
||||||
const unallocLabelList& owner = mesh.owner();
|
|
||||||
const unallocLabelList& neighbour = mesh.neighbour();
|
|
||||||
|
|
||||||
// Calculate volume fraction for all cells
|
|
||||||
const scalarField gamma = mesh.V().field()/mesh.cellVolumes();
|
|
||||||
|
|
||||||
// Visit all internal faces. If a corrected volume fraction is smaller
|
|
||||||
// than a threshold, reset non-orthogonality for the face
|
|
||||||
forAll (neighbour, faceI)
|
|
||||||
{
|
|
||||||
if
|
|
||||||
(
|
|
||||||
gamma[owner[faceI]] < nonOrthogonalFactor_()
|
|
||||||
|| gamma[neighbour[faceI]] < nonOrthogonalFactor_()
|
|
||||||
)
|
|
||||||
{
|
|
||||||
// Thin live cut. Reset correction vectors
|
|
||||||
cvIn[faceI] = vector::zero;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Reference in a new issue