1#ifndef SET_MATRIX4_MAJORMINOR_H
2#define SET_MATRIX4_MAJORMINOR_H
28 if (
uid==0 )
return data[0];
29 else if (
uid==8 ||
uid==4 ||
uid==2 ||
uid==1 )
return data[1];
30 else if (
uid==12 ||
uid==3 )
return data[2];
31 else if (
uid==10 ||
uid==6 ||
uid==9 ||
uid==5 )
return data[3];
32 else if (
uid==14 ||
uid==13 ||
uid==11 ||
uid==7 )
return data[4];
33 else if (
uid==15 )
return data[5];
41 if (
uid==0 )
return data[0];
42 else if (
uid==8 ||
uid==4 ||
uid==2 ||
uid==1 )
return data[1];
43 else if (
uid==12 ||
uid==3 )
return data[2];
44 else if (
uid==10 ||
uid==6 ||
uid==9 ||
uid==5 )
return data[3];
45 else if (
uid==14 ||
uid==13 ||
uid==11 ||
uid==7 )
return data[4];
46 else if (
uid==15 )
return data[5];
53 for (
int k = 0;
k < 2;
k++)
55 for (
int i = -1;
i < 3;
i++)
57 for (
int l = 0;
l < 2;
l++)
59 if (
i==-1)
os <<
"┌ ┐ ";
60 else if (
i == 2)
os <<
"└ ┘ ";
64 for (
int j = 0;
j < 2;
j++)
67 os << std::scientific << std::setw(11) << val ;
80 return std::sqrt(data[0]*data[0] + data[1]*data[1] + data[2]*data[2] + data[3]*data[3] + data[4]*data[4] + data[5]*data[5]);
84 if (std::isnan(data[ 0]))
return true;
85 if (std::isnan(data[ 1]))
return true;
86 if (std::isnan(data[ 2]))
return true;
87 if (std::isnan(data[ 3]))
return true;
88 if (std::isnan(data[ 4]))
return true;
89 if (std::isnan(data[ 5]))
return true;
119 Eigen::Matrix3d R = Eigen::Matrix3d::Identity())
124 for(
int i = 0;
i < 3;
i++)
125 for(
int j = 0;
j < 3;
j++)
126 for(
int k = 0;
k < 3;
k++)
127 for(
int l = 0;
l < 3;
l++)
134 for(
int p = 0;
p < 2;
p++)
135 for(
int q = 0; q < 2; q++)
136 for(
int s = 0;
s < 2;
s++)
137 for(
int t = 0;
t < 2;
t++)
140 for(
int i = 0;
i < 3;
i++)
141 for(
int j = 0;
j < 3;
j++)
142 for(
int k = 0;
k < 3;
k++)
143 for(
int l = 0;
l < 3;
l++)
152 R = Eigen::AngleAxisd(
phi2, Eigen::Vector3d::UnitX()) *
153 Eigen::AngleAxisd(
Phi, Eigen::Vector3d::UnitZ()) *
154 Eigen::AngleAxisd(
phi1, Eigen::Vector3d::UnitX());
160 Eigen::Matrix3d R = q.normalized().toRotationMatrix();
161 return Cubic(C11,C12,C44,R);
177 for (
int i = 0 ;
i < 6 ;
i++)
if (a.data[
i] !=
b.data[
i])
return false;
184 for (
int i = 0 ;
i < 6 ;
i++)
ret.data[
i] = a.data[
i] +
b.data[
i];
191 for (
int i = 0 ;
i < 6 ;
i++)
ret.data[
i] = a.data[
i] -
b.data[
i];
198 for (
int i = 0 ;
i < 6 ;
i++)
ret.data[
i] = a.data[
i] *
b;
210 for (
int i = 0 ;
i < 6 ;
i++)
ret.data[
i] = a.data[
i] /
b;
216 Eigen::Matrix<Set::Scalar,2,2>
ret = Eigen::Matrix<Set::Scalar,2,2>::Zero();
217 ret(0,0) = a.data[0]*
b(0,0) + a.data[1]*(
b(0,1) +
b(1,0)) + a.data[2]*
b(1,1);
218 ret(0,1) = a.data[1]*
b(0,0) + a.data[3]*(
b(0,1) +
b(1,0)) + a.data[4]*
b(1,1);
219 ret(1,1) = a.data[2]*
b(0,0) + a.data[4]*(
b(0,1) +
b(1,0)) + a.data[5]*
b(1,1);
230 ret(0) = a.data[0]*
b(0,0,0) + a.data[1]*(
b(0,1,0) +
b(1,0,0) +
b(0,0,1)) + a.data[2]*
b(1,1,0) + a.data[3]*(
b(0,1,1) +
b(1,0,1)) + a.data[4]*
b(1,1,1);
231 ret(1) = a.data[1]*
b(0,0,0) + a.data[2]*
b(0,0,1) + a.data[3]*(
b(0,1,0) +
b(1,0,0)) + a.data[4]*(
b(1,1,0) +
b(0,1,1) +
b(1,0,1)) + a.data[5]*
b(1,1,1);
259 int uid =
i + 3*
j + 9*
k + 27*
l;
261 if (
uid==0 )
return data[0];
263 else if (
uid==27 ||
uid==9 ||
uid==3 ||
uid==1 )
return data[1];
265 else if (
uid==54 ||
uid==18 ||
uid==6 ||
uid==2 )
return data[2];
267 else if (
uid==36 ||
uid==4 )
return data[3];
269 else if (
uid==63 ||
uid==45 ||
uid==7 ||
uid==5 )
return data[4];
271 else if (
uid==72 ||
uid==8 )
return data[5];
273 else if (
uid==30 ||
uid==12 ||
uid==28 ||
uid==10 )
return data[6];
277 else if (
uid==39 ||
uid==37 ||
uid==31 ||
uid==13 )
return data[8];
281 else if (
uid==75 ||
uid==73 ||
uid==35 ||
uid==17 )
return data[10];
283 else if (
uid==60 ||
uid==24 ||
uid==56 ||
uid==20 )
return data[11];
285 else if (
uid==42 ||
uid==58 ||
uid==22 ||
uid==38 )
return data[12];
289 else if (
uid==78 ||
uid==74 ||
uid==62 ||
uid==26 )
return data[14];
291 else if (
uid==40 )
return data[15];
293 else if (
uid==67 ||
uid==49 ||
uid==43 ||
uid==41 )
return data[16];
295 else if (
uid==76 ||
uid==44 )
return data[17];
297 else if (
uid==70 ||
uid==52 ||
uid==68 ||
uid==50 )
return data[18];
299 else if (
uid==79 ||
uid==77 ||
uid==71 ||
uid==53 )
return data[19];
301 else if (
uid==80 )
return data[20];
308 int uid =
i + 3*
j + 9*
k + 27*
l;
310 if (
uid==0 )
return data[0];
312 else if (
uid==27 ||
uid==9 ||
uid==3 ||
uid==1 )
return data[1];
314 else if (
uid==54 ||
uid==18 ||
uid==6 ||
uid==2 )
return data[2];
316 else if (
uid==36 ||
uid==4 )
return data[3];
318 else if (
uid==63 ||
uid==45 ||
uid==7 ||
uid==5 )
return data[4];
320 else if (
uid==72 ||
uid==8 )
return data[5];
322 else if (
uid==30 ||
uid==12 ||
uid==28 ||
uid==10 )
return data[6];
326 else if (
uid==39 ||
uid==37 ||
uid==31 ||
uid==13 )
return data[8];
330 else if (
uid==75 ||
uid==73 ||
uid==35 ||
uid==17 )
return data[10];
332 else if (
uid==60 ||
uid==24 ||
uid==56 ||
uid==20 )
return data[11];
334 else if (
uid==42 ||
uid==58 ||
uid==22 ||
uid==38 )
return data[12];
338 else if (
uid==78 ||
uid==74 ||
uid==62 ||
uid==26 )
return data[14];
340 else if (
uid==40 )
return data[15];
342 else if (
uid==67 ||
uid==49 ||
uid==43 ||
uid==41 )
return data[16];
344 else if (
uid==76 ||
uid==44 )
return data[17];
346 else if (
uid==70 ||
uid==52 ||
uid==68 ||
uid==50 )
return data[18];
348 else if (
uid==79 ||
uid==77 ||
uid==71 ||
uid==53 )
return data[19];
350 else if (
uid==80 )
return data[20];
356 for (
int i = 0;
i < 21;
i++)
357 os <<
"i = " <<
i <<
" " << data[
i] << std::endl;
360 for (
int k = 0;
k < 3;
k++)
362 for (
int i = -1;
i < 4;
i++)
364 for (
int l = 0;
l < 3;
l++)
366 if (
i==-1)
os <<
"┌ ┐ ";
367 else if (
i == 3)
os <<
"└ ┘ ";
371 for (
int j = 0;
j < 3;
j++)
374 os << std::scientific << std::setw(11) << val ;
388 for (
int i = 0;
i < 21;
i++)
retsq += data[
i];
389 return std::sqrt(
retsq);
393 if (std::isnan(data[ 0]))
return true;
394 if (std::isnan(data[ 1]))
return true;
395 if (std::isnan(data[ 2]))
return true;
396 if (std::isnan(data[ 3]))
return true;
397 if (std::isnan(data[ 4]))
return true;
398 if (std::isnan(data[ 5]))
return true;
399 if (std::isnan(data[ 6]))
return true;
400 if (std::isnan(data[ 7]))
return true;
401 if (std::isnan(data[ 8]))
return true;
402 if (std::isnan(data[ 9]))
return true;
403 if (std::isnan(data[10]))
return true;
404 if (std::isnan(data[11]))
return true;
405 if (std::isnan(data[12]))
return true;
406 if (std::isnan(data[13]))
return true;
407 if (std::isnan(data[14]))
return true;
408 if (std::isnan(data[15]))
return true;
409 if (std::isnan(data[16]))
return true;
410 if (std::isnan(data[17]))
return true;
411 if (std::isnan(data[18]))
return true;
412 if (std::isnan(data[19]))
return true;
413 if (std::isnan(data[20]))
return true;
444 Eigen::Matrix3d R = Eigen::Matrix3d::Identity())
449 for(
int i = 0;
i < 3;
i++)
450 for(
int j = 0;
j < 3;
j++)
451 for(
int k = 0;
k < 3;
k++)
452 for(
int l = 0;
l < 3;
l++)
459 for(
int p = 0;
p < 3;
p++)
460 for(
int q = 0; q < 3; q++)
461 for(
int s = 0;
s < 3;
s++)
462 for(
int t = 0;
t < 3;
t++)
465 for(
int i = 0;
i < 3;
i++)
466 for(
int j = 0;
j < 3;
j++)
467 for(
int k = 0;
k < 3;
k++)
468 for(
int l = 0;
l < 3;
l++)
477 R = Eigen::AngleAxisd(
phi2, Eigen::Vector3d::UnitX()) *
478 Eigen::AngleAxisd(
Phi, Eigen::Vector3d::UnitZ()) *
479 Eigen::AngleAxisd(
phi1, Eigen::Vector3d::UnitX());
485 Eigen::Matrix3d R = q.normalized().toRotationMatrix();
486 return Cubic(C11,C12,C44,R);
501 for (
int i = 0 ;
i < 21 ;
i++)
if (a.data[
i] !=
b.data[
i])
return false;
508 for (
int i = 0 ;
i < 21 ;
i++)
ret.data[
i] = a.data[
i] +
b.data[
i];
515 for (
int i = 0 ;
i < 21 ;
i++)
ret.data[
i] = a.data[
i] -
b.data[
i];
522 for (
int i = 0 ;
i < 21 ;
i++)
ret.data[
i] = a.data[
i] *
b;
534 for (
int i = 0 ;
i < 21 ;
i++)
ret.data[
i] = a.data[
i] /
b;
540 Eigen::Matrix<amrex::Real,3,3>
ret = Eigen::Matrix<amrex::Real,3,3>::Zero();
541 ret(0,0) += a.data[ 0]*
b(0,0) + a.data[ 1]*(
b(0,1) +
b(1,0)) + a.data[ 2]*(
b(0,2) +
b(2,0)) + a.data[ 3]*
b(1,1) + a.data[ 4]*(
b(1,2) +
b(2,1)) + a.data[ 5]*
b(2,2);
542 ret(1,1) += a.data[ 3]*
b(0,0) + a.data[ 8]*(
b(0,1) +
b(1,0)) + a.data[ 12]*(
b(0,2) +
b(2,0)) + a.data[ 15]*
b(1,1) + a.data[ 16]*(
b(1,2) +
b(2,1)) + a.data[ 17]*
b(2,2);
543 ret(2,2) += a.data[ 5]*
b(0,0) + a.data[ 10]*(
b(0,1) +
b(1,0)) + a.data[ 14]*(
b(0,2) +
b(2,0)) + a.data[ 17]*
b(1,1) + a.data[ 19]*(
b(1,2) +
b(2,1)) + a.data[ 20]*
b(2,2);
544 ret(1,2) += a.data[ 4]*
b(0,0) + a.data[ 9]*(
b(0,1) +
b(1,0)) + a.data[ 13]*(
b(0,2) +
b(2,0)) + a.data[ 16]*
b(1,1) + a.data[ 18]*(
b(1,2) +
b(2,1)) + a.data[ 19]*
b(2,2);
545 ret(2,0) += a.data[ 2]*
b(0,0) + a.data[ 7]*(
b(0,1) +
b(1,0)) + a.data[ 11]*(
b(0,2) +
b(2,0)) + a.data[ 12]*
b(1,1) + a.data[ 13]*(
b(1,2) +
b(2,1)) + a.data[ 14]*
b(2,2);
546 ret(0,1) += a.data[ 1]*
b(0,0) + a.data[ 6]*(
b(0,1) +
b(1,0)) + a.data[ 7]*(
b(0,2) +
b(2,0)) + a.data[ 8]*
b(1,1) + a.data[ 9]*(
b(1,2) +
b(2,1)) + a.data[ 10]*
b(2,2);
557 Eigen::Matrix<amrex::Real,2,2>
ret = Eigen::Matrix<amrex::Real,2,2>::Zero();
558 for (
int i = 0;
i < 2;
i++)
559 for (
int j = 0;
j < 2;
j++)
560 for (
int k = 0;
k < 2;
k++)
561 for (
int l = 0;
l < 2;
l++)
578 a.data[ 0]*
b(0,0,0) +
579 a.data[ 1]*(
b(0,1,0) +
b(1,0,0) +
b(0,0,1)) +
580 a.data[ 2]*(
b(0,2,0) +
b(2,0,0) +
b(0,0,2)) +
581 a.data[ 3]*
b(1,1,0) +
582 a.data[ 4]*(
b(1,2,0) +
b(2,1,0)) +
583 a.data[ 5]*
b(2,2,0) +
584 a.data[ 6]*(
b(0,1,1) +
b(1,0,1)) +
585 a.data[ 7]*(
b(0,2,1) +
b(2,0,1) +
b(0,1,2) +
b(1,0,2)) +
586 a.data[ 8]*
b(1,1,1) +
587 a.data[ 9]*(
b(1,2,1) +
b(2,1,1)) +
588 a.data[ 10]*
b(2,2,1) +
589 a.data[ 11]*(
b(0,2,2) +
b(2,0,2)) +
590 a.data[ 12]*
b(1,1,2) +
591 a.data[ 13]*(
b(1,2,2) +
b(2,1,2)) +
592 a.data[ 14]*
b(2,2,2);
595 a.data[ 1]*
b(0,0,0) +
596 a.data[ 4]*
b(0,0,2) +
597 a.data[ 3]*
b(0,0,1) +
598 a.data[ 6]*(
b(0,1,0) +
b(1,0,0)) +
599 a.data[ 7]*(
b(0,2,0) +
b(2,0,0)) +
600 a.data[ 8]*(
b(1,1,0) +
b(0,1,1) +
b(1,0,1)) +
601 a.data[ 9]*(
b(1,2,0) +
b(2,1,0) +
b(0,1,2) +
b(1,0,2)) +
602 a.data[ 10]*
b(2,2,0) +
603 a.data[ 12]*(
b(0,2,1) +
b(2,0,1)) +
604 a.data[ 13]*(
b(0,2,2) +
b(2,0,2)) +
605 a.data[ 15]*
b(1,1,1) +
606 a.data[ 16]*(
b(1,2,1) +
b(2,1,1) +
b(1,1,2)) +
607 a.data[ 17]*
b(2,2,1) +
608 a.data[ 18]*(
b(1,2,2) +
b(2,1,2)) +
609 a.data[ 19]*
b(2,2,2);
612 a.data[ 2]*
b(0,0,0) +
613 a.data[ 4]*
b(0,0,1) +
614 a.data[ 5]*
b(0,0,2) +
615 a.data[ 7]*(
b(0,1,0) +
b(1,0,0)) +
616 a.data[ 9]*(
b(0,1,1) +
b(1,0,1)) +
617 a.data[ 10]*(
b(0,1,2) +
b(1,0,2)) +
618 a.data[ 11]*(
b(0,2,0) +
b(2,0,0)) +
619 a.data[ 12]*
b(1,1,0) +
620 a.data[ 13]*(
b(1,2,0) +
b(2,1,0) +
b(0,2,1) +
b(2,0,1)) +
621 a.data[ 14]*(
b(2,2,0) +
b(0,2,2) +
b(2,0,2)) +
622 a.data[ 16]*
b(1,1,1) +
623 a.data[ 17]*
b(1,1,2) +
624 a.data[ 18]*(
b(1,2,1) +
b(2,1,1)) +
625 a.data[ 19]*(
b(2,2,1) +
b(1,2,2) +
b(2,1,2)) +
626 a.data[ 20]*
b(2,2,2);
Matrix< _Scalar, _Rows, _Cols > & operator*=(const amrex::Vector< amrex::Real > &x)
AMREX_FORCE_INLINE void operator+=(const OP_CLASS &rhs)
static Matrix4< 2, Sym::MajorMinor > Cubic(Set::Scalar C11, Set::Scalar C12, Set::Scalar C44, Set::Quaternion q)
static Matrix4< 2, Sym::MajorMinor > Cubic(Set::Scalar C11, Set::Scalar C12, Set::Scalar C44, Eigen::Matrix3d R=Eigen::Matrix3d::Identity())
static Matrix4< 2, Sym::MajorMinor > Zero()
static Matrix4< 2, Sym::MajorMinor > Randomize()
static Matrix4< 2, Sym::MajorMinor > Increment()
void Print(std::ostream &os)
bool contains_nan() const
AMREX_GPU_HOST_DEVICE Matrix4()
static Matrix4< 2, Sym::MajorMinor > Cubic(Set::Scalar C11, Set::Scalar C12, Set::Scalar C44, Set::Scalar phi1, Set::Scalar Phi, Set::Scalar phi2)
static Matrix4< 3, Sym::MajorMinor > Increment()
static Matrix4< 3, Sym::MajorMinor > Randomize()
static Matrix4< 3, Sym::MajorMinor > Cubic(Set::Scalar C11, Set::Scalar C12, Set::Scalar C44, Set::Quaternion q)
static Matrix4< 3, Sym::MajorMinor > Cubic(Set::Scalar C11, Set::Scalar C12, Set::Scalar C44, Set::Scalar phi1, Set::Scalar Phi, Set::Scalar phi2)
AMREX_GPU_HOST_DEVICE Matrix4()
void Print(std::ostream &os)
bool contains_nan() const
static Matrix4< 3, Sym::MajorMinor > Zero()
static Matrix4< 3, Sym::MajorMinor > Cubic(Set::Scalar C11, Set::Scalar C12, Set::Scalar C44, Eigen::Matrix3d R=Eigen::Matrix3d::Identity())
A collection of data types and symmetry-reduced data structures.
AMREX_FORCE_INLINE Quaternion operator-(const Quaternion a, const Quaternion b)
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE Matrix4< AMREX_SPACEDIM, Sym::Diagonal > operator/(const Matrix4< AMREX_SPACEDIM, Sym::Diagonal > &a, const Set::Scalar &b)
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
AMREX_FORCE_INLINE bool operator==(const Quaternion a, const Quaternion b)
AMREX_FORCE_INLINE Quaternion operator+(const Quaternion a, const Quaternion b)
AMREX_FORCE_INLINE Quaternion operator*(const Set::Scalar alpha, const Quaternion b)
void Abort(const char *msg)