G+Smo  25.01.0
Geometry + Simulation Modules
 
Loading...
Searching...
No Matches
gsDPatchBase.h
Go to the documentation of this file.
1
14#pragma once
15
17#include <gsCore/gsMultiPatch.h>
18
19#include <gsIO/gsOptionList.h>
20
23
24// #include <gsUnstructuredSplines/src/gsDPatchBase.hpp>
25
26namespace gismo
27{
28
29
35template<short_t d,class T>
37{
38protected:
39 typedef typename std::vector<std::tuple<index_t,index_t,T>> sparseEntry_t;
40
41public:
42
44 typedef memory::shared_ptr< gsDPatchBase > Ptr;
45
47 typedef memory::unique_ptr< gsDPatchBase > uPtr;
48
54
61 :
62 m_patches(mp),
63 m_Bbases(mb),
64 m_topology(m_Bbases.topology()),
65 m_computed(false)
66 {
67 }
68
70 :
72 {
73 }
74
81 :
82 gsDPatchBase(give(gsMultiBasis<T>(mp)), mp)
83 {
84 }
85
86public:
87//----------------------------------------------------------------------------------------------------------------------------
91 virtual void compute();
92
96 virtual void defaultOptions();
97 // {
98 // GISMO_NO_IMPLEMENTATION;
99 // }
100
101 virtual gsOptionList & options() { return m_options; }
102
103
104//----------------------------------------------------------------------------------------------------------------------------
105// Getters for basis, geometry and map
110 virtual const gsMultiBasis<T> & localBasis() const
111 {
112 return m_bases;
113 }
114
115 virtual void localBasis_into(gsMultiBasis<T> & localBasis) const
116 {
117 localBasis = m_bases;
118 }
119
124 virtual void localGeometry_into(gsMultiPatch<T> & localGeometry)
125 {
126 localGeometry = exportToPatches(m_patches);
127 }
128
133 virtual const gsMultiPatch<T> & getGeometry() const
134 {
135 return m_patches;
136 }
137
142 virtual void globalBasis_into(gsMappedBasis<d,T> & mbasis) const
143 {
144 GISMO_ASSERT(m_computed,"The method has not been computed! Call compute().");
145 gsSparseMatrix<T> matrix = m_matrix.transpose();
146 mbasis.init(m_bases,matrix);
147 gsDebugVar("hi");
148 }
149
154 virtual void globalGeometry_into(const gsMultiPatch<T> & patches, gsMappedSpline<d,T> & mspline)
155 {
156 GISMO_ASSERT(!patches.empty() && patches.nPatches()==m_bases.nBases(),"The reference multipatch is empty!");
157 gsMappedBasis<d,T> mbasis;
158 this->globalBasis_into(mbasis);
159 gsMatrix<T> localCoefs = this->_preCoefficients(patches);
160 mspline.init(mbasis,localCoefs);
161 }
162
163 virtual void globalGeometry_into(gsMappedSpline<d,T> & mspline)
164 {
165 this->globalGeometry_into(m_patches,mspline);
166 }
167
168 virtual void update( gsMappedBasis<d,T> & mbasis ) const
169 {
170 mbasis.init(m_bases,m_matrix.transpose());
171 }
172
180 virtual gsGeometry<T>* exportPatch(index_t patch, bool computeCoefs=true);
181
188 {
189 GISMO_ASSERT(m_computed,"The method has not been computed! Call compute().");
190 GISMO_ASSERT(!patches.empty(),"The reference multipatch is empty!");
191 m_coefs = this->_preCoefficients(patches);
192 m_coefs = m_matrix.transpose() * m_coefs;
193
194 std::vector<gsGeometry<T> *> PatchContainer(patches.nPatches());
195 for (size_t p=0; p!=patches.nPatches(); p++)
196 PatchContainer[p]= this->exportPatch(p,false);
197
198 return gsMultiPatch<T>(PatchContainer,m_topology.boundaries(),m_topology.interfaces());
199 }
200
201 virtual gsMultiPatch<T> exportToPatches()
202 {
203 GISMO_ASSERT(!m_patches.empty(),"The reference multipatch is empty!");
204 return this->exportToPatches(m_patches);
205 }
206
207
214 {
215 matrix = this->matrix();
216 }
217
218 virtual const gsSparseMatrix<T> & Tmatrix() const
219 {
220 return m_tMatrix;
221 }
222
232 virtual const gsSparseMatrix<T> & matrix() const
233 {
234 GISMO_ASSERT(m_computed,"The method has not been computed! Call compute().");
235 return m_matrix;
236 }
237
238//----------------------------------------------------------------------------------------------------------------------------
239// Info functions
245 virtual void mapperInfo() const;
246
254 virtual void vertexInfo(patchCorner corner) const;
255
263 virtual void sideInfo(patchSide side) const;
264
270 virtual void sideInfo() const;
271
277 virtual void cornerInfo() const;
278
279
280 gsMatrix<T> preCoefficients() { return _preCoefficients();};
281
282protected:
283//----------------------------------------------------------------------------------------------------------------------------
284// Pure virtual functions (to be overloaded)
291 virtual gsMatrix<T> _preCoefficients(const gsMultiPatch<T> & patches) = 0;
293 {
294 return _preCoefficients(m_patches);
295 }
296
302 virtual void _initialize();
303
304
308 virtual void _computeMapper();
309
310 virtual void _computeInterfaceMapper(boundaryInterface iface);
311
312 virtual void _computeBoundaryMapper(patchSide boundary);
313
314 virtual void _computeVertexMapper(patchCorner pcorner);
315
319 virtual void _computeSmoothMatrix();
320
321 void _push(sparseEntry_t entries)
322 {
323 index_t rowIdx,colIdx;
324 T weight;
325 for (typename sparseEntry_t::const_iterator it=entries.begin(); it!=entries.end(); it++)
326 {
327 std::tie(rowIdx,colIdx,weight) = *it;
328 m_matrix(rowIdx,colIdx) = weight;
329 }
330 }
331
332 void _pushAndCheck(sparseEntry_t entries)
333 {
334 index_t rowIdx,colIdx;
335 T weight;
336 for (typename sparseEntry_t::const_iterator it=entries.begin(); it!=entries.end(); it++)
337 {
338 std::tie(rowIdx,colIdx,weight) = *it;
339 m_matrix(rowIdx,colIdx) = weight;
340 m_basisCheck[rowIdx] = true;
341 }
342 }
343
373 virtual void _handleVertex(patchCorner pcorner);
374 // interior vertices
375 virtual void _handleInteriorVertex(patchCorner pcorner, index_t valence);
376
385 virtual void _handleInterface(boundaryInterface iface);
393 virtual void _handleBoundary(patchSide side);
399 virtual void _handleInterior();
400
401protected:
407 virtual void _handleRegularCorner(patchCorner pcorner);
408
409 virtual void _handleRegularBoundaryVertexSmooth(patchCorner pcorner, index_t valence);
410
411 virtual void _handleRegularBoundaryVertexNonSmooth(patchCorner pcorner, index_t valence);
412
413 virtual void _handleIrregularBoundaryVertexSmooth(patchCorner pcorner, index_t valence);
414
415 virtual void _handleIrregularBoundaryVertexNonSmooth(patchCorner pcorner, index_t valence);
416
421protected:
422
426 virtual void _makeTHB() = 0;
427
431 virtual void _computeEVs() = 0;
432
433protected:
434 // Boundary vertex of valence 1
435 // template<bool _boundary, index_t _v> // valence=2
436 // virtual typename std::enable_if< _boundary && _v==1, void>::type
437 // SAME
438 virtual void _computeMapperRegularCorner_v1(patchCorner pcorner, index_t valence);
439
440 // Boundary vertex of valence 2 with C1 smoothness
441 // template<bool _boundary, index_t _v, bool _smooth> // valence=2
442 // virtual typename std::enable_if< _boundary && _v==2 && _smooth, void>::type
443 // SAME
444 virtual void _computeMapperRegularBoundaryVertexSmooth_v2(patchCorner pcorner, index_t valence);
445
446 // Boundary vertex of valence 2 with C0 smoothness
447 // template<bool _boundary, index_t _v, bool _smooth> // valence=2
448 // virtual typename std::enable_if< _boundary && _v==2 && (!_smooth), void>::type
449 // DIFFERENT
450 virtual void _computeMapperRegularBoundaryVertexNonSmooth_v2(patchCorner pcorner, index_t valence);
451
452 // Boundary vertex of valence !(1,2,3) with C1 smoothness
453 // template<bool _boundary, index_t _v, bool _smooth>
454 // virtual typename std::enable_if< _boundary && _v==-1 && _smooth, void>::type
455 // DIFFERENT
456 virtual void _computeMapperIrregularBoundaryVertexSmooth_v(patchCorner pcorner, index_t valence);
457
458 // Boundary vertex of valence !(1,2,3) with C0 smoothness
459 // template<bool _boundary, index_t _v, bool _smooth>
460 // virtual typename std::enable_if< _boundary && _v==-1 && (!_smooth), void>::type
461 // DIFFERENT
462 virtual void _computeMapperIrregularBoundaryVertexNonSmooth_v(patchCorner pcorner, index_t valence);
463
464 // Interior vertex
465 // template<bool _boundary, index_t _v>
466 // virtual typename std::enable_if< (!_boundary) && _v==-1, void>::type
467 // DIFFERENT
468 virtual void _computeMapperInteriorVertex_v(patchCorner pcorner, index_t valence);
469
470
471protected:
472//----------------------------------------------------------------------------------------------------------------------------
473// Helper functions
481 virtual std::vector<bool> getSharpCorners(T tol = 1e-2) const;
482
493 virtual index_t _indexFromSides(index_t index1, const patchSide side1, index_t index2, const patchSide side2);
494
495
507 virtual index_t _indexFromVert(const index_t index, const patchCorner corner, const patchSide side, const index_t offsets = 0) const;
508 virtual index_t _indexFromVert(const gsMultiBasis<T> & bases, const index_t index, const patchCorner corner, const patchSide side, const index_t offsets = 0) const;
509 virtual index_t _indexFromVert(const gsBasis<T> * basis, const index_t index, const patchCorner corner, const patchSide side, const index_t offsets = 0) const;
510private:
511 template<class U>
512 typename util::enable_if<util::is_same<U, const gsHTensorBasis<d,T> *>::value,const index_t>::type
513 _indexFromVert_impl(U basis, const index_t index, const patchCorner corner, const patchSide side, const index_t offsets = 0) const;
514
515 template<class U>
516 typename util::enable_if<util::is_same<U, const gsTensorBSplineBasis<d,T> *>::value,const index_t>::type
517 _indexFromVert_impl(U basis, const index_t index, const patchCorner corner, const patchSide side, const index_t offsets = 0) const;
518protected:
519
527 virtual const std::pair<index_t,bool> _vertexData(const patchCorner corner) const;
528
536 virtual index_t _getValence( patchCorner corner) const
537 { return this->_vertexData(corner).first; }
538
546 virtual bool _isInteriorVertex( patchCorner corner) const
547 { return this->_vertexData(corner).second; }
548
557 virtual index_t _sideIndex( index_t patch, boxSide bside) const
558 { return 4*patch + bside - 1; }
566 virtual index_t _sideIndex( patchSide pside) const
567 { return _sideIndex( pside.patch , pside.side() ); }
568
577 virtual index_t _vertIndex( index_t patch, boxCorner corner) const
578 { return 4*patch + corner -1; }
579
587 virtual index_t _vertIndex( patchCorner pcorner) const
588 { return _vertIndex( pcorner.patch , pcorner.corner() ); }
589
590
597 virtual void _getLowestCorners(std::vector<patchCorner> & pcorners, index_t n = 3) const;
598
605 virtual void _removeLowestCorners(std::vector<patchCorner> & pcorners, index_t n = 3) const;
606
613 virtual void _getLowestIndices(std::vector<std::pair<index_t,index_t>> & indices, index_t n = 3) const;
614
621 virtual void _removeLowestIndices(std::vector<std::pair<index_t,index_t>> & indices, index_t n = 3) const;
622
623
624 virtual std::vector<std::pair<index_t,index_t>> _getInterfaceIndices(patchCorner pcorner, index_t depth, const gsMultiBasis<T> & mbasis) const;
625 virtual std::vector<std::pair<index_t,index_t>> _getAllInterfaceIndices(patchCorner pcorner, index_t depth, const gsMultiBasis<T> & mbasis) const;
626
627
628 virtual bool _checkMatrix(const gsSparseMatrix<T> & matrix) const;
629
630// protected:
631// /**
632// * @brief Prepares the THB basis if needed.
633// *
634// * This function constructs THB refinements on the places where they are needed, i.e. around EVs. It also constructs the transfer matrix (m_tMatrix) forms the transformation between the original B-spline basis and the THB-Spline basis.
635// */
636// void _makeTHB();
637
638// /**
639// * @brief Computes D-Patch smoothing
640// *
641// * Given a basis with THB refinement around the EVs, this function computes the D-Patch smoothing
642// */
643// void _computeEVs();
644
645// /**
646// * @brief Makes the Pi matrix
647// *
648// * This matrix is used to transform the coefficients of the D-Patch smoothing matrix
649// *
650// * @param[in] valence The valence
651// *
652// * @return Matrix for smoothing around an EV}
653// */
654// gsMatrix<T> _makePi(index_t valence);
655
659 virtual void _initChecks();
660
664 virtual void _initTHB();
665
669 virtual void _initBasis();
670
675 virtual void _initMappers();
676
680 virtual void _countDoFs()
681 {
683 }
684
688 virtual void _initMatrix();
689
693 virtual void _performChecks(bool basis);
694
698 virtual void _resetChecks(bool basis);
699
703 virtual void _whichHandled();
704
705// protected:
706// bool _checkMatrix(const gsSparseMatrix<T> & matrix) const // ! makes a deep copy (otherwise the contents of m_matrix get destroyed somehow...)
707// {
708// GISMO_ASSERT(matrix.cols()==matrix.outerSize(),"is the matrix ColMajor?");
709// gsVector<T> colSums(matrix.cols());
710// colSums.setZero();
711// for (index_t i = 0; i<matrix.outerSize(); ++i)
712// for (typename gsSparseMatrix<T>::iterator it = matrix.begin(i); it; ++it)
713// colSums.at(i) += it.value();
714
715// return (colSums.array() < 1+1e-8).any() && (colSums.array() > 1-1e-8).any();
716// }
717
718protected:
719 const gsMultiPatch<T> & m_patches;
720 const gsMultiBasis<T> m_Bbases; // reference?
721
722 gsMultiBasis<T> m_bases;
723
724 gsBoxTopology m_topology;
725
726 bool m_computed;
727
728 mutable gsSparseMatrix<T> m_tMatrix;
729 mutable std::vector<bool> m_sideCheck;
730 mutable std::vector<bool> m_vertCheck;
731 mutable std::vector<bool> m_basisCheck;
732 mutable std::vector<bool> m_C0s;
733
734 mutable gsDofMapper m_mapModified,m_mapOriginal;
735
736 mutable gsSparseMatrix<T> m_matrix;
737
738 mutable size_t m_size;
739
740 mutable gsMatrix<T> m_coefs;
741
742 gsOptionList m_options;
743
744 size_t m_nSides;
745 size_t m_nVerts;
746
747};
748
749
750
751}
752
753#ifndef GISMO_BUILD_LIB
754#include GISMO_HPP_HEADER(gsDPatchBase.hpp)
755#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
Defines a topological arrangement of a collection of "boxes" (e.g., parameter domains that map to phy...
Definition gsBoxTopology.h:39
const ifContainer & interfaces() const
Return the vector of interfaces.
Definition gsBoxTopology.h:252
const bContainer & boundaries() const
Return the vector of boundaries.
Definition gsBoxTopology.h:238
Constructs the D-Patch, from which the transformation matrix can be called.
Definition gsDPatchBase.h:37
virtual void _handleVertex(patchCorner pcorner)
Handles a vertex in the global matrix.
Definition gsDPatchBase.hpp:970
virtual index_t _vertIndex(index_t patch, boxCorner corner) const
Computes global index of the corner.
Definition gsDPatchBase.h:577
virtual void localGeometry_into(gsMultiPatch< T > &localGeometry)
Returns the modified geometry corresponding to the local basis.
Definition gsDPatchBase.h:124
virtual void mapperInfo() const
Returns for each basis function if it is free or eliminated.
Definition gsDPatchBase.hpp:134
virtual gsGeometry< T > * exportPatch(index_t patch, bool computeCoefs=true)
Exports a single modified patch with index patch.
Definition gsDPatchBase.hpp:186
virtual void defaultOptions()
Sets the default options.
Definition gsDPatchBase.hpp:39
virtual void _computeEVs()=0
Corrects the EVs.
virtual index_t _vertIndex(patchCorner pcorner) const
Computes global index of the corner.
Definition gsDPatchBase.h:587
virtual index_t _indexFromSides(index_t index1, const patchSide side1, index_t index2, const patchSide side2)
Computes the index of a basis function using sides as reference.
Definition gsDPatchBase.hpp:227
virtual const gsSparseMatrix< T > & matrix() const
Returns the smoothing matrix.
Definition gsDPatchBase.h:232
gsDPatchBase(const gsMultiPatch< T > &mp)
Default constructor.
Definition gsDPatchBase.h:80
virtual void _removeLowestCorners(std::vector< patchCorner > &pcorners, index_t n=3) const
From a list of patchCorners pcorners, remove all but the lowest n corners.
Definition gsDPatchBase.hpp:448
virtual void matrix_into(gsSparseMatrix< T > &matrix) const
Returns the smoothing matrix into matrix.
Definition gsDPatchBase.h:213
virtual void vertexInfo(patchCorner corner) const
Returns information about a vertex.
Definition gsDPatchBase.hpp:151
virtual void sideInfo() const
Returns information for all the sides in the topology.
Definition gsDPatchBase.hpp:165
virtual index_t _sideIndex(index_t patch, boxSide bside) const
Computes global index of the side.
Definition gsDPatchBase.h:557
virtual void _initialize()
Initializes the class:-.
Definition gsDPatchBase.hpp:792
virtual const gsMultiBasis< T > & localBasis() const
Returns the basis that is used for the D-Patch. Could be THB refined.
Definition gsDPatchBase.h:110
virtual bool _isInteriorVertex(patchCorner corner) const
Determines whether the specified corner is interior vertex.
Definition gsDPatchBase.h:546
virtual void _initTHB()
Initializes the matrix, the basis and the mappers.
Definition gsDPatchBase.hpp:823
virtual void compute()
Computes the construction.
Definition gsDPatchBase.hpp:26
virtual void _initChecks()
Initializes the matrix, the basis and the mappers.
Definition gsDPatchBase.hpp:810
virtual void _handleRegularCorner(patchCorner pcorner)
Handles a regular corner.
Definition gsDPatchBase.hpp:1548
virtual gsMatrix< T > _preCoefficients(const gsMultiPatch< T > &patches)=0
Computes the C1 coefficients for pre-multiplication to make the multipatch.
virtual index_t _sideIndex(patchSide pside) const
Computes global index of the side.
Definition gsDPatchBase.h:566
virtual void _handleInterior()
Handles the interior in the global matrix.
Definition gsDPatchBase.hpp:1155
gsDPatchBase(const gsMultiBasis< T > &mb, const gsMultiPatch< T > &mp)
Default constructor.
Definition gsDPatchBase.h:60
virtual gsMultiPatch< T > exportToPatches(const gsMultiPatch< T > &patches)
Exports the modified geometry to a gsMultiPatch object.
Definition gsDPatchBase.h:187
virtual void _computeMapper()
Calculates the mapper.
Definition gsDPatchBase.hpp:1209
memory::shared_ptr< gsDPatchBase > Ptr
Shared pointer for gsDPatchBase.
Definition gsDPatchBase.h:44
virtual void _countDoFs()
Initializes the matrix, the basis and the mappers.
Definition gsDPatchBase.h:680
virtual void _initBasis()
Initializes the basis.
Definition gsDPatchBase.hpp:839
virtual void _computeSmoothMatrix()
Calculates the smooth matrix.
Definition gsDPatchBase.hpp:1177
virtual void _removeLowestIndices(std::vector< std::pair< index_t, index_t > > &indices, index_t n=3) const
From a list of tuples (patch,index), remove all but the lowest n tuples.
Definition gsDPatchBase.hpp:484
virtual void _initMatrix()
Initializes the matrix.
Definition gsDPatchBase.hpp:851
virtual void globalBasis_into(gsMappedBasis< d, T > &mbasis) const
Returns the basis that is used for the D-Patch. Could be THB refined.
Definition gsDPatchBase.h:142
virtual void _getLowestCorners(std::vector< patchCorner > &pcorners, index_t n=3) const
From a list of patchCorners pcorners, get the lowest n corners.
Definition gsDPatchBase.hpp:435
gsDPatchBase()
Empty constructor.
Definition gsDPatchBase.h:50
virtual index_t _indexFromVert(const index_t index, const patchCorner corner, const patchSide side, const index_t offsets=0) const
Computes the index of a basis function taking one corner and one side as reference.
Definition gsDPatchBase.hpp:269
virtual index_t _getValence(patchCorner corner) const
Gets the valence.
Definition gsDPatchBase.h:536
virtual void _getLowestIndices(std::vector< std::pair< index_t, index_t > > &indices, index_t n=3) const
From a list of tuples (patch,index), get the lowest n tuples.
Definition gsDPatchBase.hpp:463
memory::unique_ptr< gsDPatchBase > uPtr
Unique pointer for gsDPatchBase.
Definition gsDPatchBase.h:47
virtual void cornerInfo() const
Returns information for all the corners in the topology.
Definition gsDPatchBase.hpp:174
virtual void _initMappers()
Initializes the matrix, the basis and the mappers.
Definition gsDPatchBase.hpp:844
virtual void _performChecks(bool basis)
Performs checks on sides, vertices and bases.
Definition gsDPatchBase.hpp:875
virtual const gsMultiPatch< T > & getGeometry() const
Returns the multipatch that is used for the D-Patch.
Definition gsDPatchBase.h:133
virtual void globalGeometry_into(const gsMultiPatch< T > &patches, gsMappedSpline< d, T > &mspline)
Returns the multipatch that is used for the D-Patch.
Definition gsDPatchBase.h:154
virtual void _whichHandled()
Prints which DoFs have been handled and which have been eliminated.
Definition gsDPatchBase.hpp:857
virtual std::vector< bool > getSharpCorners(T tol=1e-2) const
Checks if corners are sharp or not.
Definition gsDPatchBase.hpp:47
virtual void _handleBoundary(patchSide side)
Handles a boundary in the global matrix.
Definition gsDPatchBase.hpp:1112
virtual void _handleInterface(boundaryInterface iface)
Handles an interface in the global matrix.
Definition gsDPatchBase.hpp:1002
virtual void _resetChecks(bool basis)
Resets checks on sides, vertices and bases.
Definition gsDPatchBase.hpp:890
virtual const std::pair< index_t, bool > _vertexData(const patchCorner corner) const
Returns the valence and whether a corner is interior or boundary.
Definition gsDPatchBase.hpp:425
virtual void _makeTHB()=0
Prints which DoFs have been handled and which have been eliminated.
Maintains a mapping from patch-local dofs to global dof indices and allows the elimination of individ...
Definition gsDofMapper.h:69
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
Container class for a set of geometry patches and their topology, that is, the interface connections ...
Definition gsMultiPatch.h:100
bool empty() const
Returns true if gsMultiPatch is empty.
Definition gsMultiPatch.h:268
size_t nPatches() const
Number of patches.
Definition gsMultiPatch.h:274
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 declaration of the BoxTopology class.
#define index_t
Definition gsConfig.h:32
#define GISMO_NO_IMPLEMENTATION
Definition gsDebug.h:129
#define GISMO_ASSERT(cond, message)
Definition gsDebug.h:89
Provides declaration of Basis abstract interface.
Provides declaration of Basis abstract interface.
Provides declaration of the MultiPatch class.
Provides a list of labeled parameters/options that can be set and accessed easily.
The G+Smo namespace, containing all definitions for the library.
S give(S &x)
Definition gsMemory.h:266
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 corner of a hyper-cube.
Definition gsBoundary.h:292
Struct which represents a certain corner of a patch.
Definition gsBoundary.h:393
Struct which represents a certain side of a patch.
Definition gsBoundary.h:232
index_t patch
The index of the patch.
Definition gsBoundary.h:234