![]() |
MFEM v4.10.0
Finite element discretization library
|
A vector of knots in one dimension, with B-spline basis functions of a prescribed order. More...
#include <nurbs.hpp>
Public Member Functions | |
| KnotVector ()=default | |
| Collocation matrix inverse. | |
| KnotVector (std::istream &input) | |
| Create a KnotVector by reading data from stream input. Two integers are read, for order and number of control points. | |
| KnotVector (int order, int NCP=-1) | |
| Create a KnotVector with order order. When NCP is not provided the number of control points is set to order + 1, and the first order + 1 knots are set to 0 and last order + 1 knots are set to 1. When NCP is given number of control points is NCP and the knots are initialized to -1) | |
| KnotVector (int order, const Vector &k) | |
| Create a KnotVector with order order and knots knot. If k has the correct number of repeated knots at the begin and end, then this constructor will copy the knots as provided. Otherwise, the knot vector will be extended by repeating the end knots (order + 1) times. Internal knots will retain the multiplicity as given in the input. | |
| KnotVector (int order, const Vector &intervals, const Array< int > &continuity) | |
| Create a KnotVector by passing in a degree, a Vector of interval lengths of length n, and a list of continuity of length n + 1. The intervals refer to spans between unique knot values (not counting zero-size intervals at repeated knots), and the continuity values should be >= -1 (discontinuous) and <= order-1 (maximally-smooth for the given polynomial degree). Periodicity is not supported. | |
| KnotVector (const KnotVector &kv) | |
| Copy constructor. | |
| KnotVector & | operator= (const KnotVector &kv) |
| int | GetNE () const |
| Return the number of elements, defined by distinct knots. | |
| int | GetNCP () const |
| Return the number of control points. | |
| int | GetOrder () const |
| Return the order. | |
| int | Size () const |
| Return the number of knots, including multiplicities. | |
| void | GetElements () |
| Count the number of elements. | |
| bool | isElement (int i) const |
| Return whether the knot index Order plus i is the beginning of an element. | |
| int | GetNKS () const |
| Return the number of control points minus the order. This is not the number of knot spans, but it gives the number of knots to be checked with isElement for non-empty knot spans (elements). | |
| bool | inSpan (real_t u, int ni) const |
| Return whether knot location u is in a given span ni. | |
| int | GetSpan (real_t u) const |
| Return the index of the knot span containing parameter u. | |
| real_t | GetRefPoint (real_t u, int ni) const |
| Return the reference coordinate in [0,1] for parameter u in the element beginning at knot ni. | |
| real_t | GetKnotLocation (real_t xi, int ni) const |
| Return the knot location for element reference coordinate xi in [0,1], for the element beginning at knot ni. | |
| MFEM_DEPRECATED real_t | getKnotLocation (real_t xi, int ni) const |
| Return the parameter for element reference coordinate xi in [0,1], for the element beginning at knot ni. | |
| MFEM_DEPRECATED int | findKnotSpan (real_t u) const |
| Return the index of the knot span containing parameter u. | |
| real_t | GetGreville (int i) const |
| void | GetGreville (Vector &xi) const |
| real_t | GetBotella (int i) const |
| void | GetBotella (Vector &xi) const |
| real_t | GetDemko (int i) const |
| void | GetDemko (Vector &xi) const |
| void | CalcShape (Vector &shape, int i, real_t xi) const |
| Calculate the nonvanishing shape function values in shape for the element corresponding to knot index i and element reference coordinate xi. | |
| void | CalcDShape (Vector &grad, int i, real_t xi) const |
| Calculate derivatives of the nonvanishing shape function values in grad for the element corresponding to knot index i and element reference coordinate xi. | |
| void | CalcDnShape (Vector &gradn, int n, int i, real_t xi) const |
| Calculate n-th derivatives (order n) of the nonvanishing shape function values in grad for the element corresponding to knot index i and element reference coordinate xi. | |
| void | CalcD2Shape (Vector &grad2, int i, real_t xi) const |
| Calculate second-order shape function derivatives, using CalcDnShape. | |
| MFEM_DEPRECATED void | FindMaxima (Array< int > &ks, Vector &xi, Vector &u) const |
| Gives the locations of the maxima of the KnotVector in reference space. The function gives the knot span ks, the coordinate in the knot span xi, and the coordinate of the maximum in parameter space u. The main purpose of this function is its use in FindInterpolant. Use GetBotella instead for each shape function separately, perhaps in conjunction with GetSpan and GetRefPoint. | |
| MFEM_DEPRECATED void | FindInterpolant (Array< Vector * > &x, bool reuse_inverse) |
| Global curve interpolation through the points x (overwritten). x is an array with the length of the spatial dimension containing vectors with spatial coordinates. The control points of the interpolated curve are returned in x in the same form. Use GetInterpolant instead. For the knot location one can use either GetBotella, GetDemko or GetGreville. FindInterpolant uses the Botella points, however, the Demko points might be more appropriate. | |
| void | GetInterpolant (Array< Vector * > &x, const Vector &u, bool reuse_inverse=false) const |
| Global curve interpolation through the points x (overwritten) at the knot location u. The control points of the interpolated curve are returned in x in the same form. For the knot location one can use for instance GetBotella, GetDemko or GetGreville. The Demko points might be most appropriate. | |
| void | GetInterpolant (const Vector &x, const Vector &u, Vector &a, bool reuse_inverse=false) const |
| Different interface to same routine. | |
| void | Difference (const KnotVector &kv, Vector &diff) const |
| void | UniformRefinement (Vector &new_knots, int rf) const |
| Uniformly refine by factor rf, by inserting knots in each span. | |
| void | Refinement (Vector &new_knots, int rf) const |
| Refine with refinement factor rf. | |
| int | GetCoarseningFactor () const |
| Vector | GetFineKnots (const int cf) const |
| KnotVector * | DegreeElevate (int t) const |
| Return a new KnotVector with elevated degree by repeating the endpoints of the KnotVector. | |
| void | Flip () |
| Reverse the knots. | |
| void | Print (std::ostream &os) const |
| Print the order, number of control points, and knots. | |
| void | PrintFunctions (std::ostream &os, int samples=11) const |
| Prints the non-zero shape functions and their first and second derivatives associated with the KnotVector per element. Use GetElements() to count the elements before using this function. samples is the number of samples of the shape functions per element. | |
| void | PrintFunction (std::ostream &os, const Vector &a, int samples=11) const |
| void | PrintFunction (std::ostream &os, int i, int samples=11) const |
| ~KnotVector () | |
| Destroys KnotVector. | |
| real_t & | operator[] (int i) |
| Access function to knot i. | |
| const real_t & | operator[] (int i) const |
| Const access function to knot i. | |
| KnotVector * | FullyCoarsen () |
| Coarsen to a single element. | |
Public Attributes | |
| std::shared_ptr< SpacingFunction > | spacing |
| Function to define the distribution of knots for any number of knot spans. | |
| bool | coarse |
| Flag to indicate whether the KnotVector has been coarsened, which means it is ready for non-nested refinement. | |
Protected Member Functions | |
| void | ComputeDemko () const |
| Compute all the Demko points. | |
Protected Attributes | |
| Vector | knot |
| Stores the values of all knots. | |
| int | Order |
| Order of the B-spline basis functions. | |
| int | NumOfControlPoints |
| Number of control points. | |
| int | NumOfElements |
| Number of elements, defined by distinct knots. | |
| Vector | demko |
| DenseMatrix | fact_AB |
| Array< int > | fact_ipiv |
| Banded matrix factorization. | |
| DenseMatrix | A_coll_inv |
| Row pivot indices. | |
Static Protected Attributes | |
| static const int | MaxOrder = 10 |
A vector of knots in one dimension, with B-spline basis functions of a prescribed order.
|
default |
Collocation matrix inverse.
Create an empty KnotVector.
| mfem::KnotVector::KnotVector | ( | std::istream & | input | ) |
Create a KnotVector by reading data from stream input. Two integers are read, for order and number of control points.
| mfem::KnotVector::KnotVector | ( | int | order, |
| int | NCP = -1 ) |
Create a KnotVector with order order. When NCP is not provided the number of control points is set to order + 1, and the first order + 1 knots are set to 0 and last order + 1 knots are set to 1. When NCP is given number of control points is NCP and the knots are initialized to -1)
| mfem::KnotVector::KnotVector | ( | int | order, |
| const Vector & | k ) |
Create a KnotVector with order order and knots knot. If k has the correct number of repeated knots at the begin and end, then this constructor will copy the knots as provided. Otherwise, the knot vector will be extended by repeating the end knots (order + 1) times. Internal knots will retain the multiplicity as given in the input.
| mfem::KnotVector::KnotVector | ( | int | order, |
| const Vector & | intervals, | ||
| const Array< int > & | continuity ) |
Create a KnotVector by passing in a degree, a Vector of interval lengths of length n, and a list of continuity of length n + 1. The intervals refer to spans between unique knot values (not counting zero-size intervals at repeated knots), and the continuity values should be >= -1 (discontinuous) and <= order-1 (maximally-smooth for the given polynomial degree). Periodicity is not supported.
|
inline |
|
inline |
Destroys KnotVector.
|
protected |
| KnotVector * mfem::KnotVector::DegreeElevate | ( | int | t | ) | const |
Return a new KnotVector with elevated degree by repeating the endpoints of the KnotVector.
| void mfem::KnotVector::Difference | ( | const KnotVector & | kv, |
| Vector & | diff ) const |
Set diff, comprised of knots in kv not contained in this KnotVector. kv must be of the same order as this KnotVector. The current implementation is not well defined, and the function may have undefined behavior, as diff may have unset entries at the end.
Global curve interpolation through the points x (overwritten). x is an array with the length of the spatial dimension containing vectors with spatial coordinates. The control points of the interpolated curve are returned in x in the same form. Use GetInterpolant instead. For the knot location one can use either GetBotella, GetDemko or GetGreville. FindInterpolant uses the Botella points, however, the Demko points might be more appropriate.
| int mfem::KnotVector::findKnotSpan | ( | real_t | u | ) | const |
Gives the locations of the maxima of the KnotVector in reference space. The function gives the knot span ks, the coordinate in the knot span xi, and the coordinate of the maximum in parameter space u. The main purpose of this function is its use in FindInterpolant. Use GetBotella instead for each shape function separately, perhaps in conjunction with GetSpan and GetRefPoint.
| KnotVector * mfem::KnotVector::FullyCoarsen | ( | ) |
| real_t mfem::KnotVector::GetBotella | ( | int | i | ) | const |
Gives the knot location where the i shape function is maximum. Reverts to the Greville point if knot is repeated Order +1 times. For background see:
Olivier Botella and Karim Shariff. "B-spline methods in fluid dynamics." International Journal of Computational Fluid Dynamics 17.2 (2003): 133-149.
Points are found using Newton iteration, with the Greville point as the starting value.
| int mfem::KnotVector::GetCoarseningFactor | ( | ) | const |
| real_t mfem::KnotVector::GetDemko | ( | int | i | ) | const |
Gives the knot location of the i extremum of the Chebyshev spline. For background see:
Stephen Demko "On the existence of interpolating projections onto spline spaces." Journal of approximation theory 43.2 (1985): 151-156.
Points are found using Remez iteration:
| void mfem::KnotVector::GetElements | ( | ) |
| Vector mfem::KnotVector::GetFineKnots | ( | const int | cf | ) | const |
| real_t mfem::KnotVector::GetGreville | ( | int | i | ) | const |
| void mfem::KnotVector::GetInterpolant | ( | Array< Vector * > & | x, |
| const Vector & | u, | ||
| bool | reuse_inverse = false ) const |
Global curve interpolation through the points x (overwritten) at the knot location u. The control points of the interpolated curve are returned in x in the same form. For the knot location one can use for instance GetBotella, GetDemko or GetGreville. The Demko points might be most appropriate.
|
inline |
|
inline |
|
inline |
|
inline |
| int mfem::KnotVector::GetSpan | ( | real_t | u | ) | const |
|
inline |
|
inline |
| KnotVector & mfem::KnotVector::operator= | ( | const KnotVector & | kv | ) |
|
inline |
|
inline |
| void mfem::KnotVector::Print | ( | std::ostream & | os | ) | const |
Print the order, number of control points, and knots.
The output is formatted for writing a mesh to file. This function is called by NURBSPatch::Print.
| void mfem::KnotVector::PrintFunction | ( | std::ostream & | os, |
| const Vector & | a, | ||
| int | samples = 11 ) const |
Prints the function with basis function coefficient a, and its first and second derivatives associated with the KnotVector per element. Use GetElements() to count the elements before using this function. samples is the number of samples of the shape functions per element.
| void mfem::KnotVector::PrintFunction | ( | std::ostream & | os, |
| int | i, | ||
| int | samples = 11 ) const |
Prints the i-th function and its first and second derivatives associated with the KnotVector per element. Use GetElements() to count the elements before using this function. samples is the number of samples of the shape functions per element.
| void mfem::KnotVector::PrintFunctions | ( | std::ostream & | os, |
| int | samples = 11 ) const |
Prints the non-zero shape functions and their first and second derivatives associated with the KnotVector per element. Use GetElements() to count the elements before using this function. samples is the number of samples of the shape functions per element.
| void mfem::KnotVector::Refinement | ( | Vector & | new_knots, |
| int | rf ) const |
|
inline |
| void mfem::KnotVector::UniformRefinement | ( | Vector & | new_knots, |
| int | rf ) const |
|
mutableprotected |
| bool mfem::KnotVector::coarse |
Flag to indicate whether the KnotVector has been coarsened, which means it is ready for non-nested refinement.
|
mutableprotected |
|
mutableprotected |
|
protected |
|
protected |
|
protected |
|
protected |
| std::shared_ptr<SpacingFunction> mfem::KnotVector::spacing |