diff --git a/MeshLib/Elements/Cell.cpp b/MeshLib/Elements/Cell.cpp index 87438c4ee49ac61c3b3d21e1dc3b15134747eb76..307bc9be0ebee9e3b2f35d55b8ae400e8bf74650 100644 --- a/MeshLib/Elements/Cell.cpp +++ b/MeshLib/Elements/Cell.cpp @@ -8,12 +8,12 @@ #include "Cell.h" namespace MeshLib { - +/* Cell::Cell(Node** nodes, MshElemType::type type, size_t value) : Element(nodes, type, value) { } - +*/ Cell::Cell(MshElemType::type type, size_t value) : Element(type, value) { diff --git a/MeshLib/Elements/Cell.h b/MeshLib/Elements/Cell.h index 55f19d91b366c1f231aa1c7548fa2bcae046bf56..81f434cb88515de49688f23e8e7851d0d2755bc6 100644 --- a/MeshLib/Elements/Cell.h +++ b/MeshLib/Elements/Cell.h @@ -28,9 +28,10 @@ public: virtual ~Cell(); protected: +/* /// Constructor for a generic mesh element containing an array of mesh nodes. Cell(Node** nodes, MshElemType::type type, size_t value = 0); - +*/ /// Constructor for a generic mesh element without an array of mesh nodes. Cell(MshElemType::type type, size_t value = 0); diff --git a/MeshLib/Elements/Edge.cpp b/MeshLib/Elements/Edge.cpp index d257c8c45af25b2d6923c077dc1cdddfe5ff7ca8..836f3eb36278b8ebcfe7029df4c698ee1f58e102 100644 --- a/MeshLib/Elements/Edge.cpp +++ b/MeshLib/Elements/Edge.cpp @@ -13,16 +13,18 @@ namespace MeshLib { Edge::Edge(Node* nodes[2], size_t value) - : Element(nodes, MshElemType::LINE, value) + : Element(MshElemType::LINE, value) { + _nodes = nodes; this->_length = this->calcLength(); } Edge::Edge(Node* n0, Node* n1, size_t value) : Element(MshElemType::LINE, value) { - Node* nodes[2] = { n0, n1 }; - _nodes = nodes; + _nodes = new Node*[2]; + _nodes[0] = n0; + _nodes[1] = n1; this->_length = this->calcLength(); } @@ -30,8 +32,9 @@ Edge::Edge(Node* n0, Node* n1, size_t value) Edge::Edge(const Edge &edge) : Element(MshElemType::LINE, edge.getValue()) { - Node* nodes[2] = { new Node(*edge.getNode(0)), new Node(*edge.getNode(1)) }; - _nodes = nodes; + _nodes = new Node*[2]; + _nodes[0] = edge._nodes[0]; + _nodes[1] = edge._nodes[1]; _length = edge.getLength(); } diff --git a/MeshLib/Elements/Element.cpp b/MeshLib/Elements/Element.cpp index 66cb6195a038d9119bd45e7d48d85666143ff8fe..6f21f44c46a18ea209c244e1fadb6a7bc34d1e65 100644 --- a/MeshLib/Elements/Element.cpp +++ b/MeshLib/Elements/Element.cpp @@ -12,13 +12,14 @@ namespace MeshLib { +/* Element::Element(Node** nodes, MshElemType::type type, size_t value) : _nodes(nodes), _type(type), _value(value) { } - +*/ Element::Element(MshElemType::type type, size_t value) - : _type(type), _value(value) + : _nodes(NULL), _type(type), _value(value) { } diff --git a/MeshLib/Elements/Element.h b/MeshLib/Elements/Element.h index e84058b12552fb2c6fc7ad294033b2df498d87ff..f611738f44e4bcf82f0eb99fdaf0728ffb9f9443 100644 --- a/MeshLib/Elements/Element.h +++ b/MeshLib/Elements/Element.h @@ -47,9 +47,10 @@ public: virtual ~Element(); protected: +/* /// Constructor for a generic mesh element containing an array of mesh nodes. Element(Node** nodes, MshElemType::type type, size_t value = 0); - +*/ /// Constructor for a generic mesh element without an array of mesh nodes. Element(MshElemType::type type, size_t value = 0); @@ -59,9 +60,9 @@ protected: */ Node* getNode(size_t i); + Node** _nodes; MshElemType::type _type; size_t _value; - Node** _nodes; std::vector<Element*> _neighbors; private: diff --git a/MeshLib/Elements/Face.cpp b/MeshLib/Elements/Face.cpp index 0e4836a2c586661ee29adbfdec2a8716fb36054d..9692e245b37499ecac3f85079f230d88b8a58ef5 100644 --- a/MeshLib/Elements/Face.cpp +++ b/MeshLib/Elements/Face.cpp @@ -8,12 +8,12 @@ #include "Face.h" namespace MeshLib { - +/* Face::Face(Node** nodes, MshElemType::type type, size_t value) : Element(nodes, type, value) { } - +*/ Face::Face(MshElemType::type type, size_t value) : Element(type, value) { diff --git a/MeshLib/Elements/Face.h b/MeshLib/Elements/Face.h index 0fef6c30f8185ce1dfa468644881de995492f8d5..489acacf6e19f372ca181a3d43adb52612f95324 100644 --- a/MeshLib/Elements/Face.h +++ b/MeshLib/Elements/Face.h @@ -28,9 +28,10 @@ public: virtual ~Face(); protected: +/* /// Constructor for a generic mesh element containing an array of mesh nodes. Face(Node** nodes, MshElemType::type type, size_t value = 0); - +*/ /// Constructor for a generic mesh element without an array of mesh nodes. Face(MshElemType::type type, size_t value = 0); diff --git a/MeshLib/Elements/FemElem.h b/MeshLib/Elements/FemElem.h index 109048929ed52ce87999c72e326a81d8cf65ea1b..8d7127b2ea82ce84040aaf158eccc8b966f71d5b 100644 --- a/MeshLib/Elements/FemElem.h +++ b/MeshLib/Elements/FemElem.h @@ -22,7 +22,7 @@ public: virtual ~FemElem(); /// Get the number of nodes for this element. - const GEOLIB::Point getCentreOfGravity() const { return _centre_of_gravity; }; + const GEOLIB::Point& getCentreOfGravity() const { return _centre_of_gravity; }; protected: /// Constructor. @@ -32,7 +32,7 @@ protected: FemElem(const FemElem &elem); /// Calculate centre of gravity - virtual GEOLIB::Point calcCoG() = 0; + virtual void calcCoG() = 0; GEOLIB::Point _centre_of_gravity; diff --git a/MeshLib/Elements/Hex.cpp b/MeshLib/Elements/Hex.cpp index 2a001f6b1a8d2999ed2b06095d7860687c4f1480..c4bdbcfd870c9652bee8be2c9456d6c27bcd8dba 100644 --- a/MeshLib/Elements/Hex.cpp +++ b/MeshLib/Elements/Hex.cpp @@ -14,17 +14,18 @@ namespace MeshLib { Hex::Hex(Node* nodes[8], size_t value) - : Cell(nodes, MshElemType::HEXAHEDRON, value) + : Cell(MshElemType::HEXAHEDRON, value) { + _nodes = nodes; this->_volume = this->calcVolume(); } Hex::Hex(const Hex &hex) : Cell(MshElemType::HEXAHEDRON, hex.getValue()) { - Node* nodes[8] = { new Node(*hex.getNode(0)), new Node(*hex.getNode(1)), new Node(*hex.getNode(2)), new Node(*hex.getNode(3)), - new Node(*hex.getNode(4)), new Node(*hex.getNode(5)), new Node(*hex.getNode(6)), new Node(*hex.getNode(7)) }; - _nodes = nodes; + _nodes = new Node*[8]; + for (size_t i=0; i<8; i++) + _nodes[i] = hex._nodes[i]; _volume = hex.getVolume(); } diff --git a/MeshLib/Elements/Prism.cpp b/MeshLib/Elements/Prism.cpp index da4f51e200b05152034d00d41c144540496a40c8..ebcc2dfc49c55c824130a02aacdda45b3caf7825 100644 --- a/MeshLib/Elements/Prism.cpp +++ b/MeshLib/Elements/Prism.cpp @@ -13,16 +13,22 @@ namespace MeshLib { Prism::Prism(Node* nodes[6], size_t value) - : Cell(nodes, MshElemType::PRISM, value) + : Cell(MshElemType::PRISM, value) { + _nodes = _nodes; this->_volume = this->calcVolume(); } Prism::Prism(Node* n0, Node* n1, Node* n2, Node* n3, Node* n4, Node* n5, size_t value) : Cell(MshElemType::PRISM, value) { - Node* nodes[6] = { n0, n1, n2, n3, n4, n5 }; - _nodes = nodes; + _nodes = new Node*[6]; + _nodes[0] = n0; + _nodes[1] = n1; + _nodes[2] = n2; + _nodes[3] = n3; + _nodes[4] = n4; + _nodes[5] = n5; this->_volume = this->calcVolume(); } @@ -30,9 +36,9 @@ Prism::Prism(Node* n0, Node* n1, Node* n2, Node* n3, Node* n4, Node* n5, size_t Prism::Prism(const Prism &prism) : Cell(MshElemType::PRISM, prism.getValue()) { - Node* nodes[6] = { new Node(*prism.getNode(0)), new Node(*prism.getNode(1)), new Node(*prism.getNode(2)), - new Node(*prism.getNode(3)), new Node(*prism.getNode(4)), new Node(*prism.getNode(5)) }; - _nodes = nodes; + _nodes = new Node*[6]; + for (size_t i=0; i<6; i++) + _nodes[i] = prism._nodes[i]; _volume = prism.getVolume(); } diff --git a/MeshLib/Elements/Pyramid.cpp b/MeshLib/Elements/Pyramid.cpp index 0a0f1f963e8c663dfa90c0e551e7d3a7f4689190..ac19c7ab39f3083b8cb4920d7604933e400149a3 100644 --- a/MeshLib/Elements/Pyramid.cpp +++ b/MeshLib/Elements/Pyramid.cpp @@ -13,27 +13,32 @@ namespace MeshLib { Pyramid::Pyramid(Node* nodes[5], size_t value) - : Cell(nodes, MshElemType::PYRAMID, value) + : Cell(MshElemType::PYRAMID, value) { + _nodes = nodes; this->_volume = this->calcVolume(); } Pyramid::Pyramid(Node* n0, Node* n1, Node* n2, Node* n3, Node* n4, size_t value) : Cell(MshElemType::PYRAMID, value) { - Node* nodes[5] = { n0, n1, n2, n3, n4 }; - _nodes = nodes; + _nodes = new Node*[5]; + _nodes[0] = n0; + _nodes[1] = n1; + _nodes[2] = n2; + _nodes[3] = n3; + _nodes[4] = n4; this->_volume = this->calcVolume(); } -Pyramid::Pyramid(const Pyramid &prism) - : Cell(MshElemType::PYRAMID, prism.getValue()) +Pyramid::Pyramid(const Pyramid &pyramid) + : Cell(MshElemType::PYRAMID, pyramid.getValue()) { - Node* nodes[5] = { new Node(*prism.getNode(0)), new Node(*prism.getNode(1)), new Node(*prism.getNode(2)), - new Node(*prism.getNode(3)), new Node(*prism.getNode(4)) }; - _nodes = nodes; - _volume = prism.getVolume(); + _nodes = new Node*[5]; + for (size_t i=0; i<5; i++) + _nodes[i] = pyramid._nodes[i]; + _volume = pyramid.getVolume(); } Pyramid::~Pyramid() diff --git a/MeshLib/Elements/Quad.cpp b/MeshLib/Elements/Quad.cpp index fa037c9f56b205016f1fc36c4616081b8bb58079..99d99e1bbf258800acc2e1ee6cc8f11ca25f716a 100644 --- a/MeshLib/Elements/Quad.cpp +++ b/MeshLib/Elements/Quad.cpp @@ -13,16 +13,20 @@ namespace MeshLib { Quad::Quad(Node* nodes[4], size_t value) - : Face(nodes, MshElemType::TRIANGLE, value) + : Face(MshElemType::TRIANGLE, value) { + _nodes = nodes; this->_area = this->calcArea(); } Quad::Quad(Node* n0, Node* n1, Node* n2, Node* n3, size_t value) : Face(MshElemType::TRIANGLE, value) { - Node* nodes[4] = { n0, n1, n2, n3 }; - _nodes = nodes; + _nodes = new Node*[4]; + _nodes[0] = n0; + _nodes[1] = n1; + _nodes[2] = n2; + _nodes[3] = n3; this->_area = this->calcArea(); } @@ -30,8 +34,9 @@ Quad::Quad(Node* n0, Node* n1, Node* n2, Node* n3, size_t value) Quad::Quad(const Quad &quad) : Face(MshElemType::QUAD, quad.getValue()) { - Node* nodes[4] = { new Node(*quad.getNode(0)), new Node(*quad.getNode(1)), new Node(*quad.getNode(2)), new Node(*quad.getNode(3)) }; - _nodes = nodes; + _nodes = new Node*[4]; + for (size_t i=0; i<4; i++) + _nodes[i] = quad._nodes[i]; _area = quad.getArea(); } diff --git a/MeshLib/Elements/Tet.cpp b/MeshLib/Elements/Tet.cpp index 901444d373d63580ec81cb16a312945587daaad8..9bf8caa0ebff996420b98202b2979319c655440a 100644 --- a/MeshLib/Elements/Tet.cpp +++ b/MeshLib/Elements/Tet.cpp @@ -13,16 +13,20 @@ namespace MeshLib { Tet::Tet(Node* nodes[4], size_t value) - : Cell(nodes, MshElemType::TETRAHEDRON, value) + : Cell(MshElemType::TETRAHEDRON, value) { + _nodes = nodes; this->_volume = this->calcVolume(); } Tet::Tet(Node* n0, Node* n1, Node* n2, Node* n3, size_t value) : Cell(MshElemType::TETRAHEDRON, value) { - Node* nodes[4] = { n0, n1, n2, n3 }; - _nodes = nodes; + _nodes = new Node*[4]; + _nodes[0] = n0; + _nodes[1] = n1; + _nodes[2] = n2; + _nodes[3] = n3; this->_volume = this->calcVolume(); } @@ -35,8 +39,9 @@ Tet::Tet(size_t value) Tet::Tet(const Tet &tet) : Cell(MshElemType::TETRAHEDRON, tet.getValue()) { - Node* nodes[4] = { new Node(*tet.getNode(0)), new Node(*tet.getNode(1)), new Node(*tet.getNode(2)), new Node(*tet.getNode(3)) }; - _nodes = nodes; + _nodes = new Node*[4]; + for (size_t i=0; i<4; i++) + _nodes[i] = tet._nodes[i]; _volume = tet.getVolume(); } diff --git a/MeshLib/Elements/Tet10.cpp b/MeshLib/Elements/Tet10.cpp index 93881abac93872dfab6ec4478c525688436a522f..15c0abb5230392893e0eca396cc21348a13bfaec 100644 --- a/MeshLib/Elements/Tet10.cpp +++ b/MeshLib/Elements/Tet10.cpp @@ -15,27 +15,32 @@ Tet10::Tet10(Node* nodes[10], size_t value) { _nodes = nodes; this->_volume = this->calcVolume(); - _centre_of_gravity = this->calcCoG(); + this->calcCoG(); } Tet10::Tet10(const Tet &tet) : Tet(tet.getValue()), FemElem() { - Node* nodes[10]; //= { n0, n1, n2, n3 }; - //TODO: Calculate additional nodes! - _nodes = nodes; + _nodes = new Node*[10]; + size_t nNodes (tet.getNNodes()); + for (size_t i=0; i<nNodes; i++) + _nodes[i] = const_cast<Node*>(tet.getNode(i)); + + if (nNodes < this->getNNodes()) + { + //TODO: Calculate additional nodes! + } + this->_volume = this->calcVolume(); - _centre_of_gravity = this->calcCoG(); + this->calcCoG(); } Tet10::Tet10(const Tet10 &tet) : Tet(tet.getValue()), FemElem() { - Node* nodes[10] = { new Node(*tet.getNode(0)), new Node(*tet.getNode(1)), new Node(*tet.getNode(2)), - new Node(*tet.getNode(3)), new Node(*tet.getNode(4)), new Node(*tet.getNode(5)), - new Node(*tet.getNode(6)), new Node(*tet.getNode(7)), new Node(*tet.getNode(8)), - new Node(*tet.getNode(9)) }; - _nodes = nodes; + _nodes = new Node*[10]; + for (size_t i=0; i<10; i++) + _nodes[i] = tet._nodes[i]; _centre_of_gravity = tet.getCentreOfGravity(); } @@ -43,11 +48,10 @@ Tet10::~Tet10() { } -GEOLIB::Point Tet10::calcCoG() +void Tet10::calcCoG() { - GEOLIB::Point cog(0,0,0); //TODO calculation! - return cog; + _centre_of_gravity = 0; } } diff --git a/MeshLib/Elements/Tet10.h b/MeshLib/Elements/Tet10.h index 4f9dc7e00a363ff9db51e6d2bfa6266cd3e7672a..e718e359209be74aaa162fca3859457fd92c2bc4 100644 --- a/MeshLib/Elements/Tet10.h +++ b/MeshLib/Elements/Tet10.h @@ -58,7 +58,7 @@ public: protected: /// Calculates the volume of a tetrahedron via the determinant of the matrix given by its four points. - GEOLIB::Point calcCoG(); + void calcCoG(); }; /* class */ diff --git a/MeshLib/Elements/Tet4.cpp b/MeshLib/Elements/Tet4.cpp index 95d92adbb8046029e4df1c08a1cfc52ec84daf6b..84d79b57360a74a19cebb23facaaae95039ccb7f 100644 --- a/MeshLib/Elements/Tet4.cpp +++ b/MeshLib/Elements/Tet4.cpp @@ -13,22 +13,20 @@ namespace MeshLib { Tet4::Tet4(Node* nodes[4], size_t value) : Tet(nodes, value), FemElem() { - _centre_of_gravity = this->calcCoG(); + this->calcCoG(); } Tet4::Tet4(const Tet &tet) - : Tet(tet.getValue()), FemElem() + : Tet(tet), FemElem() { - Node* nodes[4] = { new Node(*tet.getNode(0)), new Node(*tet.getNode(1)), new Node(*tet.getNode(2)), new Node(*tet.getNode(3)) }; - _nodes = nodes; - _centre_of_gravity = this->calcCoG(); + this->calcCoG(); } Tet4::Tet4(const Tet4 &tet) : Tet(tet.getValue()), FemElem() { - Node* nodes[4] = { new Node(*tet.getNode(0)), new Node(*tet.getNode(1)), new Node(*tet.getNode(2)), new Node(*tet.getNode(3)) }; - _nodes = nodes; + for (size_t i=0; i<4; i++) + _nodes[i] = tet._nodes[i]; _centre_of_gravity = tet.getCentreOfGravity(); } @@ -36,11 +34,10 @@ Tet4::~Tet4() { } -GEOLIB::Point Tet4::calcCoG() +void Tet4::calcCoG() { - GEOLIB::Point cog(0,0,0); + _centre_of_gravity = 0; //TODO calculation! - return cog; } } diff --git a/MeshLib/Elements/Tet4.h b/MeshLib/Elements/Tet4.h index d2a9ad82c4091773b341ccd5c054002143e0247d..3c31b5d7d77446813ccaf6e3ef01ec7f24aa4214 100644 --- a/MeshLib/Elements/Tet4.h +++ b/MeshLib/Elements/Tet4.h @@ -51,7 +51,7 @@ public: protected: /// Calculates the volume of a tetrahedron via the determinant of the matrix given by its four points. - GEOLIB::Point calcCoG(); + void calcCoG(); }; /* class */ diff --git a/MeshLib/Elements/Tri.cpp b/MeshLib/Elements/Tri.cpp index 1ce114fc545eb3fc91680151afdb8a379f8c747e..925f45e1b7ee9b918fd0071a791a79a0167763a0 100644 --- a/MeshLib/Elements/Tri.cpp +++ b/MeshLib/Elements/Tri.cpp @@ -13,16 +13,19 @@ namespace MeshLib { Tri::Tri(Node* nodes[3], size_t value) - : Face(nodes, MshElemType::TRIANGLE, value) + : Face(MshElemType::TRIANGLE, value) { + _nodes = nodes; this->_area = this->calcArea(); } Tri::Tri(Node* n0, Node* n1, Node* n2, size_t value) : Face(MshElemType::TRIANGLE, value) { - Node* nodes[3] = { n0, n1, n2 }; - _nodes = nodes; + _nodes = new Node*[3]; + _nodes[0] = n0; + _nodes[1] = n1; + _nodes[2] = n2; this->_area = this->calcArea(); } @@ -30,8 +33,9 @@ Tri::Tri(Node* n0, Node* n1, Node* n2, size_t value) Tri::Tri(const Tri &tri) : Face(MshElemType::TRIANGLE, tri.getValue()) { - Node* nodes[3] = { new Node(*tri.getNode(0)), new Node(*tri.getNode(1)), new Node(*tri.getNode(2)) }; - _nodes = nodes; + _nodes = new Node*[3]; + for (size_t i=0; i<3; i++) + _nodes[i] = tri._nodes[i]; _area = tri.getArea(); }