Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F64477538
MeshHex8.h
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Mon, May 27, 04:10
Size
15 KB
Mime Type
text/x-c++
Expires
Wed, May 29, 04:10 (2 d)
Engine
blob
Format
Raw Data
Handle
17897987
Attached To
rGOOSEFEM GooseFEM
MeshHex8.h
View Options
/**
Generate simple meshes of 8-noded hexahedral elements in 3d (GooseFEM::Mesh::ElementType::Hex8).
\file MeshHex8.h
\copyright Copyright 2017. Tom de Geus. All rights reserved.
\license This project is released under the GNU Public License (GPLv3).
*/
#ifndef GOOSEFEM_MESHHEX8_H
#define GOOSEFEM_MESHHEX8_H
#include "config.h"
namespace GooseFEM {
namespace Mesh {
namespace Hex8 {
class Regular {
public:
Regular(size_t nelx, size_t nely, size_t nelz, double h = 1.);
// size
size_t nelem() const; // number of elements
size_t nnode() const; // number of nodes
size_t nne() const; // number of nodes-per-element
size_t ndim() const; // number of dimensions
// type
ElementType getElementType() const;
// mesh
xt::xtensor<double, 2> coor() const; // nodal positions [nnode, ndim]
xt::xtensor<size_t, 2> conn() const; // connectivity [nelem, nne]
// boundary nodes: planes
xt::xtensor<size_t, 1> nodesFront() const;
xt::xtensor<size_t, 1> nodesBack() const;
xt::xtensor<size_t, 1> nodesLeft() const;
xt::xtensor<size_t, 1> nodesRight() const;
xt::xtensor<size_t, 1> nodesBottom() const;
xt::xtensor<size_t, 1> nodesTop() const;
// boundary nodes: faces
xt::xtensor<size_t, 1> nodesFrontFace() const;
xt::xtensor<size_t, 1> nodesBackFace() const;
xt::xtensor<size_t, 1> nodesLeftFace() const;
xt::xtensor<size_t, 1> nodesRightFace() const;
xt::xtensor<size_t, 1> nodesBottomFace() const;
xt::xtensor<size_t, 1> nodesTopFace() const;
// boundary nodes: edges
xt::xtensor<size_t, 1> nodesFrontBottomEdge() const;
xt::xtensor<size_t, 1> nodesFrontTopEdge() const;
xt::xtensor<size_t, 1> nodesFrontLeftEdge() const;
xt::xtensor<size_t, 1> nodesFrontRightEdge() const;
xt::xtensor<size_t, 1> nodesBackBottomEdge() const;
xt::xtensor<size_t, 1> nodesBackTopEdge() const;
xt::xtensor<size_t, 1> nodesBackLeftEdge() const;
xt::xtensor<size_t, 1> nodesBackRightEdge() const;
xt::xtensor<size_t, 1> nodesBottomLeftEdge() const;
xt::xtensor<size_t, 1> nodesBottomRightEdge() const;
xt::xtensor<size_t, 1> nodesTopLeftEdge() const;
xt::xtensor<size_t, 1> nodesTopRightEdge() const;
// boundary nodes: edges (aliases)
xt::xtensor<size_t, 1> nodesBottomFrontEdge() const;
xt::xtensor<size_t, 1> nodesBottomBackEdge() const;
xt::xtensor<size_t, 1> nodesTopFrontEdge() const;
xt::xtensor<size_t, 1> nodesTopBackEdge() const;
xt::xtensor<size_t, 1> nodesLeftBottomEdge() const;
xt::xtensor<size_t, 1> nodesLeftFrontEdge() const;
xt::xtensor<size_t, 1> nodesLeftBackEdge() const;
xt::xtensor<size_t, 1> nodesLeftTopEdge() const;
xt::xtensor<size_t, 1> nodesRightBottomEdge() const;
xt::xtensor<size_t, 1> nodesRightTopEdge() const;
xt::xtensor<size_t, 1> nodesRightFrontEdge() const;
xt::xtensor<size_t, 1> nodesRightBackEdge() const;
// boundary nodes: edges, without corners
xt::xtensor<size_t, 1> nodesFrontBottomOpenEdge() const;
xt::xtensor<size_t, 1> nodesFrontTopOpenEdge() const;
xt::xtensor<size_t, 1> nodesFrontLeftOpenEdge() const;
xt::xtensor<size_t, 1> nodesFrontRightOpenEdge() const;
xt::xtensor<size_t, 1> nodesBackBottomOpenEdge() const;
xt::xtensor<size_t, 1> nodesBackTopOpenEdge() const;
xt::xtensor<size_t, 1> nodesBackLeftOpenEdge() const;
xt::xtensor<size_t, 1> nodesBackRightOpenEdge() const;
xt::xtensor<size_t, 1> nodesBottomLeftOpenEdge() const;
xt::xtensor<size_t, 1> nodesBottomRightOpenEdge() const;
xt::xtensor<size_t, 1> nodesTopLeftOpenEdge() const;
xt::xtensor<size_t, 1> nodesTopRightOpenEdge() const;
// boundary nodes: edges, without corners (aliases)
xt::xtensor<size_t, 1> nodesBottomFrontOpenEdge() const;
xt::xtensor<size_t, 1> nodesBottomBackOpenEdge() const;
xt::xtensor<size_t, 1> nodesTopFrontOpenEdge() const;
xt::xtensor<size_t, 1> nodesTopBackOpenEdge() const;
xt::xtensor<size_t, 1> nodesLeftBottomOpenEdge() const;
xt::xtensor<size_t, 1> nodesLeftFrontOpenEdge() const;
xt::xtensor<size_t, 1> nodesLeftBackOpenEdge() const;
xt::xtensor<size_t, 1> nodesLeftTopOpenEdge() const;
xt::xtensor<size_t, 1> nodesRightBottomOpenEdge() const;
xt::xtensor<size_t, 1> nodesRightTopOpenEdge() const;
xt::xtensor<size_t, 1> nodesRightFrontOpenEdge() const;
xt::xtensor<size_t, 1> nodesRightBackOpenEdge() const;
// boundary nodes: corners
size_t nodesFrontBottomLeftCorner() const;
size_t nodesFrontBottomRightCorner() const;
size_t nodesFrontTopLeftCorner() const;
size_t nodesFrontTopRightCorner() const;
size_t nodesBackBottomLeftCorner() const;
size_t nodesBackBottomRightCorner() const;
size_t nodesBackTopLeftCorner() const;
size_t nodesBackTopRightCorner() const;
// boundary nodes: corners (aliases)
size_t nodesFrontLeftBottomCorner() const;
size_t nodesBottomFrontLeftCorner() const;
size_t nodesBottomLeftFrontCorner() const;
size_t nodesLeftFrontBottomCorner() const;
size_t nodesLeftBottomFrontCorner() const;
size_t nodesFrontRightBottomCorner() const;
size_t nodesBottomFrontRightCorner() const;
size_t nodesBottomRightFrontCorner() const;
size_t nodesRightFrontBottomCorner() const;
size_t nodesRightBottomFrontCorner() const;
size_t nodesFrontLeftTopCorner() const;
size_t nodesTopFrontLeftCorner() const;
size_t nodesTopLeftFrontCorner() const;
size_t nodesLeftFrontTopCorner() const;
size_t nodesLeftTopFrontCorner() const;
size_t nodesFrontRightTopCorner() const;
size_t nodesTopFrontRightCorner() const;
size_t nodesTopRightFrontCorner() const;
size_t nodesRightFrontTopCorner() const;
size_t nodesRightTopFrontCorner() const;
size_t nodesBackLeftBottomCorner() const;
size_t nodesBottomBackLeftCorner() const;
size_t nodesBottomLeftBackCorner() const;
size_t nodesLeftBackBottomCorner() const;
size_t nodesLeftBottomBackCorner() const;
size_t nodesBackRightBottomCorner() const;
size_t nodesBottomBackRightCorner() const;
size_t nodesBottomRightBackCorner() const;
size_t nodesRightBackBottomCorner() const;
size_t nodesRightBottomBackCorner() const;
size_t nodesBackLeftTopCorner() const;
size_t nodesTopBackLeftCorner() const;
size_t nodesTopLeftBackCorner() const;
size_t nodesLeftBackTopCorner() const;
size_t nodesLeftTopBackCorner() const;
size_t nodesBackRightTopCorner() const;
size_t nodesTopBackRightCorner() const;
size_t nodesTopRightBackCorner() const;
size_t nodesRightBackTopCorner() const;
size_t nodesRightTopBackCorner() const;
// DOF-numbers for each component of each node (sequential)
xt::xtensor<size_t, 2> dofs() const;
// DOF-numbers for the case that the periodicity if fully eliminated
xt::xtensor<size_t, 2> dofsPeriodic() const;
// periodic node pairs [:,2]: (independent, dependent)
xt::xtensor<size_t, 2> nodesPeriodic() const;
// front-bottom-left node, used as reference for periodicity
size_t nodesOrigin() const;
private:
double m_h; // elementary element edge-size (in all directions)
size_t m_nelx; // number of elements in x-direction (length == "m_nelx * m_h")
size_t m_nely; // number of elements in y-direction (length == "m_nely * m_h")
size_t m_nelz; // number of elements in z-direction (length == "m_nely * m_h")
size_t m_nelem; // number of elements
size_t m_nnode; // number of nodes
static const size_t m_nne = 8; // number of nodes-per-element
static const size_t m_ndim = 3; // number of dimensions
};
class FineLayer {
public:
FineLayer(size_t nelx, size_t nely, size_t nelz, double h = 1.0, size_t nfine = 1);
// size
size_t nelem() const; // number of elements
size_t nnode() const; // number of nodes
size_t nne() const; // number of nodes-per-element
size_t ndim() const; // number of dimensions
size_t nelx() const; // number of elements in x-direction
size_t nely() const; // number of elements in y-direction
size_t nelz() const; // number of elements in y-direction
// type
ElementType getElementType() const;
// mesh
xt::xtensor<double, 2> coor() const; // nodal positions [nnode, ndim]
xt::xtensor<size_t, 2> conn() const; // connectivity [nelem, nne]
// element sets
xt::xtensor<size_t, 1> elementsMiddleLayer() const; // elements in the middle (fine) layer
// boundary nodes: planes
xt::xtensor<size_t, 1> nodesFront() const;
xt::xtensor<size_t, 1> nodesBack() const;
xt::xtensor<size_t, 1> nodesLeft() const;
xt::xtensor<size_t, 1> nodesRight() const;
xt::xtensor<size_t, 1> nodesBottom() const;
xt::xtensor<size_t, 1> nodesTop() const;
// boundary nodes: faces
xt::xtensor<size_t, 1> nodesFrontFace() const;
xt::xtensor<size_t, 1> nodesBackFace() const;
xt::xtensor<size_t, 1> nodesLeftFace() const;
xt::xtensor<size_t, 1> nodesRightFace() const;
xt::xtensor<size_t, 1> nodesBottomFace() const;
xt::xtensor<size_t, 1> nodesTopFace() const;
// boundary nodes: edges
xt::xtensor<size_t, 1> nodesFrontBottomEdge() const;
xt::xtensor<size_t, 1> nodesFrontTopEdge() const;
xt::xtensor<size_t, 1> nodesFrontLeftEdge() const;
xt::xtensor<size_t, 1> nodesFrontRightEdge() const;
xt::xtensor<size_t, 1> nodesBackBottomEdge() const;
xt::xtensor<size_t, 1> nodesBackTopEdge() const;
xt::xtensor<size_t, 1> nodesBackLeftEdge() const;
xt::xtensor<size_t, 1> nodesBackRightEdge() const;
xt::xtensor<size_t, 1> nodesBottomLeftEdge() const;
xt::xtensor<size_t, 1> nodesBottomRightEdge() const;
xt::xtensor<size_t, 1> nodesTopLeftEdge() const;
xt::xtensor<size_t, 1> nodesTopRightEdge() const;
// boundary nodes: edges (aliases)
xt::xtensor<size_t, 1> nodesBottomFrontEdge() const;
xt::xtensor<size_t, 1> nodesBottomBackEdge() const;
xt::xtensor<size_t, 1> nodesTopFrontEdge() const;
xt::xtensor<size_t, 1> nodesTopBackEdge() const;
xt::xtensor<size_t, 1> nodesLeftBottomEdge() const;
xt::xtensor<size_t, 1> nodesLeftFrontEdge() const;
xt::xtensor<size_t, 1> nodesLeftBackEdge() const;
xt::xtensor<size_t, 1> nodesLeftTopEdge() const;
xt::xtensor<size_t, 1> nodesRightBottomEdge() const;
xt::xtensor<size_t, 1> nodesRightTopEdge() const;
xt::xtensor<size_t, 1> nodesRightFrontEdge() const;
xt::xtensor<size_t, 1> nodesRightBackEdge() const;
// boundary nodes: edges, without corners
xt::xtensor<size_t, 1> nodesFrontBottomOpenEdge() const;
xt::xtensor<size_t, 1> nodesFrontTopOpenEdge() const;
xt::xtensor<size_t, 1> nodesFrontLeftOpenEdge() const;
xt::xtensor<size_t, 1> nodesFrontRightOpenEdge() const;
xt::xtensor<size_t, 1> nodesBackBottomOpenEdge() const;
xt::xtensor<size_t, 1> nodesBackTopOpenEdge() const;
xt::xtensor<size_t, 1> nodesBackLeftOpenEdge() const;
xt::xtensor<size_t, 1> nodesBackRightOpenEdge() const;
xt::xtensor<size_t, 1> nodesBottomLeftOpenEdge() const;
xt::xtensor<size_t, 1> nodesBottomRightOpenEdge() const;
xt::xtensor<size_t, 1> nodesTopLeftOpenEdge() const;
xt::xtensor<size_t, 1> nodesTopRightOpenEdge() const;
// boundary nodes: edges, without corners (aliases)
xt::xtensor<size_t, 1> nodesBottomFrontOpenEdge() const;
xt::xtensor<size_t, 1> nodesBottomBackOpenEdge() const;
xt::xtensor<size_t, 1> nodesTopFrontOpenEdge() const;
xt::xtensor<size_t, 1> nodesTopBackOpenEdge() const;
xt::xtensor<size_t, 1> nodesLeftBottomOpenEdge() const;
xt::xtensor<size_t, 1> nodesLeftFrontOpenEdge() const;
xt::xtensor<size_t, 1> nodesLeftBackOpenEdge() const;
xt::xtensor<size_t, 1> nodesLeftTopOpenEdge() const;
xt::xtensor<size_t, 1> nodesRightBottomOpenEdge() const;
xt::xtensor<size_t, 1> nodesRightTopOpenEdge() const;
xt::xtensor<size_t, 1> nodesRightFrontOpenEdge() const;
xt::xtensor<size_t, 1> nodesRightBackOpenEdge() const;
// boundary nodes: corners
size_t nodesFrontBottomLeftCorner() const;
size_t nodesFrontBottomRightCorner() const;
size_t nodesFrontTopLeftCorner() const;
size_t nodesFrontTopRightCorner() const;
size_t nodesBackBottomLeftCorner() const;
size_t nodesBackBottomRightCorner() const;
size_t nodesBackTopLeftCorner() const;
size_t nodesBackTopRightCorner() const;
// boundary nodes: corners (aliases)
size_t nodesFrontLeftBottomCorner() const;
size_t nodesBottomFrontLeftCorner() const;
size_t nodesBottomLeftFrontCorner() const;
size_t nodesLeftFrontBottomCorner() const;
size_t nodesLeftBottomFrontCorner() const;
size_t nodesFrontRightBottomCorner() const;
size_t nodesBottomFrontRightCorner() const;
size_t nodesBottomRightFrontCorner() const;
size_t nodesRightFrontBottomCorner() const;
size_t nodesRightBottomFrontCorner() const;
size_t nodesFrontLeftTopCorner() const;
size_t nodesTopFrontLeftCorner() const;
size_t nodesTopLeftFrontCorner() const;
size_t nodesLeftFrontTopCorner() const;
size_t nodesLeftTopFrontCorner() const;
size_t nodesFrontRightTopCorner() const;
size_t nodesTopFrontRightCorner() const;
size_t nodesTopRightFrontCorner() const;
size_t nodesRightFrontTopCorner() const;
size_t nodesRightTopFrontCorner() const;
size_t nodesBackLeftBottomCorner() const;
size_t nodesBottomBackLeftCorner() const;
size_t nodesBottomLeftBackCorner() const;
size_t nodesLeftBackBottomCorner() const;
size_t nodesLeftBottomBackCorner() const;
size_t nodesBackRightBottomCorner() const;
size_t nodesBottomBackRightCorner() const;
size_t nodesBottomRightBackCorner() const;
size_t nodesRightBackBottomCorner() const;
size_t nodesRightBottomBackCorner() const;
size_t nodesBackLeftTopCorner() const;
size_t nodesTopBackLeftCorner() const;
size_t nodesTopLeftBackCorner() const;
size_t nodesLeftBackTopCorner() const;
size_t nodesLeftTopBackCorner() const;
size_t nodesBackRightTopCorner() const;
size_t nodesTopBackRightCorner() const;
size_t nodesTopRightBackCorner() const;
size_t nodesRightBackTopCorner() const;
size_t nodesRightTopBackCorner() const;
// DOF-numbers for each component of each node (sequential)
xt::xtensor<size_t, 2> dofs() const;
// DOF-numbers for the case that the periodicity if fully eliminated
xt::xtensor<size_t, 2> dofsPeriodic() const;
// periodic node pairs [:,2]: (independent, dependent)
xt::xtensor<size_t, 2> nodesPeriodic() const;
// front-bottom-left node, used as reference for periodicity
size_t nodesOrigin() const;
private:
double m_h; // elementary element edge-size (in all directions)
double m_Lx; // mesh size in "x"
double m_Lz; // mesh size in "z"
size_t m_nelem; // number of elements
size_t m_nnode; // number of nodes
static const size_t m_nne = 8; // number of nodes-per-element
static const size_t m_ndim = 3; // number of dimensions
xt::xtensor<size_t, 1> m_nelx; // number of elements in "x" (*)
xt::xtensor<size_t, 1> m_nelz; // number of elements in "z" (*)
xt::xtensor<size_t, 1> m_nnd; // number of nodes in the main node layer (**)
xt::xtensor<size_t, 1> m_nhx; // element size in x-direction (*)
xt::xtensor<size_t, 1> m_nhy; // element size in y-direction (*)
xt::xtensor<size_t, 1> m_nhz; // element size in z-direction (*)
xt::xtensor<int, 1> m_refine; // refine direction (-1:no refine, 0:"x", 2:"z") (*)
xt::xtensor<size_t, 1> m_startElem; // start element (*)
xt::xtensor<size_t, 1> m_startNode; // start node (**)
// (*) per element layer in "y"
// (**) per node layer in "y"
};
} // namespace Hex8
} // namespace Mesh
} // namespace GooseFEM
#include "MeshHex8.hpp"
#endif
Event Timeline
Log In to Comment