34 template<
short_t d,
class T>
43 typedef typename gsHTensorBasis<d,T>::cmatIterator cmatIterator;
50 typedef memory::shared_ptr< gsTHBSplineBasis >
Ptr;
53 typedef memory::unique_ptr< gsTHBSplineBasis >
uPtr;
66 typedef typename std::vector< std::vector< std::vector< std::vector<T> > > > Polylines;
72 typedef typename std::vector< std::vector< std::vector<index_t> > > AxisAlignedBoundingBox;
80 typedef typename std::vector< std::vector< std::vector< std::vector< std::vector<T> > > > > TrimmingCurves;
90 const std::vector<index_t> & boxes)
94 gsTHBSplineBasis(gsTensorBSplineBasis<d,T>
const& tbasis,
95 gsMatrix<T>
const & boxes)
99 gsTHBSplineBasis( gsTensorBSplineBasis<d,T>
const& tbasis,
100 gsMatrix<T>
const & boxes,
101 const std::vector<index_t> & levels)
116 return basisSlice(n1.direction(),n1.parameter());
128 void active_into(
const gsMatrix<T>& u, gsMatrix<index_t>& result)
const;
130 index_t numActiveMax(
const gsMatrix<T> & u, gsMatrix<index_t> & offset)
const;
134 void activeAtLevel_into(
index_t lvl,
const gsMatrix<T>& u,
135 std::vector<index_t> & result)
const;
138 void deriv2_into(
const gsMatrix<T>& u, gsMatrix<T>& result)
const;
142 const gsMatrix<T>& u,
143 gsMatrix<T>& result)
const;
146 void deriv_into(
const gsMatrix<T>& u, gsMatrix<T>& result)
const;
150 const gsMatrix<T> & u,
151 gsMatrix<T>& result)
const;
154 std::vector<gsMatrix<T> > & result,
155 bool sameElement =
false)
const;
158 void fastEval_into(
const gsMatrix<T>& u,
159 gsMatrix<T>& result)
const
161 gsMatrix<index_t> indices;
164 result.setZero(indices.rows(), u.cols());
166 const unsigned maxLvl = this->
m_tree.getMaxInsLevel() + 1;
167 std::vector< gsMatrix<T> > tmpResults(maxLvl, gsMatrix<T>());
168 std::vector< gsMatrix<index_t> > tmpActive(maxLvl, gsMatrix<index_t>());
169 gsVector<int> processed(maxLvl);
171 for (
int pt = 0; pt != u.cols(); pt++)
175 for (
int ind = 0; ind != indices.rows(); ind++)
177 unsigned index = indices(ind, pt);
178 if (ind != 0 && index == 0)
181 unsigned lvl = getPresLevelOfBasisFun(index);
183 if (processed(lvl) == 0)
185 this->
m_bases[lvl]->eval_into(u.col(pt), tmpResults[lvl]);
186 this->
m_bases[lvl]->active_into(u.col(pt), tmpActive[lvl]);
190 if (m_is_truncated[index] == -1)
194 for (
int row = 0; row != tmpActive[lvl].rows(); ++row)
196 if (tmpActive[lvl](row, 0) == flatTenIndx)
202 result(ind, pt) = tmpResults[lvl](localIndex, 0);
206 const gsMatrix<T>&
basis = tmpResults[lvl];
207 const gsMatrix<index_t>&
active = tmpActive[lvl];
210 const gsSparseVector<T>& coefs =
getCoefs(index);
212 for (
int i = 1; i < active.rows(); i++)
216 result(ind, pt) = tmp;
223 void fastDeriv_into(
const gsMatrix<T>& u,
224 gsMatrix<T>& result)
const
226 gsMatrix<index_t> indices;
229 result.setZero(indices.rows() * d, u.cols());
231 const unsigned maxLvl = this->
m_tree.getMaxInsLevel() + 1;
232 std::vector< gsMatrix<T> > tmpDeriv( maxLvl, gsMatrix<T>());
233 std::vector< gsMatrix<index_t> > tmpActive(maxLvl, gsMatrix<index_t>());
234 gsVector<int> processed(maxLvl);
236 for (
index_t pt = 0; pt != u.cols(); pt++)
240 for (
int ind = 0; ind != indices.rows(); ind++)
242 index_t index = indices(ind, pt);
243 if (ind != 0 && index == 0)
246 unsigned lvl = getPresLevelOfBasisFun(index);
248 if (processed(lvl) == 0)
250 this->
m_bases[lvl]->deriv_into(u.col(pt), tmpDeriv[lvl]);
251 this->
m_bases[lvl]->active_into(u.col(pt), tmpActive[lvl]);
255 if (m_is_truncated[index] == -1)
259 for (
int row = 0; row != tmpActive[lvl].rows(); ++row)
261 if (tmpActive[lvl](row, 0) == flatTenIndx)
268 result.block(ind * d, pt, d, 1) =
269 tmpDeriv[lvl].block(localIndex * d, 0, d, 1);
273 const gsMatrix<T>& basis = tmpDeriv[lvl];
274 const gsMatrix<index_t>& active = tmpActive[lvl];
275 const gsSparseVector<T>& coefs =
getCoefs(index);
279 for (
index_t i = 0; i != active.rows(); ++i)
281 result(ind * d +
dim, pt) +=
291 void fastDeriv2_into(
const gsMatrix<T>& u,
292 gsMatrix<T>& result)
const
294 gsMatrix<index_t> indices;
296 const unsigned numDers = (d * (d + 1)) / 2;
298 result.setZero(indices.rows() * numDers, u.cols());
300 const unsigned maxLvl = this->
m_tree.getMaxInsLevel() + 1;
301 std::vector< gsMatrix<T> > tmpDeriv2(maxLvl, gsMatrix<T>());
302 std::vector< gsMatrix<index_t> > tmpActive(maxLvl, gsMatrix<index_t>());
303 gsVector<int> processed(maxLvl);
305 for (
int pt = 0; pt != u.cols(); pt++)
309 for (
int ind = 0; ind != indices.rows(); ind++)
312 unsigned index = indices(ind, pt);
313 if (ind != 0 && index == 0)
316 unsigned lvl = getPresLevelOfBasisFun(index);
318 if (processed(lvl) == 0)
320 this->
m_bases[lvl]->deriv2_into(u.col(pt), tmpDeriv2[lvl]);
321 this->
m_bases[lvl]->active_into(u.col(pt), tmpActive[lvl]);
325 if (m_is_truncated[index] == -1)
329 for (
int row = 0; row != tmpActive[lvl].rows(); ++row)
331 if (tmpActive[lvl](row, 0) == flatTenIndx)
338 result.block(ind * numDers, pt, numDers, 1) =
339 tmpDeriv2[lvl].block(localIndx * numDers, 0, numDers, 1);
343 const gsMatrix<T>& basis = tmpDeriv2[lvl];
344 const gsMatrix<index_t>& active = tmpActive[lvl];
345 const gsSparseVector<T>& coefs =
getCoefs(index);
347 for (
unsigned der = 0; der != numDers; der++)
349 for (
index_t i = 0; i != active.rows(); ++i)
351 result(ind * numDers + der, pt) +=
353 basis(i * numDers + der, 0);
362 void eval_into(
const gsMatrix<T> & u, gsMatrix<T>& result)
const;
371 using gsBasis<T>::eval_into;
375 {
return m_presentation.size(); }
377 bool isTruncated(
unsigned i)
const
379 return (this->m_is_truncated[i] != -1);
383 typename std::map<index_t, gsSparseVector<T> >::const_iterator
truncatedBegin()
const
384 {
return m_presentation.begin(); }
387 typename std::map<index_t, gsSparseVector<T> >::const_iterator
truncatedEnd()
const
388 {
return m_presentation.end(); }
393 if (this->m_is_truncated[i] == -1)
395 GISMO_ERROR(
"This basis function has no sparse representation. "
396 "It is not truncated.");
400 return this->m_presentation.find(i)->second;
413 return (m_is_truncated[index] == -1 ?
414 this->
levelOf(index) : m_is_truncated[index] );
429 const unsigned pres_level,
430 const gsVector<index_t, d>& finest_low,
431 const gsVector<index_t, d>& finest_high);
446 const gsVector<index_t, d>& act_size_of_coefs,
448 const unsigned pres_level,
449 const gsVector<index_t, d>& finest_low);
463 const unsigned level,
464 const gsVector<index_t, d>& fin_low,
465 const unsigned new_level);
481 const gsVector<index_t, d>& act_size_of_coefs,
482 const gsVector<index_t, d>& size_of_coefs,
483 const unsigned level,
484 const gsVector<index_t, d>& bspl_vec_ti,
485 const unsigned bspl_vec_ti_level,
486 const gsVector<index_t, d>& finest_low);
503 const unsigned flevel,
504 const gsVector<index_t, d>& finest_low,
505 const gsVector<index_t, d>& finest_high,
506 gsVector<index_t, d>& size_of_coefs);
516 std::ostream &
print(std::ostream &os)
const
524 GISMO_MAKE_GEOMETRY_NEW
573 std::vector<std::vector<std::vector< std::vector<T> > > >& trim_curves)
const;
582 std::vector<std::vector<std::vector< std::vector<T> > > >& trim_curves)
const;
589 void getConnectedComponents(std::vector<std::vector<std::vector< std::vector<index_t> > > >& connectedComponents,
gsVector<index_t>& level)
const;
603 void decomposeDomain(
typename gsTHBSplineBasis::AxisAlignedBoundingBox& boundaryAABB,
604 typename gsTHBSplineBasis::TrimmingCurves& trimCurves)
const;
611 const unsigned level,
661 const std::vector<index_t>& secondBox)
const
663 return secondBox[0] < firstBox[0] && secondBox[1] < firstBox[1] &&
664 firstBox[2] < secondBox[2] && firstBox[3] < secondBox[3];
672 const std::vector<index_t>& secondBox)
const
674 return firstBox[0] == secondBox[0] && firstBox[1] == secondBox[1] &&
675 firstBox[2] == secondBox[2] && firstBox[3] == secondBox[3];
686 void breakCycles(
typename gsTHBSplineBasis::AxisAlignedBoundingBox& aabb,
687 typename gsTHBSplineBasis::Polylines& polylines)
const;
696 std::pair<T, T>& pt)
const;
711 const std::pair<T, T>& pt,
712 std::vector< std::vector<T> >& part1,
713 std::vector< std::vector<T> >& part2)
const;
717 void findNewAABB(
const std::vector< std::vector<T> >& polyline,
718 std::vector<index_t>& aabb)
const;
724 typename util::enable_if<dd==2,void>::type
733 typename util::enable_if<dd!=2,void>::type
742 typename util::enable_if<dd==2,gsTensorBSpline<d,T> >::type
743 getBSplinePatch_impl(
const std::vector<index_t>& boundingBox,
744 const unsigned level,
745 const gsMatrix<T>& geomCoefs)
const;
748 typename util::enable_if<dd!=2,gsTensorBSpline<d,T> >::type
749 getBSplinePatch_impl(
const std::vector<index_t>&,
759 gsVector<int> m_is_truncated;
767 std::map<index_t, gsSparseVector<T> > m_presentation;
769 using gsHTensorBasis<d,T>::m_bases;
770 using gsHTensorBasis<d,T>::m_xmatrix;
771 using gsHTensorBasis<d,T>::m_xmatrix_offset;
772 using gsHTensorBasis<d,T>::m_deg;
778 #ifdef GISMO_WITH_PYBIND11
783 void pybind11_init_gsTHBSplineBasis2(pybind11::module &m);
784 void pybind11_init_gsTHBSplineBasis3(pybind11::module &m);
785 void pybind11_init_gsTHBSplineBasis4(pybind11::module &m);
787 #endif // GISMO_WITH_PYBIND11
791 #ifndef GISMO_BUILD_LIB
792 #include GISMO_HPP_HEADER(gsTHBSplineBasis.hpp)
void _saveNewBasisFunPresentation(const gsMatrix< T > &coefs, const gsVector< index_t, d > &act_size_of_coefs, const unsigned j, const unsigned pres_level, const gsVector< index_t, d > &finest_low)
Saves a presentation of the j-th basis function. Presentation is given by the coefficients coefs...
Definition: gsTHBSplineBasis.hpp:241
Provides definition of HTensorBasis abstract interface.
bool manualLevels() const
Returns true if levels are assigned manually.
Definition: gsHTensorBasis.h:332
index_t flatTensorIndexOf(const index_t i) const
Returns the tensor index of the function indexed i (in continued indices).
Definition: gsHTensorBasis.h:932
memory::shared_ptr< gsTHBSplineBasis > Ptr
Shared pointer for gsTHBSplineBasis.
Definition: gsTHBSplineBasis.h:50
void deriv_into(const gsMatrix< T > &u, gsMatrix< T > &result) const
Evaluates the first partial derivatives of the nonzero basis function.
Definition: gsTHBSplineBasis.hpp:1568
void _representBasisFunction(const unsigned j, const unsigned pres_level, const gsVector< index_t, d > &finest_low, const gsVector< index_t, d > &finest_high)
Computes representation of j-th basis function on pres_level and saves it.
Definition: gsTHBSplineBasis.hpp:143
A truncated hierarchical B-Spline function, in d dimensions.
Definition: gsTHBSpline.h:37
void deriv2Single_into(index_t i, const gsMatrix< T > &u, gsMatrix< T > &result) const
Evaluate the (partial) derivatives of the i-th basis function at points u into result.
Definition: gsTHBSplineBasis.hpp:1486
#define GISMO_NO_IMPLEMENTATION
Definition: gsDebug.h:129
void evalAllDers_into(const gsMatrix< T > &u, int n, std::vector< gsMatrix< T > > &result, bool sameElement=false) const
Evaluate the nonzero functions and their derivatives up to order n at points u into result...
Definition: gsTHBSplineBasis.hpp:1673
void eval_into(const gsMatrix< T > &u, gsMatrix< T > &result) const
Evaluates nonzero basis functions at point u into result.
Definition: gsTHBSplineBasis.hpp:1510
gsMultiPatch< T > getBsplinePatchesToMultiPatch_trimming(const gsMatrix< T > &geom_coef, std::vector< std::vector< std::vector< std::vector< T > > > > &trim_curves) const
Return a multipatch structure of B-splines.
Definition: gsTHBSplineBasis.hpp:887
unsigned _basisFunIndexOnLevel(const gsVector< index_t, d > &index, const unsigned level, const gsVector< index_t, d > &fin_low, const unsigned new_level)
Computes tensor index of a basis function on a finer level (new_level) which is presented with tensor...
Definition: gsTHBSplineBasis.hpp:300
void breakPolylineIntoTwoParts(const std::vector< std::vector< T > > &polyline, const index_t segment, const std::pair< T, T > &pt, std::vector< std::vector< T > > &part1, std::vector< std::vector< T > > &part2) const
Breaks polyline into two parts.
Definition: gsTHBSplineBasis.hpp:2189
void deriv2_into(const gsMatrix< T > &u, gsMatrix< T > &result) const
Evaluate the second derivatives of all active basis function at points u.
Definition: gsTHBSplineBasis.hpp:1541
gsMatrix< index_t > active(const gsMatrix< T > &u) const
Returns the indices of active (nonzero) functions at points u, as a list of indices.
Definition: gsFunctionSet.h:453
#define short_t
Definition: gsConfig.h:35
A tensor product of d B-spline functions, with arbitrary target dimension.
Definition: gsTensorBSpline.h:44
util::conditional< d==1, gsConstantBasis< T >, gsTHBSplineBasis< static_cast< short_t >d-1), T > >::type BoundaryBasisType
Associated Boundary basis type.
Definition: gsTHBSplineBasis.h:57
const gsSparseVector< T > & getCoefs(unsigned i) const
Returns sparse representation of the i-th basis function.
Definition: gsTHBSplineBasis.h:391
short_t domainDim() const
Returns the dimension of the parameter space.
Definition: gsTHBSplineBasis.h:511
void findNewAABB(const std::vector< std::vector< T > > &polyline, std::vector< index_t > &aabb) const
Finds new axis aligned bounding box for given polyline.
Definition: gsTHBSplineBasis.hpp:2243
std::map< index_t, gsSparseVector< T > >::const_iterator truncatedBegin() const
Returns an iterator to the representation of the first truncated basis function.
Definition: gsTHBSplineBasis.h:383
gsTHBSpline< d, T > GeometryType
Associated geometry type.
Definition: gsTHBSplineBasis.h:39
Provides declaration of THBSplineBasis class.
std::vector< tensorBasis * > m_bases
The list of nested spaces.
Definition: gsHTensorBasis.h:361
void _truncate(gsMatrix< T > &coefs, const gsVector< index_t, d > &act_size_of_coefs, const gsVector< index_t, d > &size_of_coefs, const unsigned level, const gsVector< index_t, d > &bspl_vec_ti, const unsigned bspl_vec_ti_level, const gsVector< index_t, d > &finest_low)
Performs truncation.
Definition: gsTHBSplineBasis.hpp:339
gsHTensorBasis()
Default empty constructor.
Definition: gsHTensorBasis.h:113
#define index_t
Definition: gsConfig.h:32
void printBasic(std::ostream &os=gsInfo) const
Prints the spline-space hierarchy.
Definition: gsHTensorBasis.h:560
void evalSingle_into(index_t i, const gsMatrix< T > &u, gsMatrix< T > &result) const
Evaluate the i-th basis function at points u into result.
Definition: gsTHBSplineBasis.hpp:1462
This class is derived from std::vector, and adds sort tracking.
Definition: gsSortedVector.h:109
void breakCycles(typename gsTHBSplineBasis::AxisAlignedBoundingBox &aabb, typename gsTHBSplineBasis::Polylines &polylines) const
Breaks the cycles of polylines and returns updated polylines.
Definition: gsTHBSplineBasis.hpp:2101
A tensor product B-spline basis.
Definition: gsTensorBSplineBasis.h:36
bool areBoxesTheSame(const std::vector< index_t > &firstBox, const std::vector< index_t > &secondBox) const
Checks if the boxes are the same.
Definition: gsTHBSplineBasis.h:671
BoundaryBasisType * basisSlice(index_t dir_fixed, T par) const
Gives back the basis at a slice in dir_fixed at par.
Definition: gsTHBSplineBasis.hpp:76
void decomposeDomain(typename gsTHBSplineBasis::AxisAlignedBoundingBox &boundaryAABB, typename gsTHBSplineBasis::TrimmingCurves &trimCurves) const
Decomposes domain of the THB-Spline-Basis into partitions.
Definition: gsTHBSplineBasis.hpp:1951
index_t identifyCycle(const std::vector< std::vector< T > > &polyline, std::pair< T, T > &pt) const
Identify if the polyline can be split into two cycles.
Definition: gsTHBSplineBasis.hpp:2141
void globalRefinement(const gsMatrix< T > &thbCoefs, int level, gsMatrix< T > &lvlCoefs) const
Returns a representation of thbCoefs as tensor-product B-spline coefficientes lvlCoefs at level level...
Definition: gsTHBSplineBasis.hpp:1037
Class representing a (scalar) hierarchical tensor basis of functions .
Definition: gsHTensorBasis.h:74
std::map< index_t, gsSparseVector< T > >::const_iterator truncatedEnd() const
Returns an iterator past the last truncated basis function.
Definition: gsTHBSplineBasis.h:387
void update_structure()
Initialize the characteristic and coefficient matrices and the internal bspline representations.
Definition: gsTHBSplineBasis.h:619
const gsBasis< T > & basis(const index_t k) const
Helper which casts and returns the k-th piece of this function set as a gsBasis.
Definition: gsFunctionSet.hpp:33
unsigned _updateSizeOfCoefs(const unsigned clevel, const unsigned flevel, const gsVector< index_t, d > &finest_low, const gsVector< index_t, d > &finest_high, gsVector< index_t, d > &size_of_coefs)
We get current size of the coefficients. Function updates this sizes accordingly to the refinement fr...
Definition: gsTHBSplineBasis.hpp:424
memory::unique_ptr< gsTHBSplineBasis > uPtr
Unique pointer for gsTHBSplineBasis.
Definition: gsTHBSplineBasis.h:53
void getBsplinePatches(const gsMatrix< T > &geom_coef, gsMatrix< T > &cp, gsMatrix< index_t > &b1, gsMatrix< index_t > &b2, gsVector< index_t > &level, gsMatrix< index_t > &nvertices) const
Return the list of B-spline patches to represent a THB-spline geometry.
Definition: gsTHBSplineBasis.hpp:522
gsTensorBSpline< d, T > getBSplinePatch(const std::vector< index_t > &boundingBox, const unsigned level, const gsMatrix< T > &geomCoefs) const
Returns a tensor B-Spline patch defined by boundingBox.
Definition: gsTHBSplineBasis.hpp:2094
unsigned numTruncated() const
Returns the number of truncated basis functions.
Definition: gsTHBSplineBasis.h:374
void transferbyLvl(std::vector< gsSparseMatrix< T > > &result)
returns transfer matrices betweend the levels of the given hierarchical spline
Definition: gsTHBSplineBasis.hpp:2311
Container class for a set of geometry patches and their topology, that is, the interface connections ...
Definition: gsMultiPatch.h:33
Struct which represents a certain side of a box.
Definition: gsBoundary.h:84
GISMO_MAKE_GEOMETRY_NEW void getBsplinePatchGlobal(gsVector< index_t > b1, gsVector< index_t > b2, unsigned level, const gsMatrix< T > &geom_coef, gsMatrix< T > &cp, gsKnotVector< T > &k1, gsKnotVector< T > &k2) const
Returns the B-spline representation of a THB-spline subpatch.
Definition: gsTHBSplineBasis.hpp:2085
virtual void update_structure()
Updates the basis structure (eg. charact. matrices, etc), to be called after any modifications.
Definition: gsHTensorBasis.hpp:1308
virtual short_t dim() const
Returns the dimension of the parameter space.
Definition: gsHTensorBasis.h:431
void derivSingle_into(index_t i, const gsMatrix< T > &u, gsMatrix< T > &result) const
Evaluates the (partial) derivatives of the i-th basis function at points u into result.
Definition: gsTHBSplineBasis.hpp:1593
gsTHBSplineBasis(gsBasis< T > const &tbasis, bool manualLevels=false)
Constructor out of a tensor BSpline Basis.
Definition: gsTHBSplineBasis.h:106
hdomain_type m_tree
The tree structure of the index space.
Definition: gsHTensorBasis.h:380
index_t levelOf(index_t i) const
Returns the level of the function indexed i (in continued indices)
Definition: gsHTensorBasis.h:817
void getBsplinePatches_trimming(const gsMatrix< T > &geom_coef, gsMatrix< T > &cp, gsMatrix< index_t > &b1, gsMatrix< index_t > &b2, gsVector< index_t > &level, gsMatrix< index_t > &nvertices, std::vector< std::vector< std::vector< std::vector< T > > > > &trim_curves) const
Return the list of B-spline patches to represent a THB-spline geometry.
Definition: gsTHBSplineBasis.hpp:717
gsMultiPatch< T > getBsplinePatchesToMultiPatch(const gsMatrix< T > &geom_coef) const
Return a multipatch structure of B-splines.
Definition: gsTHBSplineBasis.hpp:579
#define GISMO_ERROR(message)
Definition: gsDebug.h:118
Class for representing a knot vector.
Definition: gsKnotVector.h:79
gsMatrix< index_t > boundaryOffset(boxSide const &s, index_t offset) const
Definition: gsTHBSplineBasis.hpp:32
gsSparseMatrix< T > coarsening(const std::vector< gsSortedVector< index_t > > &old, const std::vector< gsSortedVector< index_t > > &n, const gsSparseMatrix< T, RowMajor > &transfer) const
returns a transfer matrix using the characteristic matrix of the old and new basis ...
Definition: gsTHBSplineBasis.hpp:2356
void transfer(const std::vector< gsSortedVector< index_t > > &old, gsSparseMatrix< T > &result)
Returns transfer matrix between the hirarchical spline given by the characteristic matrix "old" and t...
Definition: gsHTensorBasis.hpp:1735
void representBasis()
Computes and saves representation of all basis functions.
Definition: gsTHBSplineBasis.hpp:96
Truncated hierarchical B-spline basis.
Definition: gsTHBSplineBasis.h:35
bool isFirstBoxCompletelyInsideSecond(const std::vector< index_t > &firstBox, const std::vector< index_t > &secondBox) const
Checks if the first box is completely inside second box.
Definition: gsTHBSplineBasis.h:660
Sparse vector class, based on gsEigen::SparseVector.
Definition: gsSparseVector.h:34
BoundaryBasisType::uPtr boundaryBasis(boxSide const &s)
Gives back the boundary basis at boxSide s.
void active_into(const gsMatrix< T > &u, gsMatrix< index_t > &result) const
Returns the indices of active basis functions at points u, as a list of indices, in result...
Definition: gsTHBSplineBasis.hpp:1417
A basis represents a family of scalar basis functions defined over a common parameter domain...
Definition: gsBasis.h:78
std::ostream & print(std::ostream &os) const
Prints the object as a string.
Definition: gsTHBSplineBasis.h:516