44 static const vec unit_tensor2{1., 1., 1., 0., 0., 0.};
59 static const vec norm_weight{1., 1., 1., 2., 2., 2.};
72 static const vec norm_weight{1., 1., 1., .5, .5, .5};
76 double mean3(
const vec&);
88 double norm(
const vec&);
96 double norm(
const vec&);
104 const vec3 g1, g2, g3;
108 Base3D(
const vec3&,
const vec3&,
const vec3&);
109 [[nodiscard]] std::tuple<vec3, vec3, vec3>
to_inverse()
const;
112 vec3
unit_norm(
const vec3&,
const vec3&);
117 mat
diff_triad(
const vec3&,
const vec3&,
const vec3&);
125 double atan2(
const vec&);
133 template<
typename T> Mat<T>
skew_symm(
const Mat<T>& R) {
134 suanpan_assert([&] {
if(R.n_elem != 3)
throw std::invalid_argument(
"need 3 element vector"); });
136 Mat<T>
S(3, 3, fill::zeros);
138 S(0, 1) = -(
S(1, 0) = R(2));
139 S(2, 0) = -(
S(0, 2) = R(1));
140 S(1, 2) = -(
S(2, 1) = R(0));
145 template<
typename T>
concept HasEval =
requires(
const T& x) { { x.eval() } -> std::convertible_to<mat>; };
153 const auto angle = arma::norm(R);
157 return {std::cos(.5 * angle), std::sin(.5 * angle) / angle * R};
161 const auto tr_r = arma::trace(R);
162 const auto max_r = arma::max(R.diag());
164 const auto q0 = .5 * std::sqrt(tr_r + 1.);
165 const auto q1 = .25 / q0 * (R(2, 1) - R(1, 2));
166 const auto q2 = .25 / q0 * (R(0, 2) - R(2, 0));
167 const auto q3 = .25 / q0 * (R(1, 0) - R(0, 1));
168 return {q0, q1, q2, q3};
171 for(
auto I = 0; I < 3; ++I)
173 const auto J = (I + 1) % 3;
174 const auto K = (J + 1) % 3;
175 vec q(3, fill::none);
176 q(I) = std::sqrt(.5 * max_r + .25 * (1. - tr_r));
177 const double q0 = .25 / q(I) * (R(
K, J) - R(J,
K));
178 q(J) = .25 / q(I) * (R(J, I) + R(I, J));
179 q(
K) = .25 / q(I) * (R(
K, I) + R(I,
K));
181 return {q0, std::move(q)};
185 throw std::invalid_argument(
"need either rotation vector or matrix");
188 template<
typename T> Col<T>
to_pseudo(
const Mat<T>& R) {
189 const Mat<T>
S = arma::real(arma::logmat(R));
191 return {
S(2, 1),
S(0, 2),
S(1, 0)};
195 double angle(
const vec&);
198 vec
rotate(
const vec&,
double);
201 double angle(
const vec&);
204 vec
rotate(
const vec&,
double);
216 template<
typename T>
T ramp(
const T in) {
return in >
T(0) ? in :
T(0); }
An Quaternion class.
Definition Quaternion.hpp:34
std::tuple< vec3, vec3, vec3 > to_inverse() const
Definition tensor.cpp:288
Definition SparseMatMAGMA.hpp:43
T ramp(const T in)
Definition tensor.h:216
bool approx_equal(T x, T y, int ulp=2)
Definition utility.h:67
vec3 unit_norm(const vec3 &, const vec3 &)
Definition tensor.cpp:294
mat to_green(mat &&)
Definition tensor.cpp:297
mat to_tensor(const vec &)
Definition tensor.cpp:321
double invariant3(const vec &)
compute the third invariant of the given 3D strain tensor, could be either normal or deviatoric strai...
Definition tensor.cpp:121
double norm(const vec &)
Definition tensor.cpp:375
double invariant2(const vec &)
compute the second invariant of the given 3D strain tensor, could be either normal or deviatoric stra...
Definition tensor.cpp:109
double invariant1(const vec &)
compute the first invariant of the given 3D strain tensor, could be either normal or deviatoric strai...
Definition tensor.cpp:98
double double_contraction(const vec &)
Definition tensor.cpp:381
vec to_voigt(const mat &)
Definition tensor.cpp:346
double lode(vec)
Definition tensor.cpp:163
vec to_voigt(const mat &)
Definition tensor.cpp:412
double invariant2(const vec &)
compute the second invariant of the given 3D stress tensor, could be either normal or deviatoric stre...
Definition tensor.cpp:144
vec lode_der(vec)
Definition tensor.cpp:181
double lode(vec)
Definition tensor.cpp:172
double invariant3(const vec &)
compute the third invariant of the given 3D stress tensor, could be either normal or deviatoric stres...
Definition tensor.cpp:156
double invariant1(const vec &)
compute the first invariant of the given 3D stress tensor, could be either normal or deviatoric stres...
Definition tensor.cpp:133
double norm(const vec &)
Definition tensor.cpp:441
mat to_tensor(const vec &)
Definition tensor.cpp:387
double double_contraction(const vec &)
Definition tensor.cpp:447
double trace3(const vec &)
Only accepts 3D tensor!
Definition tensor.cpp:205
mat diff_unit(const vec &)
Definition tensor.cpp:236
mat unit_deviatoric_tensor4v2()
Definition tensor.cpp:76
mat unit_deviatoric_tensor4()
Definition tensor.cpp:65
double mean3(const vec &)
Definition tensor.cpp:211
mat diff_triad(const vec3 &, const vec3 &, const vec3 &)
Definition tensor.cpp:241
vec dev(const vec &)
Definition tensor.cpp:213
mat unit_symmetric_tensor4()
Definition tensor.cpp:84
mat isotropic_stiffness(double, double)
Definition tensor.cpp:20
mat orthotropic_stiffness(const vec &, const vec &)
Definition tensor.cpp:35
double trace2(const vec &)
Only accepts 2D tensor!
Definition tensor.cpp:194
void suanpan_assert(const std::function< void()> &F)
Definition suanPan.h:363