$extrastylesheet
libMesh::SerialMesh Class Reference

#include <serial_mesh.h>

Inheritance diagram for libMesh::SerialMesh:

List of all members.

Public Types

typedef Predicates::multi_predicate Predicate

Public Member Functions

 SerialMesh (const Parallel::Communicator &comm_in, unsigned char dim=1)
 SerialMesh (unsigned char dim=1)
 SerialMesh (const UnstructuredMesh &other_mesh)
 SerialMesh (const SerialMesh &other_mesh)
virtual UniquePtr< MeshBaseclone () const
virtual ~SerialMesh ()
virtual void clear ()
virtual void renumber_nodes_and_elements ()
virtual dof_id_type n_nodes () const
virtual dof_id_type parallel_n_nodes () const
virtual dof_id_type max_node_id () const
virtual void reserve_nodes (const dof_id_type nn)
virtual dof_id_type n_elem () const
virtual dof_id_type parallel_n_elem () const
virtual dof_id_type n_active_elem () const
virtual dof_id_type max_elem_id () const
virtual void reserve_elem (const dof_id_type ne)
virtual void update_parallel_id_counts ()
virtual const Pointpoint (const dof_id_type i) const
virtual const Nodenode (const dof_id_type i) const
virtual Nodenode (const dof_id_type i)
virtual const Nodenode_ptr (const dof_id_type i) const
virtual Nodenode_ptr (const dof_id_type i)
virtual const Nodequery_node_ptr (const dof_id_type i) const
virtual Nodequery_node_ptr (const dof_id_type i)
virtual const Elemelem (const dof_id_type i) const
virtual Elemelem (const dof_id_type i)
virtual const Elemquery_elem (const dof_id_type i) const
virtual Elemquery_elem (const dof_id_type i)
virtual Nodeadd_point (const Point &p, const dof_id_type id=DofObject::invalid_id, const processor_id_type proc_id=DofObject::invalid_processor_id)
virtual Nodeadd_node (Node *n)
virtual Nodeinsert_node (Node *n)
virtual void delete_node (Node *n)
virtual void renumber_node (dof_id_type old_id, dof_id_type new_id)
virtual Elemadd_elem (Elem *e)
virtual Eleminsert_elem (Elem *e)
virtual void delete_elem (Elem *e)
virtual void renumber_elem (dof_id_type old_id, dof_id_type new_id)
virtual void fix_broken_node_and_element_numbering ()
void stitch_meshes (SerialMesh &other_mesh, boundary_id_type this_mesh_boundary, boundary_id_type other_mesh_boundary, Real tol=TOLERANCE, bool clear_stitched_boundary_ids=false, bool verbose=true, bool use_binary_search=true, bool enforce_all_nodes_match_on_boundaries=false)
void stitch_surfaces (boundary_id_type boundary_id_1, boundary_id_type boundary_id_2, Real tol=TOLERANCE, bool clear_stitched_boundary_ids=false, bool verbose=true, bool use_binary_search=true, bool enforce_all_nodes_match_on_boundaries=false)
element_iterator elements_begin ()
element_iterator elements_end ()
element_iterator active_elements_begin ()
element_iterator active_elements_end ()
element_iterator ancestor_elements_begin ()
element_iterator ancestor_elements_end ()
element_iterator subactive_elements_begin ()
element_iterator subactive_elements_end ()
element_iterator not_active_elements_begin ()
element_iterator not_active_elements_end ()
element_iterator not_ancestor_elements_begin ()
element_iterator not_ancestor_elements_end ()
element_iterator not_subactive_elements_begin ()
element_iterator not_subactive_elements_end ()
element_iterator local_elements_begin ()
element_iterator local_elements_end ()
element_iterator semilocal_elements_begin ()
element_iterator semilocal_elements_end ()
element_iterator facelocal_elements_begin ()
element_iterator facelocal_elements_end ()
element_iterator not_local_elements_begin ()
element_iterator not_local_elements_end ()
element_iterator active_local_elements_begin ()
element_iterator active_local_elements_end ()
element_iterator active_not_local_elements_begin ()
element_iterator active_not_local_elements_end ()
element_iterator level_elements_begin (const unsigned int level)
element_iterator level_elements_end (const unsigned int level)
element_iterator not_level_elements_begin (const unsigned int level)
element_iterator not_level_elements_end (const unsigned int level)
element_iterator local_level_elements_begin (const unsigned int level)
element_iterator local_level_elements_end (const unsigned int level)
element_iterator local_not_level_elements_begin (const unsigned int level)
element_iterator local_not_level_elements_end (const unsigned int level)
element_iterator pid_elements_begin (const processor_id_type proc_id)
element_iterator pid_elements_end (const processor_id_type proc_id)
element_iterator type_elements_begin (const ElemType type)
element_iterator type_elements_end (const ElemType type)
element_iterator active_type_elements_begin (const ElemType type)
element_iterator active_type_elements_end (const ElemType type)
element_iterator active_pid_elements_begin (const processor_id_type proc_id)
element_iterator active_pid_elements_end (const processor_id_type proc_id)
element_iterator unpartitioned_elements_begin ()
element_iterator unpartitioned_elements_end ()
element_iterator active_local_subdomain_elements_begin (const subdomain_id_type subdomain_id)
element_iterator active_local_subdomain_elements_end (const subdomain_id_type subdomain_id)
element_iterator active_subdomain_elements_begin (const subdomain_id_type subdomain_id)
element_iterator active_subdomain_elements_end (const subdomain_id_type subdomain_id)
const_element_iterator elements_begin () const
const_element_iterator elements_end () const
const_element_iterator active_elements_begin () const
const_element_iterator active_elements_end () const
const_element_iterator ancestor_elements_begin () const
const_element_iterator ancestor_elements_end () const
const_element_iterator subactive_elements_begin () const
const_element_iterator subactive_elements_end () const
const_element_iterator not_active_elements_begin () const
const_element_iterator not_active_elements_end () const
const_element_iterator not_ancestor_elements_begin () const
const_element_iterator not_ancestor_elements_end () const
const_element_iterator not_subactive_elements_begin () const
const_element_iterator not_subactive_elements_end () const
const_element_iterator local_elements_begin () const
const_element_iterator local_elements_end () const
const_element_iterator semilocal_elements_begin () const
const_element_iterator semilocal_elements_end () const
const_element_iterator facelocal_elements_begin () const
const_element_iterator facelocal_elements_end () const
const_element_iterator not_local_elements_begin () const
const_element_iterator not_local_elements_end () const
const_element_iterator active_local_elements_begin () const
const_element_iterator active_local_elements_end () const
const_element_iterator active_not_local_elements_begin () const
const_element_iterator active_not_local_elements_end () const
const_element_iterator level_elements_begin (const unsigned int level) const
const_element_iterator level_elements_end (const unsigned int level) const
const_element_iterator not_level_elements_begin (const unsigned int level) const
const_element_iterator not_level_elements_end (const unsigned int level) const
const_element_iterator local_level_elements_begin (const unsigned int level) const
const_element_iterator local_level_elements_end (const unsigned int level) const
const_element_iterator local_not_level_elements_begin (const unsigned int level) const
const_element_iterator local_not_level_elements_end (const unsigned int level) const
const_element_iterator pid_elements_begin (const processor_id_type proc_id) const
const_element_iterator pid_elements_end (const processor_id_type proc_id) const
const_element_iterator type_elements_begin (const ElemType type) const
const_element_iterator type_elements_end (const ElemType type) const
const_element_iterator active_type_elements_begin (const ElemType type) const
const_element_iterator active_type_elements_end (const ElemType type) const
const_element_iterator active_pid_elements_begin (const processor_id_type proc_id) const
const_element_iterator active_pid_elements_end (const processor_id_type proc_id) const
const_element_iterator unpartitioned_elements_begin () const
const_element_iterator unpartitioned_elements_end () const
const_element_iterator active_local_subdomain_elements_begin (const subdomain_id_type subdomain_id) const
const_element_iterator active_local_subdomain_elements_end (const subdomain_id_type subdomain_id) const
const_element_iterator active_subdomain_elements_begin (const subdomain_id_type subdomain_id) const
const_element_iterator active_subdomain_elements_end (const subdomain_id_type subdomain_id) const
node_iterator nodes_begin ()
node_iterator nodes_end ()
node_iterator active_nodes_begin ()
node_iterator active_nodes_end ()
node_iterator local_nodes_begin ()
node_iterator local_nodes_end ()
node_iterator pid_nodes_begin (const processor_id_type proc_id)
node_iterator pid_nodes_end (const processor_id_type proc_id)
const_node_iterator nodes_begin () const
const_node_iterator nodes_end () const
const_node_iterator active_nodes_begin () const
const_node_iterator active_nodes_end () const
const_node_iterator local_nodes_begin () const
const_node_iterator local_nodes_end () const
const_node_iterator pid_nodes_begin (const processor_id_type proc_id) const
const_node_iterator pid_nodes_end (const processor_id_type proc_id) const
void read (const std::string &name, MeshData *mesh_data=NULL, bool skip_renumber_nodes_and_elements=false)
void write (const std::string &name, MeshData *mesh_data=NULL)
void write (const std::string &name, const std::vector< Number > &values, const std::vector< std::string > &variable_names)
virtual void all_first_order ()
virtual void all_second_order (const bool full_ordered=true)
void create_pid_mesh (UnstructuredMesh &pid_mesh, const processor_id_type pid) const
void create_submesh (UnstructuredMesh &new_mesh, const_element_iterator &it, const const_element_iterator &it_end) const
virtual void copy_nodes_and_elements (const UnstructuredMesh &other_mesh, const bool skip_find_neighbors=false)
virtual void find_neighbors (const bool reset_remote_elements=false, const bool reset_current_list=true)
virtual bool contract ()
virtual UniquePtr< Partitioner > & partitioner ()
const BoundaryInfoget_boundary_info () const
BoundaryInfoget_boundary_info ()
bool is_prepared () const
virtual bool is_serial () const
virtual void allgather ()
virtual void delete_remote_elements ()
unsigned int mesh_dimension () const
void set_mesh_dimension (unsigned char d)
const std::set< unsigned char > & elem_dimensions () const
unsigned int spatial_dimension () const
dof_id_type n_nodes_on_proc (const processor_id_type proc) const
dof_id_type n_local_nodes () const
dof_id_type n_unpartitioned_nodes () const
unique_id_type next_unique_id ()
void set_next_unique_id (unique_id_type id)
dof_id_type n_elem_on_proc (const processor_id_type proc) const
dof_id_type n_local_elem () const
dof_id_type n_unpartitioned_elem () const
dof_id_type n_active_elem_on_proc (const processor_id_type proc) const
dof_id_type n_active_local_elem () const
dof_id_type n_sub_elem () const
dof_id_type n_active_sub_elem () const
void prepare_for_use (const bool skip_renumber_nodes_and_elements=false, const bool skip_find_neighbors=false)
virtual void partition (const unsigned int n_parts)
void partition ()
virtual void redistribute ()
virtual void update_post_partitioning ()
void allow_renumbering (bool allow)
bool allow_renumbering () const
void skip_partitioning (bool skip)
bool skip_partitioning () const
void subdomain_ids (std::set< subdomain_id_type > &ids) const
subdomain_id_type n_subdomains () const
unsigned int n_partitions () const
std::string get_info () const
void print_info (std::ostream &os=libMesh::out) const
unsigned int recalculate_n_partitions ()
const PointLocatorBasepoint_locator () const
UniquePtr< PointLocatorBasesub_point_locator () const
void clear_point_locator ()
virtual void libmesh_assert_valid_parallel_ids () const
std::string & subdomain_name (subdomain_id_type id)
const std::string & subdomain_name (subdomain_id_type id) const
subdomain_id_type get_id_by_name (const std::string &name) const
std::map< subdomain_id_type,
std::string > & 
set_subdomain_name_map ()
const std::map
< subdomain_id_type,
std::string > & 
get_subdomain_name_map () const
void cache_elem_dims ()
const Parallel::Communicatorcomm () const
processor_id_type n_processors () const
processor_id_type processor_id () const

Public Attributes

UniquePtr< BoundaryInfoboundary_info

Protected Member Functions

virtual void assign_unique_ids ()
unsigned int & set_n_partitions ()

Protected Attributes

std::vector< Node * > _nodes
std::vector< Elem * > _elements
unsigned int _n_parts
bool _is_prepared
UniquePtr< PointLocatorBase_point_locator
UniquePtr< Partitioner_partitioner
unique_id_type _next_unique_id
bool _skip_partitioning
bool _skip_renumber_nodes_and_elements
std::map< subdomain_id_type,
std::string > 
_block_id_to_name
std::set< unsigned char > _elem_dims
const Parallel::Communicator_communicator

Private Types

typedef std::vector< Elem * >
::iterator 
elem_iterator_imp
typedef std::vector< Elem * >
::const_iterator 
const_elem_iterator_imp
typedef std::vector< Node * >
::iterator 
node_iterator_imp
typedef std::vector< Node * >
::const_iterator 
const_node_iterator_imp

Private Member Functions

void stitching_helper (SerialMesh *other_mesh, boundary_id_type boundary_id_1, boundary_id_type boundary_id_2, Real tol, bool clear_stitched_boundary_ids, bool verbose, bool use_binary_search, bool enforce_all_nodes_match_on_boundaries, bool skip_find_neighbors)

Friends

class Partitioner
class MeshInput< MeshBase >
class BoundaryInfo
std::ostream & operator<< (std::ostream &os, const MeshBase &m)

Detailed Description

The SerialMesh class is derived from the MeshBase class, and currently represents the default Mesh implementation. Most methods for this class are found in MeshBase, and most implementation details are found in UnstructuredMesh.

Definition at line 47 of file serial_mesh.h.


Member Typedef Documentation

typedef std::vector<Elem*>::const_iterator libMesh::SerialMesh::const_elem_iterator_imp [private]

Definition at line 447 of file serial_mesh.h.

typedef std::vector<Node*>::const_iterator libMesh::SerialMesh::const_node_iterator_imp [private]

Definition at line 454 of file serial_mesh.h.

typedef std::vector<Elem*>::iterator libMesh::SerialMesh::elem_iterator_imp [private]

Typedefs for the container implementation. In this case, it's just a std::vector<Elem*>.

Definition at line 446 of file serial_mesh.h.

typedef std::vector<Node*>::iterator libMesh::SerialMesh::node_iterator_imp [private]

Typedefs for the container implementation. In this case, it's just a std::vector<Node*>.

Definition at line 453 of file serial_mesh.h.

We need an empty, generic class to act as a predicate for this and derived mesh classes.

Definition at line 647 of file mesh_base.h.


Constructor & Destructor Documentation

libMesh::SerialMesh::SerialMesh ( const Parallel::Communicator comm_in,
unsigned char  dim = 1 
) [explicit]

Constructor. Takes dim, the dimension of the mesh. The mesh dimension can be changed (and may automatically be changed by mesh generation/loading) later.

Definition at line 120 of file serial_mesh.C.

References libMesh::MeshBase::_next_unique_id, and libMesh::MeshBase::_partitioner.

Referenced by clone().

                                         :
  UnstructuredMesh (comm_in,d)
{
#ifdef LIBMESH_ENABLE_UNIQUE_ID
  // In serial we just need to reset the next unique id to zero
  // here in the constructor.
  _next_unique_id = 0;
#endif
  _partitioner = UniquePtr<Partitioner>(new MetisPartitioner());
}
libMesh::SerialMesh::SerialMesh ( unsigned char  dim = 1) [explicit]

Deprecated constructor. Takes dim, the dimension of the mesh. The mesh dimension can be changed (and may automatically be changed by mesh generation/loading) later.

Definition at line 135 of file serial_mesh.C.

References libMesh::MeshBase::_next_unique_id, and libMesh::MeshBase::_partitioner.

                                       :
  UnstructuredMesh (d)
{
#ifdef LIBMESH_ENABLE_UNIQUE_ID
  // In serial we just need to reset the next unique id to zero
  // here in the constructor.
  _next_unique_id = 0;
#endif
  _partitioner = UniquePtr<Partitioner>(new MetisPartitioner());
}

Copy-constructor. This should be able to take a serial or parallel mesh.

Definition at line 165 of file serial_mesh.C.

References libMesh::UnstructuredMesh::copy_nodes_and_elements(), and libMesh::MeshBase::get_boundary_info().

                                                          :
  UnstructuredMesh (other_mesh)
{
  this->copy_nodes_and_elements(other_mesh);
  this->get_boundary_info() = other_mesh.get_boundary_info();
}

Copy-constructor, possibly specialized for a serial mesh.

Definition at line 157 of file serial_mesh.C.

References libMesh::UnstructuredMesh::copy_nodes_and_elements(), and libMesh::MeshBase::get_boundary_info().

                                                    :
  UnstructuredMesh (other_mesh)
{
  this->copy_nodes_and_elements(other_mesh);
  this->get_boundary_info() = other_mesh.get_boundary_info();
}

Destructor.

Definition at line 148 of file serial_mesh.C.

References clear().

{
  this->clear();  // Free nodes and elements
}

Member Function Documentation

Implements libMesh::MeshBase.

Definition at line 47 of file serial_mesh_iterators.C.

References _elements.

Referenced by n_active_elem().

