@@ -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