OpenBEM
Open-source framework for electromagnetic simulation with the boundary element method.
Loading...
Searching...
No Matches
quadrature.tpp
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_OPINT_OBS_QUAD_I
19#define BEM_RWG_OPINT_OBS_QUAD_I
20
21#include "types.hpp"
26
27
28namespace bem::rwg
29{
30
31template <typename TriangleQuadratureType, typename SrcIntegratorType>
33 const Complex k,
34 const Triangle<3>& obs_tri,
35 const Triangle<2>& src_tri
36 )
37{
38
39 // Evaluation function for iterative or adaptive numerical integration
41 {
42 src_integrator_.set_compute_terms(true, false);
43 return src_integrator_.integrate(k, src_tri, r_obs).g;
44 };
45
46 tri_quad_.compute_points_weights(obs_tri, eval);
47
48 // Assemble the integration results
49 src_integrator_.set_compute_terms(
50 base::compute_g_term_ || base::compute_rs_g_terms_,
51 base::compute_grad_g_terms_ || base::compute_rot_grad_g_terms_
52 );
53 SrcResult src_result = src_integrator_.integrate(k, src_tri, tri_quad_.points());
54
56
57 if (base::compute_g_term_)
58 obs_result.g = g_term(src_result);
59
60 if (base::compute_rs_g_terms_)
61 obs_result.rs_g = rs_g_terms(src_result);
62
63 if (base::compute_grad_g_terms_)
64 obs_result.grad_g = grad_g_terms(src_result);
65
66 if (base::compute_rot_grad_g_terms_)
67 obs_result.rot_grad_g = rot_grad_g_terms(src_result);
68
69 return obs_result;
70
71};
72
73
74template <typename TriangleQuadratureType, typename SrcIntegratorType>
77 )
78{
79 return tri_quad_.weights().dot(src_result.g);
80};
81
83template <typename TriangleQuadratureType, typename SrcIntegratorType>
86 )
87{
88
89 EigRowVec<Complex> wgw = src_result.g * tri_quad_.weights().asDiagonal();
90 EigMatNX<Complex, 2> rs_wgw = src_result.rs_g * tri_quad_.weights().asDiagonal();
91
93 EigRowVecN<Complex, 3> p_wgw = wgw * tri_quad_.points().transpose();
94 EigMatMN<Complex, 2, 3> p_rs_wgw = rs_wgw * tri_quad_.points().transpose();
95
97
98 I[0] = wgw.sum();
99 I[1] = sum_rs_wgw[0];
100 I[2] = sum_rs_wgw[1];
101
102 I[3] = p_wgw[0];
103 I[4] = p_wgw[1];
104 I[5] = p_wgw[2];
105
106 I[6] = p_rs_wgw(0, 0);
107 I[7] = p_rs_wgw(0, 1);
108 I[8] = p_rs_wgw(0, 2);
109
110 I[9] = p_rs_wgw(1, 0);
111 I[10] = p_rs_wgw(1, 1);
112 I[11] = p_rs_wgw(1, 2);
113
114 return I;
115
116};
117
118
119template <typename TriangleQuadratureType, typename SrcIntegratorType>
121 const SrcResult& src_result
122 )
123{
124
125 EigMatNX<Complex, 3> grad_wgw = src_result.grad_g * tri_quad_.weights().asDiagonal();
127 EigMatMN<Complex, 3, 3> p_grad_wgw = grad_wgw * tri_quad_.points().transpose();
128
130
131 I[0] = sum_grad_wgw[0];
132 I[1] = p_grad_wgw(0, 1);
133 I[2] = p_grad_wgw(0, 2);
134
135 I[3] = sum_grad_wgw[1];
136 I[4] = p_grad_wgw(1, 0);
137 I[5] = p_grad_wgw(1, 2);
138
139 I[6] = sum_grad_wgw[2];
140 I[7] = p_grad_wgw(2, 0);
141 I[8] = p_grad_wgw(2, 1);
142
143 return I;
144
145};
146
147
148template <typename TriangleQuadratureType, typename SrcIntegratorType>
149EigRowVecN<Complex, 15> ObsQuadrature<TriangleQuadratureType, SrcIntegratorType>::rot_grad_g_terms(
150 const SrcResult& src_result
151 )
152{
153
154 EigMatNX<Complex, 3> grad_wgw = src_result.grad_g * tri_quad_.weights().asDiagonal();
155 EigMatMN<Complex, 3, 3> p_grad_wgw = grad_wgw * tri_quad_.points().transpose();
156
158 tri_quad_.points().row(0).array() * tri_quad_.points().row(1).array()
159 ).matrix().transpose();
161 tri_quad_.points().row(0).array() * tri_quad_.points().row(2).array()
162 ).matrix().transpose();
164 tri_quad_.points().row(1).array() * tri_quad_.points().row(2).array()
165 ).matrix().transpose();
166
168 tri_quad_.points().row(0).array() * tri_quad_.points().row(0).array()
169 ).matrix().transpose();
171 tri_quad_.points().row(1).array() * tri_quad_.points().row(1).array()
172 ).matrix().transpose();
174 tri_quad_.points().row(2).array() * tri_quad_.points().row(2).array()
175 ).matrix().transpose();
176
178
179 I[0] = p_grad_wgw(0, 0);
180 I[5] = p_grad_wgw(1, 1);
181 I[12] = p_grad_wgw(2, 2);
182
183 I[1] = xy_grad_wgw[0];
184 I[2] = xz_grad_wgw[0];
185 I[3] = yy_grad_wgw[0];
186 I[4] = zz_grad_wgw[0];
187
188 I[6] = xy_grad_wgw[1];
189 I[7] = yz_grad_wgw[1];
190 I[8] = xx_grad_wgw[1];
191 I[9] = zz_grad_wgw[1];
192
193 I[10] = xz_grad_wgw[2];
194 I[11] = yz_grad_wgw[2];
195 I[13] = xx_grad_wgw[2];
196 I[14] = yy_grad_wgw[2];
197
198 return I;
199
200};
201
202}
203
204#endif
Class for quadrature over the observation triangle for RWG-based BEM operators. Reference: O....
ObsResult integrate(const Complex k, const Triangle< 3 > &obs_tri, const Triangle< 2 > &src_tri) override
Computes the integral over the observation triangle.
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
Eigen::Matrix< T, 1, N > EigRowVecN
Fixed-size row vector of size N containing type T.
Definition types.hpp:94
Namespace for RWG-based BEM functionality.
Data structure to hold the results of integration over the observation triangle.
Definition base.hpp:37
Data structure to hold the results of integration over the source triangle.
Definition base.hpp:37