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