PLIC,MPLIC: New piecewise-linear interface compression schemes

A new family of interface compression interpolation schemes based on
piecewise-linear interface calculation (PLIC). PLIC represents an interface by
surface-cuts which split each cell to match the volume fraction of the phase in
that cell. The surface-cuts are oriented according to the point field of the
local phase fraction. The phase fraction on each cell face — the interpolated
value — is then calculated from the amount submerged below the surface-cut.

The basic PLIC method generates a single cut so cannot handle cells in which
there are multiple interfaces or where the interface is not fully resolved. In
those cells, the interpolation reverts to an alternative scheme, typically
standard interface compression. PLIC, with a fallback to interface compression,
produces robust solutions for real engineering cases. It can run with large time
steps so can solve problems like hydrodynamics of a planing hull, with rigid
body motion of the hull (above). The user selects PLIC by the following setting
in fvSchemes:

    div(phi,alpha)      Gauss PLIC interfaceCompression vanLeer 1;

The multicut PLIC (MPLIC) scheme extends PLIC to handle multiple
surface-cuts. Where a single cut is insufficient, MPLIC performs a topological
face-edge-face walk to produce multiple splits of a cell. If that is still
insufficient, MPLIC decomposes the cell into tetrahedrons on which the cuts are
applied. The extra cutting carries an additional computational cost but requires
no fallback. The user selects MPLIC by the following setting in the fvSchemes
file:

    div(phi,alpha)      Gauss MPLIC;

Variants of the PLIC and MPLIC schemes are also available which use velocities
at the face points to calculate the face flux. These PLICU and MPLICU schemes
are likely to be more accurate in regions of interface under high shear.

More details can be found here:
https://cfd.direct/openfoam/free-software/multiphase-interface-capturing

Jakub Knir
CFD Direct Ltd.
This commit is contained in:
Jakub Knir
2020-07-02 13:24:05 +01:00
parent fa79bab863
commit 1611e0dbfb
51 changed files with 1033658 additions and 1 deletions

View File

