17#ifndef MAGNETOSTATICS_HPP
18#define MAGNETOSTATICS_HPP
22#include <boost/math/constants/constants.hpp>
24#include <Eigen/Sparse>
25#include <unsupported/Eigen/SparseExtra>
62 std::ostream &
output = std::cout
145 const std::vector<Eigen::VectorXd> &
list_dofs
150 std::pair<Eigen::MatrixXd, Eigen::VectorXd>
151 _compute_local_contribution(
161 void _assemble_local_contribution(
163 const std::pair<Eigen::MatrixXd, Eigen::VectorXd> &
lsT,
164 std::list<Eigen::Triplet<double> > &
A1,
165 Eigen::VectorXd &
b1,
166 std::list<Eigen::Triplet<double> > &
A2,
172 std::ostream & m_output;
175 const size_t m_nloc_sc_H;
179 Eigen::VectorXd m_sc_b;
187 static const double PI = boost::math::constants::pi<double>();
194 constant_u = [](
const Eigen::Vector3d & x) -> Eigen::Vector3d {
195 return Eigen::Vector3d(1., 2., 3.);
200 return Eigen::Vector3d::Zero();
204 constant_f = [](
const Eigen::Vector3d & x) -> Eigen::Vector3d {
205 return Eigen::Vector3d::Zero();
214 linear_u = [](
const Eigen::Vector3d & x) -> Eigen::Vector3d {
215 return Eigen::Vector3d(
224 return Eigen::Vector3d(-3., 2., 1.);
228 linear_f = [](
const Eigen::Vector3d & x) -> Eigen::Vector3d {
229 return Eigen::Vector3d::Zero();
239 return Eigen::Vector3d(
240 cos(
PI*x(0)) * sin(
PI*x(1)) * sin(
PI*x(2)),
241 -2. * sin(
PI*x(0)) * cos(
PI*x(1)) * sin(
PI*x(2)),
242 sin(
PI*x(0)) * sin(
PI*x(1)) * cos(
PI*x(2))
248 return 3. *
PI * Eigen::Vector3d(
249 sin(
PI*x(0)) * cos(
PI*x(1)) * cos(
PI*x(2)),
251 -cos(
PI*x(0)) * cos(
PI*x(1)) * sin(
PI*x(2))
257 return 3. * std::pow(
PI, 2) * Eigen::Vector3d(
258 cos(
PI*x(0)) * sin(
PI*x(1)) * sin(
PI*x(2)),
259 -2. * sin(
PI*x(0)) * cos(
PI*x(1)) * sin(
PI*x(2)),
260 sin(
PI*x(0)) * sin(
PI*x(1)) * cos(
PI*x(2))
272 return Eigen::Vector3d(
273 cos(
PI*x(0)) * sin(
PI*x(1)) * sin(
PI*x(2)),
274 -2. * sin(
PI*x(0)) * cos(
PI*x(1)) * sin(
PI*x(2)),
275 sin(
PI*x(0)) * sin(
PI*x(1)) * cos(
PI*x(2))
281 return 3 *
PI / (1. + x(0) + x(1) + x(2))
283 sin(
PI*x(0)) * cos(
PI*x(1)) * cos(
PI*x(2)),
285 -cos(
PI*x(0)) * cos(
PI*x(1)) * sin(
PI*x(2))
291 double a = 3 *
PI / std::pow(1. + x(0) + x(1) + x(2), 2);
292 double b = 3 * std::pow(
PI, 2) / (1. + x(0) + x(1) + x(2));
294 -
b * sin(
PI*x(0)) * sin(
PI*x(1)) * cos(
PI*x(2));
296 -
b * sin(
PI*x(0)) * cos(
PI*x(1)) * sin(
PI*x(2));
299 +
b * sin(
PI*x(0)) * cos(
PI*x(1)) * sin(
PI*x(2));
302 +
b * cos(
PI*x(0)) * sin(
PI*x(1)) * sin(
PI*x(2));
304 return Eigen::Vector3d(
313 [](
const Cell & T,
const Eigen::Vector3d & x) ->
double {
return 1. + x(0) + x(1) + x(2); },
314 [](
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
@ Matrix
Definition basis.hpp:67
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:187
Eigen::VectorXd & scVector()
Returns the static condensation rhs.
Definition ddr-magnetostatics.hpp:139
static Magnetostatics::SolutionPotentialType linear_u
Definition ddr-magnetostatics.hpp:214
static Magnetostatics::SolutionCurlType linear_sigma
Definition ddr-magnetostatics.hpp:223
double & stabilizationParameter()
Returns the stabilization parameter.
Definition ddr-magnetostatics.hpp:129
const double & stabilizationParameter() const
Returns the stabilization parameter.
Definition ddr-magnetostatics.hpp:124
static Magnetostatics::SolutionCurlType trigonometric_sigma
Definition ddr-magnetostatics.hpp:247
Eigen::SparseMatrix< double > SystemMatrixType
Definition ddr-magnetostatics.hpp:51
SystemMatrixType & systemMatrix()
Returns the linear system matrix.
Definition ddr-magnetostatics.hpp:109
static Magnetostatics::PermeabilityType constant_mu
Definition ddr-magnetostatics.hpp:209
static Magnetostatics::PermeabilityType linear_mu
Definition ddr-magnetostatics.hpp:233
size_t nbSCDOFs() const
Returns the number of statically condensed DOFs (here, the cell magnetic field DOFs)
Definition ddr-magnetostatics.hpp:80
static Magnetostatics::SolutionPotentialType constant_u
Definition ddr-magnetostatics.hpp:194
const XDiv & xDiv() const
Returns the space XDiv.
Definition ddr-magnetostatics.hpp:98
static Magnetostatics::SolutionPotentialType trigonometric_u
Definition ddr-magnetostatics.hpp:238
static Magnetostatics::PermeabilityType variable_permeability_mu
Definition ddr-magnetostatics.hpp:312
static Magnetostatics::ForcingTermType constant_f
Definition ddr-magnetostatics.hpp:204
const SystemMatrixType & systemMatrix() const
Returns the linear system matrix.
Definition ddr-magnetostatics.hpp:104
size_t dimensionSpace() const
Returns the dimension of the magnetic field + potential space.
Definition ddr-magnetostatics.hpp:74
static Magnetostatics::SolutionCurlType constant_sigma
Definition ddr-magnetostatics.hpp:199
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:410
static Magnetostatics::PermeabilityType trigonometric_mu
Definition ddr-magnetostatics.hpp:265
std::function< Eigen::Vector3d(const Eigen::Vector3d &)> SolutionCurlType
Definition ddr-magnetostatics.hpp:55
IntegralWeight PermeabilityType
Definition ddr-magnetostatics.hpp:56
size_t sizeSystem() const
Returns the size of the statically condensed system.
Definition ddr-magnetostatics.hpp:86
static Magnetostatics::SolutionCurlType variable_permeability_sigma
Definition ddr-magnetostatics.hpp:280
const Eigen::VectorXd & systemVector() const
Returns the linear system right-hand side vector.
Definition ddr-magnetostatics.hpp:114
const XCurl & xCurl() const
Returns the space XCurl.
Definition ddr-magnetostatics.hpp:92
Eigen::VectorXd & systemVector()
Returns the linear system right-hand side vector.
Definition ddr-magnetostatics.hpp:119
void assembleLinearSystem(const ForcingTermType &f, const PermeabilityType &mu, const SolutionPotentialType &u)
Assemble the global system
Definition ddr-magnetostatics.cpp:230
std::function< Eigen::Vector3d(const Eigen::Vector3d &)> SolutionPotentialType
Definition ddr-magnetostatics.hpp:54
const SystemMatrixType & scMatrix() const
Returns the static condensation recovery operator.
Definition ddr-magnetostatics.hpp:134
std::function< Eigen::Vector3d(const Eigen::Vector3d &)> ForcingTermType
Definition ddr-magnetostatics.hpp:53
static Magnetostatics::SolutionPotentialType variable_permeability_u
Definition ddr-magnetostatics.hpp:271
static Magnetostatics::ForcingTermType trigonometric_f
Definition ddr-magnetostatics.hpp:256
static Magnetostatics::ForcingTermType linear_f
Definition ddr-magnetostatics.hpp:228
static Magnetostatics::ForcingTermType variable_permeability_f
Definition ddr-magnetostatics.hpp:290
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:41
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:50