OpenBEM
Open-source framework for electromagnetic simulation with the boundary element method.
Loading...
Searching...
No Matches
single_layer.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 BEM_RWG_OPS_SINGLE_LAYER_H
19#define BEM_RWG_OPS_SINGLE_LAYER_H
20
21#include "types.hpp"
23
25
28
29
30namespace bem::rwg
31{
32
53template <typename ObsIntegratorType = ObsStrategic<>>
55{
56
57 static_assert(
58 std::is_base_of<ObsIntegratorBase, ObsIntegratorType>::value,
59 "VectorSingleLayerOp: `ObsIntegratorType` must derive from `ObsIntegratorBase`"
60 );
61
62public:
63
70
71
83 const Complex k,
84 const Triangle<3>& obs_tri,
85 const Triangle<3>& src_tri
86 ) override;
87
88
98 const Complex k,
99 const Triangle<3>& obs_tri,
100 const Triangle<3>& src_tri,
101 const ObsResult& obs_result
102 );
103
104
105protected:
106
107 ObsIntegratorType obs_integrator_;
108
109};
110
111
127template <typename ObsIntegratorType = ObsStrategic<>>
129{
130
131 static_assert(
132 std::is_base_of<ObsIntegratorBase, ObsIntegratorType>::value,
133 "RotVectorSingleLayerOp: `ObsIntegratorType` must derive from `ObsIntegratorBase`"
134 );
135
136public:
137
144
145
157 const Complex k,
158 const Triangle<3>& obs_tri,
159 const Triangle<3>& src_tri
160 ) override;
161
162
172 const Complex k,
173 const Triangle<3>& obs_tri,
174 const Triangle<3>& src_tri,
175 const ObsResult& obs_result
176 );
177
178
179protected:
180
181 ObsIntegratorType obs_integrator_;
182
183};
184
185
198template <typename ObsIntegratorType = ObsStrategic<>>
200{
201
202 static_assert(
203 std::is_base_of<ObsIntegratorBase, ObsIntegratorType>::value,
204 "ScalarSingleLayerOp: `ObsIntegratorType` must derive from `ObsIntegratorBase`"
205 );
206
207public:
208
215
216
228 const Complex k,
229 const Triangle<3>& obs_tri,
230 const Triangle<3>& src_tri
231 ) override;
232
233
243 const Complex k,
244 const Triangle<3>& obs_tri,
245 const Triangle<3>& src_tri,
246 const ObsResult& obs_result
247 );
248
249
250protected:
251
252 ObsIntegratorType obs_integrator_;
253
254};
255
256
272template <typename ObsIntegratorType = ObsStrategic<>>
274{
275
276 static_assert(
277 std::is_base_of<ObsIntegratorBase, ObsIntegratorType>::value,
278 "RotGradScalarSingleLayerOp: `ObsIntegratorType` must derive from `ObsIntegratorBase`"
279 );
280
281public:
282
289
290
302 const Complex k,
303 const Triangle<3>& obs_tri,
304 const Triangle<3>& src_tri
305 ) override;
306
307
317 const Complex k,
318 const Triangle<3>& obs_tri,
319 const Triangle<3>& src_tri,
320 const ObsResult& obs_result
321 );
322
323
324protected:
325
326 ObsIntegratorType obs_integrator_;
327
328};
329
330
347template <typename ObsIntegratorType = ObsStrategic<>>
349{
350
351 static_assert(
352 std::is_base_of<ObsIntegratorBase, ObsIntegratorType>::value,
353 "VectorHypersingularOp: `ObsIntegratorType` must derive from `ObsIntegratorBase`"
354 );
355
356public:
357
364
365
377 const Complex k,
378 const Triangle<3>& obs_tri,
379 const Triangle<3>& src_tri
380 ) override;
381
382
383protected:
384
387
388};
389
390
408template <typename ObsIntegratorType = ObsStrategic<>>
410{
411
412 static_assert(
413 std::is_base_of<ObsIntegratorBase, ObsIntegratorType>::value,
414 "RotVectorHypersingularOp: `ObsIntegratorType` must derive from `ObsIntegratorBase`"
415 );
416
417public:
418
425
426
438 const Complex k,
439 const Triangle<3>& obs_tri,
440 const Triangle<3>& src_tri
441 ) override;
442
443
444protected:
445
448
449};
450
455}
456
458
459#endif
Base class for RWG-based BEM operators.
Definition base.hpp:41
Class for computing the rotationally-tested gradient of the scalar single-layer potential operator.
EigMatMN< Complex, 3, 1 > compute(const Complex k, const Triangle< 3 > &obs_tri, const Triangle< 3 > &src_tri) override
Computes operator values for the given observation and source triangles.
EigMatMN< Complex, 3, 1 > assemble(const Complex k, const Triangle< 3 > &obs_tri, const Triangle< 3 > &src_tri, const ObsResult &obs_result)
Assembles the computed integrals into the final operator values.
RotGradScalarSingleLayerOp(const ObsIntegratorType obs_integrator=ObsStrategic<>())
Constructs a RotGradScalarSingleLayerOp object with a specified integration object.
Class for computing the rotationally-tested vector hypersingular operator.
EigMatMN< Complex, 3, 3 > compute(const Complex k, const Triangle< 3 > &obs_tri, const Triangle< 3 > &src_tri) override
Computes operator values for the given observation and source triangles.
RotVectorHypersingularOp(const ObsIntegratorType obs_integrator=ObsStrategic<>())
Constructs a RotVectorHypersingularOp object with a specified integration object.
Class for computing the rotationally-tested vector single-layer potential operator.
EigMatMN< Complex, 3, 3 > assemble(const Complex k, const Triangle< 3 > &obs_tri, const Triangle< 3 > &src_tri, const ObsResult &obs_result)
Assembles the computed integrals into the final operator values.
EigMatMN< Complex, 3, 3 > compute(const Complex k, const Triangle< 3 > &obs_tri, const Triangle< 3 > &src_tri) override
Computes operator values for the given observation and source triangles.
RotVectorSingleLayerOp(const ObsIntegratorType obs_integrator=ObsStrategic<>())
Constructs a RotVectorSingleLayerOp object with a specified integration object.
Class for computing the scalar single-layer potential operator.
ScalarSingleLayerOp(const ObsIntegratorType obs_integrator=ObsStrategic<>())
Constructs a ScalarSingleLayerOp object with a specified integration object.
EigMatMN< Complex, 1, 1 > assemble(const Complex k, const Triangle< 3 > &obs_tri, const Triangle< 3 > &src_tri, const ObsResult &obs_result)
Assembles the computed integrals into the final operator values.
EigMatMN< Complex, 1, 1 > compute(const Complex k, const Triangle< 3 > &obs_tri, const Triangle< 3 > &src_tri) override
Computes operator values for the given observation and source triangles.
Class for computing the vector hypersingular operator.
EigMatMN< Complex, 3, 3 > compute(const Complex k, const Triangle< 3 > &obs_tri, const Triangle< 3 > &src_tri) override
Computes operator values for the given observation and source triangles.
VectorHypersingularOp(const ObsIntegratorType obs_integrator=ObsStrategic<>())
Constructs a VectorHypersingularOp object with a specified integration object.
Class for computing the vector single-layer potential operator.
VectorSingleLayerOp(const ObsIntegratorType obs_integrator=ObsStrategic<>())
Constructs a VectorSingleLayerOp object with a specified integration object.
EigMatMN< Complex, 3, 3 > assemble(const Complex k, const Triangle< 3 > &obs_tri, const Triangle< 3 > &src_tri, const ObsResult &obs_result)
Assembles the computed integrals into the final operator values.
EigMatMN< Complex, 3, 3 > compute(const Complex k, const Triangle< 3 > &obs_tri, const Triangle< 3 > &src_tri) override
Computes operator values for the given observation and source triangles.
std::complex< Float > Complex
Complex floating point number.
Definition types.hpp:51
Eigen::Matrix< T, N, 1 > EigColVecN
Fixed-size column vector of size N containing type T.
Definition types.hpp:86
Namespace for RWG-based BEM functionality.
Data structure to hold the results of integration over the observation triangle.
Definition base.hpp:37