Mercurial > fem-fenics-eugenio
changeset 257:fb67b636616f
Distribute mesh after creating it
* Subdomain markers are not supported by DOLFIN in parallel execution!
author | Eugenio Gianniti <eugenio.gianniti@mail.polimi.it> |
---|---|
date | Wed, 30 Jul 2014 21:09:52 +0200 |
parents | 8fe68d94ab76 |
children | ab35a8b0deef |
files | src/Mesh.cc |
diffstat | 1 files changed, 200 insertions(+), 187 deletions(-) [+] |
line wrap: on
line diff
--- 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 <dolfin/mesh/MeshPartitioning.h> +#endif DEFUN_DLD (Mesh, args, ,"-*- texinfo -*-\n\ @deftypefn {Function File} {[@var{mesh_out}]} = \ @@ -133,59 +136,67 @@ dolfin::MeshValueCollection<std::size_t> 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 <std::size_t, std::size_t> - 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 <std::size_t, std::size_t> + 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 <std::size_t, std::size_t> - 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 <std::size_t, std::size_t> + idxvl ((*f).index (), e.xelem (9, i)); + msh->domains ().set_marker (idxvl, D - 1); + break; + } } } } @@ -195,159 +206,161 @@ dolfin::MeshValueCollection<std::size_t> 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 <std::size_t, std::size_t> + 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 <std::size_t, std::size_t> - 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 <std::size_t, std::size_t> + 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 <std::size_t, std::size_t> - idxvl ((*f).index (), t.xelem (4, i)); - msh->domains ().set_marker (idxvl, D); - break; - } - } - } - } - - pmsh = msh; + dolfin::MeshPartitioning::build_distributed_mesh (*msh); + pmsh = msh; } }