00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef _MESH_H_
00030 #define _MESH_H_
00031
00032 #include <vector>
00033 #include <set>
00034 #include <map>
00035 #include <fstream>
00036 #include <istream>
00037
00042 class Mesh {
00043
00044 std::map<Edge, GNode> edge_map;
00045
00051 public:
00052 template<typename Collection>
00053 int getBad(Graph* mesh, Collection& ret) {
00054 int retval = 0;
00055
00056 for (Graph::active_iterator ii = mesh->active_begin(), ee = mesh->active_end(); ii != ee; ++ii) {
00057 if (ii->getData(Galois::NONE).isBad()) {
00058 ret.push_back(*ii);
00059 ++retval;
00060 }
00061 }
00062 return retval;
00063 }
00064
00065 private:
00066 void next_line(std::ifstream& scanner) {
00067 scanner.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
00068 }
00069
00070 void readNodes(std::string filename, std::vector<Tuple>& tuples) {
00071 std::ifstream scanner(filename.append(".node").c_str());
00072 size_t ntups;
00073 scanner >> ntups;
00074 next_line(scanner);
00075
00076 tuples.resize(ntups);
00077 for (size_t i = 0; i < ntups; i++) {
00078 size_t index;
00079 double x;
00080 double y;
00081 scanner >> index >> x >> y;
00082 next_line(scanner);
00083 tuples[index] = Tuple(x, y);
00084 }
00085 }
00086
00087 void readElements(Graph* mesh, std::string filename, std::vector<Tuple>& tuples) {
00088 std::ifstream scanner(filename.append(".ele").c_str());
00089
00090 size_t nels;
00091 scanner >> nels;
00092 next_line(scanner);
00093
00094 for (size_t i = 0; i < nels; i++) {
00095 size_t index;
00096 size_t n1, n2, n3;
00097 scanner >> index >> n1 >> n2 >> n3;
00098 assert(n1 >= 0 && n1 < tuples.size());
00099 assert(n2 >= 0 && n2 < tuples.size());
00100 assert(n3 >= 0 && n3 < tuples.size());
00101 Element e(tuples[n1], tuples[n2], tuples[n3]);
00102 addElement(mesh, e);
00103 }
00104 }
00105
00106 void readPoly(Graph* mesh, std::string filename, std::vector<Tuple>& tuples) {
00107 std::ifstream scanner(filename.append(".poly").c_str());
00108 next_line(scanner);
00109 size_t nsegs;
00110 scanner >> nsegs;
00111 next_line(scanner);
00112 for (size_t i = 0; i < nsegs; i++) {
00113 size_t index;
00114 size_t n1;
00115 size_t n2;
00116 scanner >> index >> n1 >> n2;
00117 assert(n1 >= 0 && n1 < tuples.size());
00118 assert(n2 >= 0 && n2 < tuples.size());
00119 next_line(scanner);
00120 Element e(tuples[n1], tuples[n2]);
00121 addElement(mesh, e);
00122 }
00123 }
00124
00125 GNode addElement(Graph* mesh, Element& element) {
00126 GNode node = mesh->createNode(element);
00127 mesh->addNode(node, Galois::NONE);
00128 for (int i = 0; i < element.numEdges(); i++) {
00129 Edge edge = element.getEdge(i);
00130 if (edge_map.find(edge) == edge_map.end()) {
00131 edge_map[edge] = node;
00132 } else {
00133 mesh->addEdge(node, edge_map[edge], Galois::NONE);
00134 edge_map.erase(edge);
00135 }
00136 }
00137 return node;
00138 }
00139
00140 public:
00141 void read(Graph* mesh, std::string basename) {
00142 std::vector<Tuple> tuples;
00143 readNodes(basename, tuples);
00144 readElements(mesh, basename, tuples);
00145 readPoly(mesh, basename, tuples);
00146 }
00147
00148 bool verify(Graph* mesh) {
00149
00150 bool error = false;
00151
00152 for (Graph::active_iterator ii = mesh->active_begin(), ee = mesh->active_end(); ii != ee; ++ii) {
00153
00154 GNode node = *ii;
00155 Element& element = node.getData(Galois::NONE);
00156 if (element.getDim() == 2) {
00157 if (mesh->neighborsSize(node, Galois::NONE) != 1) {
00158 std::cerr << "-> Segment " << element << " has " << mesh->neighborsSize(node, Galois::NONE) << " relation(s)\n";
00159 error = true;
00160 }
00161 } else if (element.getDim() == 3) {
00162 if (mesh->neighborsSize(node, Galois::NONE) != 3) {
00163 std::cerr << "-> Triangle " << element << " has " << mesh->neighborsSize(node, Galois::NONE) << " relation(s)";
00164 error = true;
00165 }
00166 } else {
00167 std::cerr << "-> Figures with " << element.getDim() << " edges";
00168 error = true;
00169 }
00170 }
00171
00172 if (error)
00173 return false;
00174
00175
00176 std::stack<GNode> remaining;
00177 std::set<GNode> found;
00178 remaining.push(*(mesh->active_begin()));
00179
00180 while (!remaining.empty()) {
00181 GNode node = remaining.top();
00182 remaining.pop();
00183 if (!found.count(node)) {
00184 assert(mesh->containsNode(node) && "Reachable node was removed from graph");
00185 found.insert(node);
00186 int i = 0;
00187 for (Graph::neighbor_iterator ii = mesh->neighbor_begin(node, Galois::NONE), ee = mesh->neighbor_end(node, Galois::NONE); ii != ee; ++ii) {
00188 assert(i < 3);
00189 assert(mesh->containsNode(*ii));
00190 assert(node != *ii);
00191 ++i;
00192
00193 remaining.push(*ii);
00194 }
00195 }
00196 }
00197
00198 if (found.size() != mesh->size()) {
00199 std::cerr << "Not all elements are reachable \n";
00200 std::cerr << "Found: " << found.size() << "\nMesh: " << mesh->size() << "\n";
00201 assert(0 && "Not all elements are reachable");
00202 return false;
00203 }
00204 return true;
00205 }
00206 };
00207
00208 #endif