12#include <boost/math/constants/constants.hpp>
14#include <Eigen/Sparse>
15#include <unsupported/Eigen/SparseExtra>
93 typedef std::function<Eigen::Vector3d(
const Eigen::Vector3d &)>
VelocityType;
94 typedef std::function<Eigen::Vector3d(
const Eigen::Vector3d &)>
VorticityType;
104 std::ostream &
output = std::cout
129 const Eigen::VectorXd &
Xn,
135 const std::vector<Eigen::VectorXd> &
locRHS
142 const double &
relax,
148 const std::vector<Eigen::VectorXd> &
list_dofs
153 const Eigen::VectorXd &
v,
162 const Eigen::VectorXd & u,
180 return m_nDOFs_dir_edge_u;
186 return m_nDOFs_dir_face_u;
192 return m_nDOFs_dir_edge_u + m_nDOFs_dir_face_u;
198 return m_nDOFs_dir_vertex_p;
204 return m_nDOFs_dir_edge_p;
210 return m_nDOFs_dir_face_p;
216 return m_nDOFs_dir_vertex_p + m_nDOFs_dir_edge_p + m_nDOFs_dir_face_p;
223 return m_nloc_sc_u.sum();
229 return m_nloc_sc_p.sum();
253 return m_nUKN_lambda;
338 return m_rhs_source_naturalBC;
376 std::tuple<Eigen::MatrixXd, Eigen::MatrixXd, Eigen::VectorXd, Eigen::MatrixXd>
377 _compute_linear_contributions(
384 Eigen::MatrixXd _compute_Stokes_matrix(
389 std::pair<Eigen::MatrixXd, Eigen::VectorXd>
390 _compute_jacobian_rhs(
392 const Eigen::VectorXd &
Xn,
400 void _assemble_local_contribution(
402 const std::pair<Eigen::MatrixXd, Eigen::VectorXd> &
lsT,
403 std::list<Eigen::Triplet<double> > &
A1,
404 Eigen::VectorXd &
b1,
405 std::list<Eigen::Triplet<double> > &
A2,
412 std::ostream & m_output;
417 const Eigen::VectorXi m_nloc_sc_u;
418 const Eigen::VectorXi m_nloc_sc_p;
422 size_t m_nDOFs_dir_edge_u;
423 size_t m_nDOFs_dir_face_u;
424 size_t m_nDOFs_dir_vertex_p;
425 size_t m_nDOFs_dir_edge_p;
426 size_t m_nDOFs_dir_face_p;
427 size_t m_nUKN_lambda;
428 std::vector<std::pair<size_t,size_t>> m_locSCUKN;
429 std::vector<std::pair<size_t,size_t>> m_locGLUKN;
430 Eigen::VectorXi m_DOFtoSCUKN;
431 Eigen::VectorXi m_DOFtoGLUKN;
437 double m_reynolds = 1.;
440 std::vector<Eigen::MatrixXd> m_CTuCTu;
441 std::vector<Eigen::MatrixXd> m_PTuGTp;
442 std::vector<Eigen::VectorXd> m_rhs_source_naturalBC;
443 std::vector<Eigen::MatrixXd> m_massT;
444 bool m_linear_computed;
450 Eigen::VectorXd m_sc_b;
458 static const double PI = boost::math::constants::pi<double>();
474 return Eigen::Vector3d(
475 0.5 * sin(2. *
PI * x(0)) * cos(2. *
PI * x(1)) * cos(2. *
PI * x(2)),
476 0.5 * cos(2. *
PI * x(0)) * sin(2. *
PI * x(1)) * cos(2. *
PI * x(2)),
477 -cos(2. *
PI * x(0)) * cos(2. *
PI * x(1)) * sin(2. *
PI * x(2))
483 return 3. *
PI * Eigen::Vector3d(
484 cos(2. *
PI * x(0)) * sin(2. *
PI * x(1)) * sin(2. *
PI * x(2)),
485 -sin(2. *
PI * x(0)) * cos(2. *
PI * x(1)) * sin(2. *
PI * x(2)),
498 cos(2. *
PI * x(0)) * sin(2. *
PI * x(1)) * sin(2. *
PI * x(2)),
499 sin(2. *
PI * x(0)) * cos(2. *
PI * x(1)) * sin(2. *
PI * x(2)),
500 sin(2. *
PI * x(0)) * sin(2. *
PI * x(1)) * cos(2. *
PI * x(2))
506 return Eigen::Vector3d (3.0*
PI*sin(2*
PI*x.x())*pow(sin(2*
PI*x.z()), 2)*cos(2*
PI*x.x())*pow(cos(2*
PI*x.y()), 2),
507 3.0*
PI*sin(2*
PI*x.y())*pow(sin(2*
PI*x.z()), 2)*pow(cos(2*
PI*x.x()), 2)*cos(2*
PI*x.y()),
508 1.5*
PI*pow(sin(2*
PI*x.x()), 2)*sin(2*
PI*x.z())*pow(cos(2*
PI*x.y()), 2)*cos(2*
PI*x.z()) + 1.5*
PI*pow(sin(2*
PI*x.y()), 2)*sin(2*
PI*x.z())*pow(cos(2*
PI*x.x()), 2)*cos(2*
PI*x.z())
514 return (1./
reynolds) * 6. * std::pow(
PI, 2) * Eigen::Vector3d(
515 sin(2. *
PI * x(0)) * cos(2. *
PI * x(1)) * cos(2. *
PI * x(2)),
516 cos(2. *
PI * x(0)) * sin(2. *
PI * x(1)) * cos(2. *
PI * x(2)),
517 -2. * cos(2. *
PI * x(0)) * cos(2. *
PI * x(1)) * sin(2. *
PI * x(2))
528 constant_u = [](
const Eigen::Vector3d & x) -> Eigen::Vector3d {
529 return Eigen::Vector3d(1., 1., 1.);
534 return Eigen::Vector3d::Zero();
539 return Eigen::Vector3d::Zero();
549 return Eigen::Vector3d::Zero();
553 constant_f = [](
const Eigen::Vector3d & x) -> Eigen::Vector3d {
554 return Eigen::Vector3d::Zero();
562 linear_u = [](
const Eigen::Vector3d & x) -> Eigen::Vector3d {
563 return 1
e3*Eigen::Vector3d(x(0), -x(1), 0.);
568 return Eigen::Vector3d::Zero();
573 return Eigen::Vector3d::Zero();
577 linear_p = [](
const Eigen::Vector3d & x) ->
double {
587 linear_f = [](
const Eigen::Vector3d & x) -> Eigen::Vector3d {
597 vertical_u = [](
const Eigen::Vector3d & x) -> Eigen::Vector3d {
598 return scal_u * Eigen::Vector3d( cos(
PI*x.y()), cos(
PI*x.x()), 1.);
603 return scal_u * Eigen::Vector3d(0, 0, -
PI*sin(
PI*x.x()) +
PI*sin(
PI*x.y()) );
614 return std::pow(
scal_u, 2)
616 -(-
PI*sin(
PI*x.x()) +
PI*sin(
PI*x.y()))*cos(
PI*x.x()),
617 (-
PI*sin(
PI*x.x()) +
PI*sin(
PI*x.y()))*cos(
PI*x.y()),
623 vertical_f = [](
const Eigen::Vector3d & x) -> Eigen::Vector3d {
641 return Eigen::Vector3d::Zero();
652 return Eigen::Vector3d::Zero();
657 return Eigen::Vector3d::Zero();
662 return Eigen::Vector3d::Zero();
const Hull lower_bottom_corner_x_one({VectorRd(1., 0., 0.), VectorRd(1.,.25, 0.), VectorRd(1.,.25,.25), VectorRd(1., 0.,.25)}, VectorRd(1., 0., 0.))
The BoundaryConditions class provides definition of boundary conditions.
Definition BoundaryConditions.hpp:129
Construct all polynomial spaces for the DDR sequence.
Definition ddrcore.hpp:62
This structure is a wrapper to allow a given code to select various linear solvers.
Definition linearsolver.hpp:106
Discrete Serendipity Hcurl space: local operators, L2 product and global interpolator.
Definition sxcurl.hpp:21
Discrete Serendipity Hdiv space: local operators, L2 product and global interpolator.
Definition sxdiv.hpp:18
Discrete Serendipity Hgrad space: local operators, L2 product and global interpolator.
Definition sxgrad.hpp:20
Construct all polynomial spaces for the DDR sequence.
Definition serendipity_problem.hpp:40
@ Matrix
Definition basis.hpp:67
size_t dimension() const
Returns the dimension of the global space (all DOFs for all geometric entities)
Definition variabledofspace.hpp:158
static const double PI
Definition ddr-magnetostatics.hpp:187
static Magnetostatics::SolutionPotentialType linear_u
Definition ddr-magnetostatics.hpp:214
static Magnetostatics::SolutionPotentialType constant_u
Definition ddr-magnetostatics.hpp:194
static Magnetostatics::SolutionPotentialType trigonometric_u
Definition ddr-magnetostatics.hpp:238
static Magnetostatics::ForcingTermType constant_f
Definition ddr-magnetostatics.hpp:204
static Magnetostatics::ForcingTermType trigonometric_f
Definition ddr-magnetostatics.hpp:256
static Magnetostatics::ForcingTermType linear_f
Definition ddr-magnetostatics.hpp:228
static NavierStokes::PressureType vertical_p
Definition sddr-navier-stokes.hpp:607
static NavierStokes::ForcingTermType vertical_curl_u_cross_u
Definition sddr-navier-stokes.hpp:613
static NavierStokes::PressureType linear_p
Definition sddr-navier-stokes.hpp:577
static NavierStokes::PressureGradientType linear_grad_p
Definition sddr-navier-stokes.hpp:582
static NavierStokes::ForcingTermType linear_curl_u_cross_u
Definition sddr-navier-stokes.hpp:572
static NavierStokes::VorticityType constant_curl_u
Definition sddr-navier-stokes.hpp:533
static NavierStokes::ForcingTermType trigonometric_curl_u_cross_u
Definition sddr-navier-stokes.hpp:505
double navier_scaling
Definition sddr-navier-stokes.hpp:466
static NavierStokes::ForcingTermType vertical_f
Definition sddr-navier-stokes.hpp:623
static NavierStokes::VorticityType pressflux_curl_u
Definition sddr-navier-stokes.hpp:640
constexpr double scal_u
Definition sddr-navier-stokes.hpp:595
static NavierStokes::VelocityType pressflux_u
Definition sddr-navier-stokes.hpp:635
static NavierStokes::VorticityType trigonometric_curl_u
Definition sddr-navier-stokes.hpp:482
static NavierStokes::PressureGradientType trigonometric_grad_p
Definition sddr-navier-stokes.hpp:496
static NavierStokes::PressureType trigonometric_p
Definition sddr-navier-stokes.hpp:491
static NavierStokes::PressureType constant_p
Definition sddr-navier-stokes.hpp:543
static NavierStokes::VorticityType linear_curl_u
Definition sddr-navier-stokes.hpp:567
static NavierStokes::VorticityType vertical_curl_u
Definition sddr-navier-stokes.hpp:602
double reynolds
Definition sddr-navier-stokes.hpp:465
static NavierStokes::ForcingTermType pressflux_f
Definition sddr-navier-stokes.hpp:661
static NavierStokes::PressureGradientType vertical_grad_p
Definition sddr-navier-stokes.hpp:610
static NavierStokes::VelocityType vertical_u
Definition sddr-navier-stokes.hpp:597
static NavierStokes::PressureType pressflux_p
Definition sddr-navier-stokes.hpp:645
static NavierStokes::PressureGradientType constant_grad_p
Definition sddr-navier-stokes.hpp:548
static NavierStokes::ForcingTermType pressflux_curl_u_cross_u
Definition sddr-navier-stokes.hpp:656
static NavierStokes::PressureGradientType pressflux_grad_p
Definition sddr-navier-stokes.hpp:651
double pressure_scaling
Definition sddr-navier-stokes.hpp:464
static NavierStokes::ForcingTermType constant_curl_u_cross_u
Definition sddr-navier-stokes.hpp:538
double grad_p
Norm of grad of pressure.
Definition sddr-navier-stokes.hpp:81
double hgrad_p
Hgrad norm of p.
Definition sddr-navier-stokes.hpp:83
double hcurl_u
Hcurl norm of u.
Definition sddr-navier-stokes.hpp:82
double u
Norm of velocity.
Definition sddr-navier-stokes.hpp:78
double p
Norm of pressure.
Definition sddr-navier-stokes.hpp:80
double curl_u
Norm of curl of velocity (vorticity)
Definition sddr-navier-stokes.hpp:79
bool use_threads
Definition HHO_DiffAdvecReac.hpp:47
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
Class to assemble and solve a Navier-Stokes problem.
Definition sddr-navier-stokes.hpp:89
void computeLinearComponents(const ForcingTermType &f, const VelocityType &u, const VorticityType &omega, const double &reynolds)
Create the linear part of the system ( curl-curl velocity matrix, vel-grad pressure matrix,...
Definition sddr-navier-stokes.cpp:680
std::function< Eigen::Vector3d(const Eigen::Vector3d &)> PressureGradientType
Definition sddr-navier-stokes.hpp:96
const double & stabilizationParameter() const
Returns the stabilization parameter.
Definition sddr-navier-stokes.hpp:346
size_t nDOFs_dir_edge_u() const
Number of DOFs on Dirichlet edges for the velocity.
Definition sddr-navier-stokes.hpp:178
Eigen::VectorXd newtonIncrement(LinearSolver< SystemMatrixType > &solver, const double &navier_scaling, const double &relax, double &norm_dX)
Solve the linear system and computes the Newton increment (taking into account relaxation)
Definition sddr-navier-stokes.cpp:832
const SystemMatrixType & systemMatrix() const
Returns the linear system matrix.
Definition sddr-navier-stokes.hpp:307
size_t nDOFs_dir_u() const
Total number of Dirichlet DOFs for the velocity.
Definition sddr-navier-stokes.hpp:190
size_t nGLUKN_p() const
Number of globally coupled unknowns for the pressure (statically condensed unknowns removed)
Definition sddr-navier-stokes.hpp:269
const Eigen::VectorXd & systemVector() const
Returns the linear system right-hand side vector.
Definition sddr-navier-stokes.hpp:317
size_t nUKN_p() const
Number of pressure unknowns (statically condensed and global)
Definition sddr-navier-stokes.hpp:245
std::function< Eigen::Vector3d(const Eigen::Vector3d &)> VelocityType
Definition sddr-navier-stokes.hpp:93
const SystemMatrixType & scMatrix() const
Returns the static condensation recovery operator.
Definition sddr-navier-stokes.hpp:327
const SXDiv & sxDiv() const
Returns the space XDiv.
Definition sddr-navier-stokes.hpp:297
std::function< double(const Eigen::Vector3d &)> PressureType
Definition sddr-navier-stokes.hpp:95
std::pair< StokesNorms, StokesNorms > computeContinuousErrorsNorms(const Eigen::VectorXd &v, const VelocityType &u, const VorticityType &curl_u, const PressureType &p, const PressureGradientType &grad_p) const
Compute the continuous Hcurl errors in u and Hgrad error in p (1st component), and same with continuo...
Definition sddr-navier-stokes.cpp:1141
SystemMatrixType & systemMatrix()
Returns the linear system matrix.
Definition sddr-navier-stokes.hpp:312
size_t nDOFs_dir_p() const
Total number of Dirichlet DOFs for the pressure.
Definition sddr-navier-stokes.hpp:214
size_t nGLUKN_u() const
Number of globally coupled unknowns for the velocity (statically condensed unknowns removed)
Definition sddr-navier-stokes.hpp:263
std::vector< Eigen::VectorXd > & rhsSourceNaturalBC()
Returns local RHS for Stokes problem (useful to compute relative residual)
Definition sddr-navier-stokes.hpp:337
size_t nDOFs_dir_vertex_p() const
Number of DOFs on Dirichlet vertices for the pressure.
Definition sddr-navier-stokes.hpp:196
IntegralWeight ViscosityType
Definition sddr-navier-stokes.hpp:97
size_t nUKN_lambda() const
Number of Lagrange multiplier unknowns (1 if BC=N to impose \int p=0, 0 otherwise)
Definition sddr-navier-stokes.hpp:251
size_t nSCUKN_u() const
Number of statically condensed unknowns (velocity)
Definition sddr-navier-stokes.hpp:221
std::vector< StokesNorms > computeStokesNorms(const std::vector< Eigen::VectorXd > &list_dofs) const
Compute the discrete L2 norms, for a family of Eigen::VectorXd representing velocities & pressures,...
Definition sddr-navier-stokes.cpp:1085
size_t nGLUKN() const
Number of globally coupled unknowns for velocity, pressure, Lagrange multiplier.
Definition sddr-navier-stokes.hpp:275
size_t nDOFs_dir_face_p() const
Number of DOFs on Dirichlet faces for the pressure.
Definition sddr-navier-stokes.hpp:208
size_t nDOFs_dir_face_u() const
Number of DOFs on Dirichlet faces for the velocity.
Definition sddr-navier-stokes.hpp:184
const SXGrad & sxGrad() const
Returns the space SXGrad.
Definition sddr-navier-stokes.hpp:285
size_t nUKN_u() const
Number of velocity unknowns (statically condensed and global, but no Dirichlet)
Definition sddr-navier-stokes.hpp:239
size_t nDOFs_up() const
Number of DOFs for velocity and pressure.
Definition sddr-navier-stokes.hpp:171
Eigen::SparseMatrix< double > SystemMatrixType
Definition sddr-navier-stokes.hpp:90
double & stabilizationParameter()
Returns the stabilization parameter.
Definition sddr-navier-stokes.hpp:351
double assembleLinearSystem(const Eigen::VectorXd &Xn, const double &reac)
Assemble the global system at each Newton iteration, and returns the residual (norm of F(Xn)-b)
Definition sddr-navier-stokes.cpp:860
Eigen::VectorXd vectorDirBC(const VelocityType &u, const PressureType &p)
Create a vector of Dirichlet boundary conditions.
Definition sddr-navier-stokes.cpp:639
size_t nSCUKN() const
Number of statically condensed unknowns (both velocity and pressure)
Definition sddr-navier-stokes.hpp:233
double computeFlux(const Eigen::VectorXd &u, const Hull &surface) const
Compute the flux (based on the polynomial reconstructions) for a discrete velocity across a flat conv...
Definition sddr-navier-stokes.cpp:1236
Eigen::VectorXd & systemVector()
Returns the linear system right-hand side vector.
Definition sddr-navier-stokes.hpp:322
size_t nSCUKN_p() const
Number of statically condensed unknowns (pressure)
Definition sddr-navier-stokes.hpp:227
const bool & iterativeSolver() const
Returns the selection of iterative solver.
Definition sddr-navier-stokes.hpp:356
const SXCurl & sxCurl() const
Returns the space SXCurl.
Definition sddr-navier-stokes.hpp:291
Eigen::VectorXd & scVector()
Returns the static condensation rhs.
Definition sddr-navier-stokes.hpp:332
double normGlobalRHS(const std::vector< Eigen::VectorXd > &locRHS)
Computes the norm of a vector (in Xcurl-Xgrad space) from the element-wise contributions to that vect...
Definition sddr-navier-stokes.cpp:1055
size_t nDOFs_dir_edge_p() const
Number of DOFs on Dirichlet edges for the pressure.
Definition sddr-navier-stokes.hpp:202
size_t nUKN_uplambda() const
Number of unknowns (velocity-pressure-Lagrange multiplier, including statically condensed and globall...
Definition sddr-navier-stokes.hpp:257
std::function< Eigen::Vector3d(const Eigen::Vector3d &)> VorticityType
Definition sddr-navier-stokes.hpp:94
double & Reynolds()
Returns the reynolds number.
Definition sddr-navier-stokes.hpp:366
bool & iterativeSolver()
Returns the selection of iterative solver.
Definition sddr-navier-stokes.hpp:361
std::function< Eigen::Vector3d(const Eigen::Vector3d &)> ForcingTermType
Definition sddr-navier-stokes.hpp:92
Structure to store norm components (for velocity, its curl, pressure, and its gradient),...
Definition sddr-navier-stokes.hpp:62
StokesNorms()
Definition sddr-navier-stokes.hpp:76
StokesNorms(double norm_u, double norm_curl_u, double norm_p, double norm_grad_p)
Constructor.
Definition sddr-navier-stokes.hpp:64
Structure to define a flat convex hull (nodes and normal) and check if a mesh entity is inside.
Definition BoundaryConditions.hpp:84
bool is_in(const VectorRd &x) const
Check if a point is in the convex hull.
Definition BoundaryConditions.cpp:26