From 4515e7b16ab970fc67d016033d79bca0c8db1573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B3=D0=BE=D1=80=20=D0=A1=D0=B0=D0=BB=D1=8C=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2?= Date: Thu, 21 Jan 2021 14:12:43 +0000 Subject: [PATCH] Upload New File --- MeshLoader.h | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 MeshLoader.h diff --git a/MeshLoader.h b/MeshLoader.h new file mode 100644 index 0000000..3a9dff1 --- /dev/null +++ b/MeshLoader.h @@ -0,0 +1,126 @@ +#pragma once +#include +#include +#include "elements.h" +#include +#include +#include +#include +#include +#include +#include "Exeption.h" +#include + + +using namespace std; +class MeshLoader +{ +private: + +protected: + void add_node(const Node& a); + void add_Finite_Element(const Finite_element& a); + void add_BFE(const Boundary_Finite_element& a); + vector BFE; + vector FE; + vector node; +public: + friend Node; + friend Node UI_to_N (uint16_t a, const MeshLoader& b); + virtual void LoadMesh(const std::string& str) = 0; + const vector& getBoundary_Finite_Element(); + const vector& getFinite_Element(); + const vector& get_nodes(); + vector findFinite_Element(const uint16_t& one_id, const uint16_t& two_id, const uint16_t& three_id); + vector findFinite_Element(const uint16_t& one_id, const uint16_t& two_id); + set find_nodes(const uint16_t& id_granitsi); + vector findFinite_Element(const uint16_t& id_materiala); + vector findBoundary_Finite_Element(const uint16_t& id_granitsi); + map> find_neighbors(); + void insertt(); + Node mid_elem(uint16_t c, uint16_t d); + vector findBoundary_Finite_Element(uint16_t one_id, uint16_t two_id); +}; + +class Edge +{ + +public: + vector nodes; //!!! Логичнее было бы хранить 3 поля - начало, конец и середину + Edge operator =(const Edge& a) + { + this->nodes = a.nodes; + } + bool operator ==(const Edge& a) + { + int d = 0; + for (int i = 0; i < 2; i++) + { + if ((this->nodes[i] == a.nodes[0]) || (this->nodes[i] == a.nodes[1])) + d++; + } + return d == 2; + } + + const vector& get_nodes() + { + return nodes; + } + Edge(uint16_t a, uint16_t b) + { + nodes.reserve(3); + nodes[0]=a; + nodes[1]=b; + } + void insert(const Node& a) + { + nodes.push_back(a.n_id); + }; + void insert(uint16_t a) + { + nodes.push_back(a); + } + int count() + { + return nodes.size(); + }; + friend bool operator ==(const Edge& a, const Edge& b); + friend class fed; + friend class EdgeHash; + //friend Edge findEdge(uint16_t id1, uint16_t id2,const unordered_set& sett); +}; + +inline void hashCombine(std::size_t& o_seed, const Edge& p_val) +{ + uint16_t a = p_val.nodes[0]; + uint16_t b = p_val.nodes[1]; + if (a > b) + { + uint16_t c = a; + a = b; + b = c; + } + o_seed ^= std::hash () (a) + std::hash () (b) + 0x9e3779b9 + (o_seed << 6) + (o_seed >> 2); +} + +inline void hashVal(std::size_t & o_seed,const Edge& p_val) +{ + hashCombine(o_seed, p_val); +} + +inline std::size_t hashVal(const Edge& a) +{ + std::size_t seed = 0; + hashVal(seed, a); + return seed; +} + +class EdgeHash +{ +public: + std::size_t operator () (const Edge& p_c) const + { + return hashVal(p_c); + } +}; + -- GitLab