184int main(
int argc,
char *argv[]) {
188 auto core_log = logging::core::get();
192 BOOST_LOG_SCOPED_THREAD_ATTR(
"Timeline", attrs::timer());
197 auto print_ddg = [](
auto &
t,
auto str =
"") {
198 constexpr double eps = 1e-6;
199 for (
int ii = 0; ii != 3; ++ii)
200 for (
int jj = 0; jj != 3; ++jj)
201 for (
int kk = 0; kk != 3; ++kk)
202 for (
int ll = 0; ll != 3; ++ll) {
203 double v =
t(ii, jj, kk, ll);
204 double w = std::abs(
v) <
eps ? 0 :
v;
206 << str << std::fixed << std::setprecision(3) << std::showpos
207 << ii + 1 <<
" " << jj + 1 <<
" " << kk + 1 <<
" " << ll + 1
212 auto print_ddg_direction = [](
auto &
t,
auto kk,
int ll) {
213 for (
int ii = 0; ii != 3; ++ii)
214 for (
int jj = 0; jj <= ii; ++jj)
216 << ii + 1 <<
" " << jj + 1 <<
" " << kk + 1 <<
" " << ll + 1
217 <<
" : " <<
t(ii, jj, kk, ll);
221 for (
int ii = 0; ii != 3; ++ii)
222 for (
int jj = 0; jj != 3; ++jj)
224 << ii + 1 <<
" " << jj + 1 <<
" : " <<
t(ii, jj);
227 enum swap { swap12, swap01 };
228 auto run_lapack = [](
auto &
a, swap s = swap12) {
243 info =
lapack_dsyev(
'V',
'U', 3,
a.data(), 3, w, &wkopt, lwork);
245 THROW_MESSAGE(
"The algorithm failed to compute eigenvalues.");
247 std::vector<double> work(lwork);
249 info =
lapack_dsyev(
'V',
'U', 3,
a.data(), 3, w, &*work.begin(), lwork);
251 THROW_MESSAGE(
"The algorithm failed to compute eigenvalues.");
256 a[0 * 3 + 0],
a[0 * 3 + 1],
a[0 * 3 + 2],
258 a[2 * 3 + 0],
a[2 * 3 + 1],
a[2 * 3 + 2],
260 a[1 * 3 + 0],
a[1 * 3 + 1],
a[1 * 3 + 2]};
263 return std::make_tuple(t_a, t_eig_vec, t_eig_vals);
268 a[1 * 3 + 0],
a[1 * 3 + 1],
a[1 * 3 + 2],
270 a[0 * 3 + 0],
a[0 * 3 + 1],
a[0 * 3 + 2],
272 a[2 * 3 + 0],
a[2 * 3 + 1],
a[2 * 3 + 2],
277 return std::make_tuple(t_a, t_eig_vec, t_eig_vals);
292 0.969837, -0.0860972, 0.228042,
294 0.0790574, 0.996073, 0.0398449,
296 -0.230577, -0.0206147, 0.972836};
309 t_S_sym(
i,
j) = (t_S(
i,
j) || t_S(
j,
i)) / 2.;
311 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"Diff A";
316 auto f = [](
double v) {
return exp(
v); };
317 auto d_f = [](
double v) {
return exp(
v); };
318 auto dd_f = [](
double v) {
return exp(
v); };
321 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"Reconstruct mat";
326 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"Diff";
327 print_ddg_direction(t_d, 0, 2);
332 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"Diff Diff";
333 print_ddg_direction(t_dd, 0, 2);
335 auto norm2_t_b = t_b(
i,
j) * t_b(
i,
j);
336 MOFEM_LOG(
"ATOM_TEST", Sev::inform) <<
"norm2_t_b " << norm2_t_b;
339 MOFEM_LOG(
"ATOM_TEST", Sev::inform) <<
"norm2_t_d " << norm2_t_d;
342 MOFEM_LOG(
"ATOM_TEST", Sev::inform) <<
"norm2_t_dd " << norm2_t_dd;
344 constexpr double regression_t_b = 572.543;
345 constexpr double regression_t_d = 859.939;
346 constexpr double regression_t_dd = 859.939;
348 constexpr double eps = 1e-2;
349 if (std::abs(norm2_t_b - regression_t_b) >
eps)
351 if (std::abs(norm2_t_d - regression_t_d) >
eps)
353 if (std::abs(norm2_t_dd - regression_t_dd) >
eps)
363 std::array<double, 9>
a{1., 0.1, -0.5,
369 auto tuple = run_lapack(
a);
371 auto &t_eig_vec = std::get<1>(tuple);
372 auto &t_eig_vals = std::get<2>(tuple);
374 std::array<double, 3> sorted_reference_eigenvalues{
375 t_L(0), t_L(1), t_L(2)};
376 std::array<double, 3> sorted_lapack_eigenvalues{
377 t_eig_vals(0), t_eig_vals(1), t_eig_vals(2)};
378 std::sort(sorted_reference_eigenvalues.begin(),
379 sorted_reference_eigenvalues.end());
380 std::sort(sorted_lapack_eigenvalues.begin(),
381 sorted_lapack_eigenvalues.end());
383 double t_eig_val_diff = 0;
384 for (
int ii = 0; ii != 3; ++ii)
385 t_eig_val_diff += std::pow(sorted_lapack_eigenvalues[ii] -
386 sorted_reference_eigenvalues[ii],
389 <<
"Sorted eigenvalue difference " << t_eig_val_diff;
391 auto f = [](
double v) {
return exp(
v); };
395 t_c(
i,
j) -= t_b(
i,
j);
398 auto norm2_t_c = t_c(
i,
j) * t_c(
i,
j);
400 <<
"Reconstruct mat difference with LAPACK eigenvalues and "
404 constexpr double eps = 1e-8;
405 if (fabs(norm2_t_c) >
eps)
407 "Matrix not reconstructed");
416 auto f = [](
double v) {
return v; };
417 auto d_f = [](
double v) {
return 1; };
418 auto dd_f = [](
double v) {
return 0; };
420 constexpr double eps = 1e-10;
423 t_b(
i,
j) -= (t_A(
i,
j) || t_A(
j,
i)) / 2;
424 auto norm2_t_b = t_b(
i,
j) * t_b(
i,
j);
426 <<
"Result should be matrix itself " << norm2_t_b;
429 "This norm should be zero");
437 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d_a";
438 print_ddg(t_d_a,
"hand ");
439 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d";
440 print_ddg(t_d,
"code ");
444 <<
"Derivative hand calculation minus code " << nrm2_t_d_a;
445 if (nrm2_t_d_a >
eps)
447 "This norm should be zero");
460 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
466 MOFEM_LOG(
"ATOM_TEST", Sev::inform) <<
"norm2_t_dd " << norm2_t_dd;
467 if (norm2_t_dd >
eps)
469 "This norm should be zero");
475 auto f = [](
double v) {
return v *
v; };
476 auto d_f = [](
double v) {
return 2 *
v; };
477 auto dd_f = [](
double v) {
return 2; };
479 constexpr double eps = 1e-9;
485 t_a(
i,
j) = t_b(
i,
j) - t_A(
i,
k) * t_A(
k,
j);
487 auto norm2_t_a = t_a(
i,
j) * t_a(
i,
j);
489 <<
"Result should be matrix times matrix " << norm2_t_a;
492 "This norm should be zero");
498 print_ddg_direction(t_d, 0, 2);
500 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d_a";
501 print_ddg(t_d_a,
"hand ");
502 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d";
503 print_ddg(t_d,
"code ");
506 <<
"Derivative hand calculation minus code " << nrm2_t_d_a;
507 if (nrm2_t_d_a >
eps)
509 "This norm should be zero");
516 1., 1. / 2., 1. / 3.,
518 2. / 2., 1., 2. / 3.,
520 3. / 2., 1., 3. / 3.};
523 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
529 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_dd_a";
530 print_ddg(t_dd_a,
"hand ");
531 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_dd";
532 print_ddg(t_dd,
"code ");
536 <<
"Derivative hand calculation minus code " << nrm2_t_dd_a;
537 if (nrm2_t_dd_a >
eps)
539 "This norm should be zero");
547 std::array<double, 9>
a{5., 4., 0,
553 auto tuple = run_lapack(
a, swap01);
554 auto &t_a = std::get<0>(tuple);
555 auto &t_eig_vecs = std::get<1>(tuple);
556 auto &t_eig_vals = std::get<2>(tuple);
558 auto f = [](
double v) {
return v; };
559 auto d_f = [](
double v) {
return 1; };
561 constexpr double eps = 1e-10;
564 t_b(
i,
j) -= (t_a(
i,
j) || t_a(
j,
i)) / 2;
565 auto norm2_t_b = t_b(
i,
j) * t_b(
i,
j);
567 <<
"Result should be matrix itself " << norm2_t_b;
570 "This norm should be zero");
576 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d_a";
577 print_ddg(t_d_a,
"hand ");
578 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d";
579 print_ddg(t_d,
"code ");
582 <<
"Derivative hand calculation minus code " << nrm2_t_d_a;
583 if (nrm2_t_d_a >
eps)
585 "This norm should be zero");
589 auto f = [](
double v) {
return v *
v; };
590 auto d_f = [](
double v) {
return 2 *
v; };
593 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d_a";
594 print_ddg(t_d_a,
"hand ");
595 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d";
596 print_ddg(t_d,
"code ");
599 <<
"Derivative hand calculation minus code " << nrm2_t_d_a;
600 if (nrm2_t_d_a >
eps)
602 "This norm should be zero");
609 std::array<double, 9>
a{4., 0., 0,
615 auto f = [](
double v) {
return v; };
616 auto d_f = [](
double v) {
return 1; };
618 auto tuple = run_lapack(
a);
619 auto &t_a = std::get<0>(tuple);
620 auto &t_eig_vecs = std::get<1>(tuple);
621 auto &t_eig_vals = std::get<2>(tuple);
623 constexpr double eps = 1e-10;
626 t_b(
i,
j) -= (t_a(
i,
j) || t_a(
j,
i)) / 2;
627 auto norm2_t_b = t_b(
i,
j) * t_b(
i,
j);
629 <<
"Result should be matrix itself " << norm2_t_b;
632 "This norm should be zero");
638 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d_a";
639 print_ddg(t_d_a,
"hand ");
640 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d";
641 print_ddg(t_d,
"code ");
644 <<
"Derivative hand calculation minus code " << nrm2_t_d_a;
645 if (nrm2_t_d_a >
eps)
647 "This norm should be zero");
651 auto f = [](
double v) {
return v *
v; };
652 auto d_f = [](
double v) {
return 2 *
v; };
655 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d_a";
656 print_ddg(t_d_a,
"hand ");
657 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_d";
658 print_ddg(t_d,
"code ");
661 <<
"Derivative hand calculation minus code " << nrm2_t_d_a;
662 if (nrm2_t_d_a >
eps)
664 "This norm should be zero");
672 std::array<double, 9>
a{0.1, 0., 0.,
678 auto tuple = run_lapack(
a);
680 auto &t_eig_vecs = std::get<1>(tuple);
681 auto &t_eig_vals = std::get<2>(tuple);
683 t_eig_vals(0) -= 1e-5;
684 t_eig_vals(2) += 1e-5;
686 constexpr double eps = 1e-10;
688 auto f = [](
double v) {
return v; };
689 auto d_f = [](
double v) {
return 1; };
690 auto dd_f = [](
double v) {
return 0; };
694 1., 1. / 2., 1. / 3.,
696 2. / 2., 1., 2. / 3.,
698 3. / 2., 1., 3. / 3.};
701 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
706 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_dd";
707 print_ddg(t_dd,
"test ");
711 <<
"Second-derivative norm " << nrm2_t_dd;
714 "This norm should be zero");
721 std::array<double, 9>
a{2, 0., 0.,
727 auto tuple = run_lapack(
a);
729 auto &t_eig_vecs = std::get<1>(tuple);
730 auto &t_eig_vals = std::get<2>(tuple);
732 constexpr double eps = 1e-10;
734 auto f = [](
double v) {
return v *
v; };
735 auto d_f = [](
double v) {
return 2 *
v; };
736 auto dd_f = [](
double v) {
return 2; };
739 1., 1. / 2., 1. / 3.,
741 2. / 1., 1., 2. / 3.,
743 3. / 1., 3. / 1., 1.};
746 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
756 <<
"Derivative hand calculation minus code " << nrm2_t_dd_a;
757 if (nrm2_t_dd_a >
eps)
759 "This norm should be zero");
765 std::array<double, 9>
a{5., 4., 0.,
771 auto tuple = run_lapack(
a, swap01);
773 auto &t_eig_vecs = std::get<1>(tuple);
774 auto &t_eig_vals = std::get<2>(tuple);
776 constexpr double eps = 1e-10;
778 auto f = [](
double v) {
return v *
v; };
779 auto d_f = [](
double v) {
return 2 *
v; };
780 auto dd_f = [](
double v) {
return 2; };
784 1., 1. / 2., 1. / 3.,
786 2. / 1., 1., 2. / 3.,
788 3. / 1., 3. / 1., 1.};
791 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
795 print_ddg(t_dd,
"test ");
801 <<
"Derivative hand calculation minus code " << nrm2_t_dd_a;
802 if (nrm2_t_dd_a >
eps)
804 "This norm should be zero");
810 std::array<double, 9>
a{2, 0., 0.,
816 auto tuple = run_lapack(
a);
818 auto &t_eig_vecs = std::get<1>(tuple);
819 auto &t_eig_vals = std::get<2>(tuple);
821 t_eig_vals(0) -= 1e-5;
822 t_eig_vals(2) += 1e-5;
824 constexpr double eps = 1e-7;
826 auto f = [](
double v) {
return exp(
v); };
827 auto d_f = [](
double v) {
return exp(
v); };
828 auto dd_f = [](
double v) {
return exp(
v); };
831 1., 1. / 2., 1. / 3.,
833 2. / 1., 1., 2. / 3.,
835 3. / 1., 3. / 1., 1.};
838 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
847 <<
"Derivative norm t_dd_1 " << nrm2_t_dd_t1;
851 <<
"Derivative norm t_dd_2 " << nrm2_t_dd_t2;
853 print_ddg(t_dd_1,
"t_dd_1 ");
854 print_ddg(t_dd_2,
"t_dd_2 ");
857 t_dd_3(
i,
j,
k,
l) = t_dd_1(
i,
j,
k,
l) - t_dd_2(
i,
j,
k,
l);
859 for (
int ii = 0; ii != 3; ++ii)
860 for (
int jj = 0; jj != 3; ++jj)
861 for (
int kk = 0; kk != 3; ++kk)
862 for (
int ll = 0; ll != 3; ++ll) {
863 constexpr double eps = 1e-4;
864 if (std::abs(t_dd_3(ii, jj, kk, ll)) >
eps)
866 <<
"Error " << ii <<
" " << jj <<
" " << kk <<
" " << ll
867 <<
" " << t_dd_1(ii, jj, kk, ll) <<
" "
868 << t_dd_2(ii, jj, kk, ll);
873 <<
"Derivative branch difference " << nrm2_t_dd_3;
874 if (nrm2_t_dd_3 >
eps)
876 "This norm should be zero");
883 std::array<double, 9>
a{5., 4., 0.,
889 auto tuple = run_lapack(
a, swap01);
891 auto &t_eig_vecs = std::get<1>(tuple);
892 auto &t_eig_vals = std::get<2>(tuple);
894 t_eig_vals(0) -= 1e-4;
895 t_eig_vals(2) += 1e-4;
897 constexpr double eps = 1e-4;
899 auto f = [](
double v) {
return v *
v; };
900 auto d_f = [](
double v) {
return 2 *
v; };
901 auto dd_f = [](
double v) {
return 2; };
905 1., 1. / 2., 1. / 3.,
907 2. / 1., 1., 2. / 3.,
909 3. / 1., 3. / 1., 1.};
912 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
921 <<
"Derivative norm t_dd_1 " << nrm2_t_dd_t1;
925 <<
"Derivative norm t_dd_2 " << nrm2_t_dd_t2;
927 print_ddg(t_dd_1,
"t_dd_1 ");
928 print_ddg(t_dd_2,
"t_dd_2 ");
931 t_dd_3(
i,
j,
k,
l) = t_dd_1(
i,
j,
k,
l) - t_dd_2(
i,
j,
k,
l);
933 for (
int ii = 0; ii != 3; ++ii)
934 for (
int jj = 0; jj != 3; ++jj)
935 for (
int kk = 0; kk != 3; ++kk)
936 for (
int ll = 0; ll != 3; ++ll) {
937 constexpr double eps = 1e-3;
938 if (std::abs(t_dd_3(ii, jj, kk, ll)) >
eps)
940 <<
"Error " << ii <<
" " << jj <<
" " << kk <<
" " << ll
941 <<
" " << t_dd_1(ii, jj, kk, ll) <<
" "
942 << t_dd_2(ii, jj, kk, ll);
947 <<
"Derivative branch difference " << nrm2_t_dd_3;
948 if (nrm2_t_dd_3 >
eps)
950 "This norm should be zero");
957 std::array<double, 9>
a{5., 4., 0.,
963 auto tuple = run_lapack(
a, swap01);
965 auto &t_eig_vecs = std::get<1>(tuple);
966 auto &t_eig_vals = std::get<2>(tuple);
968 constexpr double eps = 1e-4;
971 auto f = [](
double v) {
return pow(
v, p); };
972 auto d_f = [](
double v) {
return p * pow(
v, p - 1); };
973 auto dd_f = [](
double v) {
974 return p * (p - 1) * pow(
v, std::max(0, p - 2));
979 1., 1. / 2., 1. / 3.,
981 2. / 1., 1., 2. / 3.,
983 3. / 1., 3. / 1., 1.};
988 t_eig_vals(0) += 2e-5;
989 t_eig_vals(2) -= 2e-5;
997 <<
"Derivative norm t_dd_1 " << nrm2_t_dd_t1;
1001 <<
"Derivative norm t_dd_2 " << nrm2_t_dd_t2;
1003 print_ddg(t_dd_1,
"t_dd_1 ");
1004 print_ddg(t_dd_2,
"t_dd_2 ");
1007 t_dd_3(
i,
j,
k,
l) = t_dd_1(
i,
j,
k,
l) - t_dd_2(
i,
j,
k,
l);
1009 for (
int ii = 0; ii != 3; ++ii)
1010 for (
int jj = 0; jj != 3; ++jj)
1011 for (
int kk = 0; kk != 3; ++kk)
1012 for (
int ll = 0; ll != 3; ++ll) {
1013 constexpr double eps = 1e-3;
1014 if (std::abs(t_dd_3(ii, jj, kk, ll)) >
eps)
1016 <<
"Error " << ii <<
" " << jj <<
" " << kk <<
" " << ll
1017 <<
" " << t_dd_1(ii, jj, kk, ll) <<
" "
1018 << t_dd_2(ii, jj, kk, ll) <<
" " << t_dd_3(ii, jj, kk, ll);
1023 <<
"Derivative branch difference " << nrm2_t_dd_3;
1024 if (nrm2_t_dd_3 >
eps)
1026 "This norm should be zero");
1032 std::array<double, 9>
a{1., 0.1, -0.5,
1038 auto tuple = run_lapack(
a);
1040 auto &t_eig_vecs = std::get<1>(tuple);
1041 auto &t_eig_vals = std::get<2>(tuple);
1043 auto f = [](
double v) {
return exp(
v); };
1044 auto d_f = [](
double v) {
return exp(
v); };
1045 auto dd_f = [](
double v) {
return exp(
v); };
1049 1., 1. / 2., 1. / 3.,
1051 2. / 1., 1., 2. / 3.,
1053 3. / 1., 3. / 1., 1.};
1056 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
1058 MOFEM_LOG(
"ATOM_TEST", Sev::inform) <<
"Start";
1059 for (
int ii = 0; ii != 1000; ++ii) {
1066 MOFEM_LOG(
"ATOM_TEST", Sev::inform) <<
"End";
1071 auto run_lapack_2d = [](
auto &
a) {
1084 info =
lapack_dsyev(
'V',
'U', 2,
a.data(), 2, w, &wkopt, lwork);
1086 THROW_MESSAGE(
"The algorithm failed to compute eigenvalues.");
1088 std::vector<double> work(lwork);
1090 info =
lapack_dsyev(
'V',
'U', 2,
a.data(), 2, w, &*work.begin(), lwork);
1092 THROW_MESSAGE(
"The algorithm failed to compute eigenvalues.");
1096 a[0 * 2 + 0],
a[0 * 2 + 1],
1098 a[1 * 2 + 0],
a[1 * 2 + 1]};
1102 return std::make_tuple(t_a, t_eig_vecs, t_eig_vals);
1108 std::array<double, 9>
a{1., 0.1,
1112 auto tuple = run_lapack_2d(
a);
1113 auto &t_A = std::get<0>(tuple);
1114 auto &t_eig_vecs = std::get<1>(tuple);
1115 auto &t_eig_vals = std::get<2>(tuple);
1117 auto f = [](
double v) {
return v *
v; };
1118 auto d_f = [](
double v) {
return 2 *
v; };
1119 auto dd_f = [](
double v) {
return 2; };
1121 constexpr double eps = 1e-6;
1132 t_a(
i,
j) = t_b(
i,
j) - t_A(
i,
k) * t_A(
k,
j);
1134 auto norm2_t_a = t_a(
i,
j) * t_a(
i,
j);
1136 <<
"Result should be matrix times matrix " << norm2_t_a;
1137 if (norm2_t_a >
eps)
1139 "This norm should be zero");
1148 <<
"Derivative hand calculation minus code " << nrm2_t_d_a;
1149 if (nrm2_t_d_a >
eps)
1151 "This norm should be zero");
1171 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_dd_a";
1172 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_dd";
1176 <<
"Derivative hand calculation minus code " << nrm2_t_dd_a;
1177 if (nrm2_t_dd_a >
eps)
1179 "This norm should be zero");
1186 std::array<double, 9>
a{2., 0,
1190 auto tuple = run_lapack_2d(
a);
1191 auto &t_A = std::get<0>(tuple);
1192 auto &t_eig_vecs = std::get<1>(tuple);
1193 auto &t_eig_vals = std::get<2>(tuple);
1195 auto f = [](
double v) {
return v *
v; };
1196 auto d_f = [](
double v) {
return 2 *
v; };
1197 auto dd_f = [](
double v) {
return 2; };
1199 constexpr double eps = 1e-6;
1210 t_a(
i,
j) = t_b(
i,
j) - t_A(
i,
k) * t_A(
k,
j);
1212 auto norm2_t_a = t_a(
i,
j) * t_a(
i,
j);
1214 <<
"Result should be matrix times matrix " << norm2_t_a;
1215 if (norm2_t_a >
eps)
1217 "This norm should be zero");
1226 <<
"Derivative hand calculation minus code " << nrm2_t_d_a;
1227 if (nrm2_t_d_a >
eps)
1229 "This norm should be zero");
1243 t_S_sym(
i,
j) = t_S(
i,
j) || t_S(
j,
i);
1249 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_dd_a";
1250 MOFEM_LOG(
"ATOM_TEST", Sev::verbose) <<
"t_dd";
1254 <<
"Derivative hand calculation minus code " << nrm2_t_dd_a;
1255 if (nrm2_t_dd_a >
eps)
1257 "This norm should be zero");