isoSurface instead of isoSurfaceCell

This commit is contained in:
mattijs
2008-11-14 14:50:51 +00:00
parent 24619b5813
commit ba10c42446
3 changed files with 142 additions and 107 deletions

View File

@ -30,7 +30,8 @@ License
#include "volPointInterpolation.H"
#include "addToRunTimeSelectionTable.H"
#include "fvMesh.H"
#include "isoSurfaceCell.H"
#include "isoSurface.H"
//#include "isoSurfaceCell.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -42,19 +43,46 @@ namespace Foam
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
void Foam::distanceSurface::createGeometry() const
void Foam::distanceSurface::createGeometry()
{
// Clear any stored topo
facesPtr_.clear();
const fvMesh& fvm = static_cast<const fvMesh&>(mesh());
// Distance to cell centres
scalarField cellDistance(mesh().nCells());
// ~~~~~~~~~~~~~~~~~~~~~~~~
cellDistancePtr_.reset
(
new volScalarField
(
IOobject
(
"cellDistance",
fvm.time().timeName(),
fvm.time(),
IOobject::NO_READ,
IOobject::NO_WRITE,
false
),
fvm,
dimensionedScalar("zero", dimless/dimTime, 0)
)
);
volScalarField& cellDistance = cellDistancePtr_();
// Internal field
{
const pointField& cc = fvm.C();
scalarField& fld = cellDistance.internalField();
List<pointIndexHit> nearest;
surfPtr_().findNearest
(
mesh().cellCentres(),
scalarField(mesh().nCells(), GREAT),
cc,
scalarField(cc.size(), GREAT),
nearest
);
@ -63,98 +91,109 @@ void Foam::distanceSurface::createGeometry() const
vectorField normal;
surfPtr_().getNormal(nearest, normal);
forAll(cellDistance, cellI)
forAll(nearest, i)
{
vector d(mesh().cellCentres()[cellI]-nearest[cellI].hitPoint());
vector d(cc[i]-nearest[i].hitPoint());
if ((d&normal[cellI]) > 0)
if ((d&normal[i]) > 0)
{
cellDistance[cellI] = Foam::mag(d);
fld[i] = Foam::mag(d);
}
else
{
cellDistance[cellI] = -Foam::mag(d);
fld[i] = -Foam::mag(d);
}
}
}
else
{
forAll(cellDistance, cellI)
forAll(nearest, i)
{
cellDistance[cellI] = Foam::mag
(
nearest[cellI].hitPoint()
- mesh().cellCentres()[cellI]
);
fld[i] = Foam::mag(cc[i] - nearest[i].hitPoint());
}
}
}
// Patch fields
{
forAll(fvm.C().boundaryField(), patchI)
{
const pointField& cc = fvm.C().boundaryField()[patchI];
fvPatchScalarField& fld = cellDistance.boundaryField()[patchI];
List<pointIndexHit> nearest;
surfPtr_().findNearest
(
cc,
scalarField(cc.size(), GREAT),
nearest
);
if (signed_)
{
vectorField normal;
surfPtr_().getNormal(nearest, normal);
forAll(nearest, i)
{
vector d(cc[i]-nearest[i].hitPoint());
if ((d&normal[i]) > 0)
{
fld[i] = Foam::mag(d);
}
else
{
fld[i] = -Foam::mag(d);
}
}
}
else
{
forAll(nearest, i)
{
fld[i] = Foam::mag(cc[i] - nearest[i].hitPoint());
}
}
}
}
// On processor patches the mesh.C() will already be the cell centre
// on the opposite side so no need to swap cellDistance.
// Distance to points
scalarField pointDistance(mesh().nPoints());
pointDistance_.setSize(fvm.nPoints());
{
List<pointIndexHit> nearest;
surfPtr_().findNearest
(
mesh().points(),
scalarField(mesh().nPoints(), GREAT),
fvm.points(),
scalarField(fvm.nPoints(), GREAT),
nearest
);
forAll(pointDistance, pointI)
forAll(pointDistance_, pointI)
{
pointDistance[pointI] = Foam::mag
pointDistance_[pointI] = Foam::mag
(
nearest[pointI].hitPoint()
- mesh().points()[pointI]
- fvm.points()[pointI]
);
}
}
//- Direct from cell field and point field.
const isoSurfaceCell iso
isoSurfPtr_.reset
(
mesh(),
cellDistance,
pointDistance,
distance_,
regularise_
new isoSurface
(
cellDistance,
pointDistance_,
distance_,
regularise_
)
);
////- From point field and interpolated cell.
//scalarField cellAvg(mesh().nCells(), scalar(0.0));
//labelField nPointCells(mesh().nCells(), 0);
//{
// for (label pointI = 0; pointI < mesh().nPoints(); pointI++)
// {
// const labelList& pCells = mesh().pointCells(pointI);
//
// forAll(pCells, i)
// {
// label cellI = pCells[i];
//
// cellAvg[cellI] += pointDistance[pointI];
// nPointCells[cellI]++;
// }
// }
//}
//forAll(cellAvg, cellI)
//{
// cellAvg[cellI] /= nPointCells[cellI];
//}
//
//const isoSurface iso
//(
// mesh(),
// cellAvg,
// pointDistance,
// distance_,
// regularise_
//);
const_cast<distanceSurface&>(*this).triSurface::operator=(iso);
meshCells_ = iso.meshCells();
if (debug)
{
print(Pout);
@ -193,9 +232,8 @@ Foam::distanceSurface::distanceSurface
signed_(readBool(dict.lookup("signed"))),
regularise_(dict.lookupOrDefault("regularise", true)),
zoneName_(word::null),
facesPtr_(NULL),
storedTimeIndex_(-1),
meshCells_(0)
isoSurfPtr_(NULL),
facesPtr_(NULL)
{
// label zoneId = -1;
// if (dict.readIfPresent("zone", zoneName_))

View File

@ -37,8 +37,9 @@ SourceFiles
#define distanceSurface_H
#include "sampledSurface.H"
#include "triSurface.H"
#include "searchableSurface.H"
//#include "isoSurfaceCell.H"
#include "isoSurface.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -51,8 +52,7 @@ namespace Foam
class distanceSurface
:
public sampledSurface,
public triSurface
public sampledSurface
{
// Private data
@ -71,23 +71,24 @@ class distanceSurface
//- zone name (if restricted to zones)
word zoneName_;
//- Distance to cell centres
autoPtr<volScalarField> cellDistancePtr_;
//- Distance to points
scalarField pointDistance_;
//- Constructed iso surface
autoPtr<isoSurface> isoSurfPtr_;
//- triangles converted to faceList
mutable autoPtr<faceList> facesPtr_;
// Recreated for every isoSurface
//- Time at last call
mutable label storedTimeIndex_;
//- For every triangle the original cell in mesh
mutable labelList meshCells_;
// Private Member Functions
//- Create iso surface (if time has changed)
void createGeometry() const;
//- Create iso surface
void createGeometry();
//- sample field on faces
template <class Type>
@ -129,7 +130,7 @@ public:
//- Points of surface
virtual const pointField& points() const
{
return triSurface::points();
return surface().points();
}
//- Faces of surface
@ -137,7 +138,7 @@ public:
{
if (!facesPtr_.valid())
{
const triSurface& s = *this;
const triSurface& s = surface();
facesPtr_.reset(new faceList(s.size()));
@ -153,6 +154,10 @@ public:
//- Correct for mesh movement and/or field changes
virtual void correct(const bool meshChanged);
const isoSurface& surface() const
{
return isoSurfPtr_();
}
//- sample field on surface
virtual tmp<scalarField> sample

View File

@ -39,7 +39,7 @@ Foam::distanceSurface::sampleField
const GeometricField<Type, fvPatchField, volMesh>& vField
) const
{
return tmp<Field<Type> >(new Field<Type>(vField, meshCells_));
return tmp<Field<Type> >(new Field<Type>(vField, surface().meshCells()));
}
@ -50,33 +50,25 @@ Foam::distanceSurface::interpolateField
const interpolation<Type>& interpolator
) const
{
// One value per point
tmp<Field<Type> > tvalues(new Field<Type>(points().size()));
Field<Type>& values = tvalues();
const fvMesh& fvm = static_cast<const fvMesh&>(mesh());
boolList pointDone(points().size(), false);
// Get fields to sample. Assume volPointInterpolation!
const GeometricField<Type, fvPatchField, volMesh>& volFld =
interpolator.psi();
forAll(faces(), cutFaceI)
{
const face& f = faces()[cutFaceI];
tmp<GeometricField<Type, pointPatchField, pointMesh> > pointFld
(
volPointInterpolation::New(fvm).interpolate(volFld)
);
forAll(f, faceVertI)
{
label pointI = f[faceVertI];
if (!pointDone[pointI])
{
values[pointI] = interpolator.interpolate
(
points()[pointI],
meshCells_[cutFaceI]
);
pointDone[pointI] = true;
}
}
}
return tvalues;
// Sample.
return surface().interpolate
(
cellDistancePtr_(),
pointDistance_,
volFld,
pointFld()
);
}