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