ENH: use average value for ensight faceZone on proc boundary (#1176)

This commit is contained in:
Mark Olesen
2019-01-22 12:49:50 +01:00
parent 6b8f56efea
commit 789c5d00b0
2 changed files with 31 additions and 29 deletions

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2016-2018 OpenCFD Ltd. \\/ M anipulation | Copyright (C) 2016-2019 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -27,6 +27,7 @@ License
#include "fvMesh.H" #include "fvMesh.H"
#include "globalMeshData.H" #include "globalMeshData.H"
#include "PstreamCombineReduceOps.H" #include "PstreamCombineReduceOps.H"
#include "emptyPolyPatch.H"
#include "processorPolyPatch.H" #include "processorPolyPatch.H"
#include "mapDistribute.H" #include "mapDistribute.H"
#include "stringListOps.H" #include "stringListOps.H"
@ -209,18 +210,21 @@ void Foam::ensightMesh::correct()
if (option().useFaceZones()) if (option().useFaceZones())
{ {
// Mark boundary faces to be excluded from export // Mark boundary faces to be excluded from export
bitSet excludeFace(mesh_.nFaces()); // all false bitSet excludeFace(mesh_.nFaces());
for (const polyPatch& pp : mesh_.boundaryMesh()) for (const polyPatch& pp : mesh_.boundaryMesh())
{ {
if const auto* procPatch = isA<processorPolyPatch>(pp);
(
isA<processorPolyPatch>(pp) if (isA<emptyPolyPatch>(pp))
&& !refCast<const processorPolyPatch>(pp).owner()
)
{ {
excludeFace.set(pp.range()); excludeFace.set(pp.range());
} }
else if (procPatch && !procPatch->owner())
{
// Exclude neighbour-side, retain owner-side only
excludeFace.set(pp.range());
}
} }
// Use sorted order for later consistency // Use sorted order for later consistency

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd. \\/ M anipulation | Copyright (C) 2016-2019 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -38,6 +38,7 @@ License
#include "uindirectPrimitivePatch.H" #include "uindirectPrimitivePatch.H"
#include "interpolation.H" #include "interpolation.H"
#include "linear.H" #include "linear.H"
#include "processorFvPatch.H"
// * * * * * * * * * * Static Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * Static Private Member Functions * * * * * * * * * * * //
@ -119,10 +120,8 @@ bool Foam::ensightOutput::writeFaceField
return true; return true;
} }
else
{ return false;
return false;
}
} }
@ -257,37 +256,36 @@ bool Foam::ensightOutput::writeField
); );
// flat boundary field // flat boundary field
// as per volPointInterpolation::flatBoundaryField() // similar to volPointInterpolation::flatBoundaryField()
Field<Type> flat(mesh.nBoundaryFaces()); Field<Type> flat(mesh.nBoundaryFaces(), Zero);
const fvBoundaryMesh& bm = mesh.boundary(); const fvBoundaryMesh& bm = mesh.boundary();
forAll(vf.boundaryField(), patchI) forAll(vf.boundaryField(), patchi)
{ {
const polyPatch& pp = bm[patchI].patch(); const polyPatch& pp = bm[patchi].patch();
const label bFaceI = pp.start() - mesh.nInternalFaces(); const auto& bf = vf.boundaryField()[patchi];
if if (isA<processorFvPatch>(bm[patchi]))
(
isA<emptyFvPatch>(bm[patchI])
|| vf.boundaryField()[patchI].coupled()
)
{ {
// Use average value for processor faces
// own cell value = patchInternalField
// nei cell value = evaluated boundary values
SubList<Type> SubList<Type>
( (
flat, flat,
pp.size(), bf.size(),
bFaceI pp.offset()
) = Zero; ) = (0.5 * (bf.patchInternalField() + bf));
} }
else else if (!isA<emptyFvPatch>(bm[patchi]))
{ {
SubList<Type> SubList<Type>
( (
flat, flat,
vf.boundaryField()[patchI].size(), bf.size(),
bFaceI pp.offset()
) = vf.boundaryField()[patchI]; ) = bf;
} }
} }