diff --git a/Common/Octree.cpp b/Common/Octree.cpp index a880fd2da7755356fea590608ea2e3b13ea37476..055a8ccb346a2d54e618f005731809c7f7dd70fa 100644 --- a/Common/Octree.cpp +++ b/Common/Octree.cpp @@ -46,6 +46,7 @@ void free_buckets(octantBucket * bucket) void Octree_Delete(Octree *myOctree) { + if(!myOctree) return; delete myOctree->info; free_buckets(myOctree->root); delete myOctree->root; @@ -54,6 +55,7 @@ void Octree_Delete(Octree *myOctree) void Octree_Insert(void * element, Octree *myOctree) { + if(!myOctree) return; double minBB[3], maxBB[3], centroid[3]; octantBucket *bucket; (*(myOctree->function_BB))(element, minBB, maxBB); @@ -64,7 +66,8 @@ void Octree_Insert(void * element, Octree *myOctree) } void Octree_Arrange(Octree *myOctree) -{ +{ + if(!myOctree) return; std::list<void *>::iterator iter; double minPt[3], maxPt[3]; for(iter = myOctree->info->listAllElements.begin(); iter!= @@ -75,14 +78,16 @@ void Octree_Arrange(Octree *myOctree) myOctree->info->listAllElements.clear(); } -void * Octree_Search(double *pt, Octree *myOctree) +void *Octree_Search(double *pt, Octree *myOctree) { + if(!myOctree) return 0; return searchElement(myOctree->root, pt, myOctree->info, myOctree->function_BB, myOctree->function_inElement); } -void Octree_SearchAll(double * pt, Octree * myOctree, std::list<void *> * output) +void Octree_SearchAll(double *pt, Octree *myOctree, std::list<void*> *output) { + if(!myOctree) return; searchAllElements(myOctree->root, pt, myOctree->info, myOctree->function_BB, myOctree->function_inElement, output); } diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp index a0f00bb5d79467ebe2fd87d5409b4f01abd5614f..cdbd9c3750cf9facdc4be8a6b8fc8176652c6ec8 100644 --- a/Geo/GModel.cpp +++ b/Geo/GModel.cpp @@ -203,7 +203,7 @@ void GModel::destroyMeshCaches() _vertexMapCache.clear(); _elementVectorCache.clear(); _elementMapCache.clear(); - if(_octree) Octree_Delete(_octree); + Octree_Delete(_octree); _octree = 0; } diff --git a/Geo/MElementOctree.cpp b/Geo/MElementOctree.cpp index fe6e1a01280fe32fac72893d53e1b325af1feb95..b16d8aebbd4579abc33f9fc05825a1db06a262e2 100644 --- a/Geo/MElementOctree.cpp +++ b/Geo/MElementOctree.cpp @@ -1,3 +1,8 @@ +// Gmsh - Copyright (C) 1997-2010 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// bugs and problems to <gmsh@geuz.org>. + #include "MElement.h" #include "GModel.h" #include "Octree.h" diff --git a/Post/OctreePost.cpp b/Post/OctreePost.cpp index a70f21228d2a5f5c96bcfacc58bf208198a56608..8850cf778829e76bb79e95bb2f7f9e11cbc80940 100644 --- a/Post/OctreePost.cpp +++ b/Post/OctreePost.cpp @@ -201,17 +201,19 @@ static void addListOfStuff(Octree *o, std::vector<double> &l, int nbelm) OctreePost::~OctreePost() { - if(_ST) Octree_Delete(_ST); if(_VT) Octree_Delete(_VT); if(_TT) Octree_Delete(_TT); - if(_SQ) Octree_Delete(_SQ); if(_VQ) Octree_Delete(_VQ); if(_TQ) Octree_Delete(_TQ); - if(_SS) Octree_Delete(_SS); if(_VS) Octree_Delete(_VS); if(_TS) Octree_Delete(_TS); - if(_SH) Octree_Delete(_SH); if(_VH) Octree_Delete(_VH); if(_TH) Octree_Delete(_TH); - if(_SI) Octree_Delete(_SI); if(_VI) Octree_Delete(_VI); if(_TI) Octree_Delete(_TI); - if(_SY) Octree_Delete(_SY); if(_VY) Octree_Delete(_VY); if(_TY) Octree_Delete(_TY); + Octree_Delete(_SL); Octree_Delete(_VL); Octree_Delete(_TL); + Octree_Delete(_ST); Octree_Delete(_VT); Octree_Delete(_TT); + Octree_Delete(_SQ); Octree_Delete(_VQ); Octree_Delete(_TQ); + Octree_Delete(_SS); Octree_Delete(_VS); Octree_Delete(_TS); + Octree_Delete(_SH); Octree_Delete(_VH); Octree_Delete(_TH); + Octree_Delete(_SI); Octree_Delete(_VI); Octree_Delete(_TI); + Octree_Delete(_SY); Octree_Delete(_VY); Octree_Delete(_TY); } OctreePost::OctreePost(PView *v) - : _ST(0), _VT(0), _TT(0), _SQ(0), _VQ(0), _TQ(0), _SS(0), _VS(0), _TS(0), - _SH(0), _VH(0), _TH(0), _SI(0), _VI(0), _TI(0), _SY(0), _VY(0), _TY(0), + : _SL(0), _VL(0), _TL(0), _ST(0), _VT(0), _TT(0), _SQ(0), _VQ(0), _TQ(0), + _SS(0), _VS(0), _TS(0), _SH(0), _VH(0), _TH(0), _SI(0), _VI(0), _TI(0), + _SY(0), _VY(0), _TY(0), _theView(v), _theViewDataList(0), _theViewDataGModel(0) { _theViewDataGModel = dynamic_cast<PViewDataGModel*>(_theView->getData()); @@ -222,14 +224,21 @@ OctreePost::OctreePost(PView *v) _theViewDataList = dynamic_cast<PViewDataList*>(_theView->getData(true)); if(_theViewDataList){ - SBoundingBox3d bb = _theViewDataList->getBoundingBox(); + PViewDataList *l = _theViewDataList; + + if(l->haveInterpolationMatrices() && !_theView->getData()->isAdaptive()){ + Msg::Error("Cannot create octree for non-adapted high-order view: you need"); + Msg::Error("to select 'Adapt visualization grid' first"); + return; + } + + SBoundingBox3d bb = l->getBoundingBox(); double min[3] = {bb.min().x(), bb.min().y(), bb.min().z()}; double size[3] = {bb.max().x() - bb.min().x(), bb.max().y() - bb.min().y(), bb.max().z() - bb.min().z()}; const int maxElePerBucket = 100; // memory vs. speed trade-off - PViewDataList *l = _theViewDataList; _SL = Octree_Create(maxElePerBucket, min, size, linBB, linCentroid, linInEle); addListOfStuff(_SL, l->SL, 6 + 2 * l->getNumTimeSteps()); Octree_Arrange(_SL);