23template <
typename T1,
typename T2,
int DIM>
25 constexpr double eps = 1e-4;
26 for (
int ii = 0; ii != DIM; ++ii)
27 for (
int jj = 0; jj != DIM; ++jj)
28 for (
int kk = 0; kk != DIM; ++kk)
29 for (
int ll = 0; ll != DIM; ++ll) {
31 if (std::abs(t_1(ii, jj, kk, ll) - t_2(ii, jj, kk, ll)) >
eps)
33 <<
"Error " << ii <<
" " << jj <<
" " << kk <<
" " << ll <<
" "
34 << t_1(ii, jj, kk, ll) <<
" " << t_2(ii, jj, kk, ll);
37 for (
int ii = 0; ii != DIM; ++ii)
38 for (
int jj = 0; jj != DIM; ++jj)
39 for (
int kk = 0; kk != DIM; ++kk)
40 for (
int ll = 0; ll != DIM; ++ll)
41 t_1(ii, jj, kk, ll) -= t_2(ii, jj, kk, ll);
44template <
typename T1,
typename T2,
int DIM>
54 t_d_a(
i,
j,
k,
l) = 0;
56 for (
int ii = 0; ii != DIM; ++ii)
57 for (
int jj = 0; jj != DIM; ++jj)
58 for (
int kk = 0; kk != DIM; ++kk)
59 for (
int ll = 0; ll != DIM; ++ll)
60 for (
int zz = 0; zz != DIM; ++zz) {
62 auto diff = [&](
auto ii,
auto jj,
auto kk,
auto ll,
int zz) {
65 t_a(ii, zz) *
t_kd(zz, kk) *
t_kd(jj, ll)
69 t_kd(ii, kk) *
t_kd(zz, ll) * t_a(zz, jj);
72 t_d_a(ii, jj, kk, ll) +=
73 (diff(ii, jj, kk, ll, zz) + diff(ii, jj, ll, kk, zz)) / 2.;
81template <
typename T1,
typename T2,
int DIM>
91 t_dd_a(
i,
j,
k,
l) = 0;
93 for (
int ii = 0; ii != DIM; ++ii)
94 for (
int jj = 0; jj != DIM; ++jj)
95 for (
int kk = 0; kk != DIM; ++kk)
96 for (
int ll = 0; ll != DIM; ++ll)
97 for (
int mm = 0; mm != DIM; ++mm)
98 for (
int nn = 0; nn != DIM; ++nn)
99 for (
int zz = 0; zz != DIM; ++zz) {
101 auto diff = [&](
auto ii,
auto jj,
auto kk,
auto ll,
int mm,
114 t_dd_a(kk, ll, mm, nn) += (
116 diff(ii, jj, kk, ll, mm, nn, zz)
120 diff(ii, jj, ll, kk, mm, nn, zz)
124 diff(ii, jj, kk, ll, nn, mm, zz)
128 diff(ii, jj, ll, kk, nn, mm, zz)
139template <
typename T1,
int DIM>
149 t_d_a(
i,
j,
k,
l) = 0;
151 for (
int ii = 0; ii != DIM; ++ii)
152 for (
int jj = 0; jj != DIM; ++jj)
153 for (
int kk = 0; kk != DIM; ++kk)
154 for (
int ll = 0; ll != DIM; ++ll) {
156 auto diff = [&](
auto ii,
auto jj,
auto kk,
auto ll) {
160 t_d_a(ii, jj, kk, ll) =
161 (diff(ii, jj, kk, ll) + diff(ii, jj, ll, kk)) / 2.;
169template <
typename T,
int DIM>
172 for (
int ii = 0; ii != DIM; ++ii)
173 for (
int jj = 0; jj != DIM; ++jj)
174 for (
int kk = 0; kk != DIM; ++kk)
175 for (
int ll = 0; ll != DIM; ++ll)
176 r +=
t(ii, jj, kk, ll) *
t(ii, jj, kk, ll);
182int main(
int argc,
char *argv[]) {
186 auto core_log = logging::core::get();
190 BOOST_LOG_SCOPED_THREAD_ATTR(
"Timeline", attrs::timer());
195 auto print_ddg = [](
auto &
t,
auto str =
"") {
196 constexpr double eps = 1e-6;
197 for (
int ii = 0; ii != 3; ++ii)
198 for (
int jj = 0; jj != 3; ++jj)
199 for (
int kk = 0; kk != 3; ++kk)
200 for (
int ll = 0; ll != 3; ++ll) {
201 double v =
t(ii, jj, kk, ll);
202 double w = std::abs(
v) <
eps ? 0 :
v;
204 << str << std::fixed << std::setprecision(3) << std::showpos
205 << ii + 1 <<
" " << jj + 1 <<
" " << kk + 1 <<
" " << ll + 1
210 auto print_ddg_direction = [](
auto &
t,
auto kk,
int ll) {
211 for (
int ii = 0; ii != 3; ++ii)
212 for (
int jj = 0; jj <= ii; ++jj)
214 << ii + 1 <<
" " << jj + 1 <<
" " << kk + 1 <<
" " << ll + 1
215 <<
" : " <<
t(ii, jj, kk, ll);
219 for (
int ii = 0; ii != 3; ++ii)
220 for (
int jj = 0; jj != 3; ++jj)
222 << ii + 1 <<
" " << jj + 1 <<
" : " <<
t(ii, jj);
225 enum swap { swap12, swap01 };
226 auto run_lapack = [](
auto &
a, swap s = swap12) {
241 info =
lapack_dsyev(
'V',
'U', 3,
a.data(), 3, w, &wkopt, lwork);
243 THROW_MESSAGE(
"The algorithm failed to compute eigenvalues.");
245 std::vector<double> work(lwork);
247 info =
lapack_dsyev(
'V',
'U', 3,
a.data(), 3, w, &*work.begin(), lwork);
249 THROW_MESSAGE(
"The algorithm failed to compute eigenvalues.");
254 a[0 * 3 + 0],
a[0 * 3 + 1],
a[0 * 3 + 2],
256 a[2 * 3 + 0],
a[2 * 3 + 1],
a[2 * 3 + 2],
258 a[1 * 3 + 0],
a[1 * 3 + 1],
a[1 * 3 + 2]};
261 return std::make_tuple(t_a, t_eig_vec, t_eig_vals);
266 a[1 * 3 + 0],
a[1 * 3 + 1],
a[1 * 3 + 2],
268 a[0 * 3 + 0],
a[0 * 3 + 1],
a[0 * 3 + 2],
270 a[2 * 3 + 0],
a[2 * 3 + 1],
a[2 * 3 + 2],
275 return std::make_tuple(t_a, t_eig_vec, t_eig_vals);
290 0.969837, -0.0860972, 0.228042,
292 0.0790574, 0.996073, 0.0398449,
294 -0.230577, -0.0206147, 0.972836};
307 t_S_sym(
i,
j) = (t_S(
i,
j) || t_S(
j,
i)) / 2.;
309 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"Diff A";
314 auto f = [](
double v) {
return exp(
v); };
315 auto d_f = [](
double v) {
return exp(
v); };
316 auto dd_f = [](
double v) {
return exp(
v); };
319 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"Reconstruct mat";
324 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"Diff";
325 print_ddg_direction(t_d, 0, 2);
330 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"Diff Diff";
331 print_ddg_direction(t_dd, 0, 2);
333 auto norm2_t_b = t_b(
i,
j) * t_b(
i,
j);
334 MOFEM_LOG(
"ATOM_TEST", Sev::inform) <<
"norm2_t_b " << norm2_t_b;
337 MOFEM_LOG(
"ATOM_TEST", Sev::inform) <<
"norm2_t_d " << norm2_t_d;
340 MOFEM_LOG(
"ATOM_TEST", Sev::inform) <<
"norm2_t_dd " << norm2_t_dd;
342 constexpr double regression_t_b = 572.543;
343 constexpr double regression_t_d = 859.939;
344 constexpr double regression_t_dd = 859.939;
346 constexpr double eps = 1e-2;
347 if (std::abs(norm2_t_b - regression_t_b) >
eps)
349 if (std::abs(norm2_t_d - regression_t_d) >
eps)
351 if (std::abs(norm2_t_dd - regression_t_dd) >
eps)
360 std::array<double, 9>
a{1., 0.1, -0.5,
366 auto tuple = run_lapack(
a);
367 auto &t_a = std::get<0>(tuple);
368 auto &t_eig_vec = std::get<1>(tuple);
369 auto &t_eig_vals = std::get<2>(tuple);
371 auto t_eig_val_diff =
372 (t_eig_vals(
i) - t_L(
i)) * (t_eig_vals(
i) - t_L(
i));
374 <<
"t_eig_val_diff " << t_eig_val_diff;
376 auto f = [](
double v) {
return exp(
v); };
377 auto d_f = [](
double v) {
return exp(
v); };
378 auto dd_f = [](
double v) {
return exp(
v); };
382 t_c(
i,
j) -= t_b(
i,
j);
385 auto norm2_t_c = t_c(
i,
j) * t_c(
i,
j);
387 <<
"Reconstruct mat difference with lapack eigen valyes and "
391 constexpr double eps = 1e-8;
392 if (fabs(norm2_t_c) >
eps)
394 "Matrix not reeconstructed");
403 auto f = [](
double v) {
return v; };
404 auto d_f = [](
double v) {
return 1; };
405 auto dd_f = [](
double v) {
return 0; };
407 constexpr double eps = 1e-10;
410 t_b(
i,
j) -= (t_A(
i,
j) || t_A(
j,
i)) / 2;
411 auto norm2_t_b = t_b(
i,
j) * t_b(
i,
j);
413 <<
"Result should be matrix itself " << norm2_t_b;
416 "This norm should be zero");
424 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d_a";
425 print_ddg(t_d_a,
"hand ");
426 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d";
427 print_ddg(t_d,
"code ");
431 <<
"Direvarive hand calculation minus code " << nrm2_t_d_a;
432 if (nrm2_t_d_a >
eps)
434 "This norm should be zero");
447 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
453 MOFEM_LOG(
"ATOM_TEST", Sev::inform) <<
"norm2_t_dd " << norm2_t_dd;
454 if (norm2_t_dd >
eps)
456 "This norm should be zero");
462 auto f = [](
double v) {
return v *
v; };
463 auto d_f = [](
double v) {
return 2 *
v; };
464 auto dd_f = [](
double v) {
return 2; };
466 constexpr double eps = 1e-9;
472 t_a(
i,
j) = t_b(
i,
j) - t_A(
i,
k) * t_A(
k,
j);
474 auto norm2_t_a = t_a(
i,
j) * t_a(
i,
j);
476 <<
"Result should be matrix times matrix " << norm2_t_a;
479 "This norm should be zero");
485 print_ddg_direction(t_d, 0, 2);
487 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d_a";
488 print_ddg(t_d_a,
"hand ");
489 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d";
490 print_ddg(t_d,
"code ");
493 <<
"Direvarive hand calculation minus code " << nrm2_t_d_a;
494 if (nrm2_t_d_a >
eps)
496 "This norm should be zero");
503 1., 1. / 2., 1. / 3.,
505 2. / 2., 1., 2. / 3.,
507 3. / 2., 1., 3. / 3.};
510 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
516 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_dd_a";
517 print_ddg(t_dd_a,
"hand ");
518 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_dd";
519 print_ddg(t_dd,
"code ");
523 <<
"Direvarive hand calculation minus code " << nrm2_t_dd_a;
524 if (nrm2_t_dd_a >
eps)
526 "This norm should be zero");
534 std::array<double, 9>
a{5., 4., 0,
540 auto tuple = run_lapack(
a, swap01);
541 auto &t_a = std::get<0>(tuple);
542 auto &t_eig_vecs = std::get<1>(tuple);
543 auto &t_eig_vals = std::get<2>(tuple);
545 auto f = [](
double v) {
return v; };
546 auto d_f = [](
double v) {
return 1; };
547 auto dd_f = [](
double v) {
return 0; };
549 constexpr double eps = 1e-10;
552 t_b(
i,
j) -= (t_a(
i,
j) || t_a(
j,
i)) / 2;
553 auto norm2_t_b = t_b(
i,
j) * t_b(
i,
j);
555 <<
"Result should be matrix itself " << norm2_t_b;
558 "This norm should be zero");
564 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d_a";
565 print_ddg(t_d_a,
"hand ");
566 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d";
567 print_ddg(t_d,
"code ");
570 <<
"Direvarive hand calculation minus code " << nrm2_t_d_a;
571 if (nrm2_t_d_a >
eps)
573 "This norm should be zero");
577 auto f = [](
double v) {
return v *
v; };
578 auto d_f = [](
double v) {
return 2 *
v; };
579 auto dd_f = [](
double v) {
return 2; };
582 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d_a";
583 print_ddg(t_d_a,
"hand ");
584 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d";
585 print_ddg(t_d,
"code ");
588 <<
"Direvarive hand calculation minus code " << nrm2_t_d_a;
589 if (nrm2_t_d_a >
eps)
591 "This norm should be zero");
598 std::array<double, 9>
a{4., 0., 0,
604 auto f = [](
double v) {
return v; };
605 auto d_f = [](
double v) {
return 1; };
606 auto dd_f = [](
double v) {
return 0; };
608 auto tuple = run_lapack(
a);
609 auto &t_a = std::get<0>(tuple);
610 auto &t_eig_vecs = std::get<1>(tuple);
611 auto &t_eig_vals = std::get<2>(tuple);
613 constexpr double eps = 1e-10;
616 t_b(
i,
j) -= (t_a(
i,
j) || t_a(
j,
i)) / 2;
617 auto norm2_t_b = t_b(
i,
j) * t_b(
i,
j);
619 <<
"Result should be matrix itself " << norm2_t_b;
622 "This norm should be zero");
628 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d_a";
629 print_ddg(t_d_a,
"hand ");
630 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d";
631 print_ddg(t_d,
"code ");
634 <<
"Direvarive hand calculation minus code " << nrm2_t_d_a;
635 if (nrm2_t_d_a >
eps)
637 "This norm should be zero");
641 auto f = [](
double v) {
return v *
v; };
642 auto d_f = [](
double v) {
return 2 *
v; };
643 auto dd_f = [](
double v) {
return 2; };
646 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d_a";
647 print_ddg(t_d_a,
"hand ");
648 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d";
649 print_ddg(t_d,
"code ");
652 <<
"Direvarive hand calculation minus code " << nrm2_t_d_a;
653 if (nrm2_t_d_a >
eps)
655 "This norm should be zero");
662 std::array<double, 9>
a{0.1, 0., 0.,
668 auto tuple = run_lapack(
a);
669 auto &t_a = std::get<0>(tuple);
670 auto &t_eig_vecs = std::get<1>(tuple);
671 auto &t_eig_vals = std::get<2>(tuple);
673 t_eig_vals(0) -= 1e-4;
674 t_eig_vals(2) += 1e-4;
676 constexpr double eps = 1e-10;
678 auto f = [](
double v) {
return v; };
679 auto d_f = [](
double v) {
return 1; };
680 auto dd_f = [](
double v) {
return 0; };
684 1., 1. / 2., 1. / 3.,
686 2. / 2., 1., 2. / 3.,
688 3. / 2., 1., 3. / 3.};
691 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
696 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_dd";
697 print_ddg(t_dd,
"test ");
701 <<
"Direvarive hand calculation minus code " << nrm2_t_dd;
704 "This norm should be zero");
710 std::array<double, 9>
a{2, 0., 0.,
716 auto tuple = run_lapack(
a);
717 auto &t_a = std::get<0>(tuple);
718 auto &t_eig_vecs = std::get<1>(tuple);
719 auto &t_eig_vals = std::get<2>(tuple);
721 constexpr double eps = 1e-10;
723 auto f = [](
double v) {
return v *
v; };
724 auto d_f = [](
double v) {
return 2 *
v; };
725 auto dd_f = [](
double v) {
return 2; };
728 1., 1. / 2., 1. / 3.,
730 2. / 1., 1., 2. / 3.,
732 3. / 1., 3. / 1., 1.};
735 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
745 <<
"Direvarive hand calculation minus code " << nrm2_t_dd_a;
746 if (nrm2_t_dd_a >
eps)
748 "This norm should be zero");
754 std::array<double, 9>
a{5., 4., 0.,
760 auto tuple = run_lapack(
a, swap01);
761 auto &t_a = std::get<0>(tuple);
762 auto &t_eig_vecs = std::get<1>(tuple);
763 auto &t_eig_vals = std::get<2>(tuple);
765 constexpr double eps = 1e-10;
767 auto f = [](
double v) {
return v *
v; };
768 auto d_f = [](
double v) {
return 2 *
v; };
769 auto dd_f = [](
double v) {
return 2; };
773 1., 1. / 2., 1. / 3.,
775 2. / 1., 1., 2. / 3.,
777 3. / 1., 3. / 1., 1.};
780 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
784 print_ddg(t_dd,
"test ");
790 <<
"Direvarive hand calculation minus code " << nrm2_t_dd_a;
791 if (nrm2_t_dd_a >
eps)
793 "This norm should be zero");
799 std::array<double, 9>
a{2, 0., 0.,
805 auto tuple = run_lapack(
a);
806 auto &t_a = std::get<0>(tuple);
807 auto &t_eig_vecs = std::get<1>(tuple);
808 auto &t_eig_vals = std::get<2>(tuple);
810 t_eig_vals(0) -= 1e-5;
811 t_eig_vals(2) += 1e-5;
813 constexpr double eps = 1e-7;
815 auto f = [](
double v) {
return exp(
v); };
816 auto d_f = [](
double v) {
return exp(
v); };
817 auto dd_f = [](
double v) {
return exp(
v); };
820 1., 1. / 2., 1. / 3.,
822 2. / 1., 1., 2. / 3.,
824 3. / 1., 3. / 1., 1.};
827 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
836 <<
"Direvarive nor t_dd_1 " << nrm2_t_dd_t1;
840 <<
"Direvarive norm t_dd_2 " << nrm2_t_dd_t2;
842 print_ddg(t_dd_1,
"t_dd_1 ");
843 print_ddg(t_dd_2,
"t_dd_2 ");
846 t_dd_3(
i,
j,
k,
l) = t_dd_1(
i,
j,
k,
l) - t_dd_2(
i,
j,
k,
l);
848 for (
int ii = 0; ii != 3; ++ii)
849 for (
int jj = 0; jj != 3; ++jj)
850 for (
int kk = 0; kk != 3; ++kk)
851 for (
int ll = 0; ll != 3; ++ll) {
852 constexpr double eps = 1e-4;
853 if (std::abs(t_dd_3(ii, jj, kk, ll)) >
eps)
855 <<
"Error " << ii <<
" " << jj <<
" " << kk <<
" " << ll
856 <<
" " << t_dd_1(ii, jj, kk, ll) <<
" "
857 << t_dd_2(ii, jj, kk, ll);
862 <<
"Direvarive approx. calculation minus code " << nrm2_t_dd_3;
863 if (nrm2_t_dd_3 >
eps)
865 "This norm should be zero");
871 std::array<double, 9>
a{5., 4., 0.,
877 auto tuple = run_lapack(
a, swap01);
878 auto &t_a = std::get<0>(tuple);
879 auto &t_eig_vecs = std::get<1>(tuple);
880 auto &t_eig_vals = std::get<2>(tuple);
882 t_eig_vals(0) -= 1e-4;
883 t_eig_vals(2) += 1e-4;
885 constexpr double eps = 1e-4;
887 auto f = [](
double v) {
return v *
v; };
888 auto d_f = [](
double v) {
return 2 *
v; };
889 auto dd_f = [](
double v) {
return 2; };
893 1., 1. / 2., 1. / 3.,
895 2. / 1., 1., 2. / 3.,
897 3. / 1., 3. / 1., 1.};
900 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
909 <<
"Direvarive nor t_dd_1 " << nrm2_t_dd_t1;
913 <<
"Direvarive norm t_dd_2 " << nrm2_t_dd_t2;
915 print_ddg(t_dd_1,
"t_dd_1 ");
916 print_ddg(t_dd_2,
"t_dd_2 ");
919 t_dd_3(
i,
j,
k,
l) = t_dd_1(
i,
j,
k,
l) - t_dd_2(
i,
j,
k,
l);
921 for (
int ii = 0; ii != 3; ++ii)
922 for (
int jj = 0; jj != 3; ++jj)
923 for (
int kk = 0; kk != 3; ++kk)
924 for (
int ll = 0; ll != 3; ++ll) {
925 constexpr double eps = 1e-3;
926 if (std::abs(t_dd_3(ii, jj, kk, ll)) >
eps)
928 <<
"Error " << ii <<
" " << jj <<
" " << kk <<
" " << ll
929 <<
" " << t_dd_1(ii, jj, kk, ll) <<
" "
930 << t_dd_2(ii, jj, kk, ll);
935 <<
"Direvarive approx. calculation minus code " << nrm2_t_dd_3;
936 if (nrm2_t_dd_3 >
eps)
938 "This norm should be zero");
944 std::array<double, 9>
a{5., 4., 0.,
950 auto tuple = run_lapack(
a, swap01);
951 auto &t_a = std::get<0>(tuple);
952 auto &t_eig_vecs = std::get<1>(tuple);
953 auto &t_eig_vals = std::get<2>(tuple);
955 constexpr double eps = 1e-4;
958 auto f = [](
double v) {
return pow(
v,
p); };
959 auto d_f = [](
double v) {
return p * pow(
v,
p - 1); };
960 auto dd_f = [](
double v) {
961 return p * (
p - 1) * pow(
v, std::max(0,
p - 2));
966 1., 1. / 2., 1. / 3.,
968 2. / 1., 1., 2. / 3.,
970 3. / 1., 3. / 1., 1.};
975 t_eig_vals(0) += 2e-5;
976 t_eig_vals(2) -= 2e-5;
984 <<
"Direvarive nor t_dd_1 " << nrm2_t_dd_t1;
988 <<
"Direvarive norm t_dd_2 " << nrm2_t_dd_t2;
990 print_ddg(t_dd_1,
"t_dd_1 ");
991 print_ddg(t_dd_2,
"t_dd_2 ");
994 t_dd_3(
i,
j,
k,
l) = t_dd_1(
i,
j,
k,
l) - t_dd_2(
i,
j,
k,
l);
996 for (
int ii = 0; ii != 3; ++ii)
997 for (
int jj = 0; jj != 3; ++jj)
998 for (
int kk = 0; kk != 3; ++kk)
999 for (
int ll = 0; ll != 3; ++ll) {
1000 constexpr double eps = 1e-3;
1001 if (std::abs(t_dd_3(ii, jj, kk, ll)) >
eps)
1003 <<
"Error " << ii <<
" " << jj <<
" " << kk <<
" " << ll
1004 <<
" " << t_dd_1(ii, jj, kk, ll) <<
" "
1005 << t_dd_2(ii, jj, kk, ll) <<
" " << t_dd_3(ii, jj, kk, ll);
1010 <<
"Direvarive approx. calculation minus code " << nrm2_t_dd_3;
1011 if (nrm2_t_dd_3 >
eps)
1013 "This norm should be zero");
1019 std::array<double, 9>
a{1., 0.1, -0.5,
1025 auto tuple = run_lapack(
a);
1026 auto &t_a = std::get<0>(tuple);
1027 auto &t_eig_vecs = std::get<1>(tuple);
1028 auto &t_eig_vals = std::get<2>(tuple);
1030 auto f = [](
double v) {
return exp(
v); };
1031 auto d_f = [](
double v) {
return exp(
v); };
1032 auto dd_f = [](
double v) {
return exp(
v); };
1036 1., 1. / 2., 1. / 3.,
1038 2. / 1., 1., 2. / 3.,
1040 3. / 1., 3. / 1., 1.};
1043 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
1045 MOFEM_LOG(
"ATOM_TEST", Sev::inform) <<
"Start";
1046 for (
int ii = 0; ii != 1000; ++ii) {
1051 MOFEM_LOG(
"ATOM_TEST", Sev::inform) <<
"End";
1056 auto run_lapack_2d = [](
auto &
a) {
1069 info =
lapack_dsyev(
'V',
'U', 2,
a.data(), 2, w, &wkopt, lwork);
1071 THROW_MESSAGE(
"The algorithm failed to compute eigenvalues.");
1073 std::vector<double> work(lwork);
1075 info =
lapack_dsyev(
'V',
'U', 2,
a.data(), 2, w, &*work.begin(), lwork);
1077 THROW_MESSAGE(
"The algorithm failed to compute eigenvalues.");
1081 a[0 * 2 + 0],
a[0 * 2 + 1],
1083 a[1 * 2 + 0],
a[1 * 2 + 1]};
1087 return std::make_tuple(t_a, t_eig_vecs, t_eig_vals);
1093 std::array<double, 9>
a{1., 0.1,
1097 auto tuple = run_lapack_2d(
a);
1098 auto &t_A = std::get<0>(tuple);
1099 auto &t_eig_vecs = std::get<1>(tuple);
1100 auto &t_eig_vals = std::get<2>(tuple);
1102 auto f = [](
double v) {
return v *
v; };
1103 auto d_f = [](
double v) {
return 2 *
v; };
1104 auto dd_f = [](
double v) {
return 2; };
1106 constexpr double eps = 1e-6;
1117 t_a(
i,
j) = t_b(
i,
j) - t_A(
i,
k) * t_A(
k,
j);
1119 auto norm2_t_a = t_a(
i,
j) * t_a(
i,
j);
1121 <<
"Result should be matrix times matrix " << norm2_t_a;
1122 if (norm2_t_a >
eps)
1124 "This norm should be zero");
1133 <<
"Direvarive hand calculation minus code " << nrm2_t_d_a;
1134 if (nrm2_t_d_a >
eps)
1136 "This norm should be zero");
1156 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_dd_a";
1157 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_dd";
1161 <<
"Direvarive hand calculation minus code " << nrm2_t_dd_a;
1162 if (nrm2_t_dd_a >
eps)
1164 "This norm should be zero");
1171 std::array<double, 9>
a{2., 0,
1175 auto tuple = run_lapack_2d(
a);
1176 auto &t_A = std::get<0>(tuple);
1177 auto &t_eig_vecs = std::get<1>(tuple);
1178 auto &t_eig_vals = std::get<2>(tuple);
1180 auto f = [](
double v) {
return v *
v; };
1181 auto d_f = [](
double v) {
return 2 *
v; };
1182 auto dd_f = [](
double v) {
return 2; };
1184 constexpr double eps = 1e-6;
1195 t_a(
i,
j) = t_b(
i,
j) - t_A(
i,
k) * t_A(
k,
j);
1197 auto norm2_t_a = t_a(
i,
j) * t_a(
i,
j);
1199 <<
"Result should be matrix times matrix " << norm2_t_a;
1200 if (norm2_t_a >
eps)
1202 "This norm should be zero");
1211 <<
"Direvarive hand calculation minus code " << nrm2_t_d_a;
1212 if (nrm2_t_d_a >
eps)
1214 "This norm should be zero");
1228 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
1234 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_dd_a";
1235 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_dd";
1239 <<
"Direvarive hand calculation minus code " << nrm2_t_dd_a;
1240 if (nrm2_t_dd_a >
eps)
1242 "This norm should be zero");
Tensors class implemented by Walter Landry.
Kronecker Delta class symmetric.
#define CATCH_ERRORS
Catch errors.
@ MOFEM_ATOM_TEST_INVALID
#define CHKERR
Inline error check.
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
static LoggerType & setLog(const std::string channel)
Set ans resset chanel logger.
#define MOFEM_LOG(channel, severity)
Log.
#define MOFEM_LOG_ATTRIBUTES(channel, bit)
Add attributes to channel.
const double v
phase velocity of light in medium (cm/ns)
static __CLPK_integer lapack_dsyev(char jobz, char uplo, __CLPK_integer n, __CLPK_doublereal *a, __CLPK_integer lda, __CLPK_doublereal *w, __CLPK_doublereal *work, __CLPK_integer lwork)
auto get_diff_matrix(T1 &t_d, const FTensor::Number< DIM > &)
void diff_ddg(T1 &t_1, T2 &t_2, const FTensor::Number< DIM > &)
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
auto get_diff2_matrix2(T1 &t_s, T2 &t_dd, const FTensor::Number< DIM > &)
FTensor::Index< 'i', 3 > i
auto get_norm_t4(T &t, const FTensor::Number< DIM > &)
FTensor::Index< 'k', 3 > k
auto get_diff_matrix2(T1 &t_a, T2 &t_d, const FTensor::Number< DIM > &)
FTensor::Ddg< double, 3, 3 > getDiffMat(Val< double, 3 > &t_val, Vec< double, 3 > &t_vec, Fun< double > f, Fun< double > d_f, const int nb)
Get the Diff Mat object.
FTensor::Tensor2_symmetric< double, 3 > getMat(Val< double, 3 > &t_val, Vec< double, 3 > &t_vec, Fun< double > f)
Get the Mat object.
FTensor::Ddg< double, 3, 3 > getDiffDiffMat(Val< double, 3 > &t_val, Vec< double, 3 > &t_vec, Fun< double > f, Fun< double > d_f, Fun< double > dd_f, FTensor::Tensor2< double, 3, 3 > &t_S, const int nb)
implementation of Data Operators for Forces and Sources
constexpr double t
plate stiffness
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
static boost::shared_ptr< SinkType > createSink(boost::shared_ptr< std::ostream > stream_ptr, std::string comm_filter)
Create a sink object.
static boost::shared_ptr< std::ostream > getStrmSelf()
Get the strm self object.