G+Smo  24.08.0
Geometry + Simulation Modules
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
gsDPatchBase.h
Go to the documentation of this file.
1 
14 #pragma once
15 
16 #include <gsCore/gsBoxTopology.h>
17 #include <gsCore/gsMultiPatch.h>
18 
19 #include <gsIO/gsOptionList.h>
20 
23 
24 // #include <gsUnstructuredSplines/src/gsDPatchBase.hpp>
25 
26 namespace gismo
27 {
28 
29 
35 template<short_t d,class T>
37 {
38 protected:
39  typedef typename std::vector<std::tuple<index_t,index_t,T>> sparseEntry_t;
40 
41 public:
42 
44  typedef memory::shared_ptr< gsDPatchBase > Ptr;
45 
47  typedef memory::unique_ptr< gsDPatchBase > uPtr;
48 
51  :
53  { }
54 
61  :
62  m_patches(mp),
63  m_Bbases(mb),
64  m_topology(m_Bbases.topology()),
65  m_computed(false)
66  {
67  }
68 
69  gsDPatchBase(const gsMultiBasis<T> & mb)
70  :
71  gsDPatchBase(mb, gsMultiPatch<T>())
72  {
73  }
74 
81  :
82  gsDPatchBase(give(gsMultiBasis<T>(mp)), mp)
83  {
84  }
85 
86 public:
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 
213  virtual const void matrix_into(gsSparseMatrix<T> & matrix) const
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 
282 protected:
283 //----------------------------------------------------------------------------------------------------------------------------
284 // Pure virtual functions (to be overloaded)
291  virtual gsMatrix<T> _preCoefficients(const gsMultiPatch<T> & patches) = 0;
292  virtual gsMatrix<T> _preCoefficients()
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 
401 protected:
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 
421 protected:
422 
426  virtual void _makeTHB() = 0;
427 
431  virtual void _computeEVs() = 0;
432 
433 protected:
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 
471 protected:
472 //----------------------------------------------------------------------------------------------------------------------------
473 // Helper functions
481  virtual std::vector<bool> getSharpCorners(T tol = 1e-2) const;
482 
493  virtual const index_t _indexFromSides(index_t index1, const patchSide side1, index_t index2, const patchSide side2);
494 
495 
507  virtual const index_t _indexFromVert(const index_t index, const patchCorner corner, const patchSide side, const index_t offsets = 0) const;
508  virtual const 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 const index_t _indexFromVert(const gsBasis<T> * basis, const index_t index, const patchCorner corner, const patchSide side, const index_t offsets = 0) const;
510 private:
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;
518 protected:
519 
527  virtual const std::pair<index_t,bool> _vertexData(const patchCorner corner) const;
528 
536  virtual const index_t _getValence( patchCorner corner) const
537  { return this->_vertexData(corner).first; }
538 
546  virtual const bool _isInteriorVertex( patchCorner corner) const
547  { return this->_vertexData(corner).second; }
548 
557  virtual const index_t _sideIndex( index_t patch, boxSide bside) const
558  { return 4*patch + bside - 1; }
566  virtual const index_t _sideIndex( patchSide pside) const
567  { return _sideIndex( pside.patch , pside.side() ); }
568 
577  virtual const index_t _vertIndex( index_t patch, boxCorner corner) const
578  { return 4*patch + corner -1; }
579 
587  virtual const 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 
718 protected:
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
virtual gsMultiPatch< T > exportToPatches(const gsMultiPatch< T > &patches)
Exports the modified geometry to a gsMultiPatch object.
Definition: gsDPatchBase.h:187
#define GISMO_NO_IMPLEMENTATION
Definition: gsDebug.h:129
virtual void _computeMapper()
Calculates the mapper.
Definition: gsDPatchBase.hpp:1209
virtual gsGeometry< T > * exportPatch(index_t patch, bool computeCoefs=true)
Exports a single modified patch with index patch.
Definition: gsDPatchBase.hpp:186
Struct which represents a certain side of a patch.
Definition: gsBoundary.h:231
Provides declaration of the BoxTopology class.
virtual void vertexInfo(patchCorner corner) const
Returns information about a vertex.
Definition: gsDPatchBase.hpp:151
gsDPatchBase(const gsMultiBasis< T > &mb, const gsMultiPatch< T > &mp)
Default constructor.
Definition: gsDPatchBase.h:60
memory::unique_ptr< gsDPatchBase > uPtr
Unique pointer for gsDPatchBase.
Definition: gsDPatchBase.h:47
virtual void _computeEVs()=0
Corrects the EVs.
const bContainer & boundaries() const
Return the vector of boundaries.
Definition: gsBoxTopology.h:238
virtual void sideInfo() const
Returns information for all the sides in the topology.
Definition: gsDPatchBase.hpp:165
virtual const gsMultiPatch< T > & getGeometry() const
Returns the multipatch that is used for the D-Patch.
Definition: gsDPatchBase.h:133
virtual const index_t _getValence(patchCorner corner) const
Gets the valence.
Definition: gsDPatchBase.h:536
virtual void _handleInterface(boundaryInterface iface)
Handles an interface in the global matrix.
Definition: gsDPatchBase.hpp:1002
virtual void _handleInterior()
Handles the interior in the global matrix.
Definition: gsDPatchBase.hpp:1155
virtual std::vector< bool > getSharpCorners(T tol=1e-2) const
Checks if corners are sharp or not.
Definition: gsDPatchBase.hpp:47
virtual void _initMatrix()
Initializes the matrix.
Definition: gsDPatchBase.hpp:851
virtual void _initChecks()
Prepares the THB basis if needed.
Definition: gsDPatchBase.hpp:810
S give(S &x)
Definition: gsMemory.h:266
virtual void compute()
Computes the construction.
Definition: gsDPatchBase.hpp:26
#define index_t
Definition: gsConfig.h:32
virtual gsMatrix< T > _preCoefficients(const gsMultiPatch< T > &patches)=0
Computes the C1 coefficients for pre-multiplication to make the multipatch.
memory::shared_ptr< gsDPatchBase > Ptr
Shared pointer for gsDPatchBase.
Definition: gsDPatchBase.h:44
virtual void _computeSmoothMatrix()
Calculates the smooth matrix.
Definition: gsDPatchBase.hpp:1177
virtual void _countDoFs()
Initializes the matrix, the basis and the mappers.
Definition: gsDPatchBase.h:680
Struct which represents a certain corner of a patch.
Definition: gsBoundary.h:392
#define GISMO_ASSERT(cond, message)
Definition: gsDebug.h:89
Maintains a mapping from patch-local dofs to global dof indices and allows the elimination of individ...
Definition: gsDofMapper.h:68
virtual void _handleBoundary(patchSide side)
Handles a boundary in the global matrix.
Definition: gsDPatchBase.hpp:1112
virtual const index_t _sideIndex(index_t patch, boxSide bside) const
Computes global index of the side.
Definition: gsDPatchBase.h:557
virtual void mapperInfo() const
Returns for each basis function if it is free or eliminated.
Definition: gsDPatchBase.hpp:134
virtual const bool _isInteriorVertex(patchCorner corner) const
Determines whether the specified corner is interior vertex.
Definition: gsDPatchBase.h:546
Provides a list of labeled parameters/options that can be set and accessed easily.
gsDPatchBase()
Empty constructor.
Definition: gsDPatchBase.h:50
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 _handleVertex(patchCorner pcorner)
Handles a vertex in the global matrix.
Definition: gsDPatchBase.hpp:970
virtual void _whichHandled()
Prints which DoFs have been handled and which have been eliminated.
Definition: gsDPatchBase.hpp:857
Holds a set of patch-wise bases and their topology information.
Definition: gsMultiBasis.h:36
Provides declaration of Basis abstract interface.
Provides declaration of the MultiPatch class.
virtual const void matrix_into(gsSparseMatrix< T > &matrix) const
Returns the smoothing matrix into matrix.
Definition: gsDPatchBase.h:213
virtual void cornerInfo() const
Returns information for all the corners in the topology.
Definition: gsDPatchBase.hpp:174
size_t nPatches() const
Number of patches.
Definition: gsMultiPatch.h:208
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 const index_t _sideIndex(patchSide pside) const
Computes global index of the side.
Definition: gsDPatchBase.h:566
Constructs the D-Patch, from which the transformation matrix can be called.
Definition: gsDPatchBase.h:36
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
virtual void _initMappers()
Initializes the matrix, the basis and the mappers.
Definition: gsDPatchBase.hpp:844
Provides declaration of Basis abstract interface.
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
virtual void _initialize()
Initializes the class:-.
Definition: gsDPatchBase.hpp:792
virtual void _performChecks(bool basis)
Performs checks on sides, vertices and bases.
Definition: gsDPatchBase.hpp:875
virtual const index_t _vertIndex(index_t patch, boxCorner corner) const
Computes global index of the corner.
Definition: gsDPatchBase.h:577
virtual void _initBasis()
Initializes the basis.
Definition: gsDPatchBase.hpp:839
virtual const gsSparseMatrix< T > & matrix() const
Returns the smoothing matrix.
Definition: gsDPatchBase.h:232
virtual void _makeTHB()=0
Prints which DoFs have been handled and which have been eliminated.
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
virtual const 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 void _initTHB()
Initializes the matrix, the basis and the mappers.
Definition: gsDPatchBase.hpp:823
virtual void defaultOptions()
Sets the default options.
Definition: gsDPatchBase.hpp:39
virtual const index_t _vertIndex(patchCorner pcorner) const
Computes global index of the corner.
Definition: gsDPatchBase.h:587
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
Class which holds a list of parameters/options, and provides easy access to them. ...
Definition: gsOptionList.h:32
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 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 localGeometry_into(gsMultiPatch< T > &localGeometry)
Returns the modified geometry corresponding to the local basis.
Definition: gsDPatchBase.h:124
const ifContainer & interfaces() const
Return the vector of interfaces.
Definition: gsBoxTopology.h:252
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
Defines a topological arrangement of a collection of &quot;boxes&quot; (e.g., parameter domains that map to phy...
Definition: gsBoxTopology.h:38
gsDPatchBase(const gsMultiPatch< T > &mp)
Default constructor.
Definition: gsDPatchBase.h:80
virtual void _handleRegularCorner(patchCorner pcorner)
Handles a regular corner.
Definition: gsDPatchBase.hpp:1537
virtual const 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
index_t patch
The index of the patch.
Definition: gsBoundary.h:234
Struct which represents a certain corner of a hyper-cube.
Definition: gsBoundary.h:291
bool empty() const
Returns true if gsMultiPatch is empty.
Definition: gsMultiPatch.h:202
virtual void _resetChecks(bool basis)
Resets checks on sides, vertices and bases.
Definition: gsDPatchBase.hpp:890