00001 #include "DAPTA.hpp"
00002
00003 #include <set>
00004 #include <fstream>
00005 #include <iostream>
00006 #include <iomanip>
00007 #undef SEEK_SET
00008 #undef SEEK_CUR
00009 #undef SEEK_END
00010 #include "mpi.h"
00011 using namespace DAPTA;
00012
00013 #define LENGTH_EXPORT_FILE 0
00014 #define STRING_EXPORT_FILE 1
00015
00016 typedef Mesh<Tri3MeshTraits> TriMesh;
00017 TriMesh mesh;
00018 RCBDecomposer<TriMesh::VertexType> rcb;
00019 std::vector<TriMesh::VertexHandle> points;
00020
00021 int main(int argc, char **argv) {
00022
00023 int myrank, nprocs;
00024 MPI_Status status;
00025
00026
00027 MPI_Init(&argc, &argv);
00028
00029
00030 MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
00031 MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
00032
00033
00034 mesh.ClearMesh();
00035 std::ifstream meshfile;
00036 int num;
00037
00038 meshfile.open(argv[1]);
00039 if(!meshfile) {
00040 std::cout << "ERROR READING FILE!" << std::endl;
00041 exit(1);
00042 }
00043
00044 mesh.ReadFile(meshfile);
00045 meshfile.close();
00046 points = mesh.GetCentres();
00047
00048 rcb.loadVertices(points);
00049
00050 std::cout << "client(" << myrank << "): LOADING IN THE MESH FILE..." << std::endl;
00051 std::vector<int> myElems = rcb.decompose(nprocs, myrank);
00052 std::set<TriMesh::VertexHandle> part_vert;
00053 std::set<TriMesh::ElementHandle> part_elem;
00054 std::string export_file;
00055
00056 for(std::vector<int>::iterator j=myElems.begin(); j!=myElems.end(); ++j) {
00057 TriMesh::ElementHandle this_elem = mesh.FindElementFromIndex(*j);
00058 part_elem.insert(this_elem);
00059 for(int k=0; k<TriMesh::ElementType::num_vertices; k++) {
00060 part_vert.insert(this_elem->vertices.at(k));
00061 }
00062 }
00063
00064 myElems.clear();
00065
00066
00067 std::cout << "client(" << myrank << "): READING MY DOMAIN..." << std::endl;
00068 export_file = mesh.ExportDomainFile(part_vert, part_elem);
00069 part_vert.clear();
00070 part_elem.clear();
00071 std::stringstream export_file_stream;
00072 export_file_stream.str(export_file);
00073
00074 mesh.ClearMesh();
00075 mesh.ReadFile(export_file_stream);
00076
00077 std::cout << "client(" << myrank << "): ================================================" << std::endl;
00078 for(TriMesh::VertexMapIterator v_iter=mesh.VertexMapBegin(); v_iter!=mesh.VertexMapEnd(); ++v_iter) {
00079 std::cout << std::setprecision(4);
00080 std::cout << "client(" << myrank << "): " << (*v_iter)->globalID << "\t";
00081 for(int i=0; i<TriMesh::VertexType::dimension; i++) {
00082 std::cout << (*v_iter)->coords.at(i) << "\t";
00083 }
00084 std::cout << (*v_iter) << std::endl;
00085 }
00086 std::cout << "client(" << myrank << "): " << std::endl;
00087 for(TriMesh::ElementMapIterator e_iter=mesh.ElementMapBegin(); e_iter!=mesh.ElementMapEnd(); ++e_iter) {
00088 std::cout << "client(" << myrank << "): " << (*e_iter)->globalID << "\t";
00089 for(int i=0; i<TriMesh::ElementType::num_vertices; i++) {
00090 std::cout << (*e_iter)->vertices.at(i)->globalID << "\t";
00091 }
00092 std::cout << (*e_iter) << std::endl;
00093 }
00094 std::cout << "client(" << myrank << "): ================================================" << std::endl;
00095
00096 std::cout << "client(" << myrank << "): WAITING FOR ALL PROCESSES..." << std::endl;
00097 MPI_Barrier(MPI_COMM_WORLD);
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 MPI_Finalize();
00111
00112 return 0;
00113 }