From e069b4d0217f4d79efa727d0020f86589fa9f6f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Kl=C3=B6fkorn?= <robertk@dune-project.org> Date: Thu, 27 Oct 2005 09:18:15 +0000 Subject: [PATCH] bug fix in readGridXdr, forgot to restore level information which is need for the iterators. [[Imported from SVN: r3316]] --- grid/albertagrid/albertaextra.hh | 34 ++++++++++++++++++++++++++++++-- grid/albertagrid/albertagrid.cc | 7 ++++++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/grid/albertagrid/albertaextra.hh b/grid/albertagrid/albertaextra.hh index f2f92d1f1..2dc2b10f3 100644 --- a/grid/albertagrid/albertaextra.hh +++ b/grid/albertagrid/albertaextra.hh @@ -398,7 +398,6 @@ namespace AlbertHelp //************************************************************************** static int Albert_MaxLevel_help=-1; - //static int Albert_GlobalIndex_help=-1; // function for mesh_traverse, is called on every element inline static void calcmxl (const EL_INFO * elf) @@ -408,7 +407,7 @@ namespace AlbertHelp } // remember on which level an element realy lives - inline int calcMaxLevel ( MESH * mesh ) + inline int calcMaxLevel ( MESH * mesh , DOF_INT_VEC * levelVec ) { Albert_MaxLevel_help = -1; @@ -1176,6 +1175,37 @@ namespace AlbertHelp return ; } + // function for mesh_traverse, is called on every element + inline static void storeLevelOfElement(const EL_INFO * elf) + { + const DOF_ADMIN * admin = elNewCheck->fe_space->admin; + const int nv = admin->n0_dof[CENTER]; + const int k = admin->mesh->node[CENTER]; + int *vec = 0; + const EL * el = elf->el; + + int level = elf->level; + if( level <= 0 ) return; + + assert(el); + GET_DOF_VEC(vec,elNewCheck); + + vec[el->dof[k][nv]] = level; + return ; + } + + // remember on which level an element realy lives + inline void restoreElNewCheck( MESH * mesh, DOF_INT_VEC * elNChk ) + { + elNewCheck = elNChk; + assert(elNewCheck != 0); + + // see ALBERTA Doc page 72, traverse over all hierarchical elements + mesh_traverse(mesh,-1,CALL_EVERY_EL_PREORDER|FILL_NEIGH,storeLevelOfElement); + elNewCheck = 0; + return ; + } + } // end namespace AlbertHelp #ifdef __ALBERTApp__ diff --git a/grid/albertagrid/albertagrid.cc b/grid/albertagrid/albertagrid.cc index 0bce4d477..5bb55e8f2 100644 --- a/grid/albertagrid/albertagrid.cc +++ b/grid/albertagrid/albertagrid.cc @@ -3249,6 +3249,7 @@ namespace Dune if(dofvecs_.owner ) ALBERTA free_dof_int_vec(dofvecs_.owner); if(sizeCache_) delete sizeCache_;sizeCache_ = 0; + #if DIM == 3 if(mesh_) { @@ -4095,8 +4096,9 @@ namespace Dune maxlevel_ = ALBERTA AlbertHelp::calcMaxAbsoluteValueOfVector( dofvecs_.elNewCheck ); assert( maxlevel_ >= 0); assert( maxlevel_ < MAXL); + #ifndef NDEBUG - int mlvl = ALBERTA AlbertHelp::calcMaxLevel(mesh_); + int mlvl = ALBERTA AlbertHelp::calcMaxLevel(mesh_,dofvecs_.elNewCheck); assert( mlvl == maxlevel_ ); #endif @@ -4235,6 +4237,9 @@ namespace Dune // make the rest of the dofvecs ALBERTA AlbertHelp::makeTheRest(&dofvecs_); + // restore level information for each element by traversing the mesh + ALBERTA AlbertHelp::restoreElNewCheck( mesh_ , dofvecs_.elNewCheck ); + arrangeDofVec(); // calc maxlevel and indexOnLevel and so on -- GitLab