# HG changeset patch # User Eugenio Gianniti # Date 1406747392 -7200 # Node ID fb67b636616f88e4c48478cb8da5eb9c25967fae # Parent 8fe68d94ab76cc7a520b6e84a726d16bbc621399 Distribute mesh after creating it * Subdomain markers are not supported by DOLFIN in parallel execution! diff -r 8fe68d94ab76 -r fb67b636616f src/Mesh.cc --- a/src/Mesh.cc Wed Jul 30 20:59:37 2014 +0200 +++ b/src/Mesh.cc Wed Jul 30 21:09:52 2014 +0200 @@ -17,6 +17,9 @@ #include "mesh.h" #include "dolfin_compat.h" +#ifdef LATEST_DOLFIN +#include +#endif DEFUN_DLD (Mesh, args, ,"-*- texinfo -*-\n\ @deftypefn {Function File} {[@var{mesh_out}]} = \ @@ -133,59 +136,67 @@ dolfin::MeshValueCollection facet(*msh, D - 1); std::size_t num_side_edges = e.cols (); - if (D == 2) + unsigned const num_procs = +#ifdef LATEST_DOLFIN + dolfin::MPI::size (MPI_COMM_WORLD); +#else + dolfin::MPI::num_processes (); +#endif + + if (num_procs == 1) { - for (uint i = 0; i < num_side_edges; ++i) + if (D == 2) { - dolfin::Vertex v (*msh, e.xelem (0, i) - 1); - for (dolfin::FacetIterator f (v); ! f.end (); ++f) + for (uint i = 0; i < num_side_edges; ++i) { - if ((*f).entities(0)[0] == e.xelem (0, i) - 1 - && (*f).entities(0)[1] == e.xelem (1, i) - 1 - || (*f).entities(0)[0] == e.xelem (1, i) - 1 - && (*f).entities(0)[1] == e.xelem (0, i) - 1) + dolfin::Vertex v (*msh, e.xelem (0, i) - 1); + for (dolfin::FacetIterator f (v); ! f.end (); ++f) { - std::pair - idxvl ((*f).index (), e.xelem (4, i)); - msh->domains ().set_marker (idxvl, D - 1); - break; + if ((*f).entities(0)[0] == e.xelem (0, i) - 1 + && (*f).entities(0)[1] == e.xelem (1, i) - 1 + || (*f).entities(0)[0] == e.xelem (1, i) - 1 + && (*f).entities(0)[1] == e.xelem (0, i) - 1) + { + std::pair + idxvl ((*f).index (), e.xelem (4, i)); + msh->domains ().set_marker (idxvl, D - 1); + break; + } } } } - } - - - if (D == 3) - { - for (uint i = 0; i < num_side_edges; ++i) + if (D == 3) { - dolfin::Vertex v (*msh, e.xelem (0, i) - 1); - for (dolfin::FacetIterator f (v); ! f.end (); ++f) + for (uint i = 0; i < num_side_edges; ++i) { - if ((*f).entities(0)[0] == e(0, i) - 1 - && (*f).entities(0)[1] == e.xelem (1, i) - 1 - && (*f).entities(0)[2] == e.xelem (2, i) - 1 - || (*f).entities(0)[0] == e.xelem (0, i) - 1 - && (*f).entities(0)[1] == e.xelem (2, i) - 1 - && (*f).entities(0)[2] == e.xelem (1, i) - 1 - || (*f).entities(0)[0] == e.xelem (1, i) - 1 - && (*f).entities(0)[1] == e.xelem (0, i) - 1 - && (*f).entities(0)[2] == e.xelem (2, i) - 1 - || (*f).entities(0)[0] == e.xelem (1, i) - 1 - && (*f).entities(0)[1] == e.xelem (2, i) - 1 - && (*f).entities(0)[2] == e.xelem (0, i) - 1 - || (*f).entities(0)[0] == e.xelem (2, i) - 1 - && (*f).entities(0)[1] == e.xelem (0, i) - 1 - && (*f).entities(0)[2] == e.xelem (1, i) - 1 - || (*f).entities(0)[0] == e.xelem (2, i) - 1 - && (*f).entities(0)[1] == e.xelem (1, i) - 1 - && (*f).entities(0)[2] == e.xelem (0, i) - 1) + dolfin::Vertex v (*msh, e.xelem (0, i) - 1); + for (dolfin::FacetIterator f (v); ! f.end (); ++f) { - std::pair - idxvl ((*f).index (), e.xelem (9, i)); - msh->domains ().set_marker (idxvl, D - 1); - break; + if ((*f).entities(0)[0] == e(0, i) - 1 + && (*f).entities(0)[1] == e.xelem (1, i) - 1 + && (*f).entities(0)[2] == e.xelem (2, i) - 1 + || (*f).entities(0)[0] == e.xelem (0, i) - 1 + && (*f).entities(0)[1] == e.xelem (2, i) - 1 + && (*f).entities(0)[2] == e.xelem (1, i) - 1 + || (*f).entities(0)[0] == e.xelem (1, i) - 1 + && (*f).entities(0)[1] == e.xelem (0, i) - 1 + && (*f).entities(0)[2] == e.xelem (2, i) - 1 + || (*f).entities(0)[0] == e.xelem (1, i) - 1 + && (*f).entities(0)[1] == e.xelem (2, i) - 1 + && (*f).entities(0)[2] == e.xelem (0, i) - 1 + || (*f).entities(0)[0] == e.xelem (2, i) - 1 + && (*f).entities(0)[1] == e.xelem (0, i) - 1 + && (*f).entities(0)[2] == e.xelem (1, i) - 1 + || (*f).entities(0)[0] == e.xelem (2, i) - 1 + && (*f).entities(0)[1] == e.xelem (1, i) - 1 + && (*f).entities(0)[2] == e.xelem (0, i) - 1) + { + std::pair + idxvl ((*f).index (), e.xelem (9, i)); + msh->domains ().set_marker (idxvl, D - 1); + break; + } } } } @@ -195,159 +206,161 @@ dolfin::MeshValueCollection cell (*msh, D); std::size_t num_cells = t.cols (); - if (D == 2) + if (num_procs == 1) { - for (uint i = 0; i < num_cells; ++i) + if (D == 2) { - dolfin::Vertex v (*msh, t.xelem (0, i) - 1); - for (dolfin::CellIterator f (v); ! f.end (); ++f) + for (uint i = 0; i < num_cells; ++i) + { + dolfin::Vertex v (*msh, t.xelem (0, i) - 1); + for (dolfin::CellIterator f (v); ! f.end (); ++f) + { + if ((*f).entities(0)[0] == t.xelem (0, i) - 1 + && (*f).entities(0)[1] == t.xelem (1, i) - 1 + && (*f).entities(0)[2] == t.xelem (2, i) - 1 + || (*f).entities(0)[0] == t.xelem (0, i) - 1 + && (*f).entities(0)[1] == t.xelem (2, i) - 1 + && (*f).entities(0)[2] == t.xelem (1, i) - 1 + || (*f).entities(0)[0] == t.xelem (1, i) - 1 + && (*f).entities(0)[1] == t.xelem (0, i) - 1 + && (*f).entities(0)[2] == t.xelem (2, i) - 1 + || (*f).entities(0)[0] == t.xelem (1, i) - 1 + && (*f).entities(0)[1] == t.xelem (2, i) - 1 + && (*f).entities(0)[2] == t.xelem (0, i) - 1 + || (*f).entities(0)[0] == t.xelem (2, i) - 1 + && (*f).entities(0)[1] == t.xelem (0, i) - 1 + && (*f).entities(0)[2] == t.xelem (1, i) - 1 + || (*f).entities(0)[0] == t.xelem (2, i) - 1 + && (*f).entities(0)[1] == t.xelem (1, i) - 1 + && (*f).entities(0)[2] == t.xelem (0, i) - 1) + { + std::pair + idxvl ((*f).index (), t.xelem (3, i)); + msh->domains ().set_marker (idxvl, D); + break; + } + } + } + } + + if (D == 3) + { + for (uint i = 0; i < num_cells; ++i) { - if ((*f).entities(0)[0] == t.xelem (0, i) - 1 - && (*f).entities(0)[1] == t.xelem (1, i) - 1 - && (*f).entities(0)[2] == t.xelem (2, i) - 1 - || (*f).entities(0)[0] == t.xelem (0, i) - 1 - && (*f).entities(0)[1] == t.xelem (2, i) - 1 - && (*f).entities(0)[2] == t.xelem (1, i) - 1 - || (*f).entities(0)[0] == t.xelem (1, i) - 1 - && (*f).entities(0)[1] == t.xelem (0, i) - 1 - && (*f).entities(0)[2] == t.xelem (2, i) - 1 - || (*f).entities(0)[0] == t.xelem (1, i) - 1 - && (*f).entities(0)[1] == t.xelem (2, i) - 1 - && (*f).entities(0)[2] == t.xelem (0, i) - 1 - || (*f).entities(0)[0] == t.xelem (2, i) - 1 - && (*f).entities(0)[1] == t.xelem (0, i) - 1 - && (*f).entities(0)[2] == t.xelem (1, i) - 1 - || (*f).entities(0)[0] == t.xelem (2, i) - 1 - && (*f).entities(0)[1] == t.xelem (1, i) - 1 - && (*f).entities(0)[2] == t.xelem (0, i) - 1) + dolfin::Vertex v (*msh, t.xelem (0, i) - 1); + for (dolfin::CellIterator f (v); ! f.end (); ++f) { - std::pair - idxvl ((*f).index (), t.xelem (3, i)); - msh->domains ().set_marker (idxvl, D); - break; + if ((*f).entities(0)[0] == t.xelem (0, i) - 1 + && (*f).entities(0)[1] == t.xelem (1, i) - 1 + && (*f).entities(0)[2] == t.xelem (2, i) - 1 + && (*f).entities(0)[3] == t.xelem (3, i) - 1 + || (*f).entities(0)[0] == t.xelem (0, i) - 1 + && (*f).entities(0)[1] == t.xelem (1, i) - 1 + && (*f).entities(0)[2] == t.xelem (3, i) - 1 + && (*f).entities(0)[3] == t.xelem (2, i) - 1 + || (*f).entities(0)[0] == t.xelem (0, i) - 1 + && (*f).entities(0)[1] == t.xelem (2, i) - 1 + && (*f).entities(0)[2] == t.xelem (1, i) - 1 + && (*f).entities(0)[3] == t.xelem (3, i) - 1 + || (*f).entities(0)[0] == t.xelem (0, i) - 1 + && (*f).entities(0)[1] == t.xelem (2, i) - 1 + && (*f).entities(0)[2] == t.xelem (3, i) - 1 + && (*f).entities(0)[3] == t.xelem (1, i) - 1 + || (*f).entities(0)[0] == t.xelem (0, i) - 1 + && (*f).entities(0)[1] == t.xelem (3, i) - 1 + && (*f).entities(0)[2] == t.xelem (1, i) - 1 + && (*f).entities(0)[3] == t.xelem (2, i) - 1 + || (*f).entities(0)[0] == t.xelem (0, i) - 1 + && (*f).entities(0)[1] == t.xelem (3, i) - 1 + && (*f).entities(0)[2] == t.xelem (2, i) - 1 + && (*f).entities(0)[3] == t.xelem (1, i) - 1 + + || (*f).entities(0)[0] == t.xelem (1, i) - 1 + && (*f).entities(0)[1] == t.xelem (0, i) - 1 + && (*f).entities(0)[2] == t.xelem (2, i) - 1 + && (*f).entities(0)[3] == t.xelem (3, i) - 1 + || (*f).entities(0)[0] == t.xelem (1, i) - 1 + && (*f).entities(0)[1] == t.xelem (0, i) - 1 + && (*f).entities(0)[2] == t.xelem (3, i) - 1 + && (*f).entities(0)[3] == t.xelem (2, i) - 1 + || (*f).entities(0)[0] == t.xelem (1, i) - 1 + && (*f).entities(0)[1] == t.xelem (2, i) - 1 + && (*f).entities(0)[2] == t.xelem (0, i) - 1 + && (*f).entities(0)[3] == t.xelem (3, i) - 1 + || (*f).entities(0)[0] == t.xelem (1, i) - 1 + && (*f).entities(0)[1] == t.xelem (2, i) - 1 + && (*f).entities(0)[2] == t.xelem (3, i) - 1 + && (*f).entities(0)[3] == t.xelem (0, i) - 1 + || (*f).entities(0)[0] == t.xelem (1, i) - 1 + && (*f).entities(0)[1] == t.xelem (3, i) - 1 + && (*f).entities(0)[2] == t.xelem (0, i) - 1 + && (*f).entities(0)[3] == t.xelem (2, i) - 1 + || (*f).entities(0)[0] == t.xelem (1, i) - 1 + && (*f).entities(0)[1] == t.xelem (3, i) - 1 + && (*f).entities(0)[2] == t.xelem (2, i) - 1 + && (*f).entities(0)[3] == t.xelem (0, i) - 1 + + || (*f).entities(0)[0] == t.xelem (2, i) - 1 + && (*f).entities(0)[1] == t.xelem (0, i) - 1 + && (*f).entities(0)[2] == t.xelem (1, i) - 1 + && (*f).entities(0)[3] == t.xelem (3, i) - 1 + || (*f).entities(0)[0] == t.xelem (2, i) - 1 + && (*f).entities(0)[1] == t.xelem (0, i) - 1 + && (*f).entities(0)[2] == t.xelem (3, i) - 1 + && (*f).entities(0)[3] == t.xelem (1, i) - 1 + || (*f).entities(0)[0] == t.xelem (2, i) - 1 + && (*f).entities(0)[1] == t.xelem (1, i) - 1 + && (*f).entities(0)[2] == t.xelem (0, i) - 1 + && (*f).entities(0)[3] == t.xelem (3, i) - 1 + || (*f).entities(0)[0] == t.xelem (2, i) - 1 + && (*f).entities(0)[1] == t.xelem (1, i) - 1 + && (*f).entities(0)[2] == t.xelem (3, i) - 1 + && (*f).entities(0)[3] == t.xelem (0, i) - 1 + || (*f).entities(0)[0] == t.xelem (2, i) - 1 + && (*f).entities(0)[1] == t.xelem (3, i) - 1 + && (*f).entities(0)[2] == t.xelem (0, i) - 1 + && (*f).entities(0)[3] == t.xelem (1, i) - 1 + || (*f).entities(0)[0] == t.xelem (2, i) - 1 + && (*f).entities(0)[1] == t.xelem (3, i) - 1 + && (*f).entities(0)[2] == t.xelem (1, i) - 1 + && (*f).entities(0)[3] == t.xelem (0, i) - 1 + + || (*f).entities(0)[0] == t.xelem (3, i) - 1 + && (*f).entities(0)[1] == t.xelem (0, i) - 1 + && (*f).entities(0)[2] == t.xelem (1, i) - 1 + && (*f).entities(0)[3] == t.xelem (2, i) - 1 + || (*f).entities(0)[0] == t.xelem (3, i) - 1 + && (*f).entities(0)[1] == t.xelem (0, i) - 1 + && (*f).entities(0)[2] == t.xelem (2, i) - 1 + && (*f).entities(0)[3] == t.xelem (1, i) - 1 + || (*f).entities(0)[0] == t.xelem (3, i) - 1 + && (*f).entities(0)[1] == t.xelem (1, i) - 1 + && (*f).entities(0)[2] == t.xelem (0, i) - 1 + && (*f).entities(0)[3] == t.xelem (2, i) - 1 + || (*f).entities(0)[0] == t.xelem (3, i) - 1 + && (*f).entities(0)[1] == t.xelem (1, i) - 1 + && (*f).entities(0)[2] == t.xelem (2, i) - 1 + && (*f).entities(0)[3] == t.xelem (0, i) - 1 + || (*f).entities(0)[0] == t.xelem (3, i) - 1 + && (*f).entities(0)[1] == t.xelem (2, i) - 1 + && (*f).entities(0)[2] == t.xelem (0, i) - 1 + && (*f).entities(0)[3] == t.xelem (1, i) - 1 + || (*f).entities(0)[0] == t.xelem (3, i) - 1 + && (*f).entities(0)[1] == t.xelem (2, i) - 1 + && (*f).entities(0)[2] == t.xelem (1, i) - 1 + && (*f).entities(0)[3] == t.xelem (0, i) - 1) + { + std::pair + idxvl ((*f).index (), t.xelem (4, i)); + msh->domains ().set_marker (idxvl, D); + break; + } } } } } - - - if (D == 3) - { - for (uint i = 0; i < num_cells; ++i) - { - dolfin::Vertex v (*msh, t.xelem (0, i) - 1); - for (dolfin::CellIterator f (v); ! f.end (); ++f) - { - if ((*f).entities(0)[0] == t.xelem (0, i) - 1 - && (*f).entities(0)[1] == t.xelem (1, i) - 1 - && (*f).entities(0)[2] == t.xelem (2, i) - 1 - && (*f).entities(0)[3] == t.xelem (3, i) - 1 - || (*f).entities(0)[0] == t.xelem (0, i) - 1 - && (*f).entities(0)[1] == t.xelem (1, i) - 1 - && (*f).entities(0)[2] == t.xelem (3, i) - 1 - && (*f).entities(0)[3] == t.xelem (2, i) - 1 - || (*f).entities(0)[0] == t.xelem (0, i) - 1 - && (*f).entities(0)[1] == t.xelem (2, i) - 1 - && (*f).entities(0)[2] == t.xelem (1, i) - 1 - && (*f).entities(0)[3] == t.xelem (3, i) - 1 - || (*f).entities(0)[0] == t.xelem (0, i) - 1 - && (*f).entities(0)[1] == t.xelem (2, i) - 1 - && (*f).entities(0)[2] == t.xelem (3, i) - 1 - && (*f).entities(0)[3] == t.xelem (1, i) - 1 - || (*f).entities(0)[0] == t.xelem (0, i) - 1 - && (*f).entities(0)[1] == t.xelem (3, i) - 1 - && (*f).entities(0)[2] == t.xelem (1, i) - 1 - && (*f).entities(0)[3] == t.xelem (2, i) - 1 - || (*f).entities(0)[0] == t.xelem (0, i) - 1 - && (*f).entities(0)[1] == t.xelem (3, i) - 1 - && (*f).entities(0)[2] == t.xelem (2, i) - 1 - && (*f).entities(0)[3] == t.xelem (1, i) - 1 - - || (*f).entities(0)[0] == t.xelem (1, i) - 1 - && (*f).entities(0)[1] == t.xelem (0, i) - 1 - && (*f).entities(0)[2] == t.xelem (2, i) - 1 - && (*f).entities(0)[3] == t.xelem (3, i) - 1 - || (*f).entities(0)[0] == t.xelem (1, i) - 1 - && (*f).entities(0)[1] == t.xelem (0, i) - 1 - && (*f).entities(0)[2] == t.xelem (3, i) - 1 - && (*f).entities(0)[3] == t.xelem (2, i) - 1 - || (*f).entities(0)[0] == t.xelem (1, i) - 1 - && (*f).entities(0)[1] == t.xelem (2, i) - 1 - && (*f).entities(0)[2] == t.xelem (0, i) - 1 - && (*f).entities(0)[3] == t.xelem (3, i) - 1 - || (*f).entities(0)[0] == t.xelem (1, i) - 1 - && (*f).entities(0)[1] == t.xelem (2, i) - 1 - && (*f).entities(0)[2] == t.xelem (3, i) - 1 - && (*f).entities(0)[3] == t.xelem (0, i) - 1 - || (*f).entities(0)[0] == t.xelem (1, i) - 1 - && (*f).entities(0)[1] == t.xelem (3, i) - 1 - && (*f).entities(0)[2] == t.xelem (0, i) - 1 - && (*f).entities(0)[3] == t.xelem (2, i) - 1 - || (*f).entities(0)[0] == t.xelem (1, i) - 1 - && (*f).entities(0)[1] == t.xelem (3, i) - 1 - && (*f).entities(0)[2] == t.xelem (2, i) - 1 - && (*f).entities(0)[3] == t.xelem (0, i) - 1 - - || (*f).entities(0)[0] == t.xelem (2, i) - 1 - && (*f).entities(0)[1] == t.xelem (0, i) - 1 - && (*f).entities(0)[2] == t.xelem (1, i) - 1 - && (*f).entities(0)[3] == t.xelem (3, i) - 1 - || (*f).entities(0)[0] == t.xelem (2, i) - 1 - && (*f).entities(0)[1] == t.xelem (0, i) - 1 - && (*f).entities(0)[2] == t.xelem (3, i) - 1 - && (*f).entities(0)[3] == t.xelem (1, i) - 1 - || (*f).entities(0)[0] == t.xelem (2, i) - 1 - && (*f).entities(0)[1] == t.xelem (1, i) - 1 - && (*f).entities(0)[2] == t.xelem (0, i) - 1 - && (*f).entities(0)[3] == t.xelem (3, i) - 1 - || (*f).entities(0)[0] == t.xelem (2, i) - 1 - && (*f).entities(0)[1] == t.xelem (1, i) - 1 - && (*f).entities(0)[2] == t.xelem (3, i) - 1 - && (*f).entities(0)[3] == t.xelem (0, i) - 1 - || (*f).entities(0)[0] == t.xelem (2, i) - 1 - && (*f).entities(0)[1] == t.xelem (3, i) - 1 - && (*f).entities(0)[2] == t.xelem (0, i) - 1 - && (*f).entities(0)[3] == t.xelem (1, i) - 1 - || (*f).entities(0)[0] == t.xelem (2, i) - 1 - && (*f).entities(0)[1] == t.xelem (3, i) - 1 - && (*f).entities(0)[2] == t.xelem (1, i) - 1 - && (*f).entities(0)[3] == t.xelem (0, i) - 1 - - || (*f).entities(0)[0] == t.xelem (3, i) - 1 - && (*f).entities(0)[1] == t.xelem (0, i) - 1 - && (*f).entities(0)[2] == t.xelem (1, i) - 1 - && (*f).entities(0)[3] == t.xelem (2, i) - 1 - || (*f).entities(0)[0] == t.xelem (3, i) - 1 - && (*f).entities(0)[1] == t.xelem (0, i) - 1 - && (*f).entities(0)[2] == t.xelem (2, i) - 1 - && (*f).entities(0)[3] == t.xelem (1, i) - 1 - || (*f).entities(0)[0] == t.xelem (3, i) - 1 - && (*f).entities(0)[1] == t.xelem (1, i) - 1 - && (*f).entities(0)[2] == t.xelem (0, i) - 1 - && (*f).entities(0)[3] == t.xelem (2, i) - 1 - || (*f).entities(0)[0] == t.xelem (3, i) - 1 - && (*f).entities(0)[1] == t.xelem (1, i) - 1 - && (*f).entities(0)[2] == t.xelem (2, i) - 1 - && (*f).entities(0)[3] == t.xelem (0, i) - 1 - || (*f).entities(0)[0] == t.xelem (3, i) - 1 - && (*f).entities(0)[1] == t.xelem (2, i) - 1 - && (*f).entities(0)[2] == t.xelem (0, i) - 1 - && (*f).entities(0)[3] == t.xelem (1, i) - 1 - || (*f).entities(0)[0] == t.xelem (3, i) - 1 - && (*f).entities(0)[1] == t.xelem (2, i) - 1 - && (*f).entities(0)[2] == t.xelem (1, i) - 1 - && (*f).entities(0)[3] == t.xelem (0, i) - 1) - { - std::pair - idxvl ((*f).index (), t.xelem (4, i)); - msh->domains ().set_marker (idxvl, D); - break; - } - } - } - } - - pmsh = msh; + dolfin::MeshPartitioning::build_distributed_mesh (*msh); + pmsh = msh; } }