OpenBEM
Open-source framework for electromagnetic simulation with the boundary element method.
Loading...
Searching...
No Matches
materials.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 MATERIALS_H
19#define MATERIALS_H
20
21#include <stdexcept>
22
23#include "types.hpp"
24#include "constants.hpp"
25
26
27namespace bem
28{
29
30const Float CONDUCTOR_LOSS_TAN_THRESHOLD = 10;
31
43{
44public:
45
54 const Complex epsr = one,
55 const Complex mur = one,
56 const Float sigma = 0
57 ): epsr_(epsr), mur_(mur), sigma_(sigma) {};
58
59
64 virtual Complex eps() const { return epsr_ * eps0; };
65
66
71 virtual Complex epsr() const { return epsr_; };
72
73
78 virtual Complex eps_eff(const Float f) const
79 {
80 if (std::abs(f) <= float_eps)
81 return eps();
82 else
83 return eps() - J * sigma() / f / two_pi;
84 };
85
86
91 virtual Complex epsr_eff(const Float f) const { return eps_eff(f) / eps0; };
92
93
98 virtual Complex mu() const { return mur_ * mu0; };
99
100
105 virtual Complex mur() const { return mur_; };
106
107
112 virtual Float sigma() const { return sigma_; };
113
114
120 virtual Float loss_tan(const Float f) const
121 { return -std::imag(eps_eff(f)) / std::real(eps_eff(f)); };
122
123
129 virtual Complex eta(const Float f) const
130 {
131 if (std::abs(sigma()) <= float_eps)
132 return std::sqrt(mu() / eps());
133 else
134 return std::sqrt((J * two_pi * f * mu()) / (J * two_pi * f * eps() + sigma()));
135 }
136 // { return std::sqrt(mu() / eps_eff(f)); };
137
138
144 virtual Complex k(const Float f) const
145 { return std::sqrt((-J * two_pi * f * mu()) * (J * two_pi * f * eps() + sigma())); };
146 // { return two_pi * f * std::sqrt(eps_eff(f) * mu()); };
147
148
154 virtual Float wvl(const Float f) const
155 { return std::real(two_pi / k(f)); };
156
157
163 virtual Complex c(const Float f) const
164 { return one / std::sqrt(eps_eff(f) * mu()); };
165
166
172 virtual Float skin_depth(const Float f) const
173 { return -one / std::imag(k(f)); };
174
175
181 virtual bool good_conductor(const Float f) const
182 { return loss_tan(f) > CONDUCTOR_LOSS_TAN_THRESHOLD; };
183
184
185protected:
186
187 const Complex epsr_ = one;
188 const Complex mur_ = one;
189 const Float sigma_ = 0;
190
191};
192
193
198{
199public:
200
207 const Float epsr = one,
208 const Float mur = one
209 ): Material(epsr, mur, 0) {};
210
211
216 Float eta() const
217 { return std::real(std::sqrt(mu() / eps())); };
218
219
224 Float c() const
225 { return one / std::real(std::sqrt(mu() * eps())); };
226
227
228};
229
230
235{
236public:
237
246 const Float epsr = one,
247 const Float mur = one,
248 const Float loss_tan = 0
249 ): Material(epsr, mur, 0), loss_tan_(loss_tan) {};
250
251
256 Complex eps() const override
257 { return epsr_ * eps0 * (one - J * loss_tan_); };
258
259
264 Complex epsr() const override
265 { return eps() / eps0; };
266
267
272 Complex eps_eff(const Float f) const override
273 { return eps(); };
274
275
281 { return loss_tan_; };
282
283
290 Float loss_tan(const Float f) const override
291 { return loss_tan(); };
292
293
294protected:
295
296 const Float loss_tan_ = 0;
297
298};
299
304}
305
306#endif
Class defining a material with a constant loss tangent and real permittivity and permeability.
ConstantLossTangentMaterial(const Float epsr=one, const Float mur=one, const Float loss_tan=0)
Constructs a ConstantLossTangentMaterial with given relative permittivity, relative permeability,...
Complex eps() const override
Returns the complex permittivity.
Complex eps_eff(const Float f) const override
Returns the complex permittivity.
Complex epsr() const override
Returns the complex relative permittivity.
Float loss_tan(const Float f) const override
Returns the loss tangent.
Float loss_tan() const
Returns the loss tangent.
Class defining a general material with a constant (zero or non-zero) electrical conductivity and real...
Definition materials.hpp:43
virtual Complex eta(const Float f) const
Returns the frequency-dependent complex wave impedance.
virtual Complex eps() const
Returns the permittivity.
Definition materials.hpp:64
virtual Float skin_depth(const Float f) const
Returns the frequency-dependent skin depth in the material.
virtual Complex k(const Float f) const
Returns the frequency-dependent complex wavenumber.
virtual Complex epsr_eff(const Float f) const
Returns the relative effective complex permittivity taking into account the electric conductivity.
Definition materials.hpp:91
virtual Complex eps_eff(const Float f) const
Returns the effective complex permittivity taking into account the electric conductivity.
Definition materials.hpp:78
virtual Complex c(const Float f) const
Returns the frequency-dependent wave velocity in the material.
virtual Complex mu() const
Returns the permeability.
Definition materials.hpp:98
virtual bool good_conductor(const Float f) const
Checks whether the material can be treated as a good conductor at a given frequency.
virtual Float sigma() const
Returns the electrical conductivity.
virtual Float wvl(const Float f) const
Returns the frequency-dependent wavelength in the material.
Material(const Complex epsr=one, const Complex mur=one, const Float sigma=0)
Constructs a Material with given relative permittivity, relative permeability, and electrical conduct...
Definition materials.hpp:53
virtual Complex epsr() const
Returns the relative permittivity.
Definition materials.hpp:71
virtual Complex mur() const
Returns the relative permeability.
virtual Float loss_tan(const Float f) const
Returns the frequency-dependent loss tangent.
Class defining a perfect lossless dielectric material.
PerfectDielectricMaterial(const Float epsr=one, const Float mur=one)
Constructs a PerfectDielectricMaterial with given relative permittivity and permeability.
Float c() const
Returns the wave velocity.
Float eta() const
Returns the wave impedance.
const Complex J
Imaginary unit.
Definition constants.hpp:40
const Float float_eps
Numerical infinitesimal.
Definition constants.hpp:70
const Float mu0
Vacuum permeability.
Definition constants.hpp:58
const Float eps0
Vacuum permittivity.
Definition constants.hpp:55
double Float
Floating point number.
Definition types.hpp:47
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
Primary namespace for the OpenBEM library.
Definition constants.hpp:31