Loading...
Searching...
No Matches
MeshEntityIteratorBase.h
// Copyright (C) 2012 Garth N. Wells
//
// This file is part of DOLFIN.
//
// DOLFIN is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// DOLFIN is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with DOLFIN. If not, see <http://www.gnu.org/licenses/>.
//
// Modified by Andre Massing 2009
//
// First added: 2006-05-09
// Last changed: 2014-07-02
#ifndef __MESH_ENTITY_ITERATOR_BASE_H
#define __MESH_ENTITY_ITERATOR_BASE_H
#include <cstddef>
#include "Mesh.h"
#include "MeshEntity.h"
namespace dolfin
{
template<class T>
class MeshEntityIteratorBase
{
public:
explicit MeshEntityIteratorBase(const Mesh& mesh)
: _entity(mesh, 0), _pos(0), pos_end(0), index(0)
{
// Check if mesh is empty
if (mesh.num_vertices() == 0)
return;
// Get number of entities (excluding ghosts)
const std::size_t dim = _entity.dim();
mesh.init(dim);
// End at ghost cells for normal iterator
pos_end = mesh.topology().ghost_offset(dim);
}
MeshEntityIteratorBase(const Mesh& mesh, std::string opt)
: _entity(mesh, 0), _pos(0), pos_end(0), index(0)
{
// Check if mesh is empty
if (mesh.num_vertices() == 0)
return;
const std::size_t dim = _entity.dim();
mesh.init(dim);
pos_end = mesh.topology().size(dim);
if (opt == "regular")
pos_end = mesh.topology().ghost_offset(dim);
else if (opt == "ghost")
_pos = mesh.topology().ghost_offset(dim);
else if (opt != "all")
dolfin_error("MeshEntityIterator.h",
"initialize MeshEntityIterator",
"unknown opt=\"%s\", choose from "
"opt=[\"regular\", \"ghost\", \"all\"]", opt.c_str());
}
explicit MeshEntityIteratorBase(const MeshEntity& entity)
: _entity(entity.mesh(), 0), _pos(0), index(0)
{
// Get connectivity
const MeshConnectivity& c = entity.mesh().topology()(entity.dim(), _entity.dim());
// Compute connectivity if empty
if (c.empty())
entity.mesh().init(entity.dim(), _entity.dim());
// Get size and index map
if (c.empty())
{
pos_end = 0;
index = 0;
}
else
{
pos_end = c.size(entity.index());
index = c(entity.index());
}
}
MeshEntityIteratorBase(const MeshEntityIteratorBase& it)
: _entity(it._entity), _pos(it._pos), pos_end(it.pos_end), index(it.index) {}
~MeshEntityIteratorBase() {}
MeshEntityIteratorBase& operator++()
{
++_pos;
return *this;
}
MeshEntityIteratorBase& operator--()
{
--_pos;
return *this;
}
std::size_t pos() const
{ return _pos; }
bool operator==(const MeshEntityIteratorBase & it) const
{
// Use const_cast to use operator* inside comparison, which automatically
// updates the entity index corresponding to pos *before* comparison (since
// update of entity delays until request for entity)
return ((const_cast<MeshEntityIteratorBase<T> *>(this))->operator*()
== (const_cast<MeshEntityIteratorBase<T> *>(&it))->operator*()
&& _pos == it._pos && index == it.index);
}
bool operator!=(const MeshEntityIteratorBase & it) const
{ return !operator==(it); }
T& operator*()
{ return *operator->(); }
T* operator->()
{ _entity._local_index = (index ? index[_pos] : _pos); return &_entity; }
bool end() const
{ return _pos >= pos_end; }
MeshEntityIteratorBase end_iterator()
{
MeshEntityIteratorBase sg(*this);
sg.set_end();
return sg;
}
// Note: Not a subclass of Variable for efficiency!
// Commented out to avoid warning about shadowing str() for MeshEntity
// Return informal string representation (pretty-print)
// std::string str(bool verbose) const;
private:
void set_end()
{ _pos = pos_end; }
// Mesh entity
T _entity;
// Current position
std::size_t _pos;
// End position
std::size_t pos_end;
// Mapping from pos to index (if any)
const unsigned int* index;
};
}
#endif
dolfin::MeshConnectivity
Definition MeshConnectivity.h:42
dolfin::MeshConnectivity::empty
bool empty() const
Return true if the total number of connections is equal to zero.
Definition MeshConnectivity.h:58
dolfin::MeshEntityIteratorBase::MeshEntityIteratorBase
MeshEntityIteratorBase(const MeshEntityIteratorBase &it)
Copy constructor.
Definition MeshEntityIteratorBase.h:105
dolfin::MeshEntityIteratorBase::~MeshEntityIteratorBase
~MeshEntityIteratorBase()
Destructor.
Definition MeshEntityIteratorBase.h:109
dolfin::MeshEntityIteratorBase::pos
std::size_t pos() const
Return current position.
Definition MeshEntityIteratorBase.h:126
dolfin::MeshEntityIteratorBase::operator!=
bool operator!=(const MeshEntityIteratorBase &it) const
Comparison operator.
Definition MeshEntityIteratorBase.h:142
dolfin::MeshEntityIteratorBase::MeshEntityIteratorBase
MeshEntityIteratorBase(const MeshEntity &entity)
Create iterator for entities of given dimension connected to given entity.
Definition MeshEntityIteratorBase.h:81
dolfin::MeshEntityIteratorBase::operator*
T & operator*()
Dereference operator.
Definition MeshEntityIteratorBase.h:146
dolfin::MeshEntityIteratorBase::operator->
T * operator->()
Member access operator.
Definition MeshEntityIteratorBase.h:150
dolfin::MeshEntityIteratorBase::operator==
bool operator==(const MeshEntityIteratorBase &it) const
Comparison operator.
Definition MeshEntityIteratorBase.h:130
dolfin::MeshEntityIteratorBase::MeshEntityIteratorBase
MeshEntityIteratorBase(const Mesh &mesh, std::string opt)
Definition MeshEntityIteratorBase.h:58
dolfin::MeshEntityIteratorBase::MeshEntityIteratorBase
MeshEntityIteratorBase(const Mesh &mesh)
Create iterator for mesh entities over given topological dimension.
Definition MeshEntityIteratorBase.h:41
dolfin::MeshEntityIteratorBase::end_iterator
MeshEntityIteratorBase end_iterator()
Definition MeshEntityIteratorBase.h:161
dolfin::MeshEntityIteratorBase::end
bool end() const
Check if iterator has reached the end.
Definition MeshEntityIteratorBase.h:154
dolfin::MeshEntityIteratorBase::operator++
MeshEntityIteratorBase & operator++()
Step to next mesh entity (prefix increment).
Definition MeshEntityIteratorBase.h:112
dolfin::MeshEntityIteratorBase::operator--
MeshEntityIteratorBase & operator--()
Step to the previous mesh entity (prefix decrease).
Definition MeshEntityIteratorBase.h:119
dolfin::MeshEntity
Definition MeshEntity.h:43
dolfin::MeshEntity::mesh
const Mesh & mesh() const
Definition MeshEntity.h:99
dolfin::MeshEntity::dim
std::size_t dim() const
Definition MeshEntity.h:106
dolfin::MeshTopology::size
std::size_t size(std::size_t dim) const
Return number of entities for given dimension.
Definition MeshTopology.cpp:79
dolfin::MeshTopology::ghost_offset
std::size_t ghost_offset(std::size_t dim) const
Definition MeshTopology.cpp:97
dolfin::Mesh
Definition Mesh.h:84
dolfin::Mesh::init
std::size_t init(std::size_t dim) const
Definition Mesh.cpp:139
dolfin::Mesh::topology
MeshTopology & topology()
Definition Mesh.h:220
dolfin::Mesh::num_vertices
std::size_t num_vertices() const
Definition Mesh.h:135
dolfin
Definition adapt.h:30
dolfin::dolfin_error
void dolfin_error(std::string location, std::string task, std::string reason,...)
Definition log.cpp:129