test_nurbs_volume.f90 Source File


This file depends on

sourcefile~~test_nurbs_volume.f90~~EfferentGraph sourcefile~test_nurbs_volume.f90 test_nurbs_volume.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~test_nurbs_volume.f90->sourcefile~forcad.f90 sourcefile~forcad_kinds.f90 forcad_kinds.F90 sourcefile~forcad.f90->sourcefile~forcad_kinds.f90 sourcefile~forcad_nurbs_curve.f90 forcad_nurbs_curve.f90 sourcefile~forcad.f90->sourcefile~forcad_nurbs_curve.f90 sourcefile~forcad_nurbs_surface.f90 forcad_nurbs_surface.f90 sourcefile~forcad.f90->sourcefile~forcad_nurbs_surface.f90 sourcefile~forcad_nurbs_volume.f90 forcad_nurbs_volume.f90 sourcefile~forcad.f90->sourcefile~forcad_nurbs_volume.f90 sourcefile~forcad_utils.f90 forcad_utils.f90 sourcefile~forcad.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_curve.f90->sourcefile~forcad_kinds.f90 sourcefile~forcad_nurbs_curve.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_kinds.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_kinds.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_utils.f90->sourcefile~forcad_kinds.f90

Source Code

program test_nurbs_volume

    use forcad, only: rk, nurbs_volume
    use forunittest, only: unit_test

    implicit none
    type(nurbs_volume) :: nurbs, bsp
    real(rk), allocatable :: Xc(:,:), Wc(:)
    real(rk), allocatable :: Xg(:,:), Xgb(:,:)
    integer, allocatable :: elemConn(:,:)
    real(rk), allocatable :: Tgc(:,:), dTgc(:,:,:), Tgcb(:,:), dTgcb(:,:,:), d2Tgc(:,:,:), d2Tgcb(:,:,:)
    real(rk), allocatable :: Tgc1(:), dTgc1(:,:), Tgc1b(:), dTgc1b(:,:), d2Tgc1(:,:), d2Tgc1b(:,:)
    real(rk) :: knot1(4), knot2(4), knot3(4), volume, volumeb
    integer :: i, id
    real(rk), allocatable :: nearest_Xg(:), nearest_Xt(:)
    type(unit_test) :: ut

    allocate(Xc(8, 3))
    Xc(1,:) = [0.0_rk, 0.0_rk, 0.0_rk]
    Xc(2,:) = [5.0_rk, 0.0_rk, 0.0_rk]
    Xc(3,:) = [0.0_rk, 5.0_rk, 0.0_rk]
    Xc(4,:) = [5.0_rk, 5.0_rk, 0.0_rk]
    Xc(5,:) = [0.0_rk, 0.0_rk, 5.0_rk]
    Xc(6,:) = [5.0_rk, 0.0_rk, 5.0_rk]
    Xc(7,:) = [0.0_rk, 5.0_rk, 5.0_rk]
    Xc(8,:) = [5.0_rk, 5.0_rk, 5.0_rk]

    allocate(Wc(size(Xc, 1)))
    Wc = 1.0_rk
    Wc(2) = 0.9_rk

    knot1 = [0.0_rk, 0.0_rk, 1.0_rk, 1.0_rk]
    knot2 = [0.0_rk, 0.0_rk, 1.0_rk, 1.0_rk]
    knot3 = [0.0_rk, 0.0_rk, 1.0_rk, 1.0_rk]

    call nurbs%set(knot1, knot2, knot3, Xc, Wc)
    call bsp%set(knot1, knot2, knot3, Xc)

    call nurbs%set(degree=nurbs%get_degree(), nc=nurbs%get_nc(), Xc=nurbs%get_Xc(), Wc=nurbs%get_Wc())
    call bsp%set(degree=nurbs%get_degree(), nc=nurbs%get_nc(), Xc=nurbs%get_Xc())

    call nurbs%create(20, 20, 20)
    call bsp%create(20, 20, 20)

    call nurbs%export_Xc("vtk/test_nurbs_volume_Xc.vtk")
    call bsp%export_Xc("vtk/test_bsp_volume_Xc.vtk")

    call nurbs%export_Xg("vtk/test_nurbs_volume_Xg.vtk")
    call bsp%export_Xg("vtk/test_bsp_volume_Xg.vtk")

    call nurbs%export_Xth("vtk/test_nurbs_volume_Xth.vtk")
    call bsp%export_Xth("vtk/test_bsp_volume_Xth.vtk")

    call nurbs%cmp_volume(volume)
    call bsp%cmp_volume(volumeb)

    call ut%check(res=volume, expected=125.0_rk,  tol=1e-5_rk, msg="test_nurbs_volume: 01")
    call ut%check(res=volumeb, expected=125.0_rk,  tol=1e-5_rk, msg="test_nurbs_volume: 02")

    call nurbs%nearest_point([0.0_rk, 0.0_rk, -0.5_rk], nearest_Xg, nearest_Xt, id)
    call ut%check(res=nearest_Xg, expected=[0.0_rk, 0.0_rk, 0.0_rk],  tol=1e-5_rk, msg="test_nurbs_volume: 03")
    call ut%check(res=nearest_Xt, expected=[0.0_rk, 0.0_rk, 0.0_rk],  tol=1e-5_rk, msg="test_nurbs_volume: 04")
    call ut%check(res=id, expected=1, msg="test_nurbs_volume: 05")

    call bsp%nearest_point([0.0_rk, 0.0_rk, -0.5_rk], nearest_Xg, nearest_Xt, id)
    call ut%check(res=nearest_Xg, expected=[0.0_rk, 0.0_rk, 0.0_rk],  tol=1e-5_rk, msg="test_nurbs_volume: 06")
    call ut%check(res=nearest_Xt, expected=[0.0_rk, 0.0_rk, 0.0_rk],  tol=1e-5_rk, msg="test_nurbs_volume: 07")
    call ut%check(res=id, expected=1, msg="test_nurbs_volume: 08")

    call nurbs%nearest_point2([0.0_rk, 0.0_rk, -0.5_rk], 1e-10_rk, 10, nearest_Xt, nearest_Xg)
    call ut%check(res=nearest_Xg, expected=[0.0_rk, 0.0_rk, 0.0_rk],  tol=1e-5_rk, msg="test_nurbs_volume: 09")
    call ut%check(res=nearest_Xt, expected=[0.0_rk, 0.0_rk, 0.0_rk],  tol=1e-5_rk, msg="test_nurbs_volume: 10")

    call bsp%nearest_point2([0.0_rk, 0.0_rk, -0.5_rk], 1e-10_rk, 10, nearest_Xt, nearest_Xg)
    call ut%check(res=nearest_Xg, expected=[0.0_rk, 0.0_rk, 0.0_rk],  tol=1e-5_rk, msg="test_nurbs_volume: 11")
    call ut%check(res=nearest_Xt, expected=[0.0_rk, 0.0_rk, 0.0_rk],  tol=1e-5_rk, msg="test_nurbs_volume: 12")

    Xg = nurbs%get_Xg()
    Xgb = bsp%get_Xg()

    call nurbs%set([0.0_rk, 1.0_rk], [0.0_rk, 1.0_rk], [0.0_rk, 1.0_rk], [1,1,1], [-1, -1], [-1, -1], [-1, -1], Xc, Wc)
    call bsp%set([0.0_rk, 1.0_rk], [0.0_rk, 1.0_rk], [0.0_rk, 1.0_rk], [1,1,1], [-1, -1], [-1, -1], [-1, -1], Xc)

    call ut%check(res=nurbs%get_Xg(), expected=Xg,  tol=1e-5_rk, msg="test_nurbs_volume: 13")
    call ut%check(res=bsp%get_Xg(),   expected=Xgb, tol=1e-5_rk, msg="test_nurbs_volume: 14")

    call nurbs%set([2,2,2], Xc, Wc)
    call bsp%set([2,2,2], Xc)

    call ut%check(res=nurbs%get_Xg(), expected=Xg,  tol=1e-5_rk, msg="test_nurbs_volume: 15")
    call ut%check(res=bsp%get_Xg(),   expected=Xgb, tol=1e-5_rk, msg="test_nurbs_volume: 16")


    call nurbs%create(Xt1 = nurbs%get_Xt(1), Xt2 = nurbs%get_Xt(2))
    call bsp%create(Xt1 = bsp%get_Xt(1), Xt2 = nurbs%get_Xt(2))

    call nurbs%export_Xc("vtk/test_nurbs_volume_Xc.vtk")
    call bsp%export_Xc("vtk/test_bsp_volume_Xc.vtk")

    call nurbs%export_Xg("vtk/test_nurbs_volume_Xg.vtk")
    call bsp%export_Xg("vtk/test_bsp_volume_Xg.vtk")

    call nurbs%export_Xth("vtk/test_nurbs_volume_Xth.vtk")
    call bsp%export_Xth("vtk/test_bsp_volume_Xth.vtk")

    call ut%check(res=nurbs%get_Xg(), expected=Xg,  tol=1e-5_rk, msg="test_nurbs_volume: 17")
    call ut%check(res=bsp%get_Xg(),   expected=Xgb, tol=1e-5_rk, msg="test_nurbs_volume: 18")

    call ut%check(res=nurbs%get_Xc(), expected=Xc,  tol=1e-5_rk, msg="test_nurbs_volume: 19")
    call ut%check(res=bsp%get_Xc(),   expected=Xc, tol=1e-5_rk, msg="test_nurbs_volume: 20")

    call ut%check(res=nurbs%get_Xc(1), expected=Xc(1,:),  tol=1e-5_rk, msg="test_nurbs_volume: 21")
    call ut%check(res=bsp%get_Xc(1),   expected=Xc(1,:), tol=1e-5_rk, msg="test_nurbs_volume: 22")

    call ut%check(res=nurbs%get_Xc(1,1), expected=Xc(1,1),  tol=1e-5_rk, msg="test_nurbs_volume: 23")
    call ut%check(res=bsp%get_Xc(1,1),   expected=Xc(1,1), tol=1e-5_rk, msg="test_nurbs_volume: 24")

    call ut%check(res=nurbs%get_Xg(), expected=Xg,  tol=1e-5_rk, msg="test_nurbs_volume: 25")
    call ut%check(res=bsp%get_Xg(),   expected=Xgb, tol=1e-5_rk, msg="test_nurbs_volume: 26")

    call ut%check(res=nurbs%get_Xg(1), expected=Xg(1,:),  tol=1e-5_rk, msg="test_nurbs_volume: 27")
    call ut%check(res=bsp%get_Xg(1),   expected=Xgb(1,:), tol=1e-5_rk, msg="test_nurbs_volume: 28")

    call ut%check(res=nurbs%get_Xg(1,1), expected=Xg(1,1),  tol=1e-5_rk, msg="test_nurbs_volume: 29")
    call ut%check(res=bsp%get_Xg(1,1),   expected=Xgb(1,1), tol=1e-5_rk, msg="test_nurbs_volume: 30")

    call ut%check(res=nurbs%get_Wc(), expected=Wc,  tol=1e-5_rk, msg="test_nurbs_volume: 31")

    call ut%check(res=nurbs%get_Wc(1), expected=Wc(1),  tol=1e-5_rk, msg="test_nurbs_volume: 32")

    call ut%check(res=nurbs%get_knot(1), expected=knot1,  tol=1e-5_rk, msg="test_nurbs_volume: 33")
    call ut%check(res=bsp%get_knot(1), expected=knot1,  tol=1e-5_rk, msg="test_nurbs_volume: 34")

    call ut%check(res=nurbs%get_knot(1,1), expected=knot1(1),  tol=1e-5_rk, msg="test_nurbs_volume: 35")
    call ut%check(res=bsp%get_knot(1,1), expected=knot1(1),  tol=1e-5_rk, msg="test_nurbs_volume: 36")

    ! call ut%check(res=nurbs%get_ng(), expected=size(Xg,1), msg="test_nurbs_volume: 37")
    ! call ut%check(res=bsp%get_ng(), expected=size(Xgb,1), msg="test_nurbs_volume: 38")

    call ut%check(res=nurbs%get_degree(1), expected=1, msg="test_nurbs_volume: 39")
    call ut%check(res=bsp%get_degree(1), expected=1, msg="test_nurbs_volume: 40")

    call ut%check(res=nurbs%get_multiplicity(1), expected=[2,2], msg="test_nurbs_volume: 41")
    call ut%check(res=bsp%get_multiplicity(1), expected=[2,2], msg="test_nurbs_volume: 42")

    call ut%check(res=nurbs%get_continuity(1), expected=[-1,-1], msg="test_nurbs_volume: 43")
    call ut%check(res=bsp%get_continuity(1), expected=[-1,-1], msg="test_nurbs_volume: 44")

    ! call ut%check(res=nurbs%get_nc(), expected=size(Xc,1), msg="test_nurbs_volume: 45")
    ! call ut%check(res=bsp%get_nc(), expected=size(Xc,1), msg="test_nurbs_volume: 46")

    call nurbs%cmp_nc()
    call bsp%cmp_nc()

    ! call ut%check(res=nurbs%get_nc(), expected=size(Xc,1), msg="test_nurbs_volume: 47")
    ! call ut%check(res=bsp%get_nc(), expected=size(Xc,1), msg="test_nurbs_volume: 48")

    elemConn = nurbs%cmp_elem_Xc_vis([1,1,1])
    call nurbs%set_elem_Xc_vis(elemConn)
    call ut%check(res=nurbs%get_elem_Xc_vis(), expected=elemConn, msg="test_nurbs_volume: 49")
    deallocate(elemConn)
    elemConn = nurbs%cmp_elem_Xc_vis()
    call nurbs%set_elem_Xc_vis(elemConn)
    call ut%check(res=nurbs%get_elem_Xc_vis(), expected=elemConn, msg="test_nurbs_volume: 50")
    deallocate(elemConn)
    elemConn = bsp%cmp_elem_Xc_vis([1,1,1])
    call bsp%set_elem_Xc_vis(elemConn)
    call ut%check(res=bsp%get_elem_Xc_vis(), expected=elemConn, msg="test_nurbs_volume: 51")
    deallocate(elemConn)
    elemConn = bsp%cmp_elem_Xc_vis()
    call bsp%set_elem_Xc_vis(elemConn)
    call ut%check(res=bsp%get_elem_Xc_vis(), expected=elemConn, msg="test_nurbs_volume: 52")
    deallocate(elemConn)

    elemConn = nurbs%cmp_elem_Xg_vis([1,1,1])
    call nurbs%set_elem_Xg_vis(elemConn)
    call ut%check(res=nurbs%get_elem_Xg_vis(), expected=elemConn, msg="test_nurbs_volume: 53")
    deallocate(elemConn)
    elemConn = nurbs%cmp_elem_Xg_vis()
    call nurbs%set_elem_Xg_vis(elemConn)
    call ut%check(res=nurbs%get_elem_Xg_vis(), expected=elemConn, msg="test_nurbs_volume: 54")
    deallocate(elemConn)
    elemConn = bsp%cmp_elem_Xg_vis([1,1,1])
    call bsp%set_elem_Xg_vis(elemConn)
    call ut%check(res=bsp%get_elem_Xg_vis(), expected=elemConn, msg="test_nurbs_volume: 55")
    deallocate(elemConn)
    elemConn = bsp%cmp_elem_Xg_vis()
    call bsp%set_elem_Xg_vis(elemConn)
    call ut%check(res=bsp%get_elem_Xg_vis(), expected=elemConn, msg="test_nurbs_volume: 56")
    deallocate(elemConn)

    elemConn = nurbs%cmp_elem()
    call nurbs%set_elem(elemConn)
    call ut%check(res=nurbs%get_elem(), expected=elemConn, msg="test_nurbs_volume: 57")
    deallocate(elemConn)
    elemConn = bsp%cmp_elem()
    call bsp%set_elem(elemConn)
    call ut%check(res=bsp%get_elem(), expected=elemConn, msg="test_nurbs_volume: 58")
    deallocate(elemConn)

    call nurbs%modify_Xc(Xc(1,1), 1,1)
    call bsp%modify_Xc(Xc(1,1), 1,1)

    call nurbs%modify_Wc(Wc(1),1)

    call nurbs%create()
    call bsp%create()

    call nurbs%export_Xc("vtk/test_nurbs_volume_Xc.vtk")
    call bsp%export_Xc("vtk/test_bsp_volume_Xc.vtk")

    call nurbs%export_Xg("vtk/test_nurbs_volume_Xg.vtk")
    call bsp%export_Xg("vtk/test_bsp_volume_Xg.vtk")

    call nurbs%export_Xth("vtk/test_nurbs_volume_Xth.vtk")
    call bsp%export_Xth("vtk/test_bsp_volume_Xth.vtk")

    call ut%check(res=nurbs%get_Xg(), expected=Xg,  tol=1e-5_rk, msg="test_nurbs_volume: 59")
    call ut%check(res=bsp%get_Xg(),   expected=Xgb, tol=1e-5_rk, msg="test_nurbs_volume: 60")

    call nurbs%basis(res1=20, res2=20, res3=20, Tgc=Tgc)
    call bsp%basis(res1=20, res2=20, res3=20, Tgc=Tgc)

    call nurbs%basis(Xt=[0.0_rk, 0.0_rk, 0.0_rk], Tgc=Tgc1)
    call bsp%basis(Xt=[0.0_rk, 0.0_rk, 0.0_rk], Tgc=Tgc1b)

    call nurbs%basis(&
        Xt1=[(real(i-1, rk) / real(20-1, rk), i=1, 20)],&
        Xt2=[(real(i-1, rk) / real(20-1, rk), i=1, 20)],&
        Xt3=[(real(i-1, rk) / real(20-1, rk), i=1, 20)], Tgc=Tgc)
    call bsp%basis(&
        Xt1=[(real(i-1, rk) / real(20-1, rk), i=1, 20)],&
        Xt2=[(real(i-1, rk) / real(20-1, rk), i=1, 20)],&
        Xt3=[(real(i-1, rk) / real(20-1, rk), i=1, 20)], Tgc=Tgc)

    call nurbs%derivative(res1=20, res2=20, res3=20, dTgc=dTgc, Tgc=Tgc)
    call bsp%derivative(res1=20, res2=20, res3=20, dTgc=dTgcb, Tgc=Tgcb)

    call nurbs%derivative(&
        Xt1=[(real(i-1, rk) / real(20-1, rk), i=1, 20)],&
        Xt2=[(real(i-1, rk) / real(20-1, rk), i=1, 20)],&
        Xt3=[(real(i-1, rk) / real(20-1, rk), i=1, 20)], dTgc=dTgc, Tgc=Tgc)
    call bsp%derivative(&
        Xt1=[(real(i-1, rk) / real(20-1, rk), i=1, 20)],&
        Xt2=[(real(i-1, rk) / real(20-1, rk), i=1, 20)],&
        Xt3=[(real(i-1, rk) / real(20-1, rk), i=1, 20)], dTgc=dTgcb, Tgc=Tgcb)

    call nurbs%derivative(Xt=[0.0_rk,0.0_rk,0.0_rk], dTgc=dTgc1, Tgc=Tgc1)
    call bsp%derivative(Xt=[0.0_rk,0.0_rk,0.0_rk], dTgc=dTgc1b, Tgc=Tgc1b)

    call nurbs%derivative(Xt=[0.0_rk,0.0_rk,0.0_rk], dTgc=dTgc1, Tgc=Tgc1, elem=[1,2,3])
    call bsp%derivative(Xt=[0.0_rk,0.0_rk,0.0_rk], dTgc=dTgc1b, Tgc=Tgc1b, elem=[1,2,3])

    call nurbs%derivative2(res1=20, res2=20, res3=20, d2Tgc=d2Tgc, dTgc=dTgc, Tgc=Tgc)
    call bsp%derivative2(res1=20, res2=20, res3=20, d2Tgc=d2Tgcb, dTgc=dTgcb, Tgc=Tgcb)

    call nurbs%derivative2(&
        Xt1=[(real(i-1, rk) / real(20-1, rk), i=1, 20)],&
        Xt2=[(real(i-1, rk) / real(20-1, rk), i=1, 20)],&
        Xt3=[(real(i-1, rk) / real(20-1, rk), i=1, 20)],&
        d2Tgc=d2Tgc, dTgc=dTgc, Tgc=Tgc)
    call bsp%derivative2(&
        Xt1=[(real(i-1, rk) / real(20-1, rk), i=1, 20)],&
        Xt2=[(real(i-1, rk) / real(20-1, rk), i=1, 20)],&
        Xt3=[(real(i-1, rk) / real(20-1, rk), i=1, 20)],&
        d2Tgc=d2Tgcb, dTgc=dTgcb, Tgc=Tgcb)

    call nurbs%derivative2(Xt=[0.0_rk,0.0_rk,0.0_rk], d2Tgc=d2Tgc1, dTgc=dTgc1b, Tgc=Tgc1b)
    call bsp%derivative2(Xt=[0.0_rk,0.0_rk,0.0_rk], d2Tgc=d2Tgc1b, dTgc=dTgc1b, Tgc=Tgc1b)

    call nurbs%derivative2(Xt=[0.0_rk,0.0_rk,0.0_rk], d2Tgc=d2Tgc1, dTgc=dTgc1b, Tgc=Tgc1b)
    call bsp%derivative2(Xt=[0.0_rk,0.0_rk,0.0_rk], d2Tgc=d2Tgc1b, dTgc=dTgc1b, Tgc=Tgc1b)

    call nurbs%rotate_Xc(45.0_rk, 0.0_rk, 0.0_rk)
    call nurbs%rotate_Xc(-45.0_rk, 0.0_rk, 0.0_rk)

    call bsp%rotate_Xc(45.0_rk, 0.0_rk, 0.0_rk)
    call bsp%rotate_Xc(-45.0_rk, 0.0_rk, 0.0_rk)

    call ut%check(res=nurbs%get_Xc(), expected=Xc,  tol=1e-5_rk, msg="test_nurbs_volume: 61")
    call ut%check(res=bsp%get_Xc(),   expected=Xc, tol=1e-5_rk, msg="test_nurbs_volume: 62")

    call nurbs%rotate_Xc(0.0_rk, 45.0_rk, 0.0_rk)
    call nurbs%rotate_Xc(0.0_rk, -45.0_rk, 0.0_rk)

    call bsp%rotate_Xc(0.0_rk, 45.0_rk, 0.0_rk)
    call bsp%rotate_Xc(0.0_rk, -45.0_rk, 0.0_rk)

    call ut%check(res=nurbs%get_Xc(), expected=Xc,  tol=1e-5_rk, msg="test_nurbs_volume: 63")
    call ut%check(res=bsp%get_Xc(),   expected=Xc, tol=1e-5_rk, msg="test_nurbs_volume: 64")

    call nurbs%rotate_Xc(0.0_rk, 0.0_rk, 45.0_rk)
    call nurbs%rotate_Xc(0.0_rk, 0.0_rk, -45.0_rk)

    call bsp%rotate_Xc(0.0_rk, 0.0_rk, 45.0_rk)
    call bsp%rotate_Xc(0.0_rk, 0.0_rk, -45.0_rk)

    call ut%check(res=nurbs%get_Xc(), expected=Xc,  tol=1e-5_rk, msg="test_nurbs_volume: 65")
    call ut%check(res=bsp%get_Xc(),   expected=Xc, tol=1e-5_rk, msg="test_nurbs_volume: 66")

    call nurbs%rotate_Xg(45.0_rk, 0.0_rk, 0.0_rk)
    call nurbs%rotate_Xg(-45.0_rk, 0.0_rk, 0.0_rk)

    call bsp%rotate_Xg(45.0_rk, 0.0_rk, 0.0_rk)
    call bsp%rotate_Xg(-45.0_rk, 0.0_rk, 0.0_rk)

    call ut%check(res=nurbs%get_Xg(), expected=Xg,  tol=1e-5_rk, msg="test_nurbs_volume: 67")
    call ut%check(res=bsp%get_Xg(),   expected=Xgb, tol=1e-5_rk, msg="test_nurbs_volume: 68")

    call nurbs%rotate_Xg(0.0_rk, 45.0_rk, 0.0_rk)
    call nurbs%rotate_Xg(0.0_rk, -45.0_rk, 0.0_rk)

    call bsp%rotate_Xg(0.0_rk, 45.0_rk, 0.0_rk)
    call bsp%rotate_Xg(0.0_rk, -45.0_rk, 0.0_rk)

    call ut%check(res=nurbs%get_Xg(), expected=Xg,  tol=1e-5_rk, msg="test_nurbs_volume: 69")
    call ut%check(res=bsp%get_Xg(),   expected=Xgb, tol=1e-5_rk, msg="test_nurbs_volume: 70")

    call nurbs%rotate_Xg(0.0_rk, 0.0_rk, 45.0_rk)
    call nurbs%rotate_Xg(0.0_rk, 0.0_rk, -45.0_rk)

    call bsp%rotate_Xg(0.0_rk, 0.0_rk, 45.0_rk)
    call bsp%rotate_Xg(0.0_rk, 0.0_rk, -45.0_rk)

    call ut%check(res=nurbs%get_Xg(), expected=Xg,  tol=1e-5_rk, msg="test_nurbs_volume: 71")
    call ut%check(res=bsp%get_Xg(),   expected=Xgb, tol=1e-5_rk, msg="test_nurbs_volume: 72")

    call nurbs%translate_Xc([5.0_rk, 5.0_rk, 5.0_rk])
    call nurbs%translate_Xc([-5.0_rk, -5.0_rk, -5.0_rk])

    call bsp%translate_Xc([5.0_rk, 5.0_rk, 5.0_rk])
    call bsp%translate_Xc([-5.0_rk, -5.0_rk, -5.0_rk])

    call ut%check(res=nurbs%get_Xc(), expected=Xc,  tol=1e-5_rk, msg="test_nurbs_volume: 73")
    call ut%check(res=bsp%get_Xc(),   expected=Xc, tol=1e-5_rk, msg="test_nurbs_volume: 74")

    call nurbs%translate_Xg([5.0_rk, 5.0_rk, 5.0_rk])
    call nurbs%translate_Xg([-5.0_rk, -5.0_rk, -5.0_rk])

    call bsp%translate_Xg([5.0_rk, 5.0_rk, 5.0_rk])
    call bsp%translate_Xg([-5.0_rk, -5.0_rk, -5.0_rk])

    call ut%check(res=nurbs%get_Xg(), expected=Xg,  tol=1e-5_rk, msg="test_nurbs_volume: 75")
    call ut%check(res=bsp%get_Xg(),   expected=Xgb, tol=1e-5_rk, msg="test_nurbs_volume: 76")

    call nurbs%export_Xc("vtk/test_nurbs_volume_Xc.vtk")
    call nurbs%export_Xg("vtk/test_nurbs_volume_Xg.vtk")

    call bsp%export_Xc("vtk/test_nurbs_volume_Xc.vtk")
    call bsp%export_Xg("vtk/test_nurbs_volume_Xg.vtk")

    call nurbs%insert_knots(1, [0.25_rk, 0.75_rk], [1,1])
    call nurbs%insert_knots(2, [0.25_rk, 0.75_rk], [1,1])
    call nurbs%insert_knots(3, [0.25_rk, 0.75_rk], [1,1])

    call bsp%insert_knots(1, [0.25_rk, 0.75_rk], [1,1])
    call bsp%insert_knots(2, [0.25_rk, 0.75_rk], [1,1])
    call bsp%insert_knots(3, [0.25_rk, 0.75_rk], [1,1])

    call nurbs%create()
    call bsp%create()

    call nurbs%export_Xc("vtk/test_nurbs_volume_Xc.vtk")
    call bsp%export_Xc("vtk/test_bsp_volume_Xc.vtk")

    call nurbs%export_Xg("vtk/test_nurbs_volume_Xg.vtk")
    call bsp%export_Xg("vtk/test_bsp_volume_Xg.vtk")

    call nurbs%export_Xth("vtk/test_nurbs_volume_Xth.vtk")
    call bsp%export_Xth("vtk/test_bsp_volume_Xth.vtk")

    call ut%check(res=nurbs%get_Xg(), expected=Xg,  tol=1e-5_rk, msg="test_nurbs_volume: 77")
    call ut%check(res=bsp%get_Xg(),   expected=Xgb, tol=1e-5_rk, msg="test_nurbs_volume: 78")

    call nurbs%elevate_degree(1, 2)
    call nurbs%elevate_degree(2, 2)
    call nurbs%elevate_degree(3, 2)

    call bsp%elevate_degree(1, 2)
    call bsp%elevate_degree(2, 2)
    call bsp%elevate_degree(3, 2)

    call nurbs%create()
    call bsp%create()

    call nurbs%export_Xc("vtk/test_nurbs_volume_Xc.vtk")
    call bsp%export_Xc("vtk/test_bsp_volume_Xc.vtk")

    call nurbs%export_Xg("vtk/test_nurbs_volume_Xg.vtk")
    call bsp%export_Xg("vtk/test_bsp_volume_Xg.vtk")

    call nurbs%export_Xth("vtk/test_nurbs_volume_Xth.vtk")
    call bsp%export_Xth("vtk/test_bsp_volume_Xth.vtk")

    call ut%check(res=nurbs%get_Xg(), expected=Xg,  tol=1e-5_rk, msg="test_nurbs_volume: 79")
    call ut%check(res=bsp%get_Xg(),   expected=Xgb, tol=1e-5_rk, msg="test_nurbs_volume: 80")

    call nurbs%remove_knots(1, [0.25_rk, 0.75_rk], [2,1])
    call nurbs%remove_knots(2, [0.25_rk, 0.75_rk], [2,1])
    call nurbs%remove_knots(3, [0.25_rk, 0.75_rk], [2,1])

    ! call bsp%remove_knots(1, [0.25_rk, 0.75_rk], [2,1])
    ! call bsp%remove_knots(2, [0.25_rk, 0.75_rk], [2,1])
    ! call bsp%remove_knots(3, [0.25_rk, 0.75_rk], [2,1])

    call nurbs%create()
    call bsp%create()

    call nurbs%export_Xc("vtk/test_nurbs_volume_Xc.vtk")
    call bsp%export_Xc("vtk/test_bsp_volume_Xc.vtk")

    call nurbs%export_Xg("vtk/test_nurbs_volume_Xg.vtk")
    call bsp%export_Xg("vtk/test_bsp_volume_Xg.vtk")

    call nurbs%export_Xth("vtk/test_nurbs_volume_Xth.vtk")
    call bsp%export_Xth("vtk/test_bsp_volume_Xth.vtk")

    call ut%check(res=nurbs%get_Xg(), expected=Xg,  tol=1e-5_rk, msg="test_nurbs_volume: 81")
    call ut%check(res=bsp%get_Xg(),   expected=Xgb, tol=1e-5_rk, msg="test_nurbs_volume: 82")


    call nurbs%set_hexahedron([2.0_rk, 2.0_rk, 2.0_rk], [2,2,2])
    call bsp%set_hexahedron([2.0_rk, 2.0_rk, 2.0_rk], [2,2,2], [1.0_rk,1.0_rk,0.9_rk,0.9_rk,1.0_rk,1.0_rk,1.0_rk,0.9_rk])
    call nurbs%set_ring([0.0_rk, 0.0_rk, 0.0_rk], 1.0_rk, 2.0_rk, 2.0_rk)
    call nurbs%set_half_ring([0.0_rk, 0.0_rk, 0.0_rk], 1.0_rk, 2.0_rk, 2.0_rk)
    call nurbs%set_C([0.0_rk, 0.0_rk, 0.0_rk], 1.0_rk, 2.0_rk, 2.0_rk)

    call nurbs%finalize()
    call bsp%finalize()
    deallocate(Xc, Wc, Xg, Xgb)

end program