MFEM v4.9.0
Finite element discretization library
Loading...
Searching...
No Matches
mfem::KnotVector Class Reference

A vector of knots in one dimension, with B-spline basis functions of a prescribed order. More...

#include <nurbs.hpp>

Collaboration diagram for mfem::KnotVector:
[legend]

Public Member Functions

 KnotVector ()=default
 Create an empty 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.
 
 KnotVector (int order, int NCP)
 Create a KnotVector with undefined knots (initialized to -1) of order order and number of control points NCP.
 
 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.
 
 KnotVector (const KnotVector &kv)
 Copy constructor.
 
KnotVectoroperator= (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).
 
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.
 
int findKnotSpan (real_t u) const
 Return the index of the knot span containing parameter u.
 
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.
 
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.
 
void FindInterpolant (Array< Vector * > &x, bool reuse_inverse=false)
 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.
 
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
 
KnotVectorDegreeElevate (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.
 
 ~KnotVector ()
 Destroys KnotVector.
 
real_toperator[] (int i)
 Access function to knot i.
 
const real_toperator[] (int i) const
 Const access function to knot i.
 
KnotVectorFullyCoarsen ()
 Coarsen to a single element.
 

Public Attributes

std::shared_ptr< SpacingFunctionspacing
 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.
 
DenseMatrix fact_AB
 
Array< int > fact_ipiv
 Banded matrix factorization.
 
DenseMatrix A_coll_inv
 Row pivot indices.
 

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.
 

Static Protected Attributes

static const int MaxOrder = 10
 

Detailed Description

A vector of knots in one dimension, with B-spline basis functions of a prescribed order.

Note
Order is defined in the sense of "The NURBS book" - 2nd ed - Piegl and Tiller, cf. section 2.2.

Definition at line 37 of file nurbs.hpp.

Constructor & Destructor Documentation

◆ KnotVector() [1/5]

mfem::KnotVector::KnotVector ( )
default

Create an empty KnotVector.

◆ KnotVector() [2/5]

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.

Definition at line 35 of file nurbs.cpp.

◆ KnotVector() [3/5]

mfem::KnotVector::KnotVector ( int order,
int NCP )

Create a KnotVector with undefined knots (initialized to -1) of order order and number of control points NCP.

Definition at line 44 of file nurbs.cpp.

◆ KnotVector() [4/5]

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.

Definition at line 55 of file nurbs.cpp.

◆ KnotVector() [5/5]

mfem::KnotVector::KnotVector ( const KnotVector & kv)
inline

Copy constructor.

Definition at line 78 of file nurbs.hpp.

◆ ~KnotVector()

mfem::KnotVector::~KnotVector ( )
inline

Destroys KnotVector.

Definition at line 195 of file nurbs.hpp.

Member Function Documentation

◆ CalcD2Shape()

void mfem::KnotVector::CalcD2Shape ( Vector & grad2,
int i,
real_t xi ) const
inline

Calculate second-order shape function derivatives, using CalcDnShape.

Definition at line 133 of file nurbs.hpp.

◆ CalcDnShape()

void mfem::KnotVector::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.

Definition at line 468 of file nurbs.cpp.

◆ CalcDShape()

void mfem::KnotVector::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.

Definition at line 410 of file nurbs.cpp.

◆ CalcShape()

void mfem::KnotVector::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.

Definition at line 383 of file nurbs.cpp.

◆ DegreeElevate()

KnotVector * mfem::KnotVector::DegreeElevate ( int t) const

Return a new KnotVector with elevated degree by repeating the endpoints of the KnotVector.

Note
The returned object should be deleted by the caller.

Definition at line 111 of file nurbs.cpp.

◆ Difference()

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.

Definition at line 756 of file nurbs.cpp.

◆ FindInterpolant()

void mfem::KnotVector::FindInterpolant ( Array< Vector * > & x,
bool reuse_inverse = false )

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.

The inverse of the collocation matrix, used in the interpolation, is stored for repeated calls and used if reuse_inverse is true. Reuse is valid only if this KnotVector has not changed since the initial call with reuse_inverse false.

Definition at line 630 of file nurbs.cpp.

◆ findKnotSpan()

int mfem::KnotVector::findKnotSpan ( real_t u) const

Return the index of the knot span containing parameter u.

Definition at line 727 of file nurbs.cpp.

◆ FindMaxima()

void mfem::KnotVector::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.

Definition at line 569 of file nurbs.cpp.

◆ Flip()

void mfem::KnotVector::Flip ( )

Reverse the knots.

Definition at line 325 of file nurbs.cpp.

◆ FullyCoarsen()

KnotVector * mfem::KnotVector::FullyCoarsen ( )

Coarsen to a single element.

Definition at line 791 of file nurbs.cpp.

◆ GetCoarseningFactor()

int mfem::KnotVector::GetCoarseningFactor ( ) const

Returns the coarsening factor needed for non-nested nonuniform spacing functions, to result in a single element from which refinement can be done. The return value is 1 if uniform or nested spacing is used.

Definition at line 161 of file nurbs.cpp.

◆ GetElements()

void mfem::KnotVector::GetElements ( )

Count the number of elements.

Definition at line 313 of file nurbs.cpp.

◆ GetFineKnots()

Vector mfem::KnotVector::GetFineKnots ( const int cf) const

For a given coarsening factor cf, find the fine knots between the coarse knots.

Definition at line 180 of file nurbs.cpp.

◆ getKnotLocation()

real_t mfem::KnotVector::getKnotLocation ( real_t xi,
int ni ) const
inline

Return the parameter for element reference coordinate xi in [0,1], for the element beginning at knot ni.

Definition at line 108 of file nurbs.hpp.

◆ GetNCP()

int mfem::KnotVector::GetNCP ( ) const
inline

Return the number of control points.

Definition at line 86 of file nurbs.hpp.

◆ GetNE()

int mfem::KnotVector::GetNE ( ) const
inline

Return the number of elements, defined by distinct knots.

Definition at line 83 of file nurbs.hpp.

◆ GetNKS()

int mfem::KnotVector::GetNKS ( ) const
inline

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).

