Skip to content
Snippets Groups Projects
Unverified Commit 6f9d0ae4 authored by Dmitri Naumov's avatar Dmitri Naumov Committed by GitHub
Browse files

Merge pull request #2352 from endJunction/DontResetNodeElementIdsAlways

Don't reset node element ids always.
parents f456d872 cf4f2c96
No related branches found
No related tags found
No related merge requests found
...@@ -691,7 +691,7 @@ void FEFLOWMeshInterface::setMaterialIDs( ...@@ -691,7 +691,7 @@ void FEFLOWMeshInterface::setMaterialIDs(
for (std::size_t i = 0; i < vec_elements.size(); i++) for (std::size_t i = 0; i < vec_elements.size(); i++)
{ {
MeshLib::Element* e = vec_elements[i]; MeshLib::Element* e = vec_elements[i];
unsigned e_min_nodeID = std::numeric_limits<unsigned>::max(); std::size_t e_min_nodeID = std::numeric_limits<std::size_t>::max();
for (std::size_t j = 0; j < e->getNumberOfBaseNodes(); j++) for (std::size_t j = 0; j < e->getNumberOfBaseNodes(); j++)
e_min_nodeID = std::min(e_min_nodeID, e->getNodeIndex(j)); e_min_nodeID = std::min(e_min_nodeID, e->getNodeIndex(j));
std::size_t layer_id = e_min_nodeID / no_nodes_per_layer; std::size_t layer_id = e_min_nodeID / no_nodes_per_layer;
......
...@@ -161,7 +161,7 @@ void Element::setNode(unsigned idx, Node* node) ...@@ -161,7 +161,7 @@ void Element::setNode(unsigned idx, Node* node)
_nodes[idx] = node; _nodes[idx] = node;
} }
unsigned Element::getNodeIndex(unsigned i) const std::size_t Element::getNodeIndex(unsigned i) const
{ {
#ifndef NDEBUG #ifndef NDEBUG
if (i<getNumberOfNodes()) if (i<getNumberOfNodes())
...@@ -169,7 +169,7 @@ unsigned Element::getNodeIndex(unsigned i) const ...@@ -169,7 +169,7 @@ unsigned Element::getNodeIndex(unsigned i) const
return _nodes[i]->getID(); return _nodes[i]->getID();
#ifndef NDEBUG #ifndef NDEBUG
ERR("Error in MeshLib::Element::getNodeIndex() - Index does not exist."); ERR("Error in MeshLib::Element::getNodeIndex() - Index does not exist.");
return std::numeric_limits<unsigned>::max(); return std::numeric_limits<std::size_t>::max();
#endif #endif
} }
......
...@@ -120,7 +120,7 @@ public: ...@@ -120,7 +120,7 @@ public:
* @return the global index or std::numeric_limits<unsigned>::max() * @return the global index or std::numeric_limits<unsigned>::max()
* @sa Element::getNode() * @sa Element::getNode()
*/ */
unsigned getNodeIndex(unsigned i) const; std::size_t getNodeIndex(unsigned i) const;
/** /**
* Get the type of the mesh element in geometric context (as a MeshElemType-enum). * Get the type of the mesh element in geometric context (as a MeshElemType-enum).
......
...@@ -50,6 +50,10 @@ Mesh::Mesh(std::string name, ...@@ -50,6 +50,10 @@ Mesh::Mesh(std::string name,
assert(_n_base_nodes <= _nodes.size()); assert(_n_base_nodes <= _nodes.size());
this->resetNodeIDs(); this->resetNodeIDs();
this->resetElementIDs(); this->resetElementIDs();
if (_n_base_nodes == 0)
{
recalculateMaxBaseNodeId();
}
if ((_n_base_nodes == 0 && hasNonlinearElement()) || isNonlinear()) if ((_n_base_nodes == 0 && hasNonlinearElement()) || isNonlinear())
this->checkNonlinearNodeIDs(); this->checkNonlinearNodeIDs();
this->setDimension(); this->setDimension();
...@@ -119,18 +123,24 @@ void Mesh::addElement(Element* elem) ...@@ -119,18 +123,24 @@ void Mesh::addElement(Element* elem)
void Mesh::resetNodeIDs() void Mesh::resetNodeIDs()
{ {
const std::size_t nNodes (this->_nodes.size()); const std::size_t nNodes(_nodes.size());
for (unsigned i=0; i<nNodes; ++i) for (std::size_t i = 0; i < nNodes; ++i)
{
_nodes[i]->setID(i); _nodes[i]->setID(i);
}
}
if (_n_base_nodes==0) void Mesh::recalculateMaxBaseNodeId()
{
std::size_t max_basenode_ID = 0;
for (Element const* e : _elements)
{ {
unsigned max_basenode_ID = 0; for (std::size_t i = 0; i < e->getNumberOfBaseNodes(); i++)
for (Element const* e : _elements) {
for (unsigned i=0; i<e->getNumberOfBaseNodes(); i++) max_basenode_ID = std::max(max_basenode_ID, e->getNodeIndex(i));
max_basenode_ID = std::max(max_basenode_ID, e->getNodeIndex(i)); }
_n_base_nodes = max_basenode_ID + 1;
} }
_n_base_nodes = max_basenode_ID + 1;
} }
void Mesh::resetElementIDs() void Mesh::resetElementIDs()
......
...@@ -113,6 +113,9 @@ public: ...@@ -113,6 +113,9 @@ public:
/// Resets the IDs of all mesh-nodes to their position in the node vector /// Resets the IDs of all mesh-nodes to their position in the node vector
void resetNodeIDs(); void resetNodeIDs();
/// Finds the maximum id among all of the base nodes.
void recalculateMaxBaseNodeId();
/// Changes the name of the mesh. /// Changes the name of the mesh.
void setName(const std::string &name) { this->_name = name; } void setName(const std::string &name) { this->_name = name; }
......
...@@ -43,12 +43,13 @@ namespace detail ...@@ -43,12 +43,13 @@ namespace detail
{ {
template <class T_ELEMENT> template <class T_ELEMENT>
MeshLib::Element* createElementWithSameNodeOrder( MeshLib::Element* createElementWithSameNodeOrder(
const std::vector<MeshLib::Node*>& nodes, vtkIdList* const node_ids) const std::vector<MeshLib::Node*>& nodes, vtkIdList* const node_ids,
std::size_t const element_id)
{ {
auto** ele_nodes = new MeshLib::Node*[T_ELEMENT::n_all_nodes]; auto** ele_nodes = new MeshLib::Node*[T_ELEMENT::n_all_nodes];
for (unsigned k(0); k < T_ELEMENT::n_all_nodes; k++) for (unsigned k(0); k < T_ELEMENT::n_all_nodes; k++)
ele_nodes[k] = nodes[node_ids->GetId(k)]; ele_nodes[k] = nodes[node_ids->GetId(k)];
return new T_ELEMENT(ele_nodes); return new T_ELEMENT(ele_nodes, element_id);
} }
} // namespace detail } // namespace detail
...@@ -65,7 +66,7 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid( ...@@ -65,7 +66,7 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(
for (std::size_t i = 0; i < nNodes; i++) for (std::size_t i = 0; i < nNodes; i++)
{ {
coords = grid->GetPoints()->GetPoint(i); coords = grid->GetPoints()->GetPoint(i);
nodes[i] = new MeshLib::Node(coords[0], coords[1], coords[2]); nodes[i] = new MeshLib::Node(coords[0], coords[1], coords[2], i);
} }
// set mesh elements // set mesh elements
...@@ -83,25 +84,25 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid( ...@@ -83,25 +84,25 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(
case VTK_VERTEX: case VTK_VERTEX:
{ {
elem = detail::createElementWithSameNodeOrder<MeshLib::Point>( elem = detail::createElementWithSameNodeOrder<MeshLib::Point>(
nodes, node_ids); nodes, node_ids, i);
break; break;
} }
case VTK_LINE: case VTK_LINE:
{ {
elem = detail::createElementWithSameNodeOrder<MeshLib::Line>( elem = detail::createElementWithSameNodeOrder<MeshLib::Line>(
nodes, node_ids); nodes, node_ids, i);
break; break;
} }
case VTK_TRIANGLE: case VTK_TRIANGLE:
{ {
elem = detail::createElementWithSameNodeOrder<MeshLib::Tri>( elem = detail::createElementWithSameNodeOrder<MeshLib::Tri>(
nodes, node_ids); nodes, node_ids, i);
break; break;
} }
case VTK_QUAD: case VTK_QUAD:
{ {
elem = detail::createElementWithSameNodeOrder<MeshLib::Quad>( elem = detail::createElementWithSameNodeOrder<MeshLib::Quad>(
nodes, node_ids); nodes, node_ids, i);
break; break;
} }
case VTK_PIXEL: case VTK_PIXEL:
...@@ -111,19 +112,19 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid( ...@@ -111,19 +112,19 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(
quad_nodes[1] = nodes[node_ids->GetId(1)]; quad_nodes[1] = nodes[node_ids->GetId(1)];
quad_nodes[2] = nodes[node_ids->GetId(3)]; quad_nodes[2] = nodes[node_ids->GetId(3)];
quad_nodes[3] = nodes[node_ids->GetId(2)]; quad_nodes[3] = nodes[node_ids->GetId(2)];
elem = new MeshLib::Quad(quad_nodes); elem = new MeshLib::Quad(quad_nodes, i);
break; break;
} }
case VTK_TETRA: case VTK_TETRA:
{ {
elem = detail::createElementWithSameNodeOrder<MeshLib::Tet>( elem = detail::createElementWithSameNodeOrder<MeshLib::Tet>(
nodes, node_ids); nodes, node_ids, i);
break; break;
} }
case VTK_HEXAHEDRON: case VTK_HEXAHEDRON:
{ {
elem = detail::createElementWithSameNodeOrder<MeshLib::Hex>( elem = detail::createElementWithSameNodeOrder<MeshLib::Hex>(
nodes, node_ids); nodes, node_ids, i);
break; break;
} }
case VTK_VOXEL: case VTK_VOXEL:
...@@ -137,13 +138,13 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid( ...@@ -137,13 +138,13 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(
voxel_nodes[5] = nodes[node_ids->GetId(5)]; voxel_nodes[5] = nodes[node_ids->GetId(5)];
voxel_nodes[6] = nodes[node_ids->GetId(7)]; voxel_nodes[6] = nodes[node_ids->GetId(7)];
voxel_nodes[7] = nodes[node_ids->GetId(6)]; voxel_nodes[7] = nodes[node_ids->GetId(6)];
elem = new MeshLib::Hex(voxel_nodes); elem = new MeshLib::Hex(voxel_nodes, i);
break; break;
} }
case VTK_PYRAMID: case VTK_PYRAMID:
{ {
elem = detail::createElementWithSameNodeOrder<MeshLib::Pyramid>( elem = detail::createElementWithSameNodeOrder<MeshLib::Pyramid>(
nodes, node_ids); nodes, node_ids, i);
break; break;
} }
case VTK_WEDGE: case VTK_WEDGE:
...@@ -154,50 +155,50 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid( ...@@ -154,50 +155,50 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(
prism_nodes[i] = nodes[node_ids->GetId(i + 3)]; prism_nodes[i] = nodes[node_ids->GetId(i + 3)];
prism_nodes[i + 3] = nodes[node_ids->GetId(i)]; prism_nodes[i + 3] = nodes[node_ids->GetId(i)];
} }
elem = new MeshLib::Prism(prism_nodes); elem = new MeshLib::Prism(prism_nodes, i);
break; break;
} }
case VTK_QUADRATIC_EDGE: case VTK_QUADRATIC_EDGE:
{ {
elem = detail::createElementWithSameNodeOrder<MeshLib::Line3>( elem = detail::createElementWithSameNodeOrder<MeshLib::Line3>(
nodes, node_ids); nodes, node_ids, i);
break; break;
} }
case VTK_QUADRATIC_TRIANGLE: case VTK_QUADRATIC_TRIANGLE:
{ {
elem = detail::createElementWithSameNodeOrder<MeshLib::Tri6>( elem = detail::createElementWithSameNodeOrder<MeshLib::Tri6>(
nodes, node_ids); nodes, node_ids, i);
break; break;
} }
case VTK_QUADRATIC_QUAD: case VTK_QUADRATIC_QUAD:
{ {
elem = detail::createElementWithSameNodeOrder<MeshLib::Quad8>( elem = detail::createElementWithSameNodeOrder<MeshLib::Quad8>(
nodes, node_ids); nodes, node_ids, i);
break; break;
} }
case VTK_BIQUADRATIC_QUAD: case VTK_BIQUADRATIC_QUAD:
{ {
elem = detail::createElementWithSameNodeOrder<MeshLib::Quad9>( elem = detail::createElementWithSameNodeOrder<MeshLib::Quad9>(
nodes, node_ids); nodes, node_ids, i);
break; break;
} }
case VTK_QUADRATIC_TETRA: case VTK_QUADRATIC_TETRA:
{ {
elem = detail::createElementWithSameNodeOrder<MeshLib::Tet10>( elem = detail::createElementWithSameNodeOrder<MeshLib::Tet10>(
nodes, node_ids); nodes, node_ids, i);
break; break;
} }
case VTK_QUADRATIC_HEXAHEDRON: case VTK_QUADRATIC_HEXAHEDRON:
{ {
elem = detail::createElementWithSameNodeOrder<MeshLib::Hex20>( elem = detail::createElementWithSameNodeOrder<MeshLib::Hex20>(
nodes, node_ids); nodes, node_ids, i);
break; break;
} }
case VTK_QUADRATIC_PYRAMID: case VTK_QUADRATIC_PYRAMID:
{ {
elem = elem =
detail::createElementWithSameNodeOrder<MeshLib::Pyramid13>( detail::createElementWithSameNodeOrder<MeshLib::Pyramid13>(
nodes, node_ids); nodes, node_ids, i);
break; break;
} }
case VTK_QUADRATIC_WEDGE: case VTK_QUADRATIC_WEDGE:
...@@ -215,7 +216,7 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid( ...@@ -215,7 +216,7 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(
prism_nodes[11] = nodes[node_ids->GetId(13)]; prism_nodes[11] = nodes[node_ids->GetId(13)];
for (unsigned i = 0; i < 3; ++i) for (unsigned i = 0; i < 3; ++i)
prism_nodes[12 + i] = nodes[node_ids->GetId(11 - i)]; prism_nodes[12 + i] = nodes[node_ids->GetId(11 - i)];
elem = new MeshLib::Prism15(prism_nodes); elem = new MeshLib::Prism15(prism_nodes, i);
break; break;
} }
default: default:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment