G+Smo  25.01.0
Geometry + Simulation Modules
 
Loading...
Searching...
No Matches
gsMultiBasis.h
Go to the documentation of this file.
1
14#pragma once
15
16#include <gsCore/gsGeometry.h>
17#include <gsCore/gsBasis.h>
18#include <gsCore/gsDofMapper.h>
22
23
24namespace gismo
25{
26
35template<class T>
36class gsMultiBasis : public gsFunctionSet<T>
37{
38public:
39 typedef gsFunctionSet<T> Base;
40
41 typedef memory::shared_ptr<gsMultiBasis> Ptr;
42 typedef memory::unique_ptr<gsMultiBasis> uPtr;
43
44 typedef std::vector<gsBasis<T> *> BasisContainer;
45
46public:
47
49 typedef typename BasisContainer::iterator iterator;
50 typedef typename BasisContainer::const_iterator const_iterator;
51
52 typedef gsBasis<T> & reference;
53 typedef const gsBasis<T> & const_reference;
54
55public:
56
59
69 explicit gsMultiBasis( const gsMultiPatch<T> & mpatch,
70 bool numeratorOnly = false);
71
73 gsMultiBasis(BasisContainer& bases, const gsBoxTopology & topology)
74 : m_topology( topology )
75 {
76 m_bases.swap(bases);// consumes the pointers
77 }
78
80 gsMultiBasis( const gsBasis<T> & geo, bool numeratorOnly = false);
81
83 gsMultiBasis( BasisContainer & bases,
84 const std::vector<patchSide>& boundary,
85 const std::vector<boundaryInterface>& interfaces )
86 : m_topology( bases[0]->dim(), bases.size(), boundary, interfaces )
87 {
88 m_bases.swap(bases);// consumes the pointers
89 }
90
93
95 gsMultiBasis( const gsMultiBasis& other );
96
97#if EIGEN_HAS_RVALUE_REFERENCES
99 gsMultiBasis(gsMultiBasis&& other) : m_bases(give(other.m_bases)), m_topology(give(other.m_topology)) {}
100
102 gsMultiBasis& operator= ( const gsMultiBasis& other );
103
106 {
107 freeAll(m_bases);
108 m_bases = give(other.m_bases);
109 m_topology = give(other.m_topology);
110 return *this;
111 }
112#else
115 {
116 this->swap( other );
117 return *this;
118 }
119#endif
120
121 GISMO_CLONE_FUNCTION(gsMultiBasis)
122
123public:
124
127 const_iterator begin() const
128 {
129 return m_bases.begin();
130 }
131
134 const_iterator end() const
135 {
136 return m_bases.end();
137 }
138
142 return m_bases.begin();
143 }
144
148 return m_bases.end();
149 }
150
152 void clear()
153 {
154 m_topology.clearAll();
155 m_bases .clear();
156 }
157
158 const gsBoxTopology & topology() const { return m_topology; }
159
160public:
161
163 const_reference at(size_t i) const
164 {return *m_bases.at(i);}
165
166 //reference at(size_t i)
167 //{return *m_bases.at(i);}
168
169 const_reference operator[](size_t i) const
170 {return *m_bases[i];}
171
172 reference operator[](size_t i)
173 {return *m_bases[i];}
174
175 // reference front()
176 // {return *m_bases.front();}
177
178 const_reference front() const
179 {return *m_bases.front();}
180
181 // reference back()
182 // {return *m_bases.back();}
183
184 const_reference back() const
185 {return *m_bases.back();}
186
187 void pop_back()
188 {m_bases.pop_back();}
189
190public:
191
192 short_t domainDim () const {return m_bases.empty() ? 0 : m_bases.front()->domainDim();}
193
194 short_t targetDim () const {return m_bases.empty() ? 0 : m_bases.front()->targetDim();}
195
197 void swap(gsMultiBasis& other)
198 {
199 m_topology.swap( other.m_topology );
200
201 m_bases.swap( other.m_bases );
202 }
203
205 std::ostream& print( std::ostream& os ) const;
206
208 short_t dim() const { return m_bases[0]->dim();}
209
212 short_t degree(size_t i = 0, short_t comp = 0) const
213 {
214 GISMO_ASSERT( i < m_bases.size(),
215 "Invalid patch index "<<i<<" requested from gsMultiBasis" );
216 return m_bases[i]->degree(comp);
217 }
218
220 short_t maxDegree(short_t k) const;
221
223 short_t minDegree(short_t k) const;
224
226 short_t maxCwiseDegree() const;
227
229 short_t minCwiseDegree() const;
230
232 int size(size_t i) const
233 {
234 GISMO_ASSERT( i < m_bases.size(),
235 "Invalid patch index "<<i<<" requested from gsMultiBasis" );
236 return m_bases[i]->size();
237 }
238
239 index_t size() const
240 {
241 //GISMO_ERROR("call gsMultiBasis::nBases() instead.");
242 return totalSize();
243 }
244
246 size_t totalSize() const
247 {
248 size_t sum = 0;
249 for (size_t k = 0; k < m_bases.size(); ++k)
250 sum += m_bases[k]->size();
251 return sum;
252 }
253
255 size_t totalElements() const
256 {
257 size_t sum = 0;
258 for (size_t k = 0; k < m_bases.size(); ++k)
259 sum += m_bases[k]->numElements();
260 return sum;
261 }
262
264 size_t nBases() const { return m_bases.size(); }
265
267 const gsBasis<T> & basis(const size_t i ) const
268 {
269 GISMO_ASSERT( i < m_bases.size(),
270 "Invalid patch index"<<i<<" requested from gsMultiBasis" );
271 return *m_bases[i];
272 }
273
274 const gsBasis<T> & piece(const index_t i) const
275 {
276 GISMO_ASSERT( static_cast<size_t>(i) < m_bases.size(),
277 "Invalid patch index"<<i<<" requested from gsMultiBasis" );
278 return *m_bases[i];
279 }
280
282 index_t nPieces() const { return static_cast<index_t>(m_bases.size()); }
283
285 gsBasis<T> & basis(const size_t i )
286 {
287 GISMO_ASSERT( i < m_bases.size(),
288 "Invalid patch index"<<i<<" requested from gsMultiBasis" );
289 return *m_bases[i];
290 }
291
293 void addBasis( gsBasis<T> * g );
294
296 void addBasis(typename gsBasis<T>::uPtr g);
297
299 int findBasisIndex( gsBasis<T>* g ) const;
300
305 void addInterface( gsBasis<T>* g1, boxSide s1,
306 gsBasis<T>* g2, boxSide s2 );
307
310 {
311 const int p =findBasisIndex( g );
312 m_topology.addBoundary( patchSide( p, s ) );
313 }
314
318 void uniformRefine(int numKnots = 1, int mul = 1, int dir = -1)
319 {
320 for (size_t k = 0; k < m_bases.size(); ++k)
321 {
322 m_bases[k]->uniformRefine(numKnots,mul,dir);
323 }
324 }
325
335 static void combineTransferMatrices(
336 const std::vector< gsSparseMatrix<T, RowMajor> >& localTransferMatrices,
337 const gsDofMapper& coarseMapper,
338 const gsDofMapper& fineMapper,
339 gsSparseMatrix<T, RowMajor>& transferMatrix
340 );
341
355 const gsBoundaryConditions<T>& boundaryConditions,
356 const gsOptionList& assemblerOptions,
357 int numKnots = 1,
358 int mul = 1,
359 index_t unk = 0
360 );
361
364 void uniformRefineComponent(int comp, int numKnots = 1, int mul = 1)
365 {
366 for (size_t k = 0; k < m_bases.size(); ++k)
367 {
368 m_bases[k]->component(comp).uniformRefine(numKnots,mul);
369 }
370 }
371
372 // @brief Refine the boxes defined by "boxes"
373 void refine(int k, gsMatrix<T> const & boxes)
374 {
375 m_bases[k]->refine(boxes);
376 }
377
378 // @brief Refine the boxes defined by "boxes"
379 void unrefine(int k, gsMatrix<T> const & boxes)
380 {
381 m_bases[k]->unrefine(boxes);
382 }
383
388 void refineElements(int k, std::vector<index_t> const & boxes)
389 {
390 m_bases[k]->refineElements(boxes);
391 }
392
393 void unrefineElements(int k, std::vector<index_t> const & boxes)
394 {
395 m_bases[k]->unrefineElements(boxes);
396 }
397
402 void refine(size_t k, gsMatrix<T> const & boxes, int refExt)
403 {
404 GISMO_ASSERT( k < m_bases.size(),
405 "Invalid patch index "<<k<<" requested from gsMultiBasis" );
406 m_bases[k]->refine( boxes, refExt);
407 }
408 void unrefine(size_t k, gsMatrix<T> const & boxes, int refExt)
409 {
410 GISMO_ASSERT( k < m_bases.size(),
411 "Invalid patch index "<<k<<" requested from gsMultiBasis" );
412 m_bases[k]->unrefine( boxes, refExt);
413 }
414
418 void uniformCoarsen(int numKnots = 1)
419 {
420 for (size_t k = 0; k < m_bases.size(); ++k)
421 {
422 m_bases[k]->uniformCoarsen(numKnots);
423 }
424 }
425
439 const gsBoundaryConditions<T>& boundaryConditions,
440 const gsOptionList& assemblerOptions,
441 int numKnots = 1,
442 index_t unk = 0
443 );
444
447 { return m_bases[p.patch()]->componentBasis(p); }
448
458 const gsDofMapper& dm,
459 gsMatrix<index_t>& indices,
460 bool no_lower = true
461 ) const;
462
470 std::vector<typename gsBasis<T>::uPtr> componentBasis_withIndices(
471 const std::vector<patchComponent>& pc,
472 const gsDofMapper& dm,
473 gsMatrix<index_t>& indices,
474 bool no_lower = true
475 ) const;
476
485 void repairInterfaces( const std::vector< boundaryInterface > & bivec )
486 {
487 size_t kmax = 2*bivec.size();
488 size_t k = 0;
489 bool sthChanged = false;
490 bool change = false;
491 do
492 {
493 sthChanged = false;
494 for( size_t i = 0; i < bivec.size(); i++ )
495 {
496 if ( bivec[i].type() != interaction::contact)
497 {
498 change = repairInterface( bivec[i] );
499 sthChanged = sthChanged || change;
500 }
501 }
502 k++; // just to be sure this cannot go on infinitely
503 }
504 while( sthChanged && k <= kmax );
505 }
506
513 bool repairInterface2d( const boundaryInterface & bi );
514
523 bool repairInterface( const boundaryInterface & bi );
524
548 template<short_t d>
550 std::vector<index_t> & refEltsFirst,
551 std::vector<index_t> & refEltsSecond );
552
554 void degreeElevate(short_t const i = 1, short_t const dir = -1)
555 {
556 for (size_t k = 0; k < m_bases.size(); ++k)
557 m_bases[k]->degreeElevate(i,dir);
558 }
559
562 void degreeIncrease(short_t const i = 1, short_t const dir = -1)
563 {
564 for (size_t k = 0; k < m_bases.size(); ++k)
565 m_bases[k]->degreeIncrease(i,dir);
566 }
567
570 void degreeDecrease(short_t const i = 1, short_t const dir = -1)
571 {
572 for (size_t k = 0; k < m_bases.size(); ++k)
573 m_bases[k]->degreeDecrease(i,dir);
574 }
575
577 void degreeReduce(short_t const i = 1)
578 {
579 for (size_t k = 0; k < m_bases.size(); ++k)
580 m_bases[k]->degreeReduce(i);
581 }
582
584 void setDegree(short_t const& i)
585 {
586 for (size_t k = 0; k < m_bases.size(); ++k)
587 m_bases[k]->setDegree(i);
588 }
589
591 void reduceContinuity(int const i = 1)
592 {
593 for (size_t k = 0; k < m_bases.size(); ++k)
594 m_bases[k]->reduceContinuity(i);
595 }
596
597 BasisContainer & patchBases()
598 {
599 return m_bases;
600 }
601
602 const BasisContainer & patchBases() const
603 {
604 return m_bases;
605 }
606
607 void setTopology(const gsBoxTopology & tpl)
608 {
609 m_topology = tpl;
610 }
611
612
613 void getMapper(bool conforming,
614 const gsBoundaryConditions<T> & bc,
615 int unk,
616 gsDofMapper & mapper,
617 bool finalize = true) const;
618
619 void getMapper(bool conforming,
620 const gsBoundaryConditions<T> & bc,
621 gsDofMapper & mapper,
622 bool finalize = true) const
623 { getMapper(conforming, bc, 0, mapper, finalize); }
624
625 void getMapper(iFace::strategy is,
626 const gsBoundaryConditions<T> & bc,
627 gsDofMapper & mapper,
628 int unk,
629 bool finalize = true) const
630 { getMapper(is==iFace::glue, bc, unk, mapper, finalize); }
631
632 void getMapper(dirichlet::strategy ds,
633 iFace::strategy is,
634 const gsBoundaryConditions<T> & bc,
635 gsDofMapper & mapper,
636 int unk,
637 bool finalize = true) const
638 {
639 if ( ds == dirichlet::elimination )
640 getMapper(is==iFace::glue, bc, unk, mapper, finalize);
641 else
642 getMapper(is==iFace::glue, mapper, finalize);
643 }
644
645 gsDofMapper getMapper(dirichlet::strategy ds,
646 iFace::strategy is,
647 const gsBoundaryConditions<T> & bc,
648 int unk,
649 bool finalize = true) const
650 {
651 gsDofMapper mapper;
652 if ( ds == dirichlet::elimination )
653 getMapper(is==iFace::glue, bc, unk, mapper, finalize);
654 else
655 getMapper(is==iFace::glue, mapper, finalize);
656 return mapper;
657 }
658
659
660 // to remove
661 void getMapper(bool conforming, gsDofMapper & mapper, bool finalize = true) const;
662
663 void getMapper(iFace::strategy is, gsDofMapper & mapper, bool finalize = true) const
664 { getMapper(is==iFace::glue, mapper, finalize); }
665
666
667 //private: // to do
668
690 void matchInterface(const boundaryInterface & bi,
691 gsDofMapper & mapper) const;
692
696
697private:
698
699 BasisContainer m_bases;
700
701 gsBoxTopology m_topology;
702
703}; // class gsMultiBasis
704
705
707template<class T>
708std::ostream& operator<<( std::ostream& os, const gsMultiBasis<T>& b )
709{
710 return b.print( os );
711}
712
713#ifdef GISMO_WITH_PYBIND11
714
718 void pybind11_init_gsMultiBasis(pybind11::module &m);
719
720#endif // GISMO_WITH_PYBIND11
721
722} // namespace gismo
723
724
725#ifndef GISMO_BUILD_LIB
726#include GISMO_HPP_HEADER(gsMultiBasis.hpp)
727#endif
Struct which represents a certain side of a box.
Definition gsBoundary.h:85
A basis represents a family of scalar basis functions defined over a common parameter domain.
Definition gsBasis.h:79
memory::unique_ptr< gsBasis > uPtr
Unique pointer for gsBasis.
Definition gsBasis.h:89
Class containing a set of boundary conditions.
Definition gsBoundaryConditions.h:342
Defines a topological arrangement of a collection of "boxes" (e.g., parameter domains that map to phy...
Definition gsBoxTopology.h:39
void clearAll()
Clear all boxes, boundary and interface data.
Definition gsBoxTopology.h:165
void swap(gsBoxTopology &other)
Swap with another gsBoxTopology.
Definition gsBoxTopology.h:174
void addBoundary(index_t p, boxSide s, std::string l="")
Set side s of box p to a boundary.
Definition gsBoxTopology.h:208
Maintains a mapping from patch-local dofs to global dof indices and allows the elimination of individ...
Definition gsDofMapper.h:69
Interface for the set of functions defined on a domain (the total number of functions in the set equa...
Definition gsFunctionSet.h:219
A matrix with arbitrary coefficient type and fixed or dynamic size.
Definition gsMatrix.h:41
Holds a set of patch-wise bases and their topology information.
Definition gsMultiBasis.h:37
gsMultiBasis()
Default empty constructor.
Definition gsMultiBasis.h:58
bool repairInterface(const boundaryInterface &bi)
Checks if the interface is fully matching, and if not, repairs it.
Definition gsMultiBasis.hpp:428
const gsBasis< T > & piece(const index_t i) const
Returns the piece(s) of the function(s) at subdomain k.
Definition gsMultiBasis.h:274
void addPatchBoundary(gsBasis< T > *g, boxSide s)
Add side s of patch g to the outer boundary of the domain.
Definition gsMultiBasis.h:309
gsBasis< T >::uPtr componentBasis_withIndices(patchComponent pc, const gsDofMapper &dm, gsMatrix< index_t > &indices, bool no_lower=true) const
Returns the basis that corresponds to the component.
Definition gsMultiBasis.hpp:262
gsBasis< T >::uPtr componentBasis(patchComponent p) const
Returns the basis that corresponds to the component.
Definition gsMultiBasis.h:446
void addBasis(gsBasis< T > *g)
Add a basis (ownership of the pointer is also acquired)
Definition gsMultiBasis.hpp:79
gsMultiBasis(BasisContainer &bases, const gsBoxTopology &topology)
Create from a vector of bases and topology.
Definition gsMultiBasis.h:73
void uniformCoarsen(int numKnots=1)
Coarsen every basis uniformly.
Definition gsMultiBasis.h:418
short_t maxCwiseDegree() const
Maximum degree with respect to all variables.
Definition gsMultiBasis.hpp:342
void reduceContinuity(int const i=1)
Reduce the continuity by i.
Definition gsMultiBasis.h:591
const_iterator begin() const
Definition gsMultiBasis.h:127
short_t minCwiseDegree() const
Minimum degree with respect to all variables.
Definition gsMultiBasis.hpp:352
gsMultiBasis & operator=(gsMultiBasis other)
Assignment operator (uses copy-and-swap idiom)
Definition gsMultiBasis.h:114
void degreeElevate(short_t const i=1, short_t const dir=-1)
Elevate the degree of every basis by the given amount. (keeping the smoothness)
Definition gsMultiBasis.h:554
void degreeIncrease(short_t const i=1, short_t const dir=-1)
Increase the degree of every basis by the given amount. (keeping the multiplicity)
Definition gsMultiBasis.h:562
int findBasisIndex(gsBasis< T > *g) const
Search for the given basis and return its index.
Definition gsMultiBasis.hpp:112
size_t totalSize() const
The total number of basis functions in all bases.
Definition gsMultiBasis.h:246
~gsMultiBasis()
Destructor.
Definition gsMultiBasis.hpp:65
void matchInterface(const boundaryInterface &bi, gsDofMapper &mapper) const
Matches the degrees of freedom along an interface.
Definition gsMultiBasis.hpp:415
short_t maxDegree(short_t k) const
Maximum degree with respect to variable k.
Definition gsMultiBasis.hpp:331
const_reference at(size_t i) const
Assess i-th parametric basis.
Definition gsMultiBasis.h:163
int size(size_t i) const
The number of basis functions in basis i.
Definition gsMultiBasis.h:232
const gsBasis< T > & basis(const size_t i) const
Return the i-th basis block.
Definition gsMultiBasis.h:267
short_t dim() const
Dimension of the parameter domain (must match for all bases).
Definition gsMultiBasis.h:208
short_t targetDim() const
Dimension of the target space.
Definition gsMultiBasis.h:194
BasisContainer::iterator iterator
Type definitions.
Definition gsMultiBasis.h:49
void uniformRefineComponent(int comp, int numKnots=1, int mul=1)
Refine the component comp of every basis uniformly by inserting numKnots new knots on each knot span.
Definition gsMultiBasis.h:364
index_t size() const
size
Definition gsMultiBasis.h:239
gsBasis< T > & basis(const size_t i)
Return the i-th basis block.
Definition gsMultiBasis.h:285
bool repairInterface2d(const boundaryInterface &bi)
Checks if the 2D-interface is fully matching, and if not, repairs it.
Definition gsMultiBasis.hpp:692
void setDegree(short_t const &i)
Set the degree of the basis.
Definition gsMultiBasis.h:584
index_t nPieces() const
Number of patch-wise bases.
Definition gsMultiBasis.h:282
short_t domainDim() const
Dimension of the (source) domain.
Definition gsMultiBasis.h:192
static void combineTransferMatrices(const std::vector< gsSparseMatrix< T, RowMajor > > &localTransferMatrices, const gsDofMapper &coarseMapper, const gsDofMapper &fineMapper, gsSparseMatrix< T, RowMajor > &transferMatrix)
This function takes local transfer matrices (per patch) and combines them using given DofMappers to a...
Definition gsMultiBasis.hpp:137
void swap(gsMultiBasis &other)
Swap with another gsMultiBasis.
Definition gsMultiBasis.h:197
void uniformRefine_withTransfer(gsSparseMatrix< T, RowMajor > &transfer, const gsBoundaryConditions< T > &boundaryConditions, const gsOptionList &assemblerOptions, int numKnots=1, int mul=1, index_t unk=0)
Refine every basis uniformly.
Definition gsMultiBasis.hpp:181
void clear()
Clear (delete) all patches.
Definition gsMultiBasis.h:152
iterator end()
Definition gsMultiBasis.h:147
size_t nBases() const
Number of patch-wise bases.
Definition gsMultiBasis.h:264
const_iterator end() const
Definition gsMultiBasis.h:134
void uniformCoarsen_withTransfer(gsSparseMatrix< T, RowMajor > &transfer, const gsBoundaryConditions< T > &boundaryConditions, const gsOptionList &assemblerOptions, int numKnots=1, index_t unk=0)
Coarsen every basis uniformly.
Definition gsMultiBasis.hpp:222
void repairInterfaces(const std::vector< boundaryInterface > &bivec)
Checks if the interfaces bivec are fully matching, and if not, repairs them, i.e.,...
Definition gsMultiBasis.h:485
gsMultiBasis(BasisContainer &bases, const std::vector< patchSide > &boundary, const std::vector< boundaryInterface > &interfaces)
Create from bases and boundary/interface information.
Definition gsMultiBasis.h:83
iterator begin()
Definition gsMultiBasis.h:141
short_t minDegree(short_t k) const
Minimum degree with respect to variable k.
Definition gsMultiBasis.hpp:362
std::ostream & print(std::ostream &os) const
Prints the object as a string.
Definition gsMultiBasis.hpp:71
short_t degree(size_t i=0, short_t comp=0) const
Returns the polynomial degree of basis i in component j, if the basis is of polynomial or piecewise p...
Definition gsMultiBasis.h:212
void refine(size_t k, gsMatrix< T > const &boxes, int refExt)
Refine the are defined by boxes on patch k with extension refExt.
Definition gsMultiBasis.h:402
void uniformRefine(int numKnots=1, int mul=1, int dir=-1)
Refine every basis uniformly.
Definition gsMultiBasis.h:318
size_t totalElements() const
The total number of elements in all patches.
Definition gsMultiBasis.h:255
void degreeReduce(short_t const i=1)
Reduce the degree of the basis by the given amount.
Definition gsMultiBasis.h:577
void addInterface(gsBasis< T > *g1, boxSide s1, gsBasis< T > *g2, boxSide s2)
Add an interface joint between side s1 of geometry g1 side s2 of geometry g2.
Definition gsMultiBasis.hpp:121
void degreeDecrease(short_t const i=1, short_t const dir=-1)
Increase the degree of every basis by the given amount. (keeping the multiplicity)
Definition gsMultiBasis.h:570
bool repairInterfaceFindElements(const boundaryInterface &bi, std::vector< index_t > &refEltsFirst, std::vector< index_t > &refEltsSecond)
Finds the elements that need to be refined in order to repair an interface.
Definition gsMultiBasis.hpp:462
void refineElements(int k, std::vector< index_t > const &boxes)
Refine the are defined by boxes on patch k.
Definition gsMultiBasis.h:388
Container class for a set of geometry patches and their topology, that is, the interface connections ...
Definition gsMultiPatch.h:100
Class which holds a list of parameters/options, and provides easy access to them.
Definition gsOptionList.h:33
Sparse matrix class, based on gsEigen::SparseMatrix.
Definition gsSparseMatrix.h:139
Provides assembler and solver options.
Provides declaration of Basis abstract interface.
Provides gsBoundaryConditions class.
Provides declaration of the BoxTopology class.
#define short_t
Definition gsConfig.h:35
#define index_t
Definition gsConfig.h:32
#define GISMO_ASSERT(cond, message)
Definition gsDebug.h:89
Provides the gsDofMapper class for re-indexing DoFs.
Provides declaration of Geometry abstract interface.
The G+Smo namespace, containing all definitions for the library.
S give(S &x)
Definition gsMemory.h:266
void freeAll(It begin, It end)
Frees all pointers in the range [begin end)
Definition gsMemory.h:312
Struct which represents an interface between two patches.
Definition gsBoundary.h:650
Struct that defines the boundary sides and corners and types of a geometric object.
Definition gsBoundary.h:56
Struct which represents a certain component (interior, face, egde, corner) of a particular patch.
Definition gsBoundary.h:565
Struct which represents a certain side of a patch.
Definition gsBoundary.h:232