Commit 17a579bf authored by mattijs's avatar mattijs Committed by Andrew Heather
Browse files

ENH: exact: new patchDistMethod

parent 48055b2d
distributedTriSurfaceMesh/distributedTriSurfaceMesh.C
patchDistMethods/exact/exactPatchDistMethod.C
LIB = $(FOAM_LIBBIN)/libdistributed
EXE_INC = \
-I$(LIB_SRC)/surfMesh/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/parallel/decompose/decompositionMethods/lnInclude
LIB_LIBS = \
......
......@@ -1240,7 +1240,7 @@ void Foam::distributedTriSurfaceMesh::surfaceSide
// Nearest to face interior. Use faceNormal to determine side
//scalar c = sampleNearestVec & surf.faceNormals()[facei];
scalar c = sampleNearestVec & surf[facei].normal(points);
scalar c = sampleNearestVec & surf[facei].areaNormal(points);
if (c > 0)
{
......@@ -1292,7 +1292,7 @@ void Foam::distributedTriSurfaceMesh::surfaceSide
label facei = pFaces[pFacei];
const triSurface::FaceType& f = surf[facei];
label fp = findIndex(f, pointi);
label fp = f.find(pointi);
label p1 = f[f.fcIndex(fp)];
label pMin1 = f[f.rcIndex(fp)];
......
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
\\/ 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 "exactPatchDistMethod.H"
#include "distributedTriSurfaceMesh.H"
#include "addToRunTimeSelectionTable.H"
#include "volFields.H"
#include "DynamicField.H"
#include "OBJstream.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace patchDistMethods
{
defineTypeNameAndDebug(exact, 0);
addToRunTimeSelectionTable(patchDistMethod, exact, dictionary);
}
}
const Foam::distributedTriSurfaceMesh&
Foam::patchDistMethods::exact::patchSurface() const
{
if (!patchSurfPtr_.valid())
{
const polyBoundaryMesh& pbm = mesh_.boundaryMesh();
Random rndGen(0);
boundBox localBb(mesh_.points(), false);
// Determine mesh bounding boxes:
List<treeBoundBox> meshBb
(
1,
treeBoundBox(localBb).extend(rndGen, 1E-3)
);
// Dummy bounds dictionary
dictionary dict;
dict.add("bounds", meshBb);
dict.add
(
"distributionType",
distributedTriSurfaceMesh::distributionTypeNames_
[
//distributedTriSurfaceMesh::FOLLOW
distributedTriSurfaceMesh::INDEPENDENT
]
);
dict.add("mergeDistance", 1e-6*localBb.mag());
Info<< "Triangulating local patch faces" << nl << endl;
patchSurfPtr_.reset
(
new distributedTriSurfaceMesh
(
IOobject
(
"wallSurface.stl",
mesh_.time().constant(),// directory
"triSurface", // instance
mesh_.time(), // registry
IOobject::NO_READ,
IOobject::NO_WRITE
),
triSurfaceTools::triangulate
(
pbm,
patchIDs_
),
dict
)
);
// Do redistribution
Info<< "Redistributing surface" << nl << endl;
autoPtr<mapDistribute> faceMap;
autoPtr<mapDistribute> pointMap;
patchSurfPtr_().distribute
(
meshBb,
false, //keepNonMapped,
faceMap,
pointMap
);
faceMap.clear();
pointMap.clear();
}
return patchSurfPtr_();
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::patchDistMethods::exact::exact
(
const dictionary& dict,
const fvMesh& mesh,
const labelHashSet& patchIDs
)
:
patchDistMethod(mesh, patchIDs)
{}
Foam::patchDistMethods::exact::exact
(
const fvMesh& mesh,
const labelHashSet& patchIDs
)
:
patchDistMethod(mesh, patchIDs)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::patchDistMethods::exact::correct(volScalarField& y)
{
return correct(y, const_cast<volVectorField&>(volVectorField::null()));
}
bool Foam::patchDistMethods::exact::correct
(
volScalarField& y,
volVectorField& n
)
{
const distributedTriSurfaceMesh& surf = patchSurface();
List<pointIndexHit> info;
surf.findNearest
(
mesh_.cellCentres(),
scalarField(mesh_.nCells(), Foam::sqr(GREAT)),
info
);
// Take over hits
label nHits = 0;
forAll(info, cellI)
{
if (info[cellI].hit())
{
const point& cc = mesh_.cellCentres()[cellI];
y[cellI] = mag(cc-info[cellI].hitPoint());
nHits++;
}
//else
//{
// // Miss. Do what? Not possible with GREAT hopefully ...
//}
}
y.correctBoundaryConditions();
if (debug)
{
OBJstream str(mesh_.time().timePath()/"wallPoint.obj");
Info<< type() << ": dumping nearest wall point to " << str.name()
<< endl;
forAll(mesh_.cellCentres(), cellI)
{
const point& cc = mesh_.cellCentres()[cellI];
str.write(linePointRef(cc, info[cellI].hitPoint()));
}
}
// Only calculate n if the field is defined
if (notNull(n))
{
surf.getNormal(info, n.primitiveFieldRef());
n.correctBoundaryConditions();
}
return true;
}
// ************************************************************************* //
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
\\/ 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::patchDistMethods::exact
Description
Calculation of exact distance to nearest patch for all cells and
boundary by constructing a search tree for all patch faces.
See also
Foam::patchDistMethod::meshWave
Foam::wallDist
SourceFiles
exactPatchDistMethod.C
\*---------------------------------------------------------------------------*/
#ifndef exactPatchDistMethod_H
#define exactPatchDistMethod_H
#include "patchDistMethod.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
class distributedTriSurfaceMesh;
namespace patchDistMethods
{
/*---------------------------------------------------------------------------*\
Class exact Declaration
\*---------------------------------------------------------------------------*/
class exact
:
public patchDistMethod
{
// Private Member Data
//- Cache surface+searching of patch
mutable autoPtr<distributedTriSurfaceMesh> patchSurfPtr_;
// Private Member Functions
const distributedTriSurfaceMesh& patchSurface() const;
//- Disallow default bitwise copy construct
exact(const exact&);
//- Disallow default bitwise assignment
void operator=(const exact&);
public:
//- Runtime type information
TypeName("exactDistance");
// Constructors
//- Construct from coefficients dictionary, mesh
// and fixed-value patch set
exact
(
const dictionary& dict,
const fvMesh& mesh,
const labelHashSet& patchIDs
);
//- Construct from mesh and fixed-value patch set
exact
(
const fvMesh& mesh,
const labelHashSet& patchIDs
);
// Member Functions
//- Update cached geometry when the mesh moves
virtual bool movePoints()
{
// ? Reconstruct patch surface?
//patchSurfPtr_.clear();
return true;
}
//- Update cached topology and geometry when the mesh changes
virtual void updateMesh(const mapPolyMesh&)
{
// ? Reconstruct patch surface?
//patchSurfPtr_.clear();
}
//- Correct the given distance-to-patch field
virtual bool correct(volScalarField& y);
//- Correct the given distance-to-patch and normal-to-patch fields
virtual bool correct(volScalarField& y, volVectorField& n);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace patchDistMethods
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment