24 #include "libmesh/mesh_smoother_laplace.h" 
   25 #include "libmesh/mesh_tools.h" 
   26 #include "libmesh/elem.h" 
   27 #include "libmesh/unstructured_mesh.h" 
   28 #include "libmesh/parallel.h" 
   29 #include "libmesh/parallel_ghost_sync.h"  
   30 #include "libmesh/parallel_algebra.h"  
   31 #include "libmesh/int_range.h" 
   59   on_boundary.insert(on_block_boundary.begin(), on_block_boundary.end());
 
   63   std::vector<Point> new_positions;
 
   65   for (
unsigned int n=0; n<n_iterations; n++)
 
   72             libmesh_error_msg(
"[" << 
_mesh.
processor_id() << 
"]: Node iterator returned nullptr.");
 
   77           if (!on_boundary.count(node->id()) && (
_graph[node->id()].size() > 0))
 
   79               Point avg_position(0.,0.,0.);
 
   81               for (
const auto & connected_id : 
_graph[node->id()])
 
   90                   avg_position.
add( connected_node );
 
   94               new_positions[node->id()] = avg_position / static_cast<Real>(
_graph[node->id()].size());
 
  101         if (!on_boundary.count(node->id()) && (
_graph[node->id()].size() > 0))
 
  124       const unsigned int son_begin = elem->n_vertices();
 
  125       const unsigned int son_end   = elem->n_nodes();
 
  128       for (
unsigned int son=son_begin; son<son_end; son++)
 
  131           if (!on_boundary.count(elem->node_id(son)))
 
  133               const unsigned int n_adjacent_vertices =
 
  134                 elem->n_second_order_adjacent_vertices(son);
 
  138               Point avg_position(0,0,0);
 
  139               for (
unsigned int v=0; v<n_adjacent_vertices; v++)
 
  141                   _mesh.
point( elem->node_id( elem->second_order_adjacent_vertex(son,v) ) );
 
  143               _mesh.
node_ref(elem->node_id(son)) = avg_position / n_adjacent_vertices;
 
  170           for (
auto s : elem->side_index_range())
 
  176               if ((elem->neighbor_ptr(s) == 
nullptr) ||
 
  177                   (elem->id() > elem->neighbor_ptr(s)->id()))
 
  179                   std::unique_ptr<const Elem> side(elem->build_side_ptr(s));
 
  180                   _graph[side->node_id(0)].push_back(side->node_id(1));
 
  181                   _graph[side->node_id(1)].push_back(side->node_id(0));
 
  194           for (
auto f : elem->side_index_range()) 
 
  195             if ((elem->neighbor_ptr(f) == 
nullptr) ||
 
  196                 (elem->id() > elem->neighbor_ptr(f)->id()))
 
  200                 std::unique_ptr<const Elem> face = elem->build_side_ptr(f, 
false);
 
  202                 for (
auto s : face->side_index_range()) 
 
  205                     std::unique_ptr<const Elem> side = face->build_side_ptr(s);
 
  210                     _graph[side->node_id(0)].push_back(side->node_id(1));
 
  211                     _graph[side->node_id(1)].push_back(side->node_id(0));
 
  220       libmesh_error_msg(
"At this time it is not possible to smooth a dimension " << 
_mesh.
mesh_dimension() << 
"mesh.  Aborting...");
 
  234   for (
auto & id_vec : 
_graph)
 
  238       std::sort(id_vec.begin(), id_vec.end());
 
  239       id_vec.erase(std::unique(id_vec.begin(), id_vec.end()), id_vec.end());
 
  251       out_stream << i << 
": ";
 
  252       std::copy(
_graph[i].begin(),
 
  254                 std::ostream_iterator<unsigned>(out_stream, 
" "));
 
  255       out_stream << std::endl;
 
  269   std::vector<dof_id_type> flat_graph;
 
  272   flat_graph.reserve(
_graph.size());
 
  274   for (
const auto & id_vec : 
_graph)
 
  277       flat_graph.push_back (cast_int<dof_id_type>(id_vec.size()));
 
  280       for (
const auto & dof : id_vec)
 
  281         flat_graph.push_back(dof);
 
  300   std::size_t cursor=0;
 
  307         std::size_t n_entries = flat_graph[cursor++];
 
  310         _graph[node_ctr].reserve(
_graph[node_ctr].size() + n_entries);
 
  314         for (std::size_t i=0; i<n_entries; ++i)
 
  315           _graph[node_ctr].push_back(flat_graph[cursor++]);