Implementation of the DDR scheme for the Kirchoff-Love plate problem.
More...
Implementation of the DDR scheme for the Kirchoff-Love plate problem.
◆ ConstitutiveLawType
◆ DeflectionType
◆ ForcingTermType
◆ GradientDeflectionType
◆ MomentTensorEdgeDerivativeType
◆ MomentTensorType
◆ SystemMatrixType
◆ assembleLinearSystem()
Assemble the global system.
- Parameters
-
f | Forcing term |
u | Deflection (for BC) |
grad_u | Gradient of deflection (for BC) |
◆ computeNorm()
double KirchhoffLove::computeNorm |
( |
const Eigen::VectorXd & |
v | ) |
const |
Compute the discrete norm.
- Parameters
-
◆ dimensionSpace()
size_t HArDCore2D::KirchhoffLove::dimensionSpace |
( |
| ) |
const |
|
inline |
Returns the dimension of the moment + deflection space.
◆ interpolateDeflection()
Eigen::VectorXd KirchhoffLove::interpolateDeflection |
( |
const DeflectionType & |
u, |
|
|
int |
deg_quad = -1 |
|
) |
| const |
Interpolate deflection.
- Parameters
-
u | The function to interpolate |
deg_quad | The degree of the quadrature rules (equal to \(2(k+1)\) with \(k\) equal to the degree of the complex by default) |
◆ KirchhoffLove()
KirchhoffLove::KirchhoffLove |
( |
const PlatesCore & |
platescore, |
|
|
const ConstitutiveLawType & |
law, |
|
|
bool |
use_threads, |
|
|
std::ostream & |
output = std::cout |
|
) |
| |
Constructor.
- Parameters
-
platescore | Core for the DDR space sequence |
law | Constitutive law: law(sigma)+hess u = 0 |
use_threads | True for parallel execution, false for sequential execution |
output | Output stream to print status messages |
◆ nbSCDOFs()
size_t HArDCore2D::KirchhoffLove::nbSCDOFs |
( |
| ) |
const |
|
inline |
Returns the number of statically condensed DOFs (here, the cell moments DOFs)
◆ polykm2Th()
Returns the space \(\mathbb{P}^{k-2}(\mathcal{T}_h)\).
◆ scMatrix()
Returns the static condensation recovery operator.
◆ scVector()
Eigen::VectorXd & HArDCore2D::KirchhoffLove::scVector |
( |
| ) |
|
|
inline |
Returns the static condensation rhs.
◆ sizeSystem()
size_t HArDCore2D::KirchhoffLove::sizeSystem |
( |
| ) |
const |
|
inline |
Returns the size of the statically condensed system.
◆ stabilizationParameter() [1/2]
double & HArDCore2D::KirchhoffLove::stabilizationParameter |
( |
| ) |
|
|
inline |
Returns the stabilization parameter.
◆ stabilizationParameter() [2/2]
const double & HArDCore2D::KirchhoffLove::stabilizationParameter |
( |
| ) |
const |
|
inline |
Returns the stabilization parameter.
◆ systemMatrix() [1/2]
Returns the linear system matrix.
◆ systemMatrix() [2/2]
Returns the linear system matrix.
◆ systemVector() [1/2]
Eigen::VectorXd & HArDCore2D::KirchhoffLove::systemVector |
( |
| ) |
|
|
inline |
Returns the linear system right-hand side vector.
◆ systemVector() [2/2]
const Eigen::VectorXd & HArDCore2D::KirchhoffLove::systemVector |
( |
| ) |
const |
|
inline |
Returns the linear system right-hand side vector.
◆ xDivDiv()
const XDivDiv & HArDCore2D::KirchhoffLove::xDivDiv |
( |
| ) |
const |
|
inline |
◆ biquartic_divdiv_hess_u
Initial value:= [](
const VectorRd &
x) ->
double {
return 24*pow(
x(0), 2)*pow(
x(0) - 1, 2) + 32*
x(0)*
x(1)*(
x(0) - 1)*(
x(1) - 1) + 8*
x(0)*
x(1)*(
x(0) - 1)*(4*
x(1) - 2) + 8*
x(0)*
x(1)*(4*
x(0) - 2)*(
x(1) - 1) + 8*
x(0)*
x(1)*(
x(0)*
x(1) +
x(0)*(
x(1) - 1) +
x(1)*(
x(0) - 1) + (
x(0) - 1)*(
x(1) - 1)) + 8*
x(0)*(
x(0) - 1)*(
x(1) - 1)*(4*
x(1) - 2) + 8*
x(0)*(
x(1) - 1)*(
x(0)*
x(1) +
x(0)*(
x(1) - 1) +
x(1)*(
x(0) - 1) + (
x(0) - 1)*(
x(1) - 1)) + 24*pow(
x(1), 2)*pow(
x(1) - 1, 2) + 8*
x(1)*(
x(0) - 1)*(4*
x(0) - 2)*(
x(1) - 1) + 8*
x(1)*(
x(0) - 1)*(
x(0)*
x(1) +
x(0)*(
x(1) - 1) +
x(1)*(
x(0) - 1) + (
x(0) - 1)*(
x(1) - 1)) + 2*(4*
x(0) - 4)*(
x(1) - 1)*(
x(0)*
x(1) +
x(0)*(
x(1) - 1) +
x(1)*(
x(0) - 1) + (
x(0) - 1)*(
x(1) - 1));
}
Create grid points x
Definition generate_cartesian_mesh.m:22
◆ biquartic_dx_hess_u
Initial value:= [](
const VectorRd &
x) -> Eigen::Matrix2d {
Eigen::Matrix2d M;
M.row(0) << 2*pow(
x(1), 2)*(12*
x(0) - 6)*pow(
x(1) - 1, 2), 4*
x(0)*
x(1)*(
x(0) - 1)*(
x(1) - 1)*(4*
x(1) - 2) + 4*
x(0)*
x(1)*(
x(1) - 1)*(
x(0)*
x(1) +
x(0)*(
x(1) - 1) +
x(1)*(
x(0) - 1) + (
x(0) - 1)*(
x(1) - 1)) + 4*
x(1)*(
x(0) - 1)*(
x(1) - 1)*(
x(0)*
x(1) +
x(0)*(
x(1) - 1) +
x(1)*(
x(0) - 1) + (
x(0) - 1)*(
x(1) - 1));
M.row(1) << 4*
x(0)*
x(1)*(
x(0) - 1)*(
x(1) - 1)*(4*
x(1) - 2) + 4*
x(0)*
x(1)*(
x(1) - 1)*(
x(0)*
x(1) +
x(0)*(
x(1) - 1) +
x(1)*(
x(0) - 1) + (
x(0) - 1)*(
x(1) - 1)) + 4*
x(1)*(
x(0) - 1)*(
x(1) - 1)*(
x(0)*
x(1) +
x(0)*(
x(1) - 1) +
x(1)*(
x(0) - 1) + (
x(0) - 1)*(
x(1) - 1)), 2*pow(
x(0), 2)*(2*
x(0) - 2)*(pow(
x(1), 2) + 4*
x(1)*(
x(1) - 1) + pow(
x(1) - 1, 2)) + 4*
x(0)*pow(
x(0) - 1, 2)*(pow(
x(1), 2) + 4*
x(1)*(
x(1) - 1) + pow(
x(1) - 1, 2));
return M;
}
◆ biquartic_dy_hess_u
Initial value:= [](
const VectorRd &
x) -> Eigen::Matrix2d {
Eigen::Matrix2d M;
M.row(0) << 2*pow(
x(1), 2)*(2*
x(1) - 2)*(pow(
x(0), 2) + 4*
x(0)*(
x(0) - 1) + pow(
x(0) - 1, 2)) + 4*
x(1)*pow(
x(1) - 1, 2)*(pow(
x(0), 2) + 4*
x(0)*(
x(0) - 1) + pow(
x(0) - 1, 2)), 4*
x(0)*
x(1)*(
x(0) - 1)*(4*
x(0) - 2)*(
x(1) - 1) + 4*
x(0)*
x(1)*(
x(0) - 1)*(
x(0)*
x(1) +
x(0)*(
x(1) - 1) +
x(1)*(
x(0) - 1) + (
x(0) - 1)*(
x(1) - 1)) + 4*
x(0)*(
x(0) - 1)*(
x(1) - 1)*(
x(0)*
x(1) +
x(0)*(
x(1) - 1) +
x(1)*(
x(0) - 1) + (
x(0) - 1)*(
x(1) - 1));
M.row(1) << 4*
x(0)*
x(1)*(
x(0) - 1)*(4*
x(0) - 2)*(
x(1) - 1) + 4*
x(0)*
x(1)*(
x(0) - 1)*(
x(0)*
x(1) +
x(0)*(
x(1) - 1) +
x(1)*(
x(0) - 1) + (
x(0) - 1)*(
x(1) - 1)) + 4*
x(0)*(
x(0) - 1)*(
x(1) - 1)*(
x(0)*
x(1) +
x(0)*(
x(1) - 1) +
x(1)*(
x(0) - 1) + (
x(0) - 1)*(
x(1) - 1)), 2*pow(
x(0), 2)*pow(
x(0) - 1, 2)*(12*
x(1) - 6);
return M;
}
◆ biquartic_grad_Delta_u
Initial value:= [](
const VectorRd &
x) -> VectorRd {
Eigen::Vector2d G {
};
return G;
}
static KirchhoffLove::MomentTensorType biquartic_dx_hess_u
Definition ddr-klplate.hpp:364
static KirchhoffLove::MomentTensorType biquartic_dy_hess_u
Definition ddr-klplate.hpp:374
◆ biquartic_grad_u
Initial value:= [](
const VectorRd &
x) -> VectorRd {
return VectorRd(pow(
x(0), 2)*pow(
x(1), 2)*pow(1 -
x(1), 2)*(2*
x(0) - 2) + 2*
x(0)*pow(
x(1), 2)*pow(1 -
x(0), 2)*pow(1 -
x(1), 2), pow(
x(0), 2)*pow(
x(1), 2)*pow(1 -
x(0), 2)*(2*
x(1) - 2) + 2*pow(
x(0), 2)*
x(1)*pow(1 -
x(0), 2)*pow(1 -
x(1), 2));
}
◆ biquartic_hess_u
Initial value:= [](
const VectorRd &
x) -> Eigen::Matrix2d {
Eigen::Matrix2d M;
M.row(0) << 2*pow(
x(1), 2)*pow(
x(1) - 1, 2)*(pow(
x(0), 2) + 4*
x(0)*(
x(0) - 1) + pow(
x(0) - 1, 2)), 4*
x(0)*
x(1)*(
x(0) - 1)*(
x(1) - 1)*(
x(0)*
x(1) +
x(0)*(
x(1) - 1) +
x(1)*(
x(0) - 1) + (
x(0) - 1)*(
x(1) - 1));
M.row(1) << 4*
x(0)*
x(1)*(
x(0) - 1)*(
x(1) - 1)*(
x(0)*
x(1) +
x(0)*(
x(1) - 1) +
x(1)*(
x(0) - 1) + (
x(0) - 1)*(
x(1) - 1)), 2*pow(
x(0), 2)*pow(
x(0) - 1, 2)*(pow(
x(1), 2) + 4*
x(1)*(
x(1) - 1) + pow(
x(1) - 1, 2));
return M;
}
◆ biquartic_hess_u_DE
Initial value:= [](
const VectorRd &
x,
const Edge & E) ->
double {
Eigen::Vector2d tE = E.tangent();
Eigen::Vector2d nE = E.normal();
Eigen::Vector2d div_hess {
};
return (dtE_hess*nE).dot(tE) + div_hess.dot(nE);
}
◆ biquartic_u
Initial value:= [](
const VectorRd &
x) ->
double {
return pow(
x(0),2)*pow(1.-
x(0),2)*pow(
x(1),2)*pow(1.-
x(1),2);
}
◆ PI
const double HArDCore2D::PI = boost::math::constants::pi<double>() |
|
static |
◆ quartic_divdiv_hess_u
Initial value:= [](
const VectorRd &
x) ->
double {
return 48.;
}
◆ quartic_dx_hess_u
Initial value:= [](
const VectorRd &
x) -> Eigen::Matrix2d {
Eigen::Matrix2d M;
M.row(0) << 24*
x(0) - 12, 0;
M.row(1) << 0., 0.;
return M;
}
◆ quartic_dy_hess_u
Initial value:= [](
const VectorRd &
x) -> Eigen::Matrix2d {
Eigen::Matrix2d M;
M.row(0) << 0., 0.;
M.row(1) << 0., 24*
x(1) - 12;
return M;
}
◆ quartic_grad_Delta_u
Initial value:= [](
const VectorRd &
x) -> VectorRd {
Eigen::Vector2d G {
};
return G;
}
static KirchhoffLove::MomentTensorType quartic_dx_hess_u
Definition ddr-klplate.hpp:291
static KirchhoffLove::MomentTensorType quartic_dy_hess_u
Definition ddr-klplate.hpp:301
◆ quartic_grad_u
Initial value:= [](
const VectorRd &
x) -> VectorRd {
return VectorRd(pow(
x(0), 2)*(2*
x(0) - 2) + 2*
x(0)*pow(1 -
x(0), 2), pow(
x(1), 2)*(2*
x(1) - 2) + 2*
x(1)*pow(1 -
x(1), 2));
}
◆ quartic_hess_u
Initial value:= [](
const VectorRd &
x) -> Eigen::Matrix2d {
Eigen::Matrix2d M;
M <<
2.*(pow(
x(0),2)+4.*
x(0)*(
x(0)-1.)+pow(1.-
x(0),2)), 0.,
0., 2.*(pow(
x(1),2)+4.*
x(1)*(
x(1)-1.)+pow(1.-
x(1),2));
return M;
}
◆ quartic_hess_u_DE
Initial value:= [](
const VectorRd &
x,
const Edge & E) ->
double {
Eigen::Vector2d tE = E.tangent();
Eigen::Vector2d nE = E.normal();
Eigen::Vector2d div_hess {
};
return (dtE_hess*nE).dot(tE) + div_hess.dot(nE);
}
◆ quartic_u
Initial value:= [](
const VectorRd &
x) ->
double {
return pow(
x(0),2)*pow(1.-
x(0),2) + pow(
x(1),2)*pow(1.-
x(1),2);
}
◆ trigonometric_divdiv_hess_u
Initial value:= [](
const VectorRd &
x) ->
double {
return 4.*pow(
PI, 4)*sin(
PI*
x(0))*sin(
PI*
x(1));
}
static const double PI
Definition ns-solutions.cpp:8
◆ trigonometric_dx_hess_u
Initial value:= [](
const VectorRd &
x) -> Eigen::Matrix2d {
Eigen::Matrix2d M;
M.row(0) << -cos(
PI*
x(0))*sin(
PI*
x(1)), -sin(
PI*
x(0))*cos(
PI*
x(1));
M.row(1) << -sin(
PI*
x(0))*cos(
PI*
x(1)), -cos(
PI*
x(0))*sin(
PI*
x(1));
}
◆ trigonometric_dy_hess_u
Initial value:= [](
const VectorRd &
x) -> Eigen::Matrix2d {
Eigen::Matrix2d M;
M.row(0) << -sin(
PI*
x(0))*cos(
PI*
x(1)), -cos(
PI*
x(0))*sin(
PI*
x(1));
M.row(1) << -cos(
PI*
x(0))*sin(
PI*
x(1)), -sin(
PI*
x(0))*cos(
PI*
x(1));
}
◆ trigonometric_grad_Delta_u
Initial value:= [](
const VectorRd &
x) -> VectorRd {
Eigen::Vector2d G {
};
return G;
}
static KirchhoffLove::MomentTensorType trigonometric_dy_hess_u
Definition ddr-klplate.hpp:226
static KirchhoffLove::MomentTensorType trigonometric_dx_hess_u
Definition ddr-klplate.hpp:216
◆ trigonometric_grad_u
Initial value:= [](
const VectorRd &
x) -> VectorRd {
return PI * VectorRd(sin(
PI*
x(1))*cos(
PI*
x(0)), sin(
PI*
x(0))*cos(
PI*
x(1)));
}
◆ trigonometric_hess_u
Initial value:= [](
const VectorRd &
x) -> Eigen::Matrix2d {
Eigen::Matrix2d M;
M.row(0) << -sin(
PI*
x(0))*sin(
PI*
x(1)), cos(
PI*
x(0))*cos(
PI*
x(1));
M.row(1) << cos(
PI*
x(0))*cos(
PI*
x(1)), -sin(
PI*
x(0))*sin(
PI*
x(1));
}
◆ trigonometric_hess_u_DE
Initial value:= [](
const VectorRd &
x,
const Edge & E) ->
double {
Eigen::Vector2d tE = E.tangent();
Eigen::Vector2d nE = E.normal();
Eigen::Vector2d div_hess {
};
return (dtE_hess*nE).dot(tE) + div_hess.dot(nE);
}
◆ trigonometric_u
Initial value:= [](
const VectorRd &
x) ->
double {
return sin(
PI*
x(0))*sin(
PI*
x(1));
}