From 424866f099703dc0de3dfa3c61ac0feea27ec1c0 Mon Sep 17 00:00:00 2001 From: andy <andy> Date: Mon, 12 Sep 2011 13:03:56 +0100 Subject: [PATCH] ENH: Added sample around circle (new line sample type) --- src/sampling/Make/files | 1 + src/sampling/sampledSet/circle/circleSet.C | 241 +++++++++++++++++++++ src/sampling/sampledSet/circle/circleSet.H | 145 +++++++++++++ 3 files changed, 387 insertions(+) create mode 100644 src/sampling/sampledSet/circle/circleSet.C create mode 100644 src/sampling/sampledSet/circle/circleSet.H diff --git a/src/sampling/Make/files b/src/sampling/Make/files index 0c679f52d89..f7c4775e886 100644 --- a/src/sampling/Make/files +++ b/src/sampling/Make/files @@ -3,6 +3,7 @@ probes/patchProbes.C probes/probesGrouping.C probes/probesFunctionObject/probesFunctionObject.C +sampledSet/circle/circleSet.C sampledSet/cloud/cloudSet.C sampledSet/coordSet/coordSet.C sampledSet/patchCloud/patchCloudSet.C diff --git a/src/sampling/sampledSet/circle/circleSet.C b/src/sampling/sampledSet/circle/circleSet.C new file mode 100644 index 00000000000..b7d4d0dbd56 --- /dev/null +++ b/src/sampling/sampledSet/circle/circleSet.C @@ -0,0 +1,241 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "circleSet.H" +#include "sampledSet.H" +#include "meshSearch.H" +#include "DynamicList.H" +#include "polyMesh.H" +#include "addToRunTimeSelectionTable.H" +#include "word.H" +#include "mathematicalConstants.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(circleSet, 0); + addToRunTimeSelectionTable(sampledSet, circleSet, word); +} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::circleSet::calcSamples +( + DynamicList<point>& samplingPts, + DynamicList<label>& samplingCells, + DynamicList<label>& samplingFaces, + DynamicList<label>& samplingSegments, + DynamicList<scalar>& samplingCurveDist +) const +{ + static const string funcName = + ( + "void circleSet::calcSamples" + "(" + "DynamicList<point>&, " + "DynamicList<label>&, " + "DynamicList<label>&, " + "DynamicList<label>&, " + "DynamicList<scalar>&" + ") const" + ); + + // set start point + label cellI = searchEngine().findCell(startPoint_); + if (cellI != -1) + { + samplingPts.append(startPoint_); + samplingCells.append(cellI); + samplingFaces.append(-1); + samplingSegments.append(0); + samplingCurveDist.append(0.0); + } + else + { + WarningIn(funcName) + << "Unable to find cell at point id " << 0 + << " at location " << startPoint_ << endl; + } + + // add remaining points + const scalar alpha = constant::mathematical::pi/180.0*dTheta_; + const scalar sinAlpha = sin(alpha); + const scalar cosAlpha = cos(alpha); + + // first axis + vector axis1 = startPoint_ - origin_; + const scalar radius = mag(axis1); + + if (mag(axis1 & circleAxis_) > SMALL) + { + WarningIn(funcName) + << "Vector defined by (startPoint - origin) not orthogonal to " + << "circleAxis:" << nl + << " startPoint - origin = " << axis1 << nl + << " circleAxis = " << circleAxis_ << nl + << endl; + } + + axis1 /= mag(axis1); + + scalar theta = dTheta_; + label nPoint = 1; + while (theta < 360) + { + axis1 = axis1*cosAlpha + (axis1^circleAxis_)*sinAlpha; + axis1 /= mag(axis1); + point pt = origin_ + radius*axis1; + + label cellI = searchEngine().findCell(pt); + + if (cellI != -1) + { + samplingPts.append(pt); + samplingCells.append(cellI); + samplingFaces.append(-1); + samplingSegments.append(nPoint); + samplingCurveDist.append(mag(pt - startPoint_)); + + nPoint++; + } + else + { + WarningIn(funcName) + << "Unable to find cell at point id " << nPoint + << " at location " << pt << endl; + } + theta += dTheta_; + } +} + + +void Foam::circleSet::genSamples() +{ + // Storage for sample points + DynamicList<point> samplingPts; + DynamicList<label> samplingCells; + DynamicList<label> samplingFaces; + DynamicList<label> samplingSegments; + DynamicList<scalar> samplingCurveDist; + + calcSamples + ( + samplingPts, + samplingCells, + samplingFaces, + samplingSegments, + samplingCurveDist + ); + + samplingPts.shrink(); + samplingCells.shrink(); + samplingFaces.shrink(); + samplingSegments.shrink(); + samplingCurveDist.shrink(); + + setSamples + ( + samplingPts, + samplingCells, + samplingFaces, + samplingSegments, + samplingCurveDist + ); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::circleSet::circleSet +( + const word& name, + const polyMesh& mesh, + meshSearch& searchEngine, + const word& axis, + const point& origin, + const vector& circleAxis, + const point& startPoint, + const scalar dTheta +) +: + sampledSet(name, mesh, searchEngine, axis), + origin_(origin), + circleAxis_(circleAxis), + startPoint_(startPoint), + dTheta_(dTheta) +{ + genSamples(); + + if (debug) + { + write(Info); + } +} + + +Foam::circleSet::circleSet +( + const word& name, + const polyMesh& mesh, + meshSearch& searchEngine, + const dictionary& dict +) +: + sampledSet(name, mesh, searchEngine, dict), + origin_(dict.lookup("origin")), + circleAxis_(dict.lookup("circleAxis")), + startPoint_(dict.lookup("startPoint")), + dTheta_(readScalar(dict.lookup("dTheta"))) +{ + // normalise circleAxis + circleAxis_ /= mag(circleAxis_); + + genSamples(); + + if (debug) + { + write(Info); + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::circleSet::~circleSet() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::point Foam::circleSet::getRefPoint(const List<point>& pts) const +{ + return startPoint_; +} + + +// ************************************************************************* // diff --git a/src/sampling/sampledSet/circle/circleSet.H b/src/sampling/sampledSet/circle/circleSet.H new file mode 100644 index 00000000000..fc3232a5bd5 --- /dev/null +++ b/src/sampling/sampledSet/circle/circleSet.H @@ -0,0 +1,145 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + Foam::circleSet + +Description + Samples along a circular path + +SourceFiles + circleSet.C + +\*---------------------------------------------------------------------------*/ + +#ifndef circleSet_H +#define circleSet_H + +#include "sampledSet.H" +#include "DynamicList.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// Forward declaration of classes +class meshSearch; + +/*---------------------------------------------------------------------------*\ + Class circleSet Declaration +\*---------------------------------------------------------------------------*/ + +class circleSet +: + public sampledSet +{ + // Private data + + // Circle definition + + //- Origin (x, y, z) in global cartesian co-ordinates + point origin_; + + //- Axis of the circle + vector circleAxis_; + + //- Point on circle (x, y, z) in global cartesian co-ordinates + // Defines start point + point startPoint_; + + + // Sampling definition + + //- Sampling interval in degrees about the origin + scalar dTheta_; + + + // Private Member Functions + + //- Samples all points in sampleCoords. + void calcSamples + ( + DynamicList<point>& samplingPts, + DynamicList<label>& samplingCells, + DynamicList<label>& samplingFaces, + DynamicList<label>& samplingSegments, + DynamicList<scalar>& samplingCurveDist + ) const; + + //- Uses calcSamples to obtain samples. Copies them into *this. + void genSamples(); + +public: + + //- Runtime type information + TypeName("circle"); + + + // Constructors + + //- Construct from components + circleSet + ( + const word& name, + const polyMesh& mesh, + meshSearch& searchEngine, + const word& axis, + const point& origin, + const vector& circleAxis, + const point& startPoint, + const scalar dTheta + ); + + //- Construct from dictionary + circleSet + ( + const word& name, + const polyMesh& mesh, + meshSearch& searchEngine, + const dictionary& dict + ); + + + // Destructor + + virtual ~circleSet(); + + + // Member Functions + + //- Get reference point + virtual point getRefPoint(const List<point>&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // -- GitLab