OpenBEM
Open-source framework for electromagnetic simulation with the boundary element method.
Loading...
Searching...
No Matches
base.hpp
Go to the documentation of this file.
1// OpenBEM - Copyright (C) 2026 Shashwat Sharma
2
3// This file is part of OpenBEM.
4
5// OpenBEM is free software: you can redistribute it and/or modify it under the terms of the
6// GNU General Public License as published by the Free Software Foundation, either version 3
7// of the License, or (at your option) any later version.
8
9// You should have received a copy of the GNU General Public License along with OpenBEM.
10// If not, see <https://www.gnu.org/licenses/>.
11
12
18#ifndef GEOM_MESH_BASE_H
19#define GEOM_MESH_BASE_H
20
21#include <string>
22
23#include "types.hpp"
24
25
26namespace bem
27{
28
39template <uint8_t dim, uint8_t verts_per_elem>
41{
42
43 static_assert((dim == 1 || dim == 2 || dim == 3), "MeshBase: `dim` must be 1, 2, or 3.");
44
45public:
46
52 { return verts_; };
53
54
61 { return verts_.col(vert); };
62
63
69 { return elems_; };
70
71
78 { return elems_.col(elem); };
79
80
88 { return elems_(vert, elem); };
89
90
100 { return elem_tags_; };
101
102
112 { return elem_tags_[elem]; };
113
114
120 { return verts_.cols(); };
121
122
128 { return elems_.cols(); };
129
130
136 virtual void partition_by_elems(
139 ) const = 0;
140
141
147 {
149 for (Index ii = 0; ii < elems_.cols(); ++ii)
150 {
152 Eigen::placeholders::all, elems_.col(ii)
153 );
154 centroids(Eigen::placeholders::all, ii) = coords.rowwise().mean();
155 }
156 return centroids;
157 };
158
159
163 virtual void reverse_orientation()
164 {
165 elems_ = elems_.colwise().reverse().eval();
166 return;
167 };
168
169
170protected:
171
174 EigRowVec<Index> elem_tags_;
175
176};
177
178
183template <typename MeshType>
185{
186public:
187
195 const MeshType& mesh,
197 const std::string name = "view"
198 ): mesh_(mesh), elem_inds_(elem_inds), name_(name) {};
199
200
207 const MeshType& mesh,
208 const std::string name = "view"
209 ): mesh_(mesh), name_(name)
210 {
211 elem_inds_ = EigRowVec<Index>::LinSpaced(mesh_.num_elems(), 0, mesh_.num_elems() - 1);
212 return;
213 };
214
215
221 {
223 mesh_.partition_by_elems(submesh, elem_inds_);
224 return submesh;
225 };
226
227
232 const EigRowVec<Index>& elem_inds() const { return elem_inds_; };
233
234
239 const std::string& name() const { return name_; };
240
241
242protected:
243
244 const MeshType& mesh_;
245 const EigRowVec<Index> elem_inds_;
246 const std::string name_ = "view";
247
248};
249
254}
255
256#endif
Mesh base class.
Definition base.hpp:41
virtual void partition_by_elems(MeshBase< dim, verts_per_elem > &partition, ConstEigRef< EigRowVec< Index > > elem_inds) const =0
Returns a sub-mesh that contains only specified elements of this mesh.
virtual void reverse_orientation()
Reverses the orientation of each element.
Definition base.hpp:163
Index num_verts() const
Returns the number of vertices in the mesh.
Definition base.hpp:119
Index elem_tags(Index elem) const
Returns the tag associated with a specified element.
Definition base.hpp:111
Index num_elems() const
Returns the number of elements in the mesh.
Definition base.hpp:127
EigColVecN< Float, dim > verts(Index vert) const
Returns the coordinates of a specific vertex.
Definition base.hpp:60
const EigRowVec< Index > & elem_tags() const
Returns the element tags.
Definition base.hpp:99
EigColVecN< Index, 3 > elems(Index elem) const
Returns the vertex indices of a specific element.
Definition base.hpp:77
EigMatNX< Float, dim > elem_centroids() const
Computes and returns the centroid of each element.
Definition base.hpp:146
Index elems(uint8_t vert, Index elem) const
Returns the index of a specific vertex of a specific element.
Definition base.hpp:87
const EigMatNX< Index, verts_per_elem > & elems() const
Returns the vertex indices of each element.
Definition base.hpp:68
const EigMatNX< Float, dim > & verts() const
Returns the coordinates of the mesh vertices.
Definition base.hpp:51
Class that provides a lightweight view into a MeshBase object.
Definition base.hpp:185
MeshView(const MeshType &mesh, ConstEigRef< EigRowVec< Index > > elem_inds, const std::string name="view")
Constructs a MeshView from a mesh and specified element indices.
Definition base.hpp:194
const EigRowVec< Index > & elem_inds() const
Returns the parent mesh's element indices associated with this view.
Definition base.hpp:232
const std::string & name() const
Returns the name of the view.
Definition base.hpp:239
MeshType mesh() const
Creates and returns a new mesh containing the elements of the parent mesh associated with this view.
Definition base.hpp:220
MeshView(const MeshType &mesh, const std::string name="view")
Constructs a MeshView from a mesh, containing all its elements.
Definition base.hpp:206
const Eigen::Ref< const EigObj > ConstEigRef
Read-only reference to an Eigen object.
Definition types.hpp:98
Eigen::Matrix< T, 1, Eigen::Dynamic > EigRowVec
Dynamic-size row vector containing type T.
Definition types.hpp:90
Eigen::Matrix< T, N, 1 > EigColVecN
Fixed-size column vector of size N containing type T.
Definition types.hpp:86
Eigen::Matrix< T, N, Eigen::Dynamic > EigMatNX
Fixed-height matrix with N rows containing type T.
Definition types.hpp:78
std::size_t Index
Unsigned integer type for indices and container sizes.
Definition types.hpp:54
Primary namespace for the OpenBEM library.
Definition constants.hpp:31