26template <
short_t d,
class T>
39template <
short_t d,
class T>
45template <
short_t d,
class T>
57 GISMO_ASSERT(m_basis!=
nullptr,
"basis is not a gsHTensorBasis");
62 m_center = (m_coords.col(1) + m_coords.col(0))/2;
63 m_indices = _computeIndices(m_coords,m_center);
66template <
short_t d,
class T>
69m_indices(low,upp,level),
80template <
short_t d,
class T>
94template <
short_t d,
class T>
104 GISMO_ENSURE(indices.size()==2*d+1,
"Index size is wrong");
108 low[k] = indices[k+1];
109 upp[k] = indices[k+d+1];
119template <
short_t d,
class T>
125template <
short_t d,
class T>
128 operator=(
give(other));
131template <
short_t d,
class T>
136 m_indices = other.m_indices;
138 m_coords = other.m_coords;
139 m_center = other.m_center;
140 m_basis = other.m_basis;
141 m_error = other.m_error;
142 m_error_ref = other.m_error_ref;
143 m_error_crs = other.m_error_crs;
144 m_marked = other.m_marked;
145 m_index = other.m_index;
150template <
short_t d,
class T>
153 m_indices =
give(other.m_indices);
154 m_pid =
give(other.m_pid);
155 m_coords =
give(other.m_coords);
156 m_center =
give(other.m_center);
157 m_basis =
give(other.m_basis);
158 m_error =
give(other.m_error);
159 m_error_ref =
give(other.m_error_ref);
160 m_error_crs =
give(other.m_error_crs);
161 m_marked =
give(other.m_marked);
162 m_index =
give(other.m_index);
166template <
short_t d,
class T>
179 return gsHBoxIsContained<d,T>()(*
this,other);
183template <
short_t d,
class T>
195 return gsHBoxContains<d,T>()(*
this,other);
198template <
short_t d,
class T>
202 res &= this->patch() == other.
patch();
203 res &= this->level() == other.
level();
204 for (
index_t i=0; i!=d && res; i++)
206 res &= this->lowerIndex().at(i) == other.
lowerIndex().
at(i);
207 res &= this->upperIndex().at(i) == other.
upperIndex().
at(i);
212template <
short_t d,
class T>
215 return m_basis->getLevelAtPoint(this->getCenter()) == this->level();
218template <
short_t d,
class T>
221 return m_basis->getLevelAtPoint(this->getCenter()) >= this->level();
224template <
short_t d,
class T>
227 return m_basis->getLevelAtPoint(this->getCenter());
230template <
short_t d,
class T>
233 GISMO_ASSERT(m_coords.size()!=0,
"Coordinates have not been computed! Please call computeCoordinates()");
237template <
short_t d,
class T>
241 if (m_center.size()==0)
242 this->computeCenter();
246template <
short_t d,
class T>
249 GISMO_ASSERT(m_coords.size()!=0,
"Coordinates have not been computed! Please call computeCoordinates()");
250 return m_coords.col(0);
253template <
short_t d,
class T>
256 GISMO_ASSERT(m_coords.size()!=0,
"Coordinates have not been computed! Please call computeCoordinates()");
257 return m_coords.col(1);
260template <
short_t d,
class T>
263 return (upperCorner() - lowerCorner()).norm();
266template <
short_t d,
class T>
269 return (upperCorner() - lowerCorner()).minCoeff();
272template <
short_t d,
class T>
275 return (upperCorner() - lowerCorner()).maxCoeff();
278template <
short_t d,
class T>
280template <
short_t d,
class T>
283template <
short_t d,
class T>
286template <
short_t d,
class T>
289template <
short_t d,
class T>
295template <
short_t d,
class T>
298 this->setError(error);
299 m_error_ref= math::pow(1./2.,alpha*m_basis->maxDegree()+beta) * error ;
300 m_error_crs= math::pow(2.,alpha*m_basis->maxDegree()+beta) * error ;
303template <
short_t d,
class T>
306template <
short_t d,
class T>
309template <
short_t d,
class T>
312template <
short_t d,
class T>
315 return m_error-m_error_ref;
318template <
short_t d,
class T>
321 return m_error_crs-m_error;
324template <
short_t d,
class T>
327template <
short_t d,
class T>
330template <
short_t d,
class T>
333template <
short_t d,
class T>
336template <
short_t d,
class T>
339template <
short_t d,
class T>
342template <
short_t d,
class T>
345 GISMO_ENSURE(this->level()>0,
"Box is at ground level and has no parent");
350template <
short_t d,
class T>
355 GISMO_ASSERT(k >= 0,
"Requested ancestor k = "<<k<<
" should be greater than or equal to 0");
356 GISMO_ASSERT(lvl >= 0,
"Level lvl = "<<lvl<<
" should be larger than 0");
370 GISMO_ERROR(
"Cannot find ancestor with index k="<<k<<
" on level l="<<lvl<<
". Something went wrong?");
373template <
short_t d,
class T>
381template <
short_t d,
class T>
386 GISMO_ASSERT(k >= 0,
"Requested descendant k = "<<k<<
" should be larger than or equal to 0");
387 GISMO_ASSERT(lvl >= 0,
"Level lvl = "<<lvl<<
" should be larger than 0");
388 Container descendants(std::pow(std::pow(2,d),k-lvl));
390 descendants.push_back(*
this);
392 descendants = this->getChildren();
395 Container tmp = this->getChildren();
396 for (
index_t k_tmp = lvl+1; k_tmp!=k; k_tmp++)
400 for (Iterator it=tmp.begin(); it!=tmp.end(); it++)
402 Container tmp2 = it->getChildren();
403 for (Iterator it2=tmp2.begin(); it2!=tmp2.end(); it2++)
404 descendants.push_back(*it2);
412template <
short_t d,
class T>
415 auto isthis = [
this](
const gsHBox<d,T> & other) {
return gsHBoxEqual<d,T>()(other,*
this); };
416 gsHBox<d,T> parent = this->getParent();
417 typename gsHBox<d,T>::Container children = parent.getChildren();
418 Iterator toErase = std::find_if(children.begin(),children.end(),isthis);
419 if (toErase!=children.end())
420 children.erase(toErase);
426template <
short_t d,
class T>
430 container.push_back(*
this);
434template <
short_t d,
class T>
437 HContainer container;
438 container.resize(this->level()+1);
439 container.at(this->level()).push_back(*
this);
443template <
short_t d,
class T>
446 this->computeCenter();
450 m_basis->tensorLevel(lvl).active_into(m_center,acts);
458 Container tmpContainer;
459 for (
index_t act = 0; act!=acts.rows(); act++)
461 support = m_basis->tensorLevel(lvl).support(acts(act,0));
462 aabb = _computeIndices(support,lvl);
468 for (cIterator it = tmpContainer.begin(); it!=tmpContainer.end(); it++)
469 container.push_back(*it);
472 Container container2 = _makeUnique(container);
476template <
short_t d,
class T>
480 GISMO_ASSERT(k <= lvl,
"Ancestor must be requested from a level lower than the current level (k <= l), but k="<<k<<
" and lvl="<<lvl);
483 return this->getSupportExtension();
492template <
short_t d,
class T>
496 Container neighborhood;
503 extension = this->getMultiLevelSupportExtension(k);
506 for (Iterator it = extension.begin(); it!=extension.end(); it++)
510 neighborhood.push_back(*it);
516template <
short_t d,
class T>
520 Container neighborhood;
521 Container parents, extension;
528 extension = this->getMultiLevelSupportExtension(k);
530 parents = _getParents(extension);
532 for (Iterator it = parents.begin(); it!=parents.end(); it++)
536 neighborhood.push_back(*it);
543template <
short_t d,
class T>
548 result = this->getNeighborhood<gsHNeighborhood::T>(m);
550 result = this->getNeighborhood<gsHNeighborhood::H>(m);
552 GISMO_ERROR(
"Basis type should be gsTHBSplineBasis or gsHBSplineBasis");
556template <
short_t d,
class T>
565 Container extension, children, childExtension, descendants, result;
566 index_t targetLvl = this->level() + m;
568 children = this->getChildren();
569 for (
typename gsHBox<d,T>::Iterator child=children.begin(); child!=children.end(); child++)
571 childExtension = child->getSupportExtension();
582 for (
typename gsHBox<d,T>::Iterator eIt = extension.begin(); eIt!=extension.end(); eIt++)
584 descendants = eIt->getDescendants(targetLvl);
585 result.insert(result.end(), descendants.begin(), descendants.end());
590template <
short_t d,
class T>
599 Container descendants, result;
600 descendants = this->getCextension(m);
602 for (
typename gsHBox<d,T>::Iterator dIt = descendants.begin(); dIt!=descendants.end(); dIt++)
604 dIt->computeCenter();
605 if (dIt->levelInCenter()>=dIt->level())
606 result.push_back(*dIt);
611template <
short_t d,
class T>
614 os <<
"Cell on patch "<<m_pid
615 <<
" on level "<<m_indices.level<<
". "
617 <<
"("<<m_indices.first.transpose()<<
")"
619 <<
"("<<m_indices.second.transpose()<<
")";
620 if (m_coords.cols()!=0)
622 os <<
"\nKnot values:\n"
623 <<
"("<<m_coords.col(0).transpose()<<
")"
625 <<
"("<<m_coords.col(1).transpose()<<
")";
627 os <<
"\nmarked = "<<m_marked<<
"";
628 os <<
"\nerror = "<<m_error<<
"";
632template <
short_t d,
class T>
635 m_coords.resize(d,2);
640 const gsKnotVector<T> & kv = m_basis->tensorLevel(m_indices.level).knots(i);
641 low[i] = kv.
uValue(m_indices.first.at(i));
642 upp[i] = kv.
uValue(m_indices.second.at(i));
644 m_coords.col(0) = low;
645 m_coords.col(1) = upp;
648template <
short_t d,
class T>
651 this->computeCoordinates();
652 m_center = (m_coords.col(0) + m_coords.col(1))/2;
655template <
short_t d,
class T>
658 m_indices = _computeIndices(m_coords);
661template <
short_t d,
class T>
662gsAABB<d, index_t> gsHBox<d, T>::_computeIndices(
const gsMatrix<T> & coords,
index_t level)
664 typename gsHBox<d,T>::point low,upp;
668 const gsKnotVector<T> & kv = m_basis->tensorLevel(level).knots(j);
670 coords(j,0) ) - 1).uIndex();
672 coords(j,1) ) - 1).uIndex();
685 return gsAABB<d, index_t>(low,upp,level);
688template <
short_t d,
class T>
689gsAABB<d, index_t> gsHBox<d, T>::_computeIndices(
const gsMatrix<T> & coords)
691 gsMatrix<T> center = (coords.col(0) + coords.col(1))/2;
692 index_t level = m_basis->getLevelAtPoint(center);
693 return _computeIndices(coords,level);
696template <
short_t d,
class T>
697gsAABB<d, index_t> gsHBox<d, T>::_computeIndices(
const gsMatrix<T> & coords,
const gsMatrix<T> & center)
699 index_t level = m_basis->getLevelAtPoint(center);
700 return _computeIndices(coords,level);
703template <
short_t d,
class T>
704gsAABB<d, index_t> gsHBox<d, T>::_elevateBox(
const gsAABB<d, index_t> & box)
const
706 typename gsHBox<d,T>::point low,upp;
709 low.at(i) = box.first .at(i) / 2;
710 upp.at(i) = box.second.at(i) / 2 + (
index_t)(box.second.at(i) % 2 != 0);
712 return gsAABB<d, index_t>(low,upp,box.level-1);
715template <
short_t d,
class T>
716gsAABB<d, index_t> gsHBox<d, T>::_lowerBox(
const gsAABB<d, index_t> & box)
const
718 typename gsHBox<d,T>::point low,upp;
721 low.at(i) = box.first .at(i) * 2;
722 upp.at(i) = box.second.at(i) * 2;
724 return gsAABB<d, index_t>(low,upp,box.level+1);
727template <
short_t d,
class T>
728typename gsHBox<d,T>::HContainer gsHBox<d, T>::_getParents(HContainer & container)
const
731 result.resize(container.size()-1);
734 GISMO_ASSERT(container[0].size()==0,
"Boxes at level 0 cannot have a parent. Did something go wrong? You can run check() to see if the boxes are allocated coorectly");
736 HIterator resIt = result.begin();
737 for (HIterator hit = std::next(container.begin()); hit!=container.end(); hit++, resIt++)
738 for (Iterator it=hit->begin(); it!=hit->end(); it++)
739 resIt->push_back(it->getParent());
744template <
short_t d,
class T>
745typename gsHBox<d,T>::Container gsHBox<d, T>::_getParents(Container & container)
const
748 for (Iterator it=container.begin(); it!=container.end(); it++)
749 result.push_back(it->getParent());
755template <
short_t d,
class T>
758 point low, upp, cur, curupp, ones;
760 cur = low = this->lowerIndex();
761 upp = this->upperIndex();
769 result.push_back(
gsHBox<d,T>(cur,curupp,this->level(),m_basis,m_pid));
775template <
short_t d,
class T>
778 std::vector<index_t> result(5);
779 result[0] = this->level();
780 result[1] = this->lowerIndex()[0];
781 result[2] = this->lowerIndex()[1];
782 result[3] = this->upperIndex()[0];
783 result[4] = this->upperIndex()[1];
787template <
short_t d,
class T>
790 GISMO_ASSERT(targetLevel > this->level(),
"Target level must be larger than the current level, but "<<targetLevel<<
"=<"<<this->level());
791 std::vector<index_t> result(2*d+1);
792 index_t diff = targetLevel - this->level();
793 result[0] = this->level() + diff;
794 index_t lowerIndex, upperIndex, degree;
797 degree = m_basis->degree(i);
800 if (degree % 2 == 1 && degree>1)
802 lowerIndex = this->lowerIndex()[i]*std::pow(2,diff);
803 ( lowerIndex < (degree-1)/2-1 ? lowerIndex=0 : lowerIndex-=(degree-1)/2-1 );
804 result[i+1] = lowerIndex;
805 upperIndex = this->upperIndex()[i]*std::pow(2,diff);
807 result[d+i+1] = upperIndex;
811 lowerIndex = this->lowerIndex()[i]*std::pow(2,diff);
812 ( lowerIndex < (degree-1)/2 ? lowerIndex=0 : lowerIndex-=(degree-1)/2 );
813 result[i+1] = lowerIndex;
814 upperIndex = this->upperIndex()[i]*std::pow(2,diff);
816 result[d+i+1] = upperIndex;
822template <
short_t d,
class T>
825 GISMO_ASSERT(targetLevel < this->level(),
"Target level must be smaller than the current level, but "<<targetLevel<<
">="<<this->level());
826 std::vector<index_t> result(2*d+1);
827 index_t diff = this->level() - targetLevel;
828 result[0] = this->level() - diff;
831 result[i+1] = this->lowerIndex()[i]/std::pow(2,diff);
832 result[d+i+1] = this->upperIndex()[i]/std::pow(2,diff);
838template <
short_t d,
class T>
839typename gsHBox<d,T>::HContainer
gsHBox<d, T>::boxUnion(
const HContainer & container1,
const HContainer & container2)
const
841 HContainer result, region1, region2;
843 region1 = container1;
844 region2 = container2;
846 index_t lmax = std::max(region1.size(),region2.size());
847 region1.resize(lmax);
848 region2.resize(lmax);
851 for (
index_t l = 0; l!=lmax; l++)
852 result[l] = _boxUnion(region1[l],region2[l]);
857template <
short_t d,
class T>
858typename gsHBox<d, T>::Container gsHBox<d, T>::_boxUnion(
const Container & container1,
const Container & container2)
const
915 return gsHBoxUtils<d,T>::Union(container1,container2);
918template <
short_t d,
class T>
919typename gsHBox<d, T>::Container gsHBox<d, T>::_makeUnique(
const Container & container)
const
938 return gsHBoxUtils<d,T>::Unique(container);
941template <
short_t d,
class T>
944 return (m_indices.first.array() >=0).any() && (m_indices.second.array() >=0).any();
947template <
short_t d,
class T>
951 Iterator beg = std::remove_if(container.begin(),container.end(),pred);
952 container.erase(beg,container.end());
959template<
short_t d,
class T>
964 typedef gsHBox<d,T> Object;
966 GSXML_COMMON_FUNCTIONS(Object);
967 static std::string tag () {
return "HBox"; }
968 static std::string type () {
return "HBox"+std::to_string(d); }
970 GSXML_GET_POINTER(Object);
972 static void get_into (gsXmlNode * node, Object & obj)
974 gsXmlNode * tmp = node->first_node(
"box");
977 std::vector<index_t> box;
978 box.push_back(atoi( tmp->first_attribute(
"level")->value() ));
980 std::istringstream str;
982 str.str( tmp->value() );
984 for(
unsigned i = 0; i < 2*d; i++)
990 if (tmp->first_attribute(
"patch"))
992 index_t patch = atoi(tmp->first_attribute(
"patch")->value());
993 obj = gsHBox<d,T>(box,
nullptr,patch);
996 obj = gsHBox<d,T>(box,
nullptr);
999 static gsXmlNode * put (
const Object & obj,
1002 gsXmlNode * tmp =
makeNode(
"HBox", data);
1003 tmp->append_attribute(
makeAttribute(
"type",internal::gsXml<Object>::type().c_str(), data) );
1006 gsMatrix<index_t> box(1,2*d);
1007 box.leftCols(d) = obj.lowerIndex().transpose();
1008 box.rightCols(d) = obj.upperIndex().transpose();
1010 mat->append_attribute(
makeAttribute(
"level", obj.level(), data));
1011 if (obj.patch()!=-1)
1012 mat->append_attribute(
makeAttribute(
"patch", obj.patch(), data));
1013 tmp->append_node(mat);
const gsBasis< T > * m_basis
The basis on which the domain iterator is defined.
Definition gsDomainIterator.h:219
A hierarchical B-spline basis of parametric dimension d.
Definition gsHBSplineBasis.h:36
This class provides a Hierarchical Box (gsHBox)
Definition gsHBox.h:55
Container getMultiLevelSupportExtension(index_t k)
Gets the multi-level support extension.
Definition gsHBox.hpp:477
Container toContainer()
Returns a container representation of the object.
Definition gsHBox.hpp:427
T getMaxCellLength() const
Return the length of the largest edge of the element.
Definition gsHBox.hpp:273
gsHBox()
Default constructor.
Definition gsHBox.hpp:27
bool marked() const
Returns whether the element is marked or not.
Definition gsHBox.hpp:337
bool isActive() const
Determines if the box is active on its current level.
Definition gsHBox.hpp:213
index_t levelInCenter() const
Gets the level in the center of the object.
Definition gsHBox.hpp:225
Container getSupportExtension()
Gets the support extension.
Definition gsHBox.hpp:444
T projectedErrorRef() const
The error contribution of *this when it is refined.
Definition gsHBox.hpp:307
gsHBox< d, T >::Container getNeighborhood(index_t m)
Gets the neighborhood.
Definition gsHBox.h:422
void computeCenter() const
Computes the center of this.
Definition gsHBox.hpp:649
index_t index() const
Gets the index stored in the object.
Definition gsHBox.hpp:328
gsHBox< d, T > getAncestor(index_t k) const
Gets the ancestor of the object on level k.
Definition gsHBox.hpp:351
bool contains(const gsHBox< d, T > &other) const
Checks if the other cell is contains in this cell.
Definition gsHBox.hpp:184
RefBox toBox() const
Returns a box representation of the object.
Definition gsHBox.hpp:776
Container getTneighborhood(index_t m)
Gets the T-neighborhood.
Definition gsHBox.hpp:517
Container getHneighborhood(index_t m)
Gets the H-neighborhood.
Definition gsHBox.hpp:493
index_t level() const
Gets the level of the object.
Definition gsHBox.hpp:287
void setIndex(index_t index)
Assigns an index to the object.
Definition gsHBox.hpp:325
void computeCoordinates() const
Computes the parametric coordinates of this.
Definition gsHBox.hpp:633
gsHBox< d, T > getParent() const
Gets the parent of the object.
Definition gsHBox.hpp:343
const point & lowerIndex() const
Gets the lower index of the box.
Definition gsHBox.hpp:279
void mark()
Marks this element for refinement.
Definition gsHBox.hpp:331
T projectedImprovement() const
Gives the projected improvement that can be expected for this.
Definition gsHBox.hpp:313
HContainer toHContainer()
Returns a hierarchical container representation of the object.
Definition gsHBox.hpp:435
T projectedSetBack() const
Gives the projected set-back that can be expected for this.
Definition gsHBox.hpp:319
Container getChildren() const
Gets the children of the object.
Definition gsHBox.hpp:374
const point & upperIndex() const
Gets the upper index of the box.
Definition gsHBox.hpp:281
void setAndProjectError(T error, index_t alpha=2, index_t beta=0)
Sets the error of the object and compute the projection of the error on a finer mesh....
Definition gsHBox.hpp:296
gsHBox< d, T > & operator=(const gsHBox< d, T > &other)
Assignment operator.
Definition gsHBox.hpp:132
void clean(Container &container) const
Cleans the container from bad elements (see good())
Definition gsHBox.hpp:948
bool isContained(const gsHBox< d, T > &other) const
Checks if the other cell is contained in this cell.
Definition gsHBox.hpp:167
Container getCextension(index_t m)
Gets the Coarsening extension, which is the coarsening neighborhood before checking for active elemen...
Definition gsHBox.hpp:557
bool good() const
Checks if the box has positive indices.
Definition gsHBox.hpp:942
index_t patch() const
Gets the patch ID of the object.
Definition gsHBox.hpp:284
T getMinCellLength() const
Return the length of the smallest edge of the element.
Definition gsHBox.hpp:267
const gsMatrix< T > & getCenter() const
Gets the center of the box.
Definition gsHBox.hpp:238
T getCellSize() const
Return the diagonal of the element.
Definition gsHBox.hpp:261
void setMark(bool mark)
Sets the mark.
Definition gsHBox.hpp:340
void setError(T error)
Sets the error of the object.
Definition gsHBox.hpp:290
bool isActiveOrContained() const
Determines if active or contained in the active elemebt. In other words; checks if the level of this ...
Definition gsHBox.hpp:219
T error() const
Gets the error stored in the object.
Definition gsHBox.hpp:304
std::ostream & print(std::ostream &os) const
Prints the object.
Definition gsHBox.hpp:612
T projectedErrorCrs() const
The error contribution of *this when it is coarsened.
Definition gsHBox.hpp:310
const gsMatrix< T > & getCoordinates() const
Gets the coordinates of the box (first column lower corner, second column higher corner).
Definition gsHBox.hpp:231
Container getDescendants(index_t k) const
Gets the descendants of the object on level k.
Definition gsHBox.hpp:382
Container getCneighborhood(index_t m)
Gets the Coarsening neighborhood.
Definition gsHBox.hpp:591
gsVector< T, d > upperCorner() const
Gets the upper corner of the box.
Definition gsHBox.hpp:254
void unmark()
Unmarks this element for refinement.
Definition gsHBox.hpp:334
gsVector< T, d > lowerCorner() const
Gets the lower corner of the box.
Definition gsHBox.hpp:247
bool isSame(const gsHBox< d, T > &other) const
Determines whether the this box is the same as the other box.
Definition gsHBox.hpp:199
Container toUnitBoxes() const
Returns unit boxes representation of the object.
Definition gsHBox.hpp:756
Re-implements gsDomainIterator for iteration over all boundary elements of a hierarchical parameter d...
Definition gsHDomainIterator.h:39
const gsVector< T > & upperCorner() const
Returns the upper corner of the current element.
Definition gsHDomainIterator.h:122
const gsVector< T > & lowerCorner() const
Returns the lower corner of the current element.
Definition gsHDomainIterator.h:120
Class representing a (scalar) hierarchical tensor basis of functions .
Definition gsHTensorBasis.h:75
Class for representing a knot vector.
Definition gsKnotVector.h:80
uiterator domainUBegin() const
Returns a unique iterator pointing to the starting knot of the domain.
Definition gsKnotVector.h:359
uiterator domainUEnd() const
Returns a unique iterator pointing to the ending knot of the domain.
Definition gsKnotVector.h:367
T uValue(const size_t &i) const
Provides the knot with unique index i.
Definition gsKnotVector.h:264
A matrix with arbitrary coefficient type and fixed or dynamic size.
Definition gsMatrix.h:41
Truncated hierarchical B-spline basis.
Definition gsTHBSplineBasis.h:36
T at(index_t i) const
Returns the i-th element of the vector.
Definition gsVector.h:177
bool nextLexicographic(Vec &cur, const Vec &size)
Iterates through a tensor lattice with the given size. Updates cur and returns true if another entry ...
Definition gsCombinatorics.h:196
Declarations of the class gsAABB, i.e., the axis-aligned bounding box.
Provides combinatorial unitilies.
#define index_t
Definition gsConfig.h:32
#define GISMO_ERROR(message)
Definition gsDebug.h:118
#define GISMO_ENSURE(cond, message)
Definition gsDebug.h:102
#define GISMO_ASSERT(cond, message)
Definition gsDebug.h:89
Provides declaration of HBSplineBasis class.
Provides declaration of THBSplineBasis class.
Provides declaration of input/output XML utilities struct.
gsXmlNode * putMatrixToXml(gsMatrix< T > const &mat, gsXmlTree &data, std::string name="Matrix")
Helper to insert matrices into XML.
Definition gsXml.hpp:103
gsXmlNode * makeNode(const std::string &name, gsXmlTree &data)
Helper to allocate XML node.
Definition gsXml.cpp:54
gsXmlAttribute * makeAttribute(const std::string &name, const std::string &value, gsXmlTree &data)
Helper to allocate XML attribute.
Definition gsXml.cpp:37
The G+Smo namespace, containing all definitions for the library.
S give(S &x)
Definition gsMemory.h:266
Struct of for an Axis-aligned bounding box.
Definition gsAABB.h:31
The gsHBoxUtils provide basic utilities to modify HBoxes.
Definition gsHBoxUtils.h:46