1 #ifndef SET_MATRIX4_MAJORMINOR_H
2 #define SET_MATRIX4_MAJORMINOR_H
16 Scalar data[6] = {NAN,NAN,NAN,NAN,NAN,NAN};
25 const Scalar & operator () (
const int i,
const int j,
const int k,
const int l)
const
27 int uid = i + 2*j + 4*k + 8*l;
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];
38 Scalar & operator () (
const int i,
const int j,
const int k,
const int l)
40 int uid = i + 2*j + 4*k + 8*l;
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;
98 AMREX_GPU_HOST_DEVICE
void operator /= (
Set::Scalar alpha) {
for (
int i = 0; i < 6; i++) data[i] /= alpha;}
115 for (
int i = 0 ; i < 6; i++) ret.
data[i] = 0.0;
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++)
129 if(i == j && j == k && k == l) Ctmp[i][j][k][l] = C11;
130 else if (i==k && j==l) Ctmp[i][j][k][l] = C44;
131 else if (i==j && k==l) Ctmp[i][j][k][l] = C12;
132 else Ctmp[i][j][k][l] = 0.0;
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++)
144 ret(p,q,s,
t) += R(p,i)*R(s,k)*Ctmp[i][j][k][l]*R(q,j)*R(
t,l);
152 R = Eigen::AngleAxisd(phi2, Eigen::Vector3d::UnitX()) *
153 Eigen::AngleAxisd(Phi, Eigen::Vector3d::UnitZ()) *
154 Eigen::AngleAxisd(phi1, Eigen::Vector3d::UnitX());
161 return Cubic(C11,C12,C44,R);
174 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
177 for (
int i = 0 ; i < 6 ; i++)
if (a.
data[i] != b.
data[i])
return false;
180 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
184 for (
int i = 0 ; i < 6 ; i++) ret.
data[i] = a.
data[i] + b.
data[i];
187 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
191 for (
int i = 0 ; i < 6 ; i++) ret.
data[i] = a.
data[i] - b.
data[i];
194 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
198 for (
int i = 0 ; i < 6 ; i++) ret.
data[i] = a.
data[i] * b;
201 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
206 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
210 for (
int i = 0 ; i < 6 ; i++) ret.
data[i] = a.
data[i] / b;
213 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
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);
223 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
224 Eigen::Matrix<amrex::Real,2,1>
operator * (Matrix4<2,Sym::MajorMinor> a, std::array<Eigen::Matrix<amrex::Real,2,2>,2> b);
226 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
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);
250 Scalar data[21] = { NAN,NAN,NAN,NAN,NAN,NAN,NAN,
251 NAN,NAN,NAN,NAN,NAN,NAN,NAN,
252 NAN,NAN,NAN,NAN,NAN,NAN,NAN };
257 const Scalar & operator () (
const int i,
const int j,
const int k,
const int l)
const
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];
275 else if (uid==57 || uid==21 || uid==33 || uid==15 || uid==55 || uid==19 || uid==29 || uid==11 )
return data[7];
277 else if (uid==39 || uid==37 || uid==31 || uid==13 )
return data[8];
279 else if (uid==66 || uid==48 || uid==64 || uid==46 || uid==34 || uid==16 || uid==32 || uid==14 )
return data[9];
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];
287 else if (uid==69 || uid==51 || uid==61 || uid==25 || uid==65 || uid==47 || uid==59 || uid==23 )
return data[13];
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];
306 Scalar & operator () (
const int i,
const int j,
const int k,
const int l)
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];
324 else if (uid==57 || uid==21 || uid==33 || uid==15 || uid==55 || uid==19 || uid==29 || uid==11 )
return data[7];
326 else if (uid==39 || uid==37 || uid==31 || uid==13 )
return data[8];
328 else if (uid==66 || uid==48 || uid==64 || uid==46 || uid==34 || uid==16 || uid==32 || uid==14 )
return data[9];
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];
336 else if (uid==69 || uid==51 || uid==61 || uid==25 || uid==65 || uid==47 || uid==59 || uid==23 )
return data[13];
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;
423 AMREX_GPU_HOST_DEVICE
void operator /= (
Set::Scalar alpha) {
for (
int i = 0; i < 21; i++) data[i] /= alpha;}
440 for (
int i = 0 ; i < 21; i++) ret.
data[i] = 0.0;
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++)
454 if(i == j && j == k && k == l) Ctmp[i][j][k][l] = C11;
455 else if (i==k && j==l) Ctmp[i][j][k][l] = C44;
456 else if (i==j && k==l) Ctmp[i][j][k][l] = C12;
457 else Ctmp[i][j][k][l] = 0.0;
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++)
469 ret(p,q,s,
t) += R(p,i)*R(s,k)*Ctmp[i][j][k][l]*R(q,j)*R(
t,l);
477 R = Eigen::AngleAxisd(phi2, Eigen::Vector3d::UnitX()) *
478 Eigen::AngleAxisd(Phi, Eigen::Vector3d::UnitZ()) *
479 Eigen::AngleAxisd(phi1, Eigen::Vector3d::UnitX());
486 return Cubic(C11,C12,C44,R);
498 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
501 for (
int i = 0 ; i < 21 ; i++)
if (a.
data[i] != b.
data[i])
return false;
504 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
508 for (
int i = 0 ; i < 21 ; i++) ret.
data[i] = a.
data[i] + b.
data[i];
511 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
515 for (
int i = 0 ; i < 21 ; i++) ret.
data[i] = a.
data[i] - b.
data[i];
518 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
522 for (
int i = 0 ; i < 21 ; i++) ret.
data[i] = a.
data[i] * b;
525 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
530 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
534 for (
int i = 0 ; i < 21 ; i++) ret.
data[i] = a.
data[i] / b;
537 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
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);
554 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
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++)
562 ret(i,j) += a(i,j,k,l)*b(k,l);
565 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
566 Eigen::Matrix<amrex::Real,3,1>
operator * (Matrix4<3,Sym::MajorMinor> a, std::array<Eigen::Matrix<amrex::Real,3,3>,3> b);
568 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
569 Eigen::Matrix<amrex::Real,2,1>
operator * (Matrix4<3,Sym::MajorMinor> a, std::array<Eigen::Matrix<amrex::Real,2,2>,2> b);
571 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
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);