Compare commits

..

15 Commits

Author SHA1 Message Date
99a3f10729 ENH: AMIInterpolation: make matching more robust 2025-08-06 11:05:43 +01:00
0fa124af45 ENH: subsetMesh: support for mesh maps 2025-05-29 17:27:51 +01:00
b7ce6bf69d CONFIG: inject -no-recursion into the argument list (#3198)
- sourcing a file with '-no-recursion "$@"' does not work with dash.
  Need to modify the argument list directly.
2025-03-19 15:28:57 +01:00
0a53013499 BUG: foamReport mesh quantities are not parallel (fixes #3338) 2025-03-17 11:53:23 +01:00
47f2ff618d COMP: remove obsolete -fsimdmath flag for ARM64 (#3326) 2025-03-17 09:59:42 +01:00
47575aabf2 COMP: compilation with clang (c++17) and older flex files (fixes #3337)
- The register keyword has been removed from c++17 but old flex
  versions (version < 2.6.0) produce code including it, leading to
  compilation errors when using clang (despite disabling the diagnostic).
  gcc compiles but issues warnings.

- use '#define register' as empty as a workaround
2025-03-17 09:58:20 +01:00
97c8e62fe4 COMP: disambiguate some reactingEuler/multiphaseSystem file names
- poor naming (eg, 'exponential.[CH]') within the same set of library
  files means that the lnInclude/ contents are inconsistent or partly
  meaningless (related to #2520 and !542).
  Remedied by adding model-type qualifiers to the file names.
2025-01-27 09:39:18 +01:00
297fee00f1 COMP: adjustments for nvc++ compiler
- remove unneeded -Wno-old-style flags with boost/cgal elements
- add nvc equivalent to gcc/clang -Wno-invalid-offsetof
- avoid warnings about set-but-unused variable and change of scoping

STYLE: remove wmake 'CGAL' rule
- was a transitional forward to 'cgal' rule since DEC-2020
2025-01-24 10:46:06 +00:00
c987ac228c SUBMODULE: update visualization for v2412 (with c++17 standand) 2025-01-24 11:40:32 +01:00
4fe3f55e4d BUG: Fixes bug in plicRDF interface reconstruction across cyclic boundaries (fixes #3279)
Description:
The plicRDF interface reconstruction scheme calculates a reconstructed distance
function (RDF) in all interface cells and their point neighbours.
In point neighbours to interface cells, the RDF is calculated as a weighted
average of the distances to all adjacent interface cell centres with the weight
being the inverse distance to the cell centre.
By using the zoneDistribute class written by Henning Scheufler, the required
stencil data is communicated efficiently for stencil cells living on different
sides of one or more processor patches.
Some of the data required for the RDF reconstruction are cell centre and
interface centre positions. When a stencil extends across a cyclic patch these
positions have so far not been properly transformed in OpenFOAM. This issue is
fixed by the current contribution.
The fix is done by modifying the zoneDistribute class to hold the required
information about zone cells adjacent to cyclic patches. Positions are then
communicated with a new getPosition function which replaces getValue for
position data in the reconstructedDistanceFunction and plicRDF classes.
The implementation does not change the behaviour for cells not on
a cyclic patch and should have insignificant effect on efficiency for these.
The implementation can probably be optimised in terms of efficiency for zone
cells on cyclic patches, but we note that there are generally only very few of
these (interface cells and their point neighbours on cyclic patches) and so
the potential for speedup is expected to be limited.

Current limitations:

- In parallel, the user must constrain the decomposition to preserve cyclic
patches on the same processor, for the implementation to work properly.
  - See an example here: tutorials/discInConstantFlowCyclicBCs/system/decomposeParDict
- In the case of parallel rotational cyclics that are split by the decomposition
the current bugfix does not work and therefore throws an error. This is ongoing
work and should be reported and fixed by a future patch.

For further details, please see the modified files and the comments therein:
- $FOAM_SRC/finiteVolume/fvMesh/zoneDistribute/zoneDistribute.H
- $FOAM_SRC/finiteVolume/fvMesh/zoneDistribute/zoneDistribute.C
- $FOAM_SRC/finiteVolume/fvMesh/zoneDistribute/zoneDistributeI.H
- $FOAM_SRC/transportModels/geometricVoF/reconstructedDistanceFunction/reconstructedDistanceFunction.C
- $FOAM_SRC/src/transportModels/geometricVoF/reconstructionSchemes/plicSchemes/plicRDF/plicRDF.C

Co-authored-by: David Müller <> KIT
Co-authored-by: Konstantinos Missios <> Roskilde University
Co-authored-by: Johan Roenby <> Roskilde University and STROMNING
2025-01-10 15:52:52 +00:00
cb1aa273fd SUBMODULE: update external-solver, OpenQBMM for v2412 2025-01-09 11:45:11 +01:00
5aa40389c2 BUG: snappyHexMesh: update dependent vars. Fixes #3297 2025-01-06 17:40:45 +00:00
7904a2734f BUG: twoPhaseEuler: incorrect phase. Fixes #3295. 2025-01-06 11:30:02 +00:00
45e7c4a005 Merge branch 'develop' into 'master'
RELEASE: develop branch to master

Closes #3291, #3278, #3286, #3193, #3276, #2457, #3269, #3271, #3267, #3265, #3258, #3259, #3218, #3255, #3088, #3241, #3192, #3204, #3217, and #3191

See merge request Development/openfoam!722
2024-12-24 11:57:24 +00:00
71d3f2344a Merge branch 'openfoam-v2412-rc' into 'develop'
Openfoam v2412 rc

See merge request Development/openfoam!721
2024-12-24 11:50:24 +00:00
51 changed files with 675 additions and 88 deletions

View File

@ -1,13 +1,15 @@
#!/bin/sh
cd "${0%/*}" || exit # Run from this directory
set -- -no-recursion "$@" # Parse arguments only
# Run from OPENFOAM top-level directory only
cd "${0%/*}" || exit
wmake -check-dir "$WM_PROJECT_DIR" 2>/dev/null || {
echo "Error (${0##*/}) : not located in \$WM_PROJECT_DIR"
echo " Check your OpenFOAM environment and installation"
exit 1
}
if [ -f "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments ]
then . "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments -no-recursion "$@" || \
then . "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments || \
echo "Argument parse error"
else
echo "Error (${0##*/}) : WM_PROJECT_DIR appears to be incorrect"

View File

@ -1,13 +1,15 @@
#!/bin/sh
cd "${0%/*}" || exit # Run from this directory
set -- -no-recursion "$@" # Parse arguments only
# Run from OPENFOAM top-level directory only
cd "${0%/*}" || exit
wmake -check-dir "$WM_PROJECT_DIR" 2>/dev/null || {
echo "Error (${0##*/}) : not located in \$WM_PROJECT_DIR"
echo " Check your OpenFOAM environment and installation"
exit 1
}
if [ -f "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments ]
then . "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments -no-recursion "$@" || \
then . "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments || \
echo "Argument parse error"
else
echo "Error (${0##*/}) : WM_PROJECT_DIR appears to be incorrect"

View File

@ -50,7 +50,7 @@
+ (
he2.name() == thermo2.phasePropertyName("e")
? fvc::div(fvc::absolute(alphaPhi2, alpha2, U2), p)
+ p*fvc::ddt(alpha1)
+ p*fvc::ddt(alpha2)
: -alpha2*dpdt
)

View File

@ -1,6 +1,7 @@
#!/bin/sh
cd "${0%/*}" || exit # Run from this directory
. ${WM_PROJECT_DIR:?}/wmake/scripts/AllwmakeParseArguments -no-recursion "$@"
cd "${0%/*}" || exit # Run from this directory
set -- -no-recursion "$@" # Parse arguments only
. ${WM_PROJECT_DIR:?}/wmake/scripts/AllwmakeParseArguments
. ${WM_PROJECT_DIR:?}/wmake/scripts/wmakeFunctions # Require wmake functions
#------------------------------------------------------------------------------

View File

@ -62,6 +62,9 @@ Description
// Flex may use register, which is deprecated and incompatible with C++17
#pragma clang diagnostic ignored "-Wdeprecated-register"
// A 'nothing' define to effectively remove from code as well (issue #3337)
#undef register
#define register
using namespace Foam;

View File

@ -56,6 +56,9 @@ Description
// Flex may use register, which is deprecated and incompatible with C++17
#pragma clang diagnostic ignored "-Wdeprecated-register"
// A 'nothing' define to effectively remove from code as well (issue #3337)
#undef register
#define register
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -63,6 +63,9 @@ Description
// Flex may use register, which is deprecated and incompatible with C++17
#pragma clang diagnostic ignored "-Wdeprecated-register"
// A 'nothing' define to effectively remove from code as well (issue #3337)
#undef register
#define register
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -51,6 +51,9 @@ Description
// Flex may use register, which is deprecated and incompatible with C++17
#pragma clang diagnostic ignored "-Wdeprecated-register"
// A 'nothing' define to effectively remove from code as well (issue #3337)
#undef register
#define register
using namespace Foam;

View File

@ -4,7 +4,6 @@ include $(GENERAL_RULES)/cgal
EXE_INC = \
-DUNIX \
-Wno-old-style-cast \
/* -IMarchingCubes */ \
-I$(FASTDUALOCTREE_SRC_PATH) \
-I../conformalVoronoiMesh/lnInclude \

View File

@ -53,6 +53,7 @@ Description
#include "pointSet.H"
#include "ReadFields.H"
#include "processorMeshes.H"
#include "IOmapDistributePolyMesh.H"
using namespace Foam;
@ -369,6 +370,11 @@ int main(int argc, char *argv[])
"Subset with cellZone(s) instead of cellSet."
" The command argument may be a list of words or regexs"
);
argList::addBoolOption
(
"no-map",
"Suppress writing of map."
);
argList::addOption
(
"resultTime",
@ -393,6 +399,7 @@ int main(int argc, char *argv[])
const bool useCellZone = args.found("zone");
const bool overwrite = args.found("overwrite");
const bool noMap = args.found("no-map");
const bool specifiedInstance = args.readIfPresent
(
"resultTime",
@ -663,8 +670,6 @@ int main(int argc, char *argv[])
Info<< "Writing subsetted mesh and fields to time " << runTime.timeName()
<< endl;
subsetter.subMesh().write();
processorMeshes::removeFiles(subsetter.subMesh());
auto* subPointMeshPtr =
subsetter.subMesh().thisDb().findObject<pointMesh>
(
@ -676,6 +681,115 @@ int main(int argc, char *argv[])
subPointMesh.setInstance(subsetter.subMesh().facesInstance());
subPointMesh.write();
}
processorMeshes::removeFiles(subsetter.subMesh());
if (!noMap)
{
const auto& subMesh = subsetter.subMesh();
const auto& pbm = mesh.boundaryMesh();
labelList patchStarts(pbm.size());
labelList patchNMeshPoints(pbm.size());
for (const auto& pp : pbm)
{
patchStarts[pp.index()] = pp.start();
patchNMeshPoints[pp.index()] = pp.nPoints();
}
const label myProcNo = UPstream::myProcNo(mesh.comm());
// cellMap
labelListList cellSubMap(UPstream::nProcs(mesh.comm()));
cellSubMap[myProcNo] = subsetter.cellMap();
labelListList cellConstructMap(UPstream::nProcs(mesh.comm()));
cellConstructMap[myProcNo] = identity(subMesh.nCells());
mapDistribute cellMap
(
subMesh.nCells(),
std::move(cellSubMap),
std::move(cellConstructMap),
false,
false,
mesh.comm()
);
// faceMap
labelListList faceSubMap(UPstream::nProcs(mesh.comm()));
faceSubMap[myProcNo] = subsetter.faceMap();
labelListList faceConstructMap(UPstream::nProcs(mesh.comm()));
faceConstructMap[myProcNo] = identity(subMesh.nFaces());
mapDistribute faceMap
(
subMesh.nFaces(),
std::move(faceSubMap),
std::move(faceConstructMap),
false,
false,
mesh.comm()
);
// pointMap
labelListList pointSubMap(UPstream::nProcs(mesh.comm()));
pointSubMap[myProcNo] = subsetter.pointMap();
labelListList pointConstructMap(UPstream::nProcs(mesh.comm()));
pointConstructMap[myProcNo] = identity(subMesh.nPoints());
mapDistribute pointMap
(
subMesh.nPoints(),
std::move(pointSubMap),
std::move(pointConstructMap),
false,
false,
mesh.comm()
);
// patchMap
labelListList patchSubMap(UPstream::nProcs(mesh.comm()));
patchSubMap[myProcNo] = identity(pbm.size());
labelListList patchConstructMap(UPstream::nProcs(mesh.comm()));
patchConstructMap[myProcNo] = identity(pbm.size()); // or subMesh?
mapDistribute patchMap
(
subMesh.nPoints(),
std::move(patchSubMap),
std::move(patchConstructMap),
false,
false,
mesh.comm()
);
mapDistributePolyMesh map
(
mesh.nPoints(), // old points
mesh.nFaces(), // old faces
mesh.nCells(), // old cells
std::move(patchStarts),
std::move(patchNMeshPoints),
std::move(pointMap),
std::move(faceMap),
std::move(cellMap),
std::move(patchMap)
);
const IOobject io
(
"parentMeshAddressing",
subMesh.facesInstance(),
fvMesh::meshSubDir,
subMesh.thisDb(),
IOobjectOption::NO_READ,
IOobjectOption::NO_WRITE,
IOobjectOption::NO_REGISTER
);
Info<< "Writing map from subsetted to original mesh to "
<< io.objectRelPath() << endl;
IOmapDistributePolyMeshRef(io, map).write();
}
// Volume fields

View File

@ -1,7 +1,6 @@
include $(GENERAL_RULES)/cgal-header-only
EXE_INC = \
-Wno-old-style-cast \
$(COMP_FLAGS) \
${CGAL_INC} \
-I$(LIB_SRC)/finiteVolume/lnInclude \
@ -9,7 +8,6 @@ EXE_INC = \
-I$(LIB_SRC)/meshTools/lnInclude \
-I$(LIB_SRC)/parallel/distributed/lnInclude
EXE_LIBS = \
-lfiniteVolume \
-lsurfMesh \

View File

@ -1,8 +1,6 @@
EXE_NDEBUG = -DNDEBUG
/* EXE_NDEBUG = -g -O0 -DFULLDEBUG */
c++CGALWARN = -Wno-old-style-cast
/*-- Define CGAL_INEXACT to use inexact CGAL constructions */
include $(GENERAL_RULES)/cgal
@ -11,7 +9,6 @@ EXE_INC = \
${ROUNDING_MATH} \
${EXE_NDEBUG} \
${CGAL_INC} \
${c++LESSWARN} \
-I.. \
-I$(LIB_SRC)/surfMesh/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude

View File

@ -6,7 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2019-2023 OpenCFD Ltd.
Copyright (C) 2019-2025 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@ -64,12 +64,11 @@ std::string pipeOpen(const std::string& cmd, const int lineNum = 0)
if (cnt == lineNum)
{
// Retain the last line, trimming trailing newline
str.assign(buf);
if (str.size())
if (nread > 0)
{
str.resize(str.size()-1);
buf[nread-1] = '\0';
}
str.assign(buf);
}
}

View File

@ -1,6 +1,7 @@
#!/bin/sh
cd "${0%/*}" || exit # Run from this directory
. ${WM_PROJECT_DIR:?}/wmake/scripts/AllwmakeParseArguments -no-recursion "$@"
cd "${0%/*}" || exit # Run from this directory
set -- -no-recursion "$@" # Parse arguments only
. ${WM_PROJECT_DIR:?}/wmake/scripts/AllwmakeParseArguments
. ${WM_PROJECT_DIR:?}/wmake/scripts/wmakeFunctions # Require wmake functions
#------------------------------------------------------------------------------

View File

@ -521,7 +521,7 @@ void Foam::displacementSmartPointSmoothingMotionSolver::solve()
markAffectedFaces(facesToMove_, affectedFaces);
for(label i = 0; i < nPointSmootherIter_; i ++)
for (label nIter = 0; nIter < nPointSmootherIter_; ++nIter)
{
const pointField wantedPoints
(
@ -665,7 +665,7 @@ void Foam::displacementSmartPointSmoothingMotionSolver::solve()
if (debug & 2)
{
OBJstream os(debugDir/"untangle_" + Foam::name(i) + ".obj");
OBJstream os(debugDir/"untangle_" + Foam::name(nIter) + ".obj");
const pointField wantedPoints
(

View File

@ -44,6 +44,9 @@ Description
// Flex may use register, which is deprecated and incompatible with C++17
#pragma clang diagnostic ignored "-Wdeprecated-register"
// A 'nothing' define to effectively remove from code as well (issue #3337)
#undef register
#define register
using namespace Foam;

View File

@ -51,6 +51,26 @@ namespace Foam
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
Foam::refPtr<Foam::fvMesh>
Foam::fvMesh::parentMesh(const objectRegistry& obr) const
{
const fvMesh* meshPtr = isA<fvMesh>(obr);
if (meshPtr)
{
return refPtr<fvMesh>(*meshPtr);
}
else if (obr.isTimeDb())
{
return refPtr<fvMesh>();
}
else
{
return parentMesh(obr.parent());
}
}
void Foam::fvMesh::clearGeomNotOldVol()
{
meshObject::clearUpto

View File

@ -164,6 +164,9 @@ protected:
void makeCf() const;
//- Helper: search for parent mesh
refPtr<fvMesh> parentMesh(const objectRegistry& obr) const;
//- No copy construct
fvMesh(const fvMesh&) = delete;

View File

@ -27,6 +27,7 @@ License
\*---------------------------------------------------------------------------*/
#include "zoneDistribute.H"
#include "processorPolyPatch.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -44,10 +45,48 @@ Foam::zoneDistribute::zoneDistribute(const fvMesh& mesh)
stencil_(zoneCPCStencil::New(mesh)),
globalNumbering_(stencil_.globalNumbering()),
send_(UPstream::nProcs()),
pBufs_(UPstream::commsTypes::nonBlocking)
pBufs_(UPstream::commsTypes::nonBlocking),
cyclicBoundaryCells_(mesh.nCells(), false)
{
// Don't clear storage on persistent buffer
pBufs_.allowClearRecv(false);
// Loop over boundary patches and store cells with a face on a cyclic patch
bool hasCyclicPatches = false;
forAll(mesh.boundaryMesh(), patchi)
{
const cyclicPolyPatch* cpp =
isA<cyclicPolyPatch>(mesh.boundaryMesh()[patchi]);
if (cpp)
{
cyclicBoundaryCells_.set(cpp->faceCells());
hasCyclicPatches = true;
}
}
// Populate cyclicCentres_
if(hasCyclicPatches)
{
// Make a boolList from the bitSet
boolList isCyclicCell(mesh.nCells(), false);
forAll(cyclicBoundaryCells_, celli)
{
if (cyclicBoundaryCells_.test(celli))
{
isCyclicCell[celli] = true;
}
}
// Use getFields to get map of cell centres across processor boundaries
setUpCommforZone(isCyclicCell, true);
cyclicCentres_.reset
(
new Map<vectorField>(getFields(isCyclicCell, mesh_.C()))
);
}
}
@ -141,5 +180,226 @@ void Foam::zoneDistribute::setUpCommforZone
}
}
Foam::List<Foam::label> Foam::zoneDistribute::getCyclicPatches
(
const label celli,
const label globalIdx
) const
{
// Initialise cyclic patch label list
List<label> patches(0);
// If celli is not on a cyclic boundary, return the empty list
if (!cyclicBoundaryCells_.test(celli))
{
return patches;
}
const polyBoundaryMesh& bMesh = mesh_.boundaryMesh();
// So celli belongs to at least one cyclic patch.
// Let us figure out which.
if (globalNumbering_.isLocal(globalIdx)) // celli and globalIdx on same proc
{
// Making list of cyclic patches to which celli belongs
List<label> celliCyclicPatches;
forAll(bMesh, patchi)
{
if (isA<cyclicPolyPatch>(bMesh[patchi]))
{
// Note: Probably not efficient due to use of found(celli) but
// typically only used for very cells (interface cells and their
// point neighbours on cyclic boundaries).
if (bMesh[patchi].faceCells().found(celli))
{
celliCyclicPatches.append(patchi);
}
}
}
// Get all local point neighbor cells of celli, i.e. all point
// neighbours that are not on the other side of a cyclic patch.
List<label> localPointNeiCells(0);
const labelList& cellPoints = mesh_.cellPoints()[celli];
for (const label cellPoint : cellPoints)
{
const labelList& pointKCells = mesh_.pointCells()[cellPoint];
for (const label pointKCell : pointKCells)
{
if (!localPointNeiCells.found(pointKCell))
{
localPointNeiCells.append(pointKCell);
}
}
}
// Since globalIdx is a global cell index obtained from the point
// neighbour list, stencil[celli], all cells in this that are not in
// localPointNeiCells must be cyclic neighbour cells.
const label localIdx = globalNumbering_.toLocal(globalIdx);
if (!localPointNeiCells.found(localIdx))
{
for (const label patchi : celliCyclicPatches)
{
// find the corresponding cyclic neighbor patch ID
const cyclicPolyPatch& cpp =
static_cast<const cyclicPolyPatch&>(bMesh[patchi]);
const label neiPatch = cpp.neighbPatchID();
// Check if the cell globalIdx is on neiPatch.
// If it is, append neiPatch to list of
if (bMesh[neiPatch].faceCells().found(localIdx))
{
patches.append(neiPatch);
// Here it may be possible to append patchi and do:
//
// cpp.transformPosition()
//
// instead of
//
// cpp.neighbPatch().transformPosition() in getPosition()
}
}
}
}
else // celli and globalIdx on differet processors
{
// Note: The following is needed if a celli is located at the interface
// (plicRDF), on a cyclic patch and a processor patch. In this case
// globalIdx may be on a different processor, but requires the
// transformation from a cyclic patch on the processor of celli.
const List<label>& faces = mesh_.cells()[celli];
// Loop over all faces of celli and find cyclic patches
for (const label facei : faces)
{
if (mesh_.isInternalFace(facei)) continue;
const label patchi = bMesh.whichPatch(facei);
const cyclicPolyPatch* cpp = isA<cyclicPolyPatch>(bMesh[patchi]);
if (cpp)
{
// Get the neighbor cell across the cyclic face
const label cycNeiPatch = cpp->neighbPatchID();
const label cycNeiCell =
bMesh[cycNeiPatch].faceCells()[facei - cpp->start()];
const List<label>& cycNeiCellFaces = mesh_.cells()[cycNeiCell];
// Loop over all the faces of the neighbor cell
for (const label cycNeiCellFace : cycNeiCellFaces)
{
if (mesh_.isInternalFace(cycNeiCellFace))
{
continue;
}
// Check if the neighbor cell has processor patches
const label neiPatch = bMesh.whichPatch(cycNeiCellFace);
const processorPolyPatch* ppp =
isA<processorPolyPatch>(bMesh[neiPatch]);
if (ppp)
{
// Avoid duplicate entries
if (patches.found(cycNeiPatch))
{
continue;
}
// Since we can not access any information on globalIdx
// we use the cell centre map from the stencil to
// identify the cell.
const label localFaceID = cycNeiCellFace - ppp->start();
const vector neiCentre =
ppp->neighbFaceCellCentres()[localFaceID];
forAll(cyclicCentres_()[celli], k)
{
if
(
(
mag(cyclicCentres_()[celli][k] - neiCentre)
< 100*SMALL
)
&& (stencil_[celli][k] == globalIdx)
)
{
patches.append(cycNeiPatch);
// Here an alternative might be to append patchi
// and do:
// cpp.transformPosition()
// instead of
// cpp.neighbPatch().transformPosition()
// in getValue()
}
}
}
}
}
}
}
return patches;
}
Foam::vector Foam::zoneDistribute::getPosition
(
const VolumeField<vector>& positions,
const Map<vector>& valuesFromOtherProc,
const label gblIdx,
const List<label> cyclicPatchID
) const
{
// Position vector, possibly from other processor, to be returned
vector position(getValue(positions, valuesFromOtherProc, gblIdx));
// Dealing with position transformation across cyclic patches.
// If no transformation is required (most cases), cyclicPatchID is empty
forAll(cyclicPatchID, i)
{
const label patchi = cyclicPatchID[i];
const cyclicPolyPatch& cpp =
static_cast<const cyclicPolyPatch&>
(
positions.mesh().boundaryMesh()[patchi]
);
if (cpp.transform() != coupledPolyPatch::transformType::ROTATIONAL)
{
cpp.neighbPatch().transformPosition(position, 0);
}
else if (globalNumbering_.isLocal(gblIdx))
{
const label localIdx = globalNumbering_.toLocal(gblIdx);
for (const label facei : mesh_.cells()[localIdx])
{
if (mesh_.boundaryMesh().whichPatch(facei) == cyclicPatchID[i])
{
cpp.neighbPatch().transformPosition(position, facei);
continue;
}
}
}
else
{
FatalErrorInFunction
<< "Rotational cyclic patches are not supported in parallel.\n"
<< "Try to decompose the domain so that the rotational cyclic"
<< "patch is not split in between processors."
<< exit(FatalError);
}
}
return position;
}
// ************************************************************************* //

View File

@ -115,6 +115,15 @@ class zoneDistribute
//- Persistent set of exchange buffers
PstreamBuffers pBufs_;
//- Cell labels for all cells with a face on a cyclic boundary
bitSet cyclicBoundaryCells_;
//- Holds for each cell on cyclic patch the centres of the cells in its
// point neighbour stencil.
// Used in getCyclicPatches to identify neigbhour patch ID of point
// neighbours on other side of a processorPolyPatch.
autoPtr<Map<vectorField>> cyclicCentres_;
// Private Member Functions
@ -175,6 +184,19 @@ public:
return globalNumbering_;
}
//- Finds and returns list of all cyclic patch labels to which celli's
// point neighbour cell, globalIdx, belongs. celli and globalIdx touch
// in at least one point on these patces. globalIdx typically belongs
// to stencil_[celli]. The returned label list is used to transform
// positions across cyclic boundaries e.g. to be able to calculate
// distances between cell centres and interface centres in plicRDF
// across such boundaries.
List<label> getCyclicPatches
(
const label celli,
const label globalIdx
) const;
//- Gives patchNumber and patchFaceNumber for a given
//- Geometric volume field
template<typename Type>
@ -185,6 +207,14 @@ public:
const label gblIdx
) const;
vector getPosition
(
const VolumeField<vector>& positions,
const Map<vector>& valuesFromOtherProc,
const label gblIdx,
const List<label> cyclicPatchID = List<label>()
) const;
//- Returns stencil and provides a Map with globalNumbering
template<typename Type>
Map<Field<Type>> getFields
@ -193,6 +223,17 @@ public:
const VolumeField<Type>& phi
);
//- Returns stencil and provides a Map with globalNumbering
// Note: Not used currently (v2412) but needed for future surface
// tension modelling.
template<typename Type>
Map<Field<Type>> getPositionFields
(
const boolList& zone,
const VolumeField<Type>& phi,
const bool& checkTransformation = false
);
//- Returns stencil and provides a Map with globalNumbering
template<typename Type>
Map<Type> getDatafromOtherProc

View File

@ -128,7 +128,59 @@ Foam::Map<Foam::Field<Type>> Foam::zoneDistribute::getFields
for (const label gblIdx : stencil_[celli])
{
tmpField.append(getValue(phi,neiValues,gblIdx));
tmpField.append(getValue(phi, neiValues, gblIdx));
}
stencilWithValues.emplace(celli, tmpField);
}
}
return stencilWithValues;
}
template<typename Type>
Foam::Map<Foam::Field<Type>> Foam::zoneDistribute::getPositionFields
(
const boolList& zone,
const VolumeField<Type>& phi,
const bool& checkTransformation
)
{
if (zone.size() != phi.size())
{
FatalErrorInFunction
<< "size of zone: " << zone.size()
<< "size of phi:" << phi.size()
<< "do not match. Did the mesh change?"
<< exit(FatalError);
}
// Get values from other proc
Map<Type> neiValues = getDatafromOtherProc(zone, phi);
Map<Field<Type>> stencilWithValues;
DynamicField<Type> tmpField(128);
forAll(zone, celli)
{
if (zone[celli])
{
tmpField.clear();
for (const label gblIdx : stencil_[celli])
{
List<label> cyclicPatches(0);
if(checkTransformation)
{
cyclicPatches = getCyclicPatches(celli, gblIdx);
}
tmpField.append
(
getPosition(phi, neiValues, gblIdx, cyclicPatches)
);
}
stencilWithValues.emplace(celli, tmpField);

View File

@ -5,7 +5,7 @@
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2024 OpenCFD Ltd.
Copyright (C) 2024-2025 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@ -32,6 +32,7 @@ License
#include "cloud.H"
#include "foamVersion.H"
#include "fvMesh.H"
#include "globalMeshData.H"
#include "IFstream.H"
#include "stringOps.H"
#include "substitutionModel.H"
@ -56,7 +57,7 @@ void Foam::functionObjects::foamReport::setStaticBuiltins()
substitutionModel::addBuiltinStr
(
"OF_PROC_ZERO_DIR",
Pstream::parRun() ? "processor0" : ""
UPstream::parRun() ? "processor0" : ""
);
substitutionModel::addBuiltin("OF_API", foamVersion::api);
@ -72,26 +73,45 @@ void Foam::functionObjects::foamReport::setStaticBuiltins()
substitutionModel::addBuiltinStr("OF_CASE_PATH", argList::envGlobalPath());
substitutionModel::addBuiltinStr("OF_CASE_NAME", time().globalCaseName());
substitutionModel::addBuiltin("OF_NPROCS", Pstream::nProcs());
substitutionModel::addBuiltin("OF_NPROCS", UPstream::nProcs());
// Set mesh builtins when there is only 1 mesh
const auto meshes = time_.lookupClass<fvMesh>();
const auto meshes = time_.csorted<fvMesh>();
if (meshes.size() == 1)
{
const auto& mesh = *(meshes.begin().val());
substitutionModel::addBuiltin("OF_MESH_NCELLS", mesh.nCells());
substitutionModel::addBuiltin("OF_MESH_NFACES", mesh.nFaces());
substitutionModel::addBuiltin("OF_MESH_NEDGES", mesh.nEdges());
substitutionModel::addBuiltin("OF_MESH_NPOINTS", mesh.nPoints());
const auto& mesh = meshes[0];
substitutionModel::addBuiltin
(
"OF_MESH_NCELLS",
mesh.globalData().nTotalCells()
);
substitutionModel::addBuiltin
(
"OF_MESH_NFACES",
mesh.globalData().nTotalFaces()
);
substitutionModel::addBuiltin
(
"OF_MESH_NEDGES",
returnReduce(mesh.nEdges(), sumOp<label>())
);
substitutionModel::addBuiltin
(
"OF_MESH_NPOINTS",
mesh.globalData().nTotalPoints()
);
substitutionModel::addBuiltin
(
"OF_MESH_NINTERNALFACES",
mesh.nInternalFaces()
returnReduce(mesh.nInternalFaces(), sumOp<label>())
);
substitutionModel::addBuiltin
(
"OF_MESH_NBOUNDARYFACES",
mesh.nBoundaryFaces()
// TBD: use mesh.boundaryMesh().nNonProcessorFaces() ?
returnReduce(mesh.nBoundaryFaces(), sumOp<label>())
);
substitutionModel::addBuiltin
(
@ -123,8 +143,8 @@ void Foam::functionObjects::foamReport::setDynamicBuiltins()
substitutionModel::setBuiltinStr("OF_DATE_NOW", clock::date());
substitutionModel::setBuiltinStr("OF_CLOCK_NOW", clock::clockTime());
substitutionModel::setBuiltin("OF_NREGIONS", time().names<fvMesh>().size());
substitutionModel::setBuiltin("OF_NCLOUDS", time().names<cloud>().size());
substitutionModel::setBuiltin("OF_NREGIONS", time().count<fvMesh>());
substitutionModel::setBuiltin("OF_NCLOUDS", time().count<cloud>());
}

View File

@ -3262,6 +3262,10 @@ void Foam::snappySnapDriver::doSnap
// Update mesh mover
ppPtr = meshRefinement::makePatch(mesh, adaptPatchIDs);
// Update distance to attract to nearest feature on surface
snapDist = calcSnapDistance(mesh, snapParams, ppPtr());
meshMoverPtr.reset
(
new motionSmoother

View File

@ -705,6 +705,8 @@ bool Foam::faceAreaWeightAMI::calculate
srcCentroids_[i].transfer(srcCtr[i]);
}
tgtAddress_.setSize(tgtAddr.size());
tgtWeights_.setSize(tgtWght.size());
forAll(tgtAddr, i)
{
tgtAddress_[i].transfer(tgtAddr[i]);

View File

@ -1,6 +1,7 @@
#!/bin/sh
cd "${0%/*}" || exit # Run from this directory
. ${WM_PROJECT_DIR:?}/wmake/scripts/AllwmakeParseArguments -no-recursion "$@"
cd "${0%/*}" || exit # Run from this directory
set -- -no-recursion "$@" # Parse arguments only
. ${WM_PROJECT_DIR:?}/wmake/scripts/AllwmakeParseArguments
. ${WM_PROJECT_DIR:?}/wmake/scripts/wmakeFunctions # Require wmake functions
. ${WM_PROJECT_DIR:?}/wmake/scripts/have_scotch

View File

@ -25,7 +25,7 @@ License
\*---------------------------------------------------------------------------*/
#include "hyperbolic.H"
#include "hyperbolicBlendingMethod.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //

View File

@ -29,12 +29,12 @@ Class
Description
SourceFiles
hyperbolic.C
hyperbolicBlendingMethod.C
\*---------------------------------------------------------------------------*/
#ifndef hyperbolic_H
#define hyperbolic_H
#ifndef Foam_blendingMethod_hyperbolic_H
#define Foam_blendingMethod_hyperbolic_H
#include "blendingMethod.H"

View File

@ -39,9 +39,9 @@ $(binaryBreakup)/powerLawUniformBinary/powerLawUniformBinary.C
breakup = populationBalanceModel/breakupModels
$(breakup)/breakupModel/breakupModel.C
$(breakup)/exponential/exponential.C
$(breakup)/exponential/exponentialBreakup.C
$(breakup)/LaakkonenAlopaeusAittamaa/LaakkonenAlopaeusAittamaa.C
$(breakup)/powerLaw/powerLaw.C
$(breakup)/powerLaw/powerLawBreakup.C
daughterSize = populationBalanceModel/daughterSizeDistributionModels
$(daughterSize)/daughterSizeDistributionModel/daughterSizeDistributionModel.C
@ -63,7 +63,7 @@ blending = BlendedInterfacialModel/blendingMethods
$(blending)/blendingMethod/blendingMethod.C
$(blending)/noBlending/noBlending.C
$(blending)/linear/linearBlendingMethod.C
$(blending)/hyperbolic/hyperbolic.C
$(blending)/hyperbolic/hyperbolicBlendingMethod.C
interfacialModels/wallDependentModel/wallDependentModel.C
@ -224,7 +224,7 @@ $(TDNBModels)/Shirai/Shirai.C
nucleateFluxModels = $(wallBoilingSubModels)/nucleateFluxModels
$(nucleateFluxModels)/nucleateFluxModel/nucleateFluxModel.C
$(nucleateFluxModels)/Kutadeladze/Kutadeladze.C
$(nucleateFluxModels)/exponential/exponential.C
$(nucleateFluxModels)/exponential/exponentialNucleateFlux.C
/* Turbulence */
turbulence/multiphaseCompressibleTurbulenceModels.C

View File

@ -25,7 +25,7 @@ License
\*---------------------------------------------------------------------------*/
#include "exponential.H"
#include "exponentialNucleateFlux.H"
#include "addToRunTimeSelectionTable.H"
#include "uniformDimensionedFields.H"
#include "phasePairKey.H"

View File

@ -67,12 +67,12 @@ Usage
\endtable
SourceFiles
exponential.C
exponentialNucleateFlux.C
\*---------------------------------------------------------------------------*/
#ifndef exponential_H
#define exponential_H
#ifndef Foam_wallBoiling_nucleateFlux_exponential_H
#define Foam_wallBoiling_nucleateFlux_exponential_H
#include "nucleateFluxModel.H"

View File

@ -26,7 +26,7 @@ License
\*---------------------------------------------------------------------------*/
#include "exponential.H"
#include "exponentialBreakup.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //

View File

@ -31,12 +31,12 @@ Description
formulation implemented in the populationBalanceModel class.
SourceFiles
exponential.C
exponentialBreakup.C
\*---------------------------------------------------------------------------*/
#ifndef exponential_H
#define exponential_H
#ifndef Foam_diameterModels_breakup_exponential_H
#define Foam_diameterModels_breakup_exponential_H
#include "breakupModel.H"

View File

@ -26,7 +26,7 @@ License
\*---------------------------------------------------------------------------*/
#include "powerLaw.H"
#include "powerLawBreakup.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //

View File

@ -31,12 +31,12 @@ Description
formulation implemented in the populationBalanceModel class.
SourceFiles
powerLaw.C
powerLawBreakup.C
\*---------------------------------------------------------------------------*/
#ifndef powerLaw_H
#define powerLaw_H
#ifndef Foam_diameterModels_breakup_powerLaw_H
#define Foam_diameterModels_breakup_powerLaw_H
#include "breakupModel.H"

View File

@ -3,7 +3,7 @@ pyrolysisModel/pyrolysisModel.C
pyrolysisModel/pyrolysisModelNew.C
reactingOneDim/reactingOneDim.C
noPyrolysis/noPyrolysis.C
thermo/thermo.C
thermo/thermoPyrolysis.C
pyrolysisModel/pyrolysisModelCollection.C
LIB = $(FOAM_LIBBIN)/libpyrolysisModels

View File

@ -25,7 +25,7 @@ License
\*---------------------------------------------------------------------------*/
#include "thermo.H"
#include "thermoPyrolysis.H"
#include "addToRunTimeSelectionTable.H"
#include "volFields.H"
#include "absorptionEmissionModel.H"

View File

@ -30,12 +30,12 @@ Description
Pyrolysis model which solves only the energy equation in the region.
SourceFiles
thermo.C
thermoPyrolysis.C
\*---------------------------------------------------------------------------*/
#ifndef regionModels_pyrolysisModels_thermo_H
#define regionModels_pyrolysisModels_thermo_H
#ifndef Foam_regionModels_pyrolysisModels_thermo_H
#define Foam_regionModels_pyrolysisModels_thermo_H
#include "pyrolysisModel.H"
#include "volFieldsFwd.H"

View File

@ -39,6 +39,9 @@ License
// Flex may use register, which is deprecated and incompatible with C++17
#pragma clang diagnostic ignored "-Wdeprecated-register"
// A 'nothing' define to effectively remove from code as well (issue #3337)
#undef register
#define register
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -282,9 +282,18 @@ const Foam::volScalarField& Foam::reconstructedDistanceFunction::constructRDF
if (mag(n) != 0)
{
n /= mag(n);
vector c = distribute.getValue(centre,mapCentres,gblIdx);
vector distanceToIntSeg = (c - p);
scalar distToSurf = distanceToIntSeg & (n);
vector c
(
distribute.getPosition
(
centre,
mapCentres,
gblIdx,
distribute.getCyclicPatches(celli, gblIdx)
)
);
vector distanceToIntSeg(c - p);
scalar distToSurf = distanceToIntSeg & n;
scalar weight = 0;
if (mag(distanceToIntSeg) != 0)
@ -336,10 +345,18 @@ const Foam::volScalarField& Foam::reconstructedDistanceFunction::constructRDF
if (mag(n) != 0)
{
n /= mag(n);
vector c =
distribute.getValue(centre, mapCentres, gblIdx);
vector distanceToIntSeg = (c - p);
scalar distToSurf = distanceToIntSeg & (n);
vector c
(
distribute.getPosition
(
centre,
mapCentres,
gblIdx,
distribute.getCyclicPatches(pCellI, gblIdx)
)
);
vector distanceToIntSeg(c - p);
scalar distToSurf = distanceToIntSeg & n;
scalar weight = 0;
if (mag(distanceToIntSeg) != 0)

View File

@ -96,8 +96,16 @@ void Foam::reconstruction::plicRDF::interpolateNormal()
if (mag(n) != 0)
{
n /= mag(n);
vector centre =
exchangeFields.getValue(centre_, mapCentre, gblIdx);
vector centre
(
exchangeFields.getPosition
(
centre_,
mapCentre,
gblIdx,
exchangeFields.getCyclicPatches(celli, gblIdx)
)
);
vector distanceToIntSeg = (tensor::I- n*n) & (p - centre);
estimatedNormal += n /max(mag(distanceToIntSeg), SMALL);
weight += 1/max(mag(distanceToIntSeg), SMALL);
@ -146,7 +154,11 @@ void Foam::reconstruction::plicRDF::interpolateNormal()
const label gblIdx = stencil[celli][i];
cellCentre.append
(
exchangeFields.getValue(mesh_.C(), mapCC, gblIdx)
exchangeFields.getPosition
(
mesh_.C(), mapCC, gblIdx,
exchangeFields.getCyclicPatches(celli, gblIdx)
)
);
alphaValues.append
(
@ -193,7 +205,11 @@ void Foam::reconstruction::plicRDF::gradSurf(const volScalarField& phi)
{
cellCentre.append
(
exchangeFields.getValue(mesh_.C(), mapCC, gblIdx)
exchangeFields.getPosition
(
mesh_.C(), mapCC, gblIdx,
exchangeFields.getCyclicPatches(celli, gblIdx)
)
);
phiValues.append
(

View File

@ -5,4 +5,6 @@ cd "${0%/*}" || exit # Run from this directory
cleanCase0
rm -f Phase1
#------------------------------------------------------------------------------

View File

@ -5,10 +5,20 @@ cd "${0%/*}" || exit # Run from this directory
restore0Dir
touch case.foam
runApplication blockMesh
runApplication setAlphaField
runApplication $(getApplication)
runApplication decomposePar
runParallel $(getApplication)
grep "Phase-1" log.$(getApplication) | cut -d' ' -f5 > Phase1
echo "Volume conservation:"
echo "Initial Phase-1: " $(head -1 Phase1)
echo "Final Phase-1 : " $(tail -1 Phase1)
#------------------------------------------------------------------------------

View File

@ -35,7 +35,7 @@ purgeWrite 0;
writeFormat ascii;
writePrecision 6;
writePrecision 12;
writeCompression off;

View File

@ -24,5 +24,13 @@ coeffs
n ( 2 1 2 );
}
constraints
{
preservePatches
{
type preservePatches;
patches (left right top bottom);
}
}
// ************************************************************************* //

View File

@ -22,10 +22,10 @@ solvers
{
isoFaceTol 1e-6;
surfCellTol 1e-6;
snapTol 1e-10;
snapTol 0;
nAlphaBounds 3;
clip true;
reconstructionScheme isoAlpha; // isoAlpha
clip false;
reconstructionScheme plicRDF;
nAlphaSubCycles 1;
cAlpha 1; // Read but not used by interIsoFoam

View File

@ -1 +0,0 @@
include $(GENERAL_RULES)/cgal

View File

@ -12,7 +12,7 @@ ptFLAGS := -DNoRepository
c++WARN = \
-Wall -Wextra \
--diag_suppress=111,128,177,185,612,998,1098 \
--diag_suppress=111,128,177,185,612,998,1098,1428 \
--display_error_number
# Less restrictive warnings (eg, for flex++, CGAL, etc.)
@ -34,5 +34,6 @@ sinclude $(GENERAL_RULES)/common/c++$(WM_COMPILE_OPTION)
#612-D: overloaded virtual function ... is only partially overridden
#998-D: function XX is hidden by YY -- virtual function override intended?
#1098-D: unknown attribute "fallthrough"
#1428-D: [offset_in_non_POD_nonstandard]
#
#------------------------------------------------------------------------------

View File

@ -1,2 +1,2 @@
c++DBUG =
c++OPT = -ffp-contract=fast -ffast-math -O3 -funsafe-math-optimizations -fsimdmath -armpl
c++OPT = -ffp-contract=fast -ffast-math -O3 -funsafe-math-optimizations -armpl