This program demonstrates the usage of a NURBS curve object to create, and finalize a NURBS curve. It sets up control points and weights, generates the curve, and exports the control points and the curve to VTK files at various stages.
Define control points for the NURBS curve
Define weights for the control points
Set control points and weights for the NURBS curve object
Deallocate local arrays
Export initial control points to a VTK file
Generate the NURBS curve with a resolution of 500
Export the generated curve to a VTK file
Show the control geometry and geometry using PyVista
Finalize the NURBS curve object
Type | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|
real(kind=rk), | allocatable | :: | Wc(:) |
Arrays for control points and weights |
||
real(kind=rk), | allocatable | :: | Xc(:,:) |
Arrays for control points and weights |
||
type(nurbs_curve) | :: | nurbs |
Declare a NURBS curve object |
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in) | :: | num_coils | |||
real(kind=rk), | intent(in) | :: | radius | |||
real(kind=rk), | intent(in) | :: | height | |||
integer, | intent(in) | :: | num_points_per_coil |
program example_nurbs_curve use forcad, only: rk, nurbs_curve implicit none type(nurbs_curve) :: nurbs !! Declare a NURBS curve object real(rk), allocatable :: Xc(:,:), Wc(:) !! Arrays for control points and weights !----------------------------------------------------------------------------- ! Setting up the NURBS curve !----------------------------------------------------------------------------- !> Define control points for the NURBS curve Xc = generate_Xc(5, 1.0_rk, 2.0_rk, 20) !> Define weights for the control points allocate(Wc(size(Xc, 1)), source = 1.0_rk) !> Set control points and weights for the NURBS curve object call nurbs%set(Xc, Wc) !> Deallocate local arrays deallocate(Xc, Wc) !> Export initial control points to a VTK file call nurbs%export_Xc('vtk/demo_curve_Xc.vtk') !----------------------------------------------------------------------------- ! Creating the NURBS curve !----------------------------------------------------------------------------- !> Generate the NURBS curve with a resolution of 500 call nurbs%create(res=500) !> Export the generated curve to a VTK file call nurbs%export_Xg('vtk/demo_curve_Xg.vtk') !----------------------------------------------------------------------------- ! Visualization using PyVista ! Note: PyVista is required for visualization. Install it using `pip install pyvista` !----------------------------------------------------------------------------- !> Show the control geometry and geometry using PyVista call nurbs%show('vtk/demo_curve_Xc.vtk','vtk/demo_curve_Xg.vtk') !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS curve object call nurbs%finalize() contains !----------------------------------------------------------------------------- function generate_Xc(num_coils, radius, height, num_points_per_coil) result(control_points) integer, intent(in) :: num_coils, num_points_per_coil real(rk), intent(in) :: radius, height real(rk), allocatable :: control_points(:,:) integer :: coil, i real(rk) :: theta, coil_height allocate(control_points(num_coils * num_points_per_coil, 3)) do coil = 1, num_coils coil_height = height * real(coil-1, rk) / real(num_coils-1, rk) theta = 0.0_rk do i = 1, num_points_per_coil theta = theta + 2.0_rk * acos(-1.0_rk) / real(num_points_per_coil, rk) control_points((coil - 1) * num_points_per_coil + i, 1) = radius * cos(theta) control_points((coil - 1) * num_points_per_coil + i, 2) = radius * sin(theta) control_points((coil - 1) * num_points_per_coil + i, 3) = coil_height end do end do end function !----------------------------------------------------------------------------- end program example_nurbs_curve