00001 #ifndef FCPM_HPP 00002 #define FCPM_HPP 00003 00008 00009 #include "es.hpp" 00010 #include "compressed_mesh.hpp" 00011 #include "dbg.h" 00012 00013 using fpcm::CompressedMesh::PTID; 00014 using namespace fpcm::ES; 00015 00016 namespace fpcm 00017 { 00018 00019 template<int8_t Tmax_el_verts,int8_t Tmax_fa_verts> 00020 class FastParallelCompressedMesh 00021 { 00022 public: 00023 typedef CompressedMesh::PTID PTID; 00024 typedef ES::GUID GUID; 00025 00026 static const int8_t max_el_verts = Tmax_el_verts; 00027 static const int8_t max_fa_verts = Tmax_fa_verts; 00028 typedef Verticable<Tmax_el_verts> ElemVerticable; 00029 typedef Verticable<Tmax_fa_verts> FaceVerticable; 00030 typedef Verticable<2> EdgeVerticable; 00031 // Storages 00032 // Mesh vertices (in compressed form) 00033 CompressedMesh::CoordMesh compressed_mesh; 00034 std::vector<PTID> used_vertices; 00035 00036 // Mesh edges. 00037 ES::GUID n_edges; 00038 std::vector<EdgeVerticable > init_edges; 00039 00040 // Mesh faces. 00041 ES::GUID n_faces; 00042 std::vector<FaceVerticable> init_faces; 00043 std::vector<Neigborable> init_faces_neigs; 00044 00045 // Mesh elements. 00046 ES::GUID n_elements; 00047 std::vector<ElemVerticable> init_elems; 00048 std::vector<Materialable> init_elems_materials; 00049 00050 int8_t max_gen,max_gen_diff; 00051 00052 00053 int encodePoints(const double* const real_points, const int n_points) 00054 { 00055 used_vertices.resize(n_points); 00056 return CompressedMesh::EncodingProcessor(real_points,n_points, 00057 used_vertices.data(), 00058 compressed_mesh); 00059 } 00060 00061 PTID* points_begin() { return used_vertices.data(); } 00064 const PTID* points_end() const {return used_vertices.data() 00065 + used_vertices.size(); } 00066 inline void coords(const PTID id,double* coords_ar) const 00067 { 00068 return compressed_mesh.getPointCoords(id,coords_ar); 00069 } 00070 PTID points_size() const { return used_vertices.size(); } 00071 00072 private: 00073 void defaults() { 00074 n_edges=0; 00075 n_faces=0; 00076 n_elements=0; 00077 max_gen=1; 00078 max_gen_diff=1; 00079 } 00080 public: 00081 void clear() { 00082 defaults(); 00083 used_vertices.clear(); 00084 init_edges.clear(); 00085 init_faces.clear(); 00086 init_faces_neigs.clear(); 00087 init_elems.clear(); 00088 init_elems_materials.clear(); 00089 } 00090 00091 ~FastParallelCompressedMesh() { 00092 clear(); 00093 } 00094 00095 00096 int in_memory_size() const { 00097 return sizeof(compressed_mesh) + 00098 container_in_memory_size(used_vertices) + 00099 container_in_memory_size(init_edges) + 00100 container_in_memory_size(init_faces) + 00101 container_in_memory_size(init_faces_neigs) + 00102 container_in_memory_size(init_elems) + 00103 container_in_memory_size(init_elems_materials); 00104 } 00105 00106 // Processors 00107 00108 00109 }; 00110 } 00111 00112 #endif