Skip to content

Commit f52dfa3

Browse files
authored
Merge branch 'master' into embb_size_fix
2 parents abac0d0 + 93223a2 commit f52dfa3

File tree

18 files changed

+691
-286
lines changed

18 files changed

+691
-286
lines changed

src/Core/Datatypes/Dyadic3DTensor.h

Lines changed: 73 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -42,23 +42,47 @@ namespace Core {
4242
public:
4343
using parent = DyadicTensorGeneric<Number, 3>;
4444
using VectorType = Eigen::Matrix<Number, 3, 1>;
45+
using SizeType = long;
4546
Dyadic3DTensorGeneric() : parent() {}
4647
using parent::parent;
4748
using parent::operator=;
4849
using parent::operator==;
50+
using parent::reorderTensorValues;
51+
using parent::mandel;
52+
using parent::trace;
4953

50-
explicit Dyadic3DTensorGeneric(
51-
const std::initializer_list<VectorType>& eigvecs)
52-
: parent()
54+
explicit Dyadic3DTensorGeneric(const std::initializer_list<VectorType>& eigvecs) : parent()
5355
{
5456
if (eigvecs.size() != DIM_)
5557
THROW_INVALID_ARGUMENT("The number of input parameters must be " + std::to_string(DIM_));
5658
parent::setEigenVectors(eigvecs);
5759
}
5860

59-
Dyadic3DTensorGeneric(const VectorType& eigvec0,
60-
const VectorType& eigvec1,
61-
const VectorType& eigvec2)
61+
Dyadic3DTensorGeneric(const Dyadic3DTensorGeneric<Number>& other) : parent()
62+
{
63+
for (SizeType i = 0; i < DIM_; ++i)
64+
for (SizeType j = 0; j < DIM_; ++j)
65+
(*this)(i, j) = other(i, j);
66+
if (other.haveEigens_)
67+
{
68+
parent::eigvecs_ = other.eigvecs_;
69+
parent::eigvals_ = other.eigvals_;
70+
parent::haveEigens_ = true;
71+
}
72+
}
73+
74+
Dyadic3DTensorGeneric(const Dyadic3DTensorGeneric<Number>&& other) : parent()
75+
{
76+
this->m_storage = std::move(other.m_storage);
77+
parent::eigvecs_ = std::move(other.eigvecs_);
78+
parent::eigvals_ = std::move(other.eigvals_);
79+
parent::haveEigens_ = true;
80+
}
81+
82+
Dyadic3DTensorGeneric(const parent& other) : parent(other) {}
83+
84+
Dyadic3DTensorGeneric(
85+
const VectorType& eigvec0, const VectorType& eigvec1, const VectorType& eigvec2)
6286
: parent()
6387
{
6488
parent::setEigenVectors({eigvec0, eigvec1, eigvec2});
@@ -73,43 +97,69 @@ namespace Core {
7397
(*this)(0, 1) = (*this)(1, 0) = v2;
7498
(*this)(0, 2) = (*this)(2, 0) = v3;
7599
(*this)(1, 2) = (*this)(2, 1) = v5;
76-
parent::buildEigens();
77100
}
78101

79-
Number linearCertainty()
102+
Number linearCertainty() const
80103
{
81104
auto eigvals = parent::getEigenvalues();
82-
return (eigvals[0] - eigvals[1]) / parent::eigenValueSum();
105+
return (eigvals[0] - eigvals[1]) / parent::eigenvalueSum();
83106
}
84107

85-
Number planarCertainty()
108+
Number planarCertainty() const
86109
{
87110
auto eigvals = parent::getEigenvalues();
88-
return 2.0 * (eigvals[1] - eigvals[2]) / parent::eigenValueSum();
111+
return 2.0 * (eigvals[1] - eigvals[2]) / parent::eigenvalueSum();
89112
}
90113

91-
Number sphericalCertainty()
114+
Number sphericalCertainty() const
92115
{
93116
auto eigvals = parent::getEigenvalues();
94-
return 3.0 * eigvals[2] / parent::eigenValueSum();
117+
return 3.0 * eigvals[2] / parent::eigenvalueSum();
95118
}
96119

97-
VectorType mandel()
120+
Dyadic3DTensorGeneric<Number> operator=(Dyadic3DTensorGeneric<Number>&& other)
98121
{
99-
auto eigvals = parent::getEigenvalues();
100-
auto eigvecs = parent::getEigenvectors();
122+
parent::operator=(other);
123+
return *this;
124+
}
125+
126+
Dyadic3DTensorGeneric<Number> operator=(const Dyadic3DTensorGeneric<Number>& other)
127+
{
128+
parent::operator=(static_cast<parent>(other));
129+
return *this;
130+
}
101131

102-
for (size_t i = 0; i < DIM_; ++i)
103-
eigvecs[i] *= eigvals[i];
132+
template <typename OtherDerived>
133+
Dyadic3DTensorGeneric<Number> operator*(const OtherDerived& other) const
134+
{
135+
Dyadic3DTensorGeneric<Number> newTensor(parent::operator*(other));
136+
return newTensor;
137+
}
104138

105-
static const double sqrt2 = std::sqrt(2);
106-
VectorType mandel({eigvecs[0][0], eigvecs[1][1], eigvecs[2][2],
107-
eigvecs[0][1] * sqrt2, eigvecs[0][2] * sqrt2, eigvecs[1][2] * sqrt2});
108-
return mandel;
139+
template <typename OtherDerived>
140+
Dyadic3DTensorGeneric<Number> operator+(const OtherDerived& other) const
141+
{
142+
Dyadic3DTensorGeneric<Number> newTensor(parent::operator+(other));
143+
return newTensor;
144+
}
145+
146+
template <typename OtherDerived>
147+
Dyadic3DTensorGeneric<Number> operator-(const OtherDerived& other) const
148+
{
149+
Dyadic3DTensorGeneric<Number> newTensor(parent::operator-(other));
150+
return newTensor;
151+
}
152+
153+
using parent::makePositive;
154+
Number fractionalAnisotropy() const
155+
{
156+
const static Number sqrtHalf = std::sqrt(0.5);
157+
const auto eigvals = parent::getEigenvalues();
158+
return sqrtHalf * std::sqrt(std::pow(eigvals[0] - eigvals[1], 2) + std::pow(eigvals[1] - eigvals[2], 2) + std::pow(eigvals[2] - eigvals[0], 2)) / parent::frobeniusNorm();
109159
}
110160

111161
private:
112-
const size_t DIM_ = 3;
162+
const SizeType DIM_ = 3;
113163
};
114164

115165
template <typename Indexable>
@@ -126,14 +176,6 @@ namespace Core {
126176
if (vec.size() != 6) THROW_INVALID_ARGUMENT("This function requires 6 values.");
127177
return Dyadic3DTensorGeneric<double>(vec[0], vec[1], vec[2], vec[3], vec[4], vec[5]);
128178
}
129-
130-
template <typename Indexable>
131-
Dyadic3DTensor symmetricTensorFromMandel(const Indexable& array)
132-
{
133-
static const double sqrt2 = std::sqrt(2);
134-
return Dyadic3DTensor(
135-
array[0], array[3] / sqrt2, array[4] / sqrt2, array[1], array[5] / sqrt2, array[2]);
136-
}
137179
}
138180
}
139181
}

0 commit comments

Comments
 (0)