Program Listing for File element.h

Return to documentation for file (src/rlenvs/utils/geometry/mesh/element.h)

#ifndef ELEMENT_H
#define ELEMENT_H

#include "rlenvs/rlenvs_types_v2.h"
#include "rlenvs/rlenvs_consts.h"
#include "rlenvs/utils/geometry/mesh/mesh_entity.h"
#include "rlenvs/utils/geometry/mesh/edge_face_selector.h"
#include "rlenvs/utils/geometry/mesh/element_traits.h"
#include "rlenvs/utils/geometry/geom_point.h"

#include <any>

#include <functional>
#include <map>
#include <string>

namespace rlenvscpp{
namespace utils{
namespace geom{

template<int dim> class Node;

template<int dim>
class Element: public MeshEntity
{

public:

    typedef Element<dim>* neighbor_ptr_t;
    typedef Element<dim>& neighbor_ref_t;
    typedef const Element<dim>& cneighbor_ref_t;
    typedef Node<dim>* node_ptr_t;
    typedef typename element_traits<Element<dim>>::edge_ptr_t edge_ptr_t;
    typedef typename element_traits<Element<dim>>::cedge_ptr_t cedge_ptr_t;
    typedef typename element_traits<Element<dim>>::edge_ref_t edge_ref_t;
    typedef typename element_traits<Element<dim>>::cedge_ref_t cedge_ref_t;
    typedef typename element_traits<Element<dim>>::face_ptr_t face_ptr_t;
    typedef typename element_traits<Element<dim>>::cface_ptr_t cface_ptr_t;
    typedef typename element_traits<Element<dim>>::face_ref_t face_ref_t;
    typedef typename element_traits<Element<dim>>::cface_ref_t cface_ref_t;

    virtual ~Element();

    virtual uint_t n_vertices()const=0;

    virtual uint_t n_nodes()const=0;

    virtual void set_node(uint_t i, node_ptr_t node);

    virtual void append_node(node_ptr_t node);

    virtual void resize_nodes();

    virtual node_ptr_t get_node(uint_t n);

    virtual uint_t n_edges()const=0;

    virtual uint_t n_faces()const=0;

    virtual void resize_faces()=0;

    virtual cface_ref_t get_face(uint_t f)const=0;

    virtual face_ref_t get_face(uint_t f)=0;

    virtual void set_face(uint_t f, face_ptr_t face)=0;

    virtual void set_neighbor(uint_t n, neighbor_ptr_t neigh);

    virtual uint_t n_neighbors()const=0;

    virtual void resize_neighbors();

    virtual cneighbor_ref_t get_neighbor(uint_t n)const;

    virtual neighbor_ptr_t neighbor_ptr(uint_t n);

    virtual const neighbor_ptr_t neighbor_ptr(uint_t n)const;

    virtual void face_vertices(uint_t f, std::vector<uint_t>& ids)const=0;

    virtual real_t volume()const=0;

    virtual GeomPoint<dim> centroid()const;

    virtual uint_t which_face_am_i(cface_ref_t face)const = 0;

    virtual const DynVec<real_t> face_normal_vector(uint_t f)const=0;


    uint_t which_neighbor_am_i(const Element<dim>& element)const;

    std::vector<node_ptr_t> get_vertices()const;


protected:

    Element();

    Element(uint_t id, uint_t pid);

    Element(uint_t id, uint_t pid, const std::any& data);

    std::vector<neighbor_ptr_t> neginbors_;

    std::vector<node_ptr_t> nodes_;

};

}

}
}

#endif // ELEMENT_H