Newer
Older
* Copyright (c) 2012, OpenGeoSys Community (http://www.opengeosys.com)
* Distributed under a Modified BSD License.
* See accompanying file LICENSE.txt or
* http://www.opengeosys.com/LICENSE.txt
*/
#include "Mesh.h"
#include "Node.h"
#include "Elements/Tri.h"
#include "Elements/Quad.h"
#include "Elements/Tet.h"
#include "Elements/Hex.h"
#include "Elements/Pyramid.h"
#include "Elements/Prism.h"
namespace MeshLib {
Mesh::Mesh(const std::string &name, const std::vector<Node*> &nodes, const std::vector<Element*> &elements)
: _name(name), _nodes(nodes), _elements(elements)
{
_edge_length[0] = 0;
_edge_length[1] = 0;
Karsten Rink
committed
this->makeNodesUnique();
this->setElementInformationForNodes();
this->setNeighborInformationForElements();
}
Mesh::Mesh(const Mesh &mesh)
: _name(mesh.getName()), _nodes(mesh.getNodes()), _elements(mesh.getElements())
{
Karsten Rink
committed
this->setElementInformationForNodes();
this->setNeighborInformationForElements();
}
Mesh::~Mesh()
{
const size_t nElements (_elements.size());
for (size_t i=0; i<nElements; i++)
delete _elements[i];
const size_t nNodes (_nodes.size());
for (size_t i=0; i<nNodes; i++)
delete _nodes[i];
}
Karsten Rink
committed
void Mesh::makeNodesUnique()
{
//check for unique mesh nodes
Karsten Rink
committed
//PointVec::makePntsUnique
Karsten Rink
committed
//replace node pointers in elements
unsigned nElements (_elements.size());
for (unsigned i=0; i<nElements; i++)
{
unsigned nNodes (_elements[i]->getNNodes());
for (unsigned j=0; j<nNodes; j++)
_elements[i]->getNodeIndex(j);
}
//set correct id for each node
void Mesh::addNode(Node* node)
{
}
{
// add element informatin to nodes
Karsten Rink
committed
unsigned nNodes (elem->getNNodes());
for (unsigned i=0; i<nNodes; i++)
elem->_nodes[i]->addElement(elem);
}
Karsten Rink
committed
void Mesh::setElementInformationForNodes()
{
const size_t nElements (_elements.size());
for (unsigned i=0; i<nElements; i++)
{
const unsigned nNodes (_elements[i]->getNNodes());
for (unsigned j=0; j<nNodes; j++)
_elements[i]->_nodes[j]->addElement(_elements[i]);
}
}
void Mesh::setEdgeLengthRange(const double &min_length, const double &max_length)
{
if (min_length <= max_length)
{
_edge_length[0] = min_length;
_edge_length[1] = max_length;
}
else
std::cerr << "Error in MeshLib::Mesh::setEdgeLengthRange() - min length < max length." << std::endl;
Karsten Rink
committed
void Mesh::setNeighborInformationForElements()
{
Karsten Rink
committed
const size_t nElements = _elements.size();
for (unsigned m(0); m<nElements; m++)
Karsten Rink
committed
{
Karsten Rink
committed
// create vector with all elements connected to current element (includes lots of doubles!)
std::vector<Element*> neighbors;
const size_t nNodes (_elements[m]->getNNodes());
for (unsigned n(0); n<nNodes; n++)
Karsten Rink
committed
{
Karsten Rink
committed
const std::vector<Element*> conn_elems (_elements[m]->getNode(n)->getElements());
neighbors.insert(neighbors.end(), conn_elems.begin(), conn_elems.end());
Karsten Rink
committed
}
Karsten Rink
committed
const unsigned nNeighbors ( neighbors.size() );
/*std::vector<bool> done (nNeighbors, false);
// mark off the element itself
for (unsigned j(0); j<nNeighbors; j++)
if (neighbors[j] == _elements[m])
done[j] = true;
*/
// check if connected element is indeed a neighbour and mark all doubles of that element as 'done'
for (unsigned i(0); i<nNeighbors; i++)
//if (!done[i])
{
if (_elements[m]->addNeighbor(neighbors[i]))
{
neighbors[i]->addNeighbor(_elements[m]);
}/*
for (unsigned j(0); j<nNeighbors; j++)
if (!done[j] && (neighbors[j] == neighbors[i]))
done[j] = true;
*/
}
Karsten Rink
committed
}
}