Definition at line 104 of file nurbs.hpp.

◆ GetOrder()

int mfem::KnotVector::GetOrder ( ) const
inline

Return the order.

Definition at line 89 of file nurbs.hpp.

◆ isElement()

bool mfem::KnotVector::isElement ( int i) const
inline

Return whether the knot index Order plus i is the beginning of an element.

Definition at line 99 of file nurbs.hpp.

◆ operator=()

KnotVector & mfem::KnotVector::operator= ( const KnotVector & kv)

Definition at line 99 of file nurbs.cpp.

◆ operator[]() [1/2]

real_t & mfem::KnotVector::operator[] ( int i)
inline

Access function to knot i.

Definition at line 198 of file nurbs.hpp.

◆ operator[]() [2/2]

const real_t & mfem::KnotVector::operator[] ( int i) const
inline

Const access function to knot i.

Definition at line 201 of file nurbs.hpp.

◆ Print()

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.

Definition at line 340 of file nurbs.cpp.

◆ PrintFunctions()

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.

Definition at line 346 of file nurbs.cpp.

◆ Refinement()

void mfem::KnotVector::Refinement ( Vector & new_knots,
int rf ) const

Refine with refinement factor rf.

Definition at line 248 of file nurbs.cpp.

◆ Size()

int mfem::KnotVector::Size ( ) const
inline

Return the number of knots, including multiplicities.

Definition at line 92 of file nurbs.hpp.

◆ UniformRefinement()

void mfem::KnotVector::UniformRefinement ( Vector & new_knots,
int rf ) const

Uniformly refine by factor rf, by inserting knots in each span.

Definition at line 140 of file nurbs.cpp.

Member Data Documentation

◆ A_coll_inv

DenseMatrix mfem::KnotVector::A_coll_inv

Row pivot indices.

Definition at line 218 of file nurbs.hpp.

◆ coarse

bool mfem::KnotVector::coarse

Flag to indicate whether the KnotVector has been coarsened, which means it is ready for non-nested refinement.

Definition at line 211 of file nurbs.hpp.

◆ fact_AB

DenseMatrix mfem::KnotVector::fact_AB

Definition at line 215 of file nurbs.hpp.

◆ fact_ipiv

Array<int> mfem::KnotVector::fact_ipiv

Banded matrix factorization.

Definition at line 216 of file nurbs.hpp.

◆ knot

Vector mfem::KnotVector::knot
protected

Stores the values of all knots.

Definition at line 43 of file nurbs.hpp.

◆ MaxOrder

const int mfem::KnotVector::MaxOrder = 10
staticprotected

Definition at line 40 of file nurbs.hpp.

◆ NumOfControlPoints

int mfem::KnotVector::NumOfControlPoints
protected

Number of control points.

Definition at line 49 of file nurbs.hpp.

◆ NumOfElements

int mfem::KnotVector::NumOfElements
protected

Number of elements, defined by distinct knots.

Definition at line 52 of file nurbs.hpp.

◆ Order

int mfem::KnotVector::Order
protected

Order of the B-spline basis functions.

Definition at line 46 of file nurbs.hpp.

◆ spacing

std::shared_ptr<SpacingFunction> mfem::KnotVector::spacing

Function to define the distribution of knots for any number of knot spans.

Definition at line 207 of file nurbs.hpp.


The documentation for this class was generated from the following files: