00001
00002
00003
00004
00005 #ifndef IBIS_MESHQUERY_H
00006 #define IBIS_MESHQUERY_H
00007
00008
00009
00010 #include "query.h"
00011
00012 namespace ibis {
00013 class meshQuery;
00014 }
00015
00019 class FASTBIT_CXX_DLLSPEC ibis::meshQuery : public ibis::query {
00020 public:
00021 virtual ~meshQuery();
00023 meshQuery(const char* uid, const part* et, const char* pref=0);
00025 meshQuery(const char* dir, const ibis::partList& tl) : query(dir, tl) {};
00026
00027 int getHitsAsLines(std::vector<uint32_t>& lines) const {
00028 return getHitsAsLines(lines, partition()->getMeshShape());}
00029 int getHitsAsLines(std::vector<uint32_t>& lines,
00030 const std::vector<uint32_t>& dim) const;
00031 static int labelLines(uint32_t nd,
00032 const std::vector<uint32_t>& lines,
00033 std::vector<uint32_t>& labels);
00034
00035 int getHitsAsBlocks(std::vector< std::vector<uint32_t> >& reg,
00036 const bool merge=false) const;
00037 int getHitsAsBlocks(std::vector< std::vector<uint32_t> >& reg,
00038 const std::vector<uint32_t>& dim,
00039 const bool merge=false) const;
00040
00041 int getPointsOnBoundary(std::vector< std::vector<uint32_t> >& bdy,
00042 const std::vector<uint32_t>& dim) const;
00043 int getPointsOnBoundary(std::vector< std::vector<uint32_t> >& bdy) const;
00044
00045 static int bitvectorToCoordinates(const ibis::bitvector& bv,
00046 const std::vector<uint32_t>& dim,
00047 std::vector<uint32_t>& coords);
00048 static int labelBlocks
00049 (const std::vector< std::vector<uint32_t> >& blocks,
00050 std::vector<uint32_t>& labels);
00051
00052 protected:
00053 int linesIn1D(std::vector<uint32_t>& lines) const;
00054 int linesIn2D(std::vector<uint32_t>& lines,
00055 const std::vector<uint32_t>& dim) const;
00056 int linesIn3D(std::vector<uint32_t>& lines,
00057 const std::vector<uint32_t>& dim) const;
00058 int linesIn4D(std::vector<uint32_t>& lines,
00059 const std::vector<uint32_t>& dim) const;
00060 int linesInND(std::vector<uint32_t>& lines,
00061 const std::vector<uint32_t>& dim) const;
00062
00063 static int labelLines1(const std::vector<uint32_t>& lines,
00064 std::vector<uint32_t>& labels);
00065 static int labelLines2(const std::vector<uint32_t>& lines,
00066 std::vector<uint32_t>& labels);
00067 static int labelLines3(const std::vector<uint32_t>& lines,
00068 std::vector<uint32_t>& labels);
00069 static int labelLines4(const std::vector<uint32_t>& lines,
00070 std::vector<uint32_t>& labels);
00071 static int labelLinesN(uint32_t nd,
00072 const std::vector<uint32_t>& lines,
00073 std::vector<uint32_t>& labels);
00074
00075 int toBlocks1(const ibis::bitvector& bv,
00076 std::vector< std::vector<uint32_t> >& reg) const;
00077 int toBlocks2(const ibis::bitvector& bv,
00078 const std::vector<uint32_t>& dim,
00079 std::vector< std::vector<uint32_t> >& reg) const;
00080 int toBlocks3(const ibis::bitvector& bv,
00081 const std::vector<uint32_t>& dim,
00082 std::vector< std::vector<uint32_t> >& reg) const;
00083 int toBlocksN(const ibis::bitvector& bv,
00084 const std::vector<uint32_t>& dim,
00085 std::vector< std::vector<uint32_t> >& reg) const;
00086 void block2d(uint32_t last, const std::vector<uint32_t>& dim,
00087 std::vector<uint32_t>& block,
00088 std::vector< std::vector<uint32_t> >& reg) const;
00089 void block3d(uint32_t last, const uint32_t n2, const uint32_t n3,
00090 const std::vector<uint32_t>& dim,
00091 std::vector<uint32_t>& block,
00092 std::vector< std::vector<uint32_t> >& reg) const;
00093 void blocknd(uint32_t last,
00094 const std::vector<uint32_t>& scl,
00095 const std::vector<uint32_t>& dim,
00096 std::vector<uint32_t>& block,
00097 std::vector< std::vector<uint32_t> >& reg) const;
00098 void merge2DBlocks(std::vector< std::vector<uint32_t> >& reg) const;
00099 void merge3DBlocks(std::vector< std::vector<uint32_t> >& reg) const;
00100 void mergeNDBlocks(std::vector< std::vector<uint32_t> >& reg) const;
00101
00102 int findPointsOnBoundary(const ibis::bitvector& bv,
00103 const std::vector<uint32_t>& dim,
00104 std::vector< std::vector<uint32_t> >& bdy) const;
00105 void boundary2d(const std::vector<uint32_t>& dim,
00106 const std::vector< std::vector<uint32_t> >& rang,
00107 std::vector< std::vector<uint32_t> >& bdy) const;
00108 void boundary2d1(const std::vector<uint32_t>& dim,
00109 const std::vector< std::vector<uint32_t> >& rang,
00110 std::vector< std::vector<uint32_t> >& bdy) const;
00111 void boundary3d(const std::vector<uint32_t>& dim,
00112 const std::vector< std::vector<uint32_t> >& rang,
00113 std::vector< std::vector<uint32_t> >& bdy) const;
00114 void boundarynd(const std::vector<uint32_t>& dim,
00115 const std::vector< std::vector<uint32_t> >& rang,
00116 std::vector< std::vector<uint32_t> >& bdy) const;
00117
00118 static uint32_t afind(ibis::array_t<uint32_t>& rep, uint32_t s);
00119 static void aset(ibis::array_t<uint32_t>& rep,
00120 uint32_t s, uint32_t r);
00121 static uint32_t aflatten(ibis::array_t<uint32_t>& rep);
00122 static int label1DBlocks
00123 (const std::vector< std::vector<uint32_t> >& blocks,
00124 std::vector<uint32_t>& labels);
00125 static int label2DBlocks
00126 (const std::vector< std::vector<uint32_t> >& blocks,
00127 std::vector<uint32_t>& labels);
00128 static int label3DBlocks
00129 (const std::vector< std::vector<uint32_t> >& blocks,
00130 std::vector<uint32_t>& labels);
00131 static int label4DBlocks
00132 (const std::vector< std::vector<uint32_t> >& blocks,
00133 std::vector<uint32_t>& labels);
00134
00135 private:
00136 meshQuery();
00137 meshQuery(const meshQuery&);
00138 meshQuery& operator=(const meshQuery&);
00139 };
00140 #endif // IBIS_MESHQUERY_H