17 #ifndef MAGNETOSTATICS_HPP
18 #define MAGNETOSTATICS_HPP
22 #include <boost/math/constants/constants.hpp>
24 #include <Eigen/Sparse>
25 #include <unsupported/Eigen/SparseExtra>
61 std::ostream & output = std::cout
144 const std::vector<Eigen::VectorXd> & list_dofs
149 std::pair<Eigen::MatrixXd, Eigen::VectorXd>
150 _compute_local_contribution(
160 void _assemble_local_contribution(
162 const std::pair<Eigen::MatrixXd, Eigen::VectorXd> & lsT,
163 std::list<Eigen::Triplet<double> > & A1,
164 Eigen::VectorXd & b1,
165 std::list<Eigen::Triplet<double> > & A2,
171 std::ostream & m_output;
174 const size_t m_nloc_sc_H;
178 Eigen::VectorXd m_sc_b;
186 static const double PI = boost::math::constants::pi<double>();
193 constant_u = [](
const Eigen::Vector3d & x) -> Eigen::Vector3d {
194 return Eigen::Vector3d(1., 2., 3.);
199 return Eigen::Vector3d::Zero();
203 constant_f = [](
const Eigen::Vector3d & x) -> Eigen::Vector3d {
204 return Eigen::Vector3d::Zero();
213 linear_u = [](
const Eigen::Vector3d & x) -> Eigen::Vector3d {
214 return Eigen::Vector3d(
223 return Eigen::Vector3d(-3., 2., 1.);
227 linear_f = [](
const Eigen::Vector3d & x) -> Eigen::Vector3d {
228 return Eigen::Vector3d::Zero();
238 return Eigen::Vector3d(
239 cos(
PI*x(0)) * sin(
PI*x(1)) * sin(
PI*x(2)),
240 -2. * sin(
PI*x(0)) * cos(
PI*x(1)) * sin(
PI*x(2)),
241 sin(
PI*x(0)) * sin(
PI*x(1)) * cos(
PI*x(2))
247 return 3. *
PI * Eigen::Vector3d(
248 sin(
PI*x(0)) * cos(
PI*x(1)) * cos(
PI*x(2)),
250 -cos(
PI*x(0)) * cos(
PI*x(1)) * sin(
PI*x(2))
256 return 3. * std::pow(
PI, 2) * Eigen::Vector3d(
257 cos(
PI*x(0)) * sin(
PI*x(1)) * sin(
PI*x(2)),
258 -2. * sin(
PI*x(0)) * cos(
PI*x(1)) * sin(
PI*x(2)),
259 sin(
PI*x(0)) * sin(
PI*x(1)) * cos(
PI*x(2))
271 return Eigen::Vector3d(
272 cos(
PI*x(0)) * sin(
PI*x(1)) * sin(
PI*x(2)),
273 -2. * sin(
PI*x(0)) * cos(
PI*x(1)) * sin(
PI*x(2)),
274 sin(
PI*x(0)) * sin(
PI*x(1)) * cos(
PI*x(2))
280 return 3 *
PI / (1. + x(0) + x(1) + x(2))
282 sin(
PI*x(0)) * cos(
PI*x(1)) * cos(
PI*x(2)),
284 -cos(
PI*x(0)) * cos(
PI*x(1)) * sin(
PI*x(2))
290 double a = 3 *
PI / std::pow(1. + x(0) + x(1) + x(2), 2);
291 double b = 3 * std::pow(
PI, 2) / (1. + x(0) + x(1) + x(2));
292 double dy_sigmax = -a * sin(
PI*x(0)) * cos(
PI*x(1)) * cos(
PI*x(2))
293 - b * sin(
PI*x(0)) * sin(
PI*x(1)) * cos(
PI*x(2));
294 double dz_sigmax = -a * sin(
PI*x(0)) * cos(
PI*x(1)) * cos(
PI*x(2))
295 - b * sin(
PI*x(0)) * cos(
PI*x(1)) * sin(
PI*x(2));
297 double dx_sigmaz = a * cos(
PI*x(0)) * cos(
PI*x(1)) * sin(
PI*x(2))
298 + b * sin(
PI*x(0)) * cos(
PI*x(1)) * sin(
PI*x(2));
300 double dy_sigmaz = a * cos(
PI*x(0)) * cos(
PI*x(1)) * sin(
PI*x(2))
301 + b * cos(
PI*x(0)) * sin(
PI*x(1)) * sin(
PI*x(2));
303 return Eigen::Vector3d(
305 dz_sigmax - dx_sigmaz,
312 [](
const Cell & T,
const Eigen::Vector3d & x) ->
double {
return 1. + x(0) + x(1) + x(2); },
313 [](
const Cell & T) ->
size_t {
return 1; }
Construct all polynomial spaces for the DDR sequence.
Definition: ddrcore.hpp:62
Discrete Hcurl space: local operators, L2 product and global interpolator.
Definition: xcurl.hpp:19
Discrete Hdiv space: local operators, L2 product and global interpolator.
Definition: xdiv.hpp:20
size_t dimension() const
Returns the dimension of the global space (all DOFs for all geometric entities)
Definition: localdofspace.hpp:80
const Mesh & mesh() const
Return a const reference to the mesh.
Definition: ddrcore.hpp:134
static const double PI
Definition: ddr-magnetostatics.hpp:186
const XCurl & xCurl() const
Returns the space XCurl.
Definition: ddr-magnetostatics.hpp:91
static Magnetostatics::SolutionPotentialType linear_u
Definition: ddr-magnetostatics.hpp:213
static Magnetostatics::SolutionCurlType linear_sigma
Definition: ddr-magnetostatics.hpp:222
const Eigen::VectorXd & systemVector() const
Returns the linear system right-hand side vector.
Definition: ddr-magnetostatics.hpp:113
static Magnetostatics::SolutionCurlType trigonometric_sigma
Definition: ddr-magnetostatics.hpp:246
Eigen::SparseMatrix< double > SystemMatrixType
Definition: ddr-magnetostatics.hpp:50
const XDiv & xDiv() const
Returns the space XDiv.
Definition: ddr-magnetostatics.hpp:97
double & stabilizationParameter()
Returns the stabilization parameter.
Definition: ddr-magnetostatics.hpp:128
static Magnetostatics::PermeabilityType constant_mu
Definition: ddr-magnetostatics.hpp:208
static Magnetostatics::PermeabilityType linear_mu
Definition: ddr-magnetostatics.hpp:232
size_t nbSCDOFs() const
Returns the number of statically condensed DOFs (here, the cell magnetic field DOFs)
Definition: ddr-magnetostatics.hpp:79
Eigen::VectorXd & systemVector()
Returns the linear system right-hand side vector.
Definition: ddr-magnetostatics.hpp:118
static Magnetostatics::SolutionPotentialType constant_u
Definition: ddr-magnetostatics.hpp:193
static Magnetostatics::SolutionPotentialType trigonometric_u
Definition: ddr-magnetostatics.hpp:237
const SystemMatrixType & scMatrix() const
Returns the static condensation recovery operator.
Definition: ddr-magnetostatics.hpp:133
static Magnetostatics::PermeabilityType variable_permeability_mu
Definition: ddr-magnetostatics.hpp:311
static Magnetostatics::ForcingTermType constant_f
Definition: ddr-magnetostatics.hpp:203
size_t dimensionSpace() const
Returns the dimension of the magnetic field + potential space.
Definition: ddr-magnetostatics.hpp:73
Magnetostatics(const DDRCore &ddrcore, bool use_threads, std::ostream &output=std::cout)
Constructor.
Definition: ddr-magnetostatics.cpp:246
static Magnetostatics::SolutionCurlType constant_sigma
Definition: ddr-magnetostatics.hpp:198
const double & stabilizationParameter() const
Returns the stabilization parameter.
Definition: ddr-magnetostatics.hpp:123
std::vector< double > computeNorms(const std::vector< Eigen::VectorXd > &list_dofs) const
Compute the discrete Hcurl \times Hdiv norm of a family of vectors representing the dofs.
Definition: ddr-magnetostatics.cpp:451
static Magnetostatics::PermeabilityType trigonometric_mu
Definition: ddr-magnetostatics.hpp:264
SystemMatrixType & systemMatrix()
Returns the linear system matrix.
Definition: ddr-magnetostatics.hpp:108
std::function< Eigen::Vector3d(const Eigen::Vector3d &)> SolutionCurlType
Definition: ddr-magnetostatics.hpp:54
IntegralWeight PermeabilityType
Definition: ddr-magnetostatics.hpp:55
size_t sizeSystem() const
Returns the size of the statically condensed system.
Definition: ddr-magnetostatics.hpp:85
static Magnetostatics::SolutionCurlType variable_permeability_sigma
Definition: ddr-magnetostatics.hpp:279
Eigen::VectorXd & scVector()
Returns the static condensation rhs.
Definition: ddr-magnetostatics.hpp:138
void assembleLinearSystem(const ForcingTermType &f, const PermeabilityType &mu, const SolutionPotentialType &u)
Assemble the global system
Definition: ddr-magnetostatics.cpp:271
std::function< Eigen::Vector3d(const Eigen::Vector3d &)> SolutionPotentialType
Definition: ddr-magnetostatics.hpp:53
std::function< Eigen::Vector3d(const Eigen::Vector3d &)> ForcingTermType
Definition: ddr-magnetostatics.hpp:52
static Magnetostatics::SolutionPotentialType variable_permeability_u
Definition: ddr-magnetostatics.hpp:270
static Magnetostatics::ForcingTermType trigonometric_f
Definition: ddr-magnetostatics.hpp:255
static Magnetostatics::ForcingTermType linear_f
Definition: ddr-magnetostatics.hpp:227
const SystemMatrixType & systemMatrix() const
Returns the linear system matrix.
Definition: ddr-magnetostatics.hpp:103
static Magnetostatics::ForcingTermType variable_permeability_f
Definition: ddr-magnetostatics.hpp:289
bool use_threads
Definition: HHO_DiffAdvecReac.hpp:47
std::size_t n_cells() const
number of cells in the mesh.
Definition: MeshND.hpp:60
Definition: ddr-magnetostatics.hpp:40
MeshND::Cell< 2 > Cell
Definition: Mesh2D.hpp:13
Structure for weights (scalar, at the moment) in integral.
Definition: integralweight.hpp:36
Structure to store information for, and perform, local static condensation.
Definition: local_static_condensation.hpp:25
Assemble a magnetostatic problem.
Definition: ddr-magnetostatics.hpp:49