AFEPack
|
00001 00011 #ifndef _MemoryReclaimer_h_ 00012 #define _MemoryReclaimer_h_ 00013 00014 #include "HGeometry.h" 00015 00045 template <int DIM, int DOW=DIM> 00046 class MemoryReclaimer { 00047 public: 00048 enum {dim = DIM, dow = DOW}; 00049 00050 typedef HGeometryTree<DIM,DOW> tree_t; 00051 typedef IrregularMesh<DIM,DOW> ir_mesh_t; 00052 private: 00053 tree_t * h_tree; 00054 std::list<ir_mesh_t *> ir_mesh; 00055 00056 public: 00057 MemoryReclaimer() : h_tree(NULL) {} 00058 MemoryReclaimer(tree_t& _h_tree) : h_tree(&_h_tree) {} 00059 virtual ~MemoryReclaimer() {} 00060 00061 public: 00066 void setGeometryTree(tree_t& _h_tree) { 00067 h_tree = &_h_tree; 00068 } 00073 void addIrregularMesh(ir_mesh_t& _ir_mesh) { 00074 if (&(_ir_mesh.geometryTree()) != h_tree) { 00075 std::cout << "warning: the irregular mesh added is not based on the geometry tree used." 00076 << std::endl; 00077 } 00078 ir_mesh.push_back(&_ir_mesh); 00079 } 00080 void clear() { 00081 h_tree = NULL; 00082 ir_mesh.clear(); 00083 } 00112 void reclaim(); 00113 00114 private: 00115 void reclaimIrregularMesh(ir_mesh_t&); 00116 void initialTreeLabel(); 00117 void labelIrregularMesh(ir_mesh_t&); 00118 void reclaimTreeMemory(); 00119 00120 template <int DIM1> void labelHGeometry(HGeometry<DIM1,DOW>&, int lab); 00121 template <int DIM1> void labelHGeometryRecursively(HGeometry<DIM1,DOW>& g, int lab); 00122 template <int DIM1> int relabelHGeometryRecursively(HGeometry<DIM1,DOW>& g); 00123 template <int DIM1> int reclaimHGeometryRecursively(HGeometry<DIM1,DOW>& g); 00124 00125 void labelHGeometry(HGeometry<0,DOW>&, int lab); 00126 void labelHGeometryRecursively(HGeometry<0,DOW>& g, int lab); 00127 int relabelHGeometryRecursively(HGeometry<0,DOW>& g); 00128 int reclaimHGeometryRecursively(HGeometry<0,DOW>& g); 00129 00130 virtual void 00131 reclaimHGeometry(void * p_geo, int dim) const { 00132 switch (dim) { 00133 case 0: delete ((HGeometry<0,DOW> *)(p_geo)); break; 00134 case 1: delete ((HGeometry<1,DOW> *)(p_geo)); break; 00135 case 2: delete ((HGeometry<2,DOW> *)(p_geo)); break; 00136 case 3: delete ((HGeometry<3,DOW> *)(p_geo)); break; 00137 } 00138 } 00139 00140 protected: 00141 tree_t * get_tree_ptr() const { return h_tree; } 00142 }; 00143 00144 #include "MemoryReclaimer.templates.h" 00145 00146 #endif // _MemoryReclaimer_h_ 00147