@ -0,0 +1,255 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "MPLIC.H"
#include "MPLICcell.H"
#include "volPointInterpolation.H"
#include "syncTools.H"
#include "slicedSurfaceFields.H"
#include "upwind.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(MPLIC, 0);
surfaceInterpolationScheme<scalar>::addMeshFluxConstructorToTable<MPLIC>
addMPLICScalarMeshFluxConstructorToTable_;
}
// * * * * * * * * * * * * * * * Private Functions * * * * * * * * * * * * * //
void Foam::MPLIC::setCellAlphaf
(
const label celli,
const scalarField& phi,
scalarField& alphaf,
boolList& correctedFaces,
const DynamicList<scalar>& cellAlphaf,
const fvMesh& mesh
) const
{
// Face owners reference
const labelList& own = mesh.faceOwner();
// The cell face labels
const labelList& cFaces = mesh.cells()[celli];
// Fill the alphaf with surface interpolation in direction of the flow
forAll(cFaces, i)
{
const label facei = cFaces[i];
const scalar phiSigni = sign(phi[facei]);
if
(
(own[facei] == celli && phiSigni == 1)
|| (own[facei] != celli && phiSigni == -1)
)
{
alphaf[facei] = cellAlphaf[i];
correctedFaces[facei] = true;
}
}
}
Foam::tmp<Foam::surfaceScalarField> Foam::MPLIC::surfaceAlpha
(
const volScalarField& alpha,
const surfaceScalarField& phi,
scalarField& initAlphaf,
const bool unweighted,
const scalar tol,
const bool isMPLIC
) const
{
// Finite volume mesh reference
const fvMesh& mesh = alpha.mesh();
// Reference to primitive mesh
const primitiveMesh& primMesh = mesh;
// Velocity field reference
const volVectorField& U
(
mesh.lookupObject<const volVectorField>
(
IOobject::groupName("U", phi.group())
)
);
// Interpolate alpha from volume to the points of the mesh
const scalarField alphap
(
volPointInterpolation::New(mesh).interpolate(alpha)
);
// Interpolate U from cell centres to the points of the mesh
vectorField Up;
if (!unweighted)
{
Up = volPointInterpolation::New(mesh).interpolate(U);
}
// Flatten down phi flux field
const scalarField spicedPhi
(
slicedSurfaceScalarField
(
IOobject
(
"splicedPhi",
mesh.time().timeName(),
mesh
),
phi,
false
).splice()
);
scalarField alphaf(mesh.nFaces(), 0);
// Mark which faces are corrected by MPLIC
boolList correctedFaces(mesh.nFaces(), false);
// Construct class for cell cut
MPLICcell cutCell(unweighted, isMPLIC);
// Loop through all the cells
forAll(mesh.cells(), celli)
{
if (alpha[celli] < (1 - tol) && alpha[celli] > tol)
{
// Store cell information
const MPLICcellStorage cellInfo
(
primMesh,
alphap,
Up,
alpha[celli],
U[celli],
celli
);
// Volume ratio matching algorithm
if (cutCell.matchAlpha(cellInfo))
{
// Fill cutCell.alphaf() with face values from this cell
setCellAlphaf
(
celli,
spicedPhi,
alphaf,
correctedFaces,
cutCell.alphaf(),
mesh
);
}
}
}
// Synchronise across the processor and cyclic patches
syncTools::syncFaceList(mesh, alphaf, plusEqOp<scalar>());
syncTools::syncFaceList(mesh, correctedFaces, plusEqOp<bool>());
// Correct selected faces
forAll(correctedFaces, facei)
{
if (correctedFaces[facei])
{
initAlphaf[facei] = alphaf[facei];
}
}
// Convert the alphaPhi spliced field into a surfaceScalarField
tmp<surfaceScalarField> tslicedAlpha
(
surfaceScalarField::New
(
"alphaf",
slicedSurfaceScalarField
(
IOobject
(
"alphaf",
mesh.time().timeName(),
mesh
),
mesh,
dimless,
initAlphaf,
false
),
fvsPatchField<scalar>::calculatedType()
)
);
surfaceScalarField& slicedAlpha = tslicedAlpha.ref();
forAll(mesh.boundary(), patchi)
{
if (alpha.boundaryField()[patchi].fixesValue())
{
slicedAlpha.boundaryFieldRef()[patchi] =
alpha.boundaryField()[patchi];
}
}
return tslicedAlpha;
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::tmp<Foam::surfaceScalarField> Foam::MPLIC::interpolate
(
const GeometricField<scalar, fvPatchField, volMesh>& vf
) const
{
tmp<surfaceScalarField> tvff(upwind<scalar>(mesh(), phi_).interpolate(vf));
scalarField spicedTvff
(
slicedSurfaceScalarField
(
IOobject
(
"spicedTvff",
mesh().time().timeName(),
mesh()
),
tvff,
false
).splice()
);
return surfaceAlpha(vf, phi_, spicedTvff, true, 1e-6);
}
// ************************************************************************* //

View File

@ -0,0 +1,176 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::MPLIC
Description
Multicut Piecewise-Linear Interface Calculation (MPLIC) corrected scheme is
a surface interpolation scheme for flux calculation in advection of a
bounded variable, e.g. phase fraction and for interface capturing in the
volume of fluid (VoF) method.
The interface is represented by multiple cuts which split each cell to match
the volume fraction of the phase in the cell. The cut planes are oriented
according to the point field of the local phase fraction. The phase
fraction at each cell face - the interpolated value - is then calculated
from the face area on either side of the cuts.
Three progressively more complex algorithms are used to ensure the cell
volume fraction is accurately reproduced:
-# single cut: cuts all the cell faces regardless the order
-# multi cut: topological face-edge-face walk which can split cell into
multiple sub-volumes
-# tetrahedron cut: decomposes cell into tetrahedrons which are cut
Example:
\verbatim
divSchemes
{
.
.
div(phi,alpha) Gauss MPLIC;
.
.
}
\endverbatim
See also
Foam::MPLICU
Foam::PLIC
Foam::PLICU
Foam::interfaceCompression
SourceFiles
MPLIC.C
\*---------------------------------------------------------------------------*/
#ifndef MPLIC_H
#define MPLIC_H
#include "surfaceInterpolationScheme.H"
#include "DynamicList.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class MPLIC Declaration
\*---------------------------------------------------------------------------*/
class MPLIC
:
public surfaceInterpolationScheme<scalar>
{
protected:
// Private member data
const surfaceScalarField& phi_;
// Protected member functions
//- Set alphaPhi for the faces of the given cell
void setCellAlphaf
(
const label celli,
const scalarField& phi,
scalarField& alphaf,
boolList& correctedFaces,
const DynamicList<scalar>& cellAlphaf,
const fvMesh& mesh
) const;
//- Return alpha interpolation
tmp<surfaceScalarField> surfaceAlpha
(
const volScalarField& alpha,
const surfaceScalarField& phi,
scalarField& spicedTvff,
const bool unweighted,
const scalar tol,
const bool isMPLIC = true
) const;
public:
//- Runtime type information
TypeName("MPLIC");
// Constructors
//- Construct from faceFlux and Istream
MPLIC
(
const fvMesh& mesh,
const surfaceScalarField& faceFlux,
Istream& is
)
:
surfaceInterpolationScheme<scalar>(mesh),
phi_(faceFlux)
{}
// Member Functions
//- Return the interpolation weighting factors
virtual tmp<surfaceScalarField> weights
(
const GeometricField<scalar, fvPatchField, volMesh>&
) const
{
NotImplemented;
return tmp<surfaceScalarField>(nullptr);
}
//- Return the face-interpolate of the given cell field
virtual tmp<surfaceScalarField> interpolate
(
const GeometricField<scalar, fvPatchField, volMesh>& vf
) const;
// Member Operators
//- Disallow default bitwise assignment
void operator=(const MPLIC&) = delete;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,68 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "MPLICU.H"
#include "slicedSurfaceFields.H"
#include "upwind.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(MPLICU, 0);
surfaceInterpolationScheme<scalar>::addMeshFluxConstructorToTable<MPLICU>
addMPLICUScalarMeshFluxConstructorToTable_;
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::tmp<Foam::surfaceScalarField> Foam::MPLICU::interpolate
(
const GeometricField<scalar, fvPatchField, volMesh>& vf
) const
{
tmp<surfaceScalarField> tvff(upwind<scalar>(mesh(), phi_).interpolate(vf));
scalarField spicedTvff
(
slicedSurfaceScalarField
(
IOobject
(
"spicedTvff",
mesh().time().timeName(),
mesh()
),
tvff,
false
).splice()
);
return surfaceAlpha(vf, phi_, spicedTvff, false, 1e-6);
}
// ************************************************************************* //

View File

@ -0,0 +1,146 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::MPLICU
Description
Velocity-weighted Multicut Piecewise-Linear Interface Calculation (MPLICU)
corrected scheme is a surface interpolation scheme for flux calculation in
advection of a bounded variable, e.g. phase fraction and for interface
capturing in the volume of fluid (VoF) method.
The interface is represented by multiple cuts which split each cell to match
the volume fraction of the phase in the cell. The cut planes are oriented
according to the point field of the local phase fraction. The phase
fraction at each cell face - the interpolated value - is then calculated
from the face area on either side of the cuts.
Three progressively more complex algorithms are used to ensure the cell
volume fraction is accurately reproduced:
-# single cut: cuts all the cell faces regardless the order
-# multi cut: topological face-edge-face walk which can split cell into
multiple sub-volumes
-# tetrahedron cut: decomposes cell into tetrahedrons which are cut
Additionally the face point velocity values are used to calculate the face
flux which is likely to be more accurate in the presence of high shear.
Example:
\verbatim
divSchemes
{
.
.
div(phi,alpha1) Gauss MPLICU;
.
.
}
\endverbatim
See also
Foam::MPLIC
Foam::PLIC
Foam::PLICU
Foam::interfaceCompression
SourceFiles
MPLICU.C
\*---------------------------------------------------------------------------*/
#ifndef MPLICU_H
#define MPLICU_H
#include "MPLIC.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class MPLICU Declaration
\*---------------------------------------------------------------------------*/
class MPLICU
:
public MPLIC
{
public:
//- Runtime type information
TypeName("MPLICU");
// Constructors
//- Construct from faceFlux and Istream
MPLICU
(
const fvMesh& mesh,
const surfaceScalarField& faceFlux,
Istream& is
)
:
MPLIC(mesh, faceFlux, is)
{}
// Member Functions
//- Return the interpolation weighting factors
virtual tmp<surfaceScalarField> weights
(
const GeometricField<scalar, fvPatchField, volMesh>& vf
) const
{
NotImplemented;
return tmp<surfaceScalarField>(nullptr);
}
//- Return the face-interpolate of the given cell field
virtual tmp<surfaceScalarField> interpolate
(
const GeometricField<scalar, fvPatchField, volMesh>& vf
) const;
// Member Operators
//- Disallow default bitwise assignment
void operator=(const MPLICU&) = delete;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,399 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::MPLICcell
Description
Class performs geometric matching of volume fraction and calculates surface
interpolation of volume fraction field.
Cut algorithms:
- Single cell cut
- Face-edge walk multiple cell cuts
- Tet decomposition cell cuts
SourceFiles
MPLICcell.C
\*---------------------------------------------------------------------------*/
#ifndef MPLICcell_H
#define MPLICcell_H
#include "MPLICface.H"
#include "MPLICcellStorage.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class MPLICcell Declaration
\*---------------------------------------------------------------------------*/
class MPLICcell
{
// Private member data
// Face related objects
//- Select unweighted interpolation if true
// velocity flux corrected if false
const bool unweighted_;
//- Select multi-cut if true or single-cut if false
const bool multiCut_;
//- Surface interpolated alpha
DynamicList<scalar> alphaf_;
//- Flux of alpha from point interpolated U
DynamicList<scalar> alphaPhiU_;
//- Face flux from point interpolated U
DynamicList<scalar> phiU_;
// Geometry related objects
//- Calculated volume fraction corresponding to the cut
scalar cutAlpha_;
//- Cut surface area vector
vector cutSf_;
//- Cut normal
vector cutNormal_;
//- Face cutter
MPLICface faceCutter_;
//- Sub cell volume
scalar subCellVolume_;
//- Cut points for single cut
DynamicList<point> cutPoints_;
//- Cut edge labels for single cut
DynamicList<label> cutEdges_;
//- Submerged face areas
DynamicList<vector> subFaceAreas_;
//- Submerged face areas
DynamicList<scalar> subFaceMagSf_;
//- Submerged face centers
DynamicList<vector> subFaceCentres_;
template<class Type>
class Vector4
:
public VectorSpace<Vector4<Type>, Type, 4>
{
public:
// Constructors
//- Construct null
inline Vector4()
{}
inline Type a() const
{
return this->v_[0];
}
inline Type b() const
{
return this->v_[1];
}
inline Type c() const
{
return this->v_[2];
}
inline Type d() const
{
return this->v_[3];
}
inline Type& a()
{
return this->v_[0];
}
inline Type& b()
{
return this->v_[1];
}
inline Type& c()
{
return this->v_[2];
}
inline Type& d()
{
return this->v_[3];
}
};
typedef Vector4<scalar> vector4;
//- Four point alpha values for cubic polynomial fit
vector4 pCubicAlphas_;
//- Four cell alpha values for cubic polynomial fit
vector4 cCubicAlphas_;
// Tetrahedron storage objects
//- Tetrahedron alpha point values
scalarField tetPointsAlpha_;
//- Tetrahedron velocity point values
vectorField tetPointsU_;
//- Tetrahedron points
pointField tetPoints_;
//- Tetrahedron surface area vectors
Vector4<vector> tetSf_;
//- Tetrahedron face centres
Vector4<vector> tetCf_;
//- Tetrahedron triangular faces addressing
const FixedList<face, 4> tetFaces_;
// Multicut addressing
//- Is addressnig computed?
bool addressingCalculated_;
//- Local edge faces
DynamicList<DynamicList<label>> localEdgeFaces_;
//- Local face edges
DynamicList<DynamicList<label>> localFaceEdges_;
// Cell-point work arrays
DynamicList<scalar> cellPointsAlpha_;
DynamicList<scalar> pointsAlpha_;
// Private Member Functions
//- Match cell volume ratio to phase fraction
// Returns:
// - +1: success
// - 0: fail
// - -1: base scheme
label calcMatchAlphaCutCell
(
const MPLICcellStorage& cellInfo,
const bool tetDecom = false
);
//- Find in between which two point alpha values
// the target volume fraction lies
void findPointAlphaBounds
(
const MPLICcellStorage& cellInfo,
const bool tetDecom
);
//- Calculate the two interior point alpha values for the cubic fit
void calcPointAlphaInterior
(
const MPLICcellStorage& cellInfo,
const bool tetDecom
);
//- Solve the cubic fit
FixedList<scalar, 4> solveVanderMatrix() const;
//- Identifying roots of cubic equation matching target volume fraction
void findRoots
(
const MPLICcellStorage& cellInfo,
const FixedList<scalar, 4>& coeffs,
const bool tetDecom
);
//- Select simple cut or tet decomposition
scalar calcAlpha
(
const MPLICcellStorage& cellInfo,
const scalar target,
const bool tetDecom
);
//- Calculate current sub-cell volume
void calcSubCellVolume();
//- Calculate cell cut, volume and alpha
scalar calcCutCellVolumeAlpha
(
const MPLICcellStorage& cellInfo,
const scalar target
);
//- Calculate cell cut, volume and alpha by tet decomposition
scalar calcTetCutCellVolumeAlpha
(
const MPLICcellStorage& cellInfo,
const scalar target
);
//- Attempt single cut through the cell
// Returns:
// - 1: success
// - 0: fail
bool singleCutCell
(
const MPLICcellStorage& cellInfo,
const scalar target
);
//- Attempt multiple cuts through the cell
bool multiCutCell
(
const MPLICcellStorage& cellInfo,
const scalar target
);
//- Single cut through tet
bool cutTetCell
(
const scalar target,
const label faceOrig,
const bool ow
);
//- Calculate local addressing for multi-cut
inline void calcAddressing
(
const MPLICcellStorage& cellInfo
);
//- Append face area vectors and centers to cache
inline void appendSfCf
(
const vector& Sf,
const vector& Cf,
const scalar magSf,
const bool own = true
);
//- Calculating surface vector of unordered edges
inline bool cutStatusCalcSf();
//- Calculate cut surface area vector
inline vector calcCutSf() const;
//- Calculating surface center of unordered edges
inline vector calcCutCf(const vector& cutSf) const;
//- Calculate phiU
inline void phiU
(
const pointField& points,
const faceList& faces,
const labelList& cFaces,
const vectorField& pointsU
);
//- Resize and set all the cell face fields to 0
inline void resetFaceFields(const label nFaces);
//- Compute surface interpolation from area ratio
inline void calcAlphaf(const UIndirectList<scalar>& magSfs);
//- Compute surface interpolation from flux ratio
inline void calcAlphaUf();
//- Clear storage
inline void clear();
//- Clear single cut storage
inline void clearOneCut();
public:
// Constructors
//- Construct for given interpolation and PLIC type
MPLICcell
(
const bool unweighted = true,
const bool multiCut = true
);
// Member functions
//- Match cell volume ratios
bool matchAlpha
(
const MPLICcellStorage& cellInfo
);
//- Return face volume fraction
inline const DynamicList<scalar>& alphaf() const;
//- Return cut normal
inline const vector& cutNormal() const;
//- Return volume fraction corresponding to the cut
inline scalar cutAlpha() const;
//- Return sub-cell volume
inline scalar subCellVolume() const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "MPLICcellI.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,293 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "MPLICcell.H"
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
inline void Foam::MPLICcell::calcAddressing
(
const MPLICcellStorage& cellInfo
)
{
localEdgeFaces_.setSize(cellInfo.cellEdges().size());
localFaceEdges_.setSize(cellInfo.size());
// Create edge map, setting edge faces to zero
Map<label> edgeMap;
forAll(cellInfo.cellEdges(), edgei)
{
edgeMap.set(cellInfo.cellEdges()[edgei], edgei);
localEdgeFaces_[edgei].clear();
}
// Set size of each face edges to zero
forAll(localFaceEdges_, i)
{
localFaceEdges_[i].clear();
}
forAll(cellInfo.cellFaces(), facei)
{
const label faceN = cellInfo.cellFaces()[facei];
const labelList& faceEdges = cellInfo.faceEdges()[faceN];
forAll(faceEdges, edgei)
{
const label edg = faceEdges[edgei];
const label localEdgeIndex = edgeMap[edg];
localEdgeFaces_[localEdgeIndex].append(facei);
localFaceEdges_[facei].append(localEdgeIndex);
}
}
addressingCalculated_ = true;
}
inline bool Foam::MPLICcell::cutStatusCalcSf()
{
bool cutOrientationDiffers = false;
const point pAvg = sum(cutPoints_)/cutPoints_.size();
for (label i=0; i<cutPoints_.size(); i+=2)
{
const vector area = (cutPoints_[i] - pAvg)^(cutPoints_[i+1] - pAvg);
cutSf_ += area;
if
(
sign(area.x()*cutSf_.x()) == -1
|| sign(area.y()*cutSf_.y()) == -1
|| sign(area.z()*cutSf_.z()) == -1
)
{
cutOrientationDiffers = true;
}
}
cutSf_ *= 0.5;
return cutOrientationDiffers;
}
inline Foam::vector Foam::MPLICcell::calcCutSf() const
{
vector cutArea = Zero;
const point pAvg = sum(cutPoints_)/cutPoints_.size();
for (label i=0; i<cutPoints_.size(); i+=2)
{
cutArea += (cutPoints_[i] - pAvg)^(cutPoints_[i+1] - pAvg);
}
cutArea *= 0.5;
return cutArea;
}
inline Foam::vector Foam::MPLICcell::calcCutCf(const vector& cutSf) const
{
const vector sumAHat = normalised(cutSf);
const point pAvg = sum(cutPoints_)/cutPoints_.size();
scalar sumAn = 0;
vector sumAnc = Zero;
for (label i=0; i < cutPoints_.size(); i+=2)
{
const vector a = (cutPoints_[i] - pAvg) ^ (cutPoints_[i+1] - pAvg);
const vector c = cutPoints_[i] + cutPoints_[i+1] + pAvg;
const scalar an = a & sumAHat;
sumAn += an;
sumAnc += an*c;
}
if (sumAn > vSmall)
{
return (1.0/3.0)*sumAnc/sumAn;
}
else
{
return pAvg;
}
}
inline void Foam::MPLICcell::appendSfCf
(
const vector& Sf,
const vector& Cf,
const scalar magSf,
const bool own
)
{
if (magSf > 0)
{
if (own)
{
subFaceAreas_.append(Sf);
}
else
{
subFaceAreas_.append(-Sf);
}
subFaceCentres_.append(Cf);
}
}
inline void Foam::MPLICcell::phiU
(
const pointField& points,
const faceList& faces,
const labelList& cFaces,
const vectorField& pointsU
)
{
const label nFaces = cFaces.size();
// Set size and initialize alphaPhiU
alphaPhiU_.setSize(nFaces);
alphaPhiU_ = 0;
// Set size and initialize phiU
phiU_.setSize(nFaces);
// Reconstruct fluxes
forAll(cFaces, facei)
{
phiU_[facei] =
MPLICface().alphaPhiU(pointsU, points, faces[cFaces[facei]]);
}
}
inline void Foam::MPLICcell::resetFaceFields(const label nFaces)
{
alphaf_.setSize(nFaces);
alphaf_ = 0;
if (unweighted_)
{
subFaceMagSf_.setSize(nFaces);
subFaceMagSf_ = 0;
}
else
{
alphaPhiU_.setSize(nFaces);
alphaPhiU_ = 0;
}
}
inline void Foam::MPLICcell::calcAlphaf
(
const UIndirectList<scalar>& magSfs
)
{
const label nFaces = magSfs.size();
alphaf_.setSize(nFaces);
forAll(alphaf_, facei)
{
if (magSfs[facei] > vSmall)
{
alphaf_[facei] = subFaceMagSf_[facei]/magSfs[facei];
// Bound between 0 and 1 (it is always > 0)
alphaf_[facei] = (alphaf_[facei] > 1) ? 1 : alphaf_[facei];
}
else
{
alphaf_[facei] = 0;
}
}
}
inline void Foam::MPLICcell::calcAlphaUf()
{
const label nFaces = alphaPhiU_.size();
alphaf_.setSize(nFaces);
forAll(alphaf_, facei)
{
if (mag(phiU_[facei]) > vSmall)
{
alphaf_[facei] = alphaPhiU_[facei]/phiU_[facei];
// Bound between 0 and 1
alphaf_[facei] = (alphaf_[facei] > 1) ? 1 : alphaf_[facei];
alphaf_[facei] = (alphaf_[facei] < 0) ? 0 : alphaf_[facei];
}
else
{
alphaf_[facei] = 0;
}
}
}
inline void Foam::MPLICcell::clearOneCut()
{
cutPoints_.clear();
cutEdges_.clear();
subFaceAreas_.clear();
subFaceCentres_.clear();
}
inline void Foam::MPLICcell::clear()
{
clearOneCut();
alphaPhiU_.clear();
subFaceMagSf_.clear();
cutAlpha_ = -1;
cutNormal_ = Zero;
cutSf_ = Zero;
subCellVolume_ = 0;
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
inline const Foam::DynamicList<Foam::scalar>& Foam::MPLICcell::alphaf() const
{
return alphaf_;
}
inline const Foam::vector& Foam::MPLICcell::cutNormal() const
{
return cutNormal_;
}
inline Foam::scalar Foam::MPLICcell::subCellVolume() const
{
return subCellVolume_;
}
inline Foam::scalar Foam::MPLICcell::cutAlpha() const
{
return cutAlpha_;
}
// ************************************************************************* //

View File

@ -0,0 +1,174 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "MPLICcellStorage.H"
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
Foam::boolList Foam::MPLICcellStorage::calcIsOwner
(
const primitiveMesh& mesh,
const label celli
) const
{
const cell& c = mesh.cells()[celli];
boolList cOwns(c.size(), false);
forAll(c, i)
{
const label ow = mesh.faceOwner()[c[i]];
if (ow == celli)
{
cOwns[i] = true;
}
}
return cOwns;
}
Foam::scalar Foam::MPLICcellStorage::calcAlphaMin() const
{
// Initialize with the first value in the list
scalar cellAlphaMin(pointsAlpha_.first());
// Loop through the rest and compare element-wise
for (label i = 1; i < cPoints_.size(); ++i)
{
const label pI = cPoints_[i];
cellAlphaMin = min(cellAlphaMin, pointsAlpha_[pI]);
}
// Return minimum value
return cellAlphaMin;
}
Foam::scalar Foam::MPLICcellStorage::calcAlphaMax() const
{
// Initialize with the first value in the list
scalar cellAlphaMax(pointsAlpha_.first());
// Loop through the rest and compare element-wise
for (label i = 1; i < cPoints_.size(); ++i)
{
const label pI = cPoints_[i];
cellAlphaMax = max(cellAlphaMax, pointsAlpha_[pI]);
}
// Return maximum value
return cellAlphaMax;
}
Foam::scalarField Foam::MPLICcellStorage::calcFacesAlphaMin() const
{
scalarField facesAlphaMin(cFaces_.size());
forAll(cFaces_, facei)
{
// Face
const face& f = faces_[cFaces_[facei]];
// Initialize with the first value in the list
scalar fAlphaMin(pointsAlpha_[f.first()]);
// Loop through the rest and compare element-wise
for (label i = 1; i < f.size(); ++i)
{
fAlphaMin = min(fAlphaMin, pointsAlpha_[f[i]]);
}
facesAlphaMin[facei] = fAlphaMin;
}
// Return minimum value
return facesAlphaMin;
}
Foam::scalarField Foam::MPLICcellStorage::calcFacesAlphaMax() const
{
scalarField facesAlphaMax(cFaces_.size());
forAll(cFaces_, facei)
{
// Face
const face& f = faces_[cFaces_[facei]];
// Initialize with the first value in the list
scalar fAlphaMax(pointsAlpha_[f.first()]);
// Loop through the rest and compare element-wise
for (label i = 1; i < f.size(); ++i)
{
fAlphaMax = max(fAlphaMax, pointsAlpha_[f[i]]);
}
facesAlphaMax[facei] = fAlphaMax;
}
// Return maximum
return facesAlphaMax;
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::MPLICcellStorage::MPLICcellStorage
(
const primitiveMesh& mesh,
const scalarField& pointsAlpha,
const vectorField& pointsU,
const scalar cellAlpha,
const vector& cellU,
const label celli
)
:
points_(mesh.points()),
faces_(mesh.faces()),
edges_(mesh.edges()),
edgeFaces_(mesh.faceEdges()),
cPoints_(mesh.cellPoints()[celli]),
cFaces_(mesh.cells()[celli]),
cEdges_(mesh.cellEdges()[celli]),
pointsAlpha_(pointsAlpha),
pointsU_(pointsU),
cellAlpha_(cellAlpha),
celllU_(cellU),
owns_(calcIsOwner(mesh, celli)),
volume_(mesh.cellVolumes()[celli]),
centre_(mesh.cellCentres()[celli]),
Sf_(mesh.faceAreas(), cFaces_),
Cf_(mesh.faceCentres(), cFaces_),
magSf_(mesh.magFaceAreas(), cFaces_),
cellAlphaMin_(calcAlphaMin()),
cellAlphaMax_(calcAlphaMax()),
facesAlphaMin_(calcFacesAlphaMin()),
facesAlphaMax_(calcFacesAlphaMax()),
faceEdges_(mesh.faceEdges())
{}
// ************************************************************************* //

View File

@ -0,0 +1,241 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::MPLICcellStorage
Description
Provides local cell addressing for geometry and data for MPLIC class.
SourceFiles
MPLICcellStorage.C
\*---------------------------------------------------------------------------*/
#ifndef MPLICcellStorage_H
#define MPLICcellStorage_H
#include "primitiveMesh.H"
#include "UIndirectList.H"
#include "uindirectPrimitivePatch.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class MPLICcell Declaration
\*---------------------------------------------------------------------------*/
class MPLICcellStorage
{
// Private data
//- Reference to the mesh points
const pointField& points_;
//- Reference to the mesh faces
const faceList& faces_;
//- Reference to the mesh edges
const edgeList& edges_;
//- Reference to the mesh face edges
const labelListList& edgeFaces_;
//- Reference to the cell points
const labelList& cPoints_;
//- Reference to face list
const labelList& cFaces_;
//- Reference to cell edges
const labelList& cEdges_;
//- Alpha at the cell vertices
const scalarField& pointsAlpha_;
//- Velocity at the cell vertices
const vectorField& pointsU_;
//- Cell centre value of alpha
const scalar cellAlpha_;
//- Cell centre value of velocity
const vector& celllU_;
//- Owner? For all faces on the cell
const boolList owns_;
//- Cell volume
const scalar volume_;
//- Cell centre
const vector& centre_;
//- Face area vectors
const UIndirectList<vector> Sf_;
//- Face centres
const UIndirectList<vector> Cf_;
//- Face areas
const UIndirectList<scalar> magSf_;
//- Cell alpha min
const scalar cellAlphaMin_;
//- Cell alpha max
const scalar cellAlphaMax_;
//- Face alpha mins
const scalarField facesAlphaMin_;
//- Face alpha maxs
const scalarField facesAlphaMax_;
//- Global face edges
const labelListList& faceEdges_;
// Private Member Functions
//- Return the face owner list for the faces of the cell
boolList calcIsOwner
(
const primitiveMesh& mesh, const label celli
) const;
//- Calculate minimum point alpha value in the cell
scalar calcAlphaMin() const;
//- Calculate maximum point alpha value in the cell
scalar calcAlphaMax() const;
//- Calculate minimum point alpha value on the cell faces
scalarField calcFacesAlphaMin() const;
//- Calculate maximum point alpha value on the cell faces
scalarField calcFacesAlphaMax() const;
public:
// Constructors
//- Construct from components
MPLICcellStorage
(
const primitiveMesh& mesh,
const scalarField& pointsAlpha,
const vectorField& pointsU,
const scalar cellAlpha,
const vector& cellU,
const label celli
);
// Public Member Functions
//- Return reference to mesh points
inline const pointField& points() const;
//- Return reference to the mesh faces
inline const faceList& faces() const;
//- Return reference to the mesh edges
inline const edgeList& edges() const;
//- Return reference to the mesh face edges
inline const labelListList& faceEdges() const;
//- Return reference to the cell points
inline const labelList& cellPoints() const;
//- Return reference to face list
inline const labelList& cellFaces() const;
//- Return reference to cell edges
inline const labelList& cellEdges() const;
//- Return isOwners
inline const boolList& isOwner() const;
//- Return point alphas
inline const scalarField& pointsAlpha() const;
//- Return point velocities
inline const vectorField& pointsU() const;
//- Return cell alpha
inline scalar cellAlpha() const;
//- Return cell velocity
inline const vector& cellU() const;
//- Return cell volume
inline scalar V() const;
//- Return cell centre
inline const vector& C() const;
//- Return face surface area vectors
inline const UIndirectList<vector>& Sf() const;
//- Return face centres
inline const UIndirectList<vector>& Cf() const;
//- Return face areas
inline const UIndirectList<scalar>& magSf() const;
//- Return maximum point alpha value in the cell
inline scalar cellAlphaMax() const;
//- Return minimum point alpha value in the cell
inline scalar cellAlphaMin() const;
//- Return minimum point alpha value on the cell faces
inline const scalarField& facesAlphaMin() const;
//- Return maximum point alpha value on the cell faces
inline const scalarField& facesAlphaMax() const;
//- Return number of faces in the the cell
inline label size() const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
}// End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "MPLICcellStorageI.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,164 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "MPLICcellStorage.H"
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
inline const Foam::pointField& Foam::MPLICcellStorage::points() const
{
return points_;
}
inline const Foam::faceList& Foam::MPLICcellStorage::faces() const
{
return faces_;
}
inline const Foam::edgeList& Foam::MPLICcellStorage::edges() const
{
return edges_;
}
inline const Foam::labelListList& Foam::MPLICcellStorage::faceEdges() const
{
return faceEdges_;
}
inline const Foam::labelList& Foam::MPLICcellStorage::cellPoints() const
{
return cPoints_;
}
inline const Foam::labelList& Foam::MPLICcellStorage::cellFaces() const
{
return cFaces_;
}
inline const Foam::labelList& Foam::MPLICcellStorage::cellEdges() const
{
return cEdges_;
}
inline const Foam::boolList& Foam::MPLICcellStorage::isOwner() const
{
return owns_;
}
inline const Foam::scalarField& Foam::MPLICcellStorage::pointsAlpha() const
{
return pointsAlpha_;
}
inline const Foam::vectorField& Foam::MPLICcellStorage::pointsU() const
{
return pointsU_;
}
inline Foam::scalar Foam::MPLICcellStorage::cellAlpha() const
{
return cellAlpha_;
}
inline const Foam::vector& Foam::MPLICcellStorage::cellU() const
{
return celllU_;
}
inline Foam::scalar Foam::MPLICcellStorage::V() const
{
return volume_;
}
inline const Foam::vector& Foam::MPLICcellStorage::C() const
{
return centre_;
}
inline const Foam::UIndirectList<Foam::vector>&
Foam::MPLICcellStorage::Sf() const
{
return Sf_;
}
inline const Foam::UIndirectList<Foam::vector>&
Foam::MPLICcellStorage::Cf() const
{
return Cf_;
}
inline const Foam::UIndirectList<Foam::scalar>&
Foam::MPLICcellStorage::magSf() const
{
return magSf_;
}
inline Foam::scalar Foam::MPLICcellStorage::cellAlphaMax() const
{
return cellAlphaMax_;
}
inline Foam::scalar Foam::MPLICcellStorage::cellAlphaMin() const
{
return cellAlphaMin_;
}
inline const Foam::scalarField& Foam::MPLICcellStorage::facesAlphaMin() const
{
return facesAlphaMin_;
}
inline const Foam::scalarField& Foam::MPLICcellStorage::facesAlphaMax() const
{
return facesAlphaMax_;
}
inline Foam::label Foam::MPLICcellStorage::size() const
{
return cFaces_.size();
}
// ************************************************************************* //

View File

@ -0,0 +1,279 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "MPLICface.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::MPLICface::MPLICface(const bool unweighted)
:
unweighted_(unweighted)
{};
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::label Foam::MPLICface::cutFace
(
const labelList& f,
const labelList& faceEdges,
const pointField& points,
const boolList& isEdgeCutOld,
boolList& isEdgeCut,
label& faceEdgei,
const UList<scalar>& pointsAlpha,
const UList<vector>& pointsU,
const label facei,
const scalar target,
const bool ow
)
{
// Clear all the storage
cutPoints_.clear();
subPoints_.clear();
cutEdges_.clear();
subPointsU_.clear();
// Direction of face circulators
flipped_ = false;
label fp;
if (faceEdgei == -1)
{
const UIndirectList<scalar> fAlphas(pointsAlpha, f);
// Starting from this point on the face
fp = findMin(fAlphas);
flipped_ = ow ? false : true;
}
else
{
// Finding first index of the edge in the face point list
const label startPoint = faceEdgei;
// Pick up starting point and decide direction of circulators
const label fwd = f.fcIndex(startPoint);
const label back = f.rcIndex(startPoint);
const label lEdgeP = f[fwd] == f[f.fcIndex(faceEdgei)] ? fwd : back;
// Starting from this point on the face
fp = pointsAlpha[f[startPoint]] < pointsAlpha[f[lEdgeP]]
? startPoint : lEdgeP;
if
(
!(
(
lEdgeP == fwd
&& pointsAlpha[f[startPoint]] < pointsAlpha[f[lEdgeP]]
)
|| (
lEdgeP == back
&& pointsAlpha[f[startPoint]] > pointsAlpha[f[lEdgeP]]
)
)
)
{
flipped_ = true;
}
}
label nextFp, edgei;
if (flipped_)
{
nextFp = f.rcIndex(fp);
edgei = nextFp;
}
else
{
nextFp = f.fcIndex(fp);
edgei = fp;
}
forAll(f, i)
{
// Edge points field value
const scalar& fl = pointsAlpha[f[fp]];
const scalar& fk = pointsAlpha[f[nextFp]];
const point& pL = points[f[fp]];
const point& pK = points[f[nextFp]];
const label edg = faceEdges[edgei];
// Collect sub-point if the iso-value is bigger than target value
if (fl >= target && cutPoints_.size() > 0)
{
subPoints_.append(pL);
if (!unweighted_)
{
subPointsU_.append(pointsU[f[fp]]);
}
}
// Cut the edge
if
(
!isEdgeCutOld[edg]
&& ((fl < target && fk >= target) || (fl >= target && fk < target))
)
{
const scalar coeff = (target - fk)/(fl - fk);
const point cut = pK + coeff*(pL - pK);
if (!unweighted_)
{
subPointsU_.append
(
pointsU[f[nextFp]]
+ coeff*(pointsU[f[fp]] - pointsU[f[nextFp]])
);
}
cutPoints_.append(cut);
subPoints_.append(cut);
cutEdges_.append(edg);
isEdgeCut[edg] = true;
}
// Termination control
if (cutPoints_.size() == 2)
{
faceEdgei = edgei;
return 1;
}
if (flipped_)
{
fp = f.rcIndex(fp);
nextFp = f.rcIndex(fp);
edgei = nextFp;
}
else
{
fp = f.fcIndex(fp);
nextFp = f.fcIndex(fp);
edgei = fp;
}
}
return 0;
}
Foam::label Foam::MPLICface::cutFace
(
const UList<label>& f,
const UList<point>& points,
const UList<scalar>& pointsAlpha,
const UList<vector>& pointsU,
const scalar target,
const bool ow
)
{
// Clear all the storage
cutPoints_.clear();
subPoints_.clear();
subPointsU_.clear();
// Direction of face circulators
flipped_ = ow ? false : true;
const UIndirectList<scalar> fAlphas(pointsAlpha, f);
// Starting from point with minimum alpha value
label fp = findMin(fAlphas);
// Second point index
label nextFp = flipped_ ? f.rcIndex(fp) : f.fcIndex(fp);
forAll(f, i)
{
// Edge points field value
const scalar& fl = pointsAlpha[f[fp]];
const scalar& fk = pointsAlpha[f[nextFp]];
const point& pL = points[f[fp]];
const point& pK = points[f[nextFp]];
// Collect sub-point if the iso-value is bigger than target value
if (fl >= target && cutPoints_.size() > 0)
{
subPoints_.append(pL);
if (!unweighted_)
{
subPointsU_.append(pointsU[f[fp]]);
}
}
// Cut the edge
if ((fl < target && fk >= target) || (fl >= target && fk < target))
{
const scalar coeff = (target - fk)/(fl - fk);
const point cut = pK + coeff*(pL - pK);
if (!unweighted_)
{
subPointsU_.append
(
pointsU[f[nextFp]]
+ coeff*(pointsU[f[fp]] - pointsU[f[nextFp]])
);
}
cutPoints_.append(cut);
subPoints_.append(cut);
}
if (flipped_)
{
fp = f.rcIndex(fp);
nextFp = f.rcIndex(fp);
}
else
{
fp = f.fcIndex(fp);
nextFp = f.fcIndex(fp);
}
}
// Simple cut
if (cutPoints_.size() == 2)
{
return 1;
}
// Multiple cuts through the face
else if (cutPoints_.size() > 2)
{
return -1;
}
// No cut
else
{
return 0;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,176 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::MPLICface
Description
Class that deals with cutting faces based on face point values and target
value.
SourceFiles
MPLICface.C
\*---------------------------------------------------------------------------*/
#ifndef MPLICface_H
#define MPLICface_H
#include "face.H"
#include "pointField.H"
#include "DynamicList.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class MPLICface Declaration
\*---------------------------------------------------------------------------*/
class MPLICface
{
// Private Member variables
//- Store all the cut points
DynamicList<point> cutPoints_;
//- Store points of sub face
DynamicList<point> subPoints_;
//- Labels of cut edges
DynamicList<label> cutEdges_;
//- Store velocity point values
DynamicList<vector> subPointsU_;
//- Keep truck of face orientation
bool flipped_;
//- Select unweighted interpolation if true
// velocity flux corrected if false
const bool unweighted_;
public:
// Constructors
//- Construct empty
MPLICface(const bool unweighted = true);
// - Destructor
~MPLICface()
{}
// Member functions
//- Function to cut for multi cut
// Returns:
// - 0: no cut
// - 1: cut
label cutFace
(
const labelList& f,
const labelList& faceEdges,
const pointField& points,
const boolList& isEdgeCutOld,
boolList& isEdgeCut,
label& faceEdgei,
const UList<scalar>& pointsAlpha,
const UList<vector>& pointsU,
const label facei,
const scalar target,
const bool ow
);
//- Cut the face and return the type of cut
// Returns:
// - -1: multi cut
// - 0: no cut
// - +1: single cut
label cutFace
(
const UList<label>& f,
const UList<point>& points,
const UList<scalar>& pointsAlpha,
const UList<vector>& pointsU,
const scalar target,
const bool ow
);
//- Calculate and return alphaPhiU
inline scalar alphaPhiU() const;
//- Calculate and return alphaPhiU
template<class VectorList, class PointList>
inline scalar alphaPhiU
(
const VectorList& pointsU,
const PointList& points
) const;
//- Calculate and return alphaPhiU
template<class VectorList, class PointList>
inline scalar alphaPhiU
(
const VectorList& pointsU,
const PointList& points,
const labelList& f
) const;
//- Access to cut points
inline const DynamicList<point>& cutPoints() const;
//- Access to submerged face points
inline const DynamicList<point>& subPoints() const;
//- Access to cut edges
inline const DynamicList<label>& cutEdges() const;
//- Return subface surface area vector
inline const vector Sf() const;
//- Return subface centre
inline const vector Cf(const vector& area) const;
//- Return interpolated U values
inline const DynamicList<vector>& U() const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "MPLICfaceI.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,178 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "MPLICface.H"
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::scalar Foam::MPLICface::alphaPhiU() const
{
if (flipped_)
{
return -alphaPhiU(subPointsU_, subPoints_);
}
else
{
return alphaPhiU(subPointsU_, subPoints_);
}
}
template<class VectorList, class PointList>
inline Foam::scalar Foam::MPLICface::alphaPhiU
(
const VectorList& pointsU,
const PointList& points
) const
{
const point& baseP = points[0];
const vector& baseU = pointsU[0];
scalar alphaPhiU = 0;
for(label i=1; i < points.size()-1; ++i)
{
// 1/2 Triangle area
const vector area = (points[i] - baseP) ^ (points[i + 1] - baseP);
// Calculate face area weighted velocity field
// Average is missing 1/3 and area 1/2
alphaPhiU += (baseU + pointsU[i] + pointsU[i + 1]) & area;
}
alphaPhiU /= 6.0;
return alphaPhiU;
}
template<class VectorList, class PointList>
inline Foam::scalar Foam::MPLICface::alphaPhiU
(
const VectorList& pointsU,
const PointList& points,
const labelList& f
) const
{
const point& baseP = points[f[0]];
const vector& baseU = pointsU[f[0]];
scalar alphaPhiU = 0;
for(label i=1; i < f.size()-1; ++i)
{
// 1/2 Triangle area
const vector area = (points[f[i]] - baseP) ^ (points[f[i + 1]] - baseP);
// Calculate face area weighted velocity field
// Average is missing 1/3 and area 1/2
alphaPhiU += (baseU + pointsU[f[i]] + pointsU[f[i + 1]]) & area;
}
alphaPhiU /= 6.0;
return alphaPhiU;
}
inline const Foam::DynamicList<Foam::point>& Foam::MPLICface::cutPoints() const
{
return cutPoints_;
}
inline const Foam::DynamicList<Foam::point>&
Foam::MPLICface::subPoints() const
{
return subPoints_;
}
inline const Foam::DynamicList<Foam::label>& Foam::MPLICface::cutEdges() const
{
return cutEdges_;
}
inline const Foam::vector Foam::MPLICface::Sf() const
{
return face::area(subPoints_);
}
inline const Foam::vector Foam::MPLICface::Cf
(
const vector& area
) const
{
// If the face is a triangle, do a direct calculation
if (subPoints_.size() == 3)
{
return (1.0/3.0)*(subPoints_[0] + subPoints_[1] + subPoints_[2]);
}
// For more complex faces, decompose into triangles ...
// Compute an estimate of the centre as the average of the points
point pAvg = Zero;
forAll(subPoints_, pi)
{
pAvg += subPoints_[pi];
}
pAvg /= subPoints_.size();
const vector sumAHat = normalised(area);
// Compute the area-weighted sum of the triangle centres. Note use
// the triangle area projected in the direction of the face normal
// as the weight, *not* the triangle area magnitude. Only the
// former makes the calculation independent of the initial estimate.
scalar sumAn = 0;
vector sumAnc = Zero;
forAll(subPoints_, pi)
{
const point& p = subPoints_[pi];
const point& pNext = subPoints_[subPoints_.fcIndex(pi)];
const vector a = (pNext - p)^(pAvg - p);
const vector c = p + pNext + pAvg;
const scalar an = a & sumAHat;
sumAn += an;
sumAnc += an*c;
}
// Complete calculating centres and areas. If the face is too small
// for the sums to be reliably divided then just set the centre to
// the initial estimate.
if (sumAn > vSmall)
{
return (1.0/3.0)*sumAnc/sumAn;
}
else
{
return pAvg;
}
}
// ************************************************************************* //

View File

@ -1,4 +1,14 @@
twoPhaseMixture/twoPhaseMixture.C
interfaceCompression/interfaceCompression.C
MPLIC/MPLICface.C
MPLIC/MPLICcellStorage.C
MPLIC/MPLICcell.C
MPLIC/MPLIC.C
MPLIC/MPLICU.C
PLIC/PLIC.C
PLIC/PLICU.C
LIB = $(FOAM_LIBBIN)/libtwoPhaseMixture

View File

@ -0,0 +1,68 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "PLIC.H"
#include "slicedSurfaceFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(PLIC, 0);
surfaceInterpolationScheme<scalar>::addMeshFluxConstructorToTable<PLIC>
addPLICScalarMeshFluxConstructorToTable_;
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::tmp<Foam::surfaceScalarField> Foam::PLIC::interpolate
(
const volScalarField& vf
) const
{
tmp<surfaceScalarField> tvff(tScheme_().interpolate(vf));
scalarField spicedTvff
(
slicedSurfaceScalarField
(
IOobject
(
"spicedTvff",
vf.mesh().time().timeName(),
vf.mesh()
),
tvff.ref(),
false
).splice()
);
return surfaceAlpha(vf, phi_, spicedTvff, true, 1e-6, false);
}
// ************************************************************************* //

View File

@ -0,0 +1,142 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::PLIC
Description
Piecewise-Linear Interface Calculation (PLIC) corrected scheme is a surface
interpolation scheme for flux calculation in advection of a bounded
variable, e.g. phase fraction and for interface capturing in the volume of
fluid (VoF) method.
The interface is represented by single cuts which split each cell to match
the volume fraction of the phase in the cell. The cut planes are oriented
according to the point field of the local phase fraction. The phase
fraction at each cell face - the interpolated value - is then calculated
from the face area on either side of the cut. For cases where the
single-cut does not accurately represent the cell volume fraction the
specified default scheme is used, e.g. interfaceCompression.
Example:
\verbatim
divSchemes
{
.
.
div(phi,alpha) Gauss PLIC interfaceCompression vanLeer 1;
.
.
}
\endverbatim
See also
Foam::PLICU
Foam::MPLIC
Foam::MPLICU
Foam::interfaceCompression
SourceFiles
PLIC.C
\*---------------------------------------------------------------------------*/
#ifndef PLIC_H
#define PLIC_H
#include "MPLIC.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class PLIC Declaration
\*---------------------------------------------------------------------------*/
class PLIC
:
public MPLIC
{
protected:
// Protected member data
const surfaceScalarField& phi_;
//- Base scheme to which the compression is applied
tmp<surfaceInterpolationScheme<scalar>> tScheme_;
public:
//- Runtime type information
TypeName("PLIC");
// Constructors
//- Construct from faceFlux and Istream
PLIC
(
const fvMesh& mesh,
const surfaceScalarField& faceFlux,
Istream& is
)
:
MPLIC(mesh, faceFlux, is),
phi_(faceFlux),
tScheme_
(
surfaceInterpolationScheme<scalar>::New(mesh, faceFlux, is)
)
{}
// Member Functions
//- Return the face-interpolate of the given cell field
virtual tmp<surfaceScalarField> interpolate
(
const volScalarField& vf
) const;
// Member Operators
//- Disallow default bitwise assignment
void operator=(const PLIC&) = delete;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,68 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "PLICU.H"
#include "slicedSurfaceFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(PLICU, 0);
surfaceInterpolationScheme<scalar>::addMeshFluxConstructorToTable<PLICU>
addPLICUScalarMeshFluxConstructorToTable_;
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::tmp<Foam::surfaceScalarField> Foam::PLICU::interpolate
(
const volScalarField& vf
) const
{
tmp<surfaceScalarField> tvff(tScheme_().interpolate(vf));
scalarField spicedTvff
(
slicedSurfaceScalarField
(
IOobject
(
"spicedTvff",
vf.mesh().time().timeName(),
vf.mesh()
),
tvff.ref(),
false
).splice()
);
return surfaceAlpha(vf, phi_, spicedTvff, false, 1e-6, false);
}
// ************************************************************************* //

View File

@ -0,0 +1,130 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::PLICU
Description
Velocity-weighted Piecewise-Linear Interface Calculation (PLICU) corrected
scheme is a surface interpolation scheme for flux calculation in advection
of a bounded variable, e.g. phase fraction and for interface capturing in
the volume of fluid (VoF) method.
The interface is represented by single cuts which split each cell to match
the volume fraction of the phase in the cell. The cut planes are oriented
according to the point field of the local phase fraction. The phase
fraction at each cell face - the interpolated value - is then calculated
from the face area on either side of the cut. For cases where the
single-cut does not accurately represent the cell volume fraction the
specified default scheme is used, e.g. interfaceCompression.
Additionally the face point velocity values are used to calculate the face
flux which is likely to be more accurate in the presence of high shear.
Example:
\verbatim
divSchemes
{
.
.
div(phi,alpha) Gauss PLICU interfaceCompression vanLeer 1;
.
.
}
\endverbatim
See also
Foam::PLIC
Foam::MPLIC
Foam::MPLICU
Foam::interfaceCompression
SourceFiles
PLICU.C
\*---------------------------------------------------------------------------*/
#ifndef PLICU_H
#define PLICU_H
#include "PLIC.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class PLIC Declaration
\*---------------------------------------------------------------------------*/
class PLICU
:
public PLIC
{
public:
//- Runtime type information
TypeName("PLICU");
// Constructors
//- Construct from faceFlux and Istream
PLICU
(
const fvMesh& mesh,
const surfaceScalarField& faceFlux,
Istream& is
)
:
PLIC(mesh, faceFlux, is)
{}
// Member Functions
//- Return the face-interpolate of the given cell field
virtual tmp<surfaceScalarField> interpolate
(
const volScalarField& vf
) const;
// Member Operators
//- Disallow default bitwise assignment
void operator=(const PLICU&) = delete;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,58 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volVectorField;
location "0";
object U;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
UMean 4.598;
dimensions [0 1 -1 0 0 0 0];
internalField uniform (#neg $UMean 0 0);
boundaryField
{
//- Set patchGroups for constraint patches
#includeEtc "caseDicts/setConstraintTypes"
inlet
{
type fixedValue;
value $internalField;
}
outlet
{
type outletPhaseMeanVelocity;
alpha alpha.water;
UnMean $UMean;
value $internalField;
}
atmosphere
{
type pressureInletOutletVelocity;
tangentialVelocity $internalField;
value uniform (0 0 0);
}
hull
{
type movingWallVelocity;
value uniform (0 0 0);
}
}
// ************************************************************************* //

View File

@ -0,0 +1,54 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
location "0";
object alpha;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 0 0 0 0 0 0];
internalField uniform 0;
boundaryField
{
//- Set patchGroups for constraint patches
#includeEtc "caseDicts/setConstraintTypes"
inlet
{
type fixedValue;
value $internalField;
}
outlet
{
type variableHeightFlowRate;
lowerBound 0;
upperBound 1;
value $internalField;
}
atmosphere
{
type inletOutlet;
inletValue $internalField;
value $internalField;
}
hull
{
type interfaceCompression;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,54 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
location "0";
object k;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -2 0 0 0 0];
internalField uniform 0.0005;
boundaryField
{
//- Set patchGroups for constraint patches
#includeEtc "caseDicts/setConstraintTypes"
inlet
{
type fixedValue;
value $internalField;
}
outlet
{
type inletOutlet;
inletValue $internalField;
value $internalField;
}
atmosphere
{
type inletOutlet;
inletValue $internalField;
value $internalField;
}
hull
{
type kqRWallFunction;
value $internalField;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,53 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
location "0";
object nut;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -1 0 0 0 0];
internalField uniform 5e-07;
boundaryField
{
//- Set patchGroups for constraint patches
#includeEtc "caseDicts/setConstraintTypes"
inlet
{
type fixedValue;
value $internalField;
}
outlet
{
type zeroGradient;
}
atmosphere
{
type zeroGradient;
}
hull
{
type nutkRoughWallFunction;
Ks uniform 100e-6;
Cs uniform 0.5;
value $internalField;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,56 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
location "0";
object omega;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 0 -1 0 0 0 0];
internalField uniform 240;
boundaryField
{
//- Set patchGroups for constraint patches
#includeEtc "caseDicts/setConstraintTypes"
inlet
{
type fixedValue;
value $internalField;
}
outlet
{
type inletOutlet;
inletValue $internalField;
value $internalField;
}
atmosphere
{
type inletOutlet;
inletValue $internalField;
value $internalField;
}
hull
{
type omegaWallFunction;
value $internalField;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,51 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
location "0";
object p_rgh;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [1 -1 -2 0 0 0 0];
internalField uniform 0;
boundaryField
{
//- Set patchGroups for constraint patches
#includeEtc "caseDicts/setConstraintTypes"
inlet
{
type fixedFluxPressure;
value $internalField;
}
outlet
{
type zeroGradient;
}
atmosphere
{
type prghEntrainmentPressure;
p0 uniform 0;
}
hull
{
type fixedFluxPressure;
value $internalField;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,52 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class pointVectorField;
location "0";
object pointDisplacement;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 1 0 0 0 0 0];
internalField uniform (0 0 0);
boundaryField
{
//- Set patchGroups for constraint patches
#includeEtc "caseDicts/setConstraintTypes"
inlet
{
type fixedValue;
value uniform (0 0 0);
}
outlet
{
type fixedValue;
value uniform (0 0 0);
}
atmosphere
{
type fixedValue;
value uniform (0 0 0);
}
hull
{
type calculated;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,15 @@
#!/bin/sh
cd ${0%/*} || exit 1 # Run from this directory
# Source tutorial clean functions
. $WM_PROJECT_DIR/bin/tools/CleanFunctions
# Remove surface
rm -rf constant/extendedFeatureEdgeMesh > /dev/null 2>&1
rm -f constant/triSurface/w3.eMesh > /dev/null 2>&1
rm -f constant/triSurface/w3.stl > /dev/null 2>&1
rm -rf sequencedVTK > /dev/null 2>&1
cleanCase
#------------------------------------------------------------------------------

View File

@ -0,0 +1,29 @@
#!/bin/sh
cd ${0%/*} || exit 1 # Run from this directory
# Source tutorial run functions
. $WM_PROJECT_DIR/bin/tools/RunFunctions
runApplication surfaceTransformPoints -translate '(-0.586 0 -0.156)' \
constant/triSurface/w3_orig.stl constant/triSurface/w3.stl
runApplication -a surfaceTransformPoints -rollPitchYaw '(0 -3.485 0)' \
constant/triSurface/w3.stl constant/triSurface/w3.stl
runApplication -a surfaceTransformPoints -translate '(0.586 0 0.156)' \
constant/triSurface/w3.stl constant/triSurface/w3.stl
runApplication surfaceFeatures
runApplication blockMesh -dict system/blockMeshDict.1
for i in 1 2 3 4 5 6 7
do
runApplication -a foamDictionary system/refineMeshDict -entry set -set c${i}
runApplication -a topoSet -dict system/topoSetDict.1
runApplication -a refineMesh -dict system/refineMeshDict -overwrite
done
runApplication snappyHexMesh -dict system/snappyHexMeshDict.1 -overwrite
runApplication renumberMesh -noFields -overwrite
#------------------------------------------------------------------------------

View File

@ -0,0 +1,29 @@
#!/bin/sh
cd ${0%/*} || exit 1 # Run from this directory
# Source tutorial run functions
. $WM_PROJECT_DIR/bin/tools/RunFunctions
runApplication surfaceTransformPoints -translate '(-0.586 0 -0.156)' \
constant/triSurface/w3_orig.stl constant/triSurface/w3.stl
runApplication -a surfaceTransformPoints -rollPitchYaw '(0 -3.485 0)' \
constant/triSurface/w3.stl constant/triSurface/w3.stl
runApplication -a surfaceTransformPoints -translate '(0.586 0 0.156)' \
constant/triSurface/w3.stl constant/triSurface/w3.stl
runApplication surfaceFeatures
runApplication blockMesh -dict system/blockMeshDict.2
for i in 1 2 3 4
do
runApplication -a foamDictionary system/refineMeshDict -entry set -set c${i}
runApplication -a topoSet -dict system/topoSetDict.2
runApplication -a refineMesh -dict system/refineMeshDict -overwrite
done
runApplication snappyHexMesh -dict system/snappyHexMeshDict.2 -overwrite
runApplication renumberMesh -noFields -overwrite
#------------------------------------------------------------------------------

View File

@ -0,0 +1,75 @@
#!/bin/sh
usage () {
exec 1>&2
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
cat <<USAGE
Usage: ${0##*/} [OPTIONS]
Options:
-i | -interface no refinment in vertical direction of the mesh
-l | -local mesh with local refinment
-h | -help help
Ship hull simulation to demonstrate two different meshing strategies that can be
used with PLIC type schemes.
USAGE
exit 1
}
meshType=0
# OPTIONS
while [ "$#" -gt 0 ]
do
case "$1" in
-i | -interface)
meshType=1
break
;;
-l | -local)
meshType=2
break
;;
-h | -help)
usage
;;
-*)
usage "Invalid option '$1'"
;;
*)
usage "Invalid option '$1'"
break
;;
esac
done
# Run from this directory
cd "${0%/*}" || exit 1
# Source tutorial run functions
. "$WM_PROJECT_DIR/bin/tools/RunFunctions"
if [ $meshType -eq 0 ] || [ $meshType -eq 1 ]; then
{
./Allmesh.1
}
elif [$meshType -eq 2 ]; then
{
./Allmesh.2
}
fi
runApplication setFields
runApplication decomposePar
runParallel $(getApplication)
runApplication reconstructPar
runApplication foamSequenceVTKFiles
#------------------------------------------------------------------------------

View File

@ -0,0 +1,49 @@
Overview
========
+ W3 example case of hydrodynamics of a planing hull
Mesh
====
+ The example includes two different approaches for meshing the case
+ The first approach uses no cell refinement in the vertical direction
+ The second approach includes local cell refinement, producing a smaller mesh
+ Cell refinement can cause disturbances of the interface
+ Where refinement is present, PLIC-based schemes perform much better,
producing far less interface disturbance than the standard interface
compression scheme.
+ The first approach has the advantage of avoiding interface disturbances but
for the potential cost of a larger mesh than with local refinement
Experimental results (ref. 1)
=============================
+ Velocity = 4.598 m/s
+ Trim angle = 3.485 deg
+ Drag = 50.691 N
Numerical results mesh 1
========================
Without local refinement
+ Velocity = 4.598 m/s
+ Trim angle = 2.794 deg
+ Drag = 48.616 N
Numerical results mesh 2
========================
With local refinement
+ Velocity = 4.598 m/s
+ Trim angle = 3.027 deg
+ Drag = 47.987 N
Acknowledgment
==============
+ Thanks to Raffaele Ponzini, Ph.D. Eng. from CINECA, for kindly sharing the
W3 hull geometry and for his valuable insight into the science of ship hulls
References
==========
1. Begovic, E. and Bertorello, C., 2012. Resistance assessment of warped
hullform. Ocean Engineering, 56, pp.28-42
2. Ponzini, R., Salvadore, F., Begovic, E. and Bertorello, C., 2020.
Automatic CFD Analysis Of Planing Hulls By Means Of A New Web-Based Application:
Usage, Experimental Data Comparison And Opportunities

View File

@ -0,0 +1,70 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object dynamicMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dynamicFvMesh dynamicMotionSolverFvMesh;
motionSolverLibs ("librigidBodyMeshMotion.so");
motionSolver rigidBodyMotion;
report on;
solver
{
type Newmark;
}
accelerationRelaxation 0.4;
bodies
{
hull
{
type rigidBody;
parent root;
centreOfMass (0 0 0);
mass 16.146;
inertia (0.4 0 0 5 0 5);
transform (
0.9981507467 0 0.06078722637
0 1 0
-0.06078722637 0 0.9981507467
)
(0.586 0 0.156);
joint
{
type composite;
joints
(
{
type Pz;
}
{
type Ry;
}
);
}
patches (hull);
innerDistance 0.02;
outerDistance 0.6;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,21 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class uniformDimensionedVectorField;
location "constant";
object g;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 1 -2 0 0 0 0];
value (0 0 -9.81);
// ************************************************************************* //

View File

@ -0,0 +1,30 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "constant";
object momentumTransport;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
simulationType RAS;
RAS
{
model kOmegaSST;
turbulence on;
printCoeffs on;
}
// ************************************************************************* //

View File

@ -0,0 +1,36 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "constant";
object transportProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
phases (water air);
water
{
transportModel Newtonian;
nu 1.09e-06;
rho 997.0;
}
air
{
transportModel Newtonian;
nu 1.48e-05;
rho 1;
}
sigma 0;
// ************************************************************************* //

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,221 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#inputSyntax slash;
backgroundMesh
{
xMin -14;
xMax 6;
yMin -5;
yMax 0;
zMin -7;
zMid1 -2.4;
zMid2 -0.6;
zMid3 -0.05;
zMid4 0.1;
zMid5 0.4;
zMax 3;
xCells 20;
yCells 4;
zCells1 10;
zCells2 8;
zCells3 32;
zCells4 48;
zCells5 40;
zCells6 8;
}
convertToMeters 1;
vertices
(
($!backgroundMesh/xMin $!backgroundMesh/yMin $!backgroundMesh/zMin) // 0
($!backgroundMesh/xMax $!backgroundMesh/yMin $!backgroundMesh/zMin) // 1
($!backgroundMesh/xMax $!backgroundMesh/yMax $!backgroundMesh/zMin) // 2
($!backgroundMesh/xMin $!backgroundMesh/yMax $!backgroundMesh/zMin) // 3
($!backgroundMesh/xMin $!backgroundMesh/yMin $!backgroundMesh/zMid1) // 4
($!backgroundMesh/xMax $!backgroundMesh/yMin $!backgroundMesh/zMid1) // 5
($!backgroundMesh/xMax $!backgroundMesh/yMax $!backgroundMesh/zMid1) // 6
($!backgroundMesh/xMin $!backgroundMesh/yMax $!backgroundMesh/zMid1) // 7
($!backgroundMesh/xMin $!backgroundMesh/yMin $!backgroundMesh/zMid2) // 8
($!backgroundMesh/xMax $!backgroundMesh/yMin $!backgroundMesh/zMid2) // 9
($!backgroundMesh/xMax $!backgroundMesh/yMax $!backgroundMesh/zMid2) // 10
($!backgroundMesh/xMin $!backgroundMesh/yMax $!backgroundMesh/zMid2) // 11
($!backgroundMesh/xMin $!backgroundMesh/yMin $!backgroundMesh/zMid3) // 12
($!backgroundMesh/xMax $!backgroundMesh/yMin $!backgroundMesh/zMid3) // 13
($!backgroundMesh/xMax $!backgroundMesh/yMax $!backgroundMesh/zMid3) // 14
($!backgroundMesh/xMin $!backgroundMesh/yMax $!backgroundMesh/zMid3) // 15
($!backgroundMesh/xMin $!backgroundMesh/yMin $!backgroundMesh/zMid4) // 16
($!backgroundMesh/xMax $!backgroundMesh/yMin $!backgroundMesh/zMid4) // 17
($!backgroundMesh/xMax $!backgroundMesh/yMax $!backgroundMesh/zMid4) // 18
($!backgroundMesh/xMin $!backgroundMesh/yMax $!backgroundMesh/zMid4) // 19
($!backgroundMesh/xMin $!backgroundMesh/yMin $!backgroundMesh/zMid5) // 20
($!backgroundMesh/xMax $!backgroundMesh/yMin $!backgroundMesh/zMid5) // 21
($!backgroundMesh/xMax $!backgroundMesh/yMax $!backgroundMesh/zMid5) // 22
($!backgroundMesh/xMin $!backgroundMesh/yMax $!backgroundMesh/zMid5) // 23
($!backgroundMesh/xMin $!backgroundMesh/yMin $!backgroundMesh/zMax) // 24
($!backgroundMesh/xMax $!backgroundMesh/yMin $!backgroundMesh/zMax) // 25
($!backgroundMesh/xMax $!backgroundMesh/yMax $!backgroundMesh/zMax) // 26
($!backgroundMesh/xMin $!backgroundMesh/yMax $!backgroundMesh/zMax) // 27
);
blocks
(
// Block 1
hex (0 1 2 3 4 5 6 7)
(
$!backgroundMesh/xCells
$!backgroundMesh/yCells
$!backgroundMesh/zCells1
)
simpleGrading (1 0.5 0.2)
// Block 2
hex (4 5 6 7 8 9 10 11)
(
$!backgroundMesh/xCells
$!backgroundMesh/yCells
$!backgroundMesh/zCells2
)
simpleGrading (1 0.5 1)
// Block 3
hex (8 9 10 11 12 13 14 15)
(
$!backgroundMesh/xCells
$!backgroundMesh/yCells
$!backgroundMesh/zCells3
)
simpleGrading (1 0.5 0.1)
// Block 4
hex (12 13 14 15 16 17 18 19)
(
$!backgroundMesh/xCells
$!backgroundMesh/yCells
$!backgroundMesh/zCells4
)
simpleGrading (1 0.5 1)
// Block 5
hex (16 17 18 19 20 21 22 23)
(
$!backgroundMesh/xCells
$!backgroundMesh/yCells
$!backgroundMesh/zCells5
)
simpleGrading (1 0.5 2)
// Block 6
hex (20 21 22 23 24 25 26 27)
(
$!backgroundMesh/xCells
$!backgroundMesh/yCells
$!backgroundMesh/zCells6
)
simpleGrading (1 0.5 20)
);
edges
(
);
boundary
(
atmosphere
{
type patch;
faces
(
(24 25 26 27)
);
}
inlet
{
type patch;
faces
(
(1 2 6 5)
(5 6 10 9)
(9 10 14 13)
(13 14 18 17)
(17 18 22 21)
(21 22 26 25)
);
}
outlet
{
type patch;
faces
(
(0 4 7 3)
(4 8 11 7)
(8 12 15 11)
(12 16 19 15)
(16 20 23 19)
(20 24 27 23)
);
}
bottom
{
type symmetryPlane;
faces
(
(0 3 2 1)
);
}
side
{
type symmetryPlane;
faces
(
(0 1 5 4)
(4 5 9 8)
(8 9 13 12)
(12 13 17 16)
(16 17 21 20)
(20 21 25 24)
);
}
midPlane
{
type symmetryPlane;
faces
(
(3 7 6 2)
(7 11 10 6)
(11 15 14 10)
(15 19 18 14)
(19 23 22 18)
(23 27 26 22)
);
}
);
mergePatchPairs
(
);
// ************************************************************************* //

View File

@ -0,0 +1,166 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#inputSyntax slash;
backgroundMesh
{
xMin -14.16;
xMax 6.0;
yMin -4.8;
yMax 0.0;
zMin -6.6;
zMid1 -0.36;
zMid2 0.6;
zMax 3.0;
xCells 21;
yCells 5;
zCells1 20;
zCells2 16;
zCells3 12;
}
convertToMeters 1;
vertices
(
($!backgroundMesh/xMin $!backgroundMesh/yMin $!backgroundMesh/zMin) // 0
($!backgroundMesh/xMax $!backgroundMesh/yMin $!backgroundMesh/zMin) // 1
($!backgroundMesh/xMax $!backgroundMesh/yMax $!backgroundMesh/zMin) // 2
($!backgroundMesh/xMin $!backgroundMesh/yMax $!backgroundMesh/zMin) // 3
($!backgroundMesh/xMin $!backgroundMesh/yMin $!backgroundMesh/zMid1) // 4
($!backgroundMesh/xMax $!backgroundMesh/yMin $!backgroundMesh/zMid1) // 5
($!backgroundMesh/xMax $!backgroundMesh/yMax $!backgroundMesh/zMid1) // 6
($!backgroundMesh/xMin $!backgroundMesh/yMax $!backgroundMesh/zMid1) // 7
($!backgroundMesh/xMin $!backgroundMesh/yMin $!backgroundMesh/zMid2) // 8
($!backgroundMesh/xMax $!backgroundMesh/yMin $!backgroundMesh/zMid2) // 9
($!backgroundMesh/xMax $!backgroundMesh/yMax $!backgroundMesh/zMid2) // 10
($!backgroundMesh/xMin $!backgroundMesh/yMax $!backgroundMesh/zMid2) // 11
($!backgroundMesh/xMin $!backgroundMesh/yMin $!backgroundMesh/zMax) // 12
($!backgroundMesh/xMax $!backgroundMesh/yMin $!backgroundMesh/zMax) // 13
($!backgroundMesh/xMax $!backgroundMesh/yMax $!backgroundMesh/zMax) // 14
($!backgroundMesh/xMin $!backgroundMesh/yMax $!backgroundMesh/zMax) // 15
);
blocks
(
// Block 1
hex (0 1 2 3 4 5 6 7)
(
$!backgroundMesh/xCells
$!backgroundMesh/yCells
$!backgroundMesh/zCells1
)
simpleGrading (1 1 0.1)
// Block 2
hex (4 5 6 7 8 9 10 11)
(
$!backgroundMesh/xCells
$!backgroundMesh/yCells
$!backgroundMesh/zCells2
)
simpleGrading (1 1 1)
// Block 3
hex (8 9 10 11 12 13 14 15)
(
$!backgroundMesh/xCells
$!backgroundMesh/yCells
$!backgroundMesh/zCells3
)
simpleGrading (1 1 10)
);
edges
(
);
boundary
(
atmosphere
{
type patch;
faces
(
(12 13 14 15)
);
}
inlet
{
type patch;
faces
(
(1 2 6 5)
(5 6 10 9)
(9 10 14 13)
);
}
outlet
{
type patch;
faces
(
(0 4 7 3)
(4 8 11 7)
(8 12 15 11)
);
}
bottom
{
type symmetryPlane;
faces
(
(0 3 2 1)
);
}
side
{
type symmetryPlane;
faces
(
(0 1 5 4)
(4 5 9 8)
(8 9 13 12)
);
}
midPlane
{
type symmetryPlane;
faces
(
(3 7 6 2)
(7 11 10 6)
(11 15 14 10)
);
}
);
mergePatchPairs
(
);
// ************************************************************************* //

View File

@ -0,0 +1,78 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
application interFoam;
startFrom latestTime;
startTime 0;
stopAt endTime;
endTime 5;
deltaT 1e-4;
writeControl adjustableRunTime;
writeInterval 1.0;
purgeWrite 0;
writeFormat binary;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable yes;
adjustTimeStep yes;
maxCo 5;
maxAlphaCo 5;
maxDeltaT 0.002;
functions
{
forces
{
type forces;
libs ("libforces.so");
patches (hull);
rhoInf 997.0;
log on;
writeControl timeStep;
writeInterval 1;
CofR (0 0 0);
}
rigidBodyState
{
type rigidBodyState;
libs ("librigidBodyState.so");
angleFormat degrees;
}
#includeFunc surfaces
}
// ************************************************************************* //

View File

@ -0,0 +1,23 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2;
format ascii;
class dictionary;
location "system";
object decomposeParDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
numberOfSubdomains 16;
method scotch;
// ************************************************************************* //

View File

@ -0,0 +1,61 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object fvSchemes;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
ddtSchemes
{
default Euler;
}
gradSchemes
{
default Gauss linear;
limitedGrad cellLimited Gauss linear 1;
}
divSchemes
{
default none;
div(rhoPhi,U) Gauss cellCoBlended 2 linearUpwind grad(U) 5 upwind;
div(phi,alpha) Gauss PLIC interfaceCompression vanLeer 1;
div(phirb,alpha) Gauss linear;
div(phi,k) Gauss linearUpwind limitedGrad;
div(phi,omega) Gauss linearUpwind limitedGrad;
div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
}
laplacianSchemes
{
default Gauss linear corrected;
}
interpolationSchemes
{
default linear;
}
snGradSchemes
{
default corrected;
}
wallDist
{
method meshWave;
}
// ************************************************************************* //

View File

@ -0,0 +1,99 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object fvSolution;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
solvers
{
"alpha.water.*"
{
nAlphaCorr 2;
nAlphaSubCycles 1;
MULESCorr yes;
nLimiterIter 15;
alphaApplyPrevCorr yes;
solver smoothSolver;
smoother symGaussSeidel;
tolerance 1e-10;
relTol 0;
minIter 1;
}
"pcorr.*"
{
solver GAMG;
smoother DIC;
tolerance 1e-2;
relTol 0;
};
p_rgh
{
solver GAMG;
smoother DIC;
tolerance 5e-8;
relTol 0;
};
p_rghFinal
{
$p_rgh;
relTol 0;
}
"(U|k|omega).*"
{
solver smoothSolver;
smoother symGaussSeidel;
nSweeps 1;
tolerance 1e-7;
relTol 0;
minIter 1;
};
}
PIMPLE
{
momentumPredictor no;
nOuterCorrectors 3;
nCorrectors 1;
nNonOrthogonalCorrectors 0;
correctPhi yes;
moveMeshOuterCorrectors yes;
turbOnFinalIterOnly yes;
}
relaxationFactors
{
equations
{
".*" 1;
}
}
cache
{
grad(U);
}
// ************************************************************************* //

View File

@ -0,0 +1,86 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object meshQualityDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
//- Maximum non-orthogonality allowed. Set to 180 to disable.
maxNonOrtho 70;
//- Max skewness allowed. Set to <0 to disable.
maxBoundarySkewness 20;
maxInternalSkewness 4;
//- Max concaveness allowed. Is angle (in degrees) below which concavity
// is allowed. 0 is straight face, <0 would be convex face.
// Set to 180 to disable.
maxConcave 80;
//- Minimum pyramid volume. Is absolute volume of cell pyramid.
// Set to a sensible fraction of the smallest cell volume expected.
// Set to very negative number (e.g. -1E30) to disable.
minVol 1e-13;
//- Minimum quality of the tet formed by the face-centre
// and variable base point minimum decomposition triangles and
// the cell centre. Set to very negative number (e.g. -1E30) to
// disable.
// <0 = inside out tet,
// 0 = flat tet
// 1 = regular tet
minTetQuality 1e-30;
//- Minimum face area. Set to <0 to disable.
minArea -1;
//- Minimum face twist. Set to <-1 to disable. dot product of face normal
// and face centre triangles normal
minTwist 0.05;
//- Minimum normalised cell determinant
// 1 = hex, <= 0 = folded or flattened illegal cell
minDeterminant 0.001;
//- minFaceWeight (0 -> 0.5)
minFaceWeight 0.05;
//- minVolRatio (0 -> 1)
minVolRatio 0.01;
//must be >0 for Fluent compatibility
minTriangleTwist -1;
//- If >0 : preserve single cells with all points on the surface if the
// resulting volume after snapping (by approximation) is larger than
// minVolCollapseRatio times old volume (i.e. not collapsed to flat cell).
// If <0 : delete always.
//minVolCollapseRatio 0.5;
// Advanced
//- Number of error distribution iterations
nSmoothScale 4;
//- Amount to scale back displacement at error points
errorReduction 0.75;
// Optional : some meshing phases allow usage of relaxed rules.
// See e.g. addLayersControls::nRelaxedIter.
relaxed
{
//- Maximum non-orthogonality allowed. Set to 180 to disable.
maxNonOrtho 75;
}

View File

@ -0,0 +1,43 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2;
format ascii;
class dictionary;
location "system";
object refineMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
set c7;
coordinateSystem global;
globalCoeffs
{
tan1 ( 1 0 0 );
tan2 ( 0 1 0 );
}
patchLocalCoeffs
{
patch outside;
tan1 ( 1 0 0 );
}
directions ( tan1 tan2 );
useHexTopology no;
geometricCut yes;
writeMesh no;
// ************************************************************************* //

View File

@ -0,0 +1,49 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object setFieldsDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
defaultFieldValues
(
volScalarFieldValue alpha.water 0
);
regions
(
// Set cell values
// (does zerogradient on boundaries)
boxToCell
{
box (-999 -999 -999) (999 999 0.065);
fieldValues
(
volScalarFieldValue alpha.water 1
);
}
// Set patch values (using ==)
boxToFace
{
box (-999 -999 -999) (999 999 0.065);
fieldValues
(
volScalarFieldValue alpha.water 1
);
}
);
// ************************************************************************* //

View File

@ -0,0 +1,284 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object snappyHexMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Which of the steps to run
castellatedMesh true;
snap true;
addLayers true;
// Geometry. Definition of all surfaces. All surfaces are of class
// searchableSurface.
// Surfaces are used
// - to specify refinement for any mesh cell intersecting it
// - to specify refinement for any mesh cell inside/outside/near
// - to 'snap' the mesh boundary to the surface
geometry
{
hull
{
type triSurfaceMesh;
file "w3.stl";
patchInfo
{
type wall;
}
}
};
// Settings for the castellatedMesh generation.
castellatedMeshControls
{
// Refinement parameters
// ~~~~~~~~~~~~~~~~~~~~~
// If local number of cells is >= maxLocalCells on any processor
// switches from from refinement followed by balancing
// (current method) to (weighted) balancing before refinement.
maxLocalCells 100000;
// Overall cell limit (approximately). Refinement will stop immediately
// upon reaching this number so a refinement level might not complete.
// Note that this is the number of cells before removing the part which
// is not 'visible' from the keepPoint. The final number of cells might
// actually be a lot less.
maxGlobalCells 20000000;
// The surface refinement loop might spend lots of iterations refining just a
// few cells. This setting will cause refinement to stop if <= minimumRefine
// are selected for refinement. Note: it will at least do one iteration
// (unless the number of cells to refine is 0)
minRefinementCells 0;
// Number of buffer layers between different levels.
// 1 means normal 2:1 refinement restriction, larger means slower
// refinement.
nCellsBetweenLevels 3;
// Explicit feature edge refinement
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Specifies a level for any cell intersected by its edges.
// This is a featureEdgeMesh, read from constant/triSurface for now.
features
(
{
file "w3.eMesh";
level 0;
}
);
// Surface based refinement
// ~~~~~~~~~~~~~~~~~~~~~~~~
// Specifies two levels for every surface. The first is the minimum level,
// every cell intersecting a surface gets refined up to the minimum level.
// The second level is the maximum level. Cells that 'see' multiple
// intersections where the intersections make an
// angle > resolveFeatureAngle get refined up to the maximum level.
refinementSurfaces
{
hull
{
// Surface-wise min and max refinement level
level (0 0);
}
}
resolveFeatureAngle 45;
// Region-wise refinement
// ~~~~~~~~~~~~~~~~~~~~~~
// Specifies refinement level for cells in relation to a surface. One of
// three modes
// - distance. 'levels' specifies per distance to the surface the
// wanted refinement level. The distances need to be specified in
// descending order.
// - inside. 'levels' is only one entry and only the level is used. All
// cells inside the surface get refined up to the level. The surface
// needs to be closed for this to be possible.
// - outside. Same but cells outside.
refinementRegions
{
}
// Mesh selection
// ~~~~~~~~~~~~~~
// After refinement patches get added for all refinementSurfaces and
// all cells intersecting the surfaces get put into these patches. The
// section reachable from the locationInMesh is kept.
// NOTE: This point should never be on a face, always inside a cell, even
// after refinement.
locationInMesh (-0.7 0 0);
// Whether any faceZones (as specified in the refinementSurfaces)
// are only on the boundary of corresponding cellZones or also allow
// free-standing zone faces. Not used if there are no faceZones.
allowFreeStandingZoneFaces true;
}
// Settings for the snapping.
snapControls
{
//- Number of patch smoothing iterations before finding correspondence
// to surface
nSmoothPatch 3;
//- Relative distance for points to be attracted by surface feature point
// or edge. True distance is this factor times local
// maximum edge length.
// tolerance 4.0;
tolerance 1.0;
//- Number of mesh displacement relaxation iterations.
nSolveIter 100;
//- Maximum number of snapping relaxation iterations. Should stop
// before upon reaching a correct mesh.
nRelaxIter 5;
nFeatureSnapIter 10;
}
// Settings for the layer addition.
addLayersControls
{
// Are the thickness parameters below relative to the undistorted
// size of the refined cell outside layer (true) or absolute sizes (false).
relativeSizes true;
// Per final patch (so not geometry!) the layer information
layers
{
hull
{
nSurfaceLayers 3;
}
}
// Expansion factor for layer mesh
expansionRatio 1.5;
// Wanted thickness of final added cell layer. If multiple layers
// is the thickness of the layer furthest away from the wall.
// Relative to undistorted size of cell outside layer.
// See relativeSizes parameter.
finalLayerThickness 0.7;
// Minimum thickness of cell layer. If for any reason layer
// cannot be above minThickness do not add layer.
// See relativeSizes parameter.
minThickness 0.25;
// If points get not extruded do nGrow layers of connected faces that are
// also not grown. This helps convergence of the layer addition process
// close to features.
// Note: changed(corrected) w.r.t 17x! (didn't do anything in 17x)
nGrow 0;
// Advanced settings
// When not to extrude surface. 0 is flat surface, 90 is when two faces
// are perpendicular
featureAngle 60;
// Maximum number of snapping relaxation iterations. Should stop
// before upon reaching a correct mesh.
nRelaxIter 5;
// Number of smoothing iterations of surface normals
nSmoothSurfaceNormals 1;
// Number of smoothing iterations of interior mesh movement direction
nSmoothNormals 3;
// Smooth layer thickness over surface patches
nSmoothThickness 10;
// Stop layer growth on highly warped cells
maxFaceThicknessRatio 0.5;
// Reduce layer growth where ratio thickness to medial
// distance is large
maxThicknessToMedialRatio 0.3;
// Angle used to pick up medial axis points
// Note: changed(corrected) w.r.t 17x! 90 degrees corresponds to 130 in 17x.
minMedianAxisAngle 90;
// Create buffer region for new layer terminations
nBufferCellsNoExtrude 0;
// Overall max number of layer addition iterations. The mesher will exit
// if it reaches this number of iterations; possibly with an illegal
// mesh.
nLayerIter 50;
// Max number of iterations after which relaxed meshQuality controls
// get used. Up to nRelaxIter it uses the settings in meshQualityControls,
// after nRelaxIter it uses the values in meshQualityControls::relaxed.
nRelaxedIter 20;
}
// Generic mesh quality settings. At any undoable phase these determine
// where to undo.
meshQualityControls
{
#include "meshQualityDict"
}
// Advanced
// Flags for optional output
// 0 : only write final meshes
// 1 : write intermediate meshes
// 2 : write volScalarField with cellLevel for postprocessing
// 4 : write current intersections as .obj files
debug 0;
// Merge tolerance. Is fraction of overall bounding box of initial mesh.
// Note: the write tolerance needs to be higher than this.
mergeTolerance 1E-6;
// ************************************************************************* //

View File

@ -0,0 +1,301 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object snappyHexMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Which of the steps to run
castellatedMesh true;
snap true;
addLayers true;
// Geometry. Definition of all surfaces. All surfaces are of class
// searchableSurface.
// Surfaces are used
// - to specify refinement for any mesh cell intersecting it
// - to specify refinement for any mesh cell inside/outside/near
// - to 'snap' the mesh boundary to the surface
geometry
{
hull
{
type triSurfaceMesh;
file "w3.stl";
patchInfo
{
type wall;
}
}
wakeRegion
{
type searchableBox;
min (-1.5 -0.4 -0.15);
max (0.1 0.0 0.15);
}
};
// Settings for the castellatedMesh generation.
castellatedMeshControls
{
// Refinement parameters
// ~~~~~~~~~~~~~~~~~~~~~
// If local number of cells is >= maxLocalCells on any processor
// switches from from refinement followed by balancing
// (current method) to (weighted) balancing before refinement.
maxLocalCells 100000;
// Overall cell limit (approximately). Refinement will stop immediately
// upon reaching this number so a refinement level might not complete.
// Note that this is the number of cells before removing the part which
// is not 'visible' from the keepPoint. The final number of cells might
// actually be a lot less.
maxGlobalCells 20000000;
// The surface refinement loop might spend lots of iterations refining just a
// few cells. This setting will cause refinement to stop if <= minimumRefine
// are selected for refinement. Note: it will at least do one iteration
// (unless the number of cells to refine is 0)
minRefinementCells 0;
// Number of buffer layers between different levels.
// 1 means normal 2:1 refinement restriction, larger means slower
// refinement.
nCellsBetweenLevels 3;
// Explicit feature edge refinement
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Specifies a level for any cell intersected by its edges.
// This is a featureEdgeMesh, read from constant/triSurface for now.
features
(
{
file "w3.eMesh";
level 3;
}
);
// Surface based refinement
// ~~~~~~~~~~~~~~~~~~~~~~~~
// Specifies two levels for every surface. The first is the minimum level,
// every cell intersecting a surface gets refined up to the minimum level.
// The second level is the maximum level. Cells that 'see' multiple
// intersections where the intersections make an
// angle > resolveFeatureAngle get refined up to the maximum level.
refinementSurfaces
{
hull
{
// Surface-wise min and max refinement level
level (3 3);
}
}
resolveFeatureAngle 45;
// Region-wise refinement
// ~~~~~~~~~~~~~~~~~~~~~~
// Specifies refinement level for cells in relation to a surface. One of
// three modes
// - distance. 'levels' specifies per distance to the surface the
// wanted refinement level. The distances need to be specified in
// descending order.
// - inside. 'levels' is only one entry and only the level is used. All
// cells inside the surface get refined up to the level. The surface
// needs to be closed for this to be possible.
// - outside. Same but cells outside.
refinementRegions
{
hull
{
mode distance;
levels ((0.05 3) (0.1 2) (0.2 2));
}
wakeRegion
{
mode inside;
levels ((1.0 2));
}
}
// Mesh selection
// ~~~~~~~~~~~~~~
// After refinement patches get added for all refinementSurfaces and
// all cells intersecting the surfaces get put into these patches. The
// section reachable from the locationInMesh is kept.
// NOTE: This point should never be on a face, always inside a cell, even
// after refinement.
locationInMesh (-0.7 0 0);
// Whether any faceZones (as specified in the refinementSurfaces)
// are only on the boundary of corresponding cellZones or also allow
// free-standing zone faces. Not used if there are no faceZones.
allowFreeStandingZoneFaces true;
}
// Settings for the snapping.
snapControls
{
//- Number of patch smoothing iterations before finding correspondence
// to surface
nSmoothPatch 3;
//- Relative distance for points to be attracted by surface feature point
// or edge. True distance is this factor times local
// maximum edge length.
// tolerance 4.0;
tolerance 1.0;
//- Number of mesh displacement relaxation iterations.
nSolveIter 100;
//- Maximum number of snapping relaxation iterations. Should stop
// before upon reaching a correct mesh.
nRelaxIter 5;
nFeatureSnapIter 10;
}
// Settings for the layer addition.
addLayersControls
{
// Are the thickness parameters below relative to the undistorted
// size of the refined cell outside layer (true) or absolute sizes (false).
relativeSizes true;
// Per final patch (so not geometry!) the layer information
layers
{
hull
{
nSurfaceLayers 3;
}
}
// Expansion factor for layer mesh
expansionRatio 1.5;
// Wanted thickness of final added cell layer. If multiple layers
// is the thickness of the layer furthest away from the wall.
// Relative to undistorted size of cell outside layer.
// See relativeSizes parameter.
finalLayerThickness 0.7;
// Minimum thickness of cell layer. If for any reason layer
// cannot be above minThickness do not add layer.
// See relativeSizes parameter.
minThickness 0.25;
// If points get not extruded do nGrow layers of connected faces that are
// also not grown. This helps convergence of the layer addition process
// close to features.
// Note: changed(corrected) w.r.t 17x! (didn't do anything in 17x)
nGrow 0;
// Advanced settings
// When not to extrude surface. 0 is flat surface, 90 is when two faces
// are perpendicular
featureAngle 60;
// Maximum number of snapping relaxation iterations. Should stop
// before upon reaching a correct mesh.
nRelaxIter 5;
// Number of smoothing iterations of surface normals
nSmoothSurfaceNormals 1;
// Number of smoothing iterations of interior mesh movement direction
nSmoothNormals 3;
// Smooth layer thickness over surface patches
nSmoothThickness 10;
// Stop layer growth on highly warped cells
maxFaceThicknessRatio 0.5;
// Reduce layer growth where ratio thickness to medial
// distance is large
maxThicknessToMedialRatio 0.3;
// Angle used to pick up medial axis points
// Note: changed(corrected) w.r.t 17x! 90 degrees corresponds to 130 in 17x.
minMedianAxisAngle 90;
// Create buffer region for new layer terminations
nBufferCellsNoExtrude 0;
// Overall max number of layer addition iterations. The mesher will exit
// if it reaches this number of iterations; possibly with an illegal
// mesh.
nLayerIter 50;
// Max number of iterations after which relaxed meshQuality controls
// get used. Up to nRelaxIter it uses the settings in meshQualityControls,
// after nRelaxIter it uses the values in meshQualityControls::relaxed.
nRelaxedIter 20;
}
// Generic mesh quality settings. At any undoable phase these determine
// where to undo.
meshQualityControls
{
#include "meshQualityDict"
}
// Advanced
// Flags for optional output
// 0 : only write final meshes
// 1 : write intermediate meshes
// 2 : write volScalarField with cellLevel for postprocessing
// 4 : write current intersections as .obj files
debug 0;
// Merge tolerance. Is fraction of overall bounding box of initial mesh.
// Note: the write tolerance needs to be higher than this.
mergeTolerance 1E-6;
// ************************************************************************* //

View File

@ -0,0 +1,31 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object surfaceFeaturesDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
surfaces ("w3.stl");
// Identify a feature when angle between faces < includedAngle
includedAngle 150;
subsetFeatures
{
// Keep nonManifold edges (edges with >2 connected faces)
nonManifoldEdges yes;
// Keep open edges (edges with 1 connected face)
openEdges yes;
}
// ************************************************************************* //

View File

@ -0,0 +1,41 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
surfaces
{
type surfaces;
libs ("libsampling.so");
writeControl runTime;
writeInterval 0.02;
surfaceFormat vtk;
writeFormat binary;
fields (alpha.water);
interpolationScheme cellPoint;
surfaces
(
iso-alpha
{
type isoSurface;
isoField alpha.water;
isoValue 0.5;
interpolate true;
}
hull
{
type patch;
patches (hull);
interpolate true;
}
);
}
// ************************************************************************* //

View File

@ -0,0 +1,93 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object topoSetDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
actions
(
{
name c1;
type cellSet;
action new;
source boxToCell;
sourceInfo
{
box (-4.0 -3.0 -2) (4.0 0 3.0);
}
}
{
name c2;
type cellSet;
action new;
source boxToCell;
sourceInfo
{
box (-3.0 -2.0 -1.4) (3.5 0 1.7);
}
}
{
name c3;
type cellSet;
action new;
source boxToCell;
sourceInfo
{
box (-2.5 -0.8 -0.6) (3.0 0 0.8);
}
}
{
name c4;
type cellSet;
action new;
source boxToCell;
sourceInfo
{
box (-2.0 -0.6 -0.4) (2.5 0 0.5);
}
}
{
name c5;
type cellSet;
action new;
source boxToCell;
sourceInfo
{
box (-1.0 -0.4 -0.2) (2.2 0.0 0.4);
}
}
{
name c6;
type cellSet;
action new;
source boxToCell;
sourceInfo
{
box (-0.8 -0.4 -0.1) (2.1 0.0 0.35);
}
}
{
name c7;
type cellSet;
action new;
source boxToCell;
sourceInfo
{
box (-0.2 -0.25 -0.05) (2.05 0.0 0.3);
}
}
);
// ************************************************************************* //

View File

@ -0,0 +1,62 @@
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object topoSetDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
actions
(
{
name c1;
type cellSet;
action new;
source boxToCell;
sourceInfo
{
box (-4.0 -3.0 -2) (4.0 0 3.0);
}
}
{
name c2;
type cellSet;
action new;
source boxToCell;
sourceInfo
{
box (-3.0 -2.0 -1.4) (3.5 0 1.7);
}
}
{
name c3;
type cellSet;
action new;
source boxToCell;
sourceInfo
{
box (-2.5 -0.8 -0.6) (3.0 0 1.1);
}
}
{
name c4;
type cellSet;
action new;
source boxToCell;
sourceInfo
{
box (-2.0 -0.6 -0.4) (2.5 0 0.7);
}
}
);
// ************************************************************************* //

View File

@ -28,7 +28,7 @@ gradSchemes
divSchemes
{
div(rhoPhi,U) Gauss upwind;
div(phi,alpha) Gauss interfaceCompression vanLeer 1;
div(phi,alpha) Gauss MPLIC;
div(phi,k) Gauss upwind;
div(phi,omega) Gauss upwind;
div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;