{
  Predicates::Active<elem_iterator_imp> p;
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 290 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Active<const_elem_iterator_imp> p;
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 533 of file serial_mesh_iterators.C.

References _elements.

Referenced by n_active_elem().

{
  Predicates::Active<elem_iterator_imp> p;
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 780 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Active<const_elem_iterator_imp> p;
  return const_element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 147 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::ActiveLocal<elem_iterator_imp> p(this->processor_id());
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 390 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::ActiveLocal<const_elem_iterator_imp> p(this->processor_id());
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 633 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::ActiveLocal<elem_iterator_imp> p(this->processor_id());
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 880 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::ActiveLocal<const_elem_iterator_imp> p(this->processor_id());
  return const_element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 256 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::ActiveLocalSubdomain<elem_iterator_imp> p(this->processor_id(),subdomain_id);
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 499 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::ActiveLocalSubdomain<const_elem_iterator_imp> p(this->processor_id(),subdomain_id);
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 742 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::ActiveLocalSubdomain<elem_iterator_imp> p(this->processor_id(),subdomain_id);
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 989 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::ActiveLocalSubdomain<const_elem_iterator_imp> p(this->processor_id(),subdomain_id);
  return const_element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 1022 of file serial_mesh_iterators.C.

References _nodes.

{
  Predicates::Active<node_iterator_imp> p;
  return node_iterator(_nodes.begin(), _nodes.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 1062 of file serial_mesh_iterators.C.

References _nodes.

{
  Predicates::Active<const_node_iterator_imp> p;
  return const_node_iterator(_nodes.begin(), _nodes.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 1102 of file serial_mesh_iterators.C.

References _nodes.

{
  Predicates::Active<node_iterator_imp> p;
  return node_iterator(_nodes.end(), _nodes.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 1142 of file serial_mesh_iterators.C.

References _nodes.

{
  Predicates::Active<const_node_iterator_imp> p;
  return const_node_iterator(_nodes.end(), _nodes.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 157 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::ActiveNotLocal<elem_iterator_imp> p(this->processor_id());
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 400 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::ActiveNotLocal<const_elem_iterator_imp> p(this->processor_id());
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 643 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::ActiveNotLocal<elem_iterator_imp> p(this->processor_id());
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 890 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::ActiveNotLocal<const_elem_iterator_imp> p(this->processor_id());
  return const_element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 237 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::ActivePID<elem_iterator_imp> p(proc_id);
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 480 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::ActivePID<const_elem_iterator_imp> p(proc_id);
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 723 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::ActivePID<elem_iterator_imp> p(proc_id);
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 970 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::ActivePID<const_elem_iterator_imp> p(proc_id);
  return const_element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 266 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::ActiveSubdomain<elem_iterator_imp> p(subdomain_id);
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 509 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::ActiveSubdomain<const_elem_iterator_imp> p(subdomain_id);
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 752 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::ActiveSubdomain<elem_iterator_imp> p(subdomain_id);
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 999 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::ActiveSubdomain<const_elem_iterator_imp> p(subdomain_id);
  return const_element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 227 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::ActiveType<elem_iterator_imp> p(type);
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 470 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::ActiveType<const_elem_iterator_imp> p(type);
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 713 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::ActiveType<elem_iterator_imp> p(type);
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 960 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::ActiveType<const_elem_iterator_imp> p(type);
  return const_element_iterator(_elements.end(), _elements.end(), p);
}
Elem * libMesh::SerialMesh::add_elem ( Elem e) [virtual]

Add elem e to the end of the element array. To add an element locally, set e->processor_id() before adding it. To ensure a specific element id, call e->set_id() before adding it; only do this in parallel if you are manually keeping ids consistent.

Implements libMesh::MeshBase.

Definition at line 313 of file serial_mesh.C.

References _elements, libMesh::MeshBase::_next_unique_id, libMesh::DofObject::id(), libMesh::libmesh_assert(), libMesh::DofObject::set_id(), libMesh::DofObject::set_unique_id(), libMesh::DofObject::valid_id(), and libMesh::DofObject::valid_unique_id().

{
  libmesh_assert(e);

  // We no longer merely append elements with SerialMesh

  // If the user requests a valid id that doesn't correspond to an
  // existing element, let's give them that id, resizing the elements
  // container if necessary.
  if (!e->valid_id())
    e->set_id (cast_int<dof_id_type>(_elements.size()));

#ifdef LIBMESH_ENABLE_UNIQUE_ID
  if (!e->valid_unique_id())
    e->set_unique_id() = _next_unique_id++;
#endif

  const dof_id_type id = e->id();

  if (id < _elements.size())
    {
      // Overwriting existing elements is still probably a mistake.
      libmesh_assert(!_elements[id]);
    }
  else
    {
      _elements.resize(id+1, NULL);
    }

  _elements[id] = e;

  return e;
}
Node * libMesh::SerialMesh::add_node ( Node n) [virtual]

Add Node n to the end of the vertex array.

Implements libMesh::MeshBase.

Definition at line 473 of file serial_mesh.C.

References libMesh::MeshBase::_next_unique_id, _nodes, libMesh::DofObject::id(), libMesh::libmesh_assert(), libMesh::DofObject::set_id(), libMesh::DofObject::set_unique_id(), libMesh::DofObject::valid_id(), and libMesh::DofObject::valid_unique_id().

{
  libmesh_assert(n);
  // We only append points with SerialMesh
  libmesh_assert(!n->valid_id() || n->id() == _nodes.size());

  n->set_id (cast_int<dof_id_type>(_nodes.size()));

#ifdef LIBMESH_ENABLE_UNIQUE_ID
  if (!n->valid_unique_id())
    n->set_unique_id() = _next_unique_id++;
#endif

  _nodes.push_back(n);

  return n;
}

functions for adding /deleting nodes elements.

Implements libMesh::MeshBase.

Definition at line 425 of file serial_mesh.C.

References _nodes, libMesh::Node::build(), libMesh::DofObject::invalid_id, libMesh::libmesh_assert(), and libMesh::DofObject::processor_id().

{
  //   // We only append points with SerialMesh
  //   libmesh_assert(id == DofObject::invalid_id || id == _nodes.size());
  //   Node *n = Node::build(p, _nodes.size()).release();
  //   n->processor_id() = proc_id;
  //   _nodes.push_back (n);

  Node *n = NULL;

  // If the user requests a valid id, either
  // provide the existing node or resize the container
  // to fit the new node.
  if (id != DofObject::invalid_id)
    if (id < _nodes.size())
      n = _nodes[id];
    else
      _nodes.resize(id+1);
  else
    _nodes.push_back (static_cast<Node*>(NULL));

  // if the node already exists, then assign new (x,y,z) values
  if (n)
    *n = p;
  // otherwise build a new node, put it in the right spot, and return
  // a valid pointer.
  else
    {
      n = Node::build(p, (id == DofObject::invalid_id) ?
                      cast_int<dof_id_type>(_nodes.size()-1) : id).release();
      n->processor_id() = proc_id;

      if (id == DofObject::invalid_id)
        _nodes.back() = n;
      else
        _nodes[id] = n;
    }

  // better not pass back a NULL pointer.
  libmesh_assert (n);

  return n;
}
void libMesh::UnstructuredMesh::all_first_order ( ) [virtual, inherited]

Converts a mesh with higher-order elements into a mesh with linear elements. For example, a mesh consisting of Tet10 will be converted to a mesh with Tet4 etc.

Prepare to identify (and then delete) a bunch of no-longer-used nodes.

Loop over the high-ordered elements. First make sure they _are_ indeed high-order, and then replace them with an equivalent first-order element.

If the second order element had any boundary conditions they should be transfered to the first-order element. The old boundary conditions will be removed from the BoundaryInfo data structure by insert_elem.

Implements libMesh::MeshBase.

Definition at line 293 of file mesh_modification.C.

References libMesh::MeshBase::_is_prepared, libMesh::Elem::add_child(), libMesh::BoundaryInfo::add_side(), libMesh::Elem::build(), libMesh::Elem::child(), libMesh::MeshBase::delete_node(), libMesh::MeshBase::elements_begin(), libMesh::MeshBase::elements_end(), libMesh::Elem::first_order_equivalent_type(), libMesh::MeshBase::get_boundary_info(), libMesh::Elem::get_node(), libMesh::Elem::has_children(), libMesh::DofObject::id(), libMesh::MeshBase::insert_elem(), libMesh::libmesh_assert(), libMesh::MeshBase::max_node_id(), libMesh::Elem::n_children(), libMesh::Elem::n_sides(), libMesh::Elem::n_vertices(), libMesh::Elem::neighbor(), libMesh::Elem::node(), libMesh::MeshBase::nodes_begin(), libMesh::MeshBase::nodes_end(), libMesh::Elem::p_level(), libMesh::Elem::p_refinement_flag(), libMesh::Elem::parent(), libMesh::MeshBase::prepare_for_use(), libMesh::DofObject::processor_id(), libMesh::BoundaryInfo::raw_boundary_ids(), libMesh::Elem::refinement_flag(), libMesh::remote_elem, libMesh::MeshBase::renumber_nodes_and_elements(), libMesh::Elem::replace_child(), libMesh::DofObject::set_id(), libMesh::Elem::set_neighbor(), libMesh::Elem::set_node(), libMesh::Partitioner::set_node_processor_ids(), libMesh::Elem::set_p_level(), libMesh::Elem::set_p_refinement_flag(), libMesh::Elem::set_parent(), libMesh::Elem::set_refinement_flag(), libMesh::START_LOG(), libMesh::Elem::subdomain_id(), libMesh::Elem::type(), and libMesh::Elem::which_child_am_i().

{
  /*
   * when the mesh is not prepared,
   * at least renumber the nodes and
   * elements, so that the node ids
   * are correct
   */
  if (!this->_is_prepared)
    this->renumber_nodes_and_elements ();

  START_LOG("all_first_order()", "Mesh");

  std::vector<bool> node_touched_by_me(this->max_node_id(), false);

  element_iterator endit = elements_end();
  for (element_iterator it = elements_begin();
       it != endit; ++it)
    {
      Elem* so_elem = *it;

      libmesh_assert(so_elem);

      /*
       * build the first-order equivalent, add to
       * the new_elements list.
       */
      Elem* lo_elem = Elem::build
        (Elem::first_order_equivalent_type
         (so_elem->type()), so_elem->parent()).release();

      for (unsigned int s=0; s != so_elem->n_sides(); ++s)
        if (so_elem->neighbor(s) == remote_elem)
          lo_elem->set_neighbor(s, const_cast<RemoteElem*>(remote_elem));

#ifdef LIBMESH_ENABLE_AMR
      /*
       * Reset the parent links of any child elements
       */
      if (so_elem->has_children())
        for (unsigned int c=0; c != so_elem->n_children(); ++c)
          {
            so_elem->child(c)->set_parent(lo_elem);
            lo_elem->add_child(so_elem->child(c), c);
          }

      /*
       * Reset the child link of any parent element
       */
      if (so_elem->parent())
        {
          unsigned int c =
            so_elem->parent()->which_child_am_i(so_elem);
          lo_elem->parent()->replace_child(lo_elem, c);
        }

      /*
       * Copy as much data to the new element as makes sense
       */
      lo_elem->set_p_level(so_elem->p_level());
      lo_elem->set_refinement_flag(so_elem->refinement_flag());
      lo_elem->set_p_refinement_flag(so_elem->p_refinement_flag());
#endif

      libmesh_assert_equal_to (lo_elem->n_vertices(), so_elem->n_vertices());

      /*
       * By definition the vertices of the linear and
       * second order element are identically numbered.
       * transfer these.
       */
      for (unsigned int v=0; v < so_elem->n_vertices(); v++)
        {
          lo_elem->set_node(v) = so_elem->get_node(v);
          node_touched_by_me[lo_elem->node(v)] = true;
        }

      libmesh_assert_equal_to (lo_elem->n_sides(), so_elem->n_sides());

      for (unsigned short s=0; s<so_elem->n_sides(); s++)
        {
          const std::vector<boundary_id_type> boundary_ids =
            this->get_boundary_info().raw_boundary_ids (so_elem, s);

          this->get_boundary_info().add_side (lo_elem, s, boundary_ids);
        }

      /*
       * The new first-order element is ready.
       * Inserting it into the mesh will replace and delete
       * the second-order element.
       */
      lo_elem->set_id(so_elem->id());
      lo_elem->processor_id() = so_elem->processor_id();
      lo_elem->subdomain_id() = so_elem->subdomain_id();
      this->insert_elem(lo_elem);
    }

  const MeshBase::node_iterator nd_end = this->nodes_end();
  MeshBase::node_iterator nd = this->nodes_begin();
  while (nd != nd_end)
    {
      Node *the_node = *nd;
      ++nd;
      if (!node_touched_by_me[the_node->id()])
        this->delete_node(the_node);
    }

  STOP_LOG("all_first_order()", "Mesh");

  // On hanging nodes that used to also be second order nodes, we
  // might now have an invalid nodal processor_id()
  Partitioner::set_node_processor_ids(*this);

  // delete or renumber nodes, etc
  this->prepare_for_use(/*skip_renumber =*/ false);
}
void libMesh::UnstructuredMesh::all_second_order ( const bool  full_ordered = true) [virtual, inherited]

Converts a (conforming, non-refined) mesh with linear elements into a mesh with second-order elements. For example, a mesh consisting of Tet4 will be converted to a mesh with Tet10 etc. Note that for some elements like Hex8 there exist two higher order equivalents, Hex20 and Hex27. When full_ordered is true (default), then Hex27 is built. Otherwise, Hex20 is built. The same holds obviously for Quad4, Prism6 ...

Loop over the low-ordered elements in the _elements vector. First make sure they _are_ indeed low-order, and then replace them with an equivalent second-order element. Don't forget to delete the low-order element, or else it will leak!

If the linear element had any boundary conditions they should be transfered to the second-order element. The old boundary conditions will be removed from the BoundaryInfo data structure by insert_elem.

Also, prepare_for_use() will reconstruct most of our neighbor links, but if we have any remote_elem links in a distributed mesh, they need to be preserved. We do that in the same loop here.

Implements libMesh::MeshBase.

Definition at line 427 of file mesh_modification.C.

References libMesh::MeshBase::_is_prepared, libMesh::MeshBase::add_point(), libMesh::BoundaryInfo::add_side(), libMesh::Elem::build(), libMesh::ParallelObject::comm(), libMesh::Elem::default_order(), libMesh::MeshBase::elements_begin(), libMesh::MeshBase::elements_end(), libMesh::FIRST, libMesh::MeshBase::get_boundary_info(), libMesh::Elem::get_node(), libMesh::DofObject::id(), libMesh::MeshBase::insert_elem(), libMesh::DofObject::invalid_id, libMesh::MeshBase::is_serial(), libMesh::Elem::level(), libMesh::libmesh_assert(), libMesh::MeshCommunication::make_nodes_parallel_consistent(), libMesh::Parallel::Communicator::max(), libMesh::MeshBase::mesh_dimension(), libMesh::MeshBase::n_elem(), libMesh::MeshBase::n_nodes(), libMesh::Elem::n_sides(), libMesh::Elem::n_vertices(), libMesh::Elem::neighbor(), libMesh::MeshBase::node(), libMesh::MeshBase::point(), libMesh::MeshBase::prepare_for_use(), libMesh::ParallelObject::processor_id(), libMesh::DofObject::processor_id(), libMesh::BoundaryInfo::raw_boundary_ids(), libMesh::Real, libMesh::remote_elem, libMesh::MeshBase::renumber_nodes_and_elements(), libMesh::MeshBase::reserve_nodes(), libMesh::Elem::second_order_equivalent_type(), libMesh::START_LOG(), libMesh::Elem::subdomain_id(), and libMesh::Elem::type().

Referenced by libMesh::MeshTools::Generation::build_cube().

{
  // This function must be run on all processors at once
  parallel_object_only();

  /*
   * when the mesh is not prepared,
   * at least renumber the nodes and
   * elements, so that the node ids
   * are correct
   */
  if (!this->_is_prepared)
    this->renumber_nodes_and_elements ();

  /*
   * If the mesh is empty
   * then we have nothing to do
   */
  if (!this->n_elem())
    return;

  /*
   * If the mesh is already second order
   * then we have nothing to do.
   * We have to test for this in a round-about way to avoid
   * a bug on distributed parallel meshes with more processors
   * than elements.
   */
  bool already_second_order = false;
  if (this->elements_begin() != this->elements_end() &&
      (*(this->elements_begin()))->default_order() != FIRST)
    already_second_order = true;
  this->comm().max(already_second_order);
  if (already_second_order)
    return;

  START_LOG("all_second_order()", "Mesh");

  /*
   * this map helps in identifying second order
   * nodes.  Namely, a second-order node:
   * - edge node
   * - face node
   * - bubble node
   * is uniquely defined through a set of adjacent
   * vertices.  This set of adjacent vertices is
   * used to identify already added higher-order
   * nodes.  We are safe to use node id's since we
   * make sure that these are correctly numbered.
   */
  std::map<std::vector<dof_id_type>, Node*> adj_vertices_to_so_nodes;

  /*
   * for speed-up of the \p add_point() method, we
   * can reserve memory.  Guess the number of additional
   * nodes for different dimensions
   */
  switch (this->mesh_dimension())
    {
    case 1:
      /*
       * in 1D, there can only be order-increase from Edge2
       * to Edge3.  Something like 1/2 of n_nodes() have
       * to be added
       */
      this->reserve_nodes(static_cast<unsigned int>
                          (1.5*static_cast<double>(this->n_nodes())));
      break;

    case 2:
      /*
       * in 2D, either refine from Tri3 to Tri6 (double the nodes)
       * or from Quad4 to Quad8 (again, double) or Quad9 (2.25 that much)
       */
      this->reserve_nodes(static_cast<unsigned int>
                          (2*static_cast<double>(this->n_nodes())));
      break;


    case 3:
      /*
       * in 3D, either refine from Tet4 to Tet10 (factor = 2.5) up to
       * Hex8 to Hex27 (something  > 3).  Since in 3D there _are_ already
       * quite some nodes, and since we do not want to overburden the memory by
       * a too conservative guess, use the lower bound
       */
      this->reserve_nodes(static_cast<unsigned int>
                          (2.5*static_cast<double>(this->n_nodes())));
      break;

    default:
      // Hm?
      libmesh_error_msg("Unknown mesh dimension " << this->mesh_dimension());
    }



  /*
   * form a vector that will hold the node id's of
   * the vertices that are adjacent to the son-th
   * second-order node.  Pull this outside of the
   * loop so that silly compilers don't repeatedly
   * create and destroy the vector.
   */
  std::vector<dof_id_type> adjacent_vertices_ids;

  const_element_iterator endit = elements_end();
  for (const_element_iterator it = elements_begin();
       it != endit; ++it)
    {
      // the linear-order element
      const Elem* lo_elem = *it;

      libmesh_assert(lo_elem);

      // make sure it is linear order
      if (lo_elem->default_order() != FIRST)
        libmesh_error_msg("ERROR: This is not a linear element: type=" << lo_elem->type());

      // this does _not_ work for refined elements
      libmesh_assert_equal_to (lo_elem->level (), 0);

      /*
       * build the second-order equivalent, add to
       * the new_elements list.  Note that this here
       * is the only point where \p full_ordered
       * is necessary.  The remaining code works well
       * for either type of seconrd-order equivalent, e.g.
       * Hex20 or Hex27, as equivalents for Hex8
       */
      Elem* so_elem =
        Elem::build (Elem::second_order_equivalent_type(lo_elem->type(),
                                                        full_ordered) ).release();

      libmesh_assert_equal_to (lo_elem->n_vertices(), so_elem->n_vertices());


      /*
       * By definition the vertices of the linear and
       * second order element are identically numbered.
       * transfer these.
       */
      for (unsigned int v=0; v < lo_elem->n_vertices(); v++)
        so_elem->set_node(v) = lo_elem->get_node(v);

      /*
       * Now handle the additional mid-side nodes.  This
       * is simply handled through a map that remembers
       * the already-added nodes.  This map maps the global
       * ids of the vertices (that uniquely define this
       * higher-order node) to the new node.
       * Notation: son = second-order node
       */
      const unsigned int son_begin = so_elem->n_vertices();
      const unsigned int son_end   = so_elem->n_nodes();


      for (unsigned int son=son_begin; son<son_end; son++)
        {
          const unsigned int n_adjacent_vertices =
            so_elem->n_second_order_adjacent_vertices(son);

          adjacent_vertices_ids.resize(n_adjacent_vertices);

          for (unsigned int v=0; v<n_adjacent_vertices; v++)
            adjacent_vertices_ids[v] =
              so_elem->node( so_elem->second_order_adjacent_vertex(son,v) );

          /*
           * \p adjacent_vertices_ids is now in order of the current
           * side.  sort it, so that comparisons  with the
           * \p adjacent_vertices_ids created through other elements'
           * sides can match
           */
          std::sort(adjacent_vertices_ids.begin(),
                    adjacent_vertices_ids.end());


          // does this set of vertices already has a mid-node added?
          std::pair<std::map<std::vector<dof_id_type>, Node*>::iterator,
            std::map<std::vector<dof_id_type>, Node*>::iterator>
            pos = adj_vertices_to_so_nodes.equal_range (adjacent_vertices_ids);

          // no, not added yet
          if (pos.first == pos.second)
            {
              /*
               * for this set of vertices, there is no
               * second_order node yet.  Add it.
               *
               * compute the location of the new node as
               * the average over the adjacent vertices.
               */
              Point new_location = this->point(adjacent_vertices_ids[0]);
              for (unsigned int v=1; v<n_adjacent_vertices; v++)
                new_location += this->point(adjacent_vertices_ids[v]);

              new_location /= static_cast<Real>(n_adjacent_vertices);

              /* Add the new point to the mesh, giving it a globally
               * well-defined processor id.
               */
              Node* so_node = this->add_point
                (new_location, DofObject::invalid_id,
                 this->node(adjacent_vertices_ids[0]).processor_id());

              /*
               * insert the new node with its defining vertex
               * set into the map, and relocate pos to this
               * new entry, so that the so_elem can use
               * \p pos for inserting the node
               */
              adj_vertices_to_so_nodes.insert(pos.first,
                                              std::make_pair(adjacent_vertices_ids,
                                                             so_node));

              so_elem->set_node(son) = so_node;
            }
          // yes, already added.
          else
            {
              libmesh_assert(pos.first->second);

              so_elem->set_node(son) = pos.first->second;
            }
        }


      libmesh_assert_equal_to (lo_elem->n_sides(), so_elem->n_sides());

      for (unsigned short s=0; s<lo_elem->n_sides(); s++)
        {
          const std::vector<boundary_id_type> boundary_ids =
            this->get_boundary_info().raw_boundary_ids (lo_elem, s);

          this->get_boundary_info().add_side (so_elem, s, boundary_ids);

          if (lo_elem->neighbor(s) == remote_elem)
            so_elem->set_neighbor(s, const_cast<RemoteElem*>(remote_elem));
        }

      /*
       * The new second-order element is ready.
       * Inserting it into the mesh will replace and delete
       * the first-order element.
       */
      so_elem->set_id(lo_elem->id());
      so_elem->processor_id() = lo_elem->processor_id();
      so_elem->subdomain_id() = lo_elem->subdomain_id();
      this->insert_elem(so_elem);
    }

  // we can clear the map
  adj_vertices_to_so_nodes.clear();


  STOP_LOG("all_second_order()", "Mesh");

  // In a ParallelMesh our ghost node processor ids may be bad and
  // the ids of nodes touching remote elements may be inconsistent.
  // Fix them.
  if (!this->is_serial())
    MeshCommunication().make_nodes_parallel_consistent (*this);

  // renumber nodes, elements etc
  this->prepare_for_use(/*skip_renumber =*/ false);
}
virtual void libMesh::MeshBase::allgather ( ) [inline, virtual, inherited]

Gathers all elements and nodes of the mesh onto every processor

Reimplemented in libMesh::ParallelMesh.

Definition at line 145 of file mesh_base.h.

Referenced by libMesh::EquationSystems::allgather(), and libMesh::MeshSerializer::MeshSerializer().

{}
void libMesh::MeshBase::allow_renumbering ( bool  allow) [inline, inherited]

If false is passed in then this mesh will no longer be renumbered when being prepared for use. This may slightly adversely affect performance during subsequent element access, particulary when using a distributed mesh.

Definition at line 551 of file mesh_base.h.

References libMesh::MeshBase::_skip_renumber_nodes_and_elements.

Referenced by libMesh::UnstructuredMesh::copy_nodes_and_elements(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ErrorVector::plot_error(), and libMesh::NameBasedIO::read().

Implements libMesh::MeshBase.

Definition at line 67 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Ancestor<elem_iterator_imp> p;
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 310 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Ancestor<const_elem_iterator_imp> p;
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 553 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Ancestor<elem_iterator_imp> p;
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 800 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Ancestor<const_elem_iterator_imp> p;
  return const_element_iterator(_elements.end(), _elements.end(), p);
}
void libMesh::SerialMesh::assign_unique_ids ( ) [protected, virtual]

Assign globally unique IDs to all DOF objects (Elements and Nodes) if the library has been configured with unique_id support.

Implements libMesh::MeshBase.

Definition at line 1467 of file serial_mesh.C.

References _elements, libMesh::MeshBase::_next_unique_id, and _nodes.

{
  for (dof_id_type i=0; i<_elements.size(); ++i)
    if (_elements[i] && ! _elements[i]->valid_unique_id())
      _elements[i]->set_unique_id() = _next_unique_id++;

  for (dof_id_type i=0; i<_nodes.size(); ++i)
    if (_nodes[i] && ! _nodes[i]->valid_unique_id())
      _nodes[i]->set_unique_id() = _next_unique_id++;
}
void libMesh::MeshBase::cache_elem_dims ( ) [inherited]

Search the mesh and cache the different dimenions of the elements present in the mesh. This is done in prepare_for_use(), but can be done manually by other classes after major mesh modifications.

Definition at line 497 of file mesh_base.C.

References libMesh::MeshBase::_elem_dims, libMesh::MeshBase::active_local_elements_begin(), libMesh::MeshBase::active_local_elements_end(), libMesh::ParallelObject::comm(), end, and libMesh::Parallel::Communicator::set_union().

Referenced by libMesh::MeshBase::prepare_for_use().

{
  // This requires an inspection on every processor
  parallel_object_only();

  const_element_iterator el  = this->active_local_elements_begin();
  const_element_iterator end = this->active_local_elements_end();

  for (; el!=end; ++el)
    _elem_dims.insert((*el)->dim());

  // Some different dimension elements may only live on other processors
  this->comm().set_union(_elem_dims);
}
void libMesh::SerialMesh::clear ( ) [virtual]

Clear all internal data.

Reimplemented from libMesh::MeshBase.

Definition at line 586 of file serial_mesh.C.

References _elements, _nodes, and end.

Referenced by ~SerialMesh().

{
  // Call parent clear function
  MeshBase::clear();


  // Clear our elements and nodes
  {
    std::vector<Elem*>::iterator       it  = _elements.begin();
    const std::vector<Elem*>::iterator end = _elements.end();

    // There is no need to remove the elements from
    // the BoundaryInfo data structure since we
    // already cleared it.
    for (; it != end; ++it)
      delete *it;

    _elements.clear();
  }

  // clear the nodes data structure
  {
    std::vector<Node*>::iterator       it  = _nodes.begin();
    const std::vector<Node*>::iterator end = _nodes.end();

    // There is no need to remove the nodes from
    // the BoundaryInfo data structure since we
    // already cleared it.
    for (; it != end; ++it)
      delete *it;

    _nodes.clear();
  }
}

Releases the current PointLocator object.

Definition at line 454 of file mesh_base.C.

References libMesh::MeshBase::_point_locator.

Referenced by libMesh::MeshBase::clear(), libMesh::UnstructuredMesh::contract(), and libMesh::MeshBase::prepare_for_use().

{
  _point_locator.reset(NULL);
}
virtual UniquePtr<MeshBase> libMesh::SerialMesh::clone ( ) const [inline, virtual]

Virtual copy-constructor, creates a copy of this mesh

Implements libMesh::MeshBase.

Definition at line 86 of file serial_mesh.h.

References SerialMesh().

  { return UniquePtr<MeshBase>(new SerialMesh(*this)); }
const Parallel::Communicator& libMesh::ParallelObject::comm ( ) const [inline, inherited]
Returns:
a reference to the Parallel::Communicator object used by this mesh.

Definition at line 86 of file parallel_object.h.

References libMesh::ParallelObject::_communicator.

Referenced by libMesh::__libmesh_petsc_diff_solver_monitor(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::__libmesh_petsc_snes_residual(), libMesh::MeshRefinement::_coarsen_elements(), libMesh::ExactSolution::_compute_error(), libMesh::MetisPartitioner::_do_partition(), libMesh::ParmetisPartitioner::_do_repartition(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::SlepcEigenSolver< T >::_petsc_shell_matrix_get_diagonal(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_get_diagonal(), libMesh::SlepcEigenSolver< T >::_petsc_shell_matrix_mult(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_mult(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_mult_add(), libMesh::EquationSystems::_read_impl(), libMesh::MeshRefinement::_refine_elements(), libMesh::ImplicitSystem::add_matrix(), libMesh::System::add_vector(), libMesh::UnstructuredMesh::all_second_order(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::FEMSystem::assemble_qoi(), libMesh::MeshCommunication::assign_global_indices(), libMesh::ParmetisPartitioner::assign_partitioning(), libMesh::DofMap::attach_matrix(), libMesh::MeshTools::bounding_box(), libMesh::MeshBase::cache_elem_dims(), libMesh::System::calculate_norm(), libMesh::MeshRefinement::coarsen_elements(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::Problem_Interface::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::DofMap::distribute_dofs(), DMlibMeshFunction(), DMlibMeshSetSystem_libMesh(), libMesh::MeshRefinement::eliminate_unrefined_patches(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::MeshRefinement::flag_elements_by_elem_fraction(), libMesh::MeshRefinement::flag_elements_by_error_fraction(), libMesh::MeshRefinement::flag_elements_by_nelem_target(), libMesh::CondensedEigenSystem::get_eigenpair(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::LocationMap< T >::init(), libMesh::TimeSolver::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::EigenSystem::init_data(), libMesh::EigenSystem::init_matrices(), libMesh::ParmetisPartitioner::initialize(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::ParallelMesh::libmesh_assert_valid_parallel_flags(), libMesh::MeshTools::libmesh_assert_valid_procids< Elem >(), libMesh::MeshTools::libmesh_assert_valid_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::MeshRefinement::limit_level_mismatch_at_edge(), libMesh::MeshRefinement::limit_level_mismatch_at_node(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::MeshCommunication::make_elems_parallel_consistent(), libMesh::MeshRefinement::make_flags_parallel_consistent(), libMesh::MeshCommunication::make_node_ids_parallel_consistent(), libMesh::MeshCommunication::make_node_proc_ids_parallel_consistent(), libMesh::MeshCommunication::make_nodes_parallel_consistent(), libMesh::MeshRefinement::make_refinement_compatible(), libMesh::FEMSystem::mesh_position_set(), libMesh::MeshSerializer::MeshSerializer(), libMesh::ParallelMesh::n_active_elem(), libMesh::MeshTools::n_active_levels(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::CondensedEigenSystem::n_global_non_condensed_dofs(), libMesh::MeshTools::n_levels(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::MeshTools::n_p_levels(), libMesh::ParallelMesh::parallel_max_elem_id(), libMesh::ParallelMesh::parallel_max_node_id(), libMesh::ParallelMesh::parallel_n_elem(), libMesh::ParallelMesh::parallel_n_nodes(), libMesh::Partitioner::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::petsc_auto_fieldsplit(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::MeshBase::prepare_for_use(), libMesh::System::project_vector(), libMesh::Nemesis_IO::read(), libMesh::XdrIO::read(), libMesh::System::read_header(), libMesh::System::read_legacy_data(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), libMesh::MeshBase::recalculate_n_partitions(), libMesh::MeshRefinement::refine_and_coarsen_elements(), libMesh::MeshRefinement::refine_elements(), libMesh::Partitioner::set_node_processor_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::LaplaceMeshSmoother::smooth(), libMesh::MeshBase::subdomain_ids(), libMesh::BoundaryInfo::sync(), libMesh::Parallel::sync_element_data_by_parent_id(), libMesh::Parallel::sync_node_data_by_element_id(), libMesh::MeshRefinement::test_level_one(), libMesh::MeshRefinement::test_unflagged(), libMesh::MeshTools::total_weight(), libMesh::NameBasedIO::write(), libMesh::CheckpointIO::write(), libMesh::XdrIO::write(), libMesh::LegacyXdrIO::write_mesh(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bcs(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), and libMesh::DivaIO::write_stream().

  { return _communicator; }
bool libMesh::UnstructuredMesh::contract ( ) [virtual, inherited]

Delete subactive (i.e. children of coarsened) elements. This removes all elements descended from currently active elements in the mesh.

Implements libMesh::MeshBase.

Definition at line 694 of file unstructured_mesh.C.

References libMesh::Elem::active(), libMesh::Elem::ancestor(), libMesh::MeshBase::clear_point_locator(), libMesh::Elem::contract(), libMesh::MeshBase::delete_elem(), libMesh::MeshBase::elements_begin(), libMesh::MeshBase::elements_end(), end, libMesh::libmesh_assert(), libMesh::Elem::parent(), libMesh::MeshBase::renumber_nodes_and_elements(), libMesh::START_LOG(), and libMesh::Elem::subactive().

{
  START_LOG ("contract()", "Mesh");

  // Flag indicating if this call actually changes the mesh
  bool mesh_changed = false;

  element_iterator in        = elements_begin();
  const element_iterator end = elements_end();

#ifdef DEBUG
  for ( ; in != end; ++in)
    if (*in != NULL)
      {
        Elem* el = *in;
        libmesh_assert(el->active() || el->subactive() || el->ancestor());
      }
  in = elements_begin();
#endif

  // Loop over the elements.
  for ( ; in != end; ++in)
    if (*in != NULL)
      {
        Elem* el = *in;

        // Delete all the subactive ones
        if (el->subactive())
          {
            // No level-0 element should be subactive.
            // Note that we CAN'T test elem->level(), as that
            // touches elem->parent()->dim(), and elem->parent()
            // might have already been deleted!
            libmesh_assert(el->parent());

            // Delete the element
            // This just sets a pointer to NULL, and doesn't
            // invalidate any iterators
            this->delete_elem(el);

            // the mesh has certainly changed
            mesh_changed = true;
          }
        else
          {
            // Compress all the active ones
            if (el->active())
              el->contract();
            else
              libmesh_assert (el->ancestor());
          }
      }

  // Strip any newly-created NULL voids out of the element array
  this->renumber_nodes_and_elements();

  // FIXME: Need to understand why deleting subactive children
  // invalidates the point locator.  For now we will clear it explicitly
  this->clear_point_locator();

  STOP_LOG ("contract()", "Mesh");

  return mesh_changed;
}
void libMesh::UnstructuredMesh::copy_nodes_and_elements ( const UnstructuredMesh other_mesh,
const bool  skip_find_neighbors = false 
) [virtual, inherited]

Deep copy of another unstructured mesh class (used by subclass copy constructors)

Definition at line 74 of file unstructured_mesh.C.

References libMesh::MeshBase::_elem_dims, libMesh::MeshBase::_is_prepared, libMesh::MeshBase::_n_parts, libMesh::Elem::add_child(), libMesh::MeshBase::allow_renumbering(), libMesh::Elem::build(), libMesh::Elem::child(), libMesh::MeshBase::elements_begin(), libMesh::MeshBase::elements_end(), end, equal(), libMesh::Elem::has_children(), libMesh::DofObject::id(), libMesh::libmesh_assert(), libMesh::MeshTools::libmesh_assert_valid_amr_elem_ids(), libMesh::Elem::n_children(), libMesh::MeshBase::n_elem(), libMesh::Elem::n_neighbors(), libMesh::MeshBase::n_nodes(), libMesh::Elem::n_sides(), libMesh::Elem::neighbor(), libMesh::Elem::node(), libMesh::MeshBase::nodes_begin(), libMesh::MeshBase::nodes_end(), libMesh::Elem::p_refinement_flag(), libMesh::Elem::parent(), libMesh::DofObject::processor_id(), libMesh::Elem::refinement_flag(), libMesh::remote_elem, libMesh::Elem::set_neighbor(), libMesh::MeshBase::skip_partitioning(), libMesh::Elem::subdomain_id(), libMesh::Elem::type(), and libMesh::Elem::which_child_am_i().

Referenced by libMesh::ParallelMesh::ParallelMesh(), SerialMesh(), and stitching_helper().

{
  // We're assuming our subclass data needs no copy
  libmesh_assert_equal_to (_n_parts, other_mesh._n_parts);
  libmesh_assert (std::equal(_elem_dims.begin(), _elem_dims.end(), other_mesh._elem_dims.begin()));
  libmesh_assert_equal_to (_is_prepared, other_mesh._is_prepared);

  // We're assuming the other mesh has proper element number ordering,
  // so that we add parents before their children.
#ifdef DEBUG
  MeshTools::libmesh_assert_valid_amr_elem_ids(other_mesh);
#endif

  //Copy in Nodes
  {
    //Preallocate Memory if necessary
    this->reserve_nodes(other_mesh.n_nodes());

    const_node_iterator it = other_mesh.nodes_begin();
    const_node_iterator end = other_mesh.nodes_end();

    for (; it != end; ++it)
      {
        const Node *oldn = *it;

        // Add new nodes in old node Point locations
        /*Node *newn =*/ this->add_point(*oldn, oldn->id(), oldn->processor_id());

        // And start them off in the same subdomain
        //        newn->processor_id() = oldn->processor_id();
      }
  }

  //Copy in Elements
  {
    //Preallocate Memory if necessary
    this->reserve_elem(other_mesh.n_elem());

    // Declare a map linking old and new elements, needed to copy the neighbor lists
    std::map<const Elem*, Elem*> old_elems_to_new_elems;

    // Loop over the elements
    MeshBase::const_element_iterator it = other_mesh.elements_begin();
    const MeshBase::const_element_iterator end = other_mesh.elements_end();

    // FIXME: Where do we set element IDs??
    for (; it != end; ++it)
      {
        //Look at the old element
        const Elem *old = *it;
        //Build a new element
        Elem *newparent = old->parent() ?
          this->elem(old->parent()->id()) : NULL;
        UniquePtr<Elem> ap = Elem::build(old->type(), newparent);
        Elem * el = ap.release();

        el->subdomain_id() = old->subdomain_id();

        for (unsigned int s=0; s != old->n_sides(); ++s)
          if (old->neighbor(s) == remote_elem)
            el->set_neighbor(s, const_cast<RemoteElem*>(remote_elem));

#ifdef LIBMESH_ENABLE_AMR
        if (old->has_children())
          for (unsigned int c=0; c != old->n_children(); ++c)
            if (old->child(c) == remote_elem)
              el->add_child(const_cast<RemoteElem*>(remote_elem), c);

        //Create the parent's child pointers if necessary
        if (newparent)
          {
            unsigned int oldc = old->parent()->which_child_am_i(old);
            newparent->add_child(el, oldc);
          }

        // Copy the refinement flags
        el->set_refinement_flag(old->refinement_flag());
        el->set_p_refinement_flag(old->p_refinement_flag());
#endif // #ifdef LIBMESH_ENABLE_AMR

        //Assign all the nodes
        for(unsigned int i=0;i<el->n_nodes();i++)
          el->set_node(i) = &this->node(old->node(i));

        // And start it off in the same subdomain
        el->processor_id() = old->processor_id();

        // Give it the same id
        el->set_id(old->id());

        //Hold onto it
        if(!skip_find_neighbors)
          {
            this->add_elem(el);
          }
        else
          {
            Elem* new_el = this->add_elem(el);
            old_elems_to_new_elems[old] = new_el;
          }

        // Add the link between the original element and this copy to the map
        if(skip_find_neighbors)
          old_elems_to_new_elems[old] = el;
      }

    // Loop (again) over the elements to fill in the neighbors
    if(skip_find_neighbors)
      {
        it = other_mesh.elements_begin();
        for (; it != end; ++it)
          {
            Elem* old_elem = *it;
            Elem* new_elem = old_elems_to_new_elems[old_elem];
            for (unsigned int s=0; s != old_elem->n_neighbors(); ++s)
              {
                const Elem* old_neighbor = old_elem->neighbor(s);
                Elem* new_neighbor = old_elems_to_new_elems[old_neighbor];
                new_elem->set_neighbor(s, new_neighbor);
              }
          }
      }
  }

  //Finally prepare the new Mesh for use.  Keep the same numbering and
  //partitioning but also the same renumbering and partitioning
  //policies as our source mesh.
  this->allow_renumbering(false);
  this->skip_partitioning(true);
  this->prepare_for_use(false, skip_find_neighbors);
  this->allow_renumbering(other_mesh.allow_renumbering());
  this->skip_partitioning(other_mesh.skip_partitioning());
}
void libMesh::UnstructuredMesh::create_pid_mesh ( UnstructuredMesh pid_mesh,
const processor_id_type  pid 
) const [inherited]

Generates a new mesh containing all the elements which are assigned to processor pid. This mesh is written to the pid_mesh reference which you must create and pass to the function.

Definition at line 560 of file unstructured_mesh.C.

References libMesh::MeshBase::active_pid_elements_begin(), libMesh::MeshBase::active_pid_elements_end(), libMesh::UnstructuredMesh::create_submesh(), libMesh::ParallelObject::n_processors(), and libMesh::out.

{

  // Issue a warning if the number the number of processors
  // currently available is less that that requested for
  // partitioning.  This is not necessarily an error since
  // you may run on one processor and still partition the
  // mesh into several partitions.
#ifdef DEBUG
  if (this->n_processors() < pid)
    {
      libMesh::out << "WARNING:  You are creating a "
                   << "mesh for a processor id (="
                   << pid
                   << ") greater than "
                   << "the number of processors available for "
                   << "the calculation. (="
                   << this->n_processors()
                   << ")."
                   << std::endl;
    }
#endif

  // Create iterators to loop over the list of elements
  //   const_active_pid_elem_iterator       it(this->elements_begin(),   pid);
  //   const const_active_pid_elem_iterator it_end(this->elements_end(), pid);

  const_element_iterator       it     = this->active_pid_elements_begin(pid);
  const const_element_iterator it_end = this->active_pid_elements_end(pid);

  this->create_submesh (pid_mesh, it, it_end);
}
void libMesh::UnstructuredMesh::create_submesh ( UnstructuredMesh new_mesh,
const_element_iterator it,
const const_element_iterator it_end 
) const [inherited]

Constructs a mesh called "new_mesh" from the current mesh by iterating over the elements between it and it_end and adding them to the new mesh.

Definition at line 600 of file unstructured_mesh.C.

References libMesh::MeshBase::add_elem(), libMesh::MeshBase::add_point(), libMesh::BoundaryInfo::add_side(), bc_id, libMesh::BoundaryInfo::boundary_ids(), libMesh::Elem::build(), libMesh::MeshBase::clear(), libMesh::MeshBase::get_boundary_info(), libMesh::DofObject::invalid_id, libMesh::BoundaryInfo::invalid_id, libMesh::libmesh_assert(), libMesh::MeshBase::n_elem(), libMesh::MeshBase::n_nodes(), libMesh::Elem::n_nodes(), libMesh::Elem::n_sides(), libMesh::Elem::node(), libMesh::MeshBase::node_ptr(), libMesh::Elem::point(), libMesh::MeshBase::prepare_for_use(), libMesh::DofObject::processor_id(), libMesh::Elem::set_node(), libMesh::Elem::subdomain_id(), and libMesh::Elem::type().

Referenced by libMesh::UnstructuredMesh::create_pid_mesh().

{
  // Just in case the subdomain_mesh already has some information
  // in it, get rid of it.
  new_mesh.clear();

  // Fail if (*this == new_mesh), we cannot create a submesh inside ourself!
  // This may happen if the user accidently passes the original mesh into
  // this function!  We will check this by making sure we did not just
  // clear ourself.
  libmesh_assert_not_equal_to (this->n_nodes(), 0);
  libmesh_assert_not_equal_to (this->n_elem(), 0);

  // How the nodes on this mesh will be renumbered to nodes
  // on the new_mesh.
  std::vector<dof_id_type> new_node_numbers (this->n_nodes());

  std::fill (new_node_numbers.begin(),
             new_node_numbers.end(),
             DofObject::invalid_id);



  // the number of nodes on the new mesh, will be incremented
  dof_id_type n_new_nodes = 0;
  dof_id_type n_new_elem  = 0;

  for (; it != it_end; ++it)
    {
      // increment the new element counter
      n_new_elem++;

      const Elem* old_elem = *it;

      // Add an equivalent element type to the new_mesh
      Elem* new_elem =
        new_mesh.add_elem (Elem::build(old_elem->type()).release());

      libmesh_assert(new_elem);

      // Loop over the nodes on this element.
      for (unsigned int n=0; n<old_elem->n_nodes(); n++)
        {
          libmesh_assert_less (old_elem->node(n), new_node_numbers.size());

          if (new_node_numbers[old_elem->node(n)] == DofObject::invalid_id)
            {
              new_node_numbers[old_elem->node(n)] = n_new_nodes;

              // Add this node to the new mesh
              new_mesh.add_point (old_elem->point(n));

              // Increment the new node counter
              n_new_nodes++;
            }

          // Define this element's connectivity on the new mesh
          libmesh_assert_less (new_node_numbers[old_elem->node(n)], new_mesh.n_nodes());

          new_elem->set_node(n) = new_mesh.node_ptr (new_node_numbers[old_elem->node(n)]);
        }

      // Copy ids for this element
      new_elem->subdomain_id() = old_elem->subdomain_id();
      new_elem->processor_id() = old_elem->processor_id();

      // Maybe add boundary conditions for this element
      for (unsigned short s=0; s<old_elem->n_sides(); s++)
        // We're supporting boundary ids on internal sides now
        //if (old_elem->neighbor(s) == NULL)
        {
          const std::vector<boundary_id_type>& bc_ids =
            this->get_boundary_info().boundary_ids(old_elem, s);
          for (std::vector<boundary_id_type>::const_iterator id_it=bc_ids.begin(); id_it!=bc_ids.end(); ++id_it)
            {
              const boundary_id_type bc_id = *id_it;
              if (bc_id != this->get_boundary_info().invalid_id)
                new_mesh.get_boundary_info().add_side (new_elem, s,
                                                       bc_id);
            }
        }
    } // end loop over elements


  // Prepare the new_mesh for use
  new_mesh.prepare_for_use(/*skip_renumber =*/false);

}
void libMesh::SerialMesh::delete_elem ( Elem e) [virtual]

Removes element e from the mesh. Note that calling this method may produce isolated nodes, i.e. nodes not connected to any element. This method must be implemented in derived classes in such a way that it does not invalidate element iterators.

Implements libMesh::MeshBase.

Definition at line 368 of file serial_mesh.C.

References _elements, libMesh::MeshBase::get_boundary_info(), libMesh::DofObject::id(), libMesh::libmesh_assert(), and libMesh::BoundaryInfo::remove().

Referenced by insert_elem().

{
  libmesh_assert(e);

  // Initialize an iterator to eventually point to the element we want to delete
  std::vector<Elem*>::iterator pos = _elements.end();

  // In many cases, e->id() gives us a clue as to where e
  // is located in the _elements vector.  Try that first
  // before trying the O(n_elem) search.
  libmesh_assert_less (e->id(), _elements.size());

  if (_elements[e->id()] == e)
    {
      // We found it!
      pos = _elements.begin();
      std::advance(pos, e->id());
    }

  else
    {
      // This search is O(n_elem)
      pos = std::find (_elements.begin(),
                       _elements.end(),
                       e);
    }

  // Huh? Element not in the vector?
  libmesh_assert (pos != _elements.end());

  // Remove the element from the BoundaryInfo object
  this->get_boundary_info().remove(e);

  // delete the element
  delete e;

  // explicitly NULL the pointer
  *pos = NULL;
}
void libMesh::SerialMesh::delete_node ( Node n) [virtual]

Removes the Node n from the mesh.

Implements libMesh::MeshBase.

Definition at line 532 of file serial_mesh.C.

References _nodes, libMesh::MeshBase::get_boundary_info(), libMesh::DofObject::id(), libMesh::libmesh_assert(), and libMesh::BoundaryInfo::remove().

Referenced by stitching_helper().

{
  libmesh_assert(n);
  libmesh_assert_less (n->id(), _nodes.size());

  // Initialize an iterator to eventually point to the element we want
  // to delete
  std::vector<Node*>::iterator pos;

  // In many cases, e->id() gives us a clue as to where e
  // is located in the _elements vector.  Try that first
  // before trying the O(n_elem) search.
  if (_nodes[n->id()] == n)
    {
      pos = _nodes.begin();
      std::advance(pos, n->id());
    }
  else
    {
      pos = std::find (_nodes.begin(),
                       _nodes.end(),
                       n);
    }

  // Huh? Node not in the vector?
  libmesh_assert (pos != _nodes.end());

  // Delete the node from the BoundaryInfo object
  this->get_boundary_info().remove(n);

  // delete the node
  delete n;

  // explicitly NULL the pointer
  *pos = NULL;
}
virtual void libMesh::MeshBase::delete_remote_elements ( ) [inline, virtual, inherited]

When supported, deletes all nonlocal elements of the mesh except for "ghosts" which touch a local element, and deletes all nodes which are not part of a local or ghost element

Reimplemented in libMesh::ParallelMesh.

Definition at line 152 of file mesh_base.h.

Referenced by libMesh::MeshTools::Generation::build_extrusion(), libMesh::EquationSystems::init(), libMesh::MeshBase::prepare_for_use(), libMesh::Nemesis_IO::read(), libMesh::BoundaryInfo::sync(), and libMesh::MeshSerializer::~MeshSerializer().

{}
const Elem * libMesh::SerialMesh::elem ( const dof_id_type  i) const [virtual]

Return a pointer to the $ i^{th} $ element, which should be present in this processor's subset of the mesh data structure.

Implements libMesh::MeshBase.

Definition at line 263 of file serial_mesh.C.

References _elements, libMesh::libmesh_assert(), and n_elem().

Referenced by stitching_helper().

{
  libmesh_assert_less (i, this->n_elem());
  libmesh_assert(_elements[i]);
  libmesh_assert_equal_to (_elements[i]->id(), i); // This will change soon

  return _elements[i];
}
Elem * libMesh::SerialMesh::elem ( const dof_id_type  i) [virtual]

Return a writeable pointer to the $ i^{th} $ element, which should be present in this processor's subset of the mesh data structure.

Implements libMesh::MeshBase.

Definition at line 275 of file serial_mesh.C.

References _elements, libMesh::libmesh_assert(), and n_elem().

{
  libmesh_assert_less (i, this->n_elem());
  libmesh_assert(_elements[i]);
  libmesh_assert_equal_to (_elements[i]->id(), i); // This will change soon

  return _elements[i];
}
const std::set<unsigned char>& libMesh::MeshBase::elem_dimensions ( ) const [inline, inherited]
Returns:
set of dimensions of elements present in the mesh.

Definition at line 175 of file mesh_base.h.

References libMesh::MeshBase::_elem_dims.

Referenced by libMesh::ExactSolution::_compute_error(), libMesh::FEMContext::FEMContext(), and libMesh::MeshBase::get_info().

  { return _elem_dims; }

Elem iterator accessor functions.

Implements libMesh::MeshBase.

Definition at line 37 of file serial_mesh_iterators.C.

References _elements.

Referenced by stitching_helper().

{
  Predicates::NotNull<elem_iterator_imp> p;
  return element_iterator(_elements.begin(), _elements.end(), p);
}

const Elem iterator accessor functions.

Implements libMesh::MeshBase.

Definition at line 280 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::NotNull<const_elem_iterator_imp> p;
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 523 of file serial_mesh_iterators.C.

References _elements.

Referenced by stitching_helper().

{
  Predicates::NotNull<elem_iterator_imp> p;
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 770 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::NotNull<const_elem_iterator_imp> p;
  return const_element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 127 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::FaceLocal<elem_iterator_imp> p(this->processor_id());
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 370 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::FaceLocal<const_elem_iterator_imp> p(this->processor_id());
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 613 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::FaceLocal<elem_iterator_imp> p(this->processor_id());
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 860 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::FaceLocal<const_elem_iterator_imp> p(this->processor_id());
  return const_element_iterator(_elements.end(), _elements.end(), p);
}
void libMesh::UnstructuredMesh::find_neighbors ( const bool  reset_remote_elements = false,
const bool  reset_current_list = true 
) [virtual, inherited]

Other functions from MeshBase requiring re-definition.

Here we look at all of the child elements which don't already have valid neighbors.

If a child element has a NULL neighbor it is either because it is on the boundary or because its neighbor is at a different level. In the latter case we must get the neighbor from the parent.

If a child element has a remote_elem neighbor on a boundary it shares with its parent, that info may have become out-dated through coarsening of the neighbor's parent. In this case, if the parent's neighbor is active then the child should share it.

Furthermore, that neighbor better be active, otherwise we missed a child somewhere.

Implements libMesh::MeshBase.

Definition at line 221 of file unstructured_mesh.C.

References libMesh::Elem::active(), libMesh::Elem::ancestor(), libMesh::Elem::centroid(), libMesh::Elem::child(), libMesh::Elem::dim(), libMesh::MeshBase::elements_begin(), libMesh::MeshBase::elements_end(), end, libMesh::err, libMesh::Elem::has_children(), libMesh::Elem::hmin(), libMesh::DofObject::id(), libMesh::Elem::is_child_on_side(), libMesh::Elem::key(), libMesh::Elem::level(), libMesh::MeshBase::level_elements_begin(), libMesh::MeshBase::level_elements_end(), libMesh::libmesh_assert(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::Elem::n_children(), libMesh::MeshTools::n_levels(), libMesh::Elem::n_neighbors(), libMesh::Elem::neighbor(), libMesh::Elem::parent(), libMesh::ParallelObject::processor_id(), libMesh::DofObject::processor_id(), libMesh::remote_elem, libMesh::Elem::set_neighbor(), libMesh::Elem::side(), libMesh::START_LOG(), libMesh::Elem::subactive(), libMesh::Elem::which_child_am_i(), and libMesh::NameBasedIO::write().

Referenced by libMesh::TriangleWrapper::copy_tri_to_mesh().

{
  // We might actually want to run this on an empty mesh
  // (e.g. the boundary mesh for a nonexistant bcid!)
  // libmesh_assert_not_equal_to (this->n_nodes(), 0);
  // libmesh_assert_not_equal_to (this->n_elem(), 0);

  // This function must be run on all processors at once
  parallel_object_only();

  START_LOG("find_neighbors()", "Mesh");

  const element_iterator el_end = this->elements_end();

  //TODO:[BSK] This should be removed later?!
  if (reset_current_list)
    for (element_iterator el = this->elements_begin(); el != el_end; ++el)
      {
        Elem* e = *el;
        for (unsigned int s=0; s<e->n_neighbors(); s++)
          if (e->neighbor(s) != remote_elem ||
              reset_remote_elements)
            e->set_neighbor(s,NULL);
      }

  // Find neighboring elements by first finding elements
  // with identical side keys and then check to see if they
  // are neighbors
  {
    // data structures -- Use the hash_multimap if available
    typedef unsigned int                    key_type;
    typedef std::pair<Elem*, unsigned char> val_type;
    typedef std::pair<key_type, val_type>   key_val_pair;

    typedef LIBMESH_BEST_UNORDERED_MULTIMAP<key_type, val_type> map_type;

    // A map from side keys to corresponding elements & side numbers
    map_type side_to_elem_map;



    for (element_iterator el = this->elements_begin(); el != el_end; ++el)
      {
        Elem* element = *el;

        for (unsigned char ms=0; ms<element->n_neighbors(); ms++)
          {
          next_side:
            // If we haven't yet found a neighbor on this side, try.
            // Even if we think our neighbor is remote, that
            // information may be out of date.
            if (element->neighbor(ms) == NULL ||
                element->neighbor(ms) == remote_elem)
              {
                // Get the key for the side of this element
                const unsigned int key = element->key(ms);

                // Look for elements that have an identical side key
                std::pair <map_type::iterator, map_type::iterator>
                  bounds = side_to_elem_map.equal_range(key);

                // May be multiple keys, check all the possible
                // elements which _might_ be neighbors.
                if (bounds.first != bounds.second)
                  {
                    // Get the side for this element
                    const UniquePtr<Elem> my_side(element->side(ms));

                    // Look at all the entries with an equivalent key
                    while (bounds.first != bounds.second)
                      {
                        // Get the potential element
                        Elem* neighbor = bounds.first->second.first;

                        // Get the side for the neighboring element
                        const unsigned int ns = bounds.first->second.second;
                        const UniquePtr<Elem> their_side(neighbor->side(ns));
                        //libmesh_assert(my_side.get());
                        //libmesh_assert(their_side.get());

                        // If found a match with my side
                        //
                        // We need special tests here for 1D:
                        // since parents and children have an equal
                        // side (i.e. a node), we need to check
                        // ns != ms, and we also check level() to
                        // avoid setting our neighbor pointer to
                        // any of our neighbor's descendants
                        if( (*my_side == *their_side) &&
                            (element->level() == neighbor->level()) &&
                            ((element->dim() != 1) || (ns != ms)) )
                          {
                            // So share a side.  Is this a mixed pair
                            // of subactive and active/ancestor
                            // elements?
                            // If not, then we're neighbors.
                            // If so, then the subactive's neighbor is

                            if (element->subactive() ==
                                neighbor->subactive())
                              {
                                // an element is only subactive if it has
                                // been coarsened but not deleted
                                element->set_neighbor (ms,neighbor);
                                neighbor->set_neighbor(ns,element);
                              }
                            else if (element->subactive())
                              {
                                element->set_neighbor(ms,neighbor);
                              }
                            else if (neighbor->subactive())
                              {
                                neighbor->set_neighbor(ns,element);
                              }
                            side_to_elem_map.erase (bounds.first);

                            // get out of this nested crap
                            goto next_side;
                          }

                        ++bounds.first;
                      }
                  }

                // didn't find a match...
                // Build the map entry for this element
                key_val_pair kvp;

                kvp.first         = key;
                kvp.second.first  = element;
                kvp.second.second = ms;

                // use the lower bound as a hint for
                // where to put it.
#if defined(LIBMESH_HAVE_UNORDERED_MAP) || defined(LIBMESH_HAVE_TR1_UNORDERED_MAP) || defined(LIBMESH_HAVE_HASH_MAP) || defined(LIBMESH_HAVE_EXT_HASH_MAP)
                side_to_elem_map.insert (kvp);
#else
                side_to_elem_map.insert (bounds.first,kvp);
#endif
              }
          }
      }
  }

#ifdef LIBMESH_ENABLE_AMR

  const unsigned int n_levels = MeshTools::n_levels(*this);
  for (unsigned int level = 1; level < n_levels; ++level)
    {
      element_iterator end = this->level_elements_end(level);
      for (element_iterator el = this->level_elements_begin(level);
           el != end; ++el)
        {
          Elem* current_elem = *el;
          libmesh_assert(current_elem);
          Elem* parent = current_elem->parent();
          libmesh_assert(parent);
          const unsigned int my_child_num = parent->which_child_am_i(current_elem);

          for (unsigned int s=0; s < current_elem->n_neighbors(); s++)
            {
              if (current_elem->neighbor(s) == NULL ||
                  (current_elem->neighbor(s) == remote_elem &&
                   parent->is_child_on_side(my_child_num, s)))
                {
                  Elem *neigh = parent->neighbor(s);

                  // If neigh was refined and had non-subactive children
                  // made remote earlier, then a non-subactive elem should
                  // actually have one of those remote children as a
                  // neighbor
                  if (neigh && (neigh->ancestor()) && (!current_elem->subactive()))
                    {
#ifdef DEBUG
                      // Let's make sure that "had children made remote"
                      // situation is actually the case
                      libmesh_assert(neigh->has_children());
                      bool neigh_has_remote_children = false;
                      for (unsigned int c = 0; c != neigh->n_children(); ++c)
                        {
                          if (neigh->child(c) == remote_elem)
                            neigh_has_remote_children = true;
                        }
                      libmesh_assert(neigh_has_remote_children);

                      // And let's double-check that we don't have
                      // a remote_elem neighboring a local element
                      libmesh_assert_not_equal_to (current_elem->processor_id(),
                                                   this->processor_id());
#endif // DEBUG
                      neigh = const_cast<RemoteElem*>(remote_elem);
                    }

                  current_elem->set_neighbor(s, neigh);
#ifdef DEBUG
                  if (neigh != NULL && neigh != remote_elem)
                    // We ignore subactive elements here because
                    // we don't care about neighbors of subactive element.
                    if ((!neigh->active()) && (!current_elem->subactive()))
                      {
                        libMesh::err << "On processor " << this->processor_id()
                                     << std::endl;
                        libMesh::err << "Bad element ID = " << current_elem->id()
                                     << ", Side " << s << ", Bad neighbor ID = " << neigh->id() << std::endl;
                        libMesh::err << "Bad element proc_ID = " << current_elem->processor_id()
                                     << ", Bad neighbor proc_ID = " << neigh->processor_id() << std::endl;
                        libMesh::err << "Bad element size = " << current_elem->hmin()
                                     << ", Bad neighbor size = " << neigh->hmin() << std::endl;
                        libMesh::err << "Bad element center = " << current_elem->centroid()
                                     << ", Bad neighbor center = " << neigh->centroid() << std::endl;
                        libMesh::err << "ERROR: "
                                     << (current_elem->active()?"Active":"Ancestor")
                                     << " Element at level "
                                     << current_elem->level() << std::endl;
                        libMesh::err << "with "
                                     << (parent->active()?"active":
                                         (parent->subactive()?"subactive":"ancestor"))
                                     << " parent share "
                                     << (neigh->subactive()?"subactive":"ancestor")
                                     << " neighbor at level " << neigh->level()
                                     << std::endl;
                        NameBasedIO(*this).write ("bad_mesh.gmv");
                        libmesh_error_msg("Problematic mesh written to bad_mesh.gmv.");
                      }
#endif // DEBUG
                }
            }
        }
    }

#endif // AMR


#ifdef DEBUG
  MeshTools::libmesh_assert_valid_neighbors(*this);
#endif

  STOP_LOG("find_neighbors()", "Mesh");
}

There is no reason for a user to ever call this function.

This function restores a previously broken element/node numbering such that mesh.node(n)->id() == n.

Implements libMesh::MeshBase.

Definition at line 782 of file serial_mesh.C.

References _elements, and _nodes.

{
  // Nodes first
  for (dof_id_type n=0; n<this->_nodes.size(); n++)
    if (this->_nodes[n] != NULL)
      this->_nodes[n]->set_id() = n;

  // Elements next
  for (dof_id_type e=0; e<this->_elements.size(); e++)
    if (this->_elements[e] != NULL)
      this->_elements[e]->set_id() = e;
}
const BoundaryInfo& libMesh::MeshBase::get_boundary_info ( ) const [inline, inherited]

The information about boundary ids on the mesh

Definition at line 115 of file mesh_base.h.

References libMesh::MeshBase::boundary_info.

Referenced by libMesh::MeshRefinement::_coarsen_elements(), libMesh::MeshTools::Subdivision::add_boundary_ghosts(), libMesh::UnstructuredMesh::all_first_order(), libMesh::UnstructuredMesh::all_second_order(), libMesh::MeshTools::Subdivision::all_subdivision(), libMesh::MeshTools::Modification::all_tri(), libMesh::AbaqusIO::assign_boundary_node_ids(), libMesh::AbaqusIO::assign_sideset_ids(), libMesh::MeshTools::Generation::build_cube(), libMesh::MeshTools::Generation::build_delaunay_square(), libMesh::MeshTools::Generation::build_extrusion(), libMesh::MeshTools::Modification::change_boundary_id(), libMesh::MeshBase::clear(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::FEGenericBase< OutputType >::compute_periodic_constraints(), libMesh::FEAbstract::compute_periodic_node_constraints(), libMesh::UnstructuredMesh::create_submesh(), delete_elem(), libMesh::ParallelMesh::delete_elem(), delete_node(), libMesh::ParallelMesh::delete_node(), libMesh::MeshTools::Modification::flatten(), libMesh::UNVIO::groups_in(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::BoundaryProjectSolution::operator()(), libMesh::Parallel::pack(), libMesh::Parallel::packable_size(), libMesh::ParallelMesh::ParallelMesh(), libMesh::AbaqusIO::read(), libMesh::Nemesis_IO::read(), libMesh::ExodusII_IO::read(), libMesh::CheckpointIO::read_bcs(), libMesh::GmshIO::read_mesh(), libMesh::LegacyXdrIO::read_mesh(), libMesh::CheckpointIO::read_nodesets(), renumber_nodes_and_elements(), libMesh::ParallelMesh::renumber_nodes_and_elements(), SerialMesh(), stitching_helper(), libMesh::Elem::topological_neighbor(), libMesh::Parallel::unpack(), libMesh::FroIO::write(), libMesh::Nemesis_IO::write(), libMesh::ExodusII_IO::write(), libMesh::XdrIO::write(), libMesh::LegacyXdrIO::write_mesh(), libMesh::Nemesis_IO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data_common(), libMesh::ExodusII_IO_Helper::write_nodesets(), libMesh::Nemesis_IO_Helper::write_nodesets(), libMesh::ExodusII_IO_Helper::write_sidesets(), libMesh::Nemesis_IO_Helper::write_sidesets(), libMesh::LegacyXdrIO::write_soln(), and libMesh::DivaIO::write_stream().

{ return *boundary_info; }

Writeable information about boundary ids on the mesh

Definition at line 120 of file mesh_base.h.

References libMesh::MeshBase::boundary_info.

{ return *boundary_info; }
subdomain_id_type libMesh::MeshBase::get_id_by_name ( const std::string &  name) const [inherited]

Returns the id of the named subdomain if it exists, Elem::invalid_subdomain_id otherwise.

Definition at line 481 of file mesh_base.C.

References libMesh::MeshBase::_block_id_to_name, and libMesh::Elem::invalid_subdomain_id.

{
  // Linear search over the map values.
  std::map<subdomain_id_type, std::string>::const_iterator
    iter = _block_id_to_name.begin(),
    end_iter = _block_id_to_name.end();

  for ( ; iter != end_iter; ++iter)
    if (iter->second == name)
      return iter->first;

  // If we made it here without returning, we don't have a subdomain
  // with the requested name, so return Elem::invalid_subdomain_id.
  return Elem::invalid_subdomain_id;
}
std::string libMesh::MeshBase::get_info ( ) const [inherited]
Returns:
a string containing relevant information about the mesh.

Definition at line 315 of file mesh_base.C.

References libMesh::MeshBase::elem_dimensions(), end, libMesh::MeshBase::n_active_elem(), libMesh::MeshBase::n_elem(), libMesh::MeshBase::n_local_elem(), libMesh::MeshBase::n_local_nodes(), libMesh::MeshBase::n_nodes(), libMesh::MeshBase::n_partitions(), libMesh::ParallelObject::n_processors(), libMesh::MeshBase::n_subdomains(), libMesh::n_threads(), libMesh::ParallelObject::processor_id(), and libMesh::MeshBase::spatial_dimension().

Referenced by libMesh::MeshBase::print_info().

{
  std::ostringstream oss;

  oss << " Mesh Information:"                                  << '\n'
      << "  elem_dimensions()={";
  {
    std::set<unsigned char>::const_iterator it =
      this->elem_dimensions().begin();
    if (it != this->elem_dimensions().end())
      oss << *it;
    for (; it != this->elem_dimensions().end(); ++it)
      oss << ',' << *it;
  }
  oss << "  spatial_dimension()=" << this->spatial_dimension() << '\n'
      << "  n_nodes()="           << this->n_nodes()           << '\n'
      << "    n_local_nodes()="   << this->n_local_nodes()     << '\n'
      << "  n_elem()="            << this->n_elem()            << '\n'
      << "    n_local_elem()="    << this->n_local_elem()      << '\n'
#ifdef LIBMESH_ENABLE_AMR
      << "    n_active_elem()="   << this->n_active_elem()     << '\n'
#endif
      << "  n_subdomains()="      << static_cast<std::size_t>(this->n_subdomains()) << '\n'
      << "  n_partitions()="      << static_cast<std::size_t>(this->n_partitions()) << '\n'
      << "  n_processors()="      << static_cast<std::size_t>(this->n_processors()) << '\n'
      << "  n_threads()="         << static_cast<std::size_t>(libMesh::n_threads()) << '\n'
      << "  processor_id()="      << static_cast<std::size_t>(this->processor_id()) << '\n';

  return oss.str();
}

Insert elem e to the element array, preserving its id and replacing/deleting any existing element with the same id.

Implements libMesh::MeshBase.

Definition at line 349 of file serial_mesh.C.

References _elements, delete_elem(), and libMesh::DofObject::id().

{
  dof_id_type eid = e->id();
  libmesh_assert_less (eid, _elements.size());
  Elem *oldelem = _elements[eid];

  if (oldelem)
    {
      libmesh_assert_equal_to (oldelem->id(), eid);
      this->delete_elem(oldelem);
    }

  _elements[e->id()] = e;

  return e;
}

Insert Node n into the Mesh at a location consistent with n->id(), allocating extra storage if necessary. Throws an error if: .) n==NULL .) n->id() == DofObject::invalid_id .) A node already exists in position n->id().

This function differs from the SerialMesh::add_node() function, which is only capable of appending nodes at the end of the nodes storage.

Implements libMesh::MeshBase.

Definition at line 493 of file serial_mesh.C.

References _nodes, libMesh::DofObject::id(), and libMesh::DofObject::invalid_id.

{
  if (!n)
    libmesh_error_msg("Error, attempting to insert NULL node.");

  if (n->id() == DofObject::invalid_id)
    libmesh_error_msg("Error, cannot insert node with invalid id.");

  if (n->id() < _nodes.size())
    {
      // Don't allow inserting on top of an existing Node.

      // Doing so doesn't have to be *error*, in the case where a
      // redundant insert is done, but when that happens we ought to
      // always be able to make the code more efficient by avoiding
      // the redundant insert, so let's keep screaming "Error" here.
      if (_nodes[ n->id() ] != NULL)
        libmesh_error_msg("Error, cannot insert node on top of existing node.");
    }
  else
    {
      // Allocate just enough space to store the new node.  This will
      // cause highly non-ideal memory allocation behavior if called
      // repeatedly...
      _nodes.resize(n->id() + 1);
    }


  // We have enough space and this spot isn't already occupied by
  // another node, so go ahead and add it.
  _nodes[ n->id() ] = n;

  // If we made it this far, we just inserted the node the user handed
  // us, so we can give it right back.
  return n;
}
bool libMesh::MeshBase::is_prepared ( ) const [inline, inherited]
Returns:
true if the mesh has been prepared via a call to prepare_for_use, false otherwise.

Definition at line 131 of file mesh_base.h.

References libMesh::MeshBase::_is_prepared.

Referenced by libMesh::DofMap::build_sparsity(), libMesh::DofMap::create_dof_constraints(), libMesh::DofMap::distribute_dofs(), and libMesh::DofMap::reinit().

  { return _is_prepared; }

Implements libMesh::MeshBase.

Definition at line 167 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Level<elem_iterator_imp> p(level);
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 410 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Level<const_elem_iterator_imp> p(level);
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 653 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Level<elem_iterator_imp> p(level);
  return element_iterator(_elements.end(), _elements.end(), p);
}
SerialMesh::const_element_iterator libMesh::SerialMesh::level_elements_end ( const unsigned int  level) const [virtual]

Implements libMesh::MeshBase.

Definition at line 900 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Level<const_elem_iterator_imp> p(level);
  return const_element_iterator(_elements.end(), _elements.end(), p);
}
virtual void libMesh::MeshBase::libmesh_assert_valid_parallel_ids ( ) const [inline, virtual, inherited]

Verify id and processor_id consistency of our elements and nodes containers. Calls libmesh_assert() on each possible failure. Currently only implemented on ParallelMesh; a serial data structure is much harder to get out of sync.

Reimplemented in libMesh::ParallelMesh.

Definition at line 707 of file mesh_base.h.

Referenced by libMesh::MeshRefinement::_refine_elements(), libMesh::InfElemBuilder::build_inf_elem(), and libMesh::MeshRefinement::refine_and_coarsen_elements().

{}

Implements libMesh::MeshBase.

Definition at line 107 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::Local<elem_iterator_imp> p(this->processor_id());
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 350 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::Local<const_elem_iterator_imp> p(this->processor_id());
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 593 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::Local<elem_iterator_imp> p(this->processor_id());
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 840 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::Local<const_elem_iterator_imp> p(this->processor_id());
  return const_element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 187 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::LocalLevel<elem_iterator_imp> p(this->processor_id(),level);
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 430 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::LocalLevel<const_elem_iterator_imp> p(this->processor_id(),level);
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 673 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::LocalLevel<elem_iterator_imp> p(this->processor_id(),level);
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 920 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::LocalLevel<const_elem_iterator_imp> p(this->processor_id(),level);
  return const_element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 1032 of file serial_mesh_iterators.C.

References _nodes, and libMesh::ParallelObject::processor_id().

{
  Predicates::Local<node_iterator_imp> p(this->processor_id());
  return node_iterator(_nodes.begin(), _nodes.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 1072 of file serial_mesh_iterators.C.

References _nodes, and libMesh::ParallelObject::processor_id().

{
  Predicates::Local<const_node_iterator_imp> p(this->processor_id());
  return const_node_iterator(_nodes.begin(), _nodes.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 1112 of file serial_mesh_iterators.C.

References _nodes, and libMesh::ParallelObject::processor_id().

{
  Predicates::Local<node_iterator_imp> p(this->processor_id());
  return node_iterator(_nodes.end(), _nodes.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 1152 of file serial_mesh_iterators.C.

References _nodes, and libMesh::ParallelObject::processor_id().

{
  Predicates::Local<const_node_iterator_imp> p(this->processor_id());
  return const_node_iterator(_nodes.end(), _nodes.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 197 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::LocalNotLevel<elem_iterator_imp> p(this->processor_id(),level);
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 440 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::LocalNotLevel<const_elem_iterator_imp> p(this->processor_id(),level);
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 683 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::LocalNotLevel<elem_iterator_imp> p(this->processor_id(),level);
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 930 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::LocalNotLevel<const_elem_iterator_imp> p(this->processor_id(),level);
  return const_element_iterator(_elements.end(), _elements.end(), p);
}
virtual dof_id_type libMesh::SerialMesh::max_elem_id ( ) const [inline, virtual]

Returns a number greater than or equal to the maximum element id in the mesh.

Implements libMesh::MeshBase.

Definition at line 124 of file serial_mesh.h.

References _elements.

  { return cast_int<dof_id_type>(_elements.size()); }
virtual dof_id_type libMesh::SerialMesh::max_node_id ( ) const [inline, virtual]

Returns a number greater than or equal to the maximum node id in the mesh.

Implements libMesh::MeshBase.

Definition at line 110 of file serial_mesh.h.

References _nodes.

  { return cast_int<dof_id_type>(_nodes.size()); }
unsigned int libMesh::MeshBase::mesh_dimension ( ) const [inherited]
Returns:
the logical dimension of the mesh; i.e. the manifold dimension of the elements in the mesh. If we ever support multi-dimensional meshes (e.g. hexes and quads in the same mesh) then this will return the largest such dimension.

Definition at line 118 of file mesh_base.C.

References libMesh::MeshBase::_elem_dims, and libMesh::libmesh_assert().

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::HPCoarsenTest::add_projection(), libMesh::UnstructuredMesh::all_second_order(), libMesh::MeshTools::Generation::build_cube(), libMesh::EquationSystems::build_discontinuous_solution_vector(), libMesh::EquationSystems::build_solution_vector(), libMesh::EquationSystems::build_variable_names(), libMesh::System::calculate_norm(), libMesh::DofMap::create_dof_constraints(), libMesh::MeshTools::Modification::distort(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::MeshRefinement::flag_elements_by_elem_fraction(), libMesh::MeshRefinement::flag_elements_by_nelem_target(), libMesh::LaplaceMeshSmoother::init(), libMesh::PointLocatorTree::init(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::FEInterface::n_vec_dim(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::PatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::ProjectSolution::operator()(), libMesh::BoundaryProjectSolution::operator()(), libMesh::Nemesis_IO::read(), libMesh::ExodusII_IO::read(), libMesh::GMVIO::read(), libMesh::VTKIO::read(), libMesh::System::read_header(), libMesh::LegacyXdrIO::read_mesh(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::HPCoarsenTest::select_refinement(), libMesh::MeshTools::Modification::smooth(), libMesh::DofMap::use_coupled_neighbor_dofs(), libMesh::PostscriptIO::write(), libMesh::GMVIO::write_ascii_old_impl(), libMesh::TecplotIO::write_binary(), libMesh::GMVIO::write_binary(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::UCDIO::write_nodal_data(), libMesh::EnsightIO::write_scalar_ascii(), libMesh::GnuPlotIO::write_solution(), libMesh::DivaIO::write_stream(), and libMesh::EnsightIO::write_vector_ascii().

{
  libmesh_assert(!_elem_dims.empty());
  return cast_int<unsigned int>(*_elem_dims.rbegin());
}

Returns the number of active elements in the mesh. Implemented in terms of active_element_iterators.

Implements libMesh::MeshBase.

Definition at line 1459 of file serial_mesh.C.

References active_elements_begin(), and active_elements_end().

{
  return static_cast<dof_id_type>(std::distance (this->active_elements_begin(),
                                                 this->active_elements_end()));
}

Returns the number of active elements on processor proc.

Definition at line 276 of file mesh_base.C.

References libMesh::MeshBase::active_pid_elements_begin(), libMesh::MeshBase::active_pid_elements_end(), and libMesh::ParallelObject::n_processors().

Referenced by libMesh::MeshBase::n_active_local_elem().

{
  libmesh_assert_less (proc_id, this->n_processors());
  return static_cast<dof_id_type>(std::distance (this->active_pid_elements_begin(proc_id),
                                                 this->active_pid_elements_end  (proc_id)));
}

Same, but only counts active elements.

Definition at line 300 of file mesh_base.C.

References libMesh::MeshBase::active_elements_begin(), libMesh::MeshBase::active_elements_end(), and end.

Referenced by libMesh::TecplotIO::write_ascii(), libMesh::GMVIO::write_ascii_old_impl(), and libMesh::TecplotIO::write_binary().

{
  dof_id_type ne=0;

  const_element_iterator       el  = this->active_elements_begin();
  const const_element_iterator end = this->active_elements_end();

  for (; el!=end; ++el)
    ne += (*el)->n_sub_elem();

  return ne;
}
virtual dof_id_type libMesh::SerialMesh::n_elem ( ) const [inline, virtual]

Returns the number of elements in the mesh. The standard n_elem() function may return a cached value on distributed meshes, and so can be called by any processor at any time.

Implements libMesh::MeshBase.

Definition at line 116 of file serial_mesh.h.

References _elements.

Referenced by elem(), query_elem(), and stitching_helper().

  { return cast_int<dof_id_type>(_elements.size()); }

Returns the number of elements on processor proc.

Definition at line 263 of file mesh_base.C.

References libMesh::DofObject::invalid_processor_id, libMesh::libmesh_assert(), libMesh::ParallelObject::n_processors(), libMesh::MeshBase::pid_elements_begin(), and libMesh::MeshBase::pid_elements_end().

Referenced by libMesh::MeshBase::n_local_elem(), and libMesh::MeshBase::n_unpartitioned_elem().

{
  // We're either counting a processor's elements or unpartitioned
  // elements
  libmesh_assert (proc_id < this->n_processors() ||
                  proc_id == DofObject::invalid_processor_id);

  return static_cast<dof_id_type>(std::distance (this->pid_elements_begin(proc_id),
                                                 this->pid_elements_end  (proc_id)));
}
dof_id_type libMesh::MeshBase::n_local_elem ( ) const [inline, inherited]

Returns the number of elements on the local processor.

Definition at line 297 of file mesh_base.h.

References libMesh::MeshBase::n_elem_on_proc(), and libMesh::ParallelObject::processor_id().

Referenced by libMesh::MeshBase::get_info(), and libMesh::ParallelMesh::parallel_n_elem().

  { return this->n_elem_on_proc (this->processor_id()); }
dof_id_type libMesh::MeshBase::n_local_nodes ( ) const [inline, inherited]

Returns the number of nodes on the local processor.

Definition at line 211 of file mesh_base.h.

References libMesh::MeshBase::n_nodes_on_proc(), and libMesh::ParallelObject::processor_id().

Referenced by libMesh::MeshBase::get_info(), libMesh::VTKIO::nodes_to_vtk(), and libMesh::ParallelMesh::parallel_n_nodes().

  { return this->n_nodes_on_proc (this->processor_id()); }
virtual dof_id_type libMesh::SerialMesh::n_nodes ( ) const [inline, virtual]

Returns the number of nodes in the mesh. This function and others must be defined in derived classes since the MeshBase class has no specific storage for nodes or elements. The standard n_nodes() function may return a cached value on distributed meshes, and so can be called by any processor at any time.

Implements libMesh::MeshBase.

Definition at line 104 of file serial_mesh.h.

References _nodes.

Referenced by node(), node_ptr(), point(), query_node_ptr(), and stitching_helper().

  { return cast_int<dof_id_type>(_nodes.size()); }

Returns the number of nodes on processor proc.

Definition at line 250 of file mesh_base.C.

References libMesh::DofObject::invalid_processor_id, libMesh::libmesh_assert(), libMesh::ParallelObject::n_processors(), libMesh::MeshBase::pid_nodes_begin(), and libMesh::MeshBase::pid_nodes_end().

Referenced by libMesh::MeshBase::n_local_nodes(), and libMesh::MeshBase::n_unpartitioned_nodes().

{
  // We're either counting a processor's nodes or unpartitioned
  // nodes
  libmesh_assert (proc_id < this->n_processors() ||
                  proc_id == DofObject::invalid_processor_id);

  return static_cast<dof_id_type>(std::distance (this->pid_nodes_begin(proc_id),
                                                 this->pid_nodes_end  (proc_id)));
}
unsigned int libMesh::MeshBase::n_partitions ( ) const [inline, inherited]

Returns the number of partitions which have been defined via a call to either mesh.partition() or by building a Partitioner object and calling partition. Note that the partitioner objects are responsible for setting this value.

Definition at line 593 of file mesh_base.h.

References libMesh::MeshBase::_n_parts.

Referenced by libMesh::MeshBase::get_info(), libMesh::BoundaryInfo::sync(), libMesh::NameBasedIO::write(), libMesh::GMVIO::write_ascii_new_impl(), and libMesh::GMVIO::write_ascii_old_impl().

  { return _n_parts; }
Returns:
the number of processors in the group.

Definition at line 92 of file parallel_object.h.

References libMesh::ParallelObject::_communicator, and libMesh::Parallel::Communicator::size().

Referenced by libMesh::ParmetisPartitioner::_do_repartition(), libMesh::ParallelMesh::add_elem(), libMesh::ParallelMesh::add_node(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::FEMSystem::assembly(), libMesh::ParmetisPartitioner::assign_partitioning(), libMesh::ParallelMesh::assign_unique_ids(), libMesh::AztecLinearSolver< T >::AztecLinearSolver(), libMesh::ParallelMesh::clear(), libMesh::Nemesis_IO_Helper::compute_border_node_ids(), libMesh::Nemesis_IO_Helper::construct_nemesis_filename(), libMesh::UnstructuredMesh::create_pid_mesh(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::distribute_local_dofs_node_major(), libMesh::DofMap::distribute_local_dofs_var_major(), libMesh::EnsightIO::EnsightIO(), libMesh::MeshBase::get_info(), libMesh::EquationSystems::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::ParmetisPartitioner::initialize(), libMesh::Nemesis_IO_Helper::initialize(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::MeshTools::libmesh_assert_valid_procids< Elem >(), libMesh::MeshTools::libmesh_assert_valid_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::DofMap::local_variable_indices(), libMesh::MeshBase::n_active_elem_on_proc(), libMesh::MeshBase::n_elem_on_proc(), libMesh::MeshBase::n_nodes_on_proc(), libMesh::Partitioner::partition(), libMesh::MeshBase::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::PetscLinearSolver< T >::PetscLinearSolver(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::MeshTools::processor_bounding_box(), libMesh::System::project_vector(), libMesh::NameBasedIO::read(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::XdrIO::read(), libMesh::System::read_parallel_data(), libMesh::System::read_SCALAR_dofs(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::System::read_serialized_vector(), libMesh::Partitioner::repartition(), libMesh::Partitioner::set_node_processor_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::BoundaryInfo::sync(), libMesh::ParallelMesh::update_parallel_id_counts(), libMesh::CheckpointIO::write(), libMesh::GMVIO::write_binary(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::System::write_parallel_data(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bcs(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), and libMesh::XdrIO::write_serialized_nodesets().

  { return cast_int<processor_id_type>(_communicator.size()); }

This function returns the number of elements that will be written out in the Tecplot format. For example, a 9-noded quadrilateral will be broken into 4 linear sub-elements for plotting purposes. Thus, for a mesh of 2 QUAD9 elements n_tecplot_elem() will return 8. Implemented in terms of element_iterators.

Definition at line 285 of file mesh_base.C.

References libMesh::MeshBase::elements_begin(), libMesh::MeshBase::elements_end(), and end.

{
  dof_id_type ne=0;

  const_element_iterator       el  = this->elements_begin();
  const const_element_iterator end = this->elements_end();

  for (; el!=end; ++el)
    ne += (*el)->n_sub_elem();

  return ne;
}

Returns the number of subdomains in the global mesh. Subdomains correspond to separate subsets of the mesh which could correspond e.g. to different materials in a solid mechanics application, or regions where different physical processes are important. The subdomain mapping is independent from the parallel decomposition.

Definition at line 235 of file mesh_base.C.

References libMesh::MeshBase::subdomain_ids().

Referenced by libMesh::MeshBase::get_info(), libMesh::XdrIO::write(), and libMesh::NameBasedIO::write_nodal_data().

{
  // This requires an inspection on every processor
  parallel_object_only();

  std::set<subdomain_id_type> ids;

  this->subdomain_ids (ids);

  return cast_int<subdomain_id_type>(ids.size());
}

Returns the number of elements owned by no processor.

Definition at line 303 of file mesh_base.h.

References libMesh::DofObject::invalid_processor_id, and libMesh::MeshBase::n_elem_on_proc().

Referenced by libMesh::ParallelMesh::parallel_n_elem(), and libMesh::MeshBase::partition().

Returns the number of nodes owned by no processor.

Definition at line 217 of file mesh_base.h.

References libMesh::DofObject::invalid_processor_id, and libMesh::MeshBase::n_nodes_on_proc().

Referenced by libMesh::ParallelMesh::parallel_n_nodes().

Returns the next unique id to be used.

Definition at line 230 of file mesh_base.h.

References libMesh::MeshBase::_next_unique_id.

{ return _next_unique_id; }
const Node & libMesh::SerialMesh::node ( const dof_id_type  i) const [virtual]

Return a constant reference (for reading only) to the $ i^{th} $ node, which should be present in this processor's subset of the mesh data structure.

Implements libMesh::MeshBase.

Definition at line 186 of file serial_mesh.C.

References _nodes, libMesh::libmesh_assert(), and n_nodes().

Referenced by stitching_helper().

{
  libmesh_assert_less (i, this->n_nodes());
  libmesh_assert(_nodes[i]);
  libmesh_assert_equal_to (_nodes[i]->id(), i); // This will change soon

  return (*_nodes[i]);
}
Node & libMesh::SerialMesh::node ( const dof_id_type  i) [virtual]

Return a reference to the $ i^{th} $ node, which should be present in this processor's subset of the mesh data structure.

Implements libMesh::MeshBase.

Definition at line 199 of file serial_mesh.C.

References _nodes, libMesh::libmesh_assert(), and n_nodes().

{
  if (i >= this->n_nodes())
    libmesh_error_msg(" i=" << i << ", n_nodes()=" << this->n_nodes());

  libmesh_assert_less (i, this->n_nodes());
  libmesh_assert(_nodes[i]);
  libmesh_assert_equal_to (_nodes[i]->id(), i); // This will change soon

  return (*_nodes[i]);
}
const Node * libMesh::SerialMesh::node_ptr ( const dof_id_type  i) const [virtual]

Return a pointer to the $ i^{th} $ node, which should be present in this processor's subset of the mesh data structure.

Implements libMesh::MeshBase.

Definition at line 213 of file serial_mesh.C.

References _nodes, libMesh::libmesh_assert(), and n_nodes().

Referenced by stitching_helper().

{
  libmesh_assert_less (i, this->n_nodes());
  libmesh_assert(_nodes[i]);
  libmesh_assert_equal_to (_nodes[i]->id(), i); // This will change soon

  return _nodes[i];
}

Return a writeable pointer to the $ i^{th} $ node, which should be present in this processor's subset of the mesh data structure.

Implements libMesh::MeshBase.

Definition at line 225 of file serial_mesh.C.

References _nodes, libMesh::libmesh_assert(), and n_nodes().

{
  libmesh_assert_less (i, this->n_nodes());
  libmesh_assert(_nodes[i]);
  libmesh_assert_equal_to (_nodes[i]->id(), i); // This will change soon

  return _nodes[i];
}

non-const Node iterator accessor functions.

Implements libMesh::MeshBase.

Definition at line 1012 of file serial_mesh_iterators.C.

References _nodes.

Referenced by stitching_helper().

{
  Predicates::NotNull<node_iterator_imp> p;
  return node_iterator(_nodes.begin(), _nodes.end(), p);
}

const Node iterator accessor functions.

Implements libMesh::MeshBase.

Definition at line 1052 of file serial_mesh_iterators.C.

References _nodes.

{
  Predicates::NotNull<const_node_iterator_imp> p;
  return const_node_iterator(_nodes.begin(), _nodes.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 1092 of file serial_mesh_iterators.C.

References _nodes.

Referenced by stitching_helper().

{
  Predicates::NotNull<node_iterator_imp> p;
  return node_iterator(_nodes.end(), _nodes.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 1132 of file serial_mesh_iterators.C.

References _nodes.

{
  Predicates::NotNull<const_node_iterator_imp> p;
  return const_node_iterator(_nodes.end(), _nodes.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 57 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::NotActive<elem_iterator_imp> p;
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 300 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::NotActive<const_elem_iterator_imp> p;
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 543 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::NotActive<elem_iterator_imp> p;
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 790 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::NotActive<const_elem_iterator_imp> p;
  return const_element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 77 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Ancestor<elem_iterator_imp> p;
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 320 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Ancestor<const_elem_iterator_imp> p;
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 563 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Ancestor<elem_iterator_imp> p;
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 810 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Ancestor<const_elem_iterator_imp> p;
  return const_element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 177 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::NotLevel<elem_iterator_imp> p(level);
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 420 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::NotLevel<const_elem_iterator_imp> p(level);
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 663 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::NotLevel<elem_iterator_imp> p(level);
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 910 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::NotLevel<const_elem_iterator_imp> p(level);
  return const_element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 137 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::NotLocal<elem_iterator_imp> p(this->processor_id());
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 380 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::NotLocal<const_elem_iterator_imp> p(this->processor_id());
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 623 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::NotLocal<elem_iterator_imp> p(this->processor_id());
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 870 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::NotLocal<const_elem_iterator_imp> p(this->processor_id());
  return const_element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 97 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::NotSubActive<elem_iterator_imp> p;
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 340 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::NotSubActive<const_elem_iterator_imp> p;
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 583 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::NotSubActive<elem_iterator_imp> p;
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 830 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::NotSubActive<const_elem_iterator_imp> p;
  return const_element_iterator(_elements.end(), _elements.end(), p);
}
virtual dof_id_type libMesh::SerialMesh::parallel_n_elem ( ) const [inline, virtual]

Returns the number of elements in the mesh. The parallel_n_elem() function returns a newly calculated parallel-synchronized value on distributed meshes, and so must be called in parallel only.

Implements libMesh::MeshBase.

Definition at line 119 of file serial_mesh.h.

References _elements.

  { return cast_int<dof_id_type>(_elements.size()); }
virtual dof_id_type libMesh::SerialMesh::parallel_n_nodes ( ) const [inline, virtual]

Returns the number of nodes in the mesh. This function and others must be defined in derived classes since the MeshBase class has no specific storage for nodes or elements. The parallel_n_nodes() function returns a newly calculated parallel-synchronized value on distributed meshes, and so must be called in parallel only.

Implements libMesh::MeshBase.

Definition at line 107 of file serial_mesh.h.

References _nodes.

  { return cast_int<dof_id_type>(_nodes.size()); }
void libMesh::MeshBase::partition ( const unsigned int  n_parts) [virtual, inherited]

Call the default partitioner (currently metis_partition()).

Definition at line 361 of file mesh_base.C.

References libMesh::MeshBase::is_serial(), libMesh::libmesh_assert(), libMesh::MeshBase::n_unpartitioned_elem(), libMesh::MeshBase::partitioner(), libMesh::MeshBase::recalculate_n_partitions(), libMesh::Partitioner::set_node_processor_ids(), libMesh::MeshBase::skip_partitioning(), and libMesh::MeshBase::update_post_partitioning().

{
  // If we get here and we have unpartitioned elements, we need that
  // fixed.
  if (this->n_unpartitioned_elem() > 0)
    {
      libmesh_assert (partitioner().get());
      libmesh_assert (this->is_serial());
      partitioner()->partition (*this, n_parts);
    }
  // NULL partitioner means don't repartition
  // Non-serial meshes may not be ready for repartitioning here.
  else if(!skip_partitioning() &&
          partitioner().get() &&
          this->is_serial())
    {
      partitioner()->partition (*this, n_parts);
    }
  else
    {
      // Adaptive coarsening may have "orphaned" nodes on processors
      // whose elements no longer share them.  We need to check for
      // and possibly fix that.
      Partitioner::set_node_processor_ids(*this);

      // Make sure locally cached partition count
      this->recalculate_n_partitions();

      // Make sure any other locally cached data is correct
      this->update_post_partitioning();
    }
}

Implements libMesh::MeshBase.

Definition at line 207 of file serial_mesh_iterators.C.

References _elements.

Referenced by unpartitioned_elements_begin().

{
  Predicates::PID<elem_iterator_imp> p(proc_id);
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 450 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::PID<const_elem_iterator_imp> p(proc_id);
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 693 of file serial_mesh_iterators.C.

References _elements.

Referenced by unpartitioned_elements_end().

{
  Predicates::PID<elem_iterator_imp> p(proc_id);
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 940 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::PID<const_elem_iterator_imp> p(proc_id);
  return const_element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 1042 of file serial_mesh_iterators.C.

References _nodes.

{
  Predicates::PID<node_iterator_imp> p(proc_id);
  return node_iterator(_nodes.begin(), _nodes.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 1082 of file serial_mesh_iterators.C.

References _nodes.

{
  Predicates::PID<const_node_iterator_imp> p(proc_id);
  return const_node_iterator(_nodes.begin(), _nodes.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 1122 of file serial_mesh_iterators.C.

References _nodes.

{
  Predicates::PID<node_iterator_imp> p(proc_id);
  return node_iterator(_nodes.end(), _nodes.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 1162 of file serial_mesh_iterators.C.

References _nodes.

{
  Predicates::PID<const_node_iterator_imp> p(proc_id);
  return const_node_iterator(_nodes.end(), _nodes.end(), p);
}
const Point & libMesh::SerialMesh::point ( const dof_id_type  i) const [virtual]

Return a constant reference (for reading only) to the $ i^{th} $ point, which should be present in this processor's subset of the mesh data structure.

Implements libMesh::MeshBase.

Definition at line 173 of file serial_mesh.C.

References _nodes, libMesh::libmesh_assert(), and n_nodes().

Referenced by stitching_helper().

{
  libmesh_assert_less (i, this->n_nodes());
  libmesh_assert(_nodes[i]);
  libmesh_assert_equal_to (_nodes[i]->id(), i); // This will change soon

  return (*_nodes[i]);
}
const PointLocatorBase & libMesh::MeshBase::point_locator ( ) const [inherited]

returns a pointer to a PointLocatorBase object for this mesh, constructing a master PointLocator first if necessary. This should never be used in threaded or non-parallel_only code, and so is deprecated.

Definition at line 417 of file mesh_base.C.

References libMesh::MeshBase::_point_locator, libMesh::PointLocatorBase::build(), libMesh::Threads::in_threads, libMesh::libmesh_assert(), and libMesh::TREE_ELEMENTS.

{
  libmesh_deprecated();

  if (_point_locator.get() == NULL)
    {
      // PointLocator construction may not be safe within threads
      libmesh_assert(!Threads::in_threads);

      _point_locator.reset (PointLocatorBase::build(TREE_ELEMENTS, *this).release());
    }

  return *_point_locator;
}
void libMesh::MeshBase::prepare_for_use ( const bool  skip_renumber_nodes_and_elements = false,
const bool  skip_find_neighbors = false 
) [inherited]

Prepare a newly created (or read) mesh for use. This involves 4 steps: 1.) call find_neighbors() 2.) call partition() 3.) call renumber_nodes_and_elements() 4.) call cache_elem_dims()

The argument to skip renumbering is now deprecated - to prevent a mesh from being renumbered, set allow_renumbering(false).

Definition at line 124 of file mesh_base.C.

References libMesh::MeshBase::_is_prepared, libMesh::MeshBase::_skip_renumber_nodes_and_elements, libMesh::MeshBase::allow_renumbering(), libMesh::MeshBase::assign_unique_ids(), libMesh::MeshBase::cache_elem_dims(), libMesh::MeshBase::clear_point_locator(), libMesh::ParallelObject::comm(), libMesh::MeshBase::delete_remote_elements(), libMesh::MeshBase::find_neighbors(), libMesh::MeshBase::is_serial(), libMesh::libmesh_assert(), libMesh::MeshBase::partition(), libMesh::MeshBase::renumber_nodes_and_elements(), libMesh::MeshBase::update_parallel_id_counts(), and libMesh::Parallel::verify().

Referenced by libMesh::UnstructuredMesh::all_first_order(), libMesh::UnstructuredMesh::all_second_order(), libMesh::MeshTools::Subdivision::all_subdivision(), libMesh::MeshTools::Modification::all_tri(), libMesh::MeshTools::Generation::build_cube(), libMesh::MeshTools::Generation::build_extrusion(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::MeshRefinement::coarsen_elements(), libMesh::UnstructuredMesh::create_submesh(), libMesh::MeshTools::Modification::flatten(), libMesh::MeshTools::Subdivision::prepare_subdivision_mesh(), libMesh::GMVIO::read(), libMesh::UnstructuredMesh::read(), libMesh::MeshRefinement::refine_and_coarsen_elements(), libMesh::MeshRefinement::refine_elements(), stitching_helper(), libMesh::BoundaryInfo::sync(), libMesh::MeshRefinement::uniformly_coarsen(), and libMesh::MeshRefinement::uniformly_refine().

{
  parallel_object_only();

  libmesh_assert(this->comm().verify(this->is_serial()));

  // A distributed mesh may have processors with no elements (or
  // processors with no elements of higher dimension, if we ever
  // support mixed-dimension meshes), but we want consistent
  // mesh_dimension anyways.
  //
  // cache_elem_dims() should get the elem_dimensions() and
  // mesh_dimension() correct later, and we don't need it earlier.


  // Renumber the nodes and elements so that they in contiguous
  // blocks.  By default, _skip_renumber_nodes_and_elements is false.
  //
  // We may currently change that by passing
  // skip_renumber_nodes_and_elements==true to this function, but we
  // should use the allow_renumbering() accessor instead.
  //
  // Instances where you if prepare_for_use() should not renumber the nodes
  // and elements include reading in e.g. an xda/r or gmv file. In
  // this case, the ordering of the nodes may depend on an accompanying
  // solution, and the node ordering cannot be changed.

  if (skip_renumber_nodes_and_elements)
    {
      libmesh_deprecated();
      this->allow_renumbering(false);
    }

  // Mesh modification operations might not leave us with consistent
  // id counts, but our partitioner might need that consistency.
  if(!_skip_renumber_nodes_and_elements)
    this->renumber_nodes_and_elements();
  else
    this->update_parallel_id_counts();

  // Let all the elements find their neighbors
  if(!skip_find_neighbors)
    this->find_neighbors();

  // Partition the mesh.
  this->partition();

  // If we're using ParallelMesh, we'll want it parallelized.
  this->delete_remote_elements();

#ifdef LIBMESH_ENABLE_UNIQUE_ID
  // Assign DOF object unique ids
  this->assign_unique_ids();
#endif

  if(!_skip_renumber_nodes_and_elements)
    this->renumber_nodes_and_elements();

  // Search the mesh for all the dimensions of the elements
  // and cache them.
  this->cache_elem_dims();

  // Reset our PointLocator.  This needs to happen any time the elements
  // in the underlying elements in the mesh have changed, so we do it here.
  this->clear_point_locator();

  // The mesh is now prepared for use.
  _is_prepared = true;
}
void libMesh::MeshBase::print_info ( std::ostream &  os = libMesh::out) const [inherited]

Prints relevant information about the mesh.

Definition at line 347 of file mesh_base.C.

References libMesh::MeshBase::get_info().

Referenced by libMesh::InfElemBuilder::build_inf_elem(), and libMesh::operator<<().

{
  os << this->get_info()
     << std::endl;
}
Returns:
the rank of this processor in the group.

Definition at line 98 of file parallel_object.h.

References libMesh::ParallelObject::_communicator, and libMesh::Parallel::Communicator::rank().

Referenced by libMesh::MetisPartitioner::_do_partition(), libMesh::EquationSystems::_read_impl(), active_local_elements_begin(), libMesh::ParallelMesh::active_local_elements_begin(), active_local_elements_end(), libMesh::ParallelMesh::active_local_elements_end(), active_local_subdomain_elements_begin(), libMesh::ParallelMesh::active_local_subdomain_elements_begin(), active_local_subdomain_elements_end(), libMesh::ParallelMesh::active_local_subdomain_elements_end(), active_not_local_elements_begin(), libMesh::ParallelMesh::active_not_local_elements_begin(), active_not_local_elements_end(), libMesh::ParallelMesh::active_not_local_elements_end(), libMesh::ParallelMesh::add_elem(), libMesh::DofMap::add_neighbors_to_send_list(), libMesh::ParallelMesh::add_node(), libMesh::UnstructuredMesh::all_second_order(), libMesh::FEMSystem::assembly(), libMesh::ParmetisPartitioner::assign_partitioning(), libMesh::ParallelMesh::assign_unique_ids(), libMesh::EquationSystems::build_discontinuous_solution_vector(), libMesh::Nemesis_IO_Helper::build_element_and_node_maps(), libMesh::ParmetisPartitioner::build_graph(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::DofMap::build_sparsity(), libMesh::ParallelMesh::clear(), libMesh::ExodusII_IO_Helper::close(), libMesh::Nemesis_IO_Helper::compute_border_node_ids(), libMesh::Nemesis_IO_Helper::compute_communication_map_parameters(), libMesh::Nemesis_IO_Helper::compute_internal_and_border_elems_and_internal_nodes(), libMesh::Nemesis_IO_Helper::compute_node_communication_maps(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::Nemesis_IO_Helper::construct_nemesis_filename(), libMesh::ExodusII_IO_Helper::create(), libMesh::ParallelMesh::delete_elem(), libMesh::ParallelMesh::delete_node(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::distribute_local_dofs_node_major(), libMesh::DofMap::distribute_local_dofs_var_major(), libMesh::DofMap::end_dof(), libMesh::DofMap::end_old_dof(), libMesh::EnsightIO::EnsightIO(), facelocal_elements_begin(), libMesh::ParallelMesh::facelocal_elements_begin(), facelocal_elements_end(), libMesh::ParallelMesh::facelocal_elements_end(), libMesh::MeshFunction::find_element(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::DofMap::first_dof(), libMesh::DofMap::first_old_dof(), libMesh::Nemesis_IO_Helper::get_cmap_params(), libMesh::Nemesis_IO_Helper::get_eb_info_global(), libMesh::Nemesis_IO_Helper::get_elem_cmap(), libMesh::Nemesis_IO_Helper::get_elem_map(), libMesh::MeshBase::get_info(), libMesh::Nemesis_IO_Helper::get_init_global(), libMesh::Nemesis_IO_Helper::get_init_info(), libMesh::Nemesis_IO_Helper::get_loadbal_param(), libMesh::Nemesis_IO_Helper::get_node_cmap(), libMesh::Nemesis_IO_Helper::get_node_map(), libMesh::Nemesis_IO_Helper::get_ns_param_global(), libMesh::Nemesis_IO_Helper::get_ss_param_global(), libMesh::SystemSubsetBySubdomain::init(), libMesh::ParmetisPartitioner::initialize(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::ExodusII_IO_Helper::initialize_element_variables(), libMesh::ExodusII_IO_Helper::initialize_global_variables(), libMesh::ExodusII_IO_Helper::initialize_nodal_variables(), libMesh::ParallelMesh::insert_elem(), libMesh::SparsityPattern::Build::join(), libMesh::DofMap::last_dof(), libMesh::MeshTools::libmesh_assert_valid_procids< Elem >(), libMesh::MeshTools::libmesh_assert_valid_procids< Node >(), local_elements_begin(), libMesh::ParallelMesh::local_elements_begin(), local_elements_end(), libMesh::ParallelMesh::local_elements_end(), local_level_elements_begin(), libMesh::ParallelMesh::local_level_elements_begin(), local_level_elements_end(), libMesh::ParallelMesh::local_level_elements_end(), local_nodes_begin(), libMesh::ParallelMesh::local_nodes_begin(), local_nodes_end(), libMesh::ParallelMesh::local_nodes_end(), local_not_level_elements_begin(), libMesh::ParallelMesh::local_not_level_elements_begin(), local_not_level_elements_end(), libMesh::ParallelMesh::local_not_level_elements_end(), libMesh::DofMap::local_variable_indices(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::MeshBase::n_active_local_elem(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::DofMap::n_local_dofs(), libMesh::System::n_local_dofs(), libMesh::MeshBase::n_local_elem(), libMesh::MeshBase::n_local_nodes(), libMesh::BoundaryInfo::n_nodeset_conds(), not_local_elements_begin(), libMesh::ParallelMesh::not_local_elements_begin(), not_local_elements_end(), libMesh::ParallelMesh::not_local_elements_end(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::SparsityPattern::Build::operator()(), libMesh::PatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::ParallelMesh::ParallelMesh(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::System::project_vector(), libMesh::Nemesis_IO_Helper::put_cmap_params(), libMesh::Nemesis_IO_Helper::put_elem_cmap(), libMesh::Nemesis_IO_Helper::put_elem_map(), libMesh::Nemesis_IO_Helper::put_loadbal_param(), libMesh::Nemesis_IO_Helper::put_node_cmap(), libMesh::Nemesis_IO_Helper::put_node_map(), libMesh::NameBasedIO::read(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::XdrIO::read(), libMesh::ExodusII_IO_Helper::read_elem_num_map(), libMesh::System::read_header(), libMesh::System::read_legacy_data(), libMesh::ExodusII_IO_Helper::read_node_num_map(), libMesh::System::read_parallel_data(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::System::read_serialized_data(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), libMesh::System::read_serialized_vectors(), libMesh::MeshData::read_xdr(), semilocal_elements_begin(), libMesh::ParallelMesh::semilocal_elements_begin(), semilocal_elements_end(), libMesh::ParallelMesh::semilocal_elements_end(), libMesh::Partitioner::set_node_processor_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::LaplaceMeshSmoother::smooth(), libMesh::BoundaryInfo::sync(), libMesh::MeshTools::total_weight(), libMesh::ParallelMesh::update_parallel_id_counts(), libMesh::MeshTools::weight(), libMesh::NameBasedIO::write(), libMesh::ExodusII_IO::write(), libMesh::CheckpointIO::write(), libMesh::XdrIO::write(), libMesh::EquationSystems::write(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO::write_element_data(), libMesh::ExodusII_IO_Helper::write_element_values(), libMesh::ExodusII_IO_Helper::write_elements(), libMesh::ExodusII_IO::write_global_data(), libMesh::ExodusII_IO_Helper::write_global_values(), libMesh::System::write_header(), libMesh::ExodusII_IO::write_information_records(), libMesh::ExodusII_IO_Helper::write_information_records(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::UCDIO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data_discontinuous(), libMesh::ExodusII_IO_Helper::write_nodal_values(), libMesh::ExodusII_IO_Helper::write_nodesets(), libMesh::Nemesis_IO_Helper::write_nodesets(), libMesh::System::write_parallel_data(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bc_names(), libMesh::XdrIO::write_serialized_bcs(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::System::write_serialized_data(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::XdrIO::write_serialized_subdomain_names(), libMesh::System::write_serialized_vector(), libMesh::System::write_serialized_vectors(), libMesh::ExodusII_IO_Helper::write_sidesets(), libMesh::Nemesis_IO_Helper::write_sidesets(), libMesh::ExodusII_IO::write_timestep(), and libMesh::ExodusII_IO_Helper::write_timestep().

  { return cast_int<processor_id_type>(_communicator.rank()); }
const Elem * libMesh::SerialMesh::query_elem ( const dof_id_type  i) const [virtual]

Return a pointer to the $ i^{th} $ element, or NULL if no such element exists in this processor's mesh data structure.

Implements libMesh::MeshBase.

Definition at line 287 of file serial_mesh.C.

References _elements, libMesh::libmesh_assert(), and n_elem().

{
  if (i >= this->n_elem())
    return NULL;
  libmesh_assert (_elements[i] == NULL ||
                  _elements[i]->id() == i); // This will change soon

  return _elements[i];
}

Return a writeable pointer to the $ i^{th} $ element, or NULL if no such element exists in this processor's mesh data structure.

Implements libMesh::MeshBase.

Definition at line 300 of file serial_mesh.C.

References _elements, libMesh::libmesh_assert(), and n_elem().

{
  if (i >= this->n_elem())
    return NULL;
  libmesh_assert (_elements[i] == NULL ||
                  _elements[i]->id() == i); // This will change soon

  return _elements[i];
}
const Node * libMesh::SerialMesh::query_node_ptr ( const dof_id_type  i) const [virtual]

Return a pointer to the $ i^{th} $ node, or NULL if no such node exists in this processor's mesh data structure.

Implements libMesh::MeshBase.

Definition at line 237 of file serial_mesh.C.

References _nodes, libMesh::libmesh_assert(), and n_nodes().

{
  if (i >= this->n_nodes())
    return NULL;
  libmesh_assert (_nodes[i] == NULL ||
                  _nodes[i]->id() == i); // This will change soon

  return _nodes[i];
}

Return a writeable pointer to the $ i^{th} $ node, or NULL if no such node exists in this processor's mesh data structure.

Implements libMesh::MeshBase.

Definition at line 250 of file serial_mesh.C.

References _nodes, libMesh::libmesh_assert(), and n_nodes().

{
  if (i >= this->n_nodes())
    return NULL;
  libmesh_assert (_nodes[i] == NULL ||
                  _nodes[i]->id() == i); // This will change soon

  return _nodes[i];
}
void libMesh::UnstructuredMesh::read ( const std::string &  name,
MeshData mesh_data = NULL,
bool  skip_renumber_nodes_and_elements = false 
) [virtual, inherited]

Reads the file specified by name. Attempts to figure out the proper method by the file extension. This is now the only way to read a mesh. The UnstructuredMesh then initializes its data structures and is ready for use.

In order to read the UNV and TetGen file types, you must also pass a separate pointer to the MeshData object you will use with this mesh, since these read methods expect it.

The skip_renumber_nodes_and_elements argument is now deprecated - to disallow renumbering, set MeshBase::allow_renumbering(false)

Implements libMesh::MeshBase.

Definition at line 484 of file unstructured_mesh.C.

References libMesh::MeshBase::allow_renumbering(), libMesh::MeshBase::prepare_for_use(), libMesh::NameBasedIO::read(), libMesh::TetGenIO::read(), and libMesh::UNVIO::read().

{
  // Set the skip_renumber_nodes_and_elements flag on all processors
  // if necessary.
  // This ensures that renumber_nodes_and_elements is *not* called
  // during prepare_for_use() for certain types of mesh files.
  // This is required in cases where there is an associated solution
  // file which expects a certain ordering of the nodes.
  if(name.rfind(".gmv")+4==name.size())
    {
      skip_renumber_nodes_and_elements =  true;
    }

  if (mesh_data)
    {
      libmesh_deprecated();
      if (name.rfind(".unv") < name.size())
        UNVIO(*this, mesh_data).read (name);
      else if ((name.rfind(".node")  < name.size()) ||
               (name.rfind(".ele")   < name.size()))
        TetGenIO(*this,mesh_data).read (name);
    }
  else
    NameBasedIO(*this).read(name);

  if (skip_renumber_nodes_and_elements)
    {
      // Use MeshBase::allow_renumbering() yourself instead.
      libmesh_deprecated();
      this->allow_renumbering(false);
    }

  // Done reading the mesh.  Now prepare it for use.
  this->prepare_for_use();
}
unsigned int libMesh::MeshBase::recalculate_n_partitions ( ) [inherited]

In a few (very rare) cases, the user may have manually tagged the elements with specific processor IDs by hand, without using a partitioner. In this case, the Mesh will not know that the total number of partitions, _n_parts, has changed, unless you call this function. This is an O(N active elements) calculation. The return value is the number of partitions, and _n_parts is also set by this function.

Definition at line 394 of file mesh_base.C.

References libMesh::MeshBase::_n_parts, libMesh::MeshBase::active_local_elements_begin(), libMesh::MeshBase::active_local_elements_end(), libMesh::ParallelObject::comm(), end, std::max(), and libMesh::Parallel::Communicator::max().

Referenced by libMesh::MeshBase::partition().

{
  // This requires an inspection on every processor
  parallel_object_only();

  const_element_iterator el  = this->active_local_elements_begin();
  const_element_iterator end = this->active_local_elements_end();

  unsigned int max_proc_id=0;

  for (; el!=end; ++el)
    max_proc_id = std::max(max_proc_id, static_cast<unsigned int>((*el)->processor_id()));

  // The number of partitions is one more than the max processor ID.
  _n_parts = max_proc_id+1;

  this->comm().max(_n_parts);

  return _n_parts;
}
virtual void libMesh::MeshBase::redistribute ( ) [inline, virtual, inherited]

Redistribute elements between processors. This gets called automatically by the Partitioner, and is a no-op in the case of a SerialMesh or serialized ParallelMesh

Reimplemented in libMesh::ParallelMesh.

Definition at line 537 of file mesh_base.h.

Referenced by libMesh::Partitioner::partition().

{}
void libMesh::SerialMesh::renumber_elem ( dof_id_type  old_id,
dof_id_type  new_id 
) [virtual]

Changes the id of element old_id, both by changing elem(old_id)->id() and by moving elem(old_id) in the mesh's internal container. No element with the id new_id should already exist.

Implements libMesh::MeshBase.

Definition at line 410 of file serial_mesh.C.

References _elements, libMesh::libmesh_assert(), and libMesh::DofObject::set_id().

{
  // This doesn't get used in serial yet
  Elem *el = _elements[old_id];
  libmesh_assert (el);

  el->set_id(new_id);
  libmesh_assert (!_elements[new_id]);
  _elements[new_id] = el;
  _elements[old_id] = NULL;
}
void libMesh::SerialMesh::renumber_node ( dof_id_type  old_id,
dof_id_type  new_id 
) [virtual]

Changes the id of node old_id, both by changing node(old_id)->id() and by moving node(old_id) in the mesh's internal container. No element with the id new_id should already exist.

Implements libMesh::MeshBase.

Definition at line 571 of file serial_mesh.C.

References _nodes, libMesh::libmesh_assert(), and libMesh::DofObject::set_id().

{
  // This doesn't get used in serial yet
  Node *nd = _nodes[old_id];
  libmesh_assert (nd);

  nd->set_id(new_id);
  libmesh_assert (!_nodes[new_id]);
  _nodes[new_id] = nd;
  _nodes[old_id] = NULL;
}

Remove NULL elements from arrays

Implements libMesh::MeshBase.

Definition at line 623 of file serial_mesh.C.

References _elements, _nodes, libMesh::MeshBase::_skip_renumber_nodes_and_elements, end, libMesh::MeshBase::get_boundary_info(), libMesh::Elem::get_node(), libMesh::libmesh_assert(), libMesh::Elem::n_nodes(), libMesh::Elem::node(), libMesh::BoundaryInfo::remove(), libMesh::DofObject::set_id(), libMesh::START_LOG(), and libMesh::swap().

{

  START_LOG("renumber_nodes_and_elem()", "Mesh");

  // node and element id counters
  dof_id_type next_free_elem = 0;
  dof_id_type next_free_node = 0;

  // Will hold the set of nodes that are currently connected to elements
  LIBMESH_BEST_UNORDERED_SET<Node*> connected_nodes;

  // Loop over the elements.  Note that there may
  // be NULLs in the _elements vector from the coarsening
  // process.  Pack the elements in to a contiguous array
  // and then trim any excess.
  {
    std::vector<Elem*>::iterator in        = _elements.begin();
    std::vector<Elem*>::iterator out_iter  = _elements.begin();
    const std::vector<Elem*>::iterator end = _elements.end();

    for (; in != end; ++in)
      if (*in != NULL)
        {
          Elem* el = *in;

          *out_iter = *in;
          ++out_iter;

          // Increment the element counter
          el->set_id (next_free_elem++);

          if(_skip_renumber_nodes_and_elements)
            {
              // Add this elements nodes to the connected list
              for (unsigned int n=0; n<el->n_nodes(); n++)
                connected_nodes.insert(el->get_node(n));
            }
          else  // We DO want node renumbering
            {
              // Loop over this element's nodes.  Number them,
              // if they have not been numbered already.  Also,
              // position them in the _nodes vector so that they
              // are packed contiguously from the beginning.
              for (unsigned int n=0; n<el->n_nodes(); n++)
                if (el->node(n) == next_free_node)     // don't need to process
                  next_free_node++;                      // [(src == dst) below]

                else if (el->node(n) > next_free_node) // need to process
                  {
                    // The source and destination indices
                    // for this node
                    const dof_id_type src_idx = el->node(n);
                    const dof_id_type dst_idx = next_free_node++;

                    // ensure we want to swap a valid nodes
                    libmesh_assert(_nodes[src_idx]);

                    // Swap the source and destination nodes
                    std::swap(_nodes[src_idx],
                              _nodes[dst_idx] );

                    // Set proper indices where that makes sense
                    if (_nodes[src_idx] != NULL)
                      _nodes[src_idx]->set_id (src_idx);
                    _nodes[dst_idx]->set_id (dst_idx);
                  }
            }
        }

    // Erase any additional storage. These elements have been
    // copied into NULL voids by the procedure above, and are
    // thus repeated and unnecessary.
    _elements.erase (out_iter, end);
  }


  if(_skip_renumber_nodes_and_elements)
    {
      // Loop over the nodes.  Note that there may
      // be NULLs in the _nodes vector from the coarsening
      // process.  Pack the nodes in to a contiguous array
      // and then trim any excess.

      std::vector<Node*>::iterator in        = _nodes.begin();
      std::vector<Node*>::iterator out_iter  = _nodes.begin();
      const std::vector<Node*>::iterator end = _nodes.end();

      for (; in != end; ++in)
        if (*in != NULL)
          {
            // This is a reference so that if we change the pointer it will change in the vector
            Node* & nd = *in;

            // If this node is still connected to an elem, put it in the list
            if(connected_nodes.find(nd) != connected_nodes.end())
              {
                *out_iter = nd;
                ++out_iter;

                // Increment the node counter
                nd->set_id (next_free_node++);
              }
            else // This node is orphaned, delete it!
              {
                this->get_boundary_info().remove (nd);

                // delete the node
                delete nd;
                nd = NULL;
              }
          }

      // Erase any additional storage.  Whatever was
      _nodes.erase (out_iter, end);
    }
  else // We really DO want node renumbering
    {
      // Any nodes in the vector >= _nodes[next_free_node]
      // are not connected to any elements and may be deleted
      // if desired.

      // (This code block will erase the unused nodes)
      // Now, delete the unused nodes
      {
        std::vector<Node*>::iterator nd        = _nodes.begin();
        const std::vector<Node*>::iterator end = _nodes.end();

        std::advance (nd, next_free_node);

        for (std::vector<Node*>::iterator it=nd;
             it != end; ++it)
          {
            // Mesh modification code might have already deleted some
            // nodes
            if (*it == NULL)
              continue;

            // remove any boundary information associated with
            // this node
            this->get_boundary_info().remove (*it);

            // delete the node
            delete *it;
            *it = NULL;
          }

        _nodes.erase (nd, end);
      }
    }

  libmesh_assert_equal_to (next_free_elem, _elements.size());
  libmesh_assert_equal_to (next_free_node, _nodes.size());

  STOP_LOG("renumber_nodes_and_elem()", "Mesh");
}
virtual void libMesh::SerialMesh::reserve_elem ( const dof_id_type  ne) [inline, virtual]

Reserves space for a known number of elements. Note that this method may or may not do anything, depending on the actual Mesh implementation. If you know the number of elements you will add and call this method before repeatedly calling add_point() the implementation will be more efficient.

Implements libMesh::MeshBase.

Definition at line 127 of file serial_mesh.h.

References _elements.

{ _elements.reserve (ne); }
virtual void libMesh::SerialMesh::reserve_nodes ( const dof_id_type  nn) [inline, virtual]

Reserves space for a known number of nodes. Note that this method may or may not do anything, depending on the actual Mesh implementation. If you know the number of nodes you will add and call this method before repeatedly calling add_point() the implementation will be more efficient.

Implements libMesh::MeshBase.

Definition at line 113 of file serial_mesh.h.

References _nodes.

  { _nodes.reserve (nn); }

Implements libMesh::MeshBase.

Definition at line 117 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::SemiLocal<elem_iterator_imp> p(this->processor_id());
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 360 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::SemiLocal<const_elem_iterator_imp> p(this->processor_id());
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 603 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::SemiLocal<elem_iterator_imp> p(this->processor_id());
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 850 of file serial_mesh_iterators.C.

References _elements, and libMesh::ParallelObject::processor_id().

{
  Predicates::SemiLocal<const_elem_iterator_imp> p(this->processor_id());
  return const_element_iterator(_elements.end(), _elements.end(), p);
}
unsigned int& libMesh::MeshBase::set_n_partitions ( ) [inline, protected, inherited]

Returns a writeable reference to the number of partitions.

Definition at line 898 of file mesh_base.h.

References libMesh::MeshBase::_n_parts.

Referenced by libMesh::Partitioner::partition(), libMesh::Partitioner::repartition(), and libMesh::BoundaryInfo::sync().

  { return _n_parts; }
void libMesh::MeshBase::set_next_unique_id ( unique_id_type  id) [inline, inherited]

Sets the next unique id to be used.

Definition at line 235 of file mesh_base.h.

References libMesh::MeshBase::_next_unique_id.

{ _next_unique_id = id; }
std::map<subdomain_id_type, std::string>& libMesh::MeshBase::set_subdomain_name_map ( ) [inline, inherited]

Return a writeable reference to the whole subdomain name map

Definition at line 860 of file mesh_base.h.

References libMesh::MeshBase::_block_id_to_name.

Referenced by libMesh::XdrIO::read_serialized_subdomain_names(), and libMesh::CheckpointIO::read_subdomain_names().

  { return _block_id_to_name; }
void libMesh::MeshBase::skip_partitioning ( bool  skip) [inline, inherited]

If true is passed in then this mesh will no longer be (re)partitioned. It would probably be a bad idea to call this on a Serial Mesh _before_ the first partitioning has happened... because no elements would get assigned to your processor pool.

Note that turning on skip_partitioning() can have adverse effects on your performance when using AMR... ie you could get large load imbalances.

However you might still want to use this if the communication and computation of the rebalance and repartition is too high for your application.

Definition at line 566 of file mesh_base.h.

References libMesh::MeshBase::_skip_partitioning.

Referenced by libMesh::UnstructuredMesh::copy_nodes_and_elements().

{ _skip_partitioning = skip; }
bool libMesh::MeshBase::skip_partitioning ( ) const [inline, inherited]

Definition at line 567 of file mesh_base.h.

References libMesh::MeshBase::_skip_partitioning.

Referenced by libMesh::MeshBase::partition().

{ return _skip_partitioning; }
unsigned int libMesh::MeshBase::spatial_dimension ( ) const [inline, inherited]

Returns the spatial dimension of the mesh. Note that this is defined at compile time in the header libmesh_common.h.

Definition at line 182 of file mesh_base.h.

Referenced by libMesh::ExactSolution::_compute_error(), libMesh::MeshBase::get_info(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::UNVIO::nodes_out(), libMesh::MeshTools::Modification::scale(), libMesh::MeshTools::subdomain_bounding_box(), and libMesh::Nemesis_IO_Helper::write_exodus_initialization_info().

  { return cast_int<unsigned int>(LIBMESH_DIM); }
void libMesh::SerialMesh::stitch_meshes ( SerialMesh other_mesh,
boundary_id_type  this_mesh_boundary,
boundary_id_type  other_mesh_boundary,
Real  tol = TOLERANCE,
bool  clear_stitched_boundary_ids = false,
bool  verbose = true,
bool  use_binary_search = true,
bool  enforce_all_nodes_match_on_boundaries = false 
)

Stitch other_mesh to this mesh so that this mesh is the union of the two meshes. this_mesh_boundary and other_mesh_boundary are used to specify a dim-1 dimensional surface on which we seek to merge any "overlapping" nodes, where we use the parameter tol as a relative tolerance (relative to the smallest edge length on the surfaces being stitched) to determine whether or not nodes are overlapping. If clear_stitched_boundary_ids==true, this function clears boundary_info IDs in this mesh associated this_mesh_boundary and other_mesh_boundary. If use_binary_search is true, we use an optimized "sort then binary search" algorithm for finding matching nodes. Otherwise we use a N^2 algorithm (which can be more reliable at dealing with slightly misaligned meshes). If enforce_all_nodes_match_on_boundaries is true, we throw an error if the number of nodes on the specified boundaries don't match the number of nodes that were merged. This is a helpful error check in some cases. If skip_find_neighbors is true, a faster stitching method is used, where the lists of neighbors for each elements are copied as well and patched, without calling the time-consuming find_neighbors() function.

Definition at line 796 of file serial_mesh.C.

References libMesh::START_LOG(), and stitching_helper().

{
  START_LOG("stitch_meshes()", "SerialMesh");
  stitching_helper(&other_mesh,
                   this_mesh_boundary_id,
                   other_mesh_boundary_id,
                   tol,
                   clear_stitched_boundary_ids,
                   verbose,
                   use_binary_search,
                   enforce_all_nodes_match_on_boundaries,
                   true);
  STOP_LOG("stitch_meshes()", "SerialMesh");
}
void libMesh::SerialMesh::stitch_surfaces ( boundary_id_type  boundary_id_1,
boundary_id_type  boundary_id_2,
Real  tol = TOLERANCE,
bool  clear_stitched_boundary_ids = false,
bool  verbose = true,
bool  use_binary_search = true,
bool  enforce_all_nodes_match_on_boundaries = false 
)

Similar to stitch_meshes, except that we stitch two adjacent surfaces within this mesh.

Definition at line 818 of file serial_mesh.C.

References stitching_helper().

{
  stitching_helper(NULL,
                   boundary_id_1,
                   boundary_id_2,
                   tol,
                   clear_stitched_boundary_ids,
                   verbose,
                   use_binary_search,
                   enforce_all_nodes_match_on_boundaries,
                   true);
}
void libMesh::SerialMesh::stitching_helper ( SerialMesh other_mesh,
boundary_id_type  boundary_id_1,
boundary_id_type  boundary_id_2,
Real  tol,
bool  clear_stitched_boundary_ids,
bool  verbose,
bool  use_binary_search,
bool  enforce_all_nodes_match_on_boundaries,
bool  skip_find_neighbors 
) [private]

Helper function for stitch_meshes and stitch_surfaces that does the mesh stitching.

Definition at line 837 of file serial_mesh.C.

References libMesh::TypeVector< T >::absolute_fuzzy_equals(), libMesh::BoundaryInfo::add_edge(), libMesh::BoundaryInfo::add_node(), libMesh::BoundaryInfo::add_side(), libMesh::Utility::binary_find(), libMesh::BoundaryInfo::boundary_ids(), libMesh::Elem::build_edge(), libMesh::BoundaryInfo::build_node_list(), libMesh::Elem::build_side(), libMesh::UnstructuredMesh::copy_nodes_and_elements(), delete_node(), libMesh::Elem::dim(), libMesh::BoundaryInfo::edge_boundary_ids(), elem(), elements_begin(), elements_end(), end, libMesh::MeshBase::get_boundary_info(), libMesh::Elem::get_node(), libMesh::Elem::hmin(), libMesh::DofObject::id(), libMesh::BoundaryInfo::invalid_id, libMesh::Elem::is_edge_on_side(), libMesh::Elem::key(), libMesh::Elem::level(), libMesh::Elem::local_node(), std::max(), std::min(), libMesh::Elem::n_edges(), n_elem(), libMesh::Elem::n_neighbors(), n_nodes(), libMesh::Elem::n_nodes(), libMesh::Elem::n_sides(), libMesh::Elem::neighbor(), libMesh::Elem::node(), node(), node_ptr(), nodes_begin(), nodes_end(), libMesh::out, point(), libMesh::MeshBase::prepare_for_use(), libMesh::Real, libMesh::BoundaryInfo::remove_side(), libMesh::DofObject::set_id(), libMesh::Elem::set_neighbor(), libMesh::Elem::set_node(), side, libMesh::Elem::side(), libMesh::MeshBase::sub_point_locator(), libMesh::Elem::subactive(), and libMesh::TOLERANCE.

Referenced by stitch_meshes(), and stitch_surfaces().

{
  std::map<dof_id_type, dof_id_type> node_to_node_map, other_to_this_node_map; // The second is the inverse map of the first
  std::map<dof_id_type, std::vector<dof_id_type> > node_to_elems_map;

  typedef dof_id_type                     key_type;
  typedef std::pair<Elem*, unsigned char> val_type;
  typedef std::pair<key_type, val_type>   key_val_pair;
  typedef LIBMESH_BEST_UNORDERED_MULTIMAP<key_type, val_type> map_type;
  // Mapping between all side keys in this mesh and elements+side numbers relevant to the boundary in this mesh as well.
  map_type side_to_elem_map;

  // If there is only one mesh (i.e. other_mesh==NULL), then loop over this mesh twice
  if(!other_mesh)
    {
      other_mesh = this;
    }

  if( (this_mesh_boundary_id  != BoundaryInfo::invalid_id) &&
      (other_mesh_boundary_id != BoundaryInfo::invalid_id) )
    {
      // While finding nodes on the boundary, also find the minimum edge length
      // of all faces on both boundaries.  This will later be used in relative
      // distance checks when stitching nodes.
      Real h_min = std::numeric_limits<Real>::max();
      bool h_min_updated = false;

      // Loop below fills in these sets for the two meshes.
      std::set<dof_id_type> this_boundary_node_ids, other_boundary_node_ids;
      {
        // Make temporary fixed-size arrays for loop
        boundary_id_type id_array[2]        = {this_mesh_boundary_id, other_mesh_boundary_id};
        std::set<dof_id_type>* set_array[2] = {&this_boundary_node_ids, &other_boundary_node_ids};
        SerialMesh* mesh_array[2]           = {this, other_mesh};

        for (unsigned i=0; i<2; ++i)
          {
            // First we deal with node boundary IDs.
            // We only enter this loop if we have at least one
            // nodeset.
            if(mesh_array[i]->get_boundary_info().n_nodeset_conds() > 0)
              {
                // We need to find an element that contains boundary nodes in order
                // to update hmin.
                UniquePtr<PointLocatorBase> my_locator = mesh_array[i]->sub_point_locator();

                std::vector<numeric_index_type> node_id_list;
                std::vector<boundary_id_type> bc_id_list;

                // Get the list of nodes with associated boundary IDs
                mesh_array[i]->get_boundary_info().build_node_list(node_id_list, bc_id_list);

                for(unsigned int node_index=0; node_index<bc_id_list.size(); node_index++)
                  {
                    boundary_id_type node_bc_id = bc_id_list[node_index];
                    if (node_bc_id == id_array[i])
                      {
                        dof_id_type node_id = node_id_list[node_index];
                        set_array[i]->insert( node_id );

                        const Elem* near_elem = (*my_locator)( mesh_array[i]->node(node_id) );
                        if (near_elem == NULL)
                          libmesh_error_msg("Error: PointLocator failed to find a valid element");

                        h_min = std::min(h_min, near_elem->hmin());
                        h_min_updated = true;
                      }
                  }
              }

            MeshBase::element_iterator elem_it  = mesh_array[i]->elements_begin();
            MeshBase::element_iterator elem_end = mesh_array[i]->elements_end();
            for ( ; elem_it != elem_end; ++elem_it)
              {
                Elem *el = *elem_it;

                // Now check whether elem has a face on the specified boundary
                for (unsigned char side_id=0; side_id<el->n_sides(); ++side_id)
                  if (el->neighbor(side_id) == NULL)
                    {
                      // Get *all* boundary IDs on this side, not just the first one!
                      std::vector<boundary_id_type> bc_ids =
                        mesh_array[i]->get_boundary_info().boundary_ids (el, side_id);

                      if (std::count(bc_ids.begin(), bc_ids.end(), id_array[i]))
                        {
                          UniquePtr<Elem> side (el->build_side(side_id));
                          for (unsigned int node_id=0; node_id<side->n_nodes(); ++node_id)
                            set_array[i]->insert( side->node(node_id) );

                          h_min = std::min(h_min, side->hmin());
                          h_min_updated = true;

                          // This side is on the boundary, add its information to side_to_elem
                          if(skip_find_neighbors && (i==0))
                            {
                              key_type key = el->key(side_id);
                              val_type val;
                              val.first = el;
                              val.second = side_id;

                              key_val_pair kvp;
                              kvp.first = key;
                              kvp.second = val;
                              // side_to_elem_map[key] = val;
#if defined(LIBMESH_HAVE_UNORDERED_MAP) || defined(LIBMESH_HAVE_TR1_UNORDERED_MAP) || defined(LIBMESH_HAVE_HASH_MAP) || defined(LIBMESH_HAVE_EXT_HASH_MAP)
                              side_to_elem_map.insert (kvp);
#else
                              side_to_elem_map.insert (side_to_elem_map.begin(),kvp);
#endif
                            }
                        }

                      // Also, check the edges on this side. We don't have to worry about
                      // updating neighbor info in this case since elements don't store
                      // neighbor info on edges.
                      for (unsigned short edge_id=0; edge_id<el->n_edges(); ++edge_id)
                        {
                          if(el->is_edge_on_side(edge_id, side_id))
                            {
                              // Get *all* boundary IDs on this edge, not just the first one!
                              std::vector<boundary_id_type> edge_bc_ids =
                                mesh_array[i]->get_boundary_info().edge_boundary_ids (el, edge_id);

                              if (std::count(edge_bc_ids.begin(), edge_bc_ids.end(), id_array[i]))
                                {
                                  UniquePtr<Elem> edge (el->build_edge(edge_id));
                                  for (unsigned int node_id=0; node_id<edge->n_nodes(); ++node_id)
                                    set_array[i]->insert( edge->node(node_id) );

                                  h_min = std::min(h_min, edge->hmin());
                                  h_min_updated = true;
                                }
                            }
                        }
                    }
              }
          }
      }

      if (verbose)
        {
          libMesh::out << "In SerialMesh::stitch_meshes:\n"
                       << "This mesh has "  << this_boundary_node_ids.size()
                       << " nodes on boundary " << this_mesh_boundary_id  << ".\n"
                       << "Other mesh has " << other_boundary_node_ids.size()
                       << " nodes on boundary " << other_mesh_boundary_id << ".\n";

          if(h_min_updated)
            {
              libMesh::out << "Minimum edge length on both surfaces is " << h_min << ".\n";
            }
          else
            {
              libMesh::out << "No elements on specified surfaces." << std::endl;
            }
        }


      if(use_binary_search)
        {
          // Store points from both stitched faces in sorted vectors for faster
          // searching later.
          typedef std::vector< std::pair<Point, dof_id_type> > PointVector;
          PointVector
            this_sorted_bndry_nodes(this_boundary_node_ids.size()),
            other_sorted_bndry_nodes(other_boundary_node_ids.size());

          // Comparison object that will be used later. So far, I've had reasonable success
          // with TOLERANCE...
          FuzzyPointCompare mein_comp(TOLERANCE);

          // Create and sort the vectors we will use to do the geometric searching
          {
            std::set<dof_id_type>* set_array[2] = {&this_boundary_node_ids, &other_boundary_node_ids};
            SerialMesh* mesh_array[2]           = {this, other_mesh};
            PointVector* vec_array[2]           = {&this_sorted_bndry_nodes, &other_sorted_bndry_nodes};

            for (unsigned i=0; i<2; ++i)
              {
                std::set<dof_id_type>::iterator
                  set_it     = set_array[i]->begin(),
                  set_it_end = set_array[i]->end();

                // Fill up the vector with the contents of the set...
                for (unsigned ctr=0; set_it != set_it_end; ++set_it, ++ctr)
                  {
                    (*vec_array[i])[ctr] = std::make_pair( mesh_array[i]->point(*set_it), // The geometric point
                                                           *set_it );                     // Its ID
                  }

                // Sort the vectors based on the FuzzyPointCompare struct op()
                std::sort(vec_array[i]->begin(), vec_array[i]->end(), mein_comp);
              }
          }

          // Build up the node_to_node_map and node_to_elems_map using the sorted vectors of Points.
          for (unsigned i=0; i<this_sorted_bndry_nodes.size(); ++i)
            {
              // Current point we're working on
              Point this_point = this_sorted_bndry_nodes[i].first;

              // FuzzyPointCompare does a fuzzy equality comparison internally to handle
              // slight differences between the list of nodes on each mesh.
              PointVector::iterator other_iter = Utility::binary_find(other_sorted_bndry_nodes.begin(),
                                                                      other_sorted_bndry_nodes.end(),
                                                                      this_point,
                                                                      mein_comp);

              // Not every node on this_sorted_bndry_nodes will necessarily be stitched, so
              // if its pair is not found on other_mesh, just continue.
              if (other_iter != other_sorted_bndry_nodes.end())
                {
                  // Check that the points do indeed match - should not be necessary unless something
                  // is wrong with binary_find.  To be on the safe side, we'll check.
                  {
                    // Grab the other point from the iterator
                    Point other_point = other_iter->first;

                    if (!this_point.absolute_fuzzy_equals(other_point, tol*h_min))
                      libmesh_error_msg("Error: mismatched points: " << this_point << " and " << other_point);
                  }


                  // Associate these two nodes in both the node_to_node_map and the other_to_this_node_map
                  dof_id_type
                    this_node_id = this_sorted_bndry_nodes[i].second,
                    other_node_id = other_iter->second;
                  node_to_node_map[this_node_id] = other_node_id;
                  other_to_this_node_map[other_node_id] = this_node_id;
                }

            }
        }
      else
        {
          // Otherwise, use a simple N^2 search to find the closest matching points. This can be helpful
          // in the case that we have tolerance issues which cause mismatch between the two surfaces
          // that are being stitched.

          std::set<dof_id_type>::iterator set_it     = this_boundary_node_ids.begin();
          std::set<dof_id_type>::iterator set_it_end = this_boundary_node_ids.end();
          for( ; set_it != set_it_end; ++set_it)
            {
              dof_id_type this_node_id = *set_it;
              Node& this_node = this->node(this_node_id);

              bool found_matching_nodes = false;

              std::set<dof_id_type>::iterator other_set_it     = other_boundary_node_ids.begin();
              std::set<dof_id_type>::iterator other_set_it_end = other_boundary_node_ids.end();
              for( ; other_set_it != other_set_it_end; ++other_set_it)
                {
                  dof_id_type other_node_id = *other_set_it;
                  Node& other_node = other_mesh->node(other_node_id);

                  Real node_distance = (this_node - other_node).size();

                  if(node_distance < tol*h_min)
                    {
                      // Make sure we didn't already find a matching node!
                      if(found_matching_nodes)
                        libmesh_error_msg("Error: Found multiple matching nodes in stitch_meshes");

                      node_to_node_map[this_node_id] = other_node_id;
                      other_to_this_node_map[other_node_id] = this_node_id;

                      found_matching_nodes = true;
                    }
                }
            }
        }

      // Build up the node_to_elems_map, using only one loop over other_mesh
      {
        MeshBase::element_iterator other_elem_it  = other_mesh->elements_begin();
        MeshBase::element_iterator other_elem_end = other_mesh->elements_end();
        for (; other_elem_it != other_elem_end; ++other_elem_it)
          {
            Elem *el = *other_elem_it;

            // For each node on the element, find the corresponding node
            // on "this" Mesh, 'this_node_id', if it exists, and push
            // the current element ID back onto node_to_elems_map[this_node_id].
            // For that we will use the reverse mapping we created at
            // the same time as the forward mapping.
            for (unsigned n=0; n<el->n_nodes(); ++n)
              {
                dof_id_type other_node_id = el->node(n);
                std::map<dof_id_type, dof_id_type>::iterator it =
                  other_to_this_node_map.find(other_node_id);

                if (it != other_to_this_node_map.end())
                  {
                    dof_id_type this_node_id = it->second;
                    node_to_elems_map[this_node_id].push_back( el->id() );
                  }
              }
          }
      }

      if(verbose)
        {
          libMesh::out << "In SerialMesh::stitch_meshes:\n"
                       << "Found " << node_to_node_map.size()
                       << " matching nodes.\n"
                       << std::endl;
        }

      if(enforce_all_nodes_match_on_boundaries)
        {
          std::size_t n_matching_nodes = node_to_node_map.size();
          std::size_t this_mesh_n_nodes = this_boundary_node_ids.size();
          std::size_t other_mesh_n_nodes = other_boundary_node_ids.size();
          if( (n_matching_nodes != this_mesh_n_nodes) ||
              (n_matching_nodes != other_mesh_n_nodes) )
            libmesh_error_msg("Error: We expected the number of nodes to match.");
        }
    }
  else
    {
      if(verbose)
        {
          libMesh::out << "Skip node merging in SerialMesh::stitch_meshes:" << std::endl;
        }
    }



  dof_id_type node_delta = this->n_nodes();
  dof_id_type elem_delta = this->n_elem();

  // If other_mesh!=NULL, then we have to do a bunch of work
  // in order to copy it to this mesh
  if(this!=other_mesh)
    {
      // need to increment node and element IDs of other_mesh before copying to this mesh
      MeshBase::node_iterator node_it  = other_mesh->nodes_begin();
      MeshBase::node_iterator node_end = other_mesh->nodes_end();
      for (; node_it != node_end; ++node_it)
        {
          Node *nd = *node_it;
          dof_id_type new_id = nd->id() + node_delta;
          nd->set_id(new_id);
        }

      MeshBase::element_iterator elem_it  = other_mesh->elements_begin();
      MeshBase::element_iterator elem_end = other_mesh->elements_end();
      for (; elem_it != elem_end; ++elem_it)
        {
          Elem *el = *elem_it;
          dof_id_type new_id = el->id() + elem_delta;
          el->set_id(new_id);
        }

      // Also, increment the node_to_node_map and node_to_elems_map
      std::map<dof_id_type, dof_id_type>::iterator node_map_it     = node_to_node_map.begin();
      std::map<dof_id_type, dof_id_type>::iterator node_map_it_end = node_to_node_map.end();
      for( ; node_map_it != node_map_it_end; ++node_map_it)
        {
          node_map_it->second += node_delta;
        }
      std::map<dof_id_type, std::vector<dof_id_type> >::iterator elem_map_it     = node_to_elems_map.begin();
      std::map<dof_id_type, std::vector<dof_id_type> >::iterator elem_map_it_end = node_to_elems_map.end();
      for( ; elem_map_it != elem_map_it_end; ++elem_map_it)
        {
          std::size_t n_elems = elem_map_it->second.size();
          for(std::size_t i=0; i<n_elems; i++)
            {
              (elem_map_it->second)[i] += elem_delta;
            }
        }

      // Copy mesh data. If we skip the call to find_neighbors(), the lists
      // of neighbors will be copied verbatim from the other mesh
      this->copy_nodes_and_elements(*other_mesh, skip_find_neighbors);

      // Decrement node IDs of mesh to return to original state
      node_it  = other_mesh->nodes_begin();
      node_end = other_mesh->nodes_end();
      for (; node_it != node_end; ++node_it)
        {
          Node *nd = *node_it;
          dof_id_type new_id = nd->id() - node_delta;
          nd->set_id(new_id);
        }

      elem_it  = other_mesh->elements_begin();
      elem_end = other_mesh->elements_end();
      for (; elem_it != elem_end; ++elem_it)
        {
          Elem *other_elem = *elem_it;

          // Find the corresponding element on this mesh
          Elem* this_elem = this->elem(other_elem->id());

          // Decrement elem IDs of other_mesh to return it to original state
          dof_id_type new_id = other_elem->id() - elem_delta;
          other_elem->set_id(new_id);

          unsigned int other_n_nodes = other_elem->n_nodes();
          for (unsigned int n=0; n != other_n_nodes; ++n)
            {
              const std::vector<boundary_id_type>& ids =
                other_mesh->get_boundary_info().boundary_ids(other_elem->get_node(n));
              if (!ids.empty())
                {
                  this->get_boundary_info().add_node(this_elem->get_node(n), ids);
                }
            }

          // Copy edge boundary info
          unsigned int n_edges = other_elem->n_edges();
          for (unsigned short edge=0; edge != n_edges; ++edge)
            {
              const std::vector<boundary_id_type>& ids =
                other_mesh->get_boundary_info().edge_boundary_ids(other_elem, edge);
              if (!ids.empty())
                {
                  this->get_boundary_info().add_edge( this_elem, edge, ids);
                }
            }

          unsigned int n_sides = other_elem->n_sides();
          for (unsigned short s=0; s != n_sides; ++s)
            {
              const std::vector<boundary_id_type>& ids =
                other_mesh->get_boundary_info().boundary_ids(other_elem, s);
              if (!ids.empty())
                {
                  this->get_boundary_info().add_side( this_elem, s, ids);
                }
            }

        }

    } // end if(other_mesh)

  // Finally, we need to "merge" the overlapping nodes
  // We do this by iterating over node_to_elems_map and updating
  // the elements so that they "point" to the nodes that came
  // from this mesh, rather than from other_mesh.
  // Then we iterate over node_to_node_map and delete the
  // duplicate nodes that came from other_mesh.
  std::map<dof_id_type, std::vector<dof_id_type> >::iterator elem_map_it     = node_to_elems_map.begin();
  std::map<dof_id_type, std::vector<dof_id_type> >::iterator elem_map_it_end = node_to_elems_map.end();
  for( ; elem_map_it != elem_map_it_end; ++elem_map_it)
    {
      dof_id_type target_node_id = elem_map_it->first;
      dof_id_type other_node_id = node_to_node_map[target_node_id];
      Node& target_node = this->node(target_node_id);

      std::size_t n_elems = elem_map_it->second.size();
      for(std::size_t i=0; i<n_elems; i++)
        {
          dof_id_type elem_id = elem_map_it->second[i];
          Elem* el = this->elem(elem_id);

          // find the local node index that we want to update
          unsigned int local_node_index = el->local_node(other_node_id);

          // We also need to copy over the nodeset info here,
          // because the node will get deleted below
          const std::vector<boundary_id_type>& ids =
            this->get_boundary_info().boundary_ids(el->get_node(local_node_index));

          el->set_node(local_node_index) = &target_node;

          this->get_boundary_info().add_node(&target_node, ids);
        }
    }

  std::map<dof_id_type, dof_id_type>::iterator node_map_it     = node_to_node_map.begin();
  std::map<dof_id_type, dof_id_type>::iterator node_map_it_end = node_to_node_map.end();
  for( ; node_map_it != node_map_it_end; ++node_map_it)
    {
      // In the case that this==other_mesh, the two nodes might be the same (e.g. if
      // we're stitching a "sliver"), hence we need to skip node deletion in that case.
      if ((this == other_mesh) && (node_map_it->second == node_map_it->first))
        continue;

      dof_id_type node_id = node_map_it->second;
      this->delete_node( this->node_ptr(node_id) );
    }

  // If find_neighbors() wasn't called in prepare_for_use(), we need to
  // manually loop once more over all elements adjacent to the stitched boundary
  // and fix their lists of neighbors.
  // This is done according to the following steps:
  //   1. Loop over all copied elements adjacent to the boundary using node_to_elems_map (trying to avoid duplicates)
  //   2. Look at all their sides with a NULL neighbor and update them using side_to_elem_map if necessary
  //   3. Update the corresponding side in side_to_elem_map as well
  if(skip_find_neighbors)
    {
      elem_map_it     = node_to_elems_map.begin();
      elem_map_it_end = node_to_elems_map.end();
      std::set<dof_id_type> fixed_elems;
      for( ; elem_map_it != elem_map_it_end; ++elem_map_it)
        {
          std::size_t n_elems = elem_map_it->second.size();
          for(std::size_t i=0; i<n_elems; i++)
            {
              dof_id_type elem_id = elem_map_it->second[i];
              if(fixed_elems.find(elem_id) == fixed_elems.end())
                {
                  Elem* el = this->elem(elem_id);
                  fixed_elems.insert(elem_id);
                  for(unsigned int s = 0; s < el->n_neighbors(); ++s)
                    {
                      if(el->neighbor(s) == NULL)
                        {
                          key_type key = el->key(s);
                          typedef
                            map_type::iterator key_val_it_type;
                          std::pair<key_val_it_type, key_val_it_type>
                            bounds = side_to_elem_map.equal_range(key);

                          if(bounds.first != bounds.second)
                            {
                              // Get the side for this element
                              const UniquePtr<Elem> my_side(el->side(s));

                              // Look at all the entries with an equivalent key
                              while (bounds.first != bounds.second)
                                {
                                  // Get the potential element
                                  Elem* neighbor = bounds.first->second.first;

                                  // Get the side for the neighboring element
                                  const unsigned int ns = bounds.first->second.second;
                                  const UniquePtr<Elem> their_side(neighbor->side(ns));
                                  //libmesh_assert(my_side.get());
                                  //libmesh_assert(their_side.get());

                                  // If found a match with my side
                                  //
                                  // We need special tests here for 1D:
                                  // since parents and children have an equal
                                  // side (i.e. a node), we need to check
                                  // ns != ms, and we also check level() to
                                  // avoid setting our neighbor pointer to
                                  // any of our neighbor's descendants
                                  if( (*my_side == *their_side) &&
                                      (el->level() == neighbor->level()) &&
                                      ((el->dim() != 1) || (ns != s)) )
                                    {
                                      // So share a side.  Is this a mixed pair
                                      // of subactive and active/ancestor
                                      // elements?
                                      // If not, then we're neighbors.
                                      // If so, then the subactive's neighbor is

                                      if (el->subactive() ==
                                          neighbor->subactive())
                                        {
                                          // an element is only subactive if it has
                                          // been coarsened but not deleted
                                          el->set_neighbor (s,neighbor);
                                          neighbor->set_neighbor(ns,el);
                                        }
                                      else if (el->subactive())
                                        {
                                          el->set_neighbor(s,neighbor);
                                        }
                                      else if (neighbor->subactive())
                                        {
                                          neighbor->set_neighbor(ns,el);
                                        }
                                      side_to_elem_map.erase (bounds.first);
                                      break;
                                    }

                                  ++bounds.first;
                                }
                            }
                        }
                    }
                }
            }
        }
    }

  this->prepare_for_use( /*skip_renumber_nodes_and_elements= */ false, skip_find_neighbors);

  // After the stitching, we may want to clear boundary IDs from element
  // faces that are now internal to the mesh
  if(clear_stitched_boundary_ids)
    {
      MeshBase::element_iterator elem_it  = this->elements_begin();
      MeshBase::element_iterator elem_end = this->elements_end();
      for (; elem_it != elem_end; ++elem_it)
        {
          Elem *el = *elem_it;

          for (unsigned short side_id=0; side_id<el->n_sides(); side_id++)
            {
              if (el->neighbor(side_id) != NULL)
                {
                  // Completely remove the side from the boundary_info object if it has either
                  // this_mesh_boundary_id or other_mesh_boundary_id.
                  std::vector<boundary_id_type> bc_ids =
                    this->get_boundary_info().boundary_ids (el, side_id);

                  if (std::count(bc_ids.begin(), bc_ids.end(), this_mesh_boundary_id) ||
                      std::count(bc_ids.begin(), bc_ids.end(), other_mesh_boundary_id))
                    this->get_boundary_info().remove_side(el, side_id);
                }
            }
        }
    }

}
UniquePtr< PointLocatorBase > libMesh::MeshBase::sub_point_locator ( ) const [inherited]

returns a pointer to a subordinate PointLocatorBase object for this mesh, constructing a master PointLocator first if necessary. This should not be used in threaded or non-parallel_only code unless the master has already been constructed.

Definition at line 433 of file mesh_base.C.

References libMesh::MeshBase::_point_locator, libMesh::PointLocatorBase::build(), libMesh::Threads::in_threads, libMesh::libmesh_assert(), and libMesh::TREE_ELEMENTS.

Referenced by libMesh::DofMap::create_dof_constraints(), libMesh::MeshFunction::init(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::MeshRefinement::make_refinement_compatible(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), stitching_helper(), and libMesh::MeshRefinement::test_level_one().

{
  // If there's no master point locator, then we need one.
  if (_point_locator.get() == NULL)
    {
      // PointLocator construction may not be safe within threads
      libmesh_assert(!Threads::in_threads);

      // And it may require parallel communication
      parallel_object_only();

      _point_locator.reset (PointLocatorBase::build(TREE_ELEMENTS, *this).release());
    }

  // Otherwise there was a master point locator, and we can grab a
  // sub-locator easily.
  return PointLocatorBase::build(TREE_ELEMENTS, *this, _point_locator.get());
}

Implements libMesh::MeshBase.

Definition at line 87 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::SubActive<elem_iterator_imp> p;
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 330 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::SubActive<const_elem_iterator_imp> p;
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 573 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::SubActive<elem_iterator_imp> p;
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 820 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::SubActive<const_elem_iterator_imp> p;
  return const_element_iterator(_elements.end(), _elements.end(), p);
}
void libMesh::MeshBase::subdomain_ids ( std::set< subdomain_id_type > &  ids) const [inherited]

Constructs a list of all subdomain identifiers in the global mesh. Subdomains correspond to separate subsets of the mesh which could correspond e.g. to different materials in a solid mechanics application, or regions where different physical processes are important. The subdomain mapping is independent from the parallel decomposition.

Definition at line 216 of file mesh_base.C.

References libMesh::MeshBase::active_local_elements_begin(), libMesh::MeshBase::active_local_elements_end(), libMesh::ParallelObject::comm(), end, and libMesh::Parallel::Communicator::set_union().

Referenced by libMesh::MeshBase::n_subdomains(), and libMesh::TecplotIO::TecplotIO().

{
  // This requires an inspection on every processor
  parallel_object_only();

  ids.clear();

  const_element_iterator el  = this->active_local_elements_begin();
  const_element_iterator end = this->active_local_elements_end();

  for (; el!=end; ++el)
    ids.insert((*el)->subdomain_id());

  // Some subdomains may only live on other processors
  this->comm().set_union(ids);
}
const std::string & libMesh::MeshBase::subdomain_name ( subdomain_id_type  id) const [inherited]

Definition at line 466 of file mesh_base.C.

References libMesh::MeshBase::_block_id_to_name.

{
  // An empty string to return when no matching subdomain name is found
  static const std::string empty;

  std::map<subdomain_id_type, std::string>::const_iterator iter = _block_id_to_name.find(id);
  if (iter == _block_id_to_name.end())
    return empty;
  else
    return iter->second;
}

Implements libMesh::MeshBase.

Definition at line 217 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Type<elem_iterator_imp> p(type);
  return element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 460 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Type<const_elem_iterator_imp> p(type);
  return const_element_iterator(_elements.begin(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 703 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Type<elem_iterator_imp> p(type);
  return element_iterator(_elements.end(), _elements.end(), p);
}

Implements libMesh::MeshBase.

Definition at line 950 of file serial_mesh_iterators.C.

References _elements.

{
  Predicates::Type<const_elem_iterator_imp> p(type);
  return const_element_iterator(_elements.end(), _elements.end(), p);
}
virtual void libMesh::SerialMesh::update_parallel_id_counts ( ) [inline, virtual]

Updates parallel caches so that methods like n_elem() accurately reflect changes on other processors

Implements libMesh::MeshBase.

Definition at line 130 of file serial_mesh.h.

{}
virtual void libMesh::MeshBase::update_post_partitioning ( ) [inline, virtual, inherited]

Recalculate any cached data after elements and nodes have been repartitioned.

Reimplemented in libMesh::ParallelMesh.

Definition at line 543 of file mesh_base.h.

Referenced by libMesh::Partitioner::partition(), libMesh::MeshBase::partition(), and libMesh::Nemesis_IO::read().

{}
void libMesh::UnstructuredMesh::write ( const std::string &  name,
MeshData mesh_data = NULL 
) [virtual, inherited]

Write the file specified by name. Attempts to figure out the proper method by the file extension.

In order to write the UNV and TetGen file types, you must also pass a separate pointer to the MeshData object you have been using with this mesh, since these write methods expect it.

Implements libMesh::MeshBase.

Definition at line 524 of file unstructured_mesh.C.

References libMesh::START_LOG(), libMesh::NameBasedIO::write(), and libMesh::UNVIO::write().

{
  START_LOG("write()", "Mesh");

  if (mesh_data)
    {
      libmesh_deprecated();
      if (name.rfind(".unv") < name.size())
        UNVIO(*this, mesh_data).write (name);
      else
        libmesh_error_msg("Only UNV output supports MeshData");
    }

  NameBasedIO(*this).write(name);

  STOP_LOG("write()", "Mesh");
}
void libMesh::UnstructuredMesh::write ( const std::string &  name,
const std::vector< Number > &  values,
const std::vector< std::string > &  variable_names 
) [inherited]

Write to the file specified by name. Attempts to figure out the proper method by the file extension. Also writes data.

Definition at line 545 of file unstructured_mesh.C.

References libMesh::START_LOG(), and libMesh::NameBasedIO::write_nodal_data().

{
  START_LOG("write()", "Mesh");

  NameBasedIO(*this).write_nodal_data(name, v, vn);

  STOP_LOG("write()", "Mesh");
}

Friends And Related Function Documentation

friend class BoundaryInfo [friend, inherited]

Make the BoundaryInfo class a friend so that it can create and interact with BoundaryMesh.

Definition at line 983 of file mesh_base.h.

friend class MeshInput< MeshBase > [friend, inherited]

The MeshInput classes are friends so that they can set the number of partitions.

Definition at line 977 of file mesh_base.h.

std::ostream& operator<< ( std::ostream &  os,
const MeshBase m 
) [friend, inherited]

Equivalent to calling print_info() above, but now you can write: Mesh mesh; libMesh::out << mesh << std::endl;

Definition at line 354 of file mesh_base.C.

{
  m.print_info(os);
  return os;
}
friend class Partitioner [friend, inherited]

The partitioner class is a friend so that it can set the number of partitions.

Definition at line 971 of file mesh_base.h.


Member Data Documentation

std::map<subdomain_id_type, std::string> libMesh::MeshBase::_block_id_to_name [protected, inherited]

This structure maintains the mapping of named blocks for file formats that support named blocks. Currently this is only implemented for ExodusII

Definition at line 958 of file mesh_base.h.

Referenced by libMesh::MeshBase::get_id_by_name(), libMesh::MeshBase::get_subdomain_name_map(), libMesh::MeshBase::set_subdomain_name_map(), and libMesh::MeshBase::subdomain_name().

std::set<unsigned char> libMesh::MeshBase::_elem_dims [protected, inherited]

We cache the dimension of the elements present in the mesh. So, if we have a mesh with 1D and 2D elements, this structure will contain 1 and 2.

Definition at line 965 of file mesh_base.h.

Referenced by libMesh::MeshBase::cache_elem_dims(), libMesh::MeshBase::clear(), libMesh::UnstructuredMesh::copy_nodes_and_elements(), libMesh::MeshBase::elem_dimensions(), libMesh::MeshBase::mesh_dimension(), libMesh::MeshBase::MeshBase(), and libMesh::MeshBase::set_mesh_dimension().

std::vector<Elem*> libMesh::SerialMesh::_elements [protected]

The elements in the mesh.

Definition at line 424 of file serial_mesh.h.

Referenced by active_elements_begin(), active_elements_end(), active_local_elements_begin(), active_local_elements_end(), active_local_subdomain_elements_begin(), active_local_subdomain_elements_end(), active_not_local_elements_begin(), active_not_local_elements_end(), active_pid_elements_begin(), active_pid_elements_end(), active_subdomain_elements_begin(), active_subdomain_elements_end(), active_type_elements_begin(), active_type_elements_end(), add_elem(), ancestor_elements_begin(), ancestor_elements_end(), assign_unique_ids(), clear(), delete_elem(), elem(), elements_begin(), elements_end(), facelocal_elements_begin(), facelocal_elements_end(), fix_broken_node_and_element_numbering(), insert_elem(), level_elements_begin(), level_elements_end(), local_elements_begin(), local_elements_end(), local_level_elements_begin(), local_level_elements_end(), local_not_level_elements_begin(), local_not_level_elements_end(), max_elem_id(), n_elem(), not_active_elements_begin(), not_active_elements_end(), not_ancestor_elements_begin(), not_ancestor_elements_end(), not_level_elements_begin(), not_level_elements_end(), not_local_elements_begin(), not_local_elements_end(), not_subactive_elements_begin(), not_subactive_elements_end(), parallel_n_elem(), pid_elements_begin(), pid_elements_end(), query_elem(), renumber_elem(), renumber_nodes_and_elements(), reserve_elem(), semilocal_elements_begin(), semilocal_elements_end(), subactive_elements_begin(), subactive_elements_end(), type_elements_begin(), and type_elements_end().

unsigned int libMesh::MeshBase::_n_parts [protected, inherited]

The number of partitions the mesh has. This is set by the partitioners, and may not be changed directly by the user. **NOTE** The number of partitions *need not* equal this->n_processors(), consider for example the case where you simply want to partition a mesh on one processor and view the result in GMV.

Definition at line 910 of file mesh_base.h.

Referenced by libMesh::MeshBase::clear(), libMesh::UnstructuredMesh::copy_nodes_and_elements(), libMesh::MeshBase::n_partitions(), libMesh::MeshBase::recalculate_n_partitions(), and libMesh::MeshBase::set_n_partitions().

UniquePtr<Partitioner> libMesh::MeshBase::_partitioner [protected, inherited]

A partitioner to use at each prepare_for_use().

This will be built in the constructor of each derived class, but can be replaced by the user through the partitioner() accessor.

Definition at line 932 of file mesh_base.h.

Referenced by libMesh::MeshBase::MeshBase(), libMesh::ParallelMesh::ParallelMesh(), libMesh::MeshBase::partitioner(), and SerialMesh().

UniquePtr<PointLocatorBase> libMesh::MeshBase::_point_locator [mutable, protected, inherited]

A PointLocator class for this mesh. This will not actually be built unless needed. Further, since we want our point_locator() method to be const (yet do the dynamic allocating) this needs to be mutable. Since the PointLocatorBase::build() member is used, and it operates on a constant reference to the mesh, this is OK.

Definition at line 924 of file mesh_base.h.

Referenced by libMesh::MeshBase::clear_point_locator(), libMesh::MeshBase::point_locator(), and libMesh::MeshBase::sub_point_locator().

bool libMesh::MeshBase::_skip_partitioning [protected, inherited]

If this is true then no partitioning should be done.

Definition at line 944 of file mesh_base.h.

Referenced by libMesh::MeshBase::skip_partitioning().

If this is true then renumbering will be kept to a miniumum.

This is set when prepare_for_use() is called.

Definition at line 951 of file mesh_base.h.

Referenced by libMesh::MeshBase::allow_renumbering(), libMesh::MeshBase::prepare_for_use(), renumber_nodes_and_elements(), and libMesh::ParallelMesh::renumber_nodes_and_elements().

This class holds the boundary information. It can store nodes, edges, and faces with a corresponding id that facilitates setting boundary conditions.

Direct access to this class will be removed in future libMesh versions. Use the get_boundary_info() accessor instead.

Definition at line 882 of file mesh_base.h.

Referenced by libMesh::MeshBase::get_boundary_info().


The documentation for this class was generated from the following files: