mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
quickly implemented BSpline2 as an alternative B-Spline implementation
- also looks reasonable and doesn't deviate much from Catmull-Rom
This commit is contained in:
@ -27,7 +27,9 @@ License
|
|||||||
|
|
||||||
#include "vector.H"
|
#include "vector.H"
|
||||||
#include "IFstream.H"
|
#include "IFstream.H"
|
||||||
|
|
||||||
#include "BSpline.H"
|
#include "BSpline.H"
|
||||||
|
#include "BSpline2.H"
|
||||||
#include "CatmullRomSpline.H"
|
#include "CatmullRomSpline.H"
|
||||||
|
|
||||||
using namespace Foam;
|
using namespace Foam;
|
||||||
@ -39,8 +41,9 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
argList::noParallel();
|
argList::noParallel();
|
||||||
argList::validArgs.insert("file .. fileN");
|
argList::validArgs.insert("file .. fileN");
|
||||||
argList::addBoolOption("B", "B-Spline");
|
argList::addBoolOption("Bold", "B-Spline implementation OLD");
|
||||||
argList::addBoolOption("cmr", "catmull-rom spline (default)");
|
argList::addBoolOption("Bnew", "B-Spline implementation NEW");
|
||||||
|
argList::addBoolOption("CMR", "catmull-rom spline (default)");
|
||||||
argList::addOption
|
argList::addOption
|
||||||
(
|
(
|
||||||
"n",
|
"n",
|
||||||
@ -55,11 +58,12 @@ int main(int argc, char *argv[])
|
|||||||
args.printUsage();
|
args.printUsage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool useBSpline = args.optionFound("B");
|
bool useBSplineOld = args.optionFound("Bold");
|
||||||
bool useCatmullRom = args.optionFound("cmr");
|
bool useBSplineNew = args.optionFound("Bnew");
|
||||||
|
bool useCatmullRom = args.optionFound("CMR");
|
||||||
label nSeg = args.optionLookupOrDefault<label>("n", 20);
|
label nSeg = args.optionLookupOrDefault<label>("n", 20);
|
||||||
|
|
||||||
if (!useBSpline && !useCatmullRom)
|
if (!useCatmullRom && !useBSplineOld && !useBSplineNew)
|
||||||
{
|
{
|
||||||
Info<<"defaulting to Catmull-Rom spline" << endl;
|
Info<<"defaulting to Catmull-Rom spline" << endl;
|
||||||
useCatmullRom = true;
|
useCatmullRom = true;
|
||||||
@ -77,12 +81,27 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
Info<<"\noriginal points: " << pointFields[splineI] << nl;
|
Info<<"\noriginal points: " << pointFields[splineI] << nl;
|
||||||
|
|
||||||
if (useBSpline)
|
if (useBSplineOld)
|
||||||
{
|
{
|
||||||
BSpline spl(pointFields[splineI], vector::zero, vector::zero);
|
BSpline spl(pointFields[splineI]);
|
||||||
|
|
||||||
Info<< nl
|
Info<< nl
|
||||||
<< "B-Spline interpolation:" << nl
|
<< "B-Spline interpolation: OLD" << nl
|
||||||
|
<< "----------------------" << endl;
|
||||||
|
|
||||||
|
for (label segI = 0; segI <= nSeg; ++segI)
|
||||||
|
{
|
||||||
|
scalar lambda = scalar(segI)/scalar(nSeg);
|
||||||
|
Info<< spl.position(lambda) << " // " << lambda << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (useBSplineNew)
|
||||||
|
{
|
||||||
|
BSpline2 spl(pointFields[splineI]);
|
||||||
|
|
||||||
|
Info<< nl
|
||||||
|
<< "B-Spline interpolation: NEW" << nl
|
||||||
<< "----------------------" << endl;
|
<< "----------------------" << endl;
|
||||||
|
|
||||||
for (label segI = 0; segI <= nSeg; ++segI)
|
for (label segI = 0; segI <= nSeg; ++segI)
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
curvedEdges/BSpline2.C
|
||||||
curvedEdges/CatmullRomSpline.C
|
curvedEdges/CatmullRomSpline.C
|
||||||
curvedEdges/polyLine.C
|
curvedEdges/polyLine.C
|
||||||
|
|
||||||
|
|||||||
131
src/mesh/blockMesh/curvedEdges/BSpline2.C
Normal file
131
src/mesh/blockMesh/curvedEdges/BSpline2.C
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2009-2009 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 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 "error.H"
|
||||||
|
#include "BSpline2.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::BSpline2::BSpline2
|
||||||
|
(
|
||||||
|
const pointField& Knots,
|
||||||
|
const vector&,
|
||||||
|
const vector&
|
||||||
|
)
|
||||||
|
:
|
||||||
|
polyLine(Knots)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::point Foam::BSpline2::position(const scalar mu) const
|
||||||
|
{
|
||||||
|
// endpoints
|
||||||
|
if (mu < SMALL)
|
||||||
|
{
|
||||||
|
return points().first();
|
||||||
|
}
|
||||||
|
else if (mu > 1 - SMALL)
|
||||||
|
{
|
||||||
|
return points().last();
|
||||||
|
}
|
||||||
|
|
||||||
|
scalar lambda = mu;
|
||||||
|
label segment = localParameter(lambda);
|
||||||
|
return position(segment, lambda);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::point Foam::BSpline2::position
|
||||||
|
(
|
||||||
|
const label segment,
|
||||||
|
const scalar mu
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
const point& p0 = points()[segment];
|
||||||
|
const point& p1 = points()[segment+1];
|
||||||
|
|
||||||
|
// special cases - no calculation needed
|
||||||
|
if (segment < 0 || mu < 0.0)
|
||||||
|
{
|
||||||
|
return p0;
|
||||||
|
}
|
||||||
|
else if (segment > nSegments() || mu >= 1.0)
|
||||||
|
{
|
||||||
|
return p1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// determine the end points
|
||||||
|
point e0;
|
||||||
|
point e1;
|
||||||
|
|
||||||
|
if (segment == 0)
|
||||||
|
{
|
||||||
|
// end: simple reflection
|
||||||
|
e0 = 2.0 * p0 - p1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
e0 = points()[segment-1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (segment+1 == nSegments())
|
||||||
|
{
|
||||||
|
// end: simple reflection
|
||||||
|
e1 = 2.0 * p1 - p0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
e1 = points()[segment+2];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return 1.0/6.0 *
|
||||||
|
(
|
||||||
|
( e0 + 4*p0 + p1 )
|
||||||
|
+ mu *
|
||||||
|
(
|
||||||
|
( -3*e0 + 3*p1 )
|
||||||
|
+ mu *
|
||||||
|
(
|
||||||
|
( 3*e0 - 6*p0 + 3*p1 )
|
||||||
|
+ mu *
|
||||||
|
( -e0 + 3*p0 - 3*p1 + e1 )
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::scalar Foam::BSpline2::length() const
|
||||||
|
{
|
||||||
|
notImplemented("BSpline2::length() const");
|
||||||
|
return 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
126
src/mesh/blockMesh/curvedEdges/BSpline2.H
Normal file
126
src/mesh/blockMesh/curvedEdges/BSpline2.H
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2009-2009 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 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::BSpline2
|
||||||
|
|
||||||
|
Description
|
||||||
|
An implementation of B-splines.
|
||||||
|
|
||||||
|
In this implementation, the end tangents are created
|
||||||
|
automatically by reflection.
|
||||||
|
|
||||||
|
In matrix form, the @e local interpolation on the interval t=[0..1] is
|
||||||
|
described as follows:
|
||||||
|
@verbatim
|
||||||
|
P(t) = 1/6 * [ t^3 t^2 t 1 ] * [ -1 3 -3 1 ] * [ P-1 ]
|
||||||
|
[ 3 -6 3 0 ] [ P0 ]
|
||||||
|
[ -3 0 3 0 ] [ P1 ]
|
||||||
|
[ 1 4 1 0 ] [ P2 ]
|
||||||
|
@endverbatim
|
||||||
|
|
||||||
|
Where P-1 and P2 represent the neighbouring points or the
|
||||||
|
extrapolated end points. Simple reflection is used to
|
||||||
|
automatically create the end points.
|
||||||
|
|
||||||
|
The spline is discretized based on the chord length of the
|
||||||
|
individual segments. In rare cases (sections with very high
|
||||||
|
curvatures), the resulting distribution may be sub-optimal.
|
||||||
|
|
||||||
|
SeeAlso
|
||||||
|
CatmullRomSpline
|
||||||
|
|
||||||
|
ToDo
|
||||||
|
A future implementation could also handle closed splines - either
|
||||||
|
when the start/end points are identically or when specified.
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
BSpline2.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef BSpline2_H
|
||||||
|
#define BSpline2_H
|
||||||
|
|
||||||
|
#include "polyLine.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class BSpline2 Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class BSpline2
|
||||||
|
:
|
||||||
|
public polyLine
|
||||||
|
{
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Disallow default bitwise copy construct
|
||||||
|
BSpline2(const BSpline2&);
|
||||||
|
|
||||||
|
//- Disallow default bitwise assignment
|
||||||
|
void operator=(const BSpline2&);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
BSpline2
|
||||||
|
(
|
||||||
|
const pointField& knots,
|
||||||
|
const vector& begTangentNotImplemented = vector::zero,
|
||||||
|
const vector& endTangentNotImplemented = vector::zero
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Return the point position corresponding to the curve parameter
|
||||||
|
// 0 <= lambda <= 1
|
||||||
|
point position(const scalar lambda) const;
|
||||||
|
|
||||||
|
//- Return the point position corresponding to the local parameter
|
||||||
|
// 0 <= lambda <= 1 on the given segment
|
||||||
|
point position(const label segment, const scalar lambda) const;
|
||||||
|
|
||||||
|
//- Return the length of the curve
|
||||||
|
scalar length() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -106,7 +106,7 @@ Foam::point Foam::CatmullRomSpline::position
|
|||||||
|
|
||||||
return 0.5 *
|
return 0.5 *
|
||||||
(
|
(
|
||||||
( 2 * p0 )
|
( 2*p0 )
|
||||||
+ mu *
|
+ mu *
|
||||||
(
|
(
|
||||||
( -e0 + p1 )
|
( -e0 + p1 )
|
||||||
|
|||||||
Reference in New Issue
Block a user