357 typename Spline::value_type tol = 1e-12) {
362 if constexpr (precompute) {
363 auto knot_indices = bspline.find_knot_indices(xi);
364 auto coeff_indices = bspline.find_coeff_indices(knot_indices);
365 bspline_hess_val = bspline.hess(xi, knot_indices, coeff_indices);
367 bspline_hess_val = bspline.hess(xi);
369 if constexpr (Spline::parDim() >= 1) {
371 EXPECT_TRUE(torch::allclose(
372 bspline_hess_val(0, 0, k),
373 bspline.template eval<iganet::deriv::dx ^ 2, memory_optimized>(xi)(
377 if constexpr (Spline::parDim() >= 2) {
379 EXPECT_TRUE(torch::allclose(
380 bspline_hess_val(0, 1, k),
382 memory_optimized>(xi)(k)));
383 EXPECT_TRUE(torch::allclose(
384 bspline_hess_val(1, 0, k),
386 memory_optimized>(xi)(k)));
387 EXPECT_TRUE(torch::allclose(
388 bspline_hess_val(1, 1, k),
389 bspline.template eval<iganet::deriv::dy ^ 2, memory_optimized>(xi)(
394 if constexpr (Spline::parDim() >= 3) {
396 EXPECT_TRUE(torch::allclose(
397 bspline_hess_val(0, 2, k),
399 memory_optimized>(xi)(k)));
400 EXPECT_TRUE(torch::allclose(
401 bspline_hess_val(1, 2, k),
403 memory_optimized>(xi)(k)));
404 EXPECT_TRUE(torch::allclose(
405 bspline_hess_val(2, 0, k),
407 memory_optimized>(xi)(k)));
408 EXPECT_TRUE(torch::allclose(
409 bspline_hess_val(2, 1, k),
411 memory_optimized>(xi)(k)));
412 EXPECT_TRUE(torch::allclose(
413 bspline_hess_val(2, 2, k),
414 bspline.template eval<iganet::deriv::dz ^ 2, memory_optimized>(xi)(
419 if constexpr (Spline::parDim() >= 4) {
421 EXPECT_TRUE(torch::allclose(
422 bspline_hess_val(0, 3, k),
424 memory_optimized>(xi)(k)));
425 EXPECT_TRUE(torch::allclose(
426 bspline_hess_val(1, 3, k),
428 memory_optimized>(xi)(k)));
429 EXPECT_TRUE(torch::allclose(
430 bspline_hess_val(2, 3, k),
432 memory_optimized>(xi)(k)));
433 EXPECT_TRUE(torch::allclose(
434 bspline_hess_val(3, 0, k),
436 memory_optimized>(xi)(k)));
437 EXPECT_TRUE(torch::allclose(
438 bspline_hess_val(3, 1, k),
440 memory_optimized>(xi)(k)));
441 EXPECT_TRUE(torch::allclose(
442 bspline_hess_val(3, 2, k),
444 memory_optimized>(xi)(k)));
445 EXPECT_TRUE(torch::allclose(
446 bspline_hess_val(3, 3, k),
447 bspline.template eval<iganet::deriv::dt ^ 2, memory_optimized>(xi)(
456 const TensorArray_t &xi,
457 typename Spline::value_type tol = 1e-12) {
462 if constexpr (precompute) {
463 auto knot_indices = bspline.find_knot_indices(xi);
464 auto coeff_indices = bspline.find_coeff_indices(knot_indices);
465 auto knot_indices_G = geometry.find_knot_indices(xi);
466 auto coeff_indices_G = geometry.find_coeff_indices(knot_indices_G);
467 bspline_ihess_val = bspline.ihess(geometry, xi, knot_indices, coeff_indices,
468 knot_indices_G, coeff_indices_G);
470 bspline_ihess_val = bspline.ihess(geometry, xi);
472 if constexpr (Spline::parDim() >= 1) {
474 EXPECT_TRUE(torch::allclose(
475 bspline_ihess_val(0, 0, k),
476 bspline.template eval<iganet::deriv::dx ^ 2, memory_optimized>(xi)(
480 if constexpr (Spline::parDim() >= 2) {
482 EXPECT_TRUE(torch::allclose(
483 bspline_ihess_val(0, 1, k),
485 memory_optimized>(xi)(k)));
486 EXPECT_TRUE(torch::allclose(
487 bspline_ihess_val(1, 0, k),
489 memory_optimized>(xi)(k)));
490 EXPECT_TRUE(torch::allclose(
491 bspline_ihess_val(1, 1, k),
492 bspline.template eval<iganet::deriv::dy ^ 2, memory_optimized>(xi)(
497 if constexpr (Spline::parDim() >= 3) {
499 EXPECT_TRUE(torch::allclose(
500 bspline_ihess_val(0, 2, k),
502 memory_optimized>(xi)(k)));
503 EXPECT_TRUE(torch::allclose(
504 bspline_ihess_val(1, 2, k),
506 memory_optimized>(xi)(k)));
507 EXPECT_TRUE(torch::allclose(
508 bspline_ihess_val(2, 0, k),
510 memory_optimized>(xi)(k)));
511 EXPECT_TRUE(torch::allclose(
512 bspline_ihess_val(2, 1, k),
514 memory_optimized>(xi)(k)));
515 EXPECT_TRUE(torch::allclose(
516 bspline_ihess_val(2, 2, k),
517 bspline.template eval<iganet::deriv::dz ^ 2, memory_optimized>(xi)(
522 if constexpr (Spline::parDim() >= 4) {
524 EXPECT_TRUE(torch::allclose(
525 bspline_ihess_val(0, 3, k),
527 memory_optimized>(xi)(k)));
528 EXPECT_TRUE(torch::allclose(
529 bspline_ihess_val(1, 3, k),
531 memory_optimized>(xi)(k)));
532 EXPECT_TRUE(torch::allclose(
533 bspline_ihess_val(2, 3, k),
535 memory_optimized>(xi)(k)));
536 EXPECT_TRUE(torch::allclose(
537 bspline_ihess_val(3, 0, k),
539 memory_optimized>(xi)(k)));
540 EXPECT_TRUE(torch::allclose(
541 bspline_ihess_val(3, 1, k),
543 memory_optimized>(xi)(k)));
544 EXPECT_TRUE(torch::allclose(
545 bspline_ihess_val(3, 2, k),
547 memory_optimized>(xi)(k)));
548 EXPECT_TRUE(torch::allclose(
549 bspline_ihess_val(3, 3, k),
550 bspline.template eval<iganet::deriv::dt ^ 2, memory_optimized>(xi)(
558 const TensorArray_t &xi,
559 typename Spline::value_type tol = 1e-12) {
564 test_bspline_eval<iganet::deriv::func, false, false>(
565 bspline, bsplinelib_bspline, xi, tol);
567 if constexpr (Spline::parDim() == 1) {
568 test_bspline_eval<iganet::deriv::dx, false, false>(
569 bspline, bsplinelib_bspline, xi, tol);
570 test_bspline_eval<iganet::deriv::dx ^ 2, false, false>(
571 bspline, bsplinelib_bspline, xi, tol);
572 test_bspline_eval<iganet::deriv::dx ^ 3, false, false>(
573 bspline, bsplinelib_bspline, xi, tol);
574 test_bspline_eval<iganet::deriv::dx ^ 4, false, false>(
575 bspline, bsplinelib_bspline, xi, tol);
578 if constexpr (Spline::parDim() == 2) {
579 test_bspline_eval<iganet::deriv::dy, false, false>(
580 bspline, bsplinelib_bspline, xi, tol);
581 test_bspline_eval<iganet::deriv::dy ^ 2, false, false>(
582 bspline, bsplinelib_bspline, xi, tol);
583 test_bspline_eval<iganet::deriv::dy ^ 3, false, false>(
584 bspline, bsplinelib_bspline, xi, tol);
585 test_bspline_eval<iganet::deriv::dy ^ 4, false, false>(
586 bspline, bsplinelib_bspline, xi, tol);
589 if constexpr (Spline::parDim() == 3) {
590 test_bspline_eval<iganet::deriv::dz, false, false>(
591 bspline, bsplinelib_bspline, xi, tol);
592 test_bspline_eval<iganet::deriv::dz ^ 2, false, false>(
593 bspline, bsplinelib_bspline, xi, tol);
594 test_bspline_eval<iganet::deriv::dz ^ 3, false, false>(
595 bspline, bsplinelib_bspline, xi, tol);
596 test_bspline_eval<iganet::deriv::dz ^ 4, false, false>(
597 bspline, bsplinelib_bspline, xi, tol);
600 if constexpr (Spline::parDim() == 4) {
601 test_bspline_eval<iganet::deriv::dt, false, false>(
602 bspline, bsplinelib_bspline, xi, tol);
603 test_bspline_eval<iganet::deriv::dt ^ 2, false, false>(
604 bspline, bsplinelib_bspline, xi, tol);
605 test_bspline_eval<iganet::deriv::dt ^ 3, false, false>(
606 bspline, bsplinelib_bspline, xi, tol);
607 test_bspline_eval<iganet::deriv::dt ^ 4, false, false>(
608 bspline, bsplinelib_bspline, xi, tol);
612 test_bspline_eval<iganet::deriv::func, true, false>(
613 bspline, bsplinelib_bspline, xi, tol);
615 if constexpr (Spline::parDim() == 1) {
616 test_bspline_eval<iganet::deriv::dx, true, false>(
617 bspline, bsplinelib_bspline, xi, tol);
618 test_bspline_eval<iganet::deriv::dx ^ 2, true, false>(
619 bspline, bsplinelib_bspline, xi, tol);
620 test_bspline_eval<iganet::deriv::dx ^ 3, true, false>(
621 bspline, bsplinelib_bspline, xi, tol);
622 test_bspline_eval<iganet::deriv::dx ^ 4, true, false>(
623 bspline, bsplinelib_bspline, xi, tol);
626 if constexpr (Spline::parDim() == 2) {
627 test_bspline_eval<iganet::deriv::dy, true, false>(
628 bspline, bsplinelib_bspline, xi, tol);
629 test_bspline_eval<iganet::deriv::dy ^ 2, true, false>(
630 bspline, bsplinelib_bspline, xi, tol);
631 test_bspline_eval<iganet::deriv::dy ^ 3, true, false>(
632 bspline, bsplinelib_bspline, xi, tol);
633 test_bspline_eval<iganet::deriv::dy ^ 4, true, false>(
634 bspline, bsplinelib_bspline, xi, tol);
637 if constexpr (Spline::parDim() == 3) {
638 test_bspline_eval<iganet::deriv::dz, true, false>(
639 bspline, bsplinelib_bspline, xi, tol);
640 test_bspline_eval<iganet::deriv::dz ^ 2, true, false>(
641 bspline, bsplinelib_bspline, xi, tol);
642 test_bspline_eval<iganet::deriv::dz ^ 3, true, false>(
643 bspline, bsplinelib_bspline, xi, tol);
644 test_bspline_eval<iganet::deriv::dz ^ 4, true, false>(
645 bspline, bsplinelib_bspline, xi, tol);
648 if constexpr (Spline::parDim() == 4) {
649 test_bspline_eval<iganet::deriv::dt, true, false>(
650 bspline, bsplinelib_bspline, xi, tol);
651 test_bspline_eval<iganet::deriv::dt ^ 2, true, false>(
652 bspline, bsplinelib_bspline, xi, tol);
653 test_bspline_eval<iganet::deriv::dt ^ 3, true, false>(
654 bspline, bsplinelib_bspline, xi, tol);
655 test_bspline_eval<iganet::deriv::dt ^ 4, true, false>(
656 bspline, bsplinelib_bspline, xi, tol);
661 test_bspline_eval<iganet::deriv::func, false, true>(
662 bspline, bsplinelib_bspline, xi, tol);
664 if constexpr (Spline::parDim() == 1) {
665 test_bspline_eval<iganet::deriv::dx, false, true>(
666 bspline, bsplinelib_bspline, xi, tol);
667 test_bspline_eval<iganet::deriv::dx ^ 2, false, true>(
668 bspline, bsplinelib_bspline, xi, tol);
669 test_bspline_eval<iganet::deriv::dx ^ 3, false, true>(
670 bspline, bsplinelib_bspline, xi, tol);
671 test_bspline_eval<iganet::deriv::dx ^ 4, false, true>(
672 bspline, bsplinelib_bspline, xi, tol);
675 if constexpr (Spline::parDim() == 2) {
676 test_bspline_eval<iganet::deriv::dy, false, true>(
677 bspline, bsplinelib_bspline, xi, tol);
678 test_bspline_eval<iganet::deriv::dy ^ 2, false, true>(
679 bspline, bsplinelib_bspline, xi, tol);
680 test_bspline_eval<iganet::deriv::dy ^ 3, false, true>(
681 bspline, bsplinelib_bspline, xi, tol);
682 test_bspline_eval<iganet::deriv::dy ^ 4, false, true>(
683 bspline, bsplinelib_bspline, xi, tol);
686 if constexpr (Spline::parDim() == 3) {
687 test_bspline_eval<iganet::deriv::dz, false, true>(
688 bspline, bsplinelib_bspline, xi, tol);
689 test_bspline_eval<iganet::deriv::dz ^ 2, false, true>(
690 bspline, bsplinelib_bspline, xi, tol);
691 test_bspline_eval<iganet::deriv::dz ^ 3, false, true>(
692 bspline, bsplinelib_bspline, xi, tol);
693 test_bspline_eval<iganet::deriv::dz ^ 4, false, true>(
694 bspline, bsplinelib_bspline, xi, tol);
697 if constexpr (Spline::parDim() == 4) {
698 test_bspline_eval<iganet::deriv::dt, false, true>(
699 bspline, bsplinelib_bspline, xi, tol);
700 test_bspline_eval<iganet::deriv::dt ^ 2, false, true>(
701 bspline, bsplinelib_bspline, xi, tol);
702 test_bspline_eval<iganet::deriv::dt ^ 3, false, true>(
703 bspline, bsplinelib_bspline, xi, tol);
704 test_bspline_eval<iganet::deriv::dt ^ 4, false, true>(
705 bspline, bsplinelib_bspline, xi, tol);
709 test_bspline_eval<iganet::deriv::func, true, true>(
710 bspline, bsplinelib_bspline, xi, tol);
712 if constexpr (Spline::parDim() == 1) {
713 test_bspline_eval<iganet::deriv::dx, true, true>(
714 bspline, bsplinelib_bspline, xi, tol);
715 test_bspline_eval<iganet::deriv::dx ^ 2, true, true>(
716 bspline, bsplinelib_bspline, xi, tol);
717 test_bspline_eval<iganet::deriv::dx ^ 3, true, true>(
718 bspline, bsplinelib_bspline, xi, tol);
719 test_bspline_eval<iganet::deriv::dx ^ 4, true, true>(
720 bspline, bsplinelib_bspline, xi, tol);
723 if constexpr (Spline::parDim() == 2) {
724 test_bspline_eval<iganet::deriv::dy, true, true>(
725 bspline, bsplinelib_bspline, xi, tol);
726 test_bspline_eval<iganet::deriv::dy ^ 2, true, true>(
727 bspline, bsplinelib_bspline, xi, tol);
728 test_bspline_eval<iganet::deriv::dy ^ 3, true, true>(
729 bspline, bsplinelib_bspline, xi, tol);
730 test_bspline_eval<iganet::deriv::dy ^ 4, true, true>(
731 bspline, bsplinelib_bspline, xi, tol);
734 if constexpr (Spline::parDim() == 3) {
735 test_bspline_eval<iganet::deriv::dz, true, true>(
736 bspline, bsplinelib_bspline, xi, tol);
737 test_bspline_eval<iganet::deriv::dz ^ 2, true, true>(
738 bspline, bsplinelib_bspline, xi, tol);
739 test_bspline_eval<iganet::deriv::dz ^ 3, true, true>(
740 bspline, bsplinelib_bspline, xi, tol);
741 test_bspline_eval<iganet::deriv::dz ^ 4, true, true>(
742 bspline, bsplinelib_bspline, xi, tol);
745 if constexpr (Spline::parDim() == 4) {
746 test_bspline_eval<iganet::deriv::dt, true, true>(
747 bspline, bsplinelib_bspline, xi, tol);
748 test_bspline_eval<iganet::deriv::dt ^ 2, true, true>(
749 bspline, bsplinelib_bspline, xi, tol);
750 test_bspline_eval<iganet::deriv::dt ^ 3, true, true>(
751 bspline, bsplinelib_bspline, xi, tol);
752 test_bspline_eval<iganet::deriv::dt ^ 4, true, true>(
753 bspline, bsplinelib_bspline, xi, tol);
757 if constexpr (Spline::geoDim() == 1) {
758 test_bspline_grad<false, false>(bspline, xi, tol);
759 test_bspline_grad<false, true>(bspline, xi, tol);
760 test_bspline_grad<true, false>(bspline, xi, tol);
761 test_bspline_grad<true, true>(bspline, xi, tol);
763 test_bspline_igrad<false, false>(geometry, bspline, xi, tol);
764 test_bspline_igrad<false, true>(geometry, bspline, xi, tol);
765 test_bspline_igrad<true, false>(geometry, bspline, xi, tol);
766 test_bspline_igrad<true, true>(geometry, bspline, xi, tol);
770 test_bspline_jac<false, false>(bspline, xi, tol);
771 test_bspline_jac<false, true>(bspline, xi, tol);
772 test_bspline_jac<true, false>(bspline, xi, tol);
773 test_bspline_jac<true, true>(bspline, xi, tol);
775 test_bspline_ijac<false, false>(geometry, bspline, xi, tol);
776 test_bspline_ijac<false, true>(geometry, bspline, xi, tol);
777 test_bspline_ijac<true, false>(geometry, bspline, xi, tol);
778 test_bspline_ijac<true, true>(geometry, bspline, xi, tol);
781 if constexpr (Spline::geoDim() == 1) {
782 test_bspline_hess<false, false>(bspline, xi, tol);
783 test_bspline_hess<false, true>(bspline, xi, tol);
784 test_bspline_hess<true, false>(bspline, xi, tol);
785 test_bspline_hess<true, true>(bspline, xi, tol);
787 test_bspline_ihess<false, false>(geometry, bspline, xi, tol);
788 test_bspline_ihess<false, true>(geometry, bspline, xi, tol);
789 test_bspline_ihess<true, false>(geometry, bspline, xi, tol);
790 test_bspline_ihess<true, true>(geometry, bspline, xi, tol);