diff --git a/index.html b/index.html index a26dacf75..70189d25c 100644 --- a/index.html +++ b/index.html @@ -256,7 +256,7 @@

Derived Types

Documentation generated by FORD - on 2024-04-16T12:26:30.084942

+ on 2024-04-16T18:31:38.142193


diff --git a/interface/compute_multiplicity.html b/interface/compute_multiplicity.html index b542f6766..c66d4327d 100644 --- a/interface/compute_multiplicity.html +++ b/interface/compute_multiplicity.html @@ -77,7 +77,7 @@

compute_multiplicity
  • 4 statements + title="

    0.1% of total for procedures.

    Including implementation: 47 statements, 1.2% of total for procedures.">4 statements
  • @@ -296,1081 +296,1081 @@

    Called by

    - - + + interface~~compute_multiplicity~~CalledByGraph - + interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity proc~elevate_degree_a_5_9 - -elevate_degree_A_5_9 + +elevate_degree_A_5_9 proc~elevate_degree_a_5_9->interface~compute_multiplicity - - + + proc~get_continuity - - -nurbs_volume%get_continuity + + +nurbs_surface%get_continuity proc~get_continuity->interface~compute_multiplicity - - + + proc~get_continuity~2 - - -nurbs_surface%get_continuity + + +nurbs_curve%get_continuity proc~get_continuity~2->interface~compute_multiplicity - - + + proc~get_continuity~3 - - -nurbs_curve%get_continuity + + +nurbs_volume%get_continuity proc~get_continuity~3->interface~compute_multiplicity - - + + proc~get_multiplicity - - -nurbs_volume%get_multiplicity + + +nurbs_surface%get_multiplicity proc~get_multiplicity->interface~compute_multiplicity - - + + proc~get_multiplicity~2 - - -nurbs_surface%get_multiplicity + + +nurbs_curve%get_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity - - + + proc~get_multiplicity~3 - - -nurbs_curve%get_multiplicity + + +nurbs_volume%get_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity - - + + proc~get_nc - - -nurbs_volume%get_nc + + +nurbs_surface%get_nc proc~get_nc->interface~compute_multiplicity - - + + proc~get_nc~2 - - -nurbs_surface%get_nc + + +nurbs_curve%get_nc proc~get_nc~2->interface~compute_multiplicity - - + + proc~get_nc~3 - - -nurbs_curve%get_nc + + +nurbs_volume%get_nc proc~get_nc~3->interface~compute_multiplicity - - + + proc~insert_knots - - -nurbs_volume%insert_knots + + +nurbs_surface%insert_knots proc~insert_knots->interface~compute_multiplicity - - + + none~set - - -nurbs_volume%set + + +nurbs_surface%set proc~insert_knots->none~set - - + + proc~insert_knots~2 - - -nurbs_surface%insert_knots + + +nurbs_curve%insert_knots proc~insert_knots~2->interface~compute_multiplicity - - + + - + none~set~2 - - -nurbs_surface%set + + +nurbs_curve%set - + proc~insert_knots~2->none~set~2 - - + + proc~insert_knots~3 - - -nurbs_curve%insert_knots + + +nurbs_volume%insert_knots proc~insert_knots~3->interface~compute_multiplicity - - + + - + none~set~3 - - -nurbs_curve%set + + +nurbs_volume%set - + proc~insert_knots~3->none~set~3 - - + + proc~remove_knots - - -nurbs_volume%remove_knots + + +nurbs_surface%remove_knots proc~remove_knots->interface~compute_multiplicity - - + + proc~remove_knots->none~set - - + + proc~remove_knots~2 - - -nurbs_surface%remove_knots + + +nurbs_curve%remove_knots proc~remove_knots~2->interface~compute_multiplicity - - + + - + proc~remove_knots~2->none~set~2 - - + + proc~remove_knots~3 - - -nurbs_curve%remove_knots + + +nurbs_volume%remove_knots proc~remove_knots~3->interface~compute_multiplicity - - + + - + proc~remove_knots~3->none~set~3 - - + + proc~cmp_elem - - -nurbs_volume%cmp_elem + + +nurbs_surface%cmp_elem proc~cmp_elem->proc~get_multiplicity - - + + proc~cmp_elem~2 - - -nurbs_surface%cmp_elem + + +nurbs_curve%cmp_elem proc~cmp_elem~2->proc~get_multiplicity~2 - - + + proc~cmp_elem~3 - - -nurbs_curve%cmp_elem + + +nurbs_volume%cmp_elem - + proc~cmp_elem~3->proc~get_multiplicity~3 - - + + proc~elevate_degree - - -nurbs_volume%elevate_degree + + +nurbs_surface%elevate_degree proc~elevate_degree->proc~elevate_degree_a_5_9 - - + + proc~elevate_degree->none~set - - + + proc~elevate_degree~2 - - -nurbs_surface%elevate_degree + + +nurbs_curve%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 - - + + - + proc~elevate_degree~2->none~set~2 - - + + proc~elevate_degree~3 - - -nurbs_curve%elevate_degree + + +nurbs_volume%elevate_degree proc~elevate_degree~3->proc~elevate_degree_a_5_9 - - + + - + proc~elevate_degree~3->none~set~3 - - + + proc~get_degree - -nurbs_curve%get_degree + +nurbs_curve%get_degree - - -proc~get_degree->proc~get_multiplicity~3 - - + + +proc~get_degree->proc~get_multiplicity~2 + + proc~get_degree_all - - -nurbs_volume%get_degree_all + + +nurbs_surface%get_degree_all proc~get_degree_all->proc~get_multiplicity - - + + proc~get_degree_all~2 - - -nurbs_surface%get_degree_all + + +nurbs_volume%get_degree_all - - -proc~get_degree_all~2->proc~get_multiplicity~2 - - + + +proc~get_degree_all~2->proc~get_multiplicity~3 + + proc~get_degree_dir - - -nurbs_volume%get_degree_dir + + +nurbs_surface%get_degree_dir proc~get_degree_dir->proc~get_multiplicity - - + + proc~get_degree_dir~2 - - -nurbs_surface%get_degree_dir + + +nurbs_volume%get_degree_dir - - -proc~get_degree_dir~2->proc~get_multiplicity~2 - - + + +proc~get_degree_dir~2->proc~get_multiplicity~3 + + proc~set1 - - -nurbs_volume%set1 + + +nurbs_surface%set1 proc~set1->proc~get_nc - - + + none~get_degree - - -nurbs_volume%get_degree + + +nurbs_surface%get_degree proc~set1->none~get_degree - - + + - + -proc~set1~2 - - -nurbs_surface%set1 +proc~set1~3 + + +nurbs_volume%set1 - + -proc~set1~2->proc~get_nc~2 - - +proc~set1~3->proc~get_nc~3 + + - + -none~get_degree~2 - - -nurbs_surface%get_degree +none~get_degree~3 + + +nurbs_volume%get_degree - + -proc~set1~2->none~get_degree~2 - - +proc~set1~3->none~get_degree~3 + + proc~set2 - - -nurbs_volume%set2 + + +nurbs_surface%set2 proc~set2->proc~get_nc - - + + - + -proc~set2~2 - - -nurbs_surface%set2 +proc~set2~3 + + +nurbs_volume%set2 - + -proc~set2~2->proc~get_nc~2 - - +proc~set2~3->proc~get_nc~3 + + program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->proc~insert_knots~3 - - + + +program~example1_curve->proc~insert_knots~2 + + - - -program~example1_curve->proc~remove_knots~3 - - + + +program~example1_curve->proc~remove_knots~2 + + - - -program~example1_curve->proc~elevate_degree~3 - - + + +program~example1_curve->proc~elevate_degree~2 + + program~example1_curve->proc~get_degree - - + + - + -program~example1_curve->none~set~3 - - +program~example1_curve->none~set~2 + + program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~insert_knots~2 - - + + +program~example3_surface->proc~insert_knots + + - - -program~example3_surface->proc~remove_knots~2 - - + + +program~example3_surface->proc~remove_knots + + - - -program~example3_surface->proc~elevate_degree~2 - - + + +program~example3_surface->proc~elevate_degree + + - - -program~example3_surface->none~get_degree~2 - - + + +program~example3_surface->none~get_degree + + - - -program~example3_surface->none~set~2 - - + + +program~example3_surface->none~set + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~insert_knots - - + + +program~example3_volume->proc~insert_knots~3 + + - - -program~example3_volume->proc~remove_knots - - + + +program~example3_volume->proc~remove_knots~3 + + - - -program~example3_volume->proc~elevate_degree - - + + +program~example3_volume->proc~elevate_degree~3 + + - - -program~example3_volume->none~get_degree - - + + +program~example3_volume->none~get_degree~3 + + - - -program~example3_volume->none~set - - + + +program~example3_volume->none~set~3 + + none~get_degree->proc~get_degree_all - - + + none~get_degree->proc~get_degree_dir - - + + - + -none~get_degree~2->proc~get_degree_all~2 - - +none~get_degree~3->proc~get_degree_all~2 + + - + -none~get_degree~2->proc~get_degree_dir~2 - - +none~get_degree~3->proc~get_degree_dir~2 + + none~set->proc~set1 - - + + none~set->proc~set2 - - + + proc~set3 - - -nurbs_volume%set3 + + +nurbs_surface%set3 none~set->proc~set3 - - + + - + -none~set~2->proc~set1~2 - - +none~set~3->proc~set1~3 + + - + -none~set~2->proc~set2~2 - - +none~set~3->proc~set2~3 + + - + -proc~set3~2 - - -nurbs_surface%set3 +proc~set3~3 + + +nurbs_volume%set3 - + -none~set~2->proc~set3~2 - - +none~set~3->proc~set3~3 + + - + -proc~set1~3 - - -nurbs_curve%set1 +proc~set1~2 + + +nurbs_curve%set1 - + -proc~set1~3->proc~get_degree - - +proc~set1~2->proc~get_degree + + - + -proc~set3~3 - - -nurbs_curve%set3 +proc~set3~2 + + +nurbs_curve%set3 - + -proc~set3~3->proc~get_degree - - +proc~set3~2->proc~get_degree + + - + -none~set~3->proc~set1~3 - - +none~set~2->proc~set1~2 + + - + -none~set~3->proc~set3~3 - - +none~set~2->proc~set3~2 + + proc~modify_wc - - -nurbs_volume%modify_Wc + + +nurbs_surface%modify_Wc proc~modify_wc->none~set - - + + - + -proc~modify_wc~2 - - -nurbs_surface%modify_Wc +proc~modify_wc~3 + + +nurbs_volume%modify_Wc - - -proc~modify_wc~2->none~set~2 - - + + +proc~modify_wc~3->none~set~3 + + proc~modify_xc - - -nurbs_volume%modify_Xc + + +nurbs_surface%modify_Xc proc~modify_xc->none~set - - + + - + -proc~modify_xc~2 - - -nurbs_surface%modify_Xc +proc~modify_xc~3 + + +nurbs_volume%modify_Xc - - -proc~modify_xc~2->none~set~2 - - + + +proc~modify_xc~3->none~set~3 + + proc~set3->none~get_degree - - + + - + -proc~set3~2->none~get_degree~2 - - +proc~set3~3->none~get_degree~3 + + proc~set_hexahedron - -nurbs_volume%set_hexahedron + +nurbs_volume%set_hexahedron - - -proc~set_hexahedron->none~set - - + + +proc~set_hexahedron->none~set~3 + + proc~set_tetragon - -nurbs_surface%set_tetragon + +nurbs_surface%set_tetragon - - -proc~set_tetragon->none~set~2 - - + + +proc~set_tetragon->none~set + + program~example_morph - -example_morph + +example_morph - - -program~example_morph->none~set - - + + +program~example_morph->none~set~3 + + program~example_nurbs_surface - -example_nurbs_surface + +example_nurbs_surface - - -program~example_nurbs_surface->none~set~2 - - + + +program~example_nurbs_surface->none~set + + program~example_nurbs_volume - -example_nurbs_volume + +example_nurbs_volume - - -program~example_nurbs_volume->none~set - - + + +program~example_nurbs_volume->none~set~3 + + - + -proc~modify_wc~3 - - -nurbs_curve%modify_Wc +proc~modify_wc~2 + + +nurbs_curve%modify_Wc - + -proc~modify_wc~3->none~set~3 - - +proc~modify_wc~2->none~set~2 + + - + -proc~modify_xc~3 - - -nurbs_curve%modify_Xc +proc~modify_xc~2 + + +nurbs_curve%modify_Xc - + -proc~modify_xc~3->none~set~3 - - +proc~modify_xc~2->none~set~2 + + proc~set_circle - -nurbs_curve%set_circle + +nurbs_curve%set_circle - + -proc~set_circle->none~set~3 - - +proc~set_circle->none~set~2 + + program~example_nurbs_curve - -example_nurbs_curve + +example_nurbs_curve - + -program~example_nurbs_curve->none~set~3 - - +program~example_nurbs_curve->none~set~2 + + program~shape_hexahedron - -shape_hexahedron + +shape_hexahedron program~shape_hexahedron->proc~set_hexahedron - - + + program~shape_tetragon - -shape_tetragon + +shape_tetragon program~shape_tetragon->proc~set_tetragon - - + + program~shape_circle - -shape_circle + +shape_circle program~shape_circle->proc~set_circle - - + + @@ -1487,7 +1487,7 @@

    Arguments

    - + real(kind=rk), intent(in), @@ -1536,7 +1536,7 @@

    Arguments

    - + real(kind=rk), intent(in), @@ -1551,7 +1551,7 @@

    Arguments

    - + real(kind=rk), intent(in) @@ -1593,7 +1593,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/interface/elemconn_c0.html b/interface/elemconn_c0.html index 3d6a931fe..271a931d0 100644 --- a/interface/elemconn_c0.html +++ b/interface/elemconn_c0.html @@ -320,398 +320,398 @@

    Called by

    interface~elemconn_c0 - -elemConn_C0 + +elemConn_C0 proc~cmp_elem_xc_vis - - -nurbs_volume%cmp_elem_Xc_vis + + +nurbs_surface%cmp_elem_Xc_vis proc~cmp_elem_xc_vis->interface~elemconn_c0 - - + + proc~cmp_elem_xc_vis~2 - - -nurbs_surface%cmp_elem_Xc_vis + + +nurbs_curve%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~2->interface~elemconn_c0 - - + + proc~cmp_elem_xc_vis~3 - - -nurbs_curve%cmp_elem_Xc_vis + + +nurbs_volume%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~3->interface~elemconn_c0 - - + + proc~cmp_elem_xg_vis - + -nurbs_volume%cmp_elem_Xg_vis +nurbs_surface%cmp_elem_Xg_vis proc~cmp_elem_xg_vis->interface~elemconn_c0 - - + + proc~cmp_elem_xg_vis~2 - - -nurbs_surface%cmp_elem_Xg_vis + + +nurbs_curve%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~2->interface~elemconn_c0 - - + + proc~cmp_elem_xg_vis~3 - - -nurbs_curve%cmp_elem_Xg_vis + + +nurbs_volume%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~3->interface~elemconn_c0 - - + + proc~export_xc - - -nurbs_volume%export_Xc + + +nurbs_surface%export_Xc proc~export_xc->proc~cmp_elem_xc_vis - - + + proc~export_xc~2 - - -nurbs_surface%export_Xc + + +nurbs_curve%export_Xc proc~export_xc~2->proc~cmp_elem_xc_vis~2 - - + + proc~export_xc~3 - - -nurbs_curve%export_Xc + + +nurbs_volume%export_Xc proc~export_xc~3->proc~cmp_elem_xc_vis~3 - - + + proc~export_xg - - -nurbs_volume%export_Xg + + +nurbs_surface%export_Xg proc~export_xg->proc~cmp_elem_xg_vis - - + + proc~export_xg~2 - - -nurbs_surface%export_Xg + + +nurbs_curve%export_Xg proc~export_xg~2->proc~cmp_elem_xg_vis~2 - - + + proc~export_xg~3 - - -nurbs_curve%export_Xg + + +nurbs_volume%export_Xg proc~export_xg~3->proc~cmp_elem_xg_vis~3 - - + + program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->proc~export_xc~3 - - + + +program~example1_curve->proc~export_xc~2 + + - - -program~example1_curve->proc~export_xg~3 - - + + +program~example1_curve->proc~export_xg~2 + + program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~export_xc~2 - - + + +program~example3_surface->proc~export_xc + + - - -program~example3_surface->proc~export_xg~2 - - + + +program~example3_surface->proc~export_xg + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~export_xc - - + + +program~example3_volume->proc~export_xc~3 + + - - -program~example3_volume->proc~export_xg - - + + +program~example3_volume->proc~export_xg~3 + + program~example_morph - -example_morph + +example_morph - - -program~example_morph->proc~export_xc - - + + +program~example_morph->proc~export_xc~3 + + - - -program~example_morph->proc~export_xg - - + + +program~example_morph->proc~export_xg~3 + + program~example_nurbs_curve - -example_nurbs_curve + +example_nurbs_curve - - -program~example_nurbs_curve->proc~export_xc~3 - - + + +program~example_nurbs_curve->proc~export_xc~2 + + - - -program~example_nurbs_curve->proc~export_xg~3 - - + + +program~example_nurbs_curve->proc~export_xg~2 + + program~example_nurbs_surface - -example_nurbs_surface + +example_nurbs_surface - - -program~example_nurbs_surface->proc~export_xc~2 - - + + +program~example_nurbs_surface->proc~export_xc + + - - -program~example_nurbs_surface->proc~export_xg~2 - - + + +program~example_nurbs_surface->proc~export_xg + + program~example_nurbs_volume - -example_nurbs_volume + +example_nurbs_volume - - -program~example_nurbs_volume->proc~export_xc - - + + +program~example_nurbs_volume->proc~export_xc~3 + + - - -program~example_nurbs_volume->proc~export_xg - - + + +program~example_nurbs_volume->proc~export_xg~3 + + program~shape_circle - -shape_circle + +shape_circle - - -program~shape_circle->proc~export_xc~3 - - + + +program~shape_circle->proc~export_xc~2 + + - - -program~shape_circle->proc~export_xg~3 - - + + +program~shape_circle->proc~export_xg~2 + + program~shape_hexahedron - -shape_hexahedron + +shape_hexahedron - - -program~shape_hexahedron->proc~export_xc - - + + +program~shape_hexahedron->proc~export_xc~3 + + - - -program~shape_hexahedron->proc~export_xg - - + + +program~shape_hexahedron->proc~export_xg~3 + + program~shape_tetragon - -shape_tetragon + +shape_tetragon - - -program~shape_tetragon->proc~export_xc~2 - - + + +program~shape_tetragon->proc~export_xc + + - - -program~shape_tetragon->proc~export_xg~2 - - + + +program~shape_tetragon->proc~export_xg + + @@ -843,7 +843,7 @@

    Arguments

    - + integer, intent(in) @@ -1103,7 +1103,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/interface/elemconn_cn.html b/interface/elemconn_cn.html index 14745575f..2a68a94c8 100644 --- a/interface/elemconn_cn.html +++ b/interface/elemconn_cn.html @@ -77,7 +77,7 @@

    elemConn_Cn
  • 5 statements + title="

    0.1% of total for procedures.

    Including implementation: 88 statements, 2.3% of total for procedures.">5 statements
  • @@ -326,9 +326,9 @@

    Called by

    proc~cmp_elem - + -nurbs_volume%cmp_elem +nurbs_surface%cmp_elem @@ -341,24 +341,24 @@

    Called by

    proc~cmp_elem~2 - - -nurbs_surface%cmp_elem + + +nurbs_curve%cmp_elem proc~cmp_elem~2->interface~elemconn_cn - - + + proc~cmp_elem~3 - - -nurbs_curve%cmp_elem + + +nurbs_volume%cmp_elem @@ -494,7 +494,7 @@

    Arguments

    - + integer, intent(in) @@ -509,7 +509,7 @@

    Arguments

    - + real(kind=rk), intent(in), @@ -539,7 +539,7 @@

    Arguments

    - + integer, intent(out), @@ -703,7 +703,7 @@

    Arguments

    - + integer, intent(out), @@ -927,7 +927,7 @@

    Arguments

    - + integer, intent(out), @@ -964,7 +964,7 @@

    Arguments

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/interface/ndgrid.html b/interface/ndgrid.html index a116a2eef..e3ba80e4e 100644 --- a/interface/ndgrid.html +++ b/interface/ndgrid.html @@ -77,7 +77,7 @@

    ndgrid
  • 4 statements + title="

    0.1% of total for procedures.

    Including implementation: 40 statements, 1.0% of total for procedures.">4 statements
  • @@ -310,9 +310,9 @@

    Called by

    proc~basis - + -nurbs_volume%basis +nurbs_surface%basis @@ -322,27 +322,27 @@

    Called by

    - + -proc~basis~2 - +proc~basis~3 + -nurbs_surface%basis +nurbs_volume%basis - + -proc~basis~2->interface~ndgrid +proc~basis~3->interface~ndgrid proc~create - + -nurbs_volume%create +nurbs_surface%create @@ -352,27 +352,27 @@

    Called by

    - + -proc~create~2 - +proc~create~3 + -nurbs_surface%create +nurbs_volume%create - + -proc~create~2->interface~ndgrid +proc~create~3->interface~ndgrid proc~derivative - + -nurbs_volume%derivative +nurbs_surface%derivative @@ -382,18 +382,18 @@

    Called by

    - + -proc~derivative~2 - +proc~derivative~3 + -nurbs_surface%derivative +nurbs_volume%derivative - + -proc~derivative~2->interface~ndgrid +proc~derivative~3->interface~ndgrid @@ -401,91 +401,91 @@

    Called by

    program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~create~2 - - + + +program~example3_surface->proc~create + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~create - - + + +program~example3_volume->proc~create~3 + + program~example_nurbs_surface - -example_nurbs_surface + +example_nurbs_surface - - -program~example_nurbs_surface->proc~create~2 - - + + +program~example_nurbs_surface->proc~create + + program~example_nurbs_volume - -example_nurbs_volume + +example_nurbs_volume - - -program~example_nurbs_volume->proc~create - - + + +program~example_nurbs_volume->proc~create~3 + + program~shape_hexahedron - -shape_hexahedron + +shape_hexahedron - - -program~shape_hexahedron->proc~create - - + + +program~shape_hexahedron->proc~create~3 + + program~shape_tetragon - -shape_tetragon + +shape_tetragon - - -program~shape_tetragon->proc~create~2 - - + + +program~shape_tetragon->proc~create + + @@ -628,7 +628,7 @@

    Arguments

    - + real(kind=rk), intent(out), @@ -717,7 +717,7 @@

    Arguments

    - + real(kind=rk), intent(out), @@ -754,7 +754,7 @@

    Arguments

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/interface/unique.html b/interface/unique.html index db497e1bf..afee7b6f0 100644 --- a/interface/unique.html +++ b/interface/unique.html @@ -77,7 +77,7 @@

    unique
  • 4 statements + title="

    0.1% of total for procedures.

    Including implementation: 40 statements, 1.0% of total for procedures.">4 statements
  • @@ -310,9 +310,9 @@

    Called by

    proc~cmp_elem - + -nurbs_volume%cmp_elem +nurbs_surface%cmp_elem @@ -325,24 +325,24 @@

    Called by

    proc~cmp_elem~2 - - -nurbs_surface%cmp_elem + + +nurbs_curve%cmp_elem proc~cmp_elem~2->interface~unique - - + + proc~cmp_elem~3 - - -nurbs_curve%cmp_elem + + +nurbs_volume%cmp_elem @@ -463,7 +463,7 @@

    Arguments

    - + integer, intent(in), @@ -512,7 +512,7 @@

    Arguments

    - + real(kind=rk), intent(in), @@ -554,7 +554,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/lists/files.html b/lists/files.html index 2470c6161..6e470c260 100644 --- a/lists/files.html +++ b/lists/files.html @@ -453,7 +453,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/lists/modules.html b/lists/modules.html index 880b86f5c..0b335705e 100644 --- a/lists/modules.html +++ b/lists/modules.html @@ -442,7 +442,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/lists/procedures.html b/lists/procedures.html index 7ad8f3e25..def3f2ff5 100644 --- a/lists/procedures.html +++ b/lists/procedures.html @@ -73,19 +73,19 @@

    Procedures

    basis - forcad_nurbs_volume + forcad_nurbs_surface Subroutine basis - forcad_nurbs_surface + forcad_nurbs_curve Subroutine basis - forcad_nurbs_curve + forcad_nurbs_volume Subroutine @@ -115,55 +115,55 @@

    Procedures

    cmp_elem - forcad_nurbs_volume + forcad_nurbs_surface Function cmp_elem - forcad_nurbs_surface + forcad_nurbs_curve Function cmp_elem - forcad_nurbs_curve + forcad_nurbs_volume Function cmp_elem_Xc_vis - forcad_nurbs_volume + forcad_nurbs_surface Function cmp_elem_Xc_vis - forcad_nurbs_surface + forcad_nurbs_curve Function cmp_elem_Xc_vis - forcad_nurbs_curve + forcad_nurbs_volume Function cmp_elem_Xg_vis - forcad_nurbs_volume + forcad_nurbs_surface Function cmp_elem_Xg_vis - forcad_nurbs_surface + forcad_nurbs_curve Function cmp_elem_Xg_vis - forcad_nurbs_curve + forcad_nurbs_volume Function @@ -229,37 +229,37 @@

    Procedures

    create - forcad_nurbs_volume + forcad_nurbs_surface Subroutine create - forcad_nurbs_surface + forcad_nurbs_curve Subroutine create - forcad_nurbs_curve + forcad_nurbs_volume Subroutine derivative - forcad_nurbs_volume + forcad_nurbs_surface Subroutine derivative - forcad_nurbs_surface + forcad_nurbs_curve Subroutine derivative - forcad_nurbs_curve + forcad_nurbs_volume Subroutine @@ -277,19 +277,19 @@

    Procedures

    elevate_degree - forcad_nurbs_volume + forcad_nurbs_surface Subroutine elevate_degree - forcad_nurbs_surface + forcad_nurbs_curve Subroutine elevate_degree - forcad_nurbs_curve + forcad_nurbs_volume Subroutine @@ -301,37 +301,37 @@

    Procedures

    export_Xc - forcad_nurbs_volume + forcad_nurbs_surface Subroutine export_Xc - forcad_nurbs_surface + forcad_nurbs_curve Subroutine export_Xc - forcad_nurbs_curve + forcad_nurbs_volume Subroutine export_Xg - forcad_nurbs_volume + forcad_nurbs_surface Subroutine export_Xg - forcad_nurbs_surface + forcad_nurbs_curve Subroutine export_Xg - forcad_nurbs_curve + forcad_nurbs_volume Subroutine @@ -343,19 +343,19 @@

    Procedures

    finalize - forcad_nurbs_volume + forcad_nurbs_surface Subroutine finalize - forcad_nurbs_surface + forcad_nurbs_curve Subroutine finalize - forcad_nurbs_curve + forcad_nurbs_volume Subroutine @@ -367,49 +367,49 @@

    Procedures

    generate_Xc - example_nurbs_curve + example_nurbs_surface Function generate_Xc - example3_surface + example_nurbs_volume Function generate_Xc - example3_volume + example3_surface Function generate_Xc - example_nurbs_volume + example3_volume Function generate_Xc - example_nurbs_surface + example_nurbs_curve Function get_continuity - forcad_nurbs_volume + forcad_nurbs_surface Function get_continuity - forcad_nurbs_surface + forcad_nurbs_curve Function get_continuity - forcad_nurbs_curve + forcad_nurbs_volume Function @@ -421,243 +421,333 @@

    Procedures

    get_degree_all - forcad_nurbs_volume + forcad_nurbs_surface Function get_degree_all - forcad_nurbs_surface + forcad_nurbs_volume Function get_degree_dir - forcad_nurbs_volume + forcad_nurbs_surface Function get_degree_dir - forcad_nurbs_surface + forcad_nurbs_volume Function get_elem - forcad_nurbs_volume + forcad_nurbs_surface Function get_elem - forcad_nurbs_surface + forcad_nurbs_curve Function get_elem - forcad_nurbs_curve + forcad_nurbs_volume Function get_elem_Xc_vis - forcad_nurbs_volume + forcad_nurbs_surface Function get_elem_Xc_vis - forcad_nurbs_surface + forcad_nurbs_curve Function get_elem_Xc_vis - forcad_nurbs_curve + forcad_nurbs_volume Function get_elem_Xg_vis - forcad_nurbs_volume + forcad_nurbs_surface Function get_elem_Xg_vis - forcad_nurbs_surface + forcad_nurbs_curve Function get_elem_Xg_vis - forcad_nurbs_curve + forcad_nurbs_volume Function get_knot_all - forcad_nurbs_volume + forcad_nurbs_surface Function get_knot_all - forcad_nurbs_surface + forcad_nurbs_curve Function get_knot_all - forcad_nurbs_curve + forcad_nurbs_volume Function get_knoti - forcad_nurbs_volume + forcad_nurbs_surface Function get_knoti - forcad_nurbs_surface + forcad_nurbs_curve Function get_knoti - forcad_nurbs_curve + forcad_nurbs_volume Function get_multiplicity - forcad_nurbs_volume + forcad_nurbs_surface Function get_multiplicity - forcad_nurbs_surface + forcad_nurbs_curve Function get_multiplicity - forcad_nurbs_curve + forcad_nurbs_volume Function get_nc - forcad_nurbs_volume + forcad_nurbs_surface Function get_nc - forcad_nurbs_surface + forcad_nurbs_curve Function get_nc - forcad_nurbs_curve + forcad_nurbs_volume Function get_ng - forcad_nurbs_volume + forcad_nurbs_surface Function get_ng - forcad_nurbs_surface + forcad_nurbs_curve Function get_ng + forcad_nurbs_volume + Function + + + + get_Wc_all + forcad_nurbs_surface + Function + + + + get_Wc_all forcad_nurbs_curve Function - get_Wc + get_Wc_all forcad_nurbs_volume Function - get_Wc + get_Wci forcad_nurbs_surface Function - get_Wc + get_Wci forcad_nurbs_curve Function - get_Xc + get_Wci forcad_nurbs_volume Function - get_Xc + get_Xc_all forcad_nurbs_surface Function - get_Xc + get_Xc_all forcad_nurbs_curve Function - get_Xg + get_Xc_all forcad_nurbs_volume Function - get_Xg + get_Xci forcad_nurbs_surface Function - get_Xg + get_Xci forcad_nurbs_curve Function - get_Xt + get_Xci forcad_nurbs_volume Function - get_Xt + get_Xcid forcad_nurbs_surface Function - get_Xt + get_Xcid + forcad_nurbs_curve + Function + + + + get_Xcid + forcad_nurbs_volume + Function + + + + get_Xg_all + forcad_nurbs_surface + Function + + + + get_Xg_all + forcad_nurbs_curve + Function + + + + get_Xg_all + forcad_nurbs_volume + Function + + + + get_Xgi + forcad_nurbs_surface + Function + + + + get_Xgi + forcad_nurbs_curve + Function + + + + get_Xgi + forcad_nurbs_volume + Function + + + + get_Xgid + forcad_nurbs_surface + Function + + + + get_Xgid + forcad_nurbs_curve + Function + + + + get_Xgid + forcad_nurbs_volume + Function + + + + get_Xt + forcad_nurbs_surface + Function + + + + get_Xt forcad_nurbs_curve Function + + + get_Xt + forcad_nurbs_volume + Function + hexahedron_Xc @@ -673,37 +763,37 @@

    Procedures

    insert_knots - forcad_nurbs_volume + forcad_nurbs_surface Subroutine insert_knots - forcad_nurbs_surface + forcad_nurbs_curve Subroutine insert_knots - forcad_nurbs_curve + forcad_nurbs_volume Subroutine is_rational - forcad_nurbs_volume + forcad_nurbs_surface Function is_rational - forcad_nurbs_surface + forcad_nurbs_curve Function is_rational - forcad_nurbs_curve + forcad_nurbs_volume Function @@ -727,37 +817,37 @@

    Procedures

    modify_Wc - forcad_nurbs_volume + forcad_nurbs_surface Subroutine modify_Wc - forcad_nurbs_surface + forcad_nurbs_curve Subroutine modify_Wc - forcad_nurbs_curve + forcad_nurbs_volume Subroutine modify_Xc - forcad_nurbs_volume + forcad_nurbs_surface Subroutine modify_Xc - forcad_nurbs_surface + forcad_nurbs_curve Subroutine modify_Xc - forcad_nurbs_curve + forcad_nurbs_volume Subroutine @@ -787,19 +877,19 @@

    Procedures

    remove_knots - forcad_nurbs_volume + forcad_nurbs_surface Subroutine remove_knots - forcad_nurbs_surface + forcad_nurbs_curve Subroutine remove_knots - forcad_nurbs_curve + forcad_nurbs_volume Subroutine @@ -817,37 +907,37 @@

    Procedures

    rotate_Xc - forcad_nurbs_volume + forcad_nurbs_surface Subroutine rotate_Xc - forcad_nurbs_surface + forcad_nurbs_curve Subroutine rotate_Xc - forcad_nurbs_curve + forcad_nurbs_volume Subroutine rotate_Xg - forcad_nurbs_volume + forcad_nurbs_surface Subroutine rotate_Xg - forcad_nurbs_surface + forcad_nurbs_curve Subroutine rotate_Xg - forcad_nurbs_curve + forcad_nurbs_volume Subroutine @@ -859,57 +949,57 @@

    Procedures

    set1 - forcad_nurbs_volume - Subroutine -

    Set control points and weights for the NURBS volume object.

    - - - set1 - forcad_nurbs_surface + forcad_nurbs_surface Subroutine

    Set knot vectors, control points and weights for the NURBS surface object.

    - set1 + set1 forcad_nurbs_curve Subroutine

    Set knot vector, control points and weights for the NURBS curve object.

    - set2 + set1 forcad_nurbs_volume Subroutine

    Set control points and weights for the NURBS volume object.

    - set2 + set2 forcad_nurbs_surface Subroutine

    Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights

    - set2 + set2 forcad_nurbs_curve Subroutine

    Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights.

    - set3 + set2 forcad_nurbs_volume Subroutine -

    Set Bezier or Rational Bezier volume using control points and weights.

    +

    Set control points and weights for the NURBS volume object.

    - set3 + set3 forcad_nurbs_surface Subroutine

    Set Bezier or Rational Bezier surface using control points and weights.

    - set3 + set3 forcad_nurbs_curve Subroutine

    Set Bezier or Rational Bezier curve using control points and weights.

    + + + set3 + forcad_nurbs_volume + Subroutine +

    Set Bezier or Rational Bezier volume using control points and weights.

    set_circle @@ -919,55 +1009,55 @@

    Procedures

    set_elem - forcad_nurbs_volume + forcad_nurbs_surface Subroutine set_elem - forcad_nurbs_surface + forcad_nurbs_curve Subroutine set_elem - forcad_nurbs_curve + forcad_nurbs_volume Subroutine set_elem_Xc_vis - forcad_nurbs_volume + forcad_nurbs_surface Subroutine set_elem_Xc_vis - forcad_nurbs_surface + forcad_nurbs_curve Subroutine set_elem_Xc_vis - forcad_nurbs_curve + forcad_nurbs_volume Subroutine set_elem_Xg_vis - forcad_nurbs_volume + forcad_nurbs_surface Subroutine set_elem_Xg_vis - forcad_nurbs_surface + forcad_nurbs_curve Subroutine set_elem_Xg_vis - forcad_nurbs_curve + forcad_nurbs_volume Subroutine @@ -985,19 +1075,19 @@

    Procedures

    show - forcad_nurbs_volume + forcad_nurbs_surface Subroutine show - forcad_nurbs_surface + forcad_nurbs_curve Subroutine show - forcad_nurbs_curve + forcad_nurbs_volume Subroutine @@ -1009,37 +1099,37 @@

    Procedures

    translate_Xc - forcad_nurbs_volume + forcad_nurbs_surface Subroutine translate_Xc - forcad_nurbs_surface + forcad_nurbs_curve Subroutine translate_Xc - forcad_nurbs_curve + forcad_nurbs_volume Subroutine translate_Xg - forcad_nurbs_volume + forcad_nurbs_surface Subroutine translate_Xg - forcad_nurbs_surface + forcad_nurbs_curve Subroutine translate_Xg - forcad_nurbs_curve + forcad_nurbs_volume Subroutine @@ -1068,3235 +1158,3595 @@

    Procedures

    - - + + call~~graph~~CallGraph - + interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity - + proc~compute_multiplicity1 - - -compute_multiplicity1 + + +compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 - - + + - + proc~compute_multiplicity2 - - -compute_multiplicity2 + + +compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 - - + + interface~elemconn_c0 - -elemConn_C0 + +elemConn_C0 - + proc~cmp_elemconn_c0_l - - -cmp_elemConn_C0_L + + +cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l - - + + - + proc~cmp_elemconn_c0_s - - -cmp_elemConn_C0_S + + +cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s - - + + - + proc~cmp_elemconn_c0_v - - -cmp_elemConn_C0_V + + +cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v - - + + interface~elemconn_cn - -elemConn_Cn + +elemConn_Cn - + proc~cmp_elemconn_cn_l - - -cmp_elemConn_Cn_L + + +cmp_elemConn_Cn_L interface~elemconn_cn->proc~cmp_elemconn_cn_l - - + + - + proc~cmp_elemconn_cn_s - - -cmp_elemConn_Cn_S + + +cmp_elemConn_Cn_S interface~elemconn_cn->proc~cmp_elemconn_cn_s - - + + - + proc~cmp_elemconn_cn_v - - -cmp_elemConn_Cn_V + + +cmp_elemConn_Cn_V interface~elemconn_cn->proc~cmp_elemconn_cn_v - - + + interface~ndgrid - -ndgrid + +ndgrid - + proc~ndgrid2 - - -ndgrid2 + + +ndgrid2 interface~ndgrid->proc~ndgrid2 - - + + - + proc~ndgrid3 - - -ndgrid3 + + +ndgrid3 interface~ndgrid->proc~ndgrid3 - - + + interface~unique - -unique + +unique - + proc~unique_integer - - -unique_integer + + +unique_integer interface~unique->proc~unique_integer - - + + - + proc~unique_real - - -unique_real + + +unique_real interface~unique->proc~unique_real - - + + none~get_degree - - -nurbs_volume%get_degree + + +nurbs_surface%get_degree - + proc~get_degree_all - - -nurbs_volume%get_degree_all + + +nurbs_surface%get_degree_all none~get_degree->proc~get_degree_all - - + + - + proc~get_degree_dir - - -nurbs_volume%get_degree_dir + + +nurbs_surface%get_degree_dir none~get_degree->proc~get_degree_dir - - + + - + -none~get_degree~2 - - -nurbs_surface%get_degree +none~get_degree~3 + + +nurbs_volume%get_degree - + proc~get_degree_all~2 - - -nurbs_surface%get_degree_all + + +nurbs_volume%get_degree_all - + -none~get_degree~2->proc~get_degree_all~2 - - +none~get_degree~3->proc~get_degree_all~2 + + - + proc~get_degree_dir~2 - - -nurbs_surface%get_degree_dir + + +nurbs_volume%get_degree_dir - + -none~get_degree~2->proc~get_degree_dir~2 - - +none~get_degree~3->proc~get_degree_dir~2 + + none~get_knot - - -nurbs_volume%get_knot + + +nurbs_surface%get_knot - + proc~get_knot_all - - -nurbs_volume%get_knot_all + + +nurbs_surface%get_knot_all none~get_knot->proc~get_knot_all - - + + - + proc~get_knoti - - -nurbs_volume%get_knoti + + +nurbs_surface%get_knoti none~get_knot->proc~get_knoti - - + + none~get_knot~2 - - -nurbs_surface%get_knot + + +nurbs_curve%get_knot - + proc~get_knot_all~2 - - -nurbs_surface%get_knot_all + + +nurbs_curve%get_knot_all none~get_knot~2->proc~get_knot_all~2 - - + + - + proc~get_knoti~2 - - -nurbs_surface%get_knoti + + +nurbs_curve%get_knoti none~get_knot~2->proc~get_knoti~2 - - + + none~get_knot~3 - - -nurbs_curve%get_knot + + +nurbs_volume%get_knot - + proc~get_knot_all~3 - - -nurbs_curve%get_knot_all + + +nurbs_volume%get_knot_all none~get_knot~3->proc~get_knot_all~3 - - + + - + proc~get_knoti~3 - - -nurbs_curve%get_knoti + + +nurbs_volume%get_knoti none~get_knot~3->proc~get_knoti~3 - - + + - + -none~set - - -nurbs_volume%set +none~get_wc + + +nurbs_surface%get_Wc - - -proc~set1 - - -nurbs_volume%set1 + + +proc~get_wc_all + + +nurbs_surface%get_Wc_all - + -none~set->proc~set1 - - +none~get_wc->proc~get_wc_all + + - - -proc~set2 - - -nurbs_volume%set2 + + +proc~get_wci + + +nurbs_surface%get_Wci - + -none~set->proc~set2 - - +none~get_wc->proc~get_wci + + - - -proc~set3 - - -nurbs_volume%set3 + + +none~get_wc~2 + + +nurbs_curve%get_Wc - - -none~set->proc~set3 - - - - - -none~set~2 - - -nurbs_surface%set + + +proc~get_wc_all~2 + + +nurbs_curve%get_Wc_all - - -proc~set1~2 - - -nurbs_surface%set1 + + +none~get_wc~2->proc~get_wc_all~2 + + + + + +proc~get_wci~2 + + +nurbs_curve%get_Wci - + -none~set~2->proc~set1~2 - - +none~get_wc~2->proc~get_wci~2 + + - - -proc~set2~2 - - -nurbs_surface%set2 + + +none~get_wc~3 + + +nurbs_volume%get_Wc - + + +proc~get_wc_all~3 + + +nurbs_volume%get_Wc_all + + + + -none~set~2->proc~set2~2 - - +none~get_wc~3->proc~get_wc_all~3 + + - - -proc~set3~2 - - -nurbs_surface%set3 + + +proc~get_wci~3 + + +nurbs_volume%get_Wci - + -none~set~2->proc~set3~2 - - +none~get_wc~3->proc~get_wci~3 + + - - -none~set~3 - - -nurbs_curve%set + + +none~get_xc + + +nurbs_surface%get_Xc - - -proc~set1~3 - - -nurbs_curve%set1 + + +proc~get_xc_all + + +nurbs_surface%get_Xc_all - + -none~set~3->proc~set1~3 - - +none~get_xc->proc~get_xc_all + + - - -proc~set2~3 - - -nurbs_curve%set2 + + +proc~get_xci + + +nurbs_surface%get_Xci - + -none~set~3->proc~set2~3 - - +none~get_xc->proc~get_xci + + - - -proc~set3~3 - - -nurbs_curve%set3 + + +proc~get_xcid + + +nurbs_surface%get_Xcid - + -none~set~3->proc~set3~3 - - +none~get_xc->proc~get_xcid + + - - -proc~basis - - -nurbs_volume%basis + + +none~get_xc~2 + + +nurbs_curve%get_Xc - + + +proc~get_xc_all~2 + + +nurbs_curve%get_Xc_all + + + + -proc~basis->interface~ndgrid - - +none~get_xc~2->proc~get_xc_all~2 + + - - -proc~basis_bspline - - -basis_bspline + + +proc~get_xcid~2 + + +nurbs_curve%get_Xcid - + -proc~basis->proc~basis_bspline - - +none~get_xc~2->proc~get_xcid~2 + + - + -proc~kron - - -kron +proc~get_xci~2 + + +nurbs_curve%get_Xci - + -proc~basis->proc~kron - - - - - -proc~basis_bernstein - - -basis_bernstein - +none~get_xc~2->proc~get_xci~2 + + - - - -proc~basis_bspline_der - - -basis_bspline_der + + +none~get_xc~3 + + +nurbs_volume%get_Xc - - -proc~isinf - - -isinf + + +proc~get_xc_all~3 + + +nurbs_volume%get_Xc_all - + -proc~basis_bspline_der->proc~isinf - - +none~get_xc~3->proc~get_xc_all~3 + + - - -proc~basis~2 - - -nurbs_surface%basis + + +proc~get_xcid~3 + + +nurbs_volume%get_Xcid - + -proc~basis~2->interface~ndgrid - - +none~get_xc~3->proc~get_xcid~3 + + - + + +proc~get_xci~3 + + +nurbs_volume%get_Xci + + + + -proc~basis~2->proc~basis_bspline - - +none~get_xc~3->proc~get_xci~3 + + - - -proc~is_rational~2 - - -nurbs_surface%is_rational + + +none~get_xg + + +nurbs_surface%get_Xg - + + +proc~get_xg_all + + +nurbs_surface%get_Xg_all + + + + -proc~basis~2->proc~is_rational~2 - - +none~get_xg->proc~get_xg_all + + + + + +proc~get_xgi + + +nurbs_surface%get_Xgi + - + + -proc~basis~2->proc~kron - - +none~get_xg->proc~get_xgi + + - - -proc~basis~3 - - -nurbs_curve%basis + + +proc~get_xgid + + +nurbs_surface%get_Xgid - + -proc~basis~3->proc~basis_bspline - - +none~get_xg->proc~get_xgid + + - - -proc~is_rational~3 - - -nurbs_curve%is_rational + + +none~get_xg~2 + + +nurbs_curve%get_Xg + + + + + +proc~get_xg_all~2 + + +nurbs_curve%get_Xg_all - + -proc~basis~3->proc~is_rational~3 - - +none~get_xg~2->proc~get_xg_all~2 + + - - -proc~bincoeff - - -bincoeff + + +proc~get_xgid~2 + + +nurbs_curve%get_Xgid - - + + +none~get_xg~2->proc~get_xgid~2 + + + + + +proc~get_xgi~2 + + +nurbs_curve%get_Xgi + + + + + +none~get_xg~2->proc~get_xgi~2 + + + + + +none~get_xg~3 + + +nurbs_volume%get_Xg + + + + + +proc~get_xg_all~3 + + +nurbs_volume%get_Xg_all + + + + + +none~get_xg~3->proc~get_xg_all~3 + + + + + +proc~get_xgid~3 + + +nurbs_volume%get_Xgid + + + + + +none~get_xg~3->proc~get_xgid~3 + + + + + +proc~get_xgi~3 + + +nurbs_volume%get_Xgi + + + + + +none~get_xg~3->proc~get_xgi~3 + + + + + +none~set + + +nurbs_surface%set + + + + + +proc~set1 + + +nurbs_surface%set1 + + + + + +none~set->proc~set1 + + + + + +proc~set2 + + +nurbs_surface%set2 + + + + + +none~set->proc~set2 + + + + + +proc~set3 + + +nurbs_surface%set3 + + + + + +none~set->proc~set3 + + + + + +none~set~2 + + +nurbs_curve%set + + + + + +proc~set1~2 + + +nurbs_curve%set1 + + + + + +none~set~2->proc~set1~2 + + + + + +proc~set2~2 + + +nurbs_curve%set2 + + + + + +none~set~2->proc~set2~2 + + + + + +proc~set3~2 + + +nurbs_curve%set3 + + + + + +none~set~2->proc~set3~2 + + + + + +none~set~3 + + +nurbs_volume%set + + + + + +proc~set1~3 + + +nurbs_volume%set1 + + + + + +none~set~3->proc~set1~3 + + + + + +proc~set2~3 + + +nurbs_volume%set2 + + + + + +none~set~3->proc~set2~3 + + + + + +proc~set3~3 + + +nurbs_volume%set3 + + + + + +none~set~3->proc~set3~3 + + + + + +proc~basis + + +nurbs_surface%basis + + + + + +proc~basis->interface~ndgrid + + + + + +proc~basis_bspline + + +basis_bspline + + + + + +proc~basis->proc~basis_bspline + + + + + +proc~is_rational + + +nurbs_surface%is_rational + + + + + +proc~basis->proc~is_rational + + + + + +proc~kron + + +kron + + + + + +proc~basis->proc~kron + + + + + +proc~basis_bernstein + + +basis_bernstein + + + + + +proc~basis_bspline_der + + +basis_bspline_der + + + + + +proc~isinf + + +isinf + + + + + +proc~basis_bspline_der->proc~isinf + + + + + +proc~basis~2 + + +nurbs_curve%basis + + + + + +proc~basis~2->proc~basis_bspline + + + + + +proc~is_rational~2 + + +nurbs_curve%is_rational + + + + + +proc~basis~2->proc~is_rational~2 + + + + + +proc~basis~3 + + +nurbs_volume%basis + + + + + +proc~basis~3->interface~ndgrid + + + + + +proc~basis~3->proc~basis_bspline + + + + + +proc~basis~3->proc~kron + + + + + +proc~bincoeff + + +bincoeff + + + + + proc~factln - - -factln + + +factln - + proc~bincoeff->proc~factln - - + + - + proc~cmp_elem - - -nurbs_volume%cmp_elem + + +nurbs_surface%cmp_elem - + proc~cmp_elem->interface~elemconn_cn - - + + - + proc~cmp_elem->interface~unique - - + + - + proc~get_multiplicity - - -nurbs_volume%get_multiplicity + + +nurbs_surface%get_multiplicity - + proc~cmp_elem->proc~get_multiplicity - - + + - + proc~cmp_elem_xc_vis - - -nurbs_volume%cmp_elem_Xc_vis + + +nurbs_surface%cmp_elem_Xc_vis - + proc~cmp_elem_xc_vis->interface~elemconn_c0 - - + + - + proc~cmp_elem_xc_vis~2 - - -nurbs_surface%cmp_elem_Xc_vis + + +nurbs_curve%cmp_elem_Xc_vis - + proc~cmp_elem_xc_vis~2->interface~elemconn_c0 - - + + - + proc~cmp_elem_xc_vis~3 - - -nurbs_curve%cmp_elem_Xc_vis + + +nurbs_volume%cmp_elem_Xc_vis - + proc~cmp_elem_xc_vis~3->interface~elemconn_c0 - - + + - + proc~cmp_elem_xg_vis - - -nurbs_volume%cmp_elem_Xg_vis + + +nurbs_surface%cmp_elem_Xg_vis - + proc~cmp_elem_xg_vis->interface~elemconn_c0 - - + + - + proc~cmp_elem_xg_vis~2 - - -nurbs_surface%cmp_elem_Xg_vis + + +nurbs_curve%cmp_elem_Xg_vis - + proc~cmp_elem_xg_vis~2->interface~elemconn_c0 - - + + - + proc~cmp_elem_xg_vis~3 - - -nurbs_curve%cmp_elem_Xg_vis + + +nurbs_volume%cmp_elem_Xg_vis - + proc~cmp_elem_xg_vis~3->interface~elemconn_c0 - - + + - + proc~cmp_elem~2 - - -nurbs_surface%cmp_elem + + +nurbs_curve%cmp_elem - + proc~cmp_elem~2->interface~elemconn_cn - - + + - + proc~cmp_elem~2->interface~unique - - + + - + proc~get_multiplicity~2 - - -nurbs_surface%get_multiplicity + + +nurbs_curve%get_multiplicity - + proc~cmp_elem~2->proc~get_multiplicity~2 - - + + - + proc~cmp_elem~3 - - -nurbs_curve%cmp_elem + + +nurbs_volume%cmp_elem - + proc~cmp_elem~3->interface~elemconn_cn - - + + - + proc~cmp_elem~3->interface~unique - - + + - + proc~get_multiplicity~3 - - -nurbs_curve%get_multiplicity + + +nurbs_volume%get_multiplicity - + proc~cmp_elem~3->proc~get_multiplicity~3 - - + + - + proc~compute_knot_vector - - -compute_knot_vector + + +compute_knot_vector - + proc~repelem - - -repelem + + +repelem - + proc~compute_knot_vector->proc~repelem - - + + - + proc~create - - -nurbs_volume%create + + +nurbs_surface%create - + proc~create->interface~ndgrid - - + + - + proc~create->proc~basis_bspline - - + + + + + +proc~create->proc~is_rational + + - + proc~create->proc~kron - - + + - + proc~create~2 - - -nurbs_surface%create + + +nurbs_curve%create - - -proc~create~2->interface~ndgrid - - - - + proc~create~2->proc~basis_bspline - - + + - + proc~create~2->proc~is_rational~2 - - - - - -proc~create~2->proc~kron - - + + - + proc~create~3 - - -nurbs_curve%create + + +nurbs_volume%create + + +proc~create~3->interface~ndgrid + + + - + proc~create~3->proc~basis_bspline - - + + - - -proc~create~3->proc~is_rational~3 - - + + +proc~create~3->proc~kron + + - + proc~derivative - - -nurbs_volume%derivative + + +nurbs_surface%derivative - + proc~derivative->interface~ndgrid - - + + - + proc~derivative->proc~basis_bspline_der - - + + + + + +proc~derivative->proc~is_rational + + - + proc~derivative->proc~kron - - + + - + proc~derivative~2 - - -nurbs_surface%derivative + + +nurbs_curve%derivative - - -proc~derivative~2->interface~ndgrid - - - - + proc~derivative~2->proc~basis_bspline_der - - + + - + proc~derivative~2->proc~is_rational~2 - - - - - -proc~derivative~2->proc~kron - - + + - + proc~derivative~3 - - -nurbs_curve%derivative + + +nurbs_volume%derivative + + +proc~derivative~3->interface~ndgrid + + + - + proc~derivative~3->proc~basis_bspline_der - - + + - - -proc~derivative~3->proc~is_rational~3 - - + + +proc~derivative~3->proc~kron + + - + proc~elevate_degree - - -nurbs_volume%elevate_degree + + +nurbs_surface%elevate_degree - + proc~elevate_degree->none~set - - + + - + proc~elevate_degree_a_5_9 - - -elevate_degree_A_5_9 + + +elevate_degree_A_5_9 - + proc~elevate_degree->proc~elevate_degree_a_5_9 - - + + + + + +proc~elevate_degree->proc~is_rational + + - + proc~elevate_degree_a_5_9->interface~compute_multiplicity - - + + - + proc~elevate_degree_a_5_9->proc~bincoeff - - + + - + proc~elevate_degree~2 - - -nurbs_surface%elevate_degree + + +nurbs_curve%elevate_degree - + proc~elevate_degree~2->none~set~2 - - + + - + proc~elevate_degree~2->proc~elevate_degree_a_5_9 - - + + - + proc~elevate_degree~2->proc~is_rational~2 - - + + - + proc~elevate_degree~3 - - -nurbs_curve%elevate_degree + + +nurbs_volume%elevate_degree - + proc~elevate_degree~3->none~set~3 - - + + - + proc~elevate_degree~3->proc~elevate_degree_a_5_9 - - - - - -proc~elevate_degree~3->proc~is_rational~3 - - + + - + proc~export_xc - - -nurbs_volume%export_Xc + + +nurbs_surface%export_Xc - + proc~export_xc->proc~cmp_elem_xc_vis - - + + - + proc~export_xc~2 - - -nurbs_surface%export_Xc + + +nurbs_curve%export_Xc - + proc~export_xc~2->proc~cmp_elem_xc_vis~2 - - + + - + proc~export_xc~3 - - -nurbs_curve%export_Xc + + +nurbs_volume%export_Xc - + proc~export_xc~3->proc~cmp_elem_xc_vis~3 - - + + - + proc~export_xg - - -nurbs_volume%export_Xg + + +nurbs_surface%export_Xg - + proc~export_xg->proc~cmp_elem_xg_vis - - + + - + proc~export_xg~2 - - -nurbs_surface%export_Xg + + +nurbs_curve%export_Xg - + proc~export_xg~2->proc~cmp_elem_xg_vis~2 - - + + - + proc~export_xg~3 - - -nurbs_curve%export_Xg + + +nurbs_volume%export_Xg - + proc~export_xg~3->proc~cmp_elem_xg_vis~3 - - + + - + proc~finalize - - -nurbs_volume%finalize + + +nurbs_surface%finalize - + proc~finalize~2 - - -nurbs_surface%finalize + + +nurbs_curve%finalize - + proc~finalize~3 - - -nurbs_curve%finalize + + +nurbs_volume%finalize - + proc~findspan - - -findspan + + +findspan - + proc~generate_xc - - -generate_Xc + + +generate_Xc - + proc~generate_xc~2 - - -generate_Xc + + +generate_Xc - + proc~generate_xc~3 - - -generate_Xc + + +generate_Xc - + proc~generate_xc~4 - - -generate_Xc + + +generate_Xc - + proc~generate_xc~5 - - -generate_Xc + + +generate_Xc - + proc~get_continuity - - -nurbs_volume%get_continuity + + +nurbs_surface%get_continuity - + proc~get_continuity->interface~compute_multiplicity - - + + - + proc~get_continuity~2 - - -nurbs_surface%get_continuity + + +nurbs_curve%get_continuity - + proc~get_continuity~2->interface~compute_multiplicity - - + + - + proc~get_continuity~3 - - -nurbs_curve%get_continuity + + +nurbs_volume%get_continuity - + proc~get_continuity~3->interface~compute_multiplicity - - + + - + proc~get_degree - - -nurbs_curve%get_degree + + +nurbs_curve%get_degree - - -proc~get_degree->proc~get_multiplicity~3 - - + + +proc~get_degree->proc~get_multiplicity~2 + + - + proc~get_degree_all->proc~get_multiplicity - - + + - - -proc~get_degree_all~2->proc~get_multiplicity~2 - - + + +proc~get_degree_all~2->proc~get_multiplicity~3 + + - + proc~get_degree_dir->proc~get_multiplicity - - + + - - -proc~get_degree_dir~2->proc~get_multiplicity~2 - - + + +proc~get_degree_dir~2->proc~get_multiplicity~3 + + - + proc~get_elem - - -nurbs_volume%get_elem + + +nurbs_surface%get_elem - + proc~get_elem_xc_vis - - -nurbs_volume%get_elem_Xc_vis + + +nurbs_surface%get_elem_Xc_vis - + proc~get_elem_xc_vis~2 - - -nurbs_surface%get_elem_Xc_vis + + +nurbs_curve%get_elem_Xc_vis - + proc~get_elem_xc_vis~3 - - -nurbs_curve%get_elem_Xc_vis + + +nurbs_volume%get_elem_Xc_vis - + proc~get_elem_xg_vis - - -nurbs_volume%get_elem_Xg_vis + + +nurbs_surface%get_elem_Xg_vis - + proc~get_elem_xg_vis~2 - - -nurbs_surface%get_elem_Xg_vis + + +nurbs_curve%get_elem_Xg_vis - + proc~get_elem_xg_vis~3 - - -nurbs_curve%get_elem_Xg_vis + + +nurbs_volume%get_elem_Xg_vis - + proc~get_elem~2 - - -nurbs_surface%get_elem + + +nurbs_curve%get_elem - + proc~get_elem~3 - - -nurbs_curve%get_elem + + +nurbs_volume%get_elem - + proc~get_multiplicity->interface~compute_multiplicity - - + + - + proc~get_multiplicity~2->interface~compute_multiplicity - - + + - + proc~get_multiplicity~3->interface~compute_multiplicity - - + + - + proc~get_nc - - -nurbs_volume%get_nc + + +nurbs_surface%get_nc - + proc~get_nc->interface~compute_multiplicity - - + + - + proc~get_nc~2 - - -nurbs_surface%get_nc + + +nurbs_curve%get_nc - + proc~get_nc~2->interface~compute_multiplicity - - + + - + proc~get_nc~3 - - -nurbs_curve%get_nc + + +nurbs_volume%get_nc - + proc~get_nc~3->interface~compute_multiplicity - - + + - + proc~get_ng - - -nurbs_volume%get_ng + + +nurbs_surface%get_ng - + proc~get_ng~2 - - -nurbs_surface%get_ng + + +nurbs_curve%get_ng - -proc~get_ng~3 - - -nurbs_curve%get_ng - - - - - -proc~get_wc - - -nurbs_volume%get_Wc - - - - - -proc~get_wc~2 - - -nurbs_surface%get_Wc - - - - - -proc~get_wc~3 - - -nurbs_curve%get_Wc - - - - - -proc~get_xc - - -nurbs_volume%get_Xc - - - - - -proc~get_xc~2 - - -nurbs_surface%get_Xc - - - - - -proc~get_xc~3 - - -nurbs_curve%get_Xc - - - - - -proc~get_xg - - -nurbs_volume%get_Xg - - - - - -proc~get_xg~2 - - -nurbs_surface%get_Xg - - - - -proc~get_xg~3 - - -nurbs_curve%get_Xg +proc~get_ng~3 + + +nurbs_volume%get_ng - + proc~get_xt - - -nurbs_volume%get_Xt + + +nurbs_surface%get_Xt - + proc~get_xt~2 - - -nurbs_surface%get_Xt + + +nurbs_curve%get_Xt - + proc~get_xt~3 - - -nurbs_curve%get_Xt + + +nurbs_volume%get_Xt - + proc~hexahedron_xc - - -hexahedron_Xc + + +hexahedron_Xc - + proc~insert_knot_a_5_1 - - -insert_knot_A_5_1 + + +insert_knot_A_5_1 - + proc~insert_knots - - -nurbs_volume%insert_knots + + +nurbs_surface%insert_knots - + proc~insert_knots->interface~compute_multiplicity - - + + - + proc~insert_knots->none~set - - + + - + proc~insert_knots->proc~findspan - - + + - + proc~insert_knots->proc~insert_knot_a_5_1 - - + + + + + +proc~insert_knots->proc~is_rational + + - + proc~insert_knots~2 - - -nurbs_surface%insert_knots + + +nurbs_curve%insert_knots - + proc~insert_knots~2->interface~compute_multiplicity - - + + - + proc~insert_knots~2->none~set~2 - - + + - + proc~insert_knots~2->proc~findspan - - + + - + proc~insert_knots~2->proc~insert_knot_a_5_1 - - + + - + proc~insert_knots~2->proc~is_rational~2 - - + + - + proc~insert_knots~3 - - -nurbs_curve%insert_knots + + +nurbs_volume%insert_knots - + proc~insert_knots~3->interface~compute_multiplicity - - + + - + proc~insert_knots~3->none~set~3 - - + + - + proc~insert_knots~3->proc~findspan - - + + - + proc~insert_knots~3->proc~insert_knot_a_5_1 - - + + - - -proc~insert_knots~3->proc~is_rational~3 - - - - - -proc~is_rational - - -nurbs_volume%is_rational + + +proc~is_rational~3 + + +nurbs_volume%is_rational - + proc~isnan - - -isnan + + +isnan - + proc~modify_wc - - -nurbs_volume%modify_Wc + + +nurbs_surface%modify_Wc - + proc~modify_wc->none~set - - + + - + proc~modify_wc~2 - - -nurbs_surface%modify_Wc + + +nurbs_curve%modify_Wc - + proc~modify_wc~2->none~set~2 - - + + - + proc~modify_wc~3 - - -nurbs_curve%modify_Wc + + +nurbs_volume%modify_Wc - + proc~modify_wc~3->none~set~3 - - + + - + proc~modify_xc - - -nurbs_volume%modify_Xc + + +nurbs_surface%modify_Xc - + proc~modify_xc->none~set - - + + - + proc~modify_xc~2 - - -nurbs_surface%modify_Xc + + +nurbs_curve%modify_Xc - + proc~modify_xc~2->none~set~2 - - + + - + proc~modify_xc~3 - - -nurbs_curve%modify_Xc + + +nurbs_volume%modify_Xc - + proc~modify_xc~3->none~set~3 - - + + - + proc~put_to_nurbs - - -nurbs_volume%put_to_nurbs + + +nurbs_volume%put_to_nurbs - + proc~put_to_nurbs->proc~basis_bspline - - + + - + proc~put_to_nurbs->proc~kron - - + + - - -proc~set_elem_xg_vis - - -nurbs_volume%set_elem_Xg_vis + + +proc~set_elem_xg_vis~3 + + +nurbs_volume%set_elem_Xg_vis - - -proc~put_to_nurbs->proc~set_elem_xg_vis - - + + +proc~put_to_nurbs->proc~set_elem_xg_vis~3 + + - + proc~remove_knots - - -nurbs_volume%remove_knots + + +nurbs_surface%remove_knots - + proc~remove_knots->interface~compute_multiplicity - - + + - + proc~remove_knots->none~set - - + + - + proc~remove_knots->proc~findspan - - + + + + + +proc~remove_knots->proc~is_rational + + - + proc~remove_knots_a_5_8 - - -remove_knots_A_5_8 + + +remove_knots_A_5_8 - + proc~remove_knots->proc~remove_knots_a_5_8 - - + + - + proc~remove_knots~2 - - -nurbs_surface%remove_knots + + +nurbs_curve%remove_knots - + proc~remove_knots~2->interface~compute_multiplicity - - + + - + proc~remove_knots~2->none~set~2 - - + + - + proc~remove_knots~2->proc~findspan - - + + - + proc~remove_knots~2->proc~is_rational~2 - - + + - + proc~remove_knots~2->proc~remove_knots_a_5_8 - - + + - + proc~remove_knots~3 - - -nurbs_curve%remove_knots + + +nurbs_volume%remove_knots - + proc~remove_knots~3->interface~compute_multiplicity - - + + - + proc~remove_knots~3->none~set~3 - - + + - + proc~remove_knots~3->proc~findspan - - - - - -proc~remove_knots~3->proc~is_rational~3 - - + + - + proc~remove_knots~3->proc~remove_knots_a_5_8 - - + + - + proc~rotate_xc - - -nurbs_volume%rotate_Xc + + +nurbs_surface%rotate_Xc - + proc~rotation - - -rotation + + +rotation - + proc~rotate_xc->proc~rotation - - + + - + proc~rotate_xc~2 - - -nurbs_surface%rotate_Xc + + +nurbs_curve%rotate_Xc - + proc~rotate_xc~2->proc~rotation - - + + - + proc~rotate_xc~3 - - -nurbs_curve%rotate_Xc + + +nurbs_volume%rotate_Xc - + proc~rotate_xc~3->proc~rotation - - + + - + proc~rotate_xg - - -nurbs_volume%rotate_Xg + + +nurbs_surface%rotate_Xg - + proc~rotate_xg->proc~rotation - - + + - + proc~rotate_xg~2 - - -nurbs_surface%rotate_Xg + + +nurbs_curve%rotate_Xg - + proc~rotate_xg~2->proc~rotation - - + + - + proc~rotate_xg~3 - - -nurbs_curve%rotate_Xg + + +nurbs_volume%rotate_Xg - + proc~rotate_xg~3->proc~rotation - - + + - + cosd - -cosd + +cosd - + proc~rotation->cosd - - + + - + sind - -sind + +sind - + proc~rotation->sind - - + + - + proc~set1->none~get_degree - - + + - + proc~set1->proc~get_nc - - + + - - -proc~set1~2->none~get_degree~2 - - + + +proc~set1~2->proc~get_degree + + - - -proc~set1~2->proc~get_nc~2 - - + + +proc~set1~3->none~get_degree~3 + + - - -proc~set1~3->proc~get_degree - - + + +proc~set1~3->proc~get_nc~3 + + - + proc~set2->proc~compute_knot_vector - - + + - + proc~set2->proc~get_nc - - + + - + proc~set2~2->proc~compute_knot_vector - - - - - -proc~set2~2->proc~get_nc~2 - - + + - + proc~set2~3->proc~compute_knot_vector - - + + + + + +proc~set2~3->proc~get_nc~3 + + - + proc~set3->none~get_degree - - + + - - -proc~set3~2->none~get_degree~2 - - + + +proc~set3~2->proc~get_degree + + - - -proc~set3~3->proc~get_degree - - + + +proc~set3~3->none~get_degree~3 + + - + proc~set_circle - - -nurbs_curve%set_circle + + +nurbs_curve%set_circle - - -proc~set_circle->none~set~3 - - + + +proc~set_circle->none~set~2 + + - + proc~set_elem - - -nurbs_volume%set_elem + + +nurbs_surface%set_elem - + proc~set_elem_xc_vis - - -nurbs_volume%set_elem_Xc_vis + + +nurbs_surface%set_elem_Xc_vis - + proc~set_elem_xc_vis~2 - - -nurbs_surface%set_elem_Xc_vis + + +nurbs_curve%set_elem_Xc_vis - + proc~set_elem_xc_vis~3 - - -nurbs_curve%set_elem_Xc_vis + + +nurbs_volume%set_elem_Xc_vis - - -proc~set_elem_xg_vis~2 - - -nurbs_surface%set_elem_Xg_vis + + +proc~set_elem_xg_vis + + +nurbs_surface%set_elem_Xg_vis - - -proc~set_elem_xg_vis~3 - - -nurbs_curve%set_elem_Xg_vis + + +proc~set_elem_xg_vis~2 + + +nurbs_curve%set_elem_Xg_vis - + proc~set_elem~2 - - -nurbs_surface%set_elem + + +nurbs_curve%set_elem - + proc~set_elem~3 - - -nurbs_curve%set_elem + + +nurbs_volume%set_elem - + proc~set_hexahedron - - -nurbs_volume%set_hexahedron + + +nurbs_volume%set_hexahedron - - -proc~set_hexahedron->none~set - - + + +proc~set_hexahedron->none~set~3 + + - + proc~set_hexahedron->proc~hexahedron_xc - - + + - + proc~set_tetragon - - -nurbs_surface%set_tetragon + + +nurbs_surface%set_tetragon - - -proc~set_tetragon->none~set~2 - - + + +proc~set_tetragon->none~set + + - + proc~tetragon_xc - - -tetragon_Xc + + +tetragon_Xc - + proc~set_tetragon->proc~tetragon_xc - - + + - + proc~show - - -nurbs_volume%show + + +nurbs_surface%show - + proc~show~2 - - -nurbs_surface%show + + +nurbs_curve%show - + proc~show~3 - - -nurbs_curve%show + + +nurbs_volume%show - + proc~translate_xc - - -nurbs_volume%translate_Xc + + +nurbs_surface%translate_Xc - + proc~translate_xc~2 - - -nurbs_surface%translate_Xc + + +nurbs_curve%translate_Xc - + proc~translate_xc~3 - - -nurbs_curve%translate_Xc + + +nurbs_volume%translate_Xc - + proc~translate_xg - - -nurbs_volume%translate_Xg + + +nurbs_surface%translate_Xg - + proc~translate_xg~2 - - -nurbs_surface%translate_Xg + + +nurbs_curve%translate_Xg - + proc~translate_xg~3 - - -nurbs_curve%translate_Xg + + +nurbs_volume%translate_Xg - + program~example1_curve - - -example1_curve + + +example1_curve - - -program~example1_curve->none~get_knot~3 - - + + +program~example1_curve->none~get_knot~2 + + - - -program~example1_curve->none~set~3 - - + + +program~example1_curve->none~set~2 + + - - -program~example1_curve->proc~create~3 - - + + +program~example1_curve->proc~create~2 + + - - -program~example1_curve->proc~elevate_degree~3 - - + + +program~example1_curve->proc~elevate_degree~2 + + - - -program~example1_curve->proc~export_xc~3 - - + + +program~example1_curve->proc~export_xc~2 + + - - -program~example1_curve->proc~export_xg~3 - - + + +program~example1_curve->proc~export_xg~2 + + - - -program~example1_curve->proc~finalize~3 - - + + +program~example1_curve->proc~finalize~2 + + - + program~example1_curve->proc~get_degree - - + + - - -program~example1_curve->proc~insert_knots~3 - - + + +program~example1_curve->proc~insert_knots~2 + + - - -program~example1_curve->proc~remove_knots~3 - - + + +program~example1_curve->proc~remove_knots~2 + + - - -program~example1_curve->proc~rotate_xc~3 - - + + +program~example1_curve->proc~rotate_xc~2 + + - - -program~example1_curve->proc~rotate_xg~3 - - + + +program~example1_curve->proc~rotate_xg~2 + + - - -program~example1_curve->proc~show~3 - - + + +program~example1_curve->proc~show~2 + + - - -program~example1_curve->proc~translate_xc~3 - - + + +program~example1_curve->proc~translate_xc~2 + + - - -program~example1_curve->proc~translate_xg~3 - - + + +program~example1_curve->proc~translate_xg~2 + + - + program~example3_surface - - -example3_surface + + +example3_surface - - -program~example3_surface->none~get_degree~2 - - + + +program~example3_surface->none~get_degree + + - - -program~example3_surface->none~get_knot~2 - - + + +program~example3_surface->none~get_knot + + - - -program~example3_surface->none~set~2 - - + + +program~example3_surface->none~set + + - - -program~example3_surface->proc~create~2 - - + + +program~example3_surface->proc~create + + - - -program~example3_surface->proc~elevate_degree~2 - - + + +program~example3_surface->proc~elevate_degree + + - - -program~example3_surface->proc~export_xc~2 - - + + +program~example3_surface->proc~export_xc + + - - -program~example3_surface->proc~export_xg~2 - - + + +program~example3_surface->proc~export_xg + + - - -program~example3_surface->proc~finalize~2 - - + + +program~example3_surface->proc~finalize + + - - -program~example3_surface->proc~generate_xc~2 - - + + +program~example3_surface->proc~generate_xc~3 + + - - -program~example3_surface->proc~insert_knots~2 - - + + +program~example3_surface->proc~insert_knots + + - - -program~example3_surface->proc~remove_knots~2 - - + + +program~example3_surface->proc~remove_knots + + - - -program~example3_surface->proc~rotate_xc~2 - - + + +program~example3_surface->proc~rotate_xc + + - - -program~example3_surface->proc~rotate_xg~2 - - + + +program~example3_surface->proc~rotate_xg + + - - -program~example3_surface->proc~show~2 - - + + +program~example3_surface->proc~show + + - - -program~example3_surface->proc~translate_xc~2 - - + + +program~example3_surface->proc~translate_xc + + - - -program~example3_surface->proc~translate_xg~2 - - + + +program~example3_surface->proc~translate_xg + + - + program~example3_volume - - -example3_volume + + +example3_volume - - -program~example3_volume->none~get_degree - - + + +program~example3_volume->none~get_degree~3 + + - - -program~example3_volume->none~get_knot - - + + +program~example3_volume->none~get_knot~3 + + - - -program~example3_volume->none~set - - + + +program~example3_volume->none~set~3 + + - - -program~example3_volume->proc~create - - + + +program~example3_volume->proc~create~3 + + - - -program~example3_volume->proc~elevate_degree - - + + +program~example3_volume->proc~elevate_degree~3 + + - - -program~example3_volume->proc~export_xc - - + + +program~example3_volume->proc~export_xc~3 + + - - -program~example3_volume->proc~export_xg - - + + +program~example3_volume->proc~export_xg~3 + + - - -program~example3_volume->proc~finalize - - + + +program~example3_volume->proc~finalize~3 + + - - -program~example3_volume->proc~generate_xc~3 - - + + +program~example3_volume->proc~generate_xc~4 + + - - -program~example3_volume->proc~insert_knots - - + + +program~example3_volume->proc~insert_knots~3 + + - - -program~example3_volume->proc~remove_knots - - + + +program~example3_volume->proc~remove_knots~3 + + - - -program~example3_volume->proc~rotate_xc - - + + +program~example3_volume->proc~rotate_xc~3 + + - - -program~example3_volume->proc~rotate_xg - - + + +program~example3_volume->proc~rotate_xg~3 + + - - -program~example3_volume->proc~show - - + + +program~example3_volume->proc~show~3 + + - - -program~example3_volume->proc~translate_xc - - + + +program~example3_volume->proc~translate_xc~3 + + - - -program~example3_volume->proc~translate_xg - - + + +program~example3_volume->proc~translate_xg~3 + + - + program~example_morph - - -example_morph + + +example_morph - - -program~example_morph->none~set - - + + +program~example_morph->none~set~3 + + - - -program~example_morph->proc~export_xc - - + + +program~example_morph->proc~export_xc~3 + + - - -program~example_morph->proc~export_xg - - + + +program~example_morph->proc~export_xg~3 + + - + program~example_morph->proc~hexahedron_xc - - + + - + program~example_morph->proc~put_to_nurbs - - + + - - -program~example_morph->proc~show - - + + +program~example_morph->proc~show~3 + + - + program~example_nurbs_curve - - -example_nurbs_curve + + +example_nurbs_curve - - -program~example_nurbs_curve->none~set~3 - - + + +program~example_nurbs_curve->none~set~2 + + - - -program~example_nurbs_curve->proc~create~3 - - + + +program~example_nurbs_curve->proc~create~2 + + - - -program~example_nurbs_curve->proc~export_xc~3 - - + + +program~example_nurbs_curve->proc~export_xc~2 + + - - -program~example_nurbs_curve->proc~export_xg~3 - - + + +program~example_nurbs_curve->proc~export_xg~2 + + - - -program~example_nurbs_curve->proc~finalize~3 - - + + +program~example_nurbs_curve->proc~finalize~2 + + - - -program~example_nurbs_curve->proc~generate_xc - - + + +program~example_nurbs_curve->proc~generate_xc~5 + + - - -program~example_nurbs_curve->proc~show~3 - - + + +program~example_nurbs_curve->proc~show~2 + + - + program~example_nurbs_surface - - -example_nurbs_surface + + +example_nurbs_surface - - -program~example_nurbs_surface->none~set~2 - - + + +program~example_nurbs_surface->none~set + + - - -program~example_nurbs_surface->proc~create~2 - - + + +program~example_nurbs_surface->proc~create + + - - -program~example_nurbs_surface->proc~export_xc~2 - - + + +program~example_nurbs_surface->proc~export_xc + + - - -program~example_nurbs_surface->proc~export_xg~2 - - + + +program~example_nurbs_surface->proc~export_xg + + - - -program~example_nurbs_surface->proc~finalize~2 - - + + +program~example_nurbs_surface->proc~finalize + + - - -program~example_nurbs_surface->proc~generate_xc~5 - - + + +program~example_nurbs_surface->proc~generate_xc + + - - -program~example_nurbs_surface->proc~show~2 - - + + +program~example_nurbs_surface->proc~show + + - + program~example_nurbs_volume - - -example_nurbs_volume + + +example_nurbs_volume - - -program~example_nurbs_volume->none~set - - - - - -program~example_nurbs_volume->proc~create - - - - - -program~example_nurbs_volume->proc~export_xc - - - - - -program~example_nurbs_volume->proc~export_xg - - - - - -program~example_nurbs_volume->proc~finalize - - - - - -program~example_nurbs_volume->proc~generate_xc~4 - - - - - -program~example_nurbs_volume->proc~show - - + + +program~example_nurbs_volume->none~set~3 + + + + + +program~example_nurbs_volume->proc~create~3 + + + + + +program~example_nurbs_volume->proc~export_xc~3 + + + + + +program~example_nurbs_volume->proc~export_xg~3 + + + + + +program~example_nurbs_volume->proc~finalize~3 + + + + + +program~example_nurbs_volume->proc~generate_xc~2 + + + + + +program~example_nurbs_volume->proc~show~3 + + - + program~shape_circle - - -shape_circle + + +shape_circle - - -program~shape_circle->proc~create~3 - - + + +program~shape_circle->proc~create~2 + + - - -program~shape_circle->proc~export_xc~3 - - + + +program~shape_circle->proc~export_xc~2 + + - - -program~shape_circle->proc~export_xg~3 - - + + +program~shape_circle->proc~export_xg~2 + + - - -program~shape_circle->proc~finalize~3 - - + + +program~shape_circle->proc~finalize~2 + + - + program~shape_circle->proc~set_circle - - + + - - -program~shape_circle->proc~show~3 - - + + +program~shape_circle->proc~show~2 + + - + program~shape_hexahedron - - -shape_hexahedron + + +shape_hexahedron - - -program~shape_hexahedron->proc~create - - + + +program~shape_hexahedron->proc~create~3 + + - - -program~shape_hexahedron->proc~export_xc - - + + +program~shape_hexahedron->proc~export_xc~3 + + - - -program~shape_hexahedron->proc~export_xg - - + + +program~shape_hexahedron->proc~export_xg~3 + + - - -program~shape_hexahedron->proc~finalize - - + + +program~shape_hexahedron->proc~finalize~3 + + - + program~shape_hexahedron->proc~set_hexahedron - - + + - - -program~shape_hexahedron->proc~show - - + + +program~shape_hexahedron->proc~show~3 + + - + program~shape_tetragon - - -shape_tetragon + + +shape_tetragon - - -program~shape_tetragon->proc~create~2 - - + + +program~shape_tetragon->proc~create + + - - -program~shape_tetragon->proc~export_xc~2 - - + + +program~shape_tetragon->proc~export_xc + + - - -program~shape_tetragon->proc~export_xg~2 - - + + +program~shape_tetragon->proc~export_xg + + - - -program~shape_tetragon->proc~finalize~2 - - + + +program~shape_tetragon->proc~finalize + + - + program~shape_tetragon->proc~set_tetragon - - + + - - -program~shape_tetragon->proc~show~2 - - + + +program~shape_tetragon->proc~show + + @@ -4400,7 +4850,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/lists/programs.html b/lists/programs.html index 7748071e3..1569f4e8d 100644 --- a/lists/programs.html +++ b/lists/programs.html @@ -155,7 +155,7 @@

    Programs

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/lists/types.html b/lists/types.html index 1e868d2f3..9bff1118b 100644 --- a/lists/types.html +++ b/lists/types.html @@ -197,7 +197,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/module/forcad.html b/module/forcad.html index 5f1c7d1d1..9e05a39ff 100644 --- a/module/forcad.html +++ b/module/forcad.html @@ -144,10 +144,10 @@

    Uses

    • @@ -606,7 +606,7 @@

      Documentation generated by FORD - on 2024-04-16T12:26:30.084942

      + on 2024-04-16T18:31:38.142193


      diff --git a/module/forcad_nurbs_curve.html b/module/forcad_nurbs_curve.html index 58663df14..f843fb599 100644 --- a/module/forcad_nurbs_curve.html +++ b/module/forcad_nurbs_curve.html @@ -78,7 +78,7 @@

      forcad_nurbs_curve
    • 682 statements + title="18.6% of total for modules and submodules.">742 statements
    • @@ -138,24 +138,29 @@

      Functions

      @@ -167,29 +172,29 @@

      Subroutines

      @@ -630,7 +635,7 @@

      Components

      - + real(kind=rk), private, @@ -647,7 +652,7 @@

      Components

      - + real(kind=rk), private, @@ -681,7 +686,7 @@

      Components

      - + real(kind=rk), private, @@ -698,7 +703,7 @@

      Components

      - + integer, private @@ -715,7 +720,7 @@

      Components

      - + integer, private, @@ -732,7 +737,7 @@

      Components

      - + integer, private, @@ -749,7 +754,7 @@

      Components

      - + integer, private, @@ -766,7 +771,7 @@

      Components

      - + real(kind=rk), private, @@ -783,7 +788,7 @@

      Components

      - + integer, private @@ -800,7 +805,7 @@

      Components

      - + integer, private @@ -826,173 +831,173 @@

      Type-Bound Procedures

      procedure, public :: - basis -

      Compute the basis functions of the NURBS curve

      Read more… + basis +

      Compute the basis functions of the NURBS curve

      Read more… procedure, public :: - cmp_elem -

      Generate IGA element connectivity

      Read more… + cmp_elem +

      Generate IGA element connectivity

      Read more… procedure, public :: - cmp_elem_Xc_vis -

      Generate connectivity for control points

      Read more… + cmp_elem_Xc_vis +

      Generate connectivity for control points

      Read more… procedure, public :: - cmp_elem_Xg_vis -

      Generate connectivity for geometry points

      Read more… + cmp_elem_Xg_vis +

      Generate connectivity for geometry points

      Read more… procedure, public :: - create -

      Generate geometry points

      Read more… + create +

      Generate geometry points

      Read more… procedure, public :: - derivative -

      Compute the derivative of the NURBS curve

      Read more… + derivative +

      Compute the derivative of the NURBS curve

      Read more… procedure, public :: - elevate_degree -

      Elevate the degree of the curve

      Read more… + elevate_degree +

      Elevate the degree of the curve

      Read more… procedure, public :: - export_Xc -

      Export control points to VTK file

      Read more… + export_Xc +

      Export control points to VTK file

      Read more… procedure, public :: - export_Xg -

      Export geometry points to VTK file

      Read more… + export_Xg +

      Export geometry points to VTK file

      Read more… procedure, public :: - finalize -

      Finalize the NURBS curve object

      Read more… + finalize +

      Finalize the NURBS curve object

      Read more… - procedure, public :: - get_Wc -

      Get weights

      Read more… + generic, public :: + get_Wc => get_Wc_all, get_Wci +

      Get weights

      Read more… - procedure, public :: - get_Xc -

      Get control points

      Read more… + generic, public :: + get_Xc => get_Xc_all, get_Xci, get_Xcid +

      Get control points

      Read more… - procedure, public :: - get_Xg -

      Get geometry points

      Read more… + generic, public :: + get_Xg => get_Xg_all, get_Xgi, get_Xgid +

      Get geometry points

      Read more… procedure, public :: - get_Xt -

      Get parameter values

      Read more… + get_Xt +

      Get parameter values

      Read more… procedure, public :: - get_continuity -

      Get continuity of the curve

      Read more… + get_continuity +

      Get continuity of the curve

      Read more… procedure, public :: - get_degree -

      Get degree of the NURBS curve

      Read more… + get_degree +

      Get degree of the NURBS curve

      Read more… procedure, public :: - get_elem -

      Get IGA element connectivity

      Read more… + get_elem +

      Get IGA element connectivity

      Read more… procedure, public :: - get_elem_Xc_vis -

      Get connectivity for control points

      Read more… + get_elem_Xc_vis +

      Get connectivity for control points

      Read more… procedure, public :: - get_elem_Xg_vis -

      Get connectivity for geometry points

      Read more… + get_elem_Xg_vis +

      Get connectivity for geometry points

      Read more… generic, public :: - get_knot => get_knoti, get_knot_all -

      Get knot vector

      Read more… + get_knot => get_knoti, get_knot_all +

      Get knot vector

      Read more… procedure, public :: - get_multiplicity -

      Get multiplicity of the knot vector

      Read more… + get_multiplicity +

      Get multiplicity of the knot vector

      Read more… procedure, public :: - get_nc -

      Get number of required control points

      Read more… + get_nc +

      Get number of required control points

      Read more… procedure, public :: - get_ng -

      Get number of geometry points

      Read more… + get_ng +

      Get number of geometry points

      Read more… procedure, public :: - insert_knots -

      Insert knots into the knot vector

      Read more… + insert_knots +

      Insert knots into the knot vector

      Read more… procedure, public :: - is_rational -

      Check if the NURBS curve is rational

      Read more… + is_rational +

      Check if the NURBS curve is rational

      Read more… procedure, public :: - modify_Wc -

      Modify weights

      Read more… + modify_Wc +

      Modify weights

      Read more… procedure, public :: - modify_Xc -

      Modify control points

      Read more… + modify_Xc +

      Modify control points

      Read more… procedure, public :: - remove_knots -

      Remove knots from the knot vector

      Read more… + remove_knots +

      Remove knots from the knot vector

      Read more… procedure, public :: - rotate_Xc -

      Rotate control points

      Read more… + rotate_Xc +

      Rotate control points

      Read more… procedure, public :: - rotate_Xg -

      Rotate geometry points

      Read more… + rotate_Xg +

      Rotate geometry points

      Read more… generic, public :: - set => set1, set2, set3 -

      Set NURBS curve

      Read more… + set => set1, set2, set3 +

      Set NURBS curve

      Read more… procedure, public :: - set1 -

      Set knot vector, control points and weights for the NURBS curve object

      Read more… + set1 +

      Set knot vector, control points and weights for the NURBS curve object

      Read more… procedure, public :: - set2 -

      Set NURBS curve using nodes of parameter space, degree, continuity, control points and weights

      Read more… + set2 +

      Set NURBS curve using nodes of parameter space, degree, continuity, control points and weights

      Read more… procedure, public :: - set3 -

      Set Bezier or Rational Bezier curve using control points and weights

      Read more… + set3 +

      Set Bezier or Rational Bezier curve using control points and weights

      Read more… procedure, public :: @@ -1001,43 +1006,83 @@

      Type-Bound Procedures

      procedure, public :: - set_elem -

      Set IGA element connectivity

      Read more… + set_elem +

      Set IGA element connectivity

      Read more… procedure, public :: - set_elem_Xc_vis -

      Set connectivity for control points

      Read more… + set_elem_Xc_vis +

      Set connectivity for control points

      Read more… procedure, public :: - set_elem_Xg_vis -

      Set connectivity for geometry points

      Read more… + set_elem_Xg_vis +

      Set connectivity for geometry points

      Read more… procedure, public :: - show -

      Show the NURBS object using PyVista

      Read more… + show +

      Show the NURBS object using PyVista

      Read more… procedure, public :: - translate_Xc -

      Translate control points

      Read more… + translate_Xc +

      Translate control points

      Read more… procedure, public :: - translate_Xg -

      Translate geometry points

      Read more… + translate_Xg +

      Translate geometry points

      Read more… + + + procedure, private :: + get_Wc_all +

      Get all weights

      Read more… + + + procedure, private :: + get_Wci +

      Get i-th weight

      Read more… + + + procedure, private :: + get_Xc_all +

      Get all control points

      Read more… + + + procedure, private :: + get_Xci +

      Get i-th control point

      Read more… + + + procedure, private :: + get_Xcid +

      Get i-th control point in a specific direction

      Read more… procedure, private :: - get_knot_all -

      Get all knot vectors

      Read more… + get_Xg_all +

      Get all geometry points

      Read more… procedure, private :: - get_knoti -

      Get i-th knot value

      Read more… + get_Xgi +

      Get i-th geometry point

      Read more… + + + procedure, private :: + get_Xgid +

      Get i-th geometry point in a specific direction

      Read more… + + + procedure, private :: + get_knot_all +

      Get all knot vectors

      Read more… + + + procedure, private :: + get_knoti +

      Get i-th knot value

      Read more… @@ -1050,7 +1095,7 @@

      Type-Bound Procedures

      Functions

      -

      private pure function cmp_elem(this) result(elemConn) +

      private pure function cmp_elem(this) result(elemConn)

      @@ -1073,7 +1118,7 @@

      Arguments

      - + class(nurbs_curve), intent(in) @@ -1099,7 +1144,7 @@

      -

      private pure function cmp_elem_Xc_vis(this, p) result(elemConn) +

      private pure function cmp_elem_Xc_vis(this, p) result(elemConn)

      @@ -1122,7 +1167,7 @@

      Arguments

      - + class(nurbs_curve), intent(in) @@ -1137,7 +1182,7 @@

      Arguments

      - + integer, intent(in), @@ -1163,7 +1208,7 @@

      -

      private pure function cmp_elem_Xg_vis(this, p) result(elemConn) +

      private pure function cmp_elem_Xg_vis(this, p) result(elemConn)

      @@ -1186,7 +1231,7 @@

      Arguments

      - + class(nurbs_curve), intent(in) @@ -1201,7 +1246,7 @@

      Arguments

      - + integer, intent(in), @@ -1227,7 +1272,7 @@

      -

      private pure function get_Wc(this) result(Wc) +

      private pure function get_Wc_all(this) result(Wc)

      @@ -1250,7 +1295,7 @@

      Arguments

      - + class(nurbs_curve), intent(in) @@ -1276,7 +1321,7 @@

      -

      private pure function get_Xc(this) result(Xc) +

      private pure function get_Wci(this, n) result(Wc)

      @@ -1299,7 +1344,71 @@

      Arguments

      - + + class(nurbs_curve), + +intent(in) + + + + :: + this + + + + + + + + integer, + +intent(in) + + + + :: + n + + + + + + + +

      + Return Value + real(kind=rk) +

      + + +
      +

      + +
      +

      private pure function get_Xc_all(this) result(Xc) +

      +
      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + +

      Arguments

      + + + + + + + + + + + + @@ -1325,7 +1434,7 @@

      -

      private pure function get_Xg(this) result(Xg) +

      private pure function get_Xci(this, n) result(Xc)

      @@ -1348,7 +1457,150 @@

      Arguments

      + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + class(nurbs_curve), intent(in)
      - + + class(nurbs_curve), + intent(in) + + ::this + +
      + + integer, + intent(in) + + ::n + +
      + +

      + Return Value + real(kind=rk), allocatable, (:) +

      + + +
      +
      + +
      +

      private pure function get_Xcid(this, n, dir) result(Xc) +

      +
      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_curve), + intent(in) + + ::this + +
      + + integer, + intent(in) + + ::n + +
      + + integer, + intent(in) + + ::dir + +
      + +

      + Return Value + real(kind=rk) +

      + + +
      +
      + +
      +

      private pure function get_Xg_all(this) result(Xg) +

      +
      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + +

      Arguments

      + + + + + + + + + + + + @@ -1374,7 +1626,7 @@

      -

      private pure function get_Xt(this) result(Xt) +

      private pure function get_Xgi(this, n) result(Xg)

      @@ -1397,7 +1649,150 @@

      Arguments

      + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + class(nurbs_curve), intent(in)
      - + + class(nurbs_curve), + intent(in) + + ::this + +
      + + integer, + intent(in) + + ::n + +
      + +

      + Return Value + real(kind=rk), allocatable, (:) +

      + + +
      +
      + +
      +

      private pure function get_Xgid(this, n, dir) result(Xg) +

      +
      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_curve), + intent(in) + + ::this + +
      + + integer, + intent(in) + + ::n + +
      + + integer, + intent(in) + + ::dir + +
      + +

      + Return Value + real(kind=rk) +

      + + +
      +
      + +
      +

      private pure function get_Xt(this) result(Xt) +

      +
      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + +

      Arguments

      + + + + + + + + + + + + @@ -1423,7 +1818,7 @@

      -

      private pure function get_continuity(this) result(c) +

      private pure function get_continuity(this) result(c)

      @@ -1446,7 +1841,7 @@

      Arguments

      @@ -1495,7 +1890,7 @@

      Arguments

      @@ -1521,7 +1916,7 @@

      -

      private pure function get_elem(this) result(elemConn) +

      private pure function get_elem(this) result(elemConn)

      @@ -1544,7 +1939,7 @@

      Arguments

      @@ -1570,7 +1965,7 @@

      -

      private pure function get_elem_Xc_vis(this) result(elemConn) +

      private pure function get_elem_Xc_vis(this) result(elemConn)

      @@ -1593,7 +1988,7 @@

      Arguments

      @@ -1619,7 +2014,7 @@

      -

      private pure function get_elem_Xg_vis(this) result(elemConn) +

      private pure function get_elem_Xg_vis(this) result(elemConn)

      @@ -1642,7 +2037,7 @@

      Arguments

      @@ -1668,7 +2063,7 @@

      -

      private pure function get_knot_all(this) result(knot) +

      private pure function get_knot_all(this) result(knot)

      @@ -1691,7 +2086,7 @@

      Arguments

      @@ -1717,7 +2112,7 @@

      -

      private pure function get_knoti(this, i) result(knot) +

      private pure function get_knoti(this, i) result(knot)

      @@ -1740,7 +2135,7 @@

      Arguments

      @@ -1755,7 +2150,7 @@

      Arguments

      @@ -1781,7 +2176,7 @@

      -

      private pure function get_multiplicity(this) result(m) +

      private pure function get_multiplicity(this) result(m)

      @@ -1804,7 +2199,7 @@

      Arguments

      @@ -1830,7 +2225,7 @@

      -

      private pure function get_nc(this) result(nc) +

      private pure function get_nc(this) result(nc)

      @@ -1853,7 +2248,7 @@

      Arguments

      @@ -1879,7 +2274,7 @@

      -

      private pure function get_ng(this) result(ng) +

      private pure function get_ng(this) result(ng)

      @@ -1902,7 +2297,7 @@

      Arguments

      @@ -1928,7 +2323,7 @@

      -

      private pure function is_rational(this) result(r) +

      private pure function is_rational(this) result(r)

      @@ -1951,7 +2346,7 @@

      Arguments

      @@ -1982,7 +2377,7 @@

      Subroutines

      -

      private pure subroutine basis(this, res, Xt, Tgc) +

      private pure subroutine basis(this, res, Xt, Tgc)

      @@ -2005,7 +2400,7 @@

      Arguments

      @@ -2035,7 +2430,7 @@

      Arguments

      @@ -2050,7 +2445,7 @@

      Arguments

      @@ -2071,7 +2466,7 @@

      Arguments

      -

      private pure subroutine create(this, res, Xt) +

      private pure subroutine create(this, res, Xt)

      @@ -2094,7 +2489,7 @@

      Arguments

      @@ -2124,7 +2519,7 @@

      Arguments

      @@ -2145,7 +2540,7 @@

      Arguments

      -

      private pure subroutine derivative(this, res, Xt, dTgc) +

      private pure subroutine derivative(this, res, Xt, dTgc)

      @@ -2168,7 +2563,7 @@

      Arguments

      @@ -2198,7 +2593,7 @@

      Arguments

      @@ -2213,7 +2608,7 @@

      Arguments

      @@ -2234,7 +2629,7 @@

      Arguments

      -

      private pure subroutine elevate_degree(this, t) +

      private pure subroutine elevate_degree(this, t)

      @@ -2257,7 +2652,7 @@

      Arguments

      @@ -2272,7 +2667,7 @@

      Arguments

      @@ -2293,7 +2688,7 @@

      Arguments

      -

      private impure subroutine export_Xc(this, filename) +

      private impure subroutine export_Xc(this, filename)

      @@ -2316,7 +2711,7 @@

      Arguments

      @@ -2331,7 +2726,7 @@

      Arguments

      @@ -2352,7 +2747,7 @@

      Arguments

      -

      private impure subroutine export_Xg(this, filename) +

      private impure subroutine export_Xg(this, filename)

      @@ -2375,7 +2770,7 @@

      Arguments

      @@ -2390,7 +2785,7 @@

      Arguments

      @@ -2411,7 +2806,7 @@

      Arguments

      -

      private pure subroutine finalize(this) +

      private pure subroutine finalize(this)

      @@ -2434,7 +2829,7 @@

      Arguments

      @@ -2455,7 +2850,7 @@

      Arguments

      -

      private pure subroutine insert_knots(this, Xth, r) +

      private pure subroutine insert_knots(this, Xth, r)

      @@ -2478,7 +2873,7 @@

      Arguments

      @@ -2493,7 +2888,7 @@

      Arguments

      @@ -2508,7 +2903,7 @@

      Arguments

      @@ -2529,7 +2924,7 @@

      Arguments

      -

      private pure subroutine modify_Wc(this, W, num) +

      private pure subroutine modify_Wc(this, W, num)

      @@ -2552,7 +2947,7 @@

      Arguments

      @@ -2567,7 +2962,7 @@

      Arguments

      @@ -2582,7 +2977,7 @@

      Arguments

      @@ -2603,7 +2998,7 @@

      Arguments

      -

      private pure subroutine modify_Xc(this, X, num, dir) +

      private pure subroutine modify_Xc(this, X, num, dir)

      @@ -2626,7 +3021,7 @@

      Arguments

      @@ -2641,7 +3036,7 @@

      Arguments

      @@ -2656,7 +3051,7 @@

      Arguments

      @@ -2671,7 +3066,7 @@

      Arguments

      @@ -2692,7 +3087,7 @@

      Arguments

      -

      private pure subroutine remove_knots(this, Xth, r) +

      private pure subroutine remove_knots(this, Xth, r)

      @@ -2715,7 +3110,7 @@

      Arguments

      @@ -2730,7 +3125,7 @@

      Arguments

      @@ -2745,7 +3140,7 @@

      Arguments

      @@ -2766,7 +3161,7 @@

      Arguments

      -

      private pure subroutine rotate_Xc(this, alpha, beta, theta) +

      private pure subroutine rotate_Xc(this, alpha, beta, theta)

      @@ -2789,7 +3184,7 @@

      Arguments

      @@ -2804,7 +3199,7 @@

      Arguments

      @@ -2819,7 +3214,7 @@

      Arguments

      @@ -2834,7 +3229,7 @@

      Arguments

      @@ -2855,7 +3250,7 @@

      Arguments

      -

      private pure subroutine rotate_Xg(this, alpha, beta, theta) +

      private pure subroutine rotate_Xg(this, alpha, beta, theta)

      @@ -2878,7 +3273,7 @@

      Arguments

      @@ -2893,7 +3288,7 @@

      Arguments

      @@ -2908,7 +3303,7 @@

      Arguments

      @@ -2923,7 +3318,7 @@

      Arguments

      @@ -2944,7 +3339,7 @@

      Arguments

      -

      private pure subroutine set1(this, knot, Xc, Wc) +

      private pure subroutine set1(this, knot, Xc, Wc)

      @@ -2967,7 +3362,7 @@

      Arguments

      @@ -2982,7 +3377,7 @@

      Arguments

      @@ -2997,7 +3392,7 @@

      Arguments

      @@ -3012,7 +3407,7 @@

      Arguments

      @@ -3033,7 +3428,7 @@

      Arguments

      -

      private pure subroutine set2(this, Xth_dir, degree, continuity, Xc, Wc) +

      private pure subroutine set2(this, Xth_dir, degree, continuity, Xc, Wc)

      @@ -3056,7 +3451,7 @@

      Arguments

      @@ -3086,7 +3481,7 @@

      Arguments

      @@ -3116,7 +3511,7 @@

      Arguments

      @@ -3131,7 +3526,7 @@

      Arguments

      @@ -3152,7 +3547,7 @@

      Arguments

      -

      private pure subroutine set3(this, Xc, Wc) +

      private pure subroutine set3(this, Xc, Wc)

      @@ -3175,7 +3570,7 @@

      Arguments

      @@ -3190,7 +3585,7 @@

      Arguments

      @@ -3205,7 +3600,7 @@

      Arguments

      @@ -3249,7 +3644,7 @@

      Arguments

      @@ -3300,7 +3695,7 @@

      Arguments

      -

      private pure subroutine set_elem(this, elemConn) +

      private pure subroutine set_elem(this, elemConn)

      @@ -3323,7 +3718,7 @@

      Arguments

      @@ -3338,7 +3733,7 @@

      Arguments

      @@ -3359,7 +3754,7 @@

      Arguments

      -

      private pure subroutine set_elem_Xc_vis(this, elemConn) +

      private pure subroutine set_elem_Xc_vis(this, elemConn)

      @@ -3382,7 +3777,7 @@

      Arguments

      @@ -3397,7 +3792,7 @@

      Arguments

      @@ -3418,7 +3813,7 @@

      Arguments

      -

      private pure subroutine set_elem_Xg_vis(this, elemConn) +

      private pure subroutine set_elem_Xg_vis(this, elemConn)

      @@ -3441,7 +3836,7 @@

      Arguments

      @@ -3456,7 +3851,7 @@

      Arguments

      @@ -3477,7 +3872,7 @@

      Arguments

      -

      private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) +

      private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg)

      @@ -3500,7 +3895,7 @@

      Arguments

      @@ -3515,7 +3910,7 @@

      Arguments

      @@ -3530,7 +3925,7 @@

      Arguments

      @@ -3551,7 +3946,7 @@

      Arguments

      -

      private pure subroutine translate_Xc(this, vec) +

      private pure subroutine translate_Xc(this, vec)

      @@ -3574,7 +3969,7 @@

      Arguments

      @@ -3589,7 +3984,7 @@

      Arguments

      @@ -3610,7 +4005,7 @@

      Arguments

      -

      private pure subroutine translate_Xg(this, vec) +

      private pure subroutine translate_Xg(this, vec)

      @@ -3633,7 +4028,7 @@

      Arguments

      @@ -3648,7 +4043,7 @@

      Arguments

      @@ -3691,7 +4086,7 @@

      Arguments

      Documentation generated by FORD - on 2024-04-16T12:26:30.084942

      + on 2024-04-16T18:31:38.142193


      diff --git a/module/forcad_nurbs_surface.html b/module/forcad_nurbs_surface.html index 40394cc52..cb8ad07a8 100644 --- a/module/forcad_nurbs_surface.html +++ b/module/forcad_nurbs_surface.html @@ -78,7 +78,7 @@

      forcad_nurbs_surface
    • 1015 statements + title="26.9% of total for modules and submodules.">1075 statements
    • @@ -138,25 +138,30 @@

      Functions

      @@ -168,29 +173,29 @@

      Subroutines

      @@ -631,7 +636,7 @@

      Components

    • @@ -648,7 +653,7 @@

      Components

      @@ -665,7 +670,7 @@

      Components

      @@ -682,7 +687,7 @@

      Components

      @@ -699,7 +704,7 @@

      Components

      @@ -716,7 +721,7 @@

      Components

      @@ -733,7 +738,7 @@

      Components

      @@ -750,7 +755,7 @@

      Components

      @@ -767,7 +772,7 @@

      Components

      @@ -784,7 +789,7 @@

      Components

      @@ -801,7 +806,7 @@

      Components

      @@ -818,7 +823,7 @@

      Components

      @@ -835,7 +840,7 @@

      Components

      @@ -861,188 +866,188 @@

      Type-Bound Procedures

      - + basis + - + cmp_elem + - + cmp_elem_Xc_vis + - + cmp_elem_Xg_vis + - + create + - + derivative + - + elevate_degree + - + export_Xc + - + export_Xg + - + finalize + - - + + - - + + - - + + - + get_Xt + - + get_continuity + - + get_degree => get_degree_all, get_degree_dir + - + get_elem + - + get_elem_Xc_vis + - + get_elem_Xg_vis + - + get_knot => get_knoti, get_knot_all + - + get_multiplicity + - + get_nc + - + get_ng + - + insert_knots + - + is_rational + - + modify_Wc + - + modify_Xc + - + remove_knots + - + rotate_Xc + - + rotate_Xg + - + set => set1, set2, set3 + - + set1 + - + set2 + - + set3 + - + set_elem + - + set_elem_Xc_vis + - + set_elem_Xg_vis + - + show + - + translate_Xc + - + translate_Xg + + + + + + + + + + + + + + + + + + + + + + + + + - + get_Xgi + - + get_Xgid + - + get_degree_all + - + get_degree_dir + + + + + + + + +
      TypeIntentOptional AttributesName
      + class(nurbs_curve), intent(in)
      - + class(nurbs_curve), intent(in)
      - + class(nurbs_curve), intent(in)
      - + class(nurbs_curve), intent(in)
      - + class(nurbs_curve), intent(in)
      - + class(nurbs_curve), intent(in)
      - + class(nurbs_curve), intent(in)
      - + class(nurbs_curve), intent(in)
      - + integer, intent(in)
      - + class(nurbs_curve), intent(in)
      - + class(nurbs_curve), intent(in)
      - + class(nurbs_curve), intent(in)
      - + class(nurbs_curve), intent(in)
      - + class(nurbs_curve), intent(inout)
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(out),
      - + class(nurbs_curve), intent(inout)
      - + real(kind=rk), intent(in),
      - + class(nurbs_curve), intent(inout)
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(out),
      - + class(nurbs_curve), intent(inout)
      - + integer, intent(in)
      - + class(nurbs_curve), intent(in)
      - + character(len=*), intent(in)
      - + class(nurbs_curve), intent(in)
      - + character(len=*), intent(in)
      - + class(nurbs_curve), intent(inout)
      - + class(nurbs_curve), intent(inout)
      - + real(kind=rk), intent(in),
      - + integer, intent(in),
      - + class(nurbs_curve), intent(inout)
      - + real(kind=rk), intent(in)
      - + integer, intent(in)
      - + class(nurbs_curve), intent(inout)
      - + real(kind=rk), intent(in)
      - + integer, intent(in)
      - + integer, intent(in)
      - + class(nurbs_curve), intent(inout)
      - + real(kind=rk), intent(in),
      - + integer, intent(in),
      - + class(nurbs_curve), intent(inout)
      - + real(kind=rk), intent(in)
      - + real(kind=rk), intent(in)
      - + real(kind=rk), intent(in)
      - + class(nurbs_curve), intent(inout)
      - + real(kind=rk), intent(in)
      - + real(kind=rk), intent(in)
      - + real(kind=rk), intent(in)
      - + class(nurbs_curve), intent(inout)
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(in),
      - + class(nurbs_curve), intent(inout)
      - + integer, intent(in)
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(in),
      - + class(nurbs_curve), intent(inout)
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(in),
      - + class(nurbs_curve), intent(inout)
      - + class(nurbs_curve), intent(inout)
      - + integer, intent(in),
      - + class(nurbs_curve), intent(inout)
      - + integer, intent(in),
      - + class(nurbs_curve), intent(inout)
      - + integer, intent(in),
      - + class(nurbs_curve), intent(inout)
      - + character(len=*), intent(in)
      - + character(len=*), intent(in)
      - + class(nurbs_curve), intent(inout)
      - + real(kind=rk), intent(in)
      - + class(nurbs_curve), intent(inout)
      - + real(kind=rk), intent(in)
      - + real(kind=rk), private,
      - + real(kind=rk), private,
      - + real(kind=rk), private,
      - + real(kind=rk), private,
      - + real(kind=rk), private,
      - + integer, private
      - + integer, private,
      - + integer, private,
      - + integer, private,
      - + real(kind=rk), private,
      - + real(kind=rk), private,
      - + integer, private
      - + integer, private
      procedure, public :: - basis

      Compute the basis functions of the NURBS surface

      Read more…

      Compute the basis functions of the NURBS surface

      Read more…
      procedure, public :: - cmp_elem

      Generate IGA element connectivity

      Read more…

      Generate IGA element connectivity

      Read more…
      procedure, public :: - cmp_elem_Xc_vis

      Generate connectivity for control points

      Read more…

      Generate connectivity for control points

      Read more…
      procedure, public :: - cmp_elem_Xg_vis

      Generate connectivity for geometry points

      Read more…

      Generate connectivity for geometry points

      Read more…
      procedure, public :: - create

      Generate geometry points

      Read more…

      Generate geometry points

      Read more…
      procedure, public :: - derivative

      Compute the derivative of the NURBS surface

      Read more…

      Compute the derivative of the NURBS surface

      Read more…
      procedure, public :: - elevate_degree

      Elevate degree

      Read more…

      Elevate degree

      Read more…
      procedure, public :: - export_Xc

      Export control points to VTK file

      Read more…

      Export control points to VTK file

      Read more…
      procedure, public :: - export_Xg

      Export geometry points to VTK file

      Read more…

      Export geometry points to VTK file

      Read more…
      procedure, public :: - finalize

      Finalize the NURBS surface object

      Read more…

      Finalize the NURBS surface object

      Read more…
      procedure, public :: - get_Wc

      Get weights

      Read more…
      generic, public :: + get_Wc => get_Wc_all, get_Wci

      Get weights

      Read more…
      procedure, public :: - get_Xc

      Get control points

      Read more…
      generic, public :: + get_Xc => get_Xc_all, get_Xci, get_Xcid

      Get control points

      Read more…
      procedure, public :: - get_Xg

      Get geometry points

      Read more…
      generic, public :: + get_Xg => get_Xg_all, get_Xgi, get_Xgid

      Get geometry points

      Read more…
      procedure, public :: - get_Xt

      Get parameter values

      Read more…

      Get parameter values

      Read more…
      procedure, public :: - get_continuity

      Get continuity of the surface

      Read more…

      Get continuity of the surface

      Read more…
      generic, public :: - get_degree => get_degree_all, get_degree_dir

      Get degree of the NURBS surface

      Read more…

      Get degree of the NURBS surface

      Read more…
      procedure, public :: - get_elem

      Get IGA element connectivity

      Read more…

      Get IGA element connectivity

      Read more…
      procedure, public :: - get_elem_Xc_vis

      Get connectivity for control points

      Read more…

      Get connectivity for control points

      Read more…
      procedure, public :: - get_elem_Xg_vis

      Get connectivity for geometry points

      Read more…

      Get connectivity for geometry points

      Read more…
      generic, public :: - get_knot => get_knoti, get_knot_all

      Get knot vector

      Read more…

      Get knot vector

      Read more…
      procedure, public :: - get_multiplicity

      Get multiplicity of the knot vector

      Read more…

      Get multiplicity of the knot vector

      Read more…
      procedure, public :: - get_nc

      Get number of required control points

      Read more…

      Get number of required control points

      Read more…
      procedure, public :: - get_ng

      Get number of geometry points

      Read more…

      Get number of geometry points

      Read more…
      procedure, public :: - insert_knots

      Insert knots into the knot vector

      Read more…

      Insert knots into the knot vector

      Read more…
      procedure, public :: - is_rational

      Check if the NURBS surface is rational

      Read more…

      Check if the NURBS surface is rational

      Read more…
      procedure, public :: - modify_Wc

      Modify weights

      Read more…

      Modify weights

      Read more…
      procedure, public :: - modify_Xc

      Modify control points

      Read more…

      Modify control points

      Read more…
      procedure, public :: - remove_knots

      Remove knots from the knot vector

      Read more…

      Remove knots from the knot vector

      Read more…
      procedure, public :: - rotate_Xc

      Rotate control points

      Read more…

      Rotate control points

      Read more…
      procedure, public :: - rotate_Xg

      Rotate geometry points

      Read more…

      Rotate geometry points

      Read more…
      generic, public :: - set => set1, set2, set3

      Set NURBS surface

      Read more…

      Set NURBS surface

      Read more…
      procedure, public :: - set1

      Set knot vectors, control points and weights for the NURBS surface object

      Read more…

      Set knot vectors, control points and weights for the NURBS surface object

      Read more…
      procedure, public :: - set2

      Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights

      Read more…

      Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights

      Read more…
      procedure, public :: - set3

      Set Bezier or Rational Bezier surface using control points and weights

      Read more…

      Set Bezier or Rational Bezier surface using control points and weights

      Read more…
      procedure, public :: - set_elem

      Set IGA element connectivity

      Read more…

      Set IGA element connectivity

      Read more…
      procedure, public :: - set_elem_Xc_vis

      Set connectivity for control points

      Read more…

      Set connectivity for control points

      Read more…
      procedure, public :: - set_elem_Xg_vis

      Set connectivity for geometry points

      Read more…

      Set connectivity for geometry points

      Read more…
      procedure, public :: @@ -1051,38 +1056,78 @@

      Type-Bound Procedures

      procedure, public :: - show

      Show the NURBS object using PyVista

      Read more…

      Show the NURBS object using PyVista

      Read more…
      procedure, public :: - translate_Xc

      Translate control points

      Read more…

      Translate control points

      Read more…
      procedure, public :: - translate_Xg

      Translate geometry points

      Read more…

      Translate geometry points

      Read more…
      procedure, private :: + get_Wc_all

      Get all weights

      Read more…
      procedure, private :: + get_Wci

      Get i-th weight

      Read more…
      procedure, private :: + get_Xc_all

      Get all control points

      Read more…
      procedure, private :: + get_Xci

      Get i-th control point

      Read more…
      procedure, private :: + get_Xcid

      Get i-th control point in a specific direction

      Read more…
      procedure, private :: + get_Xg_all

      Get all geometry points

      Read more…
      procedure, private :: - get_degree_all

      Get degree of the NURBS surface in both directions

      Read more…

      Get i-th geometry point

      Read more…
      procedure, private :: - get_degree_dir

      Get degree of the NURBS surface in a specific direction

      Read more…

      Get i-th geometry point in a specific direction

      Read more…
      procedure, private :: - get_knot_all

      Get all knot vectors

      Read more…

      Get degree of the NURBS surface in both directions

      Read more…
      procedure, private :: - get_knoti

      Get i-th knot value

      Read more…

      Get degree of the NURBS surface in a specific direction

      Read more…
      procedure, private :: + get_knot_all

      Get all knot vectors

      Read more…
      procedure, private :: + get_knoti

      Get i-th knot value

      Read more…
      @@ -1095,7 +1140,7 @@

      Type-Bound Procedures

      Functions

      -

      private pure function cmp_elem(this) result(elemConn) +

      private pure function cmp_elem(this) result(elemConn)

      @@ -1118,7 +1163,7 @@

      Arguments

      - + class(nurbs_surface), intent(in) @@ -1144,7 +1189,7 @@

      -

      private pure function cmp_elem_Xc_vis(this, p) result(elemConn) +

      private pure function cmp_elem_Xc_vis(this, p) result(elemConn)

      @@ -1167,7 +1212,7 @@

      Arguments

      - + class(nurbs_surface), intent(in) @@ -1182,7 +1227,7 @@

      Arguments

      - + integer, intent(in), @@ -1208,7 +1253,7 @@

      -

      private pure function cmp_elem_Xg_vis(this, p) result(elemConn) +

      private pure function cmp_elem_Xg_vis(this, p) result(elemConn)

      @@ -1231,7 +1276,7 @@

      Arguments

      - + class(nurbs_surface), intent(in) @@ -1246,7 +1291,7 @@

      Arguments

      - + integer, intent(in), @@ -1272,7 +1317,7 @@

      -

      private pure function get_Wc(this) result(Wc) +

      private pure function get_Wc_all(this) result(Wc)

      @@ -1295,7 +1340,7 @@

      Arguments

      - + class(nurbs_surface), intent(in) @@ -1321,7 +1366,7 @@

      -

      private pure function get_Xc(this) result(Xc) +

      private pure function get_Wci(this, n) result(Wc)

      @@ -1344,7 +1389,71 @@

      Arguments

      - + + class(nurbs_surface), + +intent(in) + + + + :: + this + + + + + + + + integer, + +intent(in) + + + + :: + n + + + + + + + +

      + Return Value + real(kind=rk) +

      + + +
      +

      + +
      +

      private pure function get_Xc_all(this) result(Xc) +

      +
      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + +

      Arguments

      + + + + + + + + + + + + @@ -1370,7 +1479,150 @@

      -

      private pure function get_Xg(this) result(Xg) +

      private pure function get_Xci(this, n) result(Xc) +

      +
      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + +

      Arguments

      +

      TypeIntentOptional AttributesName
      + class(nurbs_surface), intent(in)
      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_surface), + intent(in) + + ::this + +
      + + integer, + intent(in) + + ::n + +
      + +

      + Return Value + real(kind=rk), allocatable, (:) +

      + + +
      +
      + +
      +

      private pure function get_Xcid(this, n, dir) result(Xc) +

      +
      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_surface), + intent(in) + + ::this + +
      + + integer, + intent(in) + + ::n + +
      + + integer, + intent(in) + + ::dir + +
      + +

      + Return Value + real(kind=rk) +

      + + +
      +
      + +
      +

      private pure function get_Xg_all(this) result(Xg)

      @@ -1393,7 +1645,7 @@

      Arguments

      - + class(nurbs_surface), intent(in) @@ -1419,7 +1671,7 @@

      -

      private pure function get_Xt(this, dir) result(Xt) +

      private pure function get_Xgi(this, n) result(Xg)

      @@ -1442,7 +1694,7 @@

      Arguments

      - + class(nurbs_surface), intent(in) @@ -1457,7 +1709,150 @@

      Arguments

      - + + integer, + +intent(in) + + + + :: + n + + + + + + + +

      + Return Value + real(kind=rk), allocatable, (:) +

      + + +
      +

      + +
      +

      private pure function get_Xgid(this, n, dir) result(Xg) +

      +
      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_surface), + intent(in) + + ::this + +
      + + integer, + intent(in) + + ::n + +
      + + integer, + intent(in) + + ::dir + +
      + +

      + Return Value + real(kind=rk) +

      + + +
      +
      + +
      +

      private pure function get_Xt(this, dir) result(Xt) +

      +
      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + @@ -1483,7 +1878,7 @@

      -

      private pure function get_continuity(this, dir) result(c) +

      private pure function get_continuity(this, dir) result(c)

      @@ -1506,7 +1901,7 @@

      Arguments

      @@ -1521,7 +1916,7 @@

      Arguments

      @@ -1547,7 +1942,7 @@

      -

      private pure function get_degree_all(this) result(degree) +

      private pure function get_degree_all(this) result(degree)

      @@ -1570,7 +1965,7 @@

      Arguments

      @@ -1596,7 +1991,7 @@

      -

      private pure function get_degree_dir(this, dir) result(degree) +

      private pure function get_degree_dir(this, dir) result(degree)

      @@ -1619,7 +2014,7 @@

      Arguments

      @@ -1634,7 +2029,7 @@

      Arguments

      @@ -1660,7 +2055,7 @@

      -

      private pure function get_elem(this) result(elemConn) +

      private pure function get_elem(this) result(elemConn)

      @@ -1683,7 +2078,7 @@

      Arguments

      @@ -1709,7 +2104,7 @@

      -

      private pure function get_elem_Xc_vis(this) result(elemConn) +

      private pure function get_elem_Xc_vis(this) result(elemConn)

      @@ -1732,7 +2127,7 @@

      Arguments

      @@ -1758,7 +2153,7 @@

      -

      private pure function get_elem_Xg_vis(this) result(elemConn) +

      private pure function get_elem_Xg_vis(this) result(elemConn)

      @@ -1781,7 +2176,7 @@

      Arguments

      @@ -1807,7 +2202,7 @@

      -

      private pure function get_knot_all(this, dir) result(knot) +

      private pure function get_knot_all(this, dir) result(knot)

      @@ -1830,7 +2225,7 @@

      Arguments

      @@ -1845,7 +2240,7 @@

      Arguments

      @@ -1871,7 +2266,7 @@

      -

      private pure function get_knoti(this, dir, i) result(knot) +

      private pure function get_knoti(this, dir, i) result(knot)

      @@ -1894,7 +2289,7 @@

      Arguments

      @@ -1909,7 +2304,7 @@

      Arguments

      @@ -1924,7 +2319,7 @@

      Arguments

      @@ -1950,7 +2345,7 @@

      -

      private pure function get_multiplicity(this, dir) result(m) +

      private pure function get_multiplicity(this, dir) result(m)

      @@ -1973,7 +2368,7 @@

      Arguments

      @@ -1988,7 +2383,7 @@

      Arguments

      @@ -2014,7 +2409,7 @@

      -

      private pure function get_nc(this, dir) result(nc) +

      private pure function get_nc(this, dir) result(nc)

      @@ -2037,7 +2432,7 @@

      Arguments

      @@ -2052,7 +2447,7 @@

      Arguments

      @@ -2078,7 +2473,7 @@

      -

      private pure function get_ng(this) result(ng) +

      private pure function get_ng(this) result(ng)

      @@ -2101,7 +2496,7 @@

      Arguments

      @@ -2127,7 +2522,7 @@

      -

      private pure function is_rational(this) result(r) +

      private pure function is_rational(this) result(r)

      @@ -2150,7 +2545,7 @@

      Arguments

      @@ -2181,7 +2576,7 @@

      Subroutines

      -

      private pure subroutine basis(this, res1, res2, Xt1, Xt2, Tgc) +

      private pure subroutine basis(this, res1, res2, Xt1, Xt2, Tgc)

      @@ -2204,7 +2599,7 @@

      Arguments

      @@ -2219,7 +2614,7 @@

      Arguments

      @@ -2234,7 +2629,7 @@

      Arguments

      @@ -2249,7 +2644,7 @@

      Arguments

      @@ -2264,7 +2659,7 @@

      Arguments

      @@ -2279,7 +2674,7 @@

      Arguments

      @@ -2300,7 +2695,7 @@

      Arguments

      -

      private pure subroutine create(this, res1, res2, Xt1, Xt2, Xt) +

      private pure subroutine create(this, res1, res2, Xt1, Xt2, Xt)

      @@ -2323,7 +2718,7 @@

      Arguments

      @@ -2338,7 +2733,7 @@

      Arguments

      @@ -2353,7 +2748,7 @@

      Arguments

      @@ -2368,7 +2763,7 @@

      Arguments

      @@ -2383,7 +2778,7 @@

      Arguments

      @@ -2398,7 +2793,7 @@

      Arguments

      @@ -2419,7 +2814,7 @@

      Arguments

      -

      private pure subroutine derivative(this, res1, res2, Xt1, Xt2, dTgc) +

      private pure subroutine derivative(this, res1, res2, Xt1, Xt2, dTgc)

      @@ -2442,7 +2837,7 @@

      Arguments

      @@ -2457,7 +2852,7 @@

      Arguments

      @@ -2472,7 +2867,7 @@

      Arguments

      @@ -2487,7 +2882,7 @@

      Arguments

      @@ -2502,7 +2897,7 @@

      Arguments

      @@ -2517,7 +2912,7 @@

      Arguments

      @@ -2538,7 +2933,7 @@

      Arguments

      -

      private pure subroutine elevate_degree(this, dir, t) +

      private pure subroutine elevate_degree(this, dir, t)

      @@ -2561,7 +2956,7 @@

      Arguments

      @@ -2576,7 +2971,7 @@

      Arguments

      @@ -2591,7 +2986,7 @@

      Arguments

      @@ -2612,7 +3007,7 @@

      Arguments

      -

      private impure subroutine export_Xc(this, filename) +

      private impure subroutine export_Xc(this, filename)

      @@ -2635,7 +3030,7 @@

      Arguments

      @@ -2650,7 +3045,7 @@

      Arguments

      @@ -2671,7 +3066,7 @@

      Arguments

      -

      private impure subroutine export_Xg(this, filename) +

      private impure subroutine export_Xg(this, filename)

      @@ -2694,7 +3089,7 @@

      Arguments

      @@ -2709,7 +3104,7 @@

      Arguments

      @@ -2730,7 +3125,7 @@

      Arguments

      -

      private pure subroutine finalize(this) +

      private pure subroutine finalize(this)

      @@ -2753,7 +3148,7 @@

      Arguments

      @@ -2774,7 +3169,7 @@

      Arguments

      -

      private pure subroutine insert_knots(this, dir, Xth, r) +

      private pure subroutine insert_knots(this, dir, Xth, r)

      @@ -2797,7 +3192,7 @@

      Arguments

      @@ -2812,7 +3207,7 @@

      Arguments

      @@ -2827,7 +3222,7 @@

      Arguments

      @@ -2842,7 +3237,7 @@

      Arguments

      @@ -2863,7 +3258,7 @@

      Arguments

      -

      private pure subroutine modify_Wc(this, W, num) +

      private pure subroutine modify_Wc(this, W, num)

      @@ -2886,7 +3281,7 @@

      Arguments

      @@ -2901,7 +3296,7 @@

      Arguments

      @@ -2916,7 +3311,7 @@

      Arguments

      @@ -2937,7 +3332,7 @@

      Arguments

      -

      private pure subroutine modify_Xc(this, X, num, dir) +

      private pure subroutine modify_Xc(this, X, num, dir)

      @@ -2960,7 +3355,7 @@

      Arguments

      @@ -2975,7 +3370,7 @@

      Arguments

      @@ -2990,7 +3385,7 @@

      Arguments

      @@ -3005,7 +3400,7 @@

      Arguments

      @@ -3026,7 +3421,7 @@

      Arguments

      -

      private pure subroutine remove_knots(this, dir, Xth, r) +

      private pure subroutine remove_knots(this, dir, Xth, r)

      @@ -3049,7 +3444,7 @@

      Arguments

      @@ -3064,7 +3459,7 @@

      Arguments

      @@ -3079,7 +3474,7 @@

      Arguments

      @@ -3094,7 +3489,7 @@

      Arguments

      @@ -3115,7 +3510,7 @@

      Arguments

      -

      private pure subroutine rotate_Xc(this, alpha, beta, theta) +

      private pure subroutine rotate_Xc(this, alpha, beta, theta)

      @@ -3138,7 +3533,7 @@

      Arguments

      @@ -3153,7 +3548,7 @@

      Arguments

      @@ -3168,7 +3563,7 @@

      Arguments

      @@ -3183,7 +3578,7 @@

      Arguments

      @@ -3204,7 +3599,7 @@

      Arguments

      -

      private pure subroutine rotate_Xg(this, alpha, beta, theta) +

      private pure subroutine rotate_Xg(this, alpha, beta, theta)

      @@ -3227,7 +3622,7 @@

      Arguments

      @@ -3242,7 +3637,7 @@

      Arguments

      @@ -3257,7 +3652,7 @@

      Arguments

      @@ -3272,7 +3667,7 @@

      Arguments

      @@ -3293,7 +3688,7 @@

      Arguments

      -

      private pure subroutine set1(this, knot1, knot2, Xc, Wc) +

      private pure subroutine set1(this, knot1, knot2, Xc, Wc)

      @@ -3316,7 +3711,7 @@

      Arguments

      @@ -3331,7 +3726,7 @@

      Arguments

      @@ -3346,7 +3741,7 @@

      Arguments

      @@ -3361,7 +3756,7 @@

      Arguments

      @@ -3376,7 +3771,7 @@

      Arguments

      @@ -3397,7 +3792,7 @@

      Arguments

      -

      private pure subroutine set2(this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc) +

      private pure subroutine set2(this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc)

      @@ -3420,7 +3815,7 @@

      Arguments

      @@ -3435,7 +3830,7 @@

      Arguments

      @@ -3450,7 +3845,7 @@

      Arguments

      @@ -3465,7 +3860,7 @@

      Arguments

      @@ -3480,7 +3875,7 @@

      Arguments

      @@ -3495,7 +3890,7 @@

      Arguments

      @@ -3510,7 +3905,7 @@

      Arguments

      @@ -3525,7 +3920,7 @@

      Arguments

      @@ -3546,7 +3941,7 @@

      Arguments

      -

      private pure subroutine set3(this, nc, Xc, Wc) +

      private pure subroutine set3(this, nc, Xc, Wc)

      @@ -3569,7 +3964,7 @@

      Arguments

      @@ -3584,7 +3979,7 @@

      Arguments

      @@ -3599,7 +3994,7 @@

      Arguments

      @@ -3614,7 +4009,7 @@

      Arguments

      @@ -3635,7 +4030,7 @@

      Arguments

      -

      private pure subroutine set_elem(this, elemConn) +

      private pure subroutine set_elem(this, elemConn)

      @@ -3658,7 +4053,7 @@

      Arguments

      @@ -3673,7 +4068,7 @@

      Arguments

      @@ -3694,7 +4089,7 @@

      Arguments

      -

      private pure subroutine set_elem_Xc_vis(this, elemConn) +

      private pure subroutine set_elem_Xc_vis(this, elemConn)

      @@ -3717,7 +4112,7 @@

      Arguments

      @@ -3732,7 +4127,7 @@

      Arguments

      @@ -3753,7 +4148,7 @@

      Arguments

      -

      private pure subroutine set_elem_Xg_vis(this, elemConn) +

      private pure subroutine set_elem_Xg_vis(this, elemConn)

      @@ -3776,7 +4171,7 @@

      Arguments

      @@ -3791,7 +4186,7 @@

      Arguments

      @@ -3835,7 +4230,7 @@

      Arguments

      @@ -3850,7 +4245,7 @@

      Arguments

      @@ -3865,7 +4260,7 @@

      Arguments

      @@ -3880,7 +4275,7 @@

      Arguments

      @@ -3901,7 +4296,7 @@

      Arguments

      -

      private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) +

      private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg)

      @@ -3924,7 +4319,7 @@

      Arguments

      @@ -3939,7 +4334,7 @@

      Arguments

      @@ -3954,7 +4349,7 @@

      Arguments

      @@ -3975,7 +4370,7 @@

      Arguments

      -

      private pure subroutine translate_Xc(this, vec) +

      private pure subroutine translate_Xc(this, vec)

      @@ -3998,7 +4393,7 @@

      Arguments

      @@ -4013,7 +4408,7 @@

      Arguments

      @@ -4034,7 +4429,7 @@

      Arguments

      -

      private pure subroutine translate_Xg(this, vec) +

      private pure subroutine translate_Xg(this, vec)

      @@ -4057,7 +4452,7 @@

      Arguments

      @@ -4072,7 +4467,7 @@

      Arguments

      @@ -4115,7 +4510,7 @@

      Arguments

      Documentation generated by FORD - on 2024-04-16T12:26:30.084942

      + on 2024-04-16T18:31:38.142193


      diff --git a/module/forcad_nurbs_volume.html b/module/forcad_nurbs_volume.html index 05ebd4675..5f9521558 100644 --- a/module/forcad_nurbs_volume.html +++ b/module/forcad_nurbs_volume.html @@ -78,7 +78,7 @@

      forcad_nurbs_volume
    • 1324 statements + title="34.7% of total for modules and submodules.">1384 statements
    • @@ -138,25 +138,30 @@

      Functions

      @@ -168,30 +173,30 @@

      Subroutines

      @@ -632,7 +637,7 @@

      Components

    • @@ -649,7 +654,7 @@

      Components

      @@ -666,7 +671,7 @@

      Components

      @@ -683,7 +688,7 @@

      Components

      @@ -700,7 +705,7 @@

      Components

      @@ -734,7 +739,7 @@

      Components

      @@ -751,7 +756,7 @@

      Components

      @@ -768,7 +773,7 @@

      Components

      @@ -785,7 +790,7 @@

      Components

      @@ -802,7 +807,7 @@

      Components

      @@ -819,7 +824,7 @@

      Components

      @@ -836,7 +841,7 @@

      Components

      @@ -853,7 +858,7 @@

      Components

      @@ -870,7 +875,7 @@

      Components

      @@ -896,138 +901,138 @@

      Type-Bound Procedures

      - + basis + - + cmp_elem + - + cmp_elem_Xc_vis + - + cmp_elem_Xg_vis + - + create + - + derivative + - + elevate_degree + - + export_Xc + - + export_Xg + - + finalize + - - + + - - + + - - + + - + get_Xt + - + get_continuity + - + get_degree => get_degree_all, get_degree_dir + - + get_elem + - + get_elem_Xc_vis + - + get_elem_Xg_vis + - + get_knot => get_knoti, get_knot_all + - + get_multiplicity + - + get_nc + - + get_ng + - + insert_knots + - + is_rational + - + modify_Wc + - + modify_Xc + - + remove_knots + - + rotate_Xc + - + rotate_Xg + - + set => set1, set2, set3 + - + set1 + - + set2 + - + set3 + - + set_elem + - + set_elem_Xc_vis + - + set_elem_Xg_vis + - + show + - + translate_Xc + - + translate_Xg + + + + + - + get_Wci + - + get_Xc_all + - + get_Xci + - + get_Xcid + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_surface), + intent(in) + + ::this + +
      + integer, intent(in)
      - + class(nurbs_surface), intent(in)
      - + integer, intent(in)
      - + class(nurbs_surface), intent(in)
      - + class(nurbs_surface), intent(in)
      - + integer, intent(in)
      - + class(nurbs_surface), intent(in)
      - + class(nurbs_surface), intent(in)
      - + class(nurbs_surface), intent(in)
      - + class(nurbs_surface), intent(in)
      - + integer, intent(in)
      - + class(nurbs_surface), intent(in)
      - + integer, intent(in)
      - + integer, intent(in)
      - + class(nurbs_surface), intent(in)
      - + integer, intent(in)
      - + class(nurbs_surface), intent(in)
      - + integer, intent(in)
      - + class(nurbs_surface), intent(in)
      - + class(nurbs_surface), intent(in)
      - + class(nurbs_surface), intent(inout)
      - + integer, intent(in),
      - + integer, intent(in),
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(out),
      - + class(nurbs_surface), intent(inout)
      - + integer, intent(in),
      - + integer, intent(in),
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(in),
      - + class(nurbs_surface), intent(inout)
      - + integer, intent(in),
      - + integer, intent(in),
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(out),
      - + class(nurbs_surface), intent(inout)
      - + integer, intent(in)
      - + integer, intent(in)
      - + class(nurbs_surface), intent(in)
      - + character(len=*), intent(in)
      - + class(nurbs_surface), intent(in)
      - + character(len=*), intent(in)
      - + class(nurbs_surface), intent(inout)
      - + class(nurbs_surface), intent(inout)
      - + integer, intent(in)
      - + real(kind=rk), intent(in),
      - + integer, intent(in),
      - + class(nurbs_surface), intent(inout)
      - + real(kind=rk), intent(in)
      - + integer, intent(in)
      - + class(nurbs_surface), intent(inout)
      - + real(kind=rk), intent(in)
      - + integer, intent(in)
      - + integer, intent(in)
      - + class(nurbs_surface), intent(inout)
      - + integer, intent(in)
      - + real(kind=rk), intent(in),
      - + integer, intent(in),
      - + class(nurbs_surface), intent(inout)
      - + real(kind=rk), intent(in)
      - + real(kind=rk), intent(in)
      - + real(kind=rk), intent(in)
      - + class(nurbs_surface), intent(inout)
      - + real(kind=rk), intent(in)
      - + real(kind=rk), intent(in)
      - + real(kind=rk), intent(in)
      - + class(nurbs_surface), intent(inout)
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(in),
      - + class(nurbs_surface), intent(inout)
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(in),
      - + integer, intent(in),
      - + integer, intent(in),
      - + integer, intent(in),
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(in),
      - + class(nurbs_surface), intent(inout)
      - + integer, intent(in),
      - + real(kind=rk), intent(in),
      - + real(kind=rk), intent(in),
      - + class(nurbs_surface), intent(inout)
      - + integer, intent(in),
      - + class(nurbs_surface), intent(inout)
      - + integer, intent(in),
      - + class(nurbs_surface), intent(inout)
      - + integer, intent(in),
      - + class(nurbs_surface), intent(inout)
      - + real(kind=rk), intent(in)
      - + integer, intent(in)
      - + real(kind=rk), intent(in),
      - + class(nurbs_surface), intent(inout)
      - + character(len=*), intent(in)
      - + character(len=*), intent(in)
      - + class(nurbs_surface), intent(inout)
      - + real(kind=rk), intent(in)
      - + class(nurbs_surface), intent(inout)
      - + real(kind=rk), intent(in)
      - + real(kind=rk), private,
      - + real(kind=rk), private,
      - + real(kind=rk), private,
      - + real(kind=rk), private,
      - + real(kind=rk), private,
      - + integer, private
      - + integer, private,
      - + integer, private,
      - + integer, private,
      - + real(kind=rk), private,
      - + real(kind=rk), private,
      - + real(kind=rk), private,
      - + integer, private
      - + integer, private
      procedure, public :: - basis

      Compute the basis functions of the NURBS volume

      Read more…

      Compute the basis functions of the NURBS volume

      Read more…
      procedure, public :: - cmp_elem

      Generate IGA element connectivity

      Read more…

      Generate IGA element connectivity

      Read more…
      procedure, public :: - cmp_elem_Xc_vis

      Generate connectivity for control points

      Read more…

      Generate connectivity for control points

      Read more…
      procedure, public :: - cmp_elem_Xg_vis

      Generate connectivity for geometry points

      Read more…

      Generate connectivity for geometry points

      Read more…
      procedure, public :: - create

      Generate geometry points

      Read more…

      Generate geometry points

      Read more…
      procedure, public :: - derivative

      Compute the derivative of the NURBS volume

      Read more…

      Compute the derivative of the NURBS volume

      Read more…
      procedure, public :: - elevate_degree

      Elevate the degree of the NURBS volume

      Read more…

      Elevate the degree of the NURBS volume

      Read more…
      procedure, public :: - export_Xc

      Export control points to VTK file

      Read more…

      Export control points to VTK file

      Read more…
      procedure, public :: - export_Xg

      Export geometry points to VTK file

      Read more…

      Export geometry points to VTK file

      Read more…
      procedure, public :: - finalize

      Finalize the NURBS volume object

      Read more…

      Finalize the NURBS volume object

      Read more…
      procedure, public :: - get_Wc

      Get weights

      Read more…
      generic, public :: + get_Wc => get_Wc_all, get_Wci

      Get weights

      Read more…
      procedure, public :: - get_Xc

      Get control points

      Read more…
      generic, public :: + get_Xc => get_Xc_all, get_Xci, get_Xcid

      Get control points

      Read more…
      procedure, public :: - get_Xg

      Get geometry points

      Read more…
      generic, public :: + get_Xg => get_Xg_all, get_Xgi, get_Xgid

      Get geometry points

      Read more…
      procedure, public :: - get_Xt

      Get parameter values

      Read more…

      Get parameter values

      Read more…
      procedure, public :: - get_continuity

      Get continuity of the volume

      Read more…

      Get continuity of the volume

      Read more…
      generic, public :: - get_degree => get_degree_all, get_degree_dir

      Get degree of the NURBS volume

      Read more…

      Get degree of the NURBS volume

      Read more…
      procedure, public :: - get_elem

      Get IGA element connectivity

      Read more…

      Get IGA element connectivity

      Read more…
      procedure, public :: - get_elem_Xc_vis

      Get connectivity for control points

      Read more…

      Get connectivity for control points

      Read more…
      procedure, public :: - get_elem_Xg_vis

      Get connectivity for geometry points

      Read more…

      Get connectivity for geometry points

      Read more…
      generic, public :: - get_knot => get_knoti, get_knot_all

      Get knot vector

      Read more…

      Get knot vector

      Read more…
      procedure, public :: - get_multiplicity

      Get multiplicity of the knot vector

      Read more…

      Get multiplicity of the knot vector

      Read more…
      procedure, public :: - get_nc

      Get number of required control points

      Read more…

      Get number of required control points

      Read more…
      procedure, public :: - get_ng

      Get number of geometry points

      Read more…

      Get number of geometry points

      Read more…
      procedure, public :: - insert_knots

      Insert knots into the knot vector

      Read more…

      Insert knots into the knot vector

      Read more…
      procedure, public :: - is_rational

      Check if the NURBS volume is rational

      Read more…

      Check if the NURBS volume is rational

      Read more…
      procedure, public :: - modify_Wc

      Modify weights

      Read more…

      Modify weights

      Read more…
      procedure, public :: - modify_Xc

      Modify control points

      Read more…

      Modify control points

      Read more…
      procedure, public :: @@ -1036,53 +1041,53 @@

      Type-Bound Procedures

      procedure, public :: - remove_knots

      Remove knots from the knot vector

      Read more…

      Remove knots from the knot vector

      Read more…
      procedure, public :: - rotate_Xc

      Rotate control points

      Read more…

      Rotate control points

      Read more…
      procedure, public :: - rotate_Xg

      Rotate geometry points

      Read more…

      Rotate geometry points

      Read more…
      generic, public :: - set => set1, set2, set3

      Set NURBS volume

      Read more…

      Set NURBS volume

      Read more…
      procedure, public :: - set1

      Set knot vectors, control points and weights for the NURBS volume object

      Read more…

      Set knot vectors, control points and weights for the NURBS volume object

      Read more…
      procedure, public :: - set2

      Set NURBS volume using nodes of parameter space, degree, continuity, control points and weights

      Read more…

      Set NURBS volume using nodes of parameter space, degree, continuity, control points and weights

      Read more…
      procedure, public :: - set3

      Set Bezier or Rational Bezier volume using control points and weights

      Read more…

      Set Bezier or Rational Bezier volume using control points and weights

      Read more…
      procedure, public :: - set_elem

      Set IGA element connectivity

      Read more…

      Set IGA element connectivity

      Read more…
      procedure, public :: - set_elem_Xc_vis

      Set connectivity for control points

      Read more…

      Set connectivity for control points

      Read more…
      procedure, public :: - set_elem_Xg_vis

      Set connectivity for geometry points

      Read more…

      Set connectivity for geometry points

      Read more…
      procedure, public :: @@ -1091,38 +1096,78 @@

      Type-Bound Procedures

      procedure, public :: - show

      Show the NURBS object using PyVista

      Read more…

      Show the NURBS object using PyVista

      Read more…
      procedure, public :: - translate_Xc

      Translate control points

      Read more…

      Translate control points

      Read more…
      procedure, public :: - translate_Xg

      Translate geometry points

      Read more…

      Translate geometry points

      Read more…
      procedure, private :: + get_Wc_all

      Get all weights

      Read more…
      procedure, private :: - get_degree_all

      Get degree of the NURBS volume in all directions

      Read more…

      Get i-th weight

      Read more…
      procedure, private :: - get_degree_dir

      Get degree of the NURBS volume in a specific direction

      Read more…

      Get all control points

      Read more…
      procedure, private :: - get_knot_all

      Get all knot vectors

      Read more…

      Get i-th control point

      Read more…
      procedure, private :: - get_knoti

      Get i-th knot value

      Read more…

      Get i-th control point in a specific direction

      Read more…
      procedure, private :: + get_Xg_all

      Get all geometry points

      Read more…
      procedure, private :: + get_Xgi

      Get i-th geometry point

      Read more…
      procedure, private :: + get_Xgid

      Get i-th geometry point in a specific direction

      Read more…
      procedure, private :: + get_degree_all

      Get degree of the NURBS volume in all directions

      Read more…
      procedure, private :: + get_degree_dir

      Get degree of the NURBS volume in a specific direction

      Read more…
      procedure, private :: + get_knot_all

      Get all knot vectors

      Read more…
      procedure, private :: + get_knoti

      Get i-th knot value

      Read more…
      @@ -1135,7 +1180,7 @@

      Type-Bound Procedures

      Functions

      -

      private pure function cmp_elem(this) result(elemConn) +

      private pure function cmp_elem(this) result(elemConn)

      @@ -1158,7 +1203,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -1184,7 +1229,7 @@

      -

      private pure function cmp_elem_Xc_vis(this, p) result(elemConn) +

      private pure function cmp_elem_Xc_vis(this, p) result(elemConn)

      @@ -1207,7 +1252,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -1222,7 +1267,7 @@

      Arguments

      - + integer, intent(in), @@ -1248,7 +1293,7 @@

      -

      private pure function cmp_elem_Xg_vis(this, p) result(elemConn) +

      private pure function cmp_elem_Xg_vis(this, p) result(elemConn)

      @@ -1271,7 +1316,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -1286,7 +1331,7 @@

      Arguments

      - + integer, intent(in), @@ -1312,7 +1357,7 @@

      -

      private pure function get_Wc(this) result(Wc) +

      private pure function get_Wc_all(this) result(Wc)

      @@ -1335,7 +1380,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -1361,7 +1406,71 @@

      -

      private pure function get_Xc(this) result(Xc) +

      private pure function get_Wci(this, n) result(Wc) +

      +
      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(in) + + ::this + +
      + + integer, + intent(in) + + ::n + +
      + +

      + Return Value + real(kind=rk) +

      + + +
      +

      + +
      +

      private pure function get_Xc_all(this) result(Xc)

      @@ -1384,7 +1493,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -1410,7 +1519,150 @@

      -

      private pure function get_Xg(this) result(Xg) +

      private pure function get_Xci(this, n) result(Xc) +

      +
      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(in) + + ::this + +
      + + integer, + intent(in) + + ::n + +
      + +

      + Return Value + real(kind=rk), allocatable, (:) +

      + + +
      +

      + +
      +

      private pure function get_Xcid(this, n, dir) result(Xc) +

      +
      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(in) + + ::this + +
      + + integer, + intent(in) + + ::n + +
      + + integer, + intent(in) + + ::dir + +
      + +

      + Return Value + real(kind=rk) +

      + + +
      +
      + +
      +

      private pure function get_Xg_all(this) result(Xg)

      @@ -1433,7 +1685,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -1459,7 +1711,150 @@

      -

      private pure function get_Xt(this, dir) result(Xt) +

      private pure function get_Xgi(this, n) result(Xg) +

      +
      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(in) + + ::this + +
      + + integer, + intent(in) + + ::n + +
      + +

      + Return Value + real(kind=rk), allocatable, (:) +

      + + +
      +

      + +
      +

      private pure function get_Xgid(this, n, dir) result(Xg) +

      +
      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(in) + + ::this + +
      + + integer, + intent(in) + + ::n + +
      + + integer, + intent(in) + + ::dir + +
      + +

      + Return Value + real(kind=rk) +

      + + +
      +
      + +
      +

      private pure function get_Xt(this, dir) result(Xt)

      @@ -1482,7 +1877,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -1497,7 +1892,7 @@

      Arguments

      - + integer, intent(in) @@ -1523,7 +1918,7 @@

      -

      private pure function get_continuity(this, dir) result(c) +

      private pure function get_continuity(this, dir) result(c)

      @@ -1546,7 +1941,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -1561,7 +1956,7 @@

      Arguments

      - + integer, intent(in) @@ -1587,7 +1982,7 @@

      -

      private pure function get_degree_all(this) result(degree) +

      private pure function get_degree_all(this) result(degree)

      @@ -1610,7 +2005,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -1636,7 +2031,7 @@

      -

      private pure function get_degree_dir(this, dir) result(degree) +

      private pure function get_degree_dir(this, dir) result(degree)

      @@ -1659,7 +2054,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -1674,7 +2069,7 @@

      Arguments

      - + integer, intent(in) @@ -1700,7 +2095,7 @@

      -

      private pure function get_elem(this) result(elemConn) +

      private pure function get_elem(this) result(elemConn)

      @@ -1723,7 +2118,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -1749,7 +2144,7 @@

      -

      private pure function get_elem_Xc_vis(this) result(elemConn) +

      private pure function get_elem_Xc_vis(this) result(elemConn)

      @@ -1772,7 +2167,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -1798,7 +2193,7 @@

      -

      private pure function get_elem_Xg_vis(this) result(elemConn) +

      private pure function get_elem_Xg_vis(this) result(elemConn)

      @@ -1821,7 +2216,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -1847,7 +2242,7 @@

      -

      private pure function get_knot_all(this, dir) result(knot) +

      private pure function get_knot_all(this, dir) result(knot)

      @@ -1870,7 +2265,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -1885,7 +2280,7 @@

      Arguments

      - + integer, intent(in) @@ -1911,7 +2306,7 @@

      -

      private pure function get_knoti(this, dir, i) result(knot) +

      private pure function get_knoti(this, dir, i) result(knot)

      @@ -1934,7 +2329,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -1949,7 +2344,7 @@

      Arguments

      - + integer, intent(in) @@ -1964,7 +2359,7 @@

      Arguments

      - + integer, intent(in) @@ -1990,7 +2385,7 @@

      -

      private pure function get_multiplicity(this, dir) result(m) +

      private pure function get_multiplicity(this, dir) result(m)

      @@ -2013,7 +2408,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -2028,7 +2423,7 @@

      Arguments

      - + integer, intent(in) @@ -2054,7 +2449,7 @@

      -

      private pure function get_nc(this, dir) result(nc) +

      private pure function get_nc(this, dir) result(nc)

      @@ -2077,7 +2472,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -2092,7 +2487,7 @@

      Arguments

      - + integer, intent(in) @@ -2118,7 +2513,7 @@

      -

      private pure function get_ng(this) result(ng) +

      private pure function get_ng(this) result(ng)

      @@ -2141,7 +2536,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -2167,7 +2562,7 @@

      -

      private pure function is_rational(this) result(r) +

      private pure function is_rational(this) result(r)

      @@ -2190,7 +2585,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -2221,7 +2616,7 @@

      Subroutines

      -

      private pure subroutine basis(this, res1, res2, res3, Xt1, Xt2, Xt3, Tgc) +

      private pure subroutine basis(this, res1, res2, res3, Xt1, Xt2, Xt3, Tgc)

      @@ -2244,7 +2639,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -2259,7 +2654,7 @@

      Arguments

      - + integer, intent(in), @@ -2274,7 +2669,7 @@

      Arguments

      - + integer, intent(in), @@ -2304,7 +2699,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -2319,7 +2714,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -2349,7 +2744,7 @@

      Arguments

      - + real(kind=rk), intent(out), @@ -2370,7 +2765,7 @@

      Arguments

      -

      private pure subroutine create(this, res1, res2, res3, Xt1, Xt2, Xt3, Xt) +

      private pure subroutine create(this, res1, res2, res3, Xt1, Xt2, Xt3, Xt)

      @@ -2393,7 +2788,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -2408,7 +2803,7 @@

      Arguments

      - + integer, intent(in), @@ -2423,7 +2818,7 @@

      Arguments

      - + integer, intent(in), @@ -2453,7 +2848,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -2468,7 +2863,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -2498,7 +2893,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -2519,7 +2914,7 @@

      Arguments

      -

      private pure subroutine derivative(this, res1, res2, res3, Xt1, Xt2, Xt3, dTgc) +

      private pure subroutine derivative(this, res1, res2, res3, Xt1, Xt2, Xt3, dTgc)

      @@ -2542,7 +2937,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -2557,7 +2952,7 @@

      Arguments

      - + integer, intent(in), @@ -2572,7 +2967,7 @@

      Arguments

      - + integer, intent(in), @@ -2602,7 +2997,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -2617,7 +3012,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -2647,7 +3042,7 @@

      Arguments

      - + real(kind=rk), intent(out), @@ -2668,7 +3063,7 @@

      Arguments

      -

      private pure subroutine elevate_degree(this, dir, t) +

      private pure subroutine elevate_degree(this, dir, t)

      @@ -2691,7 +3086,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -2706,7 +3101,7 @@

      Arguments

      - + integer, intent(in) @@ -2721,7 +3116,7 @@

      Arguments

      - + integer, intent(in) @@ -2742,7 +3137,7 @@

      Arguments

      -

      private impure subroutine export_Xc(this, filename) +

      private impure subroutine export_Xc(this, filename)

      @@ -2765,7 +3160,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -2780,7 +3175,7 @@

      Arguments

      - + character(len=*), intent(in) @@ -2801,7 +3196,7 @@

      Arguments

      -

      private impure subroutine export_Xg(this, filename) +

      private impure subroutine export_Xg(this, filename)

      @@ -2824,7 +3219,7 @@

      Arguments

      - + class(nurbs_volume), intent(in) @@ -2839,7 +3234,7 @@

      Arguments

      - + character(len=*), intent(in) @@ -2860,7 +3255,7 @@

      Arguments

      -

      private pure subroutine finalize(this) +

      private pure subroutine finalize(this)

      @@ -2883,7 +3278,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -2904,7 +3299,7 @@

      Arguments

      -

      private pure subroutine insert_knots(this, dir, Xth, r) +

      private pure subroutine insert_knots(this, dir, Xth, r)

      @@ -2927,7 +3322,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -2942,7 +3337,7 @@

      Arguments

      - + integer, intent(in) @@ -2957,7 +3352,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -2972,7 +3367,7 @@

      Arguments

      - + integer, intent(in), @@ -2993,7 +3388,7 @@

      Arguments

      -

      private pure subroutine modify_Wc(this, W, num) +

      private pure subroutine modify_Wc(this, W, num)

      @@ -3016,7 +3411,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -3031,7 +3426,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -3046,7 +3441,7 @@

      Arguments

      - + integer, intent(in) @@ -3067,7 +3462,7 @@

      Arguments

      -

      private pure subroutine modify_Xc(this, X, num, dir) +

      private pure subroutine modify_Xc(this, X, num, dir)

      @@ -3090,7 +3485,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -3105,7 +3500,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -3120,7 +3515,7 @@

      Arguments

      - + integer, intent(in) @@ -3135,7 +3530,7 @@

      Arguments

      - + integer, intent(in) @@ -3179,7 +3574,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -3194,7 +3589,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3209,7 +3604,7 @@

      Arguments

      - + integer, intent(in), @@ -3230,7 +3625,7 @@

      Arguments

      -

      private pure subroutine remove_knots(this, dir, Xth, r) +

      private pure subroutine remove_knots(this, dir, Xth, r)

      @@ -3253,7 +3648,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -3268,7 +3663,7 @@

      Arguments

      - + integer, intent(in) @@ -3283,7 +3678,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3298,7 +3693,7 @@

      Arguments

      - + integer, intent(in), @@ -3319,7 +3714,7 @@

      Arguments

      -

      private pure subroutine rotate_Xc(this, alpha, beta, theta) +

      private pure subroutine rotate_Xc(this, alpha, beta, theta)

      @@ -3342,7 +3737,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -3357,7 +3752,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -3372,7 +3767,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -3387,7 +3782,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -3408,7 +3803,7 @@

      Arguments

      -

      private pure subroutine rotate_Xg(this, alpha, beta, theta) +

      private pure subroutine rotate_Xg(this, alpha, beta, theta)

      @@ -3431,7 +3826,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -3446,7 +3841,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -3461,7 +3856,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -3476,7 +3871,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -3497,7 +3892,7 @@

      Arguments

      -

      private pure subroutine set1(this, knot1, knot2, knot3, Xc, Wc) +

      private pure subroutine set1(this, knot1, knot2, knot3, Xc, Wc)

      @@ -3520,7 +3915,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -3535,7 +3930,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3550,7 +3945,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3565,7 +3960,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3580,7 +3975,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3595,7 +3990,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3616,7 +4011,7 @@

      Arguments

      -

      private pure subroutine set2(this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc) +

      private pure subroutine set2(this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc)

      @@ -3639,7 +4034,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -3654,7 +4049,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3669,7 +4064,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3699,7 +4094,7 @@

      Arguments

      - + integer, intent(in), @@ -3714,7 +4109,7 @@

      Arguments

      - + integer, intent(in), @@ -3729,7 +4124,7 @@

      Arguments

      - + integer, intent(in), @@ -3759,7 +4154,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3774,7 +4169,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3795,7 +4190,7 @@

      Arguments

      -

      private pure subroutine set3(this, nc, Xc, Wc) +

      private pure subroutine set3(this, nc, Xc, Wc)

      @@ -3818,7 +4213,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -3833,7 +4228,7 @@

      Arguments

      - + integer, intent(in), @@ -3848,7 +4243,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3863,7 +4258,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3884,7 +4279,7 @@

      Arguments

      -

      private pure subroutine set_elem(this, elemConn) +

      private pure subroutine set_elem(this, elemConn)

      @@ -3907,7 +4302,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -3922,7 +4317,7 @@

      Arguments

      - + integer, intent(in), @@ -3943,7 +4338,7 @@

      Arguments

      -

      private pure subroutine set_elem_Xc_vis(this, elemConn) +

      private pure subroutine set_elem_Xc_vis(this, elemConn)

      @@ -3966,7 +4361,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -3981,7 +4376,7 @@

      Arguments

      - + integer, intent(in), @@ -4002,7 +4397,7 @@

      Arguments

      -

      private pure subroutine set_elem_Xg_vis(this, elemConn) +

      private pure subroutine set_elem_Xg_vis(this, elemConn)

      @@ -4025,7 +4420,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -4040,7 +4435,7 @@

      Arguments

      - + integer, intent(in), @@ -4084,7 +4479,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -4099,7 +4494,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -4114,7 +4509,7 @@

      Arguments

      - + integer, intent(in), @@ -4129,7 +4524,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -4150,7 +4545,7 @@

      Arguments

      -

      private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) +

      private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg)

      @@ -4173,7 +4568,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -4188,7 +4583,7 @@

      Arguments

      - + character(len=*), intent(in) @@ -4203,7 +4598,7 @@

      Arguments

      - + character(len=*), intent(in) @@ -4224,7 +4619,7 @@

      Arguments

      -

      private pure subroutine translate_Xc(this, vec) +

      private pure subroutine translate_Xc(this, vec)

      @@ -4247,7 +4642,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -4262,7 +4657,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -4283,7 +4678,7 @@

      Arguments

      -

      private pure subroutine translate_Xg(this, vec) +

      private pure subroutine translate_Xg(this, vec)

      @@ -4306,7 +4701,7 @@

      Arguments

      - + class(nurbs_volume), intent(inout) @@ -4321,7 +4716,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -4364,7 +4759,7 @@

      Arguments

      Documentation generated by FORD - on 2024-04-16T12:26:30.084942

      + on 2024-04-16T18:31:38.142193


      diff --git a/module/forcad_utils.html b/module/forcad_utils.html index 3356bfc95..204a5292e 100644 --- a/module/forcad_utils.html +++ b/module/forcad_utils.html @@ -78,7 +78,7 @@

      forcad_utils
    • 783 statements + title="19.6% of total for modules and submodules.">783 statements
    • @@ -621,7 +621,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -669,7 +669,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -684,7 +684,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -757,7 +757,7 @@

      Arguments

      - + integer, intent(in) @@ -1046,7 +1046,7 @@

      Arguments

      - + integer, intent(in) @@ -1061,7 +1061,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -1091,7 +1091,7 @@

      Arguments

      - + integer, intent(out), @@ -1254,7 +1254,7 @@

      Arguments

      - + integer, intent(out), @@ -1477,7 +1477,7 @@

      Arguments

      - + integer, intent(out), @@ -1560,7 +1560,7 @@

      Arguments

      - + real(kind=rk), intent(out), @@ -1648,7 +1648,7 @@

      Arguments

      - + real(kind=rk), intent(out), @@ -1701,7 +1701,7 @@

      Arguments

      - + integer, intent(in), @@ -1749,7 +1749,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -1806,7 +1806,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -1821,7 +1821,7 @@

      Arguments

      - + integer, intent(in) @@ -1870,7 +1870,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -1885,7 +1885,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -1900,7 +1900,7 @@

      Arguments

      - + integer, intent(in) @@ -1915,7 +1915,7 @@

      Arguments

      - + integer, intent(in) @@ -1964,7 +1964,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -1979,7 +1979,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -1994,7 +1994,7 @@

      Arguments

      - + integer, intent(in) @@ -2009,7 +2009,7 @@

      Arguments

      - + integer, intent(in) @@ -2073,7 +2073,7 @@

      Arguments

      - + integer, intent(in) @@ -2152,7 +2152,7 @@

      Arguments

      - + integer, intent(in) @@ -2167,7 +2167,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -2182,7 +2182,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -2231,7 +2231,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -2246,7 +2246,7 @@

      Arguments

      - + integer, intent(in) @@ -2359,7 +2359,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -2374,7 +2374,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -2389,7 +2389,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -2438,7 +2438,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -2453,7 +2453,7 @@

      Arguments

      - + integer, intent(in) @@ -2517,7 +2517,7 @@

      Arguments

      - + integer, intent(in) @@ -2581,7 +2581,7 @@

      Arguments

      - + integer, intent(in) @@ -2848,7 +2848,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -2897,7 +2897,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -2912,7 +2912,7 @@

      Arguments

      - + real(kind=rk), intent(in) @@ -3172,7 +3172,7 @@

      Arguments

      - + integer, intent(in), @@ -3221,7 +3221,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3275,7 +3275,7 @@

      Arguments

      - + integer, intent(in) @@ -3290,7 +3290,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3305,7 +3305,7 @@

      Arguments

      - + integer, intent(in) @@ -3320,7 +3320,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3335,7 +3335,7 @@

      Arguments

      - + integer, intent(out) @@ -3350,7 +3350,7 @@

      Arguments

      - + real(kind=rk), intent(out), @@ -3365,7 +3365,7 @@

      Arguments

      - + real(kind=rk), intent(out), @@ -3409,7 +3409,7 @@

      Arguments

      - + integer, intent(in) @@ -3469,7 +3469,7 @@

      Arguments

      - + integer, intent(in) @@ -3484,7 +3484,7 @@

      Arguments

      - + integer, intent(in) @@ -3499,7 +3499,7 @@

      Arguments

      - + integer, intent(in) @@ -3588,7 +3588,7 @@

      Arguments

      - + integer, intent(in) @@ -3603,7 +3603,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3648,7 +3648,7 @@

      Arguments

      - + integer, intent(in) @@ -3663,7 +3663,7 @@

      Arguments

      - + integer, intent(in) @@ -3678,7 +3678,7 @@

      Arguments

      - + integer, intent(in) @@ -3693,7 +3693,7 @@

      Arguments

      - + integer, intent(out) @@ -3708,7 +3708,7 @@

      Arguments

      - + real(kind=rk), intent(out), @@ -3782,7 +3782,7 @@

      Arguments

      - + integer, intent(in) @@ -3797,7 +3797,7 @@

      Arguments

      - + real(kind=rk), intent(in), @@ -3827,7 +3827,7 @@

      Arguments

      - + integer, intent(out), @@ -3991,7 +3991,7 @@

      Arguments

      - + integer, intent(out), @@ -4215,7 +4215,7 @@

      Arguments

      - + integer, intent(out), @@ -4289,7 +4289,7 @@

      Arguments

      - + real(kind=rk), intent(out), @@ -4378,7 +4378,7 @@

      Arguments

      - + real(kind=rk), intent(out), @@ -4421,7 +4421,7 @@

      Arguments

      Documentation generated by FORD - on 2024-04-16T12:26:30.084942

      + on 2024-04-16T18:31:38.142193


    • diff --git a/proc/basis.html b/proc/basis.html index e2ef3f68e..884d7a6b8 100644 --- a/proc/basis.html +++ b/proc/basis.html @@ -78,20 +78,20 @@

      basis
    • 57 statements + title=" 1.2% of total for procedures.">46 statements
    • - Source File + Source File
    -

    private pure subroutine basis(this, res1, res2, res3, Xt1, Xt2, Xt3, Tgc) +

    private pure subroutine basis(this, res1, res2, Xt1, Xt2, Tgc)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - - - - - - - - - @@ -171,7 +171,7 @@

    Arguments

    @@ -225,7 +225,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/basis_bspline.html b/proc/basis_bspline.html index 8acf5b9ca..be8a2a4be 100644 --- a/proc/basis_bspline.html +++ b/proc/basis_bspline.html @@ -78,7 +78,7 @@

    basis_bspline
  • 24 statements + title=" 0.6% of total for procedures.">24 statements
  • @@ -156,7 +156,7 @@

    Arguments

  • @@ -171,7 +171,7 @@

    Arguments

    @@ -186,7 +186,7 @@

    Arguments

    @@ -201,7 +201,7 @@

    Arguments

    @@ -250,9 +250,9 @@

    Called by

    proc~basis - + -nurbs_volume%basis +nurbs_surface%basis @@ -265,24 +265,24 @@

    Called by

    proc~basis~2 - - -nurbs_surface%basis + + +nurbs_curve%basis proc~basis~2->proc~basis_bspline - + proc~basis~3 - - -nurbs_curve%basis + + +nurbs_volume%basis @@ -295,9 +295,9 @@

    Called by

    proc~create - + -nurbs_volume%create +nurbs_surface%create @@ -310,9 +310,9 @@

    Called by

    proc~create~2 - - -nurbs_surface%create + + +nurbs_curve%create @@ -325,9 +325,9 @@

    Called by

    proc~create~3 - - -nurbs_curve%create + + +nurbs_volume%create @@ -356,46 +356,46 @@

    Called by

    program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->proc~create~3 - - + + +program~example1_curve->proc~create~2 + + program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~create~2 - - + + +program~example3_surface->proc~create + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~create - - + + +program~example3_volume->proc~create~3 + + @@ -416,91 +416,91 @@

    Called by

    program~example_nurbs_curve - -example_nurbs_curve + +example_nurbs_curve - - -program~example_nurbs_curve->proc~create~3 - - + + +program~example_nurbs_curve->proc~create~2 + + program~example_nurbs_surface - -example_nurbs_surface + +example_nurbs_surface - - -program~example_nurbs_surface->proc~create~2 - - + + +program~example_nurbs_surface->proc~create + + program~example_nurbs_volume - -example_nurbs_volume + +example_nurbs_volume - - -program~example_nurbs_volume->proc~create - - + + +program~example_nurbs_volume->proc~create~3 + + program~shape_circle - -shape_circle + +shape_circle - - -program~shape_circle->proc~create~3 - - + + +program~shape_circle->proc~create~2 + + program~shape_hexahedron - -shape_hexahedron + +shape_hexahedron - - -program~shape_hexahedron->proc~create - - + + +program~shape_hexahedron->proc~create~3 + + program~shape_tetragon - -shape_tetragon + +shape_tetragon - - -program~shape_tetragon->proc~create~2 - - + + +program~shape_tetragon->proc~create + + @@ -616,7 +616,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/basis_bspline_der.html b/proc/basis_bspline_der.html index d33b40c5e..0165ac573 100644 --- a/proc/basis_bspline_der.html +++ b/proc/basis_bspline_der.html @@ -78,7 +78,7 @@

    basis_bspline_der
  • 51 statements + title=" 1.3% of total for procedures.">51 statements
  • @@ -156,7 +156,7 @@

    Arguments

  • @@ -171,7 +171,7 @@

    Arguments

    @@ -186,7 +186,7 @@

    Arguments

    @@ -201,7 +201,7 @@

    Arguments

    @@ -370,9 +370,9 @@

    Called by

    proc~derivative - + -nurbs_volume%derivative +nurbs_surface%derivative @@ -385,24 +385,24 @@

    Called by

    proc~derivative~2 - - -nurbs_surface%derivative + + +nurbs_curve%derivative proc~derivative~2->proc~basis_bspline_der - - + + proc~derivative~3 - - -nurbs_curve%derivative + + +nurbs_volume%derivative @@ -526,7 +526,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/basis~2.html b/proc/basis~2.html index 48011345b..f04c4e54d 100644 --- a/proc/basis~2.html +++ b/proc/basis~2.html @@ -78,20 +78,20 @@

    basis
  • 46 statements + title=" 0.8% of total for procedures.">29 statements
  • - Source File + Source File
  • -

    private pure subroutine basis(this, res1, res2, Xt1, Xt2, Tgc) +

    private pure subroutine basis(this, res, Xt, Tgc)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(inout) @@ -201,21 +201,6 @@

    Arguments

    - - integer, - intent(in),optional - - ::res3 - -
    @@ -246,21 +231,6 @@

    Arguments

    - - real(kind=rk), - intent(in),optional, - contiguous - ::Xt3(:) - -
    @@ -291,91 +261,106 @@

    Calls

    - - + + proc~~basis~~CallsGraph - + proc~basis - -nurbs_volume%basis + +nurbs_surface%basis interface~ndgrid - -ndgrid + +ndgrid proc~basis->interface~ndgrid - - + + proc~basis_bspline - -basis_bspline + +basis_bspline proc~basis->proc~basis_bspline - - + + - + +proc~is_rational + + +nurbs_surface%is_rational + + + + + +proc~basis->proc~is_rational + + + + + proc~kron - - -kron + + +kron - + proc~basis->proc~kron - - + + - + proc~ndgrid2 - - -ndgrid2 + + +ndgrid2 - + interface~ndgrid->proc~ndgrid2 - - + + - + proc~ndgrid3 - - -ndgrid3 + + +ndgrid3 - + interface~ndgrid->proc~ndgrid3 - - + + @@ -491,7 +476,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/basis_bernstein.html b/proc/basis_bernstein.html index 06b883379..18188ef21 100644 --- a/proc/basis_bernstein.html +++ b/proc/basis_bernstein.html @@ -156,7 +156,7 @@

    Arguments

    - + real(kind=rk), intent(in)
    - + integer, intent(in)
    - + real(kind=rk), intent(in)
    - + real(kind=rk), intent(in),
    - + integer, intent(in)
    - + integer, intent(in)
    - + real(kind=rk), intent(in)
    - + real(kind=rk), intent(in),
    - + integer, intent(in)
    - + integer, intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    @@ -181,44 +181,14 @@

    Arguments

    - + - - - - - - - - - - - - - - - - @@ -226,14 +196,14 @@

    Arguments

    contiguous - + @@ -261,106 +231,46 @@

    Calls

    - - + + proc~~basis~2~~CallsGraph - + proc~basis~2 - -nurbs_surface%basis - - - -interface~ndgrid - - -ndgrid - - - - - -proc~basis~2->interface~ndgrid - - + +nurbs_curve%basis - + proc~basis_bspline - - -basis_bspline + + +basis_bspline - + proc~basis~2->proc~basis_bspline - - + + - + proc~is_rational~2 - - -nurbs_surface%is_rational + + +nurbs_curve%is_rational - + proc~basis~2->proc~is_rational~2 - - - - - -proc~kron - - -kron - - - - - -proc~basis~2->proc~kron - - - - - -proc~ndgrid2 - - -ndgrid2 - - - - - -interface~ndgrid->proc~ndgrid2 - - - - - -proc~ndgrid3 - - -ndgrid3 - - - - - -interface~ndgrid->proc~ndgrid3 - - + + @@ -476,7 +386,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/basis~3.html b/proc/basis~3.html index c3de88db8..7131e64fe 100644 --- a/proc/basis~3.html +++ b/proc/basis~3.html @@ -78,20 +78,20 @@

    basis
  • 29 statements + title=" 1.5% of total for procedures.">57 statements
  • - Source File + Source File
  • -

    private pure subroutine basis(this, res, Xt, Tgc) +

    private pure subroutine basis(this, res1, res2, res3, Xt1, Xt2, Xt3, Tgc)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in), ::res1res
    - - integer, - intent(in),optional - - ::res2 - -
    - - real(kind=rk), - intent(in),optional, - contiguous - ::Xt1(:) - -
    - + real(kind=rk), intent(in), ::Xt2(:)Xt(:)
    - + real(kind=rk), intent(out),
    @@ -158,8 +158,8 @@

    Arguments

    @@ -181,14 +181,74 @@

    Arguments

    - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -196,14 +256,14 @@

    Arguments

    contiguous - + @@ -231,46 +291,91 @@

    Calls

    - - + + proc~~basis~3~~CallsGraph - + proc~basis~3 - -nurbs_curve%basis + +nurbs_volume%basis - + -proc~basis_bspline - - -basis_bspline +interface~ndgrid + + +ndgrid - + -proc~basis~3->proc~basis_bspline - - +proc~basis~3->interface~ndgrid + + - + -proc~is_rational~3 - - -nurbs_curve%is_rational +proc~basis_bspline + + +basis_bspline - + -proc~basis~3->proc~is_rational~3 - - +proc~basis~3->proc~basis_bspline + + + + + +proc~kron + + +kron + + + + + +proc~basis~3->proc~kron + + + + + +proc~ndgrid2 + + +ndgrid2 + + + + + +interface~ndgrid->proc~ndgrid2 + + + + + +proc~ndgrid3 + + +ndgrid3 + + + + + +interface~ndgrid->proc~ndgrid3 + + @@ -386,7 +491,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/bincoeff.html b/proc/bincoeff.html index 1ff34d19f..666b58a4a 100644 --- a/proc/bincoeff.html +++ b/proc/bincoeff.html @@ -171,7 +171,7 @@

    Arguments

    @@ -355,9 +355,9 @@

    Called by

    proc~elevate_degree - + -nurbs_volume%elevate_degree +nurbs_surface%elevate_degree @@ -370,24 +370,24 @@

    Called by

    proc~elevate_degree~2 - - -nurbs_surface%elevate_degree + + +nurbs_curve%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 - - + + proc~elevate_degree~3 - - -nurbs_curve%elevate_degree + + +nurbs_volume%elevate_degree @@ -401,46 +401,46 @@

    Called by

    program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->proc~elevate_degree~3 - - + + +program~example1_curve->proc~elevate_degree~2 + + program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~elevate_degree~2 - - + + +program~example3_surface->proc~elevate_degree + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~elevate_degree - - + + +program~example3_volume->proc~elevate_degree~3 + + @@ -556,7 +556,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/cmp_elem.html b/proc/cmp_elem.html index 6f1612e43..a9205c32b 100644 --- a/proc/cmp_elem.html +++ b/proc/cmp_elem.html @@ -83,15 +83,15 @@

    cmp_elem
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function cmp_elem(this) result(elemConn)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in), ::resres1
    - + + integer, + intent(in),optional + + ::res2 + +
    + + integer, + intent(in),optional + + ::res3 + +
    + + real(kind=rk), + intent(in),optional, + contiguous + ::Xt1(:) + +
    + + real(kind=rk), + intent(in),optional, + contiguous + ::Xt2(:) + +
    + real(kind=rk), intent(in), ::Xt(:)Xt3(:)
    - + real(kind=rk), intent(out),
    - + integer, intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -176,7 +176,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -202,7 +202,7 @@

    Calls

    proc~cmp_elem -nurbs_volume%cmp_elem +nurbs_surface%cmp_elem @@ -237,9 +237,9 @@

    Calls

    proc~get_multiplicity - + -nurbs_volume%get_multiplicity +nurbs_surface%get_multiplicity @@ -487,7 +487,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/cmp_elem_xc_vis.html b/proc/cmp_elem_xc_vis.html index a4541acc4..56bc22377 100644 --- a/proc/cmp_elem_xc_vis.html +++ b/proc/cmp_elem_xc_vis.html @@ -83,15 +83,15 @@

    cmp_elem_Xc_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function cmp_elem_Xc_vis(this, p) result(elemConn)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -191,7 +191,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -217,7 +217,7 @@

    Calls

    proc~cmp_elem_xc_vis -nurbs_volume%cmp_elem_Xc_vis +nurbs_surface%cmp_elem_Xc_vis @@ -373,91 +373,76 @@

    Called by

    - - + + proc~~cmp_elem_xc_vis~~CalledByGraph - + proc~cmp_elem_xc_vis - -nurbs_volume%cmp_elem_Xc_vis + +nurbs_surface%cmp_elem_Xc_vis proc~export_xc - - -nurbs_volume%export_Xc + + +nurbs_surface%export_Xc proc~export_xc->proc~cmp_elem_xc_vis - - + + - + -program~example3_volume - - -example3_volume +program~example3_surface + + +example3_surface - + -program~example3_volume->proc~export_xc - - +program~example3_surface->proc~export_xc + + - + -program~example_morph - - -example_morph +program~example_nurbs_surface + + +example_nurbs_surface - + -program~example_morph->proc~export_xc - - +program~example_nurbs_surface->proc~export_xc + + - + -program~example_nurbs_volume - - -example_nurbs_volume +program~shape_tetragon + + +shape_tetragon - + -program~example_nurbs_volume->proc~export_xc - - - - - -program~shape_hexahedron - - -shape_hexahedron - - - - - -program~shape_hexahedron->proc~export_xc - - +program~shape_tetragon->proc~export_xc + + @@ -573,7 +558,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/cmp_elem_xc_vis~2.html b/proc/cmp_elem_xc_vis~2.html index 9b3c3a8d9..c42ee29ff 100644 --- a/proc/cmp_elem_xc_vis~2.html +++ b/proc/cmp_elem_xc_vis~2.html @@ -83,15 +83,15 @@

    cmp_elem_Xc_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function cmp_elem_Xc_vis(this, p) result(elemConn)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in),
    @@ -158,8 +158,8 @@

    Arguments

    - - + @@ -191,7 +191,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -208,76 +208,76 @@

    Calls

    - + proc~~cmp_elem_xc_vis~2~~CallsGraph - + proc~cmp_elem_xc_vis~2 - -nurbs_surface%cmp_elem_Xc_vis + +nurbs_curve%cmp_elem_Xc_vis interface~elemconn_c0 - -elemConn_C0 + +elemConn_C0 proc~cmp_elem_xc_vis~2->interface~elemconn_c0 - - + + proc~cmp_elemconn_c0_l - -cmp_elemConn_C0_L + +cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l - - + + proc~cmp_elemconn_c0_s - -cmp_elemConn_C0_S + +cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s - - + + proc~cmp_elemconn_c0_v - -cmp_elemConn_C0_V + +cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v - - + + @@ -373,76 +373,76 @@

    Called by

    - + proc~~cmp_elem_xc_vis~2~~CalledByGraph - + proc~cmp_elem_xc_vis~2 - -nurbs_surface%cmp_elem_Xc_vis + +nurbs_curve%cmp_elem_Xc_vis proc~export_xc~2 - - -nurbs_surface%export_Xc + + +nurbs_curve%export_Xc proc~export_xc~2->proc~cmp_elem_xc_vis~2 - - + + - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->proc~export_xc~2 - - +program~example1_curve->proc~export_xc~2 + + - + -program~example_nurbs_surface - - -example_nurbs_surface +program~example_nurbs_curve + + +example_nurbs_curve - + -program~example_nurbs_surface->proc~export_xc~2 - - +program~example_nurbs_curve->proc~export_xc~2 + + - + -program~shape_tetragon - - -shape_tetragon +program~shape_circle + + +shape_circle - + -program~shape_tetragon->proc~export_xc~2 - - +program~shape_circle->proc~export_xc~2 + + @@ -558,7 +558,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/cmp_elem_xc_vis~3.html b/proc/cmp_elem_xc_vis~3.html index 6ba240b8a..808d7e9b9 100644 --- a/proc/cmp_elem_xc_vis~3.html +++ b/proc/cmp_elem_xc_vis~3.html @@ -83,15 +83,15 @@

    cmp_elem_Xc_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function cmp_elem_Xc_vis(this, p) result(elemConn)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(in) @@ -177,11 +177,11 @@

    Arguments

    integer,
    intent(in),optional, - contiguous + optional + ::p(:)p
    @@ -158,8 +158,8 @@

    Arguments

    - - + @@ -191,7 +191,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -208,76 +208,76 @@

    Calls

    - + proc~~cmp_elem_xc_vis~3~~CallsGraph - + proc~cmp_elem_xc_vis~3 - -nurbs_curve%cmp_elem_Xc_vis + +nurbs_volume%cmp_elem_Xc_vis interface~elemconn_c0 - -elemConn_C0 + +elemConn_C0 proc~cmp_elem_xc_vis~3->interface~elemconn_c0 - - + + proc~cmp_elemconn_c0_l - -cmp_elemConn_C0_L + +cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l - - + + proc~cmp_elemconn_c0_s - -cmp_elemConn_C0_S + +cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s - - + + proc~cmp_elemconn_c0_v - -cmp_elemConn_C0_V + +cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v - - + + @@ -373,76 +373,91 @@

    Called by

    - - + + proc~~cmp_elem_xc_vis~3~~CalledByGraph - + proc~cmp_elem_xc_vis~3 - -nurbs_curve%cmp_elem_Xc_vis + +nurbs_volume%cmp_elem_Xc_vis proc~export_xc~3 - - -nurbs_curve%export_Xc + + +nurbs_volume%export_Xc proc~export_xc~3->proc~cmp_elem_xc_vis~3 - - + + - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->proc~export_xc~3 - - +program~example3_volume->proc~export_xc~3 + + - + -program~example_nurbs_curve - - -example_nurbs_curve +program~example_morph + + +example_morph - + -program~example_nurbs_curve->proc~export_xc~3 - - +program~example_morph->proc~export_xc~3 + + - + -program~shape_circle - - -shape_circle +program~example_nurbs_volume + + +example_nurbs_volume - + -program~shape_circle->proc~export_xc~3 - - +program~example_nurbs_volume->proc~export_xc~3 + + + + + +program~shape_hexahedron + + +shape_hexahedron + + + + + +program~shape_hexahedron->proc~export_xc~3 + + @@ -558,7 +573,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/cmp_elem_xg_vis.html b/proc/cmp_elem_xg_vis.html index 1ce5966c2..4a19910a9 100644 --- a/proc/cmp_elem_xg_vis.html +++ b/proc/cmp_elem_xg_vis.html @@ -83,15 +83,15 @@

    cmp_elem_Xg_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function cmp_elem_Xg_vis(this, p) result(elemConn)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(in) @@ -177,11 +177,11 @@

    Arguments

    integer,
    intent(in),optional - + optional, + contiguous ::pp(:)
    @@ -158,8 +158,8 @@

    Arguments

    @@ -191,7 +191,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -217,7 +217,7 @@

    Calls

    proc~cmp_elem_xg_vis -nurbs_volume%cmp_elem_Xg_vis +nurbs_surface%cmp_elem_Xg_vis @@ -373,91 +373,76 @@

    Called by

    - - + + proc~~cmp_elem_xg_vis~~CalledByGraph - + proc~cmp_elem_xg_vis - -nurbs_volume%cmp_elem_Xg_vis + +nurbs_surface%cmp_elem_Xg_vis proc~export_xg - - -nurbs_volume%export_Xg + + +nurbs_surface%export_Xg proc~export_xg->proc~cmp_elem_xg_vis - - + + - + -program~example3_volume - - -example3_volume +program~example3_surface + + +example3_surface - + -program~example3_volume->proc~export_xg - - +program~example3_surface->proc~export_xg + + - + -program~example_morph - - -example_morph +program~example_nurbs_surface + + +example_nurbs_surface - + -program~example_morph->proc~export_xg - - +program~example_nurbs_surface->proc~export_xg + + - + -program~example_nurbs_volume - - -example_nurbs_volume +program~shape_tetragon + + +shape_tetragon - + -program~example_nurbs_volume->proc~export_xg - - - - - -program~shape_hexahedron - - -shape_hexahedron - - - - - -program~shape_hexahedron->proc~export_xg - - +program~shape_tetragon->proc~export_xg + + @@ -573,7 +558,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/cmp_elem_xg_vis~2.html b/proc/cmp_elem_xg_vis~2.html index 12dc81e95..0f043d4be 100644 --- a/proc/cmp_elem_xg_vis~2.html +++ b/proc/cmp_elem_xg_vis~2.html @@ -83,15 +83,15 @@

    cmp_elem_Xg_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function cmp_elem_Xg_vis(this, p) result(elemConn)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in),
    @@ -158,8 +158,8 @@

    Arguments

    - - + @@ -191,7 +191,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -208,76 +208,76 @@

    Calls

    - + proc~~cmp_elem_xg_vis~2~~CallsGraph - + proc~cmp_elem_xg_vis~2 - -nurbs_surface%cmp_elem_Xg_vis + +nurbs_curve%cmp_elem_Xg_vis interface~elemconn_c0 - -elemConn_C0 + +elemConn_C0 proc~cmp_elem_xg_vis~2->interface~elemconn_c0 - - + + proc~cmp_elemconn_c0_l - -cmp_elemConn_C0_L + +cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l - - + + proc~cmp_elemconn_c0_s - -cmp_elemConn_C0_S + +cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s - - + + proc~cmp_elemconn_c0_v - -cmp_elemConn_C0_V + +cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v - - + + @@ -373,76 +373,76 @@

    Called by

    - + proc~~cmp_elem_xg_vis~2~~CalledByGraph - + proc~cmp_elem_xg_vis~2 - -nurbs_surface%cmp_elem_Xg_vis + +nurbs_curve%cmp_elem_Xg_vis proc~export_xg~2 - - -nurbs_surface%export_Xg + + +nurbs_curve%export_Xg proc~export_xg~2->proc~cmp_elem_xg_vis~2 - - + + - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->proc~export_xg~2 - - +program~example1_curve->proc~export_xg~2 + + - + -program~example_nurbs_surface - - -example_nurbs_surface +program~example_nurbs_curve + + +example_nurbs_curve - + -program~example_nurbs_surface->proc~export_xg~2 - - +program~example_nurbs_curve->proc~export_xg~2 + + - + -program~shape_tetragon - - -shape_tetragon +program~shape_circle + + +shape_circle - + -program~shape_tetragon->proc~export_xg~2 - - +program~shape_circle->proc~export_xg~2 + + @@ -558,7 +558,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/cmp_elem_xg_vis~3.html b/proc/cmp_elem_xg_vis~3.html index 75af2da19..b35570239 100644 --- a/proc/cmp_elem_xg_vis~3.html +++ b/proc/cmp_elem_xg_vis~3.html @@ -83,15 +83,15 @@

    cmp_elem_Xg_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function cmp_elem_Xg_vis(this, p) result(elemConn)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(in) @@ -177,11 +177,11 @@

    Arguments

    integer,
    intent(in),optional, - contiguous + optional + ::p(:)p
    @@ -158,8 +158,8 @@

    Arguments

    - - + @@ -191,7 +191,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -208,76 +208,76 @@

    Calls

    - + proc~~cmp_elem_xg_vis~3~~CallsGraph - + proc~cmp_elem_xg_vis~3 - -nurbs_curve%cmp_elem_Xg_vis + +nurbs_volume%cmp_elem_Xg_vis interface~elemconn_c0 - -elemConn_C0 + +elemConn_C0 proc~cmp_elem_xg_vis~3->interface~elemconn_c0 - - + + proc~cmp_elemconn_c0_l - -cmp_elemConn_C0_L + +cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l - - + + proc~cmp_elemconn_c0_s - -cmp_elemConn_C0_S + +cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s - - + + proc~cmp_elemconn_c0_v - -cmp_elemConn_C0_V + +cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v - - + + @@ -373,76 +373,91 @@

    Called by

    - - + + proc~~cmp_elem_xg_vis~3~~CalledByGraph - + proc~cmp_elem_xg_vis~3 - -nurbs_curve%cmp_elem_Xg_vis + +nurbs_volume%cmp_elem_Xg_vis proc~export_xg~3 - - -nurbs_curve%export_Xg + + +nurbs_volume%export_Xg proc~export_xg~3->proc~cmp_elem_xg_vis~3 - - + + - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->proc~export_xg~3 - - +program~example3_volume->proc~export_xg~3 + + - + -program~example_nurbs_curve - - -example_nurbs_curve +program~example_morph + + +example_morph - + -program~example_nurbs_curve->proc~export_xg~3 - - +program~example_morph->proc~export_xg~3 + + - + -program~shape_circle - - -shape_circle +program~example_nurbs_volume + + +example_nurbs_volume - + -program~shape_circle->proc~export_xg~3 - - +program~example_nurbs_volume->proc~export_xg~3 + + + + + +program~shape_hexahedron + + +shape_hexahedron + + + + + +program~shape_hexahedron->proc~export_xg~3 + + @@ -558,7 +573,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/cmp_elemconn_c0_l.html b/proc/cmp_elemconn_c0_l.html index d4268ed96..c65601db0 100644 --- a/proc/cmp_elemconn_c0_l.html +++ b/proc/cmp_elemconn_c0_l.html @@ -171,7 +171,7 @@

    Arguments

    @@ -189,7 +189,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -214,413 +214,413 @@

    Called by

    proc~cmp_elemconn_c0_l - -cmp_elemConn_C0_L + +cmp_elemConn_C0_L interface~elemconn_c0 - -elemConn_C0 + +elemConn_C0 interface~elemconn_c0->proc~cmp_elemconn_c0_l - - + + proc~cmp_elem_xc_vis - - -nurbs_volume%cmp_elem_Xc_vis + + +nurbs_surface%cmp_elem_Xc_vis proc~cmp_elem_xc_vis->interface~elemconn_c0 - - + + proc~cmp_elem_xc_vis~2 - - -nurbs_surface%cmp_elem_Xc_vis + + +nurbs_curve%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~2->interface~elemconn_c0 - - + + proc~cmp_elem_xc_vis~3 - - -nurbs_curve%cmp_elem_Xc_vis + + +nurbs_volume%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~3->interface~elemconn_c0 - - + + proc~cmp_elem_xg_vis - + -nurbs_volume%cmp_elem_Xg_vis +nurbs_surface%cmp_elem_Xg_vis proc~cmp_elem_xg_vis->interface~elemconn_c0 - - + + proc~cmp_elem_xg_vis~2 - - -nurbs_surface%cmp_elem_Xg_vis + + +nurbs_curve%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~2->interface~elemconn_c0 - - + + proc~cmp_elem_xg_vis~3 - - -nurbs_curve%cmp_elem_Xg_vis + + +nurbs_volume%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~3->interface~elemconn_c0 - - + + proc~export_xc - - -nurbs_volume%export_Xc + + +nurbs_surface%export_Xc proc~export_xc->proc~cmp_elem_xc_vis - - + + proc~export_xc~2 - - -nurbs_surface%export_Xc + + +nurbs_curve%export_Xc proc~export_xc~2->proc~cmp_elem_xc_vis~2 - - + + proc~export_xc~3 - - -nurbs_curve%export_Xc + + +nurbs_volume%export_Xc proc~export_xc~3->proc~cmp_elem_xc_vis~3 - - + + proc~export_xg - - -nurbs_volume%export_Xg + + +nurbs_surface%export_Xg proc~export_xg->proc~cmp_elem_xg_vis - - + + proc~export_xg~2 - - -nurbs_surface%export_Xg + + +nurbs_curve%export_Xg proc~export_xg~2->proc~cmp_elem_xg_vis~2 - - + + proc~export_xg~3 - - -nurbs_curve%export_Xg + + +nurbs_volume%export_Xg proc~export_xg~3->proc~cmp_elem_xg_vis~3 - - + + program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->proc~export_xc~3 - - + + +program~example1_curve->proc~export_xc~2 + + - - -program~example1_curve->proc~export_xg~3 - - + + +program~example1_curve->proc~export_xg~2 + + program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~export_xc~2 - - + + +program~example3_surface->proc~export_xc + + - - -program~example3_surface->proc~export_xg~2 - - + + +program~example3_surface->proc~export_xg + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~export_xc - - + + +program~example3_volume->proc~export_xc~3 + + - - -program~example3_volume->proc~export_xg - - + + +program~example3_volume->proc~export_xg~3 + + program~example_morph - -example_morph + +example_morph - - -program~example_morph->proc~export_xc - - + + +program~example_morph->proc~export_xc~3 + + - - -program~example_morph->proc~export_xg - - + + +program~example_morph->proc~export_xg~3 + + program~example_nurbs_curve - -example_nurbs_curve + +example_nurbs_curve - - -program~example_nurbs_curve->proc~export_xc~3 - - + + +program~example_nurbs_curve->proc~export_xc~2 + + - - -program~example_nurbs_curve->proc~export_xg~3 - - + + +program~example_nurbs_curve->proc~export_xg~2 + + program~example_nurbs_surface - -example_nurbs_surface + +example_nurbs_surface - - -program~example_nurbs_surface->proc~export_xc~2 - - + + +program~example_nurbs_surface->proc~export_xc + + - - -program~example_nurbs_surface->proc~export_xg~2 - - + + +program~example_nurbs_surface->proc~export_xg + + program~example_nurbs_volume - -example_nurbs_volume + +example_nurbs_volume - - -program~example_nurbs_volume->proc~export_xc - - + + +program~example_nurbs_volume->proc~export_xc~3 + + - - -program~example_nurbs_volume->proc~export_xg - - + + +program~example_nurbs_volume->proc~export_xg~3 + + program~shape_circle - -shape_circle + +shape_circle - - -program~shape_circle->proc~export_xc~3 - - + + +program~shape_circle->proc~export_xc~2 + + - - -program~shape_circle->proc~export_xg~3 - - + + +program~shape_circle->proc~export_xg~2 + + program~shape_hexahedron - -shape_hexahedron + +shape_hexahedron - - -program~shape_hexahedron->proc~export_xc - - + + +program~shape_hexahedron->proc~export_xc~3 + + - - -program~shape_hexahedron->proc~export_xg - - + + +program~shape_hexahedron->proc~export_xg~3 + + program~shape_tetragon - -shape_tetragon + +shape_tetragon - - -program~shape_tetragon->proc~export_xc~2 - - + + +program~shape_tetragon->proc~export_xc + + - - -program~shape_tetragon->proc~export_xg~2 - - + + +program~shape_tetragon->proc~export_xg + + @@ -740,7 +740,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/cmp_elemconn_c0_s.html b/proc/cmp_elemconn_c0_s.html index 8c1d78817..3dec655aa 100644 --- a/proc/cmp_elemconn_c0_s.html +++ b/proc/cmp_elemconn_c0_s.html @@ -219,7 +219,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -244,413 +244,413 @@

    Called by

    proc~cmp_elemconn_c0_s - -cmp_elemConn_C0_S + +cmp_elemConn_C0_S interface~elemconn_c0 - -elemConn_C0 + +elemConn_C0 interface~elemconn_c0->proc~cmp_elemconn_c0_s - - + + proc~cmp_elem_xc_vis - - -nurbs_volume%cmp_elem_Xc_vis + + +nurbs_surface%cmp_elem_Xc_vis proc~cmp_elem_xc_vis->interface~elemconn_c0 - - + + proc~cmp_elem_xc_vis~2 - - -nurbs_surface%cmp_elem_Xc_vis + + +nurbs_curve%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~2->interface~elemconn_c0 - - + + proc~cmp_elem_xc_vis~3 - - -nurbs_curve%cmp_elem_Xc_vis + + +nurbs_volume%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~3->interface~elemconn_c0 - - + + proc~cmp_elem_xg_vis - + -nurbs_volume%cmp_elem_Xg_vis +nurbs_surface%cmp_elem_Xg_vis proc~cmp_elem_xg_vis->interface~elemconn_c0 - - + + proc~cmp_elem_xg_vis~2 - - -nurbs_surface%cmp_elem_Xg_vis + + +nurbs_curve%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~2->interface~elemconn_c0 - - + + proc~cmp_elem_xg_vis~3 - - -nurbs_curve%cmp_elem_Xg_vis + + +nurbs_volume%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~3->interface~elemconn_c0 - - + + proc~export_xc - - -nurbs_volume%export_Xc + + +nurbs_surface%export_Xc proc~export_xc->proc~cmp_elem_xc_vis - - + + proc~export_xc~2 - - -nurbs_surface%export_Xc + + +nurbs_curve%export_Xc proc~export_xc~2->proc~cmp_elem_xc_vis~2 - - + + proc~export_xc~3 - - -nurbs_curve%export_Xc + + +nurbs_volume%export_Xc proc~export_xc~3->proc~cmp_elem_xc_vis~3 - - + + proc~export_xg - - -nurbs_volume%export_Xg + + +nurbs_surface%export_Xg proc~export_xg->proc~cmp_elem_xg_vis - - + + proc~export_xg~2 - - -nurbs_surface%export_Xg + + +nurbs_curve%export_Xg proc~export_xg~2->proc~cmp_elem_xg_vis~2 - - + + proc~export_xg~3 - - -nurbs_curve%export_Xg + + +nurbs_volume%export_Xg proc~export_xg~3->proc~cmp_elem_xg_vis~3 - - + + program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->proc~export_xc~3 - - + + +program~example1_curve->proc~export_xc~2 + + - - -program~example1_curve->proc~export_xg~3 - - + + +program~example1_curve->proc~export_xg~2 + + program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~export_xc~2 - - + + +program~example3_surface->proc~export_xc + + - - -program~example3_surface->proc~export_xg~2 - - + + +program~example3_surface->proc~export_xg + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~export_xc - - + + +program~example3_volume->proc~export_xc~3 + + - - -program~example3_volume->proc~export_xg - - + + +program~example3_volume->proc~export_xg~3 + + program~example_morph - -example_morph + +example_morph - - -program~example_morph->proc~export_xc - - + + +program~example_morph->proc~export_xc~3 + + - - -program~example_morph->proc~export_xg - - + + +program~example_morph->proc~export_xg~3 + + program~example_nurbs_curve - -example_nurbs_curve + +example_nurbs_curve - - -program~example_nurbs_curve->proc~export_xc~3 - - + + +program~example_nurbs_curve->proc~export_xc~2 + + - - -program~example_nurbs_curve->proc~export_xg~3 - - + + +program~example_nurbs_curve->proc~export_xg~2 + + program~example_nurbs_surface - -example_nurbs_surface + +example_nurbs_surface - - -program~example_nurbs_surface->proc~export_xc~2 - - + + +program~example_nurbs_surface->proc~export_xc + + - - -program~example_nurbs_surface->proc~export_xg~2 - - + + +program~example_nurbs_surface->proc~export_xg + + program~example_nurbs_volume - -example_nurbs_volume + +example_nurbs_volume - - -program~example_nurbs_volume->proc~export_xc - - + + +program~example_nurbs_volume->proc~export_xc~3 + + - - -program~example_nurbs_volume->proc~export_xg - - + + +program~example_nurbs_volume->proc~export_xg~3 + + program~shape_circle - -shape_circle + +shape_circle - - -program~shape_circle->proc~export_xc~3 - - + + +program~shape_circle->proc~export_xc~2 + + - - -program~shape_circle->proc~export_xg~3 - - + + +program~shape_circle->proc~export_xg~2 + + program~shape_hexahedron - -shape_hexahedron + +shape_hexahedron - - -program~shape_hexahedron->proc~export_xc - - + + +program~shape_hexahedron->proc~export_xc~3 + + - - -program~shape_hexahedron->proc~export_xg - - + + +program~shape_hexahedron->proc~export_xg~3 + + program~shape_tetragon - -shape_tetragon + +shape_tetragon - - -program~shape_tetragon->proc~export_xc~2 - - + + +program~shape_tetragon->proc~export_xc + + - - -program~shape_tetragon->proc~export_xg~2 - - + + +program~shape_tetragon->proc~export_xg + + @@ -770,7 +770,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/cmp_elemconn_c0_v.html b/proc/cmp_elemconn_c0_v.html index d52502839..9052b9841 100644 --- a/proc/cmp_elemconn_c0_v.html +++ b/proc/cmp_elemconn_c0_v.html @@ -249,7 +249,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -274,413 +274,413 @@

    Called by

    proc~cmp_elemconn_c0_v - -cmp_elemConn_C0_V + +cmp_elemConn_C0_V interface~elemconn_c0 - -elemConn_C0 + +elemConn_C0 interface~elemconn_c0->proc~cmp_elemconn_c0_v - - + + proc~cmp_elem_xc_vis - - -nurbs_volume%cmp_elem_Xc_vis + + +nurbs_surface%cmp_elem_Xc_vis proc~cmp_elem_xc_vis->interface~elemconn_c0 - - + + proc~cmp_elem_xc_vis~2 - - -nurbs_surface%cmp_elem_Xc_vis + + +nurbs_curve%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~2->interface~elemconn_c0 - - + + proc~cmp_elem_xc_vis~3 - - -nurbs_curve%cmp_elem_Xc_vis + + +nurbs_volume%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~3->interface~elemconn_c0 - - + + proc~cmp_elem_xg_vis - + -nurbs_volume%cmp_elem_Xg_vis +nurbs_surface%cmp_elem_Xg_vis proc~cmp_elem_xg_vis->interface~elemconn_c0 - - + + proc~cmp_elem_xg_vis~2 - - -nurbs_surface%cmp_elem_Xg_vis + + +nurbs_curve%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~2->interface~elemconn_c0 - - + + proc~cmp_elem_xg_vis~3 - - -nurbs_curve%cmp_elem_Xg_vis + + +nurbs_volume%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~3->interface~elemconn_c0 - - + + proc~export_xc - - -nurbs_volume%export_Xc + + +nurbs_surface%export_Xc proc~export_xc->proc~cmp_elem_xc_vis - - + + proc~export_xc~2 - - -nurbs_surface%export_Xc + + +nurbs_curve%export_Xc proc~export_xc~2->proc~cmp_elem_xc_vis~2 - - + + proc~export_xc~3 - - -nurbs_curve%export_Xc + + +nurbs_volume%export_Xc proc~export_xc~3->proc~cmp_elem_xc_vis~3 - - + + proc~export_xg - - -nurbs_volume%export_Xg + + +nurbs_surface%export_Xg proc~export_xg->proc~cmp_elem_xg_vis - - + + proc~export_xg~2 - - -nurbs_surface%export_Xg + + +nurbs_curve%export_Xg proc~export_xg~2->proc~cmp_elem_xg_vis~2 - - + + proc~export_xg~3 - - -nurbs_curve%export_Xg + + +nurbs_volume%export_Xg proc~export_xg~3->proc~cmp_elem_xg_vis~3 - - + + program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->proc~export_xc~3 - - + + +program~example1_curve->proc~export_xc~2 + + - - -program~example1_curve->proc~export_xg~3 - - + + +program~example1_curve->proc~export_xg~2 + + program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~export_xc~2 - - + + +program~example3_surface->proc~export_xc + + - - -program~example3_surface->proc~export_xg~2 - - + + +program~example3_surface->proc~export_xg + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~export_xc - - + + +program~example3_volume->proc~export_xc~3 + + - - -program~example3_volume->proc~export_xg - - + + +program~example3_volume->proc~export_xg~3 + + program~example_morph - -example_morph + +example_morph - - -program~example_morph->proc~export_xc - - + + +program~example_morph->proc~export_xc~3 + + - - -program~example_morph->proc~export_xg - - + + +program~example_morph->proc~export_xg~3 + + program~example_nurbs_curve - -example_nurbs_curve + +example_nurbs_curve - - -program~example_nurbs_curve->proc~export_xc~3 - - + + +program~example_nurbs_curve->proc~export_xc~2 + + - - -program~example_nurbs_curve->proc~export_xg~3 - - + + +program~example_nurbs_curve->proc~export_xg~2 + + program~example_nurbs_surface - -example_nurbs_surface + +example_nurbs_surface - - -program~example_nurbs_surface->proc~export_xc~2 - - + + +program~example_nurbs_surface->proc~export_xc + + - - -program~example_nurbs_surface->proc~export_xg~2 - - + + +program~example_nurbs_surface->proc~export_xg + + program~example_nurbs_volume - -example_nurbs_volume + +example_nurbs_volume - - -program~example_nurbs_volume->proc~export_xc - - + + +program~example_nurbs_volume->proc~export_xc~3 + + - - -program~example_nurbs_volume->proc~export_xg - - + + +program~example_nurbs_volume->proc~export_xg~3 + + program~shape_circle - -shape_circle + +shape_circle - - -program~shape_circle->proc~export_xc~3 - - + + +program~shape_circle->proc~export_xc~2 + + - - -program~shape_circle->proc~export_xg~3 - - + + +program~shape_circle->proc~export_xg~2 + + program~shape_hexahedron - -shape_hexahedron + +shape_hexahedron - - -program~shape_hexahedron->proc~export_xc - - + + +program~shape_hexahedron->proc~export_xc~3 + + - - -program~shape_hexahedron->proc~export_xg - - + + +program~shape_hexahedron->proc~export_xg~3 + + program~shape_tetragon - -shape_tetragon + +shape_tetragon - - -program~shape_tetragon->proc~export_xc~2 - - + + +program~shape_tetragon->proc~export_xc + + - - -program~shape_tetragon->proc~export_xg~2 - - + + +program~shape_tetragon->proc~export_xg + + @@ -800,7 +800,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/cmp_elemconn_cn_l.html b/proc/cmp_elemconn_cn_l.html index 03e3d2028..b5c1c1bb3 100644 --- a/proc/cmp_elemconn_cn_l.html +++ b/proc/cmp_elemconn_cn_l.html @@ -171,7 +171,7 @@

    Arguments

    @@ -186,7 +186,7 @@

    Arguments

    @@ -216,7 +216,7 @@

    Arguments

    @@ -273,9 +273,9 @@

    Called by

    proc~cmp_elem - + -nurbs_volume%cmp_elem +nurbs_surface%cmp_elem @@ -288,24 +288,24 @@

    Called by

    proc~cmp_elem~2 - - -nurbs_surface%cmp_elem + + +nurbs_curve%cmp_elem proc~cmp_elem~2->interface~elemconn_cn - - + + proc~cmp_elem~3 - - -nurbs_curve%cmp_elem + + +nurbs_volume%cmp_elem @@ -429,7 +429,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/cmp_elemconn_cn_s.html b/proc/cmp_elemconn_cn_s.html index 561b6f6db..55fd7d6e4 100644 --- a/proc/cmp_elemconn_cn_s.html +++ b/proc/cmp_elemconn_cn_s.html @@ -276,7 +276,7 @@

    Arguments

    @@ -333,9 +333,9 @@

    Called by

    proc~cmp_elem - + -nurbs_volume%cmp_elem +nurbs_surface%cmp_elem @@ -348,24 +348,24 @@

    Called by

    proc~cmp_elem~2 - - -nurbs_surface%cmp_elem + + +nurbs_curve%cmp_elem proc~cmp_elem~2->interface~elemconn_cn - - + + proc~cmp_elem~3 - - -nurbs_curve%cmp_elem + + +nurbs_volume%cmp_elem @@ -489,7 +489,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/cmp_elemconn_cn_v.html b/proc/cmp_elemconn_cn_v.html index a47765de8..cacd5247b 100644 --- a/proc/cmp_elemconn_cn_v.html +++ b/proc/cmp_elemconn_cn_v.html @@ -78,7 +78,7 @@

    cmp_elemConn_Cn_V
  • 35 statements + title=" 0.9% of total for procedures.">35 statements
  • @@ -336,7 +336,7 @@

    Arguments

  • @@ -393,9 +393,9 @@

    Called by

    proc~cmp_elem - + -nurbs_volume%cmp_elem +nurbs_surface%cmp_elem @@ -408,24 +408,24 @@

    Called by

    proc~cmp_elem~2 - - -nurbs_surface%cmp_elem + + +nurbs_curve%cmp_elem proc~cmp_elem~2->interface~elemconn_cn - - + + proc~cmp_elem~3 - - -nurbs_curve%cmp_elem + + +nurbs_volume%cmp_elem @@ -549,7 +549,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/cmp_elem~2.html b/proc/cmp_elem~2.html index 30d94ed29..4e0f11e75 100644 --- a/proc/cmp_elem~2.html +++ b/proc/cmp_elem~2.html @@ -83,15 +83,15 @@

    cmp_elem
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function cmp_elem(this) result(elemConn)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(in) @@ -177,11 +177,11 @@

    Arguments

    integer,
    intent(in),optional - + optional, + contiguous ::pp(:)
    - + integer, intent(in)
    - + integer, intent(in)
    - + real(kind=rk), intent(in),
    - + integer, intent(out),
    - + integer, intent(out),
    - + integer, intent(out),
    @@ -158,8 +158,8 @@

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(in) @@ -176,7 +176,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -193,181 +193,181 @@

    Calls

    - - + + proc~~cmp_elem~2~~CallsGraph - + proc~cmp_elem~2 - -nurbs_surface%cmp_elem + +nurbs_curve%cmp_elem interface~elemconn_cn - -elemConn_Cn + +elemConn_Cn proc~cmp_elem~2->interface~elemconn_cn - - + + interface~unique - -unique + +unique proc~cmp_elem~2->interface~unique - - + + proc~get_multiplicity~2 - - -nurbs_surface%get_multiplicity + + +nurbs_curve%get_multiplicity proc~cmp_elem~2->proc~get_multiplicity~2 - - + + proc~cmp_elemconn_cn_l - -cmp_elemConn_Cn_L + +cmp_elemConn_Cn_L interface~elemconn_cn->proc~cmp_elemconn_cn_l - - + + proc~cmp_elemconn_cn_s - -cmp_elemConn_Cn_S + +cmp_elemConn_Cn_S interface~elemconn_cn->proc~cmp_elemconn_cn_s - - + + proc~cmp_elemconn_cn_v - -cmp_elemConn_Cn_V + +cmp_elemConn_Cn_V interface~elemconn_cn->proc~cmp_elemconn_cn_v - - + + proc~unique_integer - -unique_integer + +unique_integer interface~unique->proc~unique_integer - - + + proc~unique_real - -unique_real + +unique_real interface~unique->proc~unique_real - - + + interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity - - + + proc~compute_multiplicity1 - -compute_multiplicity1 + +compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 - - + + proc~compute_multiplicity2 - -compute_multiplicity2 + +compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 - - + + @@ -487,7 +487,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/cmp_elem~3.html b/proc/cmp_elem~3.html index 8dff3a1c6..dc81a6f61 100644 --- a/proc/cmp_elem~3.html +++ b/proc/cmp_elem~3.html @@ -83,15 +83,15 @@

    cmp_elem
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function cmp_elem(this) result(elemConn)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -204,7 +204,7 @@

    Arguments

    Return Value - + real(kind=rk), allocatable, (:)

    @@ -341,580 +341,580 @@

    Called by

    - - + + proc~~compute_knot_vector~~CalledByGraph - + proc~compute_knot_vector - -compute_knot_vector + +compute_knot_vector proc~set2 - - -nurbs_volume%set2 + + +nurbs_surface%set2 proc~set2->proc~compute_knot_vector - - + + proc~set2~2 - - -nurbs_surface%set2 + + +nurbs_curve%set2 proc~set2~2->proc~compute_knot_vector - - + + proc~set2~3 - - -nurbs_curve%set2 + + +nurbs_volume%set2 proc~set2~3->proc~compute_knot_vector - - + + none~set - - -nurbs_volume%set + + +nurbs_surface%set none~set->proc~set2 - - + + none~set~2 - - -nurbs_surface%set + + +nurbs_curve%set none~set~2->proc~set2~2 - - + + none~set~3 - - -nurbs_curve%set + + +nurbs_volume%set none~set~3->proc~set2~3 - - + + proc~elevate_degree - + -nurbs_volume%elevate_degree +nurbs_surface%elevate_degree proc~elevate_degree->none~set - - + + proc~elevate_degree~2 - - -nurbs_surface%elevate_degree + + +nurbs_curve%elevate_degree - + proc~elevate_degree~2->none~set~2 - - + + proc~elevate_degree~3 - - -nurbs_curve%elevate_degree + + +nurbs_volume%elevate_degree - + proc~elevate_degree~3->none~set~3 - - + + proc~insert_knots - + -nurbs_volume%insert_knots +nurbs_surface%insert_knots proc~insert_knots->none~set - - + + proc~insert_knots~2 - - -nurbs_surface%insert_knots + + +nurbs_curve%insert_knots - + proc~insert_knots~2->none~set~2 - - + + proc~insert_knots~3 - - -nurbs_curve%insert_knots + + +nurbs_volume%insert_knots - + proc~insert_knots~3->none~set~3 - - + + proc~modify_wc - + -nurbs_volume%modify_Wc +nurbs_surface%modify_Wc proc~modify_wc->none~set - - + + proc~modify_wc~2 - - -nurbs_surface%modify_Wc + + +nurbs_curve%modify_Wc - + proc~modify_wc~2->none~set~2 - - + + proc~modify_wc~3 - - -nurbs_curve%modify_Wc + + +nurbs_volume%modify_Wc - + proc~modify_wc~3->none~set~3 - - + + proc~modify_xc - + -nurbs_volume%modify_Xc +nurbs_surface%modify_Xc proc~modify_xc->none~set - - + + proc~modify_xc~2 - - -nurbs_surface%modify_Xc + + +nurbs_curve%modify_Xc - + proc~modify_xc~2->none~set~2 - - + + proc~modify_xc~3 - - -nurbs_curve%modify_Xc + + +nurbs_volume%modify_Xc - + proc~modify_xc~3->none~set~3 - - + + proc~remove_knots - + -nurbs_volume%remove_knots +nurbs_surface%remove_knots proc~remove_knots->none~set - - + + proc~remove_knots~2 - - -nurbs_surface%remove_knots + + +nurbs_curve%remove_knots - + proc~remove_knots~2->none~set~2 - - + + proc~remove_knots~3 - - -nurbs_curve%remove_knots + + +nurbs_volume%remove_knots - + proc~remove_knots~3->none~set~3 - - + + proc~set_circle - -nurbs_curve%set_circle + +nurbs_curve%set_circle - - -proc~set_circle->none~set~3 - - + + +proc~set_circle->none~set~2 + + proc~set_hexahedron - -nurbs_volume%set_hexahedron + +nurbs_volume%set_hexahedron - - -proc~set_hexahedron->none~set - - + + +proc~set_hexahedron->none~set~3 + + proc~set_tetragon - -nurbs_surface%set_tetragon + +nurbs_surface%set_tetragon - - -proc~set_tetragon->none~set~2 - - + + +proc~set_tetragon->none~set + + program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->none~set~3 - - + + +program~example1_curve->none~set~2 + + - - -program~example1_curve->proc~elevate_degree~3 - - + + +program~example1_curve->proc~elevate_degree~2 + + - - -program~example1_curve->proc~insert_knots~3 - - + + +program~example1_curve->proc~insert_knots~2 + + - - -program~example1_curve->proc~remove_knots~3 - - + + +program~example1_curve->proc~remove_knots~2 + + program~example3_surface - -example3_surface - - - - - -program~example3_surface->none~set~2 - - - - - -program~example3_surface->proc~elevate_degree~2 - - - - - -program~example3_surface->proc~insert_knots~2 - - - - - -program~example3_surface->proc~remove_knots~2 - - - - - -program~example3_volume - -example3_volume +example3_surface - + -program~example3_volume->none~set - - +program~example3_surface->none~set + + - + -program~example3_volume->proc~elevate_degree +program~example3_surface->proc~elevate_degree - + -program~example3_volume->proc~insert_knots +program~example3_surface->proc~insert_knots - + -program~example3_volume->proc~remove_knots +program~example3_surface->proc~remove_knots + + +program~example3_volume + + +example3_volume + + + + + +program~example3_volume->none~set~3 + + + + + +program~example3_volume->proc~elevate_degree~3 + + + + + +program~example3_volume->proc~insert_knots~3 + + + + + +program~example3_volume->proc~remove_knots~3 + + + program~example_morph - -example_morph + +example_morph - - -program~example_morph->none~set - - + + +program~example_morph->none~set~3 + + program~example_nurbs_curve - -example_nurbs_curve + +example_nurbs_curve - - -program~example_nurbs_curve->none~set~3 - - + + +program~example_nurbs_curve->none~set~2 + + program~example_nurbs_surface - -example_nurbs_surface + +example_nurbs_surface - - -program~example_nurbs_surface->none~set~2 - - + + +program~example_nurbs_surface->none~set + + program~example_nurbs_volume - -example_nurbs_volume + +example_nurbs_volume - - -program~example_nurbs_volume->none~set - - + + +program~example_nurbs_volume->none~set~3 + + program~shape_circle - -shape_circle + +shape_circle program~shape_circle->proc~set_circle - - + + program~shape_hexahedron - -shape_hexahedron + +shape_hexahedron program~shape_hexahedron->proc~set_hexahedron - - + + program~shape_tetragon - -shape_tetragon + +shape_tetragon program~shape_tetragon->proc~set_tetragon - - + + @@ -1034,7 +1034,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/compute_multiplicity1.html b/proc/compute_multiplicity1.html index 5fab22f52..d7cf7f67c 100644 --- a/proc/compute_multiplicity1.html +++ b/proc/compute_multiplicity1.html @@ -156,7 +156,7 @@

    Arguments

    @@ -191,1096 +191,1096 @@

    Called by

    - - + + proc~~compute_multiplicity1~~CalledByGraph - + proc~compute_multiplicity1 - -compute_multiplicity1 + +compute_multiplicity1 interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity interface~compute_multiplicity->proc~compute_multiplicity1 - - + + proc~elevate_degree_a_5_9 - -elevate_degree_A_5_9 + +elevate_degree_A_5_9 proc~elevate_degree_a_5_9->interface~compute_multiplicity - - + + proc~get_continuity - - -nurbs_volume%get_continuity + + +nurbs_surface%get_continuity proc~get_continuity->interface~compute_multiplicity - - + + proc~get_continuity~2 - - -nurbs_surface%get_continuity + + +nurbs_curve%get_continuity proc~get_continuity~2->interface~compute_multiplicity - - + + proc~get_continuity~3 - - -nurbs_curve%get_continuity + + +nurbs_volume%get_continuity proc~get_continuity~3->interface~compute_multiplicity - - + + proc~get_multiplicity - - -nurbs_volume%get_multiplicity + + +nurbs_surface%get_multiplicity proc~get_multiplicity->interface~compute_multiplicity - - + + proc~get_multiplicity~2 - - -nurbs_surface%get_multiplicity + + +nurbs_curve%get_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity - - + + proc~get_multiplicity~3 - - -nurbs_curve%get_multiplicity + + +nurbs_volume%get_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity - - + + proc~get_nc - - -nurbs_volume%get_nc + + +nurbs_surface%get_nc proc~get_nc->interface~compute_multiplicity - - + + proc~get_nc~2 - - -nurbs_surface%get_nc + + +nurbs_curve%get_nc proc~get_nc~2->interface~compute_multiplicity - - + + proc~get_nc~3 - - -nurbs_curve%get_nc + + +nurbs_volume%get_nc proc~get_nc~3->interface~compute_multiplicity - - + + proc~insert_knots - - -nurbs_volume%insert_knots + + +nurbs_surface%insert_knots proc~insert_knots->interface~compute_multiplicity - - + + none~set - - -nurbs_volume%set + + +nurbs_surface%set proc~insert_knots->none~set - - + + proc~insert_knots~2 - - -nurbs_surface%insert_knots + + +nurbs_curve%insert_knots proc~insert_knots~2->interface~compute_multiplicity - - + + - + none~set~2 - - -nurbs_surface%set + + +nurbs_curve%set - + proc~insert_knots~2->none~set~2 - - + + proc~insert_knots~3 - - -nurbs_curve%insert_knots + + +nurbs_volume%insert_knots proc~insert_knots~3->interface~compute_multiplicity - - + + - + none~set~3 - - -nurbs_curve%set + + +nurbs_volume%set - + proc~insert_knots~3->none~set~3 - - + + proc~remove_knots - - -nurbs_volume%remove_knots + + +nurbs_surface%remove_knots proc~remove_knots->interface~compute_multiplicity - - + + proc~remove_knots->none~set - - + + proc~remove_knots~2 - - -nurbs_surface%remove_knots + + +nurbs_curve%remove_knots proc~remove_knots~2->interface~compute_multiplicity - - + + - + proc~remove_knots~2->none~set~2 - - + + proc~remove_knots~3 - - -nurbs_curve%remove_knots + + +nurbs_volume%remove_knots proc~remove_knots~3->interface~compute_multiplicity - - + + - + proc~remove_knots~3->none~set~3 - - + + proc~cmp_elem - - -nurbs_volume%cmp_elem + + +nurbs_surface%cmp_elem proc~cmp_elem->proc~get_multiplicity - - + + proc~cmp_elem~2 - - -nurbs_surface%cmp_elem + + +nurbs_curve%cmp_elem proc~cmp_elem~2->proc~get_multiplicity~2 - - + + proc~cmp_elem~3 - - -nurbs_curve%cmp_elem + + +nurbs_volume%cmp_elem - + proc~cmp_elem~3->proc~get_multiplicity~3 - - + + proc~elevate_degree - - -nurbs_volume%elevate_degree + + +nurbs_surface%elevate_degree proc~elevate_degree->proc~elevate_degree_a_5_9 - - + + proc~elevate_degree->none~set - - + + proc~elevate_degree~2 - - -nurbs_surface%elevate_degree + + +nurbs_curve%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 - - + + - + proc~elevate_degree~2->none~set~2 - - + + proc~elevate_degree~3 - - -nurbs_curve%elevate_degree + + +nurbs_volume%elevate_degree proc~elevate_degree~3->proc~elevate_degree_a_5_9 - - + + - + proc~elevate_degree~3->none~set~3 - - + + proc~get_degree - -nurbs_curve%get_degree + +nurbs_curve%get_degree - - -proc~get_degree->proc~get_multiplicity~3 - - + + +proc~get_degree->proc~get_multiplicity~2 + + proc~get_degree_all - - -nurbs_volume%get_degree_all + + +nurbs_surface%get_degree_all proc~get_degree_all->proc~get_multiplicity - - + + proc~get_degree_all~2 - - -nurbs_surface%get_degree_all + + +nurbs_volume%get_degree_all - - -proc~get_degree_all~2->proc~get_multiplicity~2 - - + + +proc~get_degree_all~2->proc~get_multiplicity~3 + + proc~get_degree_dir - - -nurbs_volume%get_degree_dir + + +nurbs_surface%get_degree_dir proc~get_degree_dir->proc~get_multiplicity - - + + proc~get_degree_dir~2 - - -nurbs_surface%get_degree_dir + + +nurbs_volume%get_degree_dir - - -proc~get_degree_dir~2->proc~get_multiplicity~2 - - + + +proc~get_degree_dir~2->proc~get_multiplicity~3 + + proc~set1 - - -nurbs_volume%set1 + + +nurbs_surface%set1 proc~set1->proc~get_nc - - + + none~get_degree - - -nurbs_volume%get_degree + + +nurbs_surface%get_degree proc~set1->none~get_degree - - + + - + -proc~set1~2 - - -nurbs_surface%set1 +proc~set1~3 + + +nurbs_volume%set1 - + -proc~set1~2->proc~get_nc~2 - - +proc~set1~3->proc~get_nc~3 + + - + -none~get_degree~2 - - -nurbs_surface%get_degree +none~get_degree~3 + + +nurbs_volume%get_degree - + -proc~set1~2->none~get_degree~2 - - +proc~set1~3->none~get_degree~3 + + proc~set2 - - -nurbs_volume%set2 + + +nurbs_surface%set2 proc~set2->proc~get_nc - - + + - + -proc~set2~2 - - -nurbs_surface%set2 +proc~set2~3 + + +nurbs_volume%set2 - + -proc~set2~2->proc~get_nc~2 - - +proc~set2~3->proc~get_nc~3 + + program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->proc~insert_knots~3 - - + + +program~example1_curve->proc~insert_knots~2 + + - - -program~example1_curve->proc~remove_knots~3 - - + + +program~example1_curve->proc~remove_knots~2 + + - - -program~example1_curve->proc~elevate_degree~3 - - + + +program~example1_curve->proc~elevate_degree~2 + + program~example1_curve->proc~get_degree - - + + - + -program~example1_curve->none~set~3 - - +program~example1_curve->none~set~2 + + program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~insert_knots~2 - - + + +program~example3_surface->proc~insert_knots + + - - -program~example3_surface->proc~remove_knots~2 - - + + +program~example3_surface->proc~remove_knots + + - - -program~example3_surface->proc~elevate_degree~2 - - + + +program~example3_surface->proc~elevate_degree + + - - -program~example3_surface->none~get_degree~2 - - + + +program~example3_surface->none~get_degree + + - - -program~example3_surface->none~set~2 - - + + +program~example3_surface->none~set + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~insert_knots - - + + +program~example3_volume->proc~insert_knots~3 + + - - -program~example3_volume->proc~remove_knots - - + + +program~example3_volume->proc~remove_knots~3 + + - - -program~example3_volume->proc~elevate_degree - - + + +program~example3_volume->proc~elevate_degree~3 + + - - -program~example3_volume->none~get_degree - - + + +program~example3_volume->none~get_degree~3 + + - - -program~example3_volume->none~set - - + + +program~example3_volume->none~set~3 + + none~get_degree->proc~get_degree_all - - + + none~get_degree->proc~get_degree_dir - - + + - + -none~get_degree~2->proc~get_degree_all~2 - - +none~get_degree~3->proc~get_degree_all~2 + + - + -none~get_degree~2->proc~get_degree_dir~2 - - +none~get_degree~3->proc~get_degree_dir~2 + + none~set->proc~set1 - - + + none~set->proc~set2 - - + + proc~set3 - - -nurbs_volume%set3 + + +nurbs_surface%set3 none~set->proc~set3 - - + + - + -none~set~2->proc~set1~2 - - +none~set~3->proc~set1~3 + + - + -none~set~2->proc~set2~2 - - +none~set~3->proc~set2~3 + + - + -proc~set3~2 - - -nurbs_surface%set3 +proc~set3~3 + + +nurbs_volume%set3 - + -none~set~2->proc~set3~2 - - +none~set~3->proc~set3~3 + + - + -proc~set1~3 - - -nurbs_curve%set1 +proc~set1~2 + + +nurbs_curve%set1 - + -proc~set1~3->proc~get_degree - - +proc~set1~2->proc~get_degree + + - + -proc~set3~3 - - -nurbs_curve%set3 +proc~set3~2 + + +nurbs_curve%set3 - + -proc~set3~3->proc~get_degree - - +proc~set3~2->proc~get_degree + + - + -none~set~3->proc~set1~3 - - +none~set~2->proc~set1~2 + + - + -none~set~3->proc~set3~3 - - +none~set~2->proc~set3~2 + + proc~modify_wc - - -nurbs_volume%modify_Wc + + +nurbs_surface%modify_Wc proc~modify_wc->none~set - - + + - + -proc~modify_wc~2 - - -nurbs_surface%modify_Wc +proc~modify_wc~3 + + +nurbs_volume%modify_Wc - - -proc~modify_wc~2->none~set~2 - - + + +proc~modify_wc~3->none~set~3 + + proc~modify_xc - - -nurbs_volume%modify_Xc + + +nurbs_surface%modify_Xc proc~modify_xc->none~set - - + + - + -proc~modify_xc~2 - - -nurbs_surface%modify_Xc +proc~modify_xc~3 + + +nurbs_volume%modify_Xc - - -proc~modify_xc~2->none~set~2 - - + + +proc~modify_xc~3->none~set~3 + + proc~set3->none~get_degree - - + + - + -proc~set3~2->none~get_degree~2 - - +proc~set3~3->none~get_degree~3 + + proc~set_hexahedron - -nurbs_volume%set_hexahedron + +nurbs_volume%set_hexahedron - - -proc~set_hexahedron->none~set - - + + +proc~set_hexahedron->none~set~3 + + proc~set_tetragon - -nurbs_surface%set_tetragon + +nurbs_surface%set_tetragon - - -proc~set_tetragon->none~set~2 - - + + +proc~set_tetragon->none~set + + program~example_morph - -example_morph + +example_morph - - -program~example_morph->none~set - - + + +program~example_morph->none~set~3 + + program~example_nurbs_surface - -example_nurbs_surface + +example_nurbs_surface - - -program~example_nurbs_surface->none~set~2 - - + + +program~example_nurbs_surface->none~set + + program~example_nurbs_volume - -example_nurbs_volume + +example_nurbs_volume - - -program~example_nurbs_volume->none~set - - + + +program~example_nurbs_volume->none~set~3 + + - + -proc~modify_wc~3 - - -nurbs_curve%modify_Wc +proc~modify_wc~2 + + +nurbs_curve%modify_Wc - + -proc~modify_wc~3->none~set~3 - - +proc~modify_wc~2->none~set~2 + + - + -proc~modify_xc~3 - - -nurbs_curve%modify_Xc +proc~modify_xc~2 + + +nurbs_curve%modify_Xc - + -proc~modify_xc~3->none~set~3 - - +proc~modify_xc~2->none~set~2 + + proc~set_circle - -nurbs_curve%set_circle + +nurbs_curve%set_circle - + -proc~set_circle->none~set~3 - - +proc~set_circle->none~set~2 + + program~example_nurbs_curve - -example_nurbs_curve + +example_nurbs_curve - + -program~example_nurbs_curve->none~set~3 - - +program~example_nurbs_curve->none~set~2 + + program~shape_hexahedron - -shape_hexahedron + +shape_hexahedron program~shape_hexahedron->proc~set_hexahedron - - + + program~shape_tetragon - -shape_tetragon + +shape_tetragon program~shape_tetragon->proc~set_tetragon - - + + program~shape_circle - -shape_circle + +shape_circle program~shape_circle->proc~set_circle - - + + @@ -1400,7 +1400,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/compute_multiplicity2.html b/proc/compute_multiplicity2.html index a90da5122..a962e3eae 100644 --- a/proc/compute_multiplicity2.html +++ b/proc/compute_multiplicity2.html @@ -156,7 +156,7 @@

    Arguments

    @@ -171,7 +171,7 @@

    Arguments

    @@ -206,1096 +206,1096 @@

    Called by

    - - + + proc~~compute_multiplicity2~~CalledByGraph - + proc~compute_multiplicity2 - -compute_multiplicity2 + +compute_multiplicity2 interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity interface~compute_multiplicity->proc~compute_multiplicity2 - - + + proc~elevate_degree_a_5_9 - -elevate_degree_A_5_9 + +elevate_degree_A_5_9 proc~elevate_degree_a_5_9->interface~compute_multiplicity - - + + proc~get_continuity - - -nurbs_volume%get_continuity + + +nurbs_surface%get_continuity proc~get_continuity->interface~compute_multiplicity - - + + proc~get_continuity~2 - - -nurbs_surface%get_continuity + + +nurbs_curve%get_continuity proc~get_continuity~2->interface~compute_multiplicity - - + + proc~get_continuity~3 - - -nurbs_curve%get_continuity + + +nurbs_volume%get_continuity proc~get_continuity~3->interface~compute_multiplicity - - + + proc~get_multiplicity - - -nurbs_volume%get_multiplicity + + +nurbs_surface%get_multiplicity proc~get_multiplicity->interface~compute_multiplicity - - + + proc~get_multiplicity~2 - - -nurbs_surface%get_multiplicity + + +nurbs_curve%get_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity - - + + proc~get_multiplicity~3 - - -nurbs_curve%get_multiplicity + + +nurbs_volume%get_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity - - + + proc~get_nc - - -nurbs_volume%get_nc + + +nurbs_surface%get_nc proc~get_nc->interface~compute_multiplicity - - + + proc~get_nc~2 - - -nurbs_surface%get_nc + + +nurbs_curve%get_nc proc~get_nc~2->interface~compute_multiplicity - - + + proc~get_nc~3 - - -nurbs_curve%get_nc + + +nurbs_volume%get_nc proc~get_nc~3->interface~compute_multiplicity - - + + proc~insert_knots - - -nurbs_volume%insert_knots + + +nurbs_surface%insert_knots proc~insert_knots->interface~compute_multiplicity - - + + none~set - - -nurbs_volume%set + + +nurbs_surface%set proc~insert_knots->none~set - - + + proc~insert_knots~2 - - -nurbs_surface%insert_knots + + +nurbs_curve%insert_knots proc~insert_knots~2->interface~compute_multiplicity - - + + - + none~set~2 - - -nurbs_surface%set + + +nurbs_curve%set - + proc~insert_knots~2->none~set~2 - - + + proc~insert_knots~3 - - -nurbs_curve%insert_knots + + +nurbs_volume%insert_knots proc~insert_knots~3->interface~compute_multiplicity - - + + - + none~set~3 - - -nurbs_curve%set + + +nurbs_volume%set - + proc~insert_knots~3->none~set~3 - - + + proc~remove_knots - - -nurbs_volume%remove_knots + + +nurbs_surface%remove_knots proc~remove_knots->interface~compute_multiplicity - - + + proc~remove_knots->none~set - - + + proc~remove_knots~2 - - -nurbs_surface%remove_knots + + +nurbs_curve%remove_knots proc~remove_knots~2->interface~compute_multiplicity - - + + - + proc~remove_knots~2->none~set~2 - - + + proc~remove_knots~3 - - -nurbs_curve%remove_knots + + +nurbs_volume%remove_knots proc~remove_knots~3->interface~compute_multiplicity - - + + - + proc~remove_knots~3->none~set~3 - - + + proc~cmp_elem - - -nurbs_volume%cmp_elem + + +nurbs_surface%cmp_elem proc~cmp_elem->proc~get_multiplicity - - + + proc~cmp_elem~2 - - -nurbs_surface%cmp_elem + + +nurbs_curve%cmp_elem proc~cmp_elem~2->proc~get_multiplicity~2 - - + + proc~cmp_elem~3 - - -nurbs_curve%cmp_elem + + +nurbs_volume%cmp_elem - + proc~cmp_elem~3->proc~get_multiplicity~3 - - + + proc~elevate_degree - - -nurbs_volume%elevate_degree + + +nurbs_surface%elevate_degree proc~elevate_degree->proc~elevate_degree_a_5_9 - - + + proc~elevate_degree->none~set - - + + proc~elevate_degree~2 - - -nurbs_surface%elevate_degree + + +nurbs_curve%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 - - + + - + proc~elevate_degree~2->none~set~2 - - + + proc~elevate_degree~3 - - -nurbs_curve%elevate_degree + + +nurbs_volume%elevate_degree proc~elevate_degree~3->proc~elevate_degree_a_5_9 - - + + - + proc~elevate_degree~3->none~set~3 - - + + proc~get_degree - -nurbs_curve%get_degree + +nurbs_curve%get_degree - - -proc~get_degree->proc~get_multiplicity~3 - - + + +proc~get_degree->proc~get_multiplicity~2 + + proc~get_degree_all - - -nurbs_volume%get_degree_all + + +nurbs_surface%get_degree_all proc~get_degree_all->proc~get_multiplicity - - + + proc~get_degree_all~2 - - -nurbs_surface%get_degree_all + + +nurbs_volume%get_degree_all - - -proc~get_degree_all~2->proc~get_multiplicity~2 - - + + +proc~get_degree_all~2->proc~get_multiplicity~3 + + proc~get_degree_dir - - -nurbs_volume%get_degree_dir + + +nurbs_surface%get_degree_dir proc~get_degree_dir->proc~get_multiplicity - - + + proc~get_degree_dir~2 - - -nurbs_surface%get_degree_dir + + +nurbs_volume%get_degree_dir - - -proc~get_degree_dir~2->proc~get_multiplicity~2 - - + + +proc~get_degree_dir~2->proc~get_multiplicity~3 + + proc~set1 - - -nurbs_volume%set1 + + +nurbs_surface%set1 proc~set1->proc~get_nc - - + + none~get_degree - - -nurbs_volume%get_degree + + +nurbs_surface%get_degree proc~set1->none~get_degree - - + + - + -proc~set1~2 - - -nurbs_surface%set1 +proc~set1~3 + + +nurbs_volume%set1 - + -proc~set1~2->proc~get_nc~2 - - +proc~set1~3->proc~get_nc~3 + + - + -none~get_degree~2 - - -nurbs_surface%get_degree +none~get_degree~3 + + +nurbs_volume%get_degree - + -proc~set1~2->none~get_degree~2 - - +proc~set1~3->none~get_degree~3 + + proc~set2 - - -nurbs_volume%set2 + + +nurbs_surface%set2 proc~set2->proc~get_nc - - + + - + -proc~set2~2 - - -nurbs_surface%set2 +proc~set2~3 + + +nurbs_volume%set2 - + -proc~set2~2->proc~get_nc~2 - - +proc~set2~3->proc~get_nc~3 + + program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->proc~insert_knots~3 - - + + +program~example1_curve->proc~insert_knots~2 + + - - -program~example1_curve->proc~remove_knots~3 - - + + +program~example1_curve->proc~remove_knots~2 + + - - -program~example1_curve->proc~elevate_degree~3 - - + + +program~example1_curve->proc~elevate_degree~2 + + program~example1_curve->proc~get_degree - - + + - + -program~example1_curve->none~set~3 - - +program~example1_curve->none~set~2 + + program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~insert_knots~2 - - + + +program~example3_surface->proc~insert_knots + + - - -program~example3_surface->proc~remove_knots~2 - - + + +program~example3_surface->proc~remove_knots + + - - -program~example3_surface->proc~elevate_degree~2 - - + + +program~example3_surface->proc~elevate_degree + + - - -program~example3_surface->none~get_degree~2 - - + + +program~example3_surface->none~get_degree + + - - -program~example3_surface->none~set~2 - - + + +program~example3_surface->none~set + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~insert_knots - - + + +program~example3_volume->proc~insert_knots~3 + + - - -program~example3_volume->proc~remove_knots - - + + +program~example3_volume->proc~remove_knots~3 + + - - -program~example3_volume->proc~elevate_degree - - + + +program~example3_volume->proc~elevate_degree~3 + + - - -program~example3_volume->none~get_degree - - + + +program~example3_volume->none~get_degree~3 + + - - -program~example3_volume->none~set - - + + +program~example3_volume->none~set~3 + + none~get_degree->proc~get_degree_all - - + + none~get_degree->proc~get_degree_dir - - + + - + -none~get_degree~2->proc~get_degree_all~2 - - +none~get_degree~3->proc~get_degree_all~2 + + - + -none~get_degree~2->proc~get_degree_dir~2 - - +none~get_degree~3->proc~get_degree_dir~2 + + none~set->proc~set1 - - + + none~set->proc~set2 - - + + proc~set3 - - -nurbs_volume%set3 + + +nurbs_surface%set3 none~set->proc~set3 - - + + - + -none~set~2->proc~set1~2 - - +none~set~3->proc~set1~3 + + - + -none~set~2->proc~set2~2 - - +none~set~3->proc~set2~3 + + - + -proc~set3~2 - - -nurbs_surface%set3 +proc~set3~3 + + +nurbs_volume%set3 - + -none~set~2->proc~set3~2 - - +none~set~3->proc~set3~3 + + - + -proc~set1~3 - - -nurbs_curve%set1 +proc~set1~2 + + +nurbs_curve%set1 - + -proc~set1~3->proc~get_degree - - +proc~set1~2->proc~get_degree + + - + -proc~set3~3 - - -nurbs_curve%set3 +proc~set3~2 + + +nurbs_curve%set3 - + -proc~set3~3->proc~get_degree - - +proc~set3~2->proc~get_degree + + - + -none~set~3->proc~set1~3 - - +none~set~2->proc~set1~2 + + - + -none~set~3->proc~set3~3 - - +none~set~2->proc~set3~2 + + proc~modify_wc - - -nurbs_volume%modify_Wc + + +nurbs_surface%modify_Wc proc~modify_wc->none~set - - + + - + -proc~modify_wc~2 - - -nurbs_surface%modify_Wc +proc~modify_wc~3 + + +nurbs_volume%modify_Wc - - -proc~modify_wc~2->none~set~2 - - + + +proc~modify_wc~3->none~set~3 + + proc~modify_xc - - -nurbs_volume%modify_Xc + + +nurbs_surface%modify_Xc proc~modify_xc->none~set - - + + - + -proc~modify_xc~2 - - -nurbs_surface%modify_Xc +proc~modify_xc~3 + + +nurbs_volume%modify_Xc - - -proc~modify_xc~2->none~set~2 - - + + +proc~modify_xc~3->none~set~3 + + proc~set3->none~get_degree - - + + - + -proc~set3~2->none~get_degree~2 - - +proc~set3~3->none~get_degree~3 + + proc~set_hexahedron - -nurbs_volume%set_hexahedron + +nurbs_volume%set_hexahedron - - -proc~set_hexahedron->none~set - - + + +proc~set_hexahedron->none~set~3 + + proc~set_tetragon - -nurbs_surface%set_tetragon + +nurbs_surface%set_tetragon - - -proc~set_tetragon->none~set~2 - - + + +proc~set_tetragon->none~set + + program~example_morph - -example_morph + +example_morph - - -program~example_morph->none~set - - + + +program~example_morph->none~set~3 + + program~example_nurbs_surface - -example_nurbs_surface + +example_nurbs_surface - - -program~example_nurbs_surface->none~set~2 - - + + +program~example_nurbs_surface->none~set + + program~example_nurbs_volume - -example_nurbs_volume + +example_nurbs_volume - - -program~example_nurbs_volume->none~set - - + + +program~example_nurbs_volume->none~set~3 + + - + -proc~modify_wc~3 - - -nurbs_curve%modify_Wc +proc~modify_wc~2 + + +nurbs_curve%modify_Wc - + -proc~modify_wc~3->none~set~3 - - +proc~modify_wc~2->none~set~2 + + - + -proc~modify_xc~3 - - -nurbs_curve%modify_Xc +proc~modify_xc~2 + + +nurbs_curve%modify_Xc - + -proc~modify_xc~3->none~set~3 - - +proc~modify_xc~2->none~set~2 + + proc~set_circle - -nurbs_curve%set_circle + +nurbs_curve%set_circle - + -proc~set_circle->none~set~3 - - +proc~set_circle->none~set~2 + + program~example_nurbs_curve - -example_nurbs_curve + +example_nurbs_curve - + -program~example_nurbs_curve->none~set~3 - - +program~example_nurbs_curve->none~set~2 + + program~shape_hexahedron - -shape_hexahedron + +shape_hexahedron program~shape_hexahedron->proc~set_hexahedron - - + + program~shape_tetragon - -shape_tetragon + +shape_tetragon program~shape_tetragon->proc~set_tetragon - - + + program~shape_circle - -shape_circle + +shape_circle program~shape_circle->proc~set_circle - - + + @@ -1415,7 +1415,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/create.html b/proc/create.html index 71c6442f1..1f896b147 100644 --- a/proc/create.html +++ b/proc/create.html @@ -78,20 +78,20 @@

    create
  • 71 statements + title=" 1.6% of total for procedures.">60 statements
  • - Source File + Source File
  • -

    private pure subroutine create(this, res1, res2, res3, Xt1, Xt2, Xt3, Xt) +

    private pure subroutine create(this, res1, res2, Xt1, Xt2, Xt)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(in) @@ -193,181 +193,181 @@

    Calls

    - - + + proc~~cmp_elem~3~~CallsGraph - + proc~cmp_elem~3 - -nurbs_curve%cmp_elem + +nurbs_volume%cmp_elem interface~elemconn_cn - -elemConn_Cn + +elemConn_Cn proc~cmp_elem~3->interface~elemconn_cn - - + + interface~unique - -unique + +unique proc~cmp_elem~3->interface~unique - - + + proc~get_multiplicity~3 - - -nurbs_curve%get_multiplicity + + +nurbs_volume%get_multiplicity proc~cmp_elem~3->proc~get_multiplicity~3 - - + + proc~cmp_elemconn_cn_l - -cmp_elemConn_Cn_L + +cmp_elemConn_Cn_L interface~elemconn_cn->proc~cmp_elemconn_cn_l - - + + proc~cmp_elemconn_cn_s - -cmp_elemConn_Cn_S + +cmp_elemConn_Cn_S interface~elemconn_cn->proc~cmp_elemconn_cn_s - - + + proc~cmp_elemconn_cn_v - -cmp_elemConn_Cn_V + +cmp_elemConn_Cn_V interface~elemconn_cn->proc~cmp_elemconn_cn_v - - + + proc~unique_integer - -unique_integer + +unique_integer interface~unique->proc~unique_integer - - + + proc~unique_real - -unique_real + +unique_real interface~unique->proc~unique_real - - + + interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity - - + + proc~compute_multiplicity1 - -compute_multiplicity1 + +compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 - - + + proc~compute_multiplicity2 - -compute_multiplicity2 + +compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 - - + + @@ -487,7 +487,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/compute_knot_vector.html b/proc/compute_knot_vector.html index e82bb5d45..8a6b96785 100644 --- a/proc/compute_knot_vector.html +++ b/proc/compute_knot_vector.html @@ -171,7 +171,7 @@

    Arguments

    - + integer, intent(in)
    - + real(kind=rk), intent(in),
    - + real(kind=rk), intent(in),
    - + real(kind=rk), intent(in)
    @@ -159,7 +159,7 @@

    Arguments

    - - - - - - - - - - - - - - - - @@ -291,91 +261,106 @@

    Calls

    - - + + proc~~create~~CallsGraph - + proc~create - -nurbs_volume%create + +nurbs_surface%create interface~ndgrid - -ndgrid + +ndgrid proc~create->interface~ndgrid - - + + proc~basis_bspline - -basis_bspline + +basis_bspline proc~create->proc~basis_bspline - - + + - + +proc~is_rational + + +nurbs_surface%is_rational + + + + + +proc~create->proc~is_rational + + + + + proc~kron - - -kron + + +kron - + proc~create->proc~kron - - + + - + proc~ndgrid2 - - -ndgrid2 + + +ndgrid2 - + interface~ndgrid->proc~ndgrid2 - - + + - + proc~ndgrid3 - - -ndgrid3 + + +ndgrid3 - + interface~ndgrid->proc~ndgrid3 - - + + @@ -480,52 +465,52 @@

    Called by

    proc~create -nurbs_volume%create +nurbs_surface%create - + -program~example3_volume - +program~example3_surface + -example3_volume +example3_surface - + -program~example3_volume->proc~create +program~example3_surface->proc~create - + -program~example_nurbs_volume - +program~example_nurbs_surface + -example_nurbs_volume +example_nurbs_surface - + -program~example_nurbs_volume->proc~create +program~example_nurbs_surface->proc~create - + -program~shape_hexahedron - - -shape_hexahedron +program~shape_tetragon + + +shape_tetragon - + -program~shape_hexahedron->proc~create - - +program~shape_tetragon->proc~create + + @@ -641,7 +626,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/create~2.html b/proc/create~2.html index 0630e10d9..c6fa2bf54 100644 --- a/proc/create~2.html +++ b/proc/create~2.html @@ -78,20 +78,20 @@

    create
  • 60 statements + title=" 1.0% of total for procedures.">40 statements
  • - Source File + Source File
  • -

    private pure subroutine create(this, res1, res2, Xt1, Xt2, Xt) +

    private pure subroutine create(this, res, Xt)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - class(nurbs_volume), + class(nurbs_surface), intent(inout) @@ -201,21 +201,6 @@

    Arguments

    - - integer, - intent(in),optional - - ::res3 - -
    @@ -248,22 +233,7 @@

    Arguments

    - - real(kind=rk), - intent(in),optional, - contiguous - ::Xt3(:) - -
    - + real(kind=rk), intent(in),
    @@ -158,8 +158,8 @@

    Arguments

    @@ -181,52 +181,7 @@

    Arguments

    - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -241,7 +196,7 @@

    Arguments

    contiguous - + @@ -261,106 +216,46 @@

    Calls

    - - + + proc~~create~2~~CallsGraph - + proc~create~2 - -nurbs_surface%create - - - -interface~ndgrid - - -ndgrid - - - - - -proc~create~2->interface~ndgrid - - + +nurbs_curve%create - + proc~basis_bspline - - -basis_bspline + + +basis_bspline - + proc~create~2->proc~basis_bspline - - + + - + proc~is_rational~2 - - -nurbs_surface%is_rational + + +nurbs_curve%is_rational - + proc~create~2->proc~is_rational~2 - - - - - -proc~kron - - -kron - - - - - -proc~create~2->proc~kron - - - - - -proc~ndgrid2 - - -ndgrid2 - - - - - -interface~ndgrid->proc~ndgrid2 - - - - - -proc~ndgrid3 - - -ndgrid3 - - - - - -interface~ndgrid->proc~ndgrid3 - - + + @@ -456,61 +351,61 @@

    Called by

    - + proc~~create~2~~CalledByGraph - + proc~create~2 - -nurbs_surface%create + +nurbs_curve%create - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->proc~create~2 - - +program~example1_curve->proc~create~2 + + - + -program~example_nurbs_surface - - -example_nurbs_surface +program~example_nurbs_curve + + +example_nurbs_curve - + -program~example_nurbs_surface->proc~create~2 - - +program~example_nurbs_curve->proc~create~2 + + - + -program~shape_tetragon - - -shape_tetragon +program~shape_circle + + +shape_circle - + -program~shape_tetragon->proc~create~2 - - +program~shape_circle->proc~create~2 + + @@ -626,7 +521,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/create~3.html b/proc/create~3.html index 2c453090b..fc31fc5eb 100644 --- a/proc/create~3.html +++ b/proc/create~3.html @@ -78,20 +78,20 @@

    create
  • 40 statements + title=" 1.8% of total for procedures.">71 statements
  • - Source File + Source File
  • -

    private pure subroutine create(this, res, Xt) +

    private pure subroutine create(this, res1, res2, res3, Xt1, Xt2, Xt3, Xt)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in), ::res1 - -
    - - integer, - intent(in),optional - - ::res2 - -
    - - real(kind=rk), - intent(in),optional, - contiguous - ::Xt1(:) - -
    - - real(kind=rk), - intent(in),optional, - contiguous - ::Xt2(:)res ::Xt(:,:)Xt(:)
    @@ -158,8 +158,8 @@

    Arguments

    @@ -181,14 +181,89 @@

    Arguments

    - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -196,7 +271,7 @@

    Arguments

    contiguous - + @@ -216,46 +291,91 @@

    Calls

    - - + + proc~~create~3~~CallsGraph - + proc~create~3 - -nurbs_curve%create + +nurbs_volume%create - + -proc~basis_bspline - - -basis_bspline +interface~ndgrid + + +ndgrid - + -proc~create~3->proc~basis_bspline - - +proc~create~3->interface~ndgrid + + - + -proc~is_rational~3 - - -nurbs_curve%is_rational +proc~basis_bspline + + +basis_bspline - + -proc~create~3->proc~is_rational~3 - - +proc~create~3->proc~basis_bspline + + + + + +proc~kron + + +kron + + + + + +proc~create~3->proc~kron + + + + + +proc~ndgrid2 + + +ndgrid2 + + + + + +interface~ndgrid->proc~ndgrid2 + + + + + +proc~ndgrid3 + + +ndgrid3 + + + + + +interface~ndgrid->proc~ndgrid3 + + @@ -351,61 +471,61 @@

    Called by

    - + proc~~create~3~~CalledByGraph - + proc~create~3 - -nurbs_curve%create + +nurbs_volume%create - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->proc~create~3 - - +program~example3_volume->proc~create~3 + + - + -program~example_nurbs_curve - - -example_nurbs_curve +program~example_nurbs_volume + + +example_nurbs_volume - + -program~example_nurbs_curve->proc~create~3 - - +program~example_nurbs_volume->proc~create~3 + + - + -program~shape_circle - - -shape_circle +program~shape_hexahedron + + +shape_hexahedron - + -program~shape_circle->proc~create~3 - - +program~shape_hexahedron->proc~create~3 + + @@ -521,7 +641,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/derivative.html b/proc/derivative.html index 4d7f54b1f..8c0ae9d25 100644 --- a/proc/derivative.html +++ b/proc/derivative.html @@ -78,20 +78,20 @@

    derivative
  • 57 statements + title=" 1.2% of total for procedures.">46 statements
  • - Source File + Source File
  • -

    private pure subroutine derivative(this, res1, res2, res3, Xt1, Xt2, Xt3, dTgc) +

    private pure subroutine derivative(this, res1, res2, Xt1, Xt2, dTgc)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in), ::resres1
    - + + integer, + intent(in),optional + + ::res2 + +
    + + integer, + intent(in),optional + + ::res3 + +
    + + real(kind=rk), + intent(in),optional, + contiguous + ::Xt1(:) + +
    + + real(kind=rk), + intent(in),optional, + contiguous + ::Xt2(:) + +
    + + real(kind=rk), + intent(in),optional, + contiguous + ::Xt3(:) + +
    + real(kind=rk), intent(in), ::Xt(:)Xt(:,:)
    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - - - - - - - - -
    - - class(nurbs_volume), + + class(nurbs_surface), intent(inout) @@ -201,21 +201,6 @@

    Arguments

    - - integer, - intent(in),optional - - ::res3 - -
    @@ -246,21 +231,6 @@

    Arguments

    - - real(kind=rk), - intent(in),optional, - contiguous - ::Xt3(:) - -
    @@ -291,106 +261,121 @@

    Calls

    - - + + proc~~derivative~~CallsGraph - + proc~derivative - -nurbs_volume%derivative + +nurbs_surface%derivative interface~ndgrid - -ndgrid + +ndgrid proc~derivative->interface~ndgrid - - + + proc~basis_bspline_der - -basis_bspline_der + +basis_bspline_der proc~derivative->proc~basis_bspline_der - - + + - + +proc~is_rational + + +nurbs_surface%is_rational + + + + + +proc~derivative->proc~is_rational + + + + + proc~kron - - -kron + + +kron - + proc~derivative->proc~kron - - + + - + proc~ndgrid2 - - -ndgrid2 + + +ndgrid2 - + interface~ndgrid->proc~ndgrid2 - - + + - + proc~ndgrid3 - - -ndgrid3 + + +ndgrid3 - + interface~ndgrid->proc~ndgrid3 - - + + - + proc~isinf - - -isinf + + +isinf - + proc~basis_bspline_der->proc~isinf - - + + @@ -506,7 +491,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/derivative~2.html b/proc/derivative~2.html index f5c1fe1d5..78de22075 100644 --- a/proc/derivative~2.html +++ b/proc/derivative~2.html @@ -78,20 +78,20 @@

    derivative
  • 46 statements + title=" 0.8% of total for procedures.">29 statements
  • - Source File + Source File
  • -

    private pure subroutine derivative(this, res1, res2, Xt1, Xt2, dTgc) +

    private pure subroutine derivative(this, res, Xt, dTgc)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -181,29 +181,14 @@

    Arguments

    - + - - - - - - - - @@ -211,22 +196,7 @@

    Arguments

    contiguous - - - - - - - - - + @@ -261,121 +231,61 @@

    Calls

    - - + + proc~~derivative~2~~CallsGraph - + proc~derivative~2 - -nurbs_surface%derivative - - - -interface~ndgrid - - -ndgrid - - - - - -proc~derivative~2->interface~ndgrid - - + +nurbs_curve%derivative - + proc~basis_bspline_der - - -basis_bspline_der + + +basis_bspline_der - + proc~derivative~2->proc~basis_bspline_der - - + + - + proc~is_rational~2 - - -nurbs_surface%is_rational + + +nurbs_curve%is_rational - + proc~derivative~2->proc~is_rational~2 - - - - - -proc~kron - - -kron - - - - - -proc~derivative~2->proc~kron - - - - - -proc~ndgrid2 - - -ndgrid2 - - - - - -interface~ndgrid->proc~ndgrid2 - - - - - -proc~ndgrid3 - - -ndgrid3 - - - - - -interface~ndgrid->proc~ndgrid3 - - + + - + proc~isinf - - -isinf + + +isinf - + proc~basis_bspline_der->proc~isinf - - + + @@ -491,7 +401,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/derivative~3.html b/proc/derivative~3.html index 96057ecd4..4c102c6b0 100644 --- a/proc/derivative~3.html +++ b/proc/derivative~3.html @@ -78,20 +78,20 @@

    derivative
  • 29 statements + title=" 1.5% of total for procedures.">57 statements
  • - Source File + Source File
  • @@ -137,13 +137,13 @@

    Contents

    -

    private pure subroutine derivative(this, res, Xt, dTgc) +

    private pure subroutine derivative(this, res1, res2, res3, Xt1, Xt2, Xt3, dTgc)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in), ::res1res
    - - integer, - intent(in),optional - - ::res2 - -
    - + real(kind=rk), intent(in), ::Xt1(:) - -
    - - real(kind=rk), - intent(in),optional, - contiguous - ::Xt2(:)Xt(:)
    @@ -158,8 +158,8 @@

    Arguments

    @@ -181,14 +181,59 @@

    Arguments

    - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -196,7 +241,22 @@

    Arguments

    contiguous - + + + + + + + + + @@ -231,61 +291,106 @@

    Calls

    - - + + proc~~derivative~3~~CallsGraph - + proc~derivative~3 - -nurbs_curve%derivative + +nurbs_volume%derivative - + -proc~basis_bspline_der - - -basis_bspline_der +interface~ndgrid + + +ndgrid - + -proc~derivative~3->proc~basis_bspline_der - - +proc~derivative~3->interface~ndgrid + + - + -proc~is_rational~3 - - -nurbs_curve%is_rational +proc~basis_bspline_der + + +basis_bspline_der - + -proc~derivative~3->proc~is_rational~3 - - +proc~derivative~3->proc~basis_bspline_der + + - + +proc~kron + + +kron + + + + + +proc~derivative~3->proc~kron + + + + + +proc~ndgrid2 + + +ndgrid2 + + + + + +interface~ndgrid->proc~ndgrid2 + + + + + +proc~ndgrid3 + + +ndgrid3 + + + + + +interface~ndgrid->proc~ndgrid3 + + + + + proc~isinf - - -isinf + + +isinf - + proc~basis_bspline_der->proc~isinf - - + + @@ -401,7 +506,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/elevate_degree.html b/proc/elevate_degree.html index 60b31a8ea..9c873e593 100644 --- a/proc/elevate_degree.html +++ b/proc/elevate_degree.html @@ -78,20 +78,20 @@

    elevate_degree
  • 118 statements + title=" 2.0% of total for procedures.">77 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine elevate_degree(this, dir, t)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in), ::resres1
    - + + integer, + intent(in),optional + + ::res2 + +
    + + integer, + intent(in),optional + + ::res3 + +
    + + real(kind=rk), + intent(in),optional, + contiguous + ::Xt1(:) + +
    + real(kind=rk), intent(in), ::Xt(:)Xt2(:) + +
    + + real(kind=rk), + intent(in),optional, + contiguous + ::Xt3(:)
    @@ -158,8 +158,8 @@

    Arguments

    @@ -188,7 +188,7 @@

    Arguments

    @@ -217,300 +217,315 @@

    Calls

    --> - + viewBox="0.00 0.00 641.00 102.79" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + proc~~elevate_degree~~CallsGraph - + proc~elevate_degree - -nurbs_volume%elevate_degree + +nurbs_surface%elevate_degree none~set - - -nurbs_volume%set + + +nurbs_surface%set proc~elevate_degree->none~set - - + + proc~elevate_degree_a_5_9 - -elevate_degree_A_5_9 + +elevate_degree_A_5_9 proc~elevate_degree->proc~elevate_degree_a_5_9 - - + + + + + +proc~is_rational + + +nurbs_surface%is_rational + + + + + +proc~elevate_degree->proc~is_rational + + - + proc~set1 - - -nurbs_volume%set1 + + +nurbs_surface%set1 - + none~set->proc~set1 - - + + - + proc~set2 - - -nurbs_volume%set2 + + +nurbs_surface%set2 - + none~set->proc~set2 - - + + - + proc~set3 - - -nurbs_volume%set3 + + +nurbs_surface%set3 - + none~set->proc~set3 - - + + - + interface~compute_multiplicity - - -compute_multiplicity + + +compute_multiplicity - + proc~elevate_degree_a_5_9->interface~compute_multiplicity - - + + - + proc~bincoeff - - -bincoeff + + +bincoeff - + proc~elevate_degree_a_5_9->proc~bincoeff - - + + - + proc~compute_multiplicity1 - - -compute_multiplicity1 + + +compute_multiplicity1 - + interface~compute_multiplicity->proc~compute_multiplicity1 - - + + - + proc~compute_multiplicity2 - - -compute_multiplicity2 + + +compute_multiplicity2 - + interface~compute_multiplicity->proc~compute_multiplicity2 - - + + - + proc~factln - - -factln + + +factln - + proc~bincoeff->proc~factln - - + + - + none~get_degree - - -nurbs_volume%get_degree + + +nurbs_surface%get_degree - + proc~set1->none~get_degree - - + + - + proc~get_nc - - -nurbs_volume%get_nc + + +nurbs_surface%get_nc - + proc~set1->proc~get_nc - - + + - + proc~compute_knot_vector - - -compute_knot_vector + + +compute_knot_vector - + proc~set2->proc~compute_knot_vector - - + + - + proc~set2->proc~get_nc - - + + - + proc~set3->none~get_degree - - + + - + proc~get_degree_all - - -nurbs_volume%get_degree_all + + +nurbs_surface%get_degree_all - + none~get_degree->proc~get_degree_all - - + + - + proc~get_degree_dir - - -nurbs_volume%get_degree_dir + + +nurbs_surface%get_degree_dir - + none~get_degree->proc~get_degree_dir - - + + - + proc~repelem - - -repelem + + +repelem - + proc~compute_knot_vector->proc~repelem - - + + - + proc~get_nc->interface~compute_multiplicity - - + + - + proc~get_multiplicity - - -nurbs_volume%get_multiplicity + + +nurbs_surface%get_multiplicity - + proc~get_degree_all->proc~get_multiplicity - - + + - + proc~get_degree_dir->proc~get_multiplicity - - + + - + proc~get_multiplicity->interface~compute_multiplicity - - + + @@ -619,20 +634,20 @@

    Called by

    proc~elevate_degree -nurbs_volume%elevate_degree +nurbs_surface%elevate_degree - + -program~example3_volume - +program~example3_surface + -example3_volume +example3_surface - + -program~example3_volume->proc~elevate_degree +program~example3_surface->proc~elevate_degree @@ -750,7 +765,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/elevate_degree_a_5_9.html b/proc/elevate_degree_a_5_9.html index 5b0e947f3..a4b61e9e0 100644 --- a/proc/elevate_degree_a_5_9.html +++ b/proc/elevate_degree_a_5_9.html @@ -78,7 +78,7 @@

    elevate_degree_A_5_9
  • 155 statements + title=" 4.0% of total for procedures.">155 statements
  • @@ -156,7 +156,7 @@

    Arguments

  • @@ -171,7 +171,7 @@

    Arguments

    @@ -186,7 +186,7 @@

    Arguments

    @@ -201,7 +201,7 @@

    Arguments

    @@ -216,7 +216,7 @@

    Arguments

    @@ -231,7 +231,7 @@

    Arguments

    @@ -246,7 +246,7 @@

    Arguments

    @@ -468,9 +468,9 @@

    Called by

    proc~elevate_degree - + -nurbs_volume%elevate_degree +nurbs_surface%elevate_degree @@ -483,24 +483,24 @@

    Called by

    proc~elevate_degree~2 - - -nurbs_surface%elevate_degree + + +nurbs_curve%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 - - + + proc~elevate_degree~3 - - -nurbs_curve%elevate_degree + + +nurbs_volume%elevate_degree @@ -514,46 +514,46 @@

    Called by

    program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->proc~elevate_degree~3 - - + + +program~example1_curve->proc~elevate_degree~2 + + program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~elevate_degree~2 - - + + +program~example3_surface->proc~elevate_degree + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~elevate_degree - - + + +program~example3_volume->proc~elevate_degree~3 + + @@ -669,7 +669,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/elevate_degree~2.html b/proc/elevate_degree~2.html index 5be923192..cd7b9683f 100644 --- a/proc/elevate_degree~2.html +++ b/proc/elevate_degree~2.html @@ -78,20 +78,20 @@

    elevate_degree
  • 77 statements + title=" 0.7% of total for procedures.">28 statements
  • - Source File + Source File
  • @@ -137,13 +137,13 @@

    Contents

    -

    private pure subroutine elevate_degree(this, dir, t) +

    private pure subroutine elevate_degree(this, t)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in)
    - + integer, intent(in)
    - + integer, intent(in)
    - + real(kind=rk), intent(in),
    - + integer, intent(in)
    - + real(kind=rk), intent(in),
    - + integer, intent(out)
    - + real(kind=rk), intent(out),
    - + real(kind=rk), intent(out),
    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - -
    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -171,21 +171,6 @@

    Arguments

    - - integer, - intent(in) - - ::dir - -
    @@ -216,316 +201,253 @@

    Calls

    - - + + proc~~elevate_degree~2~~CallsGraph - + proc~elevate_degree~2 - -nurbs_surface%elevate_degree + +nurbs_curve%elevate_degree none~set~2 - - -nurbs_surface%set + + +nurbs_curve%set proc~elevate_degree~2->none~set~2 - - + + proc~elevate_degree_a_5_9 - -elevate_degree_A_5_9 + +elevate_degree_A_5_9 proc~elevate_degree~2->proc~elevate_degree_a_5_9 - - + + proc~is_rational~2 - - -nurbs_surface%is_rational + + +nurbs_curve%is_rational proc~elevate_degree~2->proc~is_rational~2 - - + + proc~set1~2 - - -nurbs_surface%set1 + + +nurbs_curve%set1 none~set~2->proc~set1~2 - - + + proc~set2~2 - - -nurbs_surface%set2 + + +nurbs_curve%set2 none~set~2->proc~set2~2 - - + + proc~set3~2 - - -nurbs_surface%set3 + + +nurbs_curve%set3 none~set~2->proc~set3~2 - - + + interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity proc~elevate_degree_a_5_9->interface~compute_multiplicity - - + + proc~bincoeff - -bincoeff + +bincoeff proc~elevate_degree_a_5_9->proc~bincoeff - - + + - + proc~compute_multiplicity1 - - -compute_multiplicity1 + + +compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 - - + + - + proc~compute_multiplicity2 - - -compute_multiplicity2 + + +compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 - - + + - + proc~factln - - -factln + + +factln proc~bincoeff->proc~factln - - + + - - -none~get_degree~2 - - -nurbs_surface%get_degree + + +proc~get_degree + + +nurbs_curve%get_degree - + -proc~set1~2->none~get_degree~2 - - - - - -proc~get_nc~2 - - -nurbs_surface%get_nc - - - - - -proc~set1~2->proc~get_nc~2 - - +proc~set1~2->proc~get_degree + + - + proc~compute_knot_vector - - -compute_knot_vector + + +compute_knot_vector - + proc~set2~2->proc~compute_knot_vector - - - - - -proc~set2~2->proc~get_nc~2 - - - - - -proc~set3~2->none~get_degree~2 - - - - - -proc~get_degree_all~2 - - -nurbs_surface%get_degree_all - - + + - - -none~get_degree~2->proc~get_degree_all~2 - - - - - -proc~get_degree_dir~2 - - -nurbs_surface%get_degree_dir - - - - - -none~get_degree~2->proc~get_degree_dir~2 - - + + +proc~set3~2->proc~get_degree + + - + proc~repelem - - -repelem + + +repelem - + proc~compute_knot_vector->proc~repelem - - - - - -proc~get_nc~2->interface~compute_multiplicity - - + + - + proc~get_multiplicity~2 - - -nurbs_surface%get_multiplicity + + +nurbs_curve%get_multiplicity - - -proc~get_degree_all~2->proc~get_multiplicity~2 - - - - - -proc~get_degree_dir~2->proc~get_multiplicity~2 - - + + +proc~get_degree->proc~get_multiplicity~2 + + - + proc~get_multiplicity~2->interface~compute_multiplicity - - + + @@ -625,31 +547,31 @@

    Called by

    - + proc~~elevate_degree~2~~CalledByGraph - + proc~elevate_degree~2 - -nurbs_surface%elevate_degree + +nurbs_curve%elevate_degree - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->proc~elevate_degree~2 - - +program~example1_curve->proc~elevate_degree~2 + + @@ -765,7 +687,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/elevate_degree~3.html b/proc/elevate_degree~3.html index 19866ee9a..77afb3bf9 100644 --- a/proc/elevate_degree~3.html +++ b/proc/elevate_degree~3.html @@ -78,20 +78,20 @@

    elevate_degree
  • 28 statements + title=" 3.1% of total for procedures.">118 statements
  • - Source File + Source File
  • @@ -137,13 +137,13 @@

    Contents

    -

    private pure subroutine elevate_degree(this, t) +

    private pure subroutine elevate_degree(this, dir, t)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    + + + + + + + +
    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -171,6 +171,21 @@

    Arguments

    + + integer, + intent(in) + + ::dir + +
    @@ -201,253 +216,301 @@

    Calls

    - - + + proc~~elevate_degree~3~~CallsGraph - + proc~elevate_degree~3 - -nurbs_curve%elevate_degree + +nurbs_volume%elevate_degree none~set~3 - - -nurbs_curve%set + + +nurbs_volume%set proc~elevate_degree~3->none~set~3 - - + + proc~elevate_degree_a_5_9 - -elevate_degree_A_5_9 + +elevate_degree_A_5_9 proc~elevate_degree~3->proc~elevate_degree_a_5_9 - - - - - -proc~is_rational~3 - - -nurbs_curve%is_rational - - - - - -proc~elevate_degree~3->proc~is_rational~3 - - + + - + proc~set1~3 - - -nurbs_curve%set1 + + +nurbs_volume%set1 - + none~set~3->proc~set1~3 - - + + - + proc~set2~3 - - -nurbs_curve%set2 + + +nurbs_volume%set2 - + none~set~3->proc~set2~3 - - + + - + proc~set3~3 - - -nurbs_curve%set3 + + +nurbs_volume%set3 - + none~set~3->proc~set3~3 - - + + - + interface~compute_multiplicity - - -compute_multiplicity + + +compute_multiplicity - + proc~elevate_degree_a_5_9->interface~compute_multiplicity - - + + - + proc~bincoeff - - -bincoeff + + +bincoeff - + proc~elevate_degree_a_5_9->proc~bincoeff - - + + proc~compute_multiplicity1 - -compute_multiplicity1 + +compute_multiplicity1 - + interface~compute_multiplicity->proc~compute_multiplicity1 - - + + proc~compute_multiplicity2 - -compute_multiplicity2 + +compute_multiplicity2 - + interface~compute_multiplicity->proc~compute_multiplicity2 - - + + proc~factln - -factln + +factln - + proc~bincoeff->proc~factln - - + + - + + +none~get_degree~3 + + +nurbs_volume%get_degree + + + + + +proc~set1~3->none~get_degree~3 + + + + -proc~get_degree - - -nurbs_curve%get_degree +proc~get_nc~3 + + +nurbs_volume%get_nc - + -proc~set1~3->proc~get_degree - - +proc~set1~3->proc~get_nc~3 + + proc~compute_knot_vector - -compute_knot_vector + +compute_knot_vector proc~set2~3->proc~compute_knot_vector - - + + - + -proc~set3~3->proc~get_degree - - +proc~set2~3->proc~get_nc~3 + + - + + +proc~set3~3->none~get_degree~3 + + + + + +proc~get_degree_all~2 + + +nurbs_volume%get_degree_all + + + + + +none~get_degree~3->proc~get_degree_all~2 + + + + +proc~get_degree_dir~2 + + +nurbs_volume%get_degree_dir + + + + + +none~get_degree~3->proc~get_degree_dir~2 + + + + + proc~repelem - - -repelem + + +repelem - + proc~compute_knot_vector->proc~repelem - - + + + + + +proc~get_nc~3->interface~compute_multiplicity + + - + proc~get_multiplicity~3 - - -nurbs_curve%get_multiplicity + + +nurbs_volume%get_multiplicity - - -proc~get_degree->proc~get_multiplicity~3 - - + + +proc~get_degree_all~2->proc~get_multiplicity~3 + + + + + +proc~get_degree_dir~2->proc~get_multiplicity~3 + + - + proc~get_multiplicity~3->interface~compute_multiplicity - - + + @@ -547,31 +610,31 @@

    Called by

    - + proc~~elevate_degree~3~~CalledByGraph - + proc~elevate_degree~3 - -nurbs_curve%elevate_degree + +nurbs_volume%elevate_degree - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->proc~elevate_degree~3 - - +program~example3_volume->proc~elevate_degree~3 + + @@ -687,7 +750,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/export_xc.html b/proc/export_xc.html index b31f5fb32..c656463db 100644 --- a/proc/export_xc.html +++ b/proc/export_xc.html @@ -83,15 +83,15 @@

    export_Xc
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private impure subroutine export_Xc(this, filename)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -4904,14 +5894,29 @@

    Arguments

    - + + + + + + + + + @@ -4919,6 +5924,11 @@

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -210,14 +210,14 @@

    Calls

    proc~export_xc -nurbs_volume%export_Xc +nurbs_surface%export_Xc proc~cmp_elem_xc_vis - + -nurbs_volume%cmp_elem_Xc_vis +nurbs_surface%cmp_elem_Xc_vis @@ -385,76 +385,61 @@

    Called by

    - - + + proc~~export_xc~~CalledByGraph - + proc~export_xc - -nurbs_volume%export_Xc + +nurbs_surface%export_Xc - + -program~example3_volume - - -example3_volume +program~example3_surface + + +example3_surface - + -program~example3_volume->proc~export_xc - - +program~example3_surface->proc~export_xc + + - + -program~example_morph - - -example_morph +program~example_nurbs_surface + + +example_nurbs_surface - + -program~example_morph->proc~export_xc - - +program~example_nurbs_surface->proc~export_xc + + - + -program~example_nurbs_volume - - -example_nurbs_volume +program~shape_tetragon + + +shape_tetragon - + -program~example_nurbs_volume->proc~export_xc - - - - - -program~shape_hexahedron - - -shape_hexahedron - - - - - -program~shape_hexahedron->proc~export_xc - - +program~shape_tetragon->proc~export_xc + + @@ -570,7 +555,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/export_xc~2.html b/proc/export_xc~2.html index 27011a72e..52c100311 100644 --- a/proc/export_xc~2.html +++ b/proc/export_xc~2.html @@ -83,15 +83,15 @@

    export_Xc
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private impure subroutine export_Xc(this, filename)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -4825,14 +5810,14 @@

    Arguments

    - + @@ -4840,6 +5825,11 @@

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(in) @@ -201,91 +201,91 @@

    Calls

    - - + + proc~~export_xc~2~~CallsGraph - + proc~export_xc~2 - -nurbs_surface%export_Xc + +nurbs_curve%export_Xc proc~cmp_elem_xc_vis~2 - - -nurbs_surface%cmp_elem_Xc_vis + + +nurbs_curve%cmp_elem_Xc_vis proc~export_xc~2->proc~cmp_elem_xc_vis~2 - - + + interface~elemconn_c0 - -elemConn_C0 + +elemConn_C0 proc~cmp_elem_xc_vis~2->interface~elemconn_c0 - - + + proc~cmp_elemconn_c0_l - -cmp_elemConn_C0_L + +cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l - - + + proc~cmp_elemconn_c0_s - -cmp_elemConn_C0_S + +cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s - - + + proc~cmp_elemconn_c0_v - -cmp_elemConn_C0_V + +cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v - - + + @@ -385,61 +385,61 @@

    Called by

    - + proc~~export_xc~2~~CalledByGraph - + proc~export_xc~2 - -nurbs_surface%export_Xc + +nurbs_curve%export_Xc - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->proc~export_xc~2 - - +program~example1_curve->proc~export_xc~2 + + - + -program~example_nurbs_surface - - -example_nurbs_surface +program~example_nurbs_curve + + +example_nurbs_curve - + -program~example_nurbs_surface->proc~export_xc~2 - - +program~example_nurbs_curve->proc~export_xc~2 + + - + -program~shape_tetragon - - -shape_tetragon +program~shape_circle + + +shape_circle - + -program~shape_tetragon->proc~export_xc~2 - - +program~shape_circle->proc~export_xc~2 + + @@ -555,7 +555,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/export_xc~3.html b/proc/export_xc~3.html index 04c01856e..d9583b397 100644 --- a/proc/export_xc~3.html +++ b/proc/export_xc~3.html @@ -83,15 +83,15 @@

    export_Xc
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private impure subroutine export_Xc(this, filename)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - - - - - - - - - - + @@ -4761,6 +5741,11 @@

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(in) @@ -201,91 +201,91 @@

    Calls

    - - + + proc~~export_xc~3~~CallsGraph - + proc~export_xc~3 - -nurbs_curve%export_Xc + +nurbs_volume%export_Xc proc~cmp_elem_xc_vis~3 - - -nurbs_curve%cmp_elem_Xc_vis + + +nurbs_volume%cmp_elem_Xc_vis proc~export_xc~3->proc~cmp_elem_xc_vis~3 - - + + interface~elemconn_c0 - -elemConn_C0 + +elemConn_C0 proc~cmp_elem_xc_vis~3->interface~elemconn_c0 - - + + proc~cmp_elemconn_c0_l - -cmp_elemConn_C0_L + +cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l - - + + proc~cmp_elemconn_c0_s - -cmp_elemConn_C0_S + +cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s - - + + proc~cmp_elemconn_c0_v - -cmp_elemConn_C0_V + +cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v - - + + @@ -385,61 +385,76 @@

    Called by

    - - + + proc~~export_xc~3~~CalledByGraph - + proc~export_xc~3 - -nurbs_curve%export_Xc + +nurbs_volume%export_Xc - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->proc~export_xc~3 - - +program~example3_volume->proc~export_xc~3 + + - + -program~example_nurbs_curve - - -example_nurbs_curve +program~example_morph + + +example_morph - + -program~example_nurbs_curve->proc~export_xc~3 - - +program~example_morph->proc~export_xc~3 + + - + -program~shape_circle - - -shape_circle +program~example_nurbs_volume + + +example_nurbs_volume - + -program~shape_circle->proc~export_xc~3 - - +program~example_nurbs_volume->proc~export_xc~3 + + + + + +program~shape_hexahedron + + +shape_hexahedron + + + + + +program~shape_hexahedron->proc~export_xc~3 + + @@ -555,7 +570,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/export_xg.html b/proc/export_xg.html index 2de138f17..91ff863dc 100644 --- a/proc/export_xg.html +++ b/proc/export_xg.html @@ -83,15 +83,15 @@

    export_Xg
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private impure subroutine export_Xg(this, filename)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -4622,14 +5642,14 @@

    Arguments

    - + - + @@ -4639,27 +5659,12 @@

    Arguments

    integer, - + - - - - - - - - - + @@ -4667,6 +5672,11 @@

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -210,14 +210,14 @@

    Calls

    proc~export_xg -nurbs_volume%export_Xg +nurbs_surface%export_Xg proc~cmp_elem_xg_vis - + -nurbs_volume%cmp_elem_Xg_vis +nurbs_surface%cmp_elem_Xg_vis @@ -385,76 +385,61 @@

    Called by

    - - + + proc~~export_xg~~CalledByGraph - + proc~export_xg - -nurbs_volume%export_Xg + +nurbs_surface%export_Xg - + -program~example3_volume - - -example3_volume +program~example3_surface + + +example3_surface - + -program~example3_volume->proc~export_xg - - +program~example3_surface->proc~export_xg + + - + -program~example_morph - - -example_morph +program~example_nurbs_surface + + +example_nurbs_surface - + -program~example_morph->proc~export_xg - - +program~example_nurbs_surface->proc~export_xg + + - + -program~example_nurbs_volume - - -example_nurbs_volume +program~shape_tetragon + + +shape_tetragon - + -program~example_nurbs_volume->proc~export_xg - - - - - -program~shape_hexahedron - - -shape_hexahedron - - - - - -program~shape_hexahedron->proc~export_xg - - +program~shape_tetragon->proc~export_xg + + @@ -570,7 +555,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/export_xg~2.html b/proc/export_xg~2.html index f03682d60..6a10d761e 100644 --- a/proc/export_xg~2.html +++ b/proc/export_xg~2.html @@ -83,15 +83,15 @@

    export_Xg
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private impure subroutine export_Xg(this, filename)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -4545,12 +5560,12 @@

    Arguments

    integer, - + - + @@ -4558,6 +5573,11 @@

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(in) @@ -201,91 +201,91 @@

    Calls

    - - + + proc~~export_xg~2~~CallsGraph - + proc~export_xg~2 - -nurbs_surface%export_Xg + +nurbs_curve%export_Xg proc~cmp_elem_xg_vis~2 - - -nurbs_surface%cmp_elem_Xg_vis + + +nurbs_curve%cmp_elem_Xg_vis proc~export_xg~2->proc~cmp_elem_xg_vis~2 - - + + interface~elemconn_c0 - -elemConn_C0 + +elemConn_C0 proc~cmp_elem_xg_vis~2->interface~elemconn_c0 - - + + proc~cmp_elemconn_c0_l - -cmp_elemConn_C0_L + +cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l - - + + proc~cmp_elemconn_c0_s - -cmp_elemConn_C0_S + +cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s - - + + proc~cmp_elemconn_c0_v - -cmp_elemConn_C0_V + +cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v - - + + @@ -385,61 +385,61 @@

    Called by

    - + proc~~export_xg~2~~CalledByGraph - + proc~export_xg~2 - -nurbs_surface%export_Xg + +nurbs_curve%export_Xg - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->proc~export_xg~2 - - +program~example1_curve->proc~export_xg~2 + + - + -program~example_nurbs_surface - - -example_nurbs_surface +program~example_nurbs_curve + + +example_nurbs_curve - + -program~example_nurbs_surface->proc~export_xg~2 - - +program~example_nurbs_curve->proc~export_xg~2 + + - + -program~shape_tetragon - - -shape_tetragon +program~shape_circle + + +shape_circle - + -program~shape_tetragon->proc~export_xg~2 - - +program~shape_circle->proc~export_xg~2 + + @@ -555,7 +555,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/export_xg~3.html b/proc/export_xg~3.html index 1dd7d6fd1..b8b0bff2c 100644 --- a/proc/export_xg~3.html +++ b/proc/export_xg~3.html @@ -83,15 +83,15 @@

    export_Xg
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private impure subroutine export_Xg(this, filename)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -4459,26 +5484,16 @@

    Arguments

    - - - - - - - -
    - - class(nurbs_curve), + + class(nurbs_volume), intent(in) @@ -201,91 +201,91 @@

    Calls

    - - + + proc~~export_xg~3~~CallsGraph - + proc~export_xg~3 - -nurbs_curve%export_Xg + +nurbs_volume%export_Xg proc~cmp_elem_xg_vis~3 - - -nurbs_curve%cmp_elem_Xg_vis + + +nurbs_volume%cmp_elem_Xg_vis proc~export_xg~3->proc~cmp_elem_xg_vis~3 - - + + interface~elemconn_c0 - -elemConn_C0 + +elemConn_C0 proc~cmp_elem_xg_vis~3->interface~elemconn_c0 - - + + proc~cmp_elemconn_c0_l - -cmp_elemConn_C0_L + +cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l - - + + proc~cmp_elemconn_c0_s - -cmp_elemConn_C0_S + +cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s - - + + proc~cmp_elemconn_c0_v - -cmp_elemConn_C0_V + +cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v - - + + @@ -385,61 +385,76 @@

    Called by

    - - + + proc~~export_xg~3~~CalledByGraph - + proc~export_xg~3 - -nurbs_curve%export_Xg + +nurbs_volume%export_Xg - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->proc~export_xg~3 - - +program~example3_volume->proc~export_xg~3 + + - + -program~example_nurbs_curve - - -example_nurbs_curve +program~example_morph + + +example_morph - + -program~example_nurbs_curve->proc~export_xg~3 - - +program~example_morph->proc~export_xg~3 + + - + -program~shape_circle - - -shape_circle +program~example_nurbs_volume + + +example_nurbs_volume - + -program~shape_circle->proc~export_xg~3 - - +program~example_nurbs_volume->proc~export_xg~3 + + + + + +program~shape_hexahedron + + +shape_hexahedron + + + + + +program~shape_hexahedron->proc~export_xg~3 + + @@ -555,7 +570,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/factln.html b/proc/factln.html index d9a53baa2..d23902474 100644 --- a/proc/factln.html +++ b/proc/factln.html @@ -235,9 +235,9 @@

    Called by

    proc~elevate_degree - + -nurbs_volume%elevate_degree +nurbs_surface%elevate_degree @@ -250,24 +250,24 @@

    Called by

    proc~elevate_degree~2 - - -nurbs_surface%elevate_degree + + +nurbs_curve%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 - - + + proc~elevate_degree~3 - - -nurbs_curve%elevate_degree + + +nurbs_volume%elevate_degree @@ -281,46 +281,46 @@

    Called by

    program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->proc~elevate_degree~3 - - + + +program~example1_curve->proc~elevate_degree~2 + + program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~elevate_degree~2 - - + + +program~example3_surface->proc~elevate_degree + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~elevate_degree - - + + +program~example3_volume->proc~elevate_degree~3 + + @@ -440,7 +440,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/finalize.html b/proc/finalize.html index 8c3a22542..2d843811f 100644 --- a/proc/finalize.html +++ b/proc/finalize.html @@ -78,20 +78,20 @@

    finalize
  • 15 statements + title=" 0.3% of total for procedures.">13 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine finalize(this)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -4387,12 +5407,12 @@

    Arguments

    integer, - + - + @@ -4400,6 +5420,11 @@

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(inout) @@ -195,52 +195,52 @@

    Called by

    proc~finalize -nurbs_volume%finalize +nurbs_surface%finalize - + -program~example3_volume - +program~example3_surface + -example3_volume +example3_surface - + -program~example3_volume->proc~finalize +program~example3_surface->proc~finalize - + -program~example_nurbs_volume - +program~example_nurbs_surface + -example_nurbs_volume +example_nurbs_surface - + -program~example_nurbs_volume->proc~finalize +program~example_nurbs_surface->proc~finalize - + -program~shape_hexahedron - - -shape_hexahedron +program~shape_tetragon + + +shape_tetragon - + -program~shape_hexahedron->proc~finalize - - +program~shape_tetragon->proc~finalize + + @@ -356,7 +356,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/finalize~2.html b/proc/finalize~2.html index 4fede81a0..97c51182c 100644 --- a/proc/finalize~2.html +++ b/proc/finalize~2.html @@ -78,20 +78,20 @@

    finalize
  • 13 statements + title=" 0.3% of total for procedures.">11 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine finalize(this)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - - + @@ -3454,14 +3277,14 @@

    Arguments

    - + @@ -3478,23 +3301,23 @@

    Arguments

    - +

    - generic, public :: - set => set1, set2, set3 + procedure, public :: + modify_Xc

    -

    Set NURBS volume

    +

    Modify control points

    • - private pure subroutine set1(this, knot1, knot2, knot3, Xc, Wc) + private pure subroutine modify_Xc(this, X, num, dir)

      Author
      Seyed Ali Ghasemi
      @@ -3502,7 +3325,7 @@

      -

      Set control points and weights for the NURBS volume object.

      +

      Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -186,61 +186,61 @@

    Called by

    - + proc~~finalize~2~~CalledByGraph - + proc~finalize~2 - -nurbs_surface%finalize + +nurbs_curve%finalize - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->proc~finalize~2 - - +program~example1_curve->proc~finalize~2 + + - + -program~example_nurbs_surface - - -example_nurbs_surface +program~example_nurbs_curve + + +example_nurbs_curve - + -program~example_nurbs_surface->proc~finalize~2 - - +program~example_nurbs_curve->proc~finalize~2 + + - + -program~shape_tetragon - - -shape_tetragon +program~shape_circle + + +shape_circle - + -program~shape_tetragon->proc~finalize~2 - - +program~shape_circle->proc~finalize~2 + + @@ -356,7 +356,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/finalize~3.html b/proc/finalize~3.html index bb448dd9e..0341a1ff5 100644 --- a/proc/finalize~3.html +++ b/proc/finalize~3.html @@ -78,20 +78,20 @@

    finalize
  • 11 statements + title=" 0.4% of total for procedures.">15 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine finalize(this)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -186,7 +186,7 @@

    Arguments

    @@ -201,7 +201,7 @@

    Arguments

    @@ -219,7 +219,7 @@

    Arguments

    Return Value - + integer

    @@ -250,9 +250,9 @@

    Called by

    proc~insert_knots - + -nurbs_volume%insert_knots +nurbs_surface%insert_knots @@ -265,24 +265,24 @@

    Called by

    proc~insert_knots~2 - - -nurbs_surface%insert_knots + + +nurbs_curve%insert_knots proc~insert_knots~2->proc~findspan - - + + proc~insert_knots~3 - - -nurbs_curve%insert_knots + + +nurbs_volume%insert_knots @@ -295,9 +295,9 @@

    Called by

    proc~remove_knots - + -nurbs_volume%remove_knots +nurbs_surface%remove_knots @@ -310,24 +310,24 @@

    Called by

    proc~remove_knots~2 - - -nurbs_surface%remove_knots + + +nurbs_curve%remove_knots proc~remove_knots~2->proc~findspan - - + + proc~remove_knots~3 - - -nurbs_curve%remove_knots + + +nurbs_volume%remove_knots @@ -341,64 +341,64 @@

    Called by

    program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->proc~insert_knots~3 - - + + +program~example1_curve->proc~insert_knots~2 + + - - -program~example1_curve->proc~remove_knots~3 - - + + +program~example1_curve->proc~remove_knots~2 + + program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~insert_knots~2 - - + + +program~example3_surface->proc~insert_knots + + - - -program~example3_surface->proc~remove_knots~2 - - + + +program~example3_surface->proc~remove_knots + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~insert_knots - - + + +program~example3_volume->proc~insert_knots~3 + + - - -program~example3_volume->proc~remove_knots - - + + +program~example3_volume->proc~remove_knots~3 + + @@ -514,7 +514,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/generate_xc.html b/proc/generate_xc.html index 8599833d7..23b08db0d 100644 --- a/proc/generate_xc.html +++ b/proc/generate_xc.html @@ -77,20 +77,20 @@

    generate_Xc
  • 18 statements + title=" 0.5% of total for procedures.">19 statements
  • - Source File + Source File
  • @@ -136,7 +136,7 @@

    Contents

    -

    function generate_Xc(num_coils, radius, height, num_points_per_coil) result(control_points) +

    function generate_Xc(num_rows, num_cols, peak_height) result(control_points)

    @@ -155,7 +155,7 @@

    Arguments

    @@ -163,29 +163,29 @@

    Arguments

    - + - + @@ -193,22 +193,7 @@

    Arguments

    - - - - - - - - - + @@ -235,31 +220,31 @@

    Called by

    - + proc~~generate_xc~~CalledByGraph - + proc~generate_xc - -generate_Xc + +generate_Xc - + -program~example_nurbs_curve - - -example_nurbs_curve +program~example_nurbs_surface + + +example_nurbs_surface - + -program~example_nurbs_curve->proc~generate_xc - - +program~example_nurbs_surface->proc~generate_xc + + @@ -375,7 +360,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/generate_xc~2.html b/proc/generate_xc~2.html index 6f5182ff5..75ffdffdb 100644 --- a/proc/generate_xc~2.html +++ b/proc/generate_xc~2.html @@ -77,20 +77,20 @@

    generate_Xc
  • 19 statements + title=" 0.4% of total for procedures.">16 statements
  • - Source File + Source File
  • @@ -136,7 +136,7 @@

    Contents

    -

    function generate_Xc(num_rows, num_cols, peak_height) result(control_points) +

    function generate_Xc(L) result(control_points)

    @@ -155,37 +155,7 @@

    Arguments

    - - - - - - - - - - - - - - - - @@ -193,7 +163,7 @@

    Arguments

    - + @@ -220,31 +190,31 @@

    Called by

    - + proc~~generate_xc~2~~CalledByGraph - + proc~generate_xc~2 - -generate_Xc + +generate_Xc - + -program~example3_surface - - -example3_surface +program~example_nurbs_volume + + +example_nurbs_volume - + -program~example3_surface->proc~generate_xc~2 - - +program~example_nurbs_volume->proc~generate_xc~2 + + @@ -360,7 +330,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/generate_xc~3.html b/proc/generate_xc~3.html index 97d167b52..43529b660 100644 --- a/proc/generate_xc~3.html +++ b/proc/generate_xc~3.html @@ -77,20 +77,20 @@

    generate_Xc
  • 16 statements + title=" 0.5% of total for procedures.">19 statements
  • - Source File + Source File
  • @@ -136,7 +136,7 @@

    Contents

    -

    function generate_Xc(L) result(control_points) +

    function generate_Xc(num_rows, num_cols, peak_height) result(control_points)

    @@ -155,7 +155,37 @@

    Arguments

    + + + + + + + + + + + + + + + + @@ -163,7 +193,7 @@

    Arguments

    - + @@ -201,18 +231,18 @@

    Called by

    generate_Xc - + -program~example3_volume - +program~example3_surface + -example3_volume +example3_surface - + -program~example3_volume->proc~generate_xc~3 +program~example3_surface->proc~generate_xc~3 @@ -330,7 +360,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/generate_xc~4.html b/proc/generate_xc~4.html index 3e09d6be3..8fe669735 100644 --- a/proc/generate_xc~4.html +++ b/proc/generate_xc~4.html @@ -82,15 +82,15 @@

    generate_Xc
  • - Source File + Source File
  • @@ -155,7 +155,7 @@

    Arguments

    @@ -190,31 +190,31 @@

    Called by

    - + proc~~generate_xc~4~~CalledByGraph - + proc~generate_xc~4 - -generate_Xc + +generate_Xc - + -program~example_nurbs_volume - - -example_nurbs_volume +program~example3_volume + + +example3_volume - + -program~example_nurbs_volume->proc~generate_xc~4 - - +program~example3_volume->proc~generate_xc~4 + + @@ -330,7 +330,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/generate_xc~5.html b/proc/generate_xc~5.html index c2a32beb7..bf8c5f027 100644 --- a/proc/generate_xc~5.html +++ b/proc/generate_xc~5.html @@ -77,20 +77,20 @@

    generate_Xc
  • 19 statements + title=" 0.5% of total for procedures.">18 statements
  • - Source File + Source File
  • @@ -136,7 +136,7 @@

    Contents

    -

    function generate_Xc(num_rows, num_cols, peak_height) result(control_points) +

    function generate_Xc(num_coils, radius, height, num_points_per_coil) result(control_points)

    @@ -155,7 +155,7 @@

    Arguments

    @@ -163,29 +163,29 @@

    Arguments

    - + - + @@ -193,7 +193,22 @@

    Arguments

    - + + + + + + + + + @@ -220,31 +235,31 @@

    Called by

    - + proc~~generate_xc~5~~CalledByGraph - + proc~generate_xc~5 - -generate_Xc + +generate_Xc - + -program~example_nurbs_surface - - -example_nurbs_surface +program~example_nurbs_curve + + +example_nurbs_curve - + -program~example_nurbs_surface->proc~generate_xc~5 - - +program~example_nurbs_curve->proc~generate_xc~5 + + @@ -360,7 +375,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_continuity.html b/proc/get_continuity.html index e3067b54e..b4dcb74a3 100644 --- a/proc/get_continuity.html +++ b/proc/get_continuity.html @@ -78,20 +78,20 @@

    get_continuity
  • 26 statements + title=" 0.5% of total for procedures.">20 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_continuity(this, dir) result(c)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -186,61 +186,61 @@

    Called by

    - + proc~~finalize~3~~CalledByGraph - + proc~finalize~3 - -nurbs_curve%finalize + +nurbs_volume%finalize - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->proc~finalize~3 - - +program~example3_volume->proc~finalize~3 + + - + -program~example_nurbs_curve - - -example_nurbs_curve +program~example_nurbs_volume + + +example_nurbs_volume - + -program~example_nurbs_curve->proc~finalize~3 - - +program~example_nurbs_volume->proc~finalize~3 + + - + -program~shape_circle - - -shape_circle +program~shape_hexahedron + + +shape_hexahedron - + -program~shape_circle->proc~finalize~3 - - +program~shape_hexahedron->proc~finalize~3 + + @@ -356,7 +356,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/findspan.html b/proc/findspan.html index b8a759d86..51dbf0167 100644 --- a/proc/findspan.html +++ b/proc/findspan.html @@ -171,7 +171,7 @@

    Arguments

    - + integer, intent(in)
    - + real(kind=rk), intent(in)
    - + real(kind=rk), intent(in),
    - + integer, intent(in) ::num_coilsnum_rows
    - - real(kind=rk), + + integer, intent(in) ::radiusnum_cols
    - + real(kind=rk), intent(in) ::height - -
    - - integer, - intent(in) - - ::num_points_per_coilpeak_height
    - - integer, - intent(in) - - ::num_rows - -
    - - integer, - intent(in) - - ::num_cols - -
    - + real(kind=rk), intent(in) ::peak_heightL
    - + + integer, + intent(in) + + ::num_rows + +
    + + integer, + intent(in) + + ::num_cols + +
    + real(kind=rk), intent(in) ::Lpeak_height
    - + real(kind=rk), intent(in)
    - + integer, intent(in) ::num_rowsnum_coils
    - - integer, + + real(kind=rk), intent(in) ::num_colsradius
    - + real(kind=rk), intent(in) ::peak_heightheight + +
    + + integer, + intent(in) + + ::num_points_per_coil
    @@ -158,8 +158,8 @@

    Arguments

    @@ -191,7 +191,7 @@

    Arguments

    Return Value - + integer, allocatable, (:)

    @@ -217,7 +217,7 @@

    Calls

    proc~get_continuity -nurbs_volume%get_continuity +nurbs_surface%get_continuity @@ -378,7 +378,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_continuity~2.html b/proc/get_continuity~2.html index 6d60b20f8..5e646c2d8 100644 --- a/proc/get_continuity~2.html +++ b/proc/get_continuity~2.html @@ -78,20 +78,20 @@

    get_continuity
  • 20 statements + title=" 0.2% of total for procedures.">9 statements
  • - Source File + Source File
  • @@ -137,13 +137,13 @@

    Contents

    -

    private pure function get_continuity(this, dir) result(c) +

    private pure function get_continuity(this) result(c)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - @@ -208,61 +193,61 @@

    Calls

    - + proc~~get_continuity~2~~CallsGraph - + proc~get_continuity~2 - -nurbs_surface%get_continuity + +nurbs_curve%get_continuity interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity proc~get_continuity~2->interface~compute_multiplicity - - + + proc~compute_multiplicity1 - -compute_multiplicity1 + +compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 - - + + proc~compute_multiplicity2 - -compute_multiplicity2 + +compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 - - + + @@ -378,7 +363,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_continuity~3.html b/proc/get_continuity~3.html index 7a154de4a..35b75f33c 100644 --- a/proc/get_continuity~3.html +++ b/proc/get_continuity~3.html @@ -78,20 +78,20 @@

    get_continuity
  • 9 statements + title=" 0.7% of total for procedures.">26 statements
  • - Source File + Source File
  • @@ -137,13 +137,13 @@

    Contents

    -

    private pure function get_continuity(this) result(c) +

    private pure function get_continuity(this, dir) result(c)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(in) @@ -169,21 +169,6 @@

    Arguments

    this -
    - - integer, - intent(in) - - ::dir -
    @@ -158,8 +158,8 @@

    Arguments

    + + + + + + + + @@ -193,61 +208,61 @@

    Calls

    - + proc~~get_continuity~3~~CallsGraph - + proc~get_continuity~3 - -nurbs_curve%get_continuity + +nurbs_volume%get_continuity interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity proc~get_continuity~3->interface~compute_multiplicity - - + + proc~compute_multiplicity1 - -compute_multiplicity1 + +compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 - - + + proc~compute_multiplicity2 - -compute_multiplicity2 + +compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 - - + + @@ -363,7 +378,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_degree.html b/proc/get_degree.html index f6c7f119c..4dfdb0a7d 100644 --- a/proc/get_degree.html +++ b/proc/get_degree.html @@ -158,7 +158,7 @@

    Arguments

    @@ -176,7 +176,7 @@

    Arguments

    Return Value - + integer

    @@ -204,18 +204,18 @@

    Calls

    nurbs_curve%get_degree - + -proc~get_multiplicity~3 - +proc~get_multiplicity~2 + nurbs_curve%get_multiplicity - + -proc~get_degree->proc~get_multiplicity~3 +proc~get_degree->proc~get_multiplicity~2 @@ -228,9 +228,9 @@

    Calls

    - + -proc~get_multiplicity~3->interface~compute_multiplicity +proc~get_multiplicity~2->interface~compute_multiplicity @@ -373,33 +373,33 @@

    Called by

    nurbs_curve%get_degree - + -proc~set1~3 - +proc~set1~2 + nurbs_curve%set1 - + -proc~set1~3->proc~get_degree +proc~set1~2->proc~get_degree - + -proc~set3~3 - +proc~set3~2 + nurbs_curve%set3 - + -proc~set3~3->proc~get_degree +proc~set3~2->proc~get_degree @@ -418,123 +418,123 @@

    Called by

    - + -none~set~3 - +none~set~2 + nurbs_curve%set - + -program~example1_curve->none~set~3 +program~example1_curve->none~set~2 - + -proc~elevate_degree~3 - +proc~elevate_degree~2 + nurbs_curve%elevate_degree - + -program~example1_curve->proc~elevate_degree~3 +program~example1_curve->proc~elevate_degree~2 - + -proc~insert_knots~3 - +proc~insert_knots~2 + nurbs_curve%insert_knots - + -program~example1_curve->proc~insert_knots~3 +program~example1_curve->proc~insert_knots~2 - + -proc~remove_knots~3 - +proc~remove_knots~2 + nurbs_curve%remove_knots - + -program~example1_curve->proc~remove_knots~3 +program~example1_curve->proc~remove_knots~2 - + -none~set~3->proc~set1~3 +none~set~2->proc~set1~2 - + -none~set~3->proc~set3~3 +none~set~2->proc~set3~2 - + -proc~elevate_degree~3->none~set~3 +proc~elevate_degree~2->none~set~2 - + -proc~insert_knots~3->none~set~3 +proc~insert_knots~2->none~set~2 - + -proc~modify_wc~3 - +proc~modify_wc~2 + nurbs_curve%modify_Wc - + -proc~modify_wc~3->none~set~3 +proc~modify_wc~2->none~set~2 - + -proc~modify_xc~3 - +proc~modify_xc~2 + nurbs_curve%modify_Xc - + -proc~modify_xc~3->none~set~3 +proc~modify_xc~2->none~set~2 - + -proc~remove_knots~3->none~set~3 +proc~remove_knots~2->none~set~2 @@ -547,9 +547,9 @@

    Called by

    - + -proc~set_circle->none~set~3 +proc~set_circle->none~set~2 @@ -562,9 +562,9 @@

    Called by

    - + -program~example_nurbs_curve->none~set~3 +program~example_nurbs_curve->none~set~2 @@ -701,7 +701,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_degree_all.html b/proc/get_degree_all.html index 729cbd939..f72b9d4d2 100644 --- a/proc/get_degree_all.html +++ b/proc/get_degree_all.html @@ -78,20 +78,20 @@

    get_degree_all
  • 11 statements + title=" 0.2% of total for procedures.">9 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_degree_all(this) result(degree)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(in) @@ -169,6 +169,21 @@

    Arguments

    this +
    + + integer, + intent(in) + + ::dir +
    - + class(nurbs_curve), intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    +
    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -176,8 +176,8 @@

    Arguments

    Return Value - - integer, (3) + + integer, (2)

    @@ -202,14 +202,14 @@

    Calls

    proc~get_degree_all -nurbs_volume%get_degree_all +nurbs_surface%get_degree_all proc~get_multiplicity - + -nurbs_volume%get_multiplicity +nurbs_surface%get_multiplicity @@ -362,256 +362,241 @@

    Called by

    - - + + proc~~get_degree_all~~CalledByGraph - + proc~get_degree_all - -nurbs_volume%get_degree_all + +nurbs_surface%get_degree_all none~get_degree - - -nurbs_volume%get_degree + + +nurbs_surface%get_degree none~get_degree->proc~get_degree_all - - + + proc~set1 - - -nurbs_volume%set1 + + +nurbs_surface%set1 proc~set1->none~get_degree - - + + proc~set3 - - -nurbs_volume%set3 + + +nurbs_surface%set3 proc~set3->none~get_degree - - + + - + -program~example3_volume - - -example3_volume +program~example3_surface + + +example3_surface - + -program~example3_volume->none~get_degree - - +program~example3_surface->none~get_degree + + none~set - - -nurbs_volume%set + + +nurbs_surface%set - + -program~example3_volume->none~set - - +program~example3_surface->none~set + + proc~elevate_degree - - -nurbs_volume%elevate_degree + + +nurbs_surface%elevate_degree - - -program~example3_volume->proc~elevate_degree - - + + +program~example3_surface->proc~elevate_degree + + proc~insert_knots - - -nurbs_volume%insert_knots + + +nurbs_surface%insert_knots - - -program~example3_volume->proc~insert_knots - - + + +program~example3_surface->proc~insert_knots + + proc~remove_knots - - -nurbs_volume%remove_knots + + +nurbs_surface%remove_knots - - -program~example3_volume->proc~remove_knots - - + + +program~example3_surface->proc~remove_knots + + none~set->proc~set1 - - + + none~set->proc~set3 - - + + proc~elevate_degree->none~set - - + + proc~insert_knots->none~set - - + + proc~modify_wc - - -nurbs_volume%modify_Wc + + +nurbs_surface%modify_Wc proc~modify_wc->none~set - - + + proc~modify_xc - - -nurbs_volume%modify_Xc + + +nurbs_surface%modify_Xc proc~modify_xc->none~set - - + + proc~remove_knots->none~set - - + + - + -proc~set_hexahedron - - -nurbs_volume%set_hexahedron +proc~set_tetragon + + +nurbs_surface%set_tetragon - + -proc~set_hexahedron->none~set - - +proc~set_tetragon->none~set + + - + -program~example_morph - - -example_morph +program~example_nurbs_surface + + +example_nurbs_surface - + -program~example_morph->none~set - - +program~example_nurbs_surface->none~set + + - + -program~example_nurbs_volume - - -example_nurbs_volume +program~shape_tetragon + + +shape_tetragon - - -program~example_nurbs_volume->none~set - - - - - -program~shape_hexahedron - - -shape_hexahedron - - - - - -program~shape_hexahedron->proc~set_hexahedron - - + + +program~shape_tetragon->proc~set_tetragon + + @@ -731,7 +716,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_degree_all~2.html b/proc/get_degree_all~2.html index 95734225e..73340e81a 100644 --- a/proc/get_degree_all~2.html +++ b/proc/get_degree_all~2.html @@ -78,20 +78,20 @@

    get_degree_all
  • 9 statements + title=" 0.3% of total for procedures.">11 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_degree_all(this) result(degree)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -3312,54 +3190,14 @@

    Arguments

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - class(nurbs_surface), + + class(nurbs_volume), intent(in) @@ -176,8 +176,8 @@

    Arguments

    Return Value - - integer, (2) + + integer, (3)

    @@ -202,20 +202,20 @@

    Calls

    proc~get_degree_all~2 -nurbs_surface%get_degree_all +nurbs_volume%get_degree_all - + -proc~get_multiplicity~2 - +proc~get_multiplicity~3 + -nurbs_surface%get_multiplicity +nurbs_volume%get_multiplicity - + -proc~get_degree_all~2->proc~get_multiplicity~2 +proc~get_degree_all~2->proc~get_multiplicity~3 @@ -228,9 +228,9 @@

    Calls

    - + -proc~get_multiplicity~2->interface~compute_multiplicity +proc~get_multiplicity~3->interface~compute_multiplicity @@ -362,241 +362,256 @@

    Called by

    - - + + proc~~get_degree_all~2~~CalledByGraph - + proc~get_degree_all~2 - -nurbs_surface%get_degree_all + +nurbs_volume%get_degree_all - + -none~get_degree~2 - - -nurbs_surface%get_degree +none~get_degree~3 + + +nurbs_volume%get_degree - + -none~get_degree~2->proc~get_degree_all~2 - - +none~get_degree~3->proc~get_degree_all~2 + + - + -proc~set1~2 - - -nurbs_surface%set1 +proc~set1~3 + + +nurbs_volume%set1 - + -proc~set1~2->none~get_degree~2 - - +proc~set1~3->none~get_degree~3 + + - + -proc~set3~2 - - -nurbs_surface%set3 +proc~set3~3 + + +nurbs_volume%set3 - + -proc~set3~2->none~get_degree~2 - - +proc~set3~3->none~get_degree~3 + + - + -program~example3_surface - - -example3_surface +program~example3_volume + + +example3_volume - + -program~example3_surface->none~get_degree~2 - - +program~example3_volume->none~get_degree~3 + + - + -none~set~2 - - -nurbs_surface%set +none~set~3 + + +nurbs_volume%set - + -program~example3_surface->none~set~2 - - +program~example3_volume->none~set~3 + + - + -proc~elevate_degree~2 - - -nurbs_surface%elevate_degree +proc~elevate_degree~3 + + +nurbs_volume%elevate_degree - - -program~example3_surface->proc~elevate_degree~2 - - + + +program~example3_volume->proc~elevate_degree~3 + + - + -proc~insert_knots~2 - - -nurbs_surface%insert_knots +proc~insert_knots~3 + + +nurbs_volume%insert_knots - - -program~example3_surface->proc~insert_knots~2 - - + + +program~example3_volume->proc~insert_knots~3 + + - + -proc~remove_knots~2 - - -nurbs_surface%remove_knots +proc~remove_knots~3 + + +nurbs_volume%remove_knots - - -program~example3_surface->proc~remove_knots~2 - - + + +program~example3_volume->proc~remove_knots~3 + + - + -none~set~2->proc~set1~2 - - +none~set~3->proc~set1~3 + + - + -none~set~2->proc~set3~2 - - +none~set~3->proc~set3~3 + + - + -proc~elevate_degree~2->none~set~2 - - +proc~elevate_degree~3->none~set~3 + + - + -proc~insert_knots~2->none~set~2 - - +proc~insert_knots~3->none~set~3 + + - + -proc~modify_wc~2 - - -nurbs_surface%modify_Wc +proc~modify_wc~3 + + +nurbs_volume%modify_Wc - + -proc~modify_wc~2->none~set~2 - - +proc~modify_wc~3->none~set~3 + + - + -proc~modify_xc~2 - - -nurbs_surface%modify_Xc +proc~modify_xc~3 + + +nurbs_volume%modify_Xc - + -proc~modify_xc~2->none~set~2 - - +proc~modify_xc~3->none~set~3 + + - + -proc~remove_knots~2->none~set~2 - - +proc~remove_knots~3->none~set~3 + + - + -proc~set_tetragon - - -nurbs_surface%set_tetragon +proc~set_hexahedron + + +nurbs_volume%set_hexahedron - + -proc~set_tetragon->none~set~2 - - +proc~set_hexahedron->none~set~3 + + - + -program~example_nurbs_surface - - -example_nurbs_surface +program~example_morph + + +example_morph - + -program~example_nurbs_surface->none~set~2 - - +program~example_morph->none~set~3 + + - + -program~shape_tetragon - - -shape_tetragon +program~example_nurbs_volume + + +example_nurbs_volume - - -program~shape_tetragon->proc~set_tetragon - - + + +program~example_nurbs_volume->none~set~3 + + + + + +program~shape_hexahedron + + +shape_hexahedron + + + + + +program~shape_hexahedron->proc~set_hexahedron + + @@ -716,7 +731,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_degree_dir.html b/proc/get_degree_dir.html index 87f14a5fd..695f6cac1 100644 --- a/proc/get_degree_dir.html +++ b/proc/get_degree_dir.html @@ -78,20 +78,20 @@

    get_degree_dir
  • 18 statements + title=" 0.4% of total for procedures.">15 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_degree_dir(this, dir) result(degree)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -191,7 +191,7 @@

    Arguments

    Return Value - + integer

    @@ -217,14 +217,14 @@

    Calls

    proc~get_degree_dir -nurbs_volume%get_degree_dir +nurbs_surface%get_degree_dir proc~get_multiplicity - + -nurbs_volume%get_multiplicity +nurbs_surface%get_multiplicity @@ -377,256 +377,241 @@

    Called by

    - - + + proc~~get_degree_dir~~CalledByGraph - + proc~get_degree_dir - -nurbs_volume%get_degree_dir + +nurbs_surface%get_degree_dir none~get_degree - - -nurbs_volume%get_degree + + +nurbs_surface%get_degree none~get_degree->proc~get_degree_dir - - + + proc~set1 - - -nurbs_volume%set1 + + +nurbs_surface%set1 proc~set1->none~get_degree - - + + proc~set3 - - -nurbs_volume%set3 + + +nurbs_surface%set3 proc~set3->none~get_degree - - + + - + -program~example3_volume - - -example3_volume +program~example3_surface + + +example3_surface - + -program~example3_volume->none~get_degree - - +program~example3_surface->none~get_degree + + none~set - - -nurbs_volume%set + + +nurbs_surface%set - + -program~example3_volume->none~set - - +program~example3_surface->none~set + + proc~elevate_degree - - -nurbs_volume%elevate_degree + + +nurbs_surface%elevate_degree - - -program~example3_volume->proc~elevate_degree - - + + +program~example3_surface->proc~elevate_degree + + proc~insert_knots - - -nurbs_volume%insert_knots + + +nurbs_surface%insert_knots - - -program~example3_volume->proc~insert_knots - - + + +program~example3_surface->proc~insert_knots + + proc~remove_knots - - -nurbs_volume%remove_knots + + +nurbs_surface%remove_knots - - -program~example3_volume->proc~remove_knots - - + + +program~example3_surface->proc~remove_knots + + none~set->proc~set1 - - + + none~set->proc~set3 - - + + proc~elevate_degree->none~set - - + + proc~insert_knots->none~set - - + + proc~modify_wc - - -nurbs_volume%modify_Wc + + +nurbs_surface%modify_Wc proc~modify_wc->none~set - - + + proc~modify_xc - - -nurbs_volume%modify_Xc + + +nurbs_surface%modify_Xc proc~modify_xc->none~set - - + + proc~remove_knots->none~set - - + + - + -proc~set_hexahedron - - -nurbs_volume%set_hexahedron +proc~set_tetragon + + +nurbs_surface%set_tetragon - + -proc~set_hexahedron->none~set - - +proc~set_tetragon->none~set + + - + -program~example_morph - - -example_morph +program~example_nurbs_surface + + +example_nurbs_surface - + -program~example_morph->none~set - - +program~example_nurbs_surface->none~set + + - + -program~example_nurbs_volume - - -example_nurbs_volume +program~shape_tetragon + + +shape_tetragon - - -program~example_nurbs_volume->none~set - - - - - -program~shape_hexahedron - - -shape_hexahedron - - - - - -program~shape_hexahedron->proc~set_hexahedron - - + + +program~shape_tetragon->proc~set_tetragon + + @@ -746,7 +731,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_degree_dir~2.html b/proc/get_degree_dir~2.html index e94285c33..9ef194157 100644 --- a/proc/get_degree_dir~2.html +++ b/proc/get_degree_dir~2.html @@ -78,20 +78,20 @@

    get_degree_dir
  • 15 statements + title=" 0.5% of total for procedures.">18 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_degree_dir(this, dir) result(degree)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_volume

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    @@ -191,7 +191,7 @@

    Arguments

    Return Value - + integer

    @@ -217,20 +217,20 @@

    Calls

    proc~get_degree_dir~2 -nurbs_surface%get_degree_dir +nurbs_volume%get_degree_dir - + -proc~get_multiplicity~2 - +proc~get_multiplicity~3 + -nurbs_surface%get_multiplicity +nurbs_volume%get_multiplicity - + -proc~get_degree_dir~2->proc~get_multiplicity~2 +proc~get_degree_dir~2->proc~get_multiplicity~3 @@ -243,9 +243,9 @@

    Calls

    - + -proc~get_multiplicity~2->interface~compute_multiplicity +proc~get_multiplicity~3->interface~compute_multiplicity @@ -377,241 +377,256 @@

    Called by

    - - + + proc~~get_degree_dir~2~~CalledByGraph - + proc~get_degree_dir~2 - -nurbs_surface%get_degree_dir + +nurbs_volume%get_degree_dir - + -none~get_degree~2 - - -nurbs_surface%get_degree +none~get_degree~3 + + +nurbs_volume%get_degree - + -none~get_degree~2->proc~get_degree_dir~2 - - +none~get_degree~3->proc~get_degree_dir~2 + + - + -proc~set1~2 - - -nurbs_surface%set1 +proc~set1~3 + + +nurbs_volume%set1 - + -proc~set1~2->none~get_degree~2 - - +proc~set1~3->none~get_degree~3 + + - + -proc~set3~2 - - -nurbs_surface%set3 +proc~set3~3 + + +nurbs_volume%set3 - + -proc~set3~2->none~get_degree~2 - - +proc~set3~3->none~get_degree~3 + + - + -program~example3_surface - - -example3_surface +program~example3_volume + + +example3_volume - + -program~example3_surface->none~get_degree~2 - - +program~example3_volume->none~get_degree~3 + + - + -none~set~2 - - -nurbs_surface%set +none~set~3 + + +nurbs_volume%set - + -program~example3_surface->none~set~2 - - +program~example3_volume->none~set~3 + + - + -proc~elevate_degree~2 - - -nurbs_surface%elevate_degree +proc~elevate_degree~3 + + +nurbs_volume%elevate_degree - - -program~example3_surface->proc~elevate_degree~2 - - + + +program~example3_volume->proc~elevate_degree~3 + + - + -proc~insert_knots~2 - - -nurbs_surface%insert_knots +proc~insert_knots~3 + + +nurbs_volume%insert_knots - - -program~example3_surface->proc~insert_knots~2 - - + + +program~example3_volume->proc~insert_knots~3 + + - + -proc~remove_knots~2 - - -nurbs_surface%remove_knots +proc~remove_knots~3 + + +nurbs_volume%remove_knots - - -program~example3_surface->proc~remove_knots~2 - - + + +program~example3_volume->proc~remove_knots~3 + + - + -none~set~2->proc~set1~2 - - +none~set~3->proc~set1~3 + + - + -none~set~2->proc~set3~2 - - +none~set~3->proc~set3~3 + + - + -proc~elevate_degree~2->none~set~2 - - +proc~elevate_degree~3->none~set~3 + + - + -proc~insert_knots~2->none~set~2 - - +proc~insert_knots~3->none~set~3 + + - + -proc~modify_wc~2 - - -nurbs_surface%modify_Wc +proc~modify_wc~3 + + +nurbs_volume%modify_Wc - + -proc~modify_wc~2->none~set~2 - - +proc~modify_wc~3->none~set~3 + + - + -proc~modify_xc~2 - - -nurbs_surface%modify_Xc +proc~modify_xc~3 + + +nurbs_volume%modify_Xc - + -proc~modify_xc~2->none~set~2 - - +proc~modify_xc~3->none~set~3 + + - + -proc~remove_knots~2->none~set~2 - - +proc~remove_knots~3->none~set~3 + + - + -proc~set_tetragon - - -nurbs_surface%set_tetragon +proc~set_hexahedron + + +nurbs_volume%set_hexahedron - + -proc~set_tetragon->none~set~2 - - +proc~set_hexahedron->none~set~3 + + - + -program~example_nurbs_surface - - -example_nurbs_surface +program~example_morph + + +example_morph - + -program~example_nurbs_surface->none~set~2 - - +program~example_morph->none~set~3 + + - + -program~shape_tetragon - - -shape_tetragon +program~example_nurbs_volume + + +example_nurbs_volume - - -program~shape_tetragon->proc~set_tetragon - - + + +program~example_nurbs_volume->none~set~3 + + + + + +program~shape_hexahedron + + +shape_hexahedron + + + + + +program~shape_hexahedron->proc~set_hexahedron + + @@ -731,7 +746,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_elem.html b/proc/get_elem.html index c8eeb93f0..6236d9164 100644 --- a/proc/get_elem.html +++ b/proc/get_elem.html @@ -83,15 +83,15 @@

    get_elem
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_elem(this) result(elemConn)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_surface), + + class(nurbs_volume), intent(in) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -3107,41 +3010,16 @@

    Arguments

    - - - - - - - - - - - - - - - -
    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -176,7 +176,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_elem_xc_vis.html b/proc/get_elem_xc_vis.html index 1c50e75bc..a4394f837 100644 --- a/proc/get_elem_xc_vis.html +++ b/proc/get_elem_xc_vis.html @@ -83,15 +83,15 @@

    get_elem_Xc_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_elem_Xc_vis(this) result(elemConn)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - - - - - - - - - - + @@ -3048,6 +2946,11 @@

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -176,7 +176,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_elem_xc_vis~2.html b/proc/get_elem_xc_vis~2.html index fa8bf6148..997e77862 100644 --- a/proc/get_elem_xc_vis~2.html +++ b/proc/get_elem_xc_vis~2.html @@ -83,15 +83,15 @@

    get_elem_Xc_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_elem_Xc_vis(this) result(elemConn)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    + + + + + + + + @@ -2842,7 +2780,7 @@

    Arguments

    Return Value - logical + real(kind=rk), allocatable, (:)

    @@ -2854,23 +2792,23 @@

    - +

    procedure, public :: - modify_Wc + get_multiplicity

    -

    Modify weights

    +

    Get multiplicity of the knot vector

    • - private pure subroutine modify_Wc(this, W, num) + private pure function get_multiplicity(this, dir) result(m)

      Author
      Seyed Ali Ghasemi
      @@ -2896,27 +2834,12 @@

      Arguments

      class(nurbs_volume), -

    - - - - - - - - + @@ -2931,7 +2854,7 @@

    Arguments

    - + @@ -2939,6 +2862,11 @@

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(in) @@ -176,7 +176,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_elem_xc_vis~3.html b/proc/get_elem_xc_vis~3.html index 2ce012ba6..50217b542 100644 --- a/proc/get_elem_xc_vis~3.html +++ b/proc/get_elem_xc_vis~3.html @@ -83,15 +83,15 @@

    get_elem_Xc_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_elem_Xc_vis(this) result(elemConn)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -254,7 +262,7 @@

    Components

    @@ -271,7 +279,7 @@

    Components

    @@ -288,7 +296,7 @@

    Components

    @@ -305,7 +313,7 @@

    Components

    @@ -339,7 +347,7 @@

    Components

    @@ -356,7 +364,7 @@

    Components

    @@ -373,7 +381,7 @@

    Components

    @@ -390,7 +398,7 @@

    Components

    @@ -407,7 +415,7 @@

    Components

    @@ -424,7 +432,7 @@

    Components

    @@ -441,7 +449,7 @@

    Components

    @@ -458,7 +466,7 @@

    Components

    @@ -475,7 +483,7 @@

    Components

    @@ -503,7 +511,7 @@

    Type-Bound Procedures

    - +

    procedure, public :: basis @@ -519,7 +527,7 @@

    • - private pure subroutine basis(this, res1, res2, res3, Xt1, Xt2, Xt3, Tgc) + private pure subroutine basis(this, res1, res2, res3, Xt1, Xt2, Xt3, Tgc)

      Author
      Seyed Ali Ghasemi
      @@ -672,7 +680,7 @@

      Arguments

      - +

      procedure, public :: cmp_elem @@ -688,7 +696,7 @@

      • - private pure function cmp_elem(this) result(elemConn) + private pure function cmp_elem(this) result(elemConn)

        Author
        Seyed Ali Ghasemi
        @@ -741,7 +749,7 @@

        - +

        procedure, public :: cmp_elem_Xc_vis @@ -757,7 +765,7 @@

        • - private pure function cmp_elem_Xc_vis(this, p) result(elemConn) + private pure function cmp_elem_Xc_vis(this, p) result(elemConn)

          Author
          Seyed Ali Ghasemi
          @@ -825,7 +833,7 @@

          - +

          procedure, public :: cmp_elem_Xg_vis @@ -841,7 +849,7 @@

          • - private pure function cmp_elem_Xg_vis(this, p) result(elemConn) + private pure function cmp_elem_Xg_vis(this, p) result(elemConn)

            Author
            Seyed Ali Ghasemi
            @@ -909,7 +917,7 @@

            - +

            procedure, public :: create @@ -925,7 +933,7 @@

            • - private pure subroutine create(this, res1, res2, res3, Xt1, Xt2, Xt3, Xt) + private pure subroutine create(this, res1, res2, res3, Xt1, Xt2, Xt3, Xt)

              Author
              Seyed Ali Ghasemi
              @@ -1078,7 +1086,7 @@

              Arguments

              - +

              procedure, public :: derivative @@ -1094,7 +1102,7 @@

              • - private pure subroutine derivative(this, res1, res2, res3, Xt1, Xt2, Xt3, dTgc) + private pure subroutine derivative(this, res1, res2, res3, Xt1, Xt2, Xt3, dTgc)

                Author
                Seyed Ali Ghasemi
                @@ -1247,7 +1255,7 @@

                Arguments

                - +

                procedure, public :: elevate_degree @@ -1263,7 +1271,7 @@

                • - private pure subroutine elevate_degree(this, dir, t) + private pure subroutine elevate_degree(this, dir, t)

                  Author
                  Seyed Ali Ghasemi
                  @@ -1341,7 +1349,7 @@

                  Arguments

                  - +

                  procedure, public :: export_Xc @@ -1357,7 +1365,7 @@

                  • - private impure subroutine export_Xc(this, filename) + private impure subroutine export_Xc(this, filename)

                    Author
                    Seyed Ali Ghasemi
                    @@ -1420,7 +1428,7 @@

                    Arguments

                    - +

                    procedure, public :: export_Xg @@ -1436,7 +1444,7 @@

                    • - private impure subroutine export_Xg(this, filename) + private impure subroutine export_Xg(this, filename)

                      Author
                      Seyed Ali Ghasemi
                      @@ -1499,7 +1507,7 @@

                      Arguments

                      - +

                      procedure, public :: finalize @@ -1515,7 +1523,7 @@

                      • - private pure subroutine finalize(this) + private pure subroutine finalize(this)

                        Author
                        Seyed Ali Ghasemi
                        @@ -1563,10 +1571,10 @@

                        Arguments

                        - +

                        - procedure, public :: - get_Wc + generic, public :: + get_Wc => get_Wc_all, get_Wci

                        @@ -1579,7 +1587,7 @@

                        • - private pure function get_Wc(this) result(Wc) + private pure function get_Wc_all(this) result(Wc)

                          Author
                          Seyed Ali Ghasemi
                          @@ -1625,30 +1633,9 @@

                        • -
                        -

                        - -
                        -
                        -
                        -
                        - -

                        - procedure, public :: - get_Xc - -

                        -
                        -
                        - -
                        -

                        Get control points

                        -
                        -
                        -
                        • - private pure function get_Xc(this) result(Xc) + private pure function get_Wci(this, n) result(Wc)

                          Author
                          Seyed Ali Ghasemi
                          @@ -1682,6 +1669,21 @@

                          Arguments

    + + + + + + + + @@ -1689,7 +1691,7 @@

    Arguments

    Return Value - real(kind=rk), allocatable, (:,:) + real(kind=rk)

    @@ -1701,23 +1703,23 @@

    - +

    - procedure, public :: - get_Xg + generic, public :: + get_Xc => get_Xc_all, get_Xci, get_Xcid

    -

    Get geometry points

    +

    Get control points

    • - private pure function get_Xg(this) result(Xg) + private pure function get_Xc_all(this) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -1763,30 +1765,9 @@

    • -
    -
    - -
    -
    -
    -
    - -

    - procedure, public :: - get_Xt - -

    -
    -
    - -
    -

    Get parameter values

    -
    -
    -
    • - private pure function get_Xt(this, dir) result(Xt) + private pure function get_Xci(this, n) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -1832,7 +1813,7 @@

      Arguments

    - + @@ -1847,30 +1828,9 @@

    - - - - -
    -
    -
    - -

    - procedure, public :: - get_continuity - -

    -
    -
    - -
    -

    Get continuity of the volume

    -
    -
    -
    • - private pure function get_continuity(this, dir) result(c) + private pure function get_Xcid(this, n, dir) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -1914,6 +1874,21 @@

      Arguments

    + + + + + + + + @@ -1926,7 +1901,7 @@

    Arguments

    Return Value - integer, allocatable, (:) + real(kind=rk)

    @@ -1938,23 +1913,23 @@

    - +

    generic, public :: - get_degree => get_degree_all, get_degree_dir + get_Xg => get_Xg_all, get_Xgi, get_Xgid

    -

    Get degree of the NURBS volume

    +

    Get geometry points

    • - private pure function get_degree_all(this) result(degree) + private pure function get_Xg_all(this) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -1995,14 +1970,14 @@

      Arguments

      Return Value - integer, (3) + real(kind=rk), allocatable, (:,:)

    • - private pure function get_degree_dir(this, dir) result(degree) + private pure function get_Xgi(this, n) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -2048,7 +2023,7 @@

      Arguments

    - + @@ -2058,35 +2033,14 @@

    Arguments

    Return Value - integer + real(kind=rk), allocatable, (:)

    - - - - -
    -
    -
    - -

    - procedure, public :: - get_elem - -

    -
    -
    - -
    -

    Get IGA element connectivity

    -
    -
    -
    • - private pure function get_elem(this) result(elemConn) + private pure function get_Xgid(this, n, dir) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -2120,6 +2074,36 @@

      Arguments

    + + + + + + + + + + + + + + + + @@ -2127,7 +2111,7 @@

    Arguments

    Return Value - integer, allocatable, (:,:) + real(kind=rk)

    @@ -2139,23 +2123,23 @@

    - +

    procedure, public :: - get_elem_Xc_vis + get_Xt

    -

    Get connectivity for control points

    +

    Get parameter values

    • - private pure function get_elem_Xc_vis(this) result(elemConn) + private pure function get_Xt(this, dir) result(Xt)

      Author
      Seyed Ali Ghasemi
      @@ -2189,6 +2173,21 @@

      Arguments

    + + + + + + + + @@ -2196,7 +2195,7 @@

    Arguments

    Return Value - integer, allocatable, (:,:) + real(kind=rk), allocatable, (:)

    @@ -2208,23 +2207,23 @@

    - +

    procedure, public :: - get_elem_Xg_vis + get_continuity

    -

    Get connectivity for geometry points

    +

    Get continuity of the volume

    • - private pure function get_elem_Xg_vis(this) result(elemConn) + private pure function get_continuity(this, dir) result(c)

      Author
      Seyed Ali Ghasemi
      @@ -2258,6 +2257,21 @@

      Arguments

    + + + + + + + + @@ -2265,7 +2279,7 @@

    Arguments

    Return Value - integer, allocatable, (:,:) + integer, allocatable, (:)

    @@ -2277,23 +2291,23 @@

    - +

    generic, public :: - get_knot => get_knoti, get_knot_all + get_degree => get_degree_all, get_degree_dir

    -

    Get knot vector

    +

    Get degree of the NURBS volume

    • - private pure function get_knoti(this, dir, i) result(knot) + private pure function get_degree_all(this) result(degree)

      Author
      Seyed Ali Ghasemi
      @@ -2327,36 +2341,6 @@

      Arguments

    - - - - - - - - - - - - - - - - @@ -2364,14 +2348,14 @@

    Arguments

    Return Value - real(kind=rk) + integer, (3)

  • - private pure function get_knot_all(this, dir) result(knot) + private pure function get_degree_dir(this, dir) result(degree)

    Author
    Seyed Ali Ghasemi
    @@ -2427,7 +2411,7 @@

    Arguments

    Return Value - real(kind=rk), allocatable, (:) + integer

    @@ -2439,23 +2423,23 @@

    - +

    procedure, public :: - get_multiplicity + get_elem

    -

    Get multiplicity of the knot vector

    +

    Get IGA element connectivity

    • - private pure function get_multiplicity(this, dir) result(m) + private pure function get_elem(this) result(elemConn)

      Author
      Seyed Ali Ghasemi
      @@ -2489,21 +2473,6 @@

      Arguments

  • - - - - - - - - @@ -2511,7 +2480,7 @@

    Arguments

    Return Value - integer, allocatable, (:) + integer, allocatable, (:,:)

    @@ -2523,23 +2492,23 @@

    - +

    procedure, public :: - get_nc + get_elem_Xc_vis

    -

    Get number of required control points

    +

    Get connectivity for control points

    • - private pure function get_nc(this, dir) result(nc) + private pure function get_elem_Xc_vis(this) result(elemConn)

      Author
      Seyed Ali Ghasemi
      @@ -2573,21 +2542,6 @@

      Arguments

    - - - - - - - - @@ -2595,7 +2549,7 @@

    Arguments

    Return Value - integer + integer, allocatable, (:,:)

    @@ -2607,23 +2561,23 @@

    - +

    procedure, public :: - get_ng + get_elem_Xg_vis

    -

    Get number of geometry points

    +

    Get connectivity for geometry points

    • - private pure function get_ng(this) result(ng) + private pure function get_elem_Xg_vis(this) result(elemConn)

      Author
      Seyed Ali Ghasemi
      @@ -2664,7 +2618,7 @@

      Arguments

      Return Value - integer, (3) + integer, allocatable, (:,:)

      @@ -2676,23 +2630,23 @@

      - +

      - procedure, public :: - insert_knots + generic, public :: + get_knot => get_knoti, get_knot_all

      -

      Insert knots into the knot vector

      +

      Get knot vector

      • - private pure subroutine insert_knots(this, dir, Xth, r) + private pure function get_knoti(this, dir, i) result(knot)

        Author
        Seyed Ali Ghasemi
        @@ -2718,7 +2672,7 @@

        Arguments

        class(nurbs_volume), -

    + @@ -2743,32 +2697,17 @@

    Arguments

    - - - - - - - - - + - + @@ -2776,32 +2715,16 @@

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(in) @@ -176,7 +176,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_elem_xg_vis.html b/proc/get_elem_xg_vis.html index 6958584ef..d9931d448 100644 --- a/proc/get_elem_xg_vis.html +++ b/proc/get_elem_xg_vis.html @@ -83,15 +83,15 @@

    get_elem_Xg_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_elem_Xg_vis(this) result(elemConn)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -4593,14 +5583,29 @@

    Arguments

    - + + + + + + + + + @@ -4608,6 +5613,11 @@

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -176,7 +176,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_elem_xg_vis~2.html b/proc/get_elem_xg_vis~2.html index d7b98403e..0ab3aaa28 100644 --- a/proc/get_elem_xg_vis~2.html +++ b/proc/get_elem_xg_vis~2.html @@ -83,15 +83,15 @@

    get_elem_Xg_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_elem_Xg_vis(this) result(elemConn)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -4514,14 +5499,14 @@

    Arguments

    - + @@ -4529,6 +5514,11 @@

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(in) @@ -176,7 +176,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_elem_xg_vis~3.html b/proc/get_elem_xg_vis~3.html index 9762a7284..5f4305a8a 100644 --- a/proc/get_elem_xg_vis~3.html +++ b/proc/get_elem_xg_vis~3.html @@ -83,15 +83,15 @@

    get_elem_Xg_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_elem_Xg_vis(this) result(elemConn)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - - - - - - - - - - + @@ -4450,6 +5430,11 @@

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(in) @@ -176,7 +176,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_elem~2.html b/proc/get_elem~2.html index c602a0883..c3c3ee263 100644 --- a/proc/get_elem~2.html +++ b/proc/get_elem~2.html @@ -83,15 +83,15 @@

    get_elem
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_elem(this) result(elemConn)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -4311,14 +5331,14 @@

    Arguments

    - + @@ -4333,22 +5353,7 @@

    Arguments

    - - - - - - - - - + @@ -4356,6 +5361,11 @@

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(in) @@ -176,7 +176,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_elem~3.html b/proc/get_elem~3.html index 00b8e46fb..7ece595d7 100644 --- a/proc/get_elem~3.html +++ b/proc/get_elem~3.html @@ -83,15 +83,15 @@

    get_elem
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_elem(this) result(elemConn)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -4234,12 +5249,12 @@

    Arguments

    integer, - + - + @@ -4247,6 +5262,11 @@

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(in) @@ -176,7 +176,7 @@

    Arguments

    Return Value - + integer, allocatable, (:,:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_knot_all.html b/proc/get_knot_all.html index 76415617d..2c81f843a 100644 --- a/proc/get_knot_all.html +++ b/proc/get_knot_all.html @@ -78,20 +78,20 @@

    get_knot_all
  • 26 statements + title=" 0.5% of total for procedures.">20 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_knot_all(this, dir) result(knot)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -191,7 +191,7 @@

    Arguments

    Return Value - + real(kind=rk), allocatable, (:)

    @@ -217,14 +217,14 @@

    Called by

    proc~get_knot_all -nurbs_volume%get_knot_all +nurbs_surface%get_knot_all none~get_knot - + -nurbs_volume%get_knot +nurbs_surface%get_knot @@ -234,18 +234,18 @@

    Called by

    - + -program~example3_volume - +program~example3_surface + -example3_volume +example3_surface - + -program~example3_volume->none~get_knot +program~example3_surface->none~get_knot @@ -363,7 +363,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_knot_all~2.html b/proc/get_knot_all~2.html index 5112654dd..a1d65ab5c 100644 --- a/proc/get_knot_all~2.html +++ b/proc/get_knot_all~2.html @@ -78,20 +78,20 @@

    get_knot_all
  • 20 statements + title=" 0.2% of total for procedures.">9 statements
  • - Source File + Source File
  • @@ -137,13 +137,13 @@

    Contents

    -

    private pure function get_knot_all(this, dir) result(knot) +

    private pure function get_knot_all(this) result(knot)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - @@ -191,7 +176,7 @@

    Arguments

    Return Value - + real(kind=rk), allocatable, (:)

    @@ -208,46 +193,46 @@

    Called by

    - + proc~~get_knot_all~2~~CalledByGraph - + proc~get_knot_all~2 - -nurbs_surface%get_knot_all + +nurbs_curve%get_knot_all none~get_knot~2 - - -nurbs_surface%get_knot + + +nurbs_curve%get_knot none~get_knot~2->proc~get_knot_all~2 - - + + - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->none~get_knot~2 - - +program~example1_curve->none~get_knot~2 + + @@ -363,7 +348,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_knot_all~3.html b/proc/get_knot_all~3.html index 65fa83eda..1fe31622b 100644 --- a/proc/get_knot_all~3.html +++ b/proc/get_knot_all~3.html @@ -78,20 +78,20 @@

    get_knot_all
  • 9 statements + title=" 0.7% of total for procedures.">26 statements
  • - Source File + Source File
  • @@ -137,13 +137,13 @@

    Contents

    -

    private pure function get_knot_all(this) result(knot) +

    private pure function get_knot_all(this, dir) result(knot)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(in) @@ -169,21 +169,6 @@

    Arguments

    this -
    - - integer, - intent(in) - - ::dir -
    @@ -158,8 +158,8 @@

    Arguments

    + + + + + + + + @@ -176,7 +191,7 @@

    Arguments

    Return Value - + real(kind=rk), allocatable, (:)

    @@ -193,46 +208,46 @@

    Called by

    - + proc~~get_knot_all~3~~CalledByGraph - + proc~get_knot_all~3 - -nurbs_curve%get_knot_all + +nurbs_volume%get_knot_all none~get_knot~3 - - -nurbs_curve%get_knot + + +nurbs_volume%get_knot none~get_knot~3->proc~get_knot_all~3 - - + + - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->none~get_knot~3 - - +program~example3_volume->none~get_knot~3 + + @@ -348,7 +363,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_knoti.html b/proc/get_knoti.html index 5fbdd5077..a9fb8848f 100644 --- a/proc/get_knoti.html +++ b/proc/get_knoti.html @@ -78,20 +78,20 @@

    get_knoti
  • 39 statements + title=" 0.8% of total for procedures.">29 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_knoti(this, dir, i) result(knot)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(in) @@ -169,6 +169,21 @@

    Arguments

    this +
    + + integer, + intent(in) + + ::dir +
    @@ -158,8 +158,8 @@

    Arguments

    @@ -188,7 +188,7 @@

    Arguments

    @@ -206,7 +206,7 @@

    Arguments

    Return Value - + real(kind=rk)

    @@ -232,14 +232,14 @@

    Called by

    proc~get_knoti -nurbs_volume%get_knoti +nurbs_surface%get_knoti none~get_knot - + -nurbs_volume%get_knot +nurbs_surface%get_knot @@ -249,18 +249,18 @@

    Called by

    - + -program~example3_volume - +program~example3_surface + -example3_volume +example3_surface - + -program~example3_volume->none~get_knot +program~example3_surface->none~get_knot @@ -378,7 +378,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_knoti~2.html b/proc/get_knoti~2.html index 8c78f07e4..babef6b0c 100644 --- a/proc/get_knoti~2.html +++ b/proc/get_knoti~2.html @@ -78,20 +78,20 @@

    get_knoti
  • 29 statements + title=" 0.4% of total for procedures.">14 statements
  • - Source File + Source File
  • -

    private pure function get_knoti(this, dir, i) result(knot) +

    private pure function get_knoti(this, i) result(knot)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in)
    - + integer, intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - @@ -206,7 +191,7 @@

    Arguments

    Return Value - + real(kind=rk)

    @@ -223,46 +208,46 @@

    Called by

    - + proc~~get_knoti~2~~CalledByGraph - + proc~get_knoti~2 - -nurbs_surface%get_knoti + +nurbs_curve%get_knoti none~get_knot~2 - - -nurbs_surface%get_knot + + +nurbs_curve%get_knot none~get_knot~2->proc~get_knoti~2 - - + + - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->none~get_knot~2 - - +program~example1_curve->none~get_knot~2 + + @@ -378,7 +363,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_knoti~3.html b/proc/get_knoti~3.html index 2438af44b..196fad052 100644 --- a/proc/get_knoti~3.html +++ b/proc/get_knoti~3.html @@ -78,20 +78,20 @@

    get_knoti
  • 14 statements + title=" 1.0% of total for procedures.">39 statements
  • - Source File + Source File
  • -

    private pure function get_knoti(this, i) result(knot) +

    private pure function get_knoti(this, dir, i) result(knot)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(in) @@ -173,22 +173,7 @@

    Arguments

    - - integer, - intent(in) - - ::dir - -
    - + integer, intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    + + + + + + + + - + @@ -4148,26 +5173,16 @@

    Arguments

    - - - - - - - -
    - - class(nurbs_curve), + + class(nurbs_volume), intent(in) @@ -171,6 +171,21 @@

    Arguments

    + + integer, + intent(in) + + ::dir + +
    @@ -191,7 +206,7 @@

    Arguments

    Return Value - + real(kind=rk)

    @@ -208,46 +223,46 @@

    Called by

    - + proc~~get_knoti~3~~CalledByGraph - + proc~get_knoti~3 - -nurbs_curve%get_knoti + +nurbs_volume%get_knoti none~get_knot~3 - - -nurbs_curve%get_knot + + +nurbs_volume%get_knot none~get_knot~3->proc~get_knoti~3 - - + + - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->none~get_knot~3 - - +program~example3_volume->none~get_knot~3 + + @@ -363,7 +378,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_multiplicity.html b/proc/get_multiplicity.html index beb708c67..813e1dca3 100644 --- a/proc/get_multiplicity.html +++ b/proc/get_multiplicity.html @@ -78,20 +78,20 @@

    get_multiplicity
  • 26 statements + title=" 0.5% of total for procedures.">20 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_multiplicity(this, dir) result(m)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -191,7 +191,7 @@

    Arguments

    Return Value - + integer, allocatable, (:)

    @@ -217,7 +217,7 @@

    Calls

    proc~get_multiplicity -nurbs_volume%get_multiplicity +nurbs_surface%get_multiplicity @@ -358,307 +358,292 @@

    Called by

    - - + + proc~~get_multiplicity~~CalledByGraph - + proc~get_multiplicity - -nurbs_volume%get_multiplicity + +nurbs_surface%get_multiplicity proc~cmp_elem - - -nurbs_volume%cmp_elem + + +nurbs_surface%cmp_elem proc~cmp_elem->proc~get_multiplicity - - + + proc~get_degree_all - - -nurbs_volume%get_degree_all + + +nurbs_surface%get_degree_all proc~get_degree_all->proc~get_multiplicity - - + + proc~get_degree_dir - - -nurbs_volume%get_degree_dir + + +nurbs_surface%get_degree_dir proc~get_degree_dir->proc~get_multiplicity - - + + none~get_degree - - -nurbs_volume%get_degree + + +nurbs_surface%get_degree none~get_degree->proc~get_degree_all - - + + none~get_degree->proc~get_degree_dir - - + + proc~set1 - - -nurbs_volume%set1 + + +nurbs_surface%set1 proc~set1->none~get_degree - - + + proc~set3 - - -nurbs_volume%set3 + + +nurbs_surface%set3 proc~set3->none~get_degree - - + + - + -program~example3_volume - - -example3_volume +program~example3_surface + + +example3_surface - + -program~example3_volume->none~get_degree - - +program~example3_surface->none~get_degree + + none~set - - -nurbs_volume%set + + +nurbs_surface%set - + -program~example3_volume->none~set - - +program~example3_surface->none~set + + proc~elevate_degree - - -nurbs_volume%elevate_degree + + +nurbs_surface%elevate_degree - - -program~example3_volume->proc~elevate_degree - - + + +program~example3_surface->proc~elevate_degree + + proc~insert_knots - - -nurbs_volume%insert_knots + + +nurbs_surface%insert_knots - - -program~example3_volume->proc~insert_knots - - + + +program~example3_surface->proc~insert_knots + + proc~remove_knots - - -nurbs_volume%remove_knots + + +nurbs_surface%remove_knots - - -program~example3_volume->proc~remove_knots - - + + +program~example3_surface->proc~remove_knots + + none~set->proc~set1 - - + + none~set->proc~set3 - - + + proc~elevate_degree->none~set - - + + proc~insert_knots->none~set - - + + proc~modify_wc - - -nurbs_volume%modify_Wc + + +nurbs_surface%modify_Wc proc~modify_wc->none~set - - + + proc~modify_xc - - -nurbs_volume%modify_Xc + + +nurbs_surface%modify_Xc proc~modify_xc->none~set - - + + proc~remove_knots->none~set - - + + - + -proc~set_hexahedron - - -nurbs_volume%set_hexahedron +proc~set_tetragon + + +nurbs_surface%set_tetragon - + -proc~set_hexahedron->none~set - - +proc~set_tetragon->none~set + + - + -program~example_morph - - -example_morph +program~example_nurbs_surface + + +example_nurbs_surface - + -program~example_morph->none~set - - +program~example_nurbs_surface->none~set + + - + -program~example_nurbs_volume - - -example_nurbs_volume +program~shape_tetragon + + +shape_tetragon - - -program~example_nurbs_volume->none~set - - - - - -program~shape_hexahedron - - -shape_hexahedron - - - - - -program~shape_hexahedron->proc~set_hexahedron - - + + +program~shape_tetragon->proc~set_tetragon + + @@ -778,7 +763,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_multiplicity~2.html b/proc/get_multiplicity~2.html index ea7d61e56..68e02be9f 100644 --- a/proc/get_multiplicity~2.html +++ b/proc/get_multiplicity~2.html @@ -78,20 +78,20 @@

    get_multiplicity
  • 20 statements + title=" 0.2% of total for procedures.">9 statements
  • - Source File + Source File
  • @@ -137,13 +137,13 @@

    Contents

    -

    private pure function get_multiplicity(this, dir) result(m) +

    private pure function get_multiplicity(this) result(m)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - @@ -191,7 +176,7 @@

    Arguments

    Return Value - + integer, allocatable, (:)

    @@ -208,61 +193,61 @@

    Calls

    - + proc~~get_multiplicity~2~~CallsGraph - + proc~get_multiplicity~2 - -nurbs_surface%get_multiplicity + +nurbs_curve%get_multiplicity interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity - - + + proc~compute_multiplicity1 - -compute_multiplicity1 + +compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 - - + + proc~compute_multiplicity2 - -compute_multiplicity2 + +compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 - - + + @@ -358,292 +343,256 @@

    Called by

    - - + + proc~~get_multiplicity~2~~CalledByGraph - + proc~get_multiplicity~2 - -nurbs_surface%get_multiplicity + +nurbs_curve%get_multiplicity proc~cmp_elem~2 - - -nurbs_surface%cmp_elem + + +nurbs_curve%cmp_elem proc~cmp_elem~2->proc~get_multiplicity~2 - - + + - + -proc~get_degree_all~2 - - -nurbs_surface%get_degree_all +proc~get_degree + + +nurbs_curve%get_degree - + -proc~get_degree_all~2->proc~get_multiplicity~2 - - +proc~get_degree->proc~get_multiplicity~2 + + - + -proc~get_degree_dir~2 - - -nurbs_surface%get_degree_dir +proc~set1~2 + + +nurbs_curve%set1 - + -proc~get_degree_dir~2->proc~get_multiplicity~2 - - +proc~set1~2->proc~get_degree + + - + -none~get_degree~2 - - -nurbs_surface%get_degree +proc~set3~2 + + +nurbs_curve%set3 - + -none~get_degree~2->proc~get_degree_all~2 - - - - - -none~get_degree~2->proc~get_degree_dir~2 - - +proc~set3~2->proc~get_degree + + - + -proc~set1~2 - - -nurbs_surface%set1 +program~example1_curve + + +example1_curve - - -proc~set1~2->none~get_degree~2 - - - - - -proc~set3~2 - - -nurbs_surface%set3 - - - - - -proc~set3~2->none~get_degree~2 - - - - - -program~example3_surface - - -example3_surface - - - - - -program~example3_surface->none~get_degree~2 - - + + +program~example1_curve->proc~get_degree + + - + none~set~2 - - -nurbs_surface%set + + +nurbs_curve%set - - -program~example3_surface->none~set~2 - - + + +program~example1_curve->none~set~2 + + - + proc~elevate_degree~2 - - -nurbs_surface%elevate_degree + + +nurbs_curve%elevate_degree - - -program~example3_surface->proc~elevate_degree~2 - - + + +program~example1_curve->proc~elevate_degree~2 + + - + proc~insert_knots~2 - - -nurbs_surface%insert_knots + + +nurbs_curve%insert_knots - - -program~example3_surface->proc~insert_knots~2 - - + + +program~example1_curve->proc~insert_knots~2 + + - + proc~remove_knots~2 - - -nurbs_surface%remove_knots + + +nurbs_curve%remove_knots - - -program~example3_surface->proc~remove_knots~2 - - + + +program~example1_curve->proc~remove_knots~2 + + - + none~set~2->proc~set1~2 - - + + - + none~set~2->proc~set3~2 - - + + - + proc~elevate_degree~2->none~set~2 - - + + - + proc~insert_knots~2->none~set~2 - - + + - + proc~modify_wc~2 - - -nurbs_surface%modify_Wc + + +nurbs_curve%modify_Wc - + proc~modify_wc~2->none~set~2 - - + + - + proc~modify_xc~2 - - -nurbs_surface%modify_Xc + + +nurbs_curve%modify_Xc - + proc~modify_xc~2->none~set~2 - - + + - + proc~remove_knots~2->none~set~2 - - + + - - -proc~set_tetragon - - -nurbs_surface%set_tetragon + + +proc~set_circle + + +nurbs_curve%set_circle - - -proc~set_tetragon->none~set~2 - - - - - -program~example_nurbs_surface - - -example_nurbs_surface + + +proc~set_circle->none~set~2 + + + + + +program~example_nurbs_curve + + +example_nurbs_curve - - -program~example_nurbs_surface->none~set~2 - - - - - -program~shape_tetragon - - -shape_tetragon + + +program~example_nurbs_curve->none~set~2 + + + + + +program~shape_circle + + +shape_circle - - -program~shape_tetragon->proc~set_tetragon - - + + +program~shape_circle->proc~set_circle + + @@ -763,7 +712,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_multiplicity~3.html b/proc/get_multiplicity~3.html index 4933e0cec..92812a58e 100644 --- a/proc/get_multiplicity~3.html +++ b/proc/get_multiplicity~3.html @@ -78,20 +78,20 @@

    get_multiplicity
  • 9 statements + title=" 0.7% of total for procedures.">26 statements
  • - Source File + Source File
  • @@ -137,13 +137,13 @@

    Contents

    -

    private pure function get_multiplicity(this) result(m) +

    private pure function get_multiplicity(this, dir) result(m)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(in) @@ -169,21 +169,6 @@

    Arguments

    this -
    - - integer, - intent(in) - - ::dir -
    @@ -158,8 +158,8 @@

    Arguments

    + + + + + + + + @@ -193,61 +208,61 @@

    Calls

    - + proc~~get_multiplicity~3~~CallsGraph - + proc~get_multiplicity~3 - -nurbs_curve%get_multiplicity + +nurbs_volume%get_multiplicity interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity - - + + proc~compute_multiplicity1 - -compute_multiplicity1 + +compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 - - + + proc~compute_multiplicity2 - -compute_multiplicity2 + +compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 - - + + @@ -343,256 +358,307 @@

    Called by

    - - + + proc~~get_multiplicity~3~~CalledByGraph - + proc~get_multiplicity~3 - -nurbs_curve%get_multiplicity + +nurbs_volume%get_multiplicity proc~cmp_elem~3 - - -nurbs_curve%cmp_elem + + +nurbs_volume%cmp_elem proc~cmp_elem~3->proc~get_multiplicity~3 - - + + - + -proc~get_degree - - -nurbs_curve%get_degree +proc~get_degree_all~2 + + +nurbs_volume%get_degree_all - + -proc~get_degree->proc~get_multiplicity~3 - - +proc~get_degree_all~2->proc~get_multiplicity~3 + + - + -proc~set1~3 - - -nurbs_curve%set1 +proc~get_degree_dir~2 + + +nurbs_volume%get_degree_dir - + -proc~set1~3->proc~get_degree - - +proc~get_degree_dir~2->proc~get_multiplicity~3 + + - + -proc~set3~3 - - -nurbs_curve%set3 +none~get_degree~3 + + +nurbs_volume%get_degree - + -proc~set3~3->proc~get_degree - - +none~get_degree~3->proc~get_degree_all~2 + + + + + +none~get_degree~3->proc~get_degree_dir~2 + + - + -program~example1_curve - - -example1_curve +proc~set1~3 + + +nurbs_volume%set1 - - -program~example1_curve->proc~get_degree - - + + +proc~set1~3->none~get_degree~3 + + - + +proc~set3~3 + + +nurbs_volume%set3 + + + + + +proc~set3~3->none~get_degree~3 + + + + + +program~example3_volume + + +example3_volume + + + + + +program~example3_volume->none~get_degree~3 + + + + + none~set~3 - - -nurbs_curve%set + + +nurbs_volume%set - - -program~example1_curve->none~set~3 - - + + +program~example3_volume->none~set~3 + + - + proc~elevate_degree~3 - - -nurbs_curve%elevate_degree + + +nurbs_volume%elevate_degree - - -program~example1_curve->proc~elevate_degree~3 - - + + +program~example3_volume->proc~elevate_degree~3 + + - + proc~insert_knots~3 - - -nurbs_curve%insert_knots + + +nurbs_volume%insert_knots - - -program~example1_curve->proc~insert_knots~3 - - + + +program~example3_volume->proc~insert_knots~3 + + - + proc~remove_knots~3 - - -nurbs_curve%remove_knots + + +nurbs_volume%remove_knots - - -program~example1_curve->proc~remove_knots~3 - - + + +program~example3_volume->proc~remove_knots~3 + + - + none~set~3->proc~set1~3 - - + + - + none~set~3->proc~set3~3 - - + + - + proc~elevate_degree~3->none~set~3 - - + + - + proc~insert_knots~3->none~set~3 - - + + - + proc~modify_wc~3 - - -nurbs_curve%modify_Wc + + +nurbs_volume%modify_Wc - + proc~modify_wc~3->none~set~3 - - + + - + proc~modify_xc~3 - - -nurbs_curve%modify_Xc + + +nurbs_volume%modify_Xc - + proc~modify_xc~3->none~set~3 - - + + - + proc~remove_knots~3->none~set~3 - - + + - - -proc~set_circle - - -nurbs_curve%set_circle + + +proc~set_hexahedron + + +nurbs_volume%set_hexahedron - - -proc~set_circle->none~set~3 - - - - - -program~example_nurbs_curve - - -example_nurbs_curve + + +proc~set_hexahedron->none~set~3 + + + + + +program~example_morph + + +example_morph - - -program~example_nurbs_curve->none~set~3 - - - - - -program~shape_circle - - -shape_circle + + +program~example_morph->none~set~3 + + + + + +program~example_nurbs_volume + + +example_nurbs_volume - + -program~shape_circle->proc~set_circle - - +program~example_nurbs_volume->none~set~3 + + + + + +program~shape_hexahedron + + +shape_hexahedron + + + + + +program~shape_hexahedron->proc~set_hexahedron + + @@ -712,7 +778,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_nc.html b/proc/get_nc.html index b5e4fdeb9..4b41f13a8 100644 --- a/proc/get_nc.html +++ b/proc/get_nc.html @@ -78,20 +78,20 @@

    get_nc
  • 26 statements + title=" 0.5% of total for procedures.">20 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_nc(this, dir) result(nc)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(in) @@ -169,6 +169,21 @@

    Arguments

    this +
    + + integer, + intent(in) + + ::dir +
    @@ -158,8 +158,8 @@

    Arguments

    @@ -191,7 +191,7 @@

    Arguments

    Return Value - + integer

    @@ -217,7 +217,7 @@

    Calls

    proc~get_nc -nurbs_volume%get_nc +nurbs_surface%get_nc @@ -358,235 +358,220 @@

    Called by

    - - + + proc~~get_nc~~CalledByGraph - + proc~get_nc - -nurbs_volume%get_nc + +nurbs_surface%get_nc proc~set1 - - -nurbs_volume%set1 + + +nurbs_surface%set1 proc~set1->proc~get_nc - - + + proc~set2 - - -nurbs_volume%set2 + + +nurbs_surface%set2 proc~set2->proc~get_nc - - + + none~set - - -nurbs_volume%set + + +nurbs_surface%set none~set->proc~set1 - - + + none~set->proc~set2 - - + + proc~elevate_degree - - -nurbs_volume%elevate_degree + + +nurbs_surface%elevate_degree proc~elevate_degree->none~set - - + + proc~insert_knots - - -nurbs_volume%insert_knots + + +nurbs_surface%insert_knots proc~insert_knots->none~set - - + + proc~modify_wc - - -nurbs_volume%modify_Wc + + +nurbs_surface%modify_Wc proc~modify_wc->none~set - - + + proc~modify_xc - - -nurbs_volume%modify_Xc + + +nurbs_surface%modify_Xc proc~modify_xc->none~set - - + + proc~remove_knots - - -nurbs_volume%remove_knots + + +nurbs_surface%remove_knots proc~remove_knots->none~set - - + + - + -proc~set_hexahedron - - -nurbs_volume%set_hexahedron +proc~set_tetragon + + +nurbs_surface%set_tetragon - + -proc~set_hexahedron->none~set - - +proc~set_tetragon->none~set + + - + -program~example3_volume - - -example3_volume +program~example3_surface + + +example3_surface - + -program~example3_volume->none~set - - +program~example3_surface->none~set + + - + + +program~example3_surface->proc~elevate_degree + + + + -program~example3_volume->proc~elevate_degree - - +program~example3_surface->proc~insert_knots + + - + -program~example3_volume->proc~insert_knots - - +program~example3_surface->proc~remove_knots + + - - -program~example3_volume->proc~remove_knots - - - - + -program~example_morph - - -example_morph +program~example_nurbs_surface + + +example_nurbs_surface - + -program~example_morph->none~set - - +program~example_nurbs_surface->none~set + + - + -program~example_nurbs_volume - - -example_nurbs_volume +program~shape_tetragon + + +shape_tetragon - - -program~example_nurbs_volume->none~set - - - - - -program~shape_hexahedron - - -shape_hexahedron - - - - - -program~shape_hexahedron->proc~set_hexahedron - - + + +program~shape_tetragon->proc~set_tetragon + + @@ -706,7 +691,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_nc~2.html b/proc/get_nc~2.html index bcddcc580..595b80b93 100644 --- a/proc/get_nc~2.html +++ b/proc/get_nc~2.html @@ -78,20 +78,20 @@

    get_nc
  • 20 statements + title=" 0.1% of total for procedures.">5 statements
  • - Source File + Source File
  • -

    private pure function get_nc(this, dir) result(nc) +

    private pure function get_nc(this) result(nc)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - @@ -191,7 +176,7 @@

    Arguments

    Return Value - + integer

    @@ -208,61 +193,61 @@

    Calls

    - + proc~~get_nc~2~~CallsGraph - + proc~get_nc~2 - -nurbs_surface%get_nc + +nurbs_curve%get_nc interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity proc~get_nc~2->interface~compute_multiplicity - - + + proc~compute_multiplicity1 - -compute_multiplicity1 + +compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 - - + + proc~compute_multiplicity2 - -compute_multiplicity2 + +compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 - - + + @@ -334,319 +319,6 @@ -

    Solid arrows point from a procedure to one which it calls. Dashed -arrows point from an interface to procedures which implement that interface. -This could include the module procedures in a generic interface or the -implementation in a submodule of an interface in a parent module. -

    - Where possible, edges connecting nodes are -given different colours to make them easier to distinguish in -large graphs. - - - - - -
    -
    -

    Called by

    -
    -
    -
    - - - - - -proc~~get_nc~2~~CalledByGraph - - - -proc~get_nc~2 - -nurbs_surface%get_nc - - - -proc~set1~2 - - -nurbs_surface%set1 - - - - - -proc~set1~2->proc~get_nc~2 - - - - - -proc~set2~2 - - -nurbs_surface%set2 - - - - - -proc~set2~2->proc~get_nc~2 - - - - - -none~set~2 - - -nurbs_surface%set - - - - - -none~set~2->proc~set1~2 - - - - - -none~set~2->proc~set2~2 - - - - - -proc~elevate_degree~2 - - -nurbs_surface%elevate_degree - - - - - -proc~elevate_degree~2->none~set~2 - - - - - -proc~insert_knots~2 - - -nurbs_surface%insert_knots - - - - - -proc~insert_knots~2->none~set~2 - - - - - -proc~modify_wc~2 - - -nurbs_surface%modify_Wc - - - - - -proc~modify_wc~2->none~set~2 - - - - - -proc~modify_xc~2 - - -nurbs_surface%modify_Xc - - - - - -proc~modify_xc~2->none~set~2 - - - - - -proc~remove_knots~2 - - -nurbs_surface%remove_knots - - - - - -proc~remove_knots~2->none~set~2 - - - - - -proc~set_tetragon - - -nurbs_surface%set_tetragon - - - - - -proc~set_tetragon->none~set~2 - - - - - -program~example3_surface - - -example3_surface - - - - - -program~example3_surface->none~set~2 - - - - - -program~example3_surface->proc~elevate_degree~2 - - - - - -program~example3_surface->proc~insert_knots~2 - - - - - -program~example3_surface->proc~remove_knots~2 - - - - - -program~example_nurbs_surface - - -example_nurbs_surface - - - - - -program~example_nurbs_surface->none~set~2 - - - - - -program~shape_tetragon - - -shape_tetragon - - - - - -program~shape_tetragon->proc~set_tetragon - - - - - -
    - Help -
    -
    - - class(nurbs_surface), + + class(nurbs_curve), intent(in) @@ -169,21 +169,6 @@

    Arguments

    this -
    - - integer, - intent(in) - - ::dir -
    @@ -158,8 +158,8 @@

    Arguments

    + + + + + + + + @@ -176,7 +191,7 @@

    Arguments

    Return Value - + integer

    @@ -193,61 +208,61 @@

    Calls

    - + proc~~get_nc~3~~CallsGraph - + proc~get_nc~3 - -nurbs_curve%get_nc + +nurbs_volume%get_nc interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity proc~get_nc~3->interface~compute_multiplicity - - + + proc~compute_multiplicity1 - -compute_multiplicity1 + +compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 - - + + proc~compute_multiplicity2 - -compute_multiplicity2 + +compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 - - + + @@ -319,6 +334,334 @@ +

    Solid arrows point from a procedure to one which it calls. Dashed +arrows point from an interface to procedures which implement that interface. +This could include the module procedures in a generic interface or the +implementation in a submodule of an interface in a parent module. +

    + Where possible, edges connecting nodes are +given different colours to make them easier to distinguish in +large graphs. + + + + + +
    +
    +

    Called by

    +
    +
    +
    + + + + + +proc~~get_nc~3~~CalledByGraph + + + +proc~get_nc~3 + +nurbs_volume%get_nc + + + +proc~set1~3 + + +nurbs_volume%set1 + + + + + +proc~set1~3->proc~get_nc~3 + + + + + +proc~set2~3 + + +nurbs_volume%set2 + + + + + +proc~set2~3->proc~get_nc~3 + + + + + +none~set~3 + + +nurbs_volume%set + + + + + +none~set~3->proc~set1~3 + + + + + +none~set~3->proc~set2~3 + + + + + +proc~elevate_degree~3 + + +nurbs_volume%elevate_degree + + + + + +proc~elevate_degree~3->none~set~3 + + + + + +proc~insert_knots~3 + + +nurbs_volume%insert_knots + + + + + +proc~insert_knots~3->none~set~3 + + + + + +proc~modify_wc~3 + + +nurbs_volume%modify_Wc + + + + + +proc~modify_wc~3->none~set~3 + + + + + +proc~modify_xc~3 + + +nurbs_volume%modify_Xc + + + + + +proc~modify_xc~3->none~set~3 + + + + + +proc~remove_knots~3 + + +nurbs_volume%remove_knots + + + + + +proc~remove_knots~3->none~set~3 + + + + + +proc~set_hexahedron + + +nurbs_volume%set_hexahedron + + + + + +proc~set_hexahedron->none~set~3 + + + + + +program~example3_volume + + +example3_volume + + + + + +program~example3_volume->none~set~3 + + + + + +program~example3_volume->proc~elevate_degree~3 + + + + + +program~example3_volume->proc~insert_knots~3 + + + + + +program~example3_volume->proc~remove_knots~3 + + + + + +program~example_morph + + +example_morph + + + + + +program~example_morph->none~set~3 + + + + + +program~example_nurbs_volume + + +example_nurbs_volume + + + + + +program~example_nurbs_volume->none~set~3 + + + + + +program~shape_hexahedron + + +shape_hexahedron + + + + + +program~shape_hexahedron->proc~set_hexahedron + + + + + +
    + Help +
    +
    - - class(nurbs_curve), + + class(nurbs_volume), intent(in) @@ -169,6 +169,21 @@

    Arguments

    this +
    + + integer, + intent(in) + + ::dir +
    @@ -158,8 +158,8 @@

    Arguments

    @@ -176,7 +176,7 @@

    Arguments

    Return Value - + real(kind=rk), allocatable, (:,:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_xg~3.html b/proc/get_xg_all~2.html similarity index 96% rename from proc/get_xg~3.html rename to proc/get_xg_all~2.html index d3fd7598d..c393b9f73 100644 --- a/proc/get_xg~3.html +++ b/proc/get_xg_all~2.html @@ -10,7 +10,7 @@ - get_Xg – ForCAD + get_Xg_all – ForCAD @@ -65,7 +65,7 @@
    -

    get_Xg +

    get_Xg_all Function

    @@ -92,7 +92,7 @@

    get_Xg

    @@ -137,7 +137,7 @@

    Contents

    -

    private pure function get_Xg(this) result(Xg) +

    private pure function get_Xg_all(this) result(Xg)

    @@ -158,7 +158,7 @@

    Arguments

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_xc.html b/proc/get_xg_all~3.html similarity index 96% rename from proc/get_xc.html rename to proc/get_xg_all~3.html index 533f6e50b..65c852bb6 100644 --- a/proc/get_xc.html +++ b/proc/get_xg_all~3.html @@ -10,7 +10,7 @@ - get_Xc – ForCAD + get_Xg_all – ForCAD @@ -65,7 +65,7 @@
    -

    get_Xc +

    get_Xg_all Function

    @@ -92,7 +92,7 @@

    get_Xc

    @@ -137,7 +137,7 @@

    Contents

    -

    private pure function get_Xc(this) result(Xc) +

    private pure function get_Xg_all(this) result(Xg)

    @@ -158,7 +158,7 @@

    Arguments

    @@ -176,7 +176,7 @@

    Arguments

    Return Value - + real(kind=rk), allocatable, (:,:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_xgi.html b/proc/get_xgi.html new file mode 100644 index 000000000..3a547e0c8 --- /dev/null +++ b/proc/get_xgi.html @@ -0,0 +1,259 @@ + + + + + + + + + + + + + get_Xgi – ForCAD + + + + + + + + + + + + + + +
    + +
    + +
    +
    +

    get_Xgi + Function + +

    +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + + +
    +

    private pure function get_Xgi(this, n) result(Xg) +

    + + + +

    Type Bound

    +

    nurbs_surface

    + +

    Arguments

    +

    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -177,7 +177,7 @@

    Arguments

    Return Value - integer, (3) + integer, (2)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_ng~2.html b/proc/get_ng~2.html index 64f628c98..9d81feb62 100644 --- a/proc/get_ng~2.html +++ b/proc/get_ng~2.html @@ -83,15 +83,15 @@

    get_ng
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_ng(this) result(ng)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -176,7 +176,7 @@

    Arguments

    Return Value - + real(kind=rk), allocatable, (:,:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_xc~3.html b/proc/get_xc_all~2.html similarity index 96% rename from proc/get_xc~3.html rename to proc/get_xc_all~2.html index 90dd63394..b9d1b2ec5 100644 --- a/proc/get_xc~3.html +++ b/proc/get_xc_all~2.html @@ -10,7 +10,7 @@ - get_Xc – ForCAD + get_Xc_all – ForCAD @@ -65,7 +65,7 @@
    -

    get_Xc +

    get_Xc_all Function

    @@ -92,7 +92,7 @@

    get_Xc

    @@ -137,7 +137,7 @@

    Contents

    -

    private pure function get_Xc(this) result(Xc) +

    private pure function get_Xc_all(this) result(Xc)

    @@ -158,7 +158,7 @@

    Arguments

    @@ -176,7 +176,7 @@

    Arguments

    Return Value - + real(kind=rk), allocatable, (:,:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_xg.html b/proc/get_xc_all~3.html similarity index 96% rename from proc/get_xg.html rename to proc/get_xc_all~3.html index 0c2dfb658..34b2d1fb2 100644 --- a/proc/get_xg.html +++ b/proc/get_xc_all~3.html @@ -10,7 +10,7 @@ - get_Xg – ForCAD + get_Xc_all – ForCAD @@ -65,7 +65,7 @@
    -

    get_Xg +

    get_Xc_all Function

    @@ -92,7 +92,7 @@

    get_Xg

    @@ -137,7 +137,7 @@

    Contents

    -

    private pure function get_Xg(this) result(Xg) +

    private pure function get_Xc_all(this) result(Xc)

    @@ -158,7 +158,7 @@

    Arguments

    @@ -176,7 +176,7 @@

    Arguments

    Return Value - + real(kind=rk), allocatable, (:,:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_xci.html b/proc/get_xci.html new file mode 100644 index 000000000..eca2e5c0d --- /dev/null +++ b/proc/get_xci.html @@ -0,0 +1,259 @@ + + + + + + + + + + + + + get_Xci – ForCAD + + + + + + + + + + + + + + +
    + +
    + +
    +
    +

    get_Xci + Function + +

    +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + + +
    +

    private pure function get_Xci(this, n) result(Xc) +

    + + + +

    Type Bound

    +

    nurbs_surface

    + +

    Arguments

    +

    - - class(nurbs_surface), + + class(nurbs_curve), intent(in) @@ -177,7 +177,7 @@

    Arguments

    Return Value - integer, (2) + integer

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_ng~3.html b/proc/get_ng~3.html index c36950d05..11fb8087a 100644 --- a/proc/get_ng~3.html +++ b/proc/get_ng~3.html @@ -83,15 +83,15 @@

    get_ng
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_ng(this) result(ng)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -176,7 +176,7 @@

    Arguments

    Return Value - + real(kind=rk), allocatable, (:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_wc~3.html b/proc/get_wc_all~2.html similarity index 96% rename from proc/get_wc~3.html rename to proc/get_wc_all~2.html index 470e3b622..13292f73f 100644 --- a/proc/get_wc~3.html +++ b/proc/get_wc_all~2.html @@ -10,7 +10,7 @@ - get_Wc – ForCAD + get_Wc_all – ForCAD @@ -65,7 +65,7 @@
    -

    get_Wc +

    get_Wc_all Function

    @@ -92,7 +92,7 @@

    get_Wc

    @@ -137,7 +137,7 @@

    Contents

    -

    private pure function get_Wc(this) result(Wc) +

    private pure function get_Wc_all(this) result(Wc)

    @@ -158,7 +158,7 @@

    Arguments

    @@ -176,7 +176,7 @@

    Arguments

    Return Value - + real(kind=rk), allocatable, (:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_wc.html b/proc/get_wc_all~3.html similarity index 96% rename from proc/get_wc.html rename to proc/get_wc_all~3.html index c742f71e6..735f84ee8 100644 --- a/proc/get_wc.html +++ b/proc/get_wc_all~3.html @@ -10,7 +10,7 @@ - get_Wc – ForCAD + get_Wc_all – ForCAD @@ -65,7 +65,7 @@
    -

    get_Wc +

    get_Wc_all Function

    @@ -92,7 +92,7 @@

    get_Wc

    @@ -137,7 +137,7 @@

    Contents

    -

    private pure function get_Wc(this) result(Wc) +

    private pure function get_Wc_all(this) result(Wc)

    @@ -158,7 +158,7 @@

    Arguments

    @@ -176,7 +176,7 @@

    Arguments

    Return Value - + real(kind=rk), allocatable, (:)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_wci.html b/proc/get_wci.html new file mode 100644 index 000000000..7569929c7 --- /dev/null +++ b/proc/get_wci.html @@ -0,0 +1,259 @@ + + + + + + + + + + + + + get_Wci – ForCAD + + + + + + + + + + + + + + +
    + +
    + +
    +
    +

    get_Wci + Function + +

    +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + + +
    +

    private pure function get_Wci(this, n) result(Wc) +

    + + + +

    Type Bound

    +

    nurbs_surface

    + +

    Arguments

    +

    - - class(nurbs_curve), + + class(nurbs_volume), intent(in) @@ -177,7 +177,7 @@

    Arguments

    Return Value - integer + integer, (3)

    @@ -212,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_wc~2.html b/proc/get_wc_all.html similarity index 96% rename from proc/get_wc~2.html rename to proc/get_wc_all.html index 60e5a2b7c..8433e5166 100644 --- a/proc/get_wc~2.html +++ b/proc/get_wc_all.html @@ -10,7 +10,7 @@ - get_Wc – ForCAD + get_Wc_all – ForCAD @@ -65,7 +65,7 @@
    -

    get_Wc +

    get_Wc_all Function

    @@ -92,7 +92,7 @@

    get_Wc

    @@ -137,7 +137,7 @@

    Contents

    -

    private pure function get_Wc(this) result(Wc) +

    private pure function get_Wc_all(this) result(Wc)

    @@ -158,7 +158,7 @@

    Arguments

    - + class(nurbs_surface), intent(in)
    - + class(nurbs_curve), intent(in)
    - + class(nurbs_volume), intent(in)
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_surface), + intent(in) + + ::this + +
    + + integer, + intent(in) + + ::n + +
    + +

    Return Value + + + real(kind=rk) + +

    + +
    + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    +
    +

    + ForCAD + was developed by Seyed Ali Ghasemi
    © 2024 BSD 3-Clause +

    +
    +
    +

    + Documentation generated by + FORD + on 2024-04-16T18:31:38.142193

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proc/get_wci~2.html b/proc/get_wci~2.html new file mode 100644 index 000000000..abff2fbcd --- /dev/null +++ b/proc/get_wci~2.html @@ -0,0 +1,259 @@ + + + + + + + + + + + + + get_Wci – ForCAD + + + + + + + + + + + + + + +
    + +
    + +
    +
    +

    get_Wci + Function + +

    +
    +
    +
    + +
    +
    + +
    +
    +
    + + +
    + +
    + + +
    +

    private pure function get_Wci(this, n) result(Wc) +

    + + + +

    Type Bound

    +

    nurbs_curve

    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_curve), + intent(in) + + ::this + +
    + + integer, + intent(in) + + ::n + +
    + +

    Return Value + + + real(kind=rk) + +

    + +
    + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    +

    + ForCAD + was developed by Seyed Ali Ghasemi
    © 2024 BSD 3-Clause +

    +
    +
    +

    + Documentation generated by + FORD + on 2024-04-16T18:31:38.142193

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proc/get_wci~3.html b/proc/get_wci~3.html new file mode 100644 index 000000000..35dc0541b --- /dev/null +++ b/proc/get_wci~3.html @@ -0,0 +1,259 @@ + + + + + + + + + + + + + get_Wci – ForCAD + + + + + + + + + + + + + + +
    + +
    + +
    +
    +

    get_Wci + Function + +

    +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + + +
    +

    private pure function get_Wci(this, n) result(Wc) +

    + + + +

    Type Bound

    +

    nurbs_volume

    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_volume), + intent(in) + + ::this + +
    + + integer, + intent(in) + + ::n + +
    + +

    Return Value + + + real(kind=rk) + +

    + +
    + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    +

    + ForCAD + was developed by Seyed Ali Ghasemi
    © 2024 BSD 3-Clause +

    +
    +
    +

    + Documentation generated by + FORD + on 2024-04-16T18:31:38.142193

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proc/get_xg~2.html b/proc/get_xc_all.html similarity index 96% rename from proc/get_xg~2.html rename to proc/get_xc_all.html index dcaf23f0e..2b6b4f725 100644 --- a/proc/get_xg~2.html +++ b/proc/get_xc_all.html @@ -10,7 +10,7 @@ - get_Xg – ForCAD + get_Xc_all – ForCAD @@ -65,7 +65,7 @@
    -

    get_Xg +

    get_Xc_all Function

    @@ -92,7 +92,7 @@

    get_Xg

    @@ -137,7 +137,7 @@

    Contents

    -

    private pure function get_Xg(this) result(Xg) +

    private pure function get_Xc_all(this) result(Xc)

    @@ -158,7 +158,7 @@

    Arguments

    - + class(nurbs_surface), intent(in)
    - + class(nurbs_curve), intent(in)
    - + class(nurbs_volume), intent(in)
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_surface), + intent(in) + + ::this + +
    + + integer, + intent(in) + + ::n + +
    + +

    Return Value + + + real(kind=rk), allocatable, (:) + +

    + +
    + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    +
    +

    + ForCAD + was developed by Seyed Ali Ghasemi
    © 2024 BSD 3-Clause +

    +
    +
    +

    + Documentation generated by + FORD + on 2024-04-16T18:31:38.142193

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proc/get_xcid.html b/proc/get_xcid.html new file mode 100644 index 000000000..f753b32fd --- /dev/null +++ b/proc/get_xcid.html @@ -0,0 +1,274 @@ + + + + + + + + + + + + + get_Xcid – ForCAD + + + + + + + + + + + + + + +
    + +
    + +
    +
    +

    get_Xcid + Function + +

    +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + + +
    +

    private pure function get_Xcid(this, n, dir) result(Xc) +

    + + + +

    Type Bound

    +

    nurbs_surface

    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_surface), + intent(in) + + ::this + +
    + + integer, + intent(in) + + ::n + +
    + + integer, + intent(in) + + ::dir + +
    + +

    Return Value + + + real(kind=rk) + +

    + +
    + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    +

    + ForCAD + was developed by Seyed Ali Ghasemi
    © 2024 BSD 3-Clause +

    +
    +
    +

    + Documentation generated by + FORD + on 2024-04-16T18:31:38.142193

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proc/get_xcid~2.html b/proc/get_xcid~2.html new file mode 100644 index 000000000..feaeb234b --- /dev/null +++ b/proc/get_xcid~2.html @@ -0,0 +1,274 @@ + + + + + + + + + + + + + get_Xcid – ForCAD + + + + + + + + + + + + + + +
    + +
    + +
    +
    +

    get_Xcid + Function + +

    +
    +
    +
    + +
    +
    + +
    +
    +
    + + +
    + +
    + + +
    +

    private pure function get_Xcid(this, n, dir) result(Xc) +

    + + + +

    Type Bound

    +

    nurbs_curve

    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_curve), + intent(in) + + ::this + +
    + + integer, + intent(in) + + ::n + +
    + + integer, + intent(in) + + ::dir + +
    + +

    Return Value + + + real(kind=rk) + +

    + +
    + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    +

    + ForCAD + was developed by Seyed Ali Ghasemi
    © 2024 BSD 3-Clause +

    +
    +
    +

    + Documentation generated by + FORD + on 2024-04-16T18:31:38.142193

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proc/get_xcid~3.html b/proc/get_xcid~3.html new file mode 100644 index 000000000..df98d4662 --- /dev/null +++ b/proc/get_xcid~3.html @@ -0,0 +1,274 @@ + + + + + + + + + + + + + get_Xcid – ForCAD + + + + + + + + + + + + + + +
    + +
    + +
    +
    +

    get_Xcid + Function + +

    +
    +
    +
    + +
    +
    + +
    +
    +
    + + +
    + +
    + + +
    +

    private pure function get_Xcid(this, n, dir) result(Xc) +

    + + + +

    Type Bound

    +

    nurbs_volume

    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_volume), + intent(in) + + ::this + +
    + + integer, + intent(in) + + ::n + +
    + + integer, + intent(in) + + ::dir + +
    + +

    Return Value + + + real(kind=rk) + +

    + +
    + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    +

    + ForCAD + was developed by Seyed Ali Ghasemi
    © 2024 BSD 3-Clause +

    +
    +
    +

    + Documentation generated by + FORD + on 2024-04-16T18:31:38.142193

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proc/get_xci~2.html b/proc/get_xci~2.html new file mode 100644 index 000000000..c70788550 --- /dev/null +++ b/proc/get_xci~2.html @@ -0,0 +1,259 @@ + + + + + + + + + + + + + get_Xci – ForCAD + + + + + + + + + + + + + + +
    + +
    + +
    +
    +

    get_Xci + Function + +

    +
    +
    +
    + +
    +
    + +
    +
    +
    + + +
    + +
    + + +
    +

    private pure function get_Xci(this, n) result(Xc) +

    + + + +

    Type Bound

    +

    nurbs_curve

    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_curve), + intent(in) + + ::this + +
    + + integer, + intent(in) + + ::n + +
    + +

    Return Value + + + real(kind=rk), allocatable, (:) + +

    + +
    + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    +

    + ForCAD + was developed by Seyed Ali Ghasemi
    © 2024 BSD 3-Clause +

    +
    +
    +

    + Documentation generated by + FORD + on 2024-04-16T18:31:38.142193

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proc/get_xci~3.html b/proc/get_xci~3.html new file mode 100644 index 000000000..5f88235fb --- /dev/null +++ b/proc/get_xci~3.html @@ -0,0 +1,259 @@ + + + + + + + + + + + + + get_Xci – ForCAD + + + + + + + + + + + + + + +
    + +
    + +
    +
    +

    get_Xci + Function + +

    +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + + +
    +

    private pure function get_Xci(this, n) result(Xc) +

    + + + +

    Type Bound

    +

    nurbs_volume

    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_volume), + intent(in) + + ::this + +
    + + integer, + intent(in) + + ::n + +
    + +

    Return Value + + + real(kind=rk), allocatable, (:) + +

    + +
    + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    +

    + ForCAD + was developed by Seyed Ali Ghasemi
    © 2024 BSD 3-Clause +

    +
    +
    +

    + Documentation generated by + FORD + on 2024-04-16T18:31:38.142193

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proc/get_xc~2.html b/proc/get_xg_all.html similarity index 96% rename from proc/get_xc~2.html rename to proc/get_xg_all.html index 86db6cc87..891c96383 100644 --- a/proc/get_xc~2.html +++ b/proc/get_xg_all.html @@ -10,7 +10,7 @@ - get_Xc – ForCAD + get_Xg_all – ForCAD @@ -65,7 +65,7 @@
    -

    get_Xc +

    get_Xg_all Function

    @@ -92,7 +92,7 @@

    get_Xc

    @@ -137,7 +137,7 @@

    Contents

    -

    private pure function get_Xc(this) result(Xc) +

    private pure function get_Xg_all(this) result(Xg)

    @@ -158,7 +158,7 @@

    Arguments

    - + class(nurbs_surface), intent(in)
    - + class(nurbs_curve), intent(in)
    - + class(nurbs_volume), intent(in)
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_surface), + intent(in) + + ::this + +
    + + integer, + intent(in) + + ::n + +
    + +

    Return Value + + + real(kind=rk), allocatable, (:) + +

    + +
    + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    +
    +

    + ForCAD + was developed by Seyed Ali Ghasemi
    © 2024 BSD 3-Clause +

    +
    +
    +

    + Documentation generated by + FORD + on 2024-04-16T18:31:38.142193

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proc/get_xgid.html b/proc/get_xgid.html new file mode 100644 index 000000000..1b065d076 --- /dev/null +++ b/proc/get_xgid.html @@ -0,0 +1,274 @@ + + + + + + + + + + + + + get_Xgid – ForCAD + + + + + + + + + + + + + + +
    + +
    + +
    +
    +

    get_Xgid + Function + +

    +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + + +
    +

    private pure function get_Xgid(this, n, dir) result(Xg) +

    + + + +

    Type Bound

    +

    nurbs_surface

    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_surface), + intent(in) + + ::this + +
    + + integer, + intent(in) + + ::n + +
    + + integer, + intent(in) + + ::dir + +
    + +

    Return Value + + + real(kind=rk) + +

    + +
    + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    +

    + ForCAD + was developed by Seyed Ali Ghasemi
    © 2024 BSD 3-Clause +

    +
    +
    +

    + Documentation generated by + FORD + on 2024-04-16T18:31:38.142193

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proc/get_xgid~2.html b/proc/get_xgid~2.html new file mode 100644 index 000000000..7a479040f --- /dev/null +++ b/proc/get_xgid~2.html @@ -0,0 +1,274 @@ + + + + + + + + + + + + + get_Xgid – ForCAD + + + + + + + + + + + + + + +
    + +
    + +
    +
    +

    get_Xgid + Function + +

    +
    +
    +
    + +
    +
    + +
    +
    +
    + + +
    + +
    + + +
    +

    private pure function get_Xgid(this, n, dir) result(Xg) +

    + + + +

    Type Bound

    +

    nurbs_curve

    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_curve), + intent(in) + + ::this + +
    + + integer, + intent(in) + + ::n + +
    + + integer, + intent(in) + + ::dir + +
    + +

    Return Value + + + real(kind=rk) + +

    + +
    + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    +

    + ForCAD + was developed by Seyed Ali Ghasemi
    © 2024 BSD 3-Clause +

    +
    +
    +

    + Documentation generated by + FORD + on 2024-04-16T18:31:38.142193

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proc/get_xgid~3.html b/proc/get_xgid~3.html new file mode 100644 index 000000000..8a7f11fea --- /dev/null +++ b/proc/get_xgid~3.html @@ -0,0 +1,274 @@ + + + + + + + + + + + + + get_Xgid – ForCAD + + + + + + + + + + + + + + +
    + +
    + +
    +
    +

    get_Xgid + Function + +

    +
    +
    +
    + +
    +
    + +
    +
    +
    + + +
    + +
    + + +
    +

    private pure function get_Xgid(this, n, dir) result(Xg) +

    + + + +

    Type Bound

    +

    nurbs_volume

    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_volume), + intent(in) + + ::this + +
    + + integer, + intent(in) + + ::n + +
    + + integer, + intent(in) + + ::dir + +
    + +

    Return Value + + + real(kind=rk) + +

    + +
    + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    +

    + ForCAD + was developed by Seyed Ali Ghasemi
    © 2024 BSD 3-Clause +

    +
    +
    +

    + Documentation generated by + FORD + on 2024-04-16T18:31:38.142193

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proc/get_xgi~2.html b/proc/get_xgi~2.html new file mode 100644 index 000000000..74a600738 --- /dev/null +++ b/proc/get_xgi~2.html @@ -0,0 +1,259 @@ + + + + + + + + + + + + + get_Xgi – ForCAD + + + + + + + + + + + + + + +
    + +
    + +
    +
    +

    get_Xgi + Function + +

    +
    +
    +
    + +
    +
    + +
    +
    +
    + + +
    + +
    + + +
    +

    private pure function get_Xgi(this, n) result(Xg) +

    + + + +

    Type Bound

    +

    nurbs_curve

    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_curve), + intent(in) + + ::this + +
    + + integer, + intent(in) + + ::n + +
    + +

    Return Value + + + real(kind=rk), allocatable, (:) + +

    + +
    + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    +

    + ForCAD + was developed by Seyed Ali Ghasemi
    © 2024 BSD 3-Clause +

    +
    +
    +

    + Documentation generated by + FORD + on 2024-04-16T18:31:38.142193

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proc/get_xgi~3.html b/proc/get_xgi~3.html new file mode 100644 index 000000000..e6f87b59e --- /dev/null +++ b/proc/get_xgi~3.html @@ -0,0 +1,259 @@ + + + + + + + + + + + + + get_Xgi – ForCAD + + + + + + + + + + + + + + +
    + +
    + +
    +
    +

    get_Xgi + Function + +

    +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + + +
    +

    private pure function get_Xgi(this, n) result(Xg) +

    + + + +

    Type Bound

    +

    nurbs_volume

    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_volume), + intent(in) + + ::this + +
    + + integer, + intent(in) + + ::n + +
    + +

    Return Value + + + real(kind=rk), allocatable, (:) + +

    + +
    + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    +

    + ForCAD + was developed by Seyed Ali Ghasemi
    © 2024 BSD 3-Clause +

    +
    +
    +

    + Documentation generated by + FORD + on 2024-04-16T18:31:38.142193

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proc/get_xt.html b/proc/get_xt.html index c000bcc25..6ce4378ed 100644 --- a/proc/get_xt.html +++ b/proc/get_xt.html @@ -78,20 +78,20 @@

    get_Xt
  • 26 statements + title=" 0.5% of total for procedures.">20 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function get_Xt(this, dir) result(Xt)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -191,7 +191,7 @@

    Arguments

    Return Value - + real(kind=rk), allocatable, (:)

    @@ -227,7 +227,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_xt~2.html b/proc/get_xt~2.html index 56f7d5541..cdb0b054a 100644 --- a/proc/get_xt~2.html +++ b/proc/get_xt~2.html @@ -78,20 +78,20 @@

    get_Xt
  • 20 statements + title=" 0.2% of total for procedures.">9 statements
  • - Source File + Source File
  • -

    private pure function get_Xt(this, dir) result(Xt) +

    private pure function get_Xt(this) result(Xt)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - @@ -227,7 +212,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/get_xt~3.html b/proc/get_xt~3.html index 1c2d0eb75..7222c2ffa 100644 --- a/proc/get_xt~3.html +++ b/proc/get_xt~3.html @@ -78,20 +78,20 @@

    get_Xt
  • 9 statements + title=" 0.7% of total for procedures.">26 statements
  • - Source File + Source File
  • -

    private pure function get_Xt(this) result(Xt) +

    private pure function get_Xt(this, dir) result(Xt)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(in) @@ -169,21 +169,6 @@

    Arguments

    this -
    - - integer, - intent(in) - - ::dir -
    @@ -158,8 +158,8 @@

    Arguments

    + + + + + + + + @@ -176,7 +191,7 @@

    Arguments

    Return Value - + real(kind=rk), allocatable, (:)

    @@ -212,7 +227,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/hexahedron_xc.html b/proc/hexahedron_xc.html index 80c212081..ccde49de4 100644 --- a/proc/hexahedron_xc.html +++ b/proc/hexahedron_xc.html @@ -156,7 +156,7 @@

    Arguments

    @@ -171,7 +171,7 @@

    Arguments

    @@ -189,7 +189,7 @@

    Arguments

    Return Value - + real(kind=rk), allocatable, (:,:)

    @@ -376,7 +376,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/insert_knot_a_5_1.html b/proc/insert_knot_a_5_1.html index 9d1587a7a..8c4ef5c0a 100644 --- a/proc/insert_knot_a_5_1.html +++ b/proc/insert_knot_a_5_1.html @@ -156,7 +156,7 @@

    Arguments

    @@ -216,7 +216,7 @@

    Arguments

    @@ -231,7 +231,7 @@

    Arguments

    @@ -246,7 +246,7 @@

    Arguments

    @@ -333,9 +333,9 @@

    Called by

    proc~insert_knots - + -nurbs_volume%insert_knots +nurbs_surface%insert_knots @@ -348,24 +348,24 @@

    Called by

    proc~insert_knots~2 - - -nurbs_surface%insert_knots + + +nurbs_curve%insert_knots proc~insert_knots~2->proc~insert_knot_a_5_1 - - + + proc~insert_knots~3 - - -nurbs_curve%insert_knots + + +nurbs_volume%insert_knots @@ -379,46 +379,46 @@

    Called by

    program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->proc~insert_knots~3 - - + + +program~example1_curve->proc~insert_knots~2 + + program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~insert_knots~2 - - + + +program~example3_surface->proc~insert_knots + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~insert_knots - - + + +program~example3_volume->proc~insert_knots~3 + + @@ -534,7 +534,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/insert_knots.html b/proc/insert_knots.html index 33fc736d9..806f034ad 100644 --- a/proc/insert_knots.html +++ b/proc/insert_knots.html @@ -78,20 +78,20 @@

    insert_knots
  • 167 statements + title=" 2.8% of total for procedures.">109 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine insert_knots(this, dir, Xth, r)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(in) @@ -169,6 +169,21 @@

    Arguments

    this +
    + + integer, + intent(in) + + ::dir +
    - + real(kind=rk), intent(in)
    - + integer, intent(in)
    - + integer, intent(in)
    - + integer, intent(in)
    - + integer, intent(in)
    - + integer, intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    @@ -188,7 +188,7 @@

    Arguments

    @@ -203,7 +203,7 @@

    Arguments

    @@ -231,286 +231,301 @@

    Calls

    - - + + proc~~insert_knots~~CallsGraph - + proc~insert_knots - -nurbs_volume%insert_knots + +nurbs_surface%insert_knots interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity proc~insert_knots->interface~compute_multiplicity - - + + none~set - - -nurbs_volume%set + + +nurbs_surface%set proc~insert_knots->none~set - - + + proc~findspan - -findspan + +findspan proc~insert_knots->proc~findspan - - + + proc~insert_knot_a_5_1 - -insert_knot_A_5_1 + +insert_knot_A_5_1 proc~insert_knots->proc~insert_knot_a_5_1 - - + + - + +proc~is_rational + + +nurbs_surface%is_rational + + + + + +proc~insert_knots->proc~is_rational + + + + + proc~compute_multiplicity1 - - -compute_multiplicity1 + + +compute_multiplicity1 - + interface~compute_multiplicity->proc~compute_multiplicity1 - - + + - + proc~compute_multiplicity2 - - -compute_multiplicity2 + + +compute_multiplicity2 - + interface~compute_multiplicity->proc~compute_multiplicity2 - - + + - + proc~set1 - - -nurbs_volume%set1 + + +nurbs_surface%set1 - + none~set->proc~set1 - - + + - + proc~set2 - - -nurbs_volume%set2 + + +nurbs_surface%set2 - + none~set->proc~set2 - - + + - + proc~set3 - - -nurbs_volume%set3 + + +nurbs_surface%set3 - + none~set->proc~set3 - - + + - + none~get_degree - - -nurbs_volume%get_degree + + +nurbs_surface%get_degree - + proc~set1->none~get_degree - - + + - + proc~get_nc - - -nurbs_volume%get_nc + + +nurbs_surface%get_nc - + proc~set1->proc~get_nc - - + + - + proc~compute_knot_vector - - -compute_knot_vector + + +compute_knot_vector - + proc~set2->proc~compute_knot_vector - - + + - + proc~set2->proc~get_nc - - + + - + proc~set3->none~get_degree - - + + - + proc~get_degree_all - - -nurbs_volume%get_degree_all + + +nurbs_surface%get_degree_all - + none~get_degree->proc~get_degree_all - - + + - + proc~get_degree_dir - - -nurbs_volume%get_degree_dir + + +nurbs_surface%get_degree_dir - + none~get_degree->proc~get_degree_dir - - + + - + proc~repelem - - -repelem + + +repelem - + proc~compute_knot_vector->proc~repelem - - + + - + proc~get_nc->interface~compute_multiplicity - - + + - + proc~get_multiplicity - - -nurbs_volume%get_multiplicity + + +nurbs_surface%get_multiplicity - + proc~get_degree_all->proc~get_multiplicity - - + + - + proc~get_degree_dir->proc~get_multiplicity - - + + - + proc~get_multiplicity->interface~compute_multiplicity - - + + @@ -619,20 +634,20 @@

    Called by

    proc~insert_knots -nurbs_volume%insert_knots +nurbs_surface%insert_knots - + -program~example3_volume - +program~example3_surface + -example3_volume +example3_surface - + -program~example3_volume->proc~insert_knots +program~example3_surface->proc~insert_knots @@ -750,7 +765,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/insert_knots~2.html b/proc/insert_knots~2.html index 60142c248..7395fedf5 100644 --- a/proc/insert_knots~2.html +++ b/proc/insert_knots~2.html @@ -78,20 +78,20 @@

    insert_knots
  • 109 statements + title=" 1.1% of total for procedures.">43 statements
  • - Source File + Source File
  • @@ -137,13 +137,13 @@

    Contents

    -

    private pure subroutine insert_knots(this, dir, Xth, r) +

    private pure subroutine insert_knots(this, Xth, r)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in)
    - + real(kind=rk), intent(in),
    - + integer, intent(in),
    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - - + @@ -4076,12 +5096,12 @@

    Arguments

    integer, - + - + @@ -4089,6 +5109,11 @@

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -171,21 +171,6 @@

    Arguments

    - - integer, - intent(in) - - ::dir - -
    @@ -231,301 +216,238 @@

    Calls

    - - + + proc~~insert_knots~2~~CallsGraph - + proc~insert_knots~2 - -nurbs_surface%insert_knots + +nurbs_curve%insert_knots interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity proc~insert_knots~2->interface~compute_multiplicity - - + + none~set~2 - - -nurbs_surface%set + + +nurbs_curve%set proc~insert_knots~2->none~set~2 - - + + proc~findspan - -findspan + +findspan proc~insert_knots~2->proc~findspan - - + + proc~insert_knot_a_5_1 - -insert_knot_A_5_1 + +insert_knot_A_5_1 proc~insert_knots~2->proc~insert_knot_a_5_1 - - + + proc~is_rational~2 - - -nurbs_surface%is_rational + + +nurbs_curve%is_rational proc~insert_knots~2->proc~is_rational~2 - - + + proc~compute_multiplicity1 - -compute_multiplicity1 + +compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 - - + + proc~compute_multiplicity2 - -compute_multiplicity2 + +compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 - - + + proc~set1~2 - - -nurbs_surface%set1 + + +nurbs_curve%set1 none~set~2->proc~set1~2 - - + + proc~set2~2 - - -nurbs_surface%set2 + + +nurbs_curve%set2 none~set~2->proc~set2~2 - - + + proc~set3~2 - - -nurbs_surface%set3 + + +nurbs_curve%set3 none~set~2->proc~set3~2 - - + + - - -none~get_degree~2 - - -nurbs_surface%get_degree + + +proc~get_degree + + +nurbs_curve%get_degree - + -proc~set1~2->none~get_degree~2 - - - - - -proc~get_nc~2 - - -nurbs_surface%get_nc - - - - - -proc~set1~2->proc~get_nc~2 - - +proc~set1~2->proc~get_degree + + - + proc~compute_knot_vector - - -compute_knot_vector + + +compute_knot_vector - + proc~set2~2->proc~compute_knot_vector - - - - - -proc~set2~2->proc~get_nc~2 - - - - - -proc~set3~2->none~get_degree~2 - - - - - -proc~get_degree_all~2 - - -nurbs_surface%get_degree_all - - - - - -none~get_degree~2->proc~get_degree_all~2 - - - - - -proc~get_degree_dir~2 - - -nurbs_surface%get_degree_dir - - + + - - -none~get_degree~2->proc~get_degree_dir~2 - - + + +proc~set3~2->proc~get_degree + + - + proc~repelem - - -repelem + + +repelem - + proc~compute_knot_vector->proc~repelem - - - - - -proc~get_nc~2->interface~compute_multiplicity - - + + - + proc~get_multiplicity~2 - - -nurbs_surface%get_multiplicity + + +nurbs_curve%get_multiplicity - - -proc~get_degree_all~2->proc~get_multiplicity~2 - - - - - -proc~get_degree_dir~2->proc~get_multiplicity~2 - - + + +proc~get_degree->proc~get_multiplicity~2 + + - + proc~get_multiplicity~2->interface~compute_multiplicity - - + + @@ -625,31 +547,31 @@

    Called by

    - + proc~~insert_knots~2~~CalledByGraph - + proc~insert_knots~2 - -nurbs_surface%insert_knots + +nurbs_curve%insert_knots - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->proc~insert_knots~2 - - +program~example1_curve->proc~insert_knots~2 + + @@ -765,7 +687,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/insert_knots~3.html b/proc/insert_knots~3.html index 4e7fdf422..13ebb5cfd 100644 --- a/proc/insert_knots~3.html +++ b/proc/insert_knots~3.html @@ -78,20 +78,20 @@

    insert_knots
  • 43 statements + title=" 4.4% of total for procedures.">167 statements
  • - Source File + Source File
  • @@ -137,13 +137,13 @@

    Contents

    -

    private pure subroutine insert_knots(this, Xth, r) +

    private pure subroutine insert_knots(this, dir, Xth, r)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    + + + + + + + + - + @@ -3111,12 +2974,12 @@

    Arguments

    real(kind=rk), - + - + @@ -3124,14 +2987,14 @@

    Arguments

    - + - + @@ -3148,23 +3011,23 @@

    Arguments

    - +

    procedure, public :: - rotate_Xg + is_rational

    -

    Rotate geometry points

    +

    Check if the NURBS surface is rational

    • - private pure subroutine rotate_Xg(this, alpha, beta, theta) + private pure function is_rational(this) result(r)

      Author
      Seyed Ali Ghasemi
      @@ -3190,7 +3053,7 @@

      Arguments

      class(nurbs_surface), -
    + @@ -3198,56 +3061,16 @@

    Arguments

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -171,6 +171,21 @@

    Arguments

    + + integer, + intent(in) + + ::dir + +
    @@ -216,238 +231,286 @@

    Calls

    - - + + proc~~insert_knots~3~~CallsGraph - + proc~insert_knots~3 - -nurbs_curve%insert_knots + +nurbs_volume%insert_knots interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity proc~insert_knots~3->interface~compute_multiplicity - - + + none~set~3 - - -nurbs_curve%set + + +nurbs_volume%set proc~insert_knots~3->none~set~3 - - + + proc~findspan - -findspan + +findspan proc~insert_knots~3->proc~findspan - - + + proc~insert_knot_a_5_1 - -insert_knot_A_5_1 + +insert_knot_A_5_1 proc~insert_knots~3->proc~insert_knot_a_5_1 - - - - - -proc~is_rational~3 - - -nurbs_curve%is_rational - - - - - -proc~insert_knots~3->proc~is_rational~3 - - + + - + proc~compute_multiplicity1 - - -compute_multiplicity1 + + +compute_multiplicity1 - + interface~compute_multiplicity->proc~compute_multiplicity1 - - + + - + proc~compute_multiplicity2 - - -compute_multiplicity2 + + +compute_multiplicity2 - + interface~compute_multiplicity->proc~compute_multiplicity2 - - + + - + proc~set1~3 - - -nurbs_curve%set1 + + +nurbs_volume%set1 - + none~set~3->proc~set1~3 - - + + - + proc~set2~3 - - -nurbs_curve%set2 + + +nurbs_volume%set2 - + none~set~3->proc~set2~3 - - + + - + proc~set3~3 - - -nurbs_curve%set3 + + +nurbs_volume%set3 - + none~set~3->proc~set3~3 - - + + + + + +none~get_degree~3 + + +nurbs_volume%get_degree + - + + + +proc~set1~3->none~get_degree~3 + + + + -proc~get_degree - - -nurbs_curve%get_degree +proc~get_nc~3 + + +nurbs_volume%get_nc - + -proc~set1~3->proc~get_degree - - +proc~set1~3->proc~get_nc~3 + + proc~compute_knot_vector - -compute_knot_vector + +compute_knot_vector proc~set2~3->proc~compute_knot_vector - - + + - + -proc~set3~3->proc~get_degree - - +proc~set2~3->proc~get_nc~3 + + - + + +proc~set3~3->none~get_degree~3 + + + + + +proc~get_degree_all~2 + + +nurbs_volume%get_degree_all + + + + + +none~get_degree~3->proc~get_degree_all~2 + + + + +proc~get_degree_dir~2 + + +nurbs_volume%get_degree_dir + + + + + +none~get_degree~3->proc~get_degree_dir~2 + + + + + proc~repelem - - -repelem + + +repelem - + proc~compute_knot_vector->proc~repelem - - + + + + + +proc~get_nc~3->interface~compute_multiplicity + + - + proc~get_multiplicity~3 - - -nurbs_curve%get_multiplicity + + +nurbs_volume%get_multiplicity - - -proc~get_degree->proc~get_multiplicity~3 - - + + +proc~get_degree_all~2->proc~get_multiplicity~3 + + + + + +proc~get_degree_dir~2->proc~get_multiplicity~3 + + - + proc~get_multiplicity~3->interface~compute_multiplicity - - + + @@ -547,31 +610,31 @@

    Called by

    - + proc~~insert_knots~3~~CalledByGraph - + proc~insert_knots~3 - -nurbs_curve%insert_knots + +nurbs_volume%insert_knots - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->proc~insert_knots~3 - - +program~example3_volume->proc~insert_knots~3 + + @@ -687,7 +750,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/is_rational.html b/proc/is_rational.html index 5ce580c50..fb5ff7b27 100644 --- a/proc/is_rational.html +++ b/proc/is_rational.html @@ -83,15 +83,15 @@

    is_rational
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function is_rational(this) result(r)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -3030,6 +2888,11 @@

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(in) @@ -176,12 +176,271 @@

    Arguments

    Return Value - + logical


    +
    +
    +

    Called by

    +
    +
    +
    + + + + + +proc~~is_rational~~CalledByGraph + + + +proc~is_rational + +nurbs_surface%is_rational + + + +proc~basis + + +nurbs_surface%basis + + + + + +proc~basis->proc~is_rational + + + + + +proc~create + + +nurbs_surface%create + + + + + +proc~create->proc~is_rational + + + + + +proc~derivative + + +nurbs_surface%derivative + + + + + +proc~derivative->proc~is_rational + + + + + +proc~elevate_degree + + +nurbs_surface%elevate_degree + + + + + +proc~elevate_degree->proc~is_rational + + + + + +proc~insert_knots + + +nurbs_surface%insert_knots + + + + + +proc~insert_knots->proc~is_rational + + + + + +proc~remove_knots + + +nurbs_surface%remove_knots + + + + + +proc~remove_knots->proc~is_rational + + + + + +program~example3_surface + + +example3_surface + + + + + +program~example3_surface->proc~create + + + + + +program~example3_surface->proc~elevate_degree + + + + + +program~example3_surface->proc~insert_knots + + + + + +program~example3_surface->proc~remove_knots + + + + + +program~example_nurbs_surface + + +example_nurbs_surface + + + + + +program~example_nurbs_surface->proc~create + + + + + +program~shape_tetragon + + +shape_tetragon + + + + + +program~shape_tetragon->proc~create + + + + + +
    + Help +
    + +
    +
    +
    @@ -212,7 +471,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/is_rational~2.html b/proc/is_rational~2.html index 9916bfb0c..fc57fe31b 100644 --- a/proc/is_rational~2.html +++ b/proc/is_rational~2.html @@ -83,15 +83,15 @@

    is_rational
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function is_rational(this) result(r)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - - - - - - - - - - + @@ -2921,6 +2819,11 @@

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(in) @@ -193,169 +193,169 @@

    Called by

    - + proc~~is_rational~2~~CalledByGraph - + proc~is_rational~2 - -nurbs_surface%is_rational + +nurbs_curve%is_rational proc~basis~2 - - -nurbs_surface%basis + + +nurbs_curve%basis proc~basis~2->proc~is_rational~2 - - + + proc~create~2 - - -nurbs_surface%create + + +nurbs_curve%create proc~create~2->proc~is_rational~2 - - + + proc~derivative~2 - - -nurbs_surface%derivative + + +nurbs_curve%derivative proc~derivative~2->proc~is_rational~2 - - + + proc~elevate_degree~2 - - -nurbs_surface%elevate_degree + + +nurbs_curve%elevate_degree proc~elevate_degree~2->proc~is_rational~2 - - + + proc~insert_knots~2 - - -nurbs_surface%insert_knots + + +nurbs_curve%insert_knots proc~insert_knots~2->proc~is_rational~2 - - + + proc~remove_knots~2 - - -nurbs_surface%remove_knots + + +nurbs_curve%remove_knots proc~remove_knots~2->proc~is_rational~2 - - + + - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->proc~create~2 - - +program~example1_curve->proc~create~2 + + - + -program~example3_surface->proc~elevate_degree~2 - - +program~example1_curve->proc~elevate_degree~2 + + - + -program~example3_surface->proc~insert_knots~2 - - +program~example1_curve->proc~insert_knots~2 + + - + -program~example3_surface->proc~remove_knots~2 - - +program~example1_curve->proc~remove_knots~2 + + - + -program~example_nurbs_surface - - -example_nurbs_surface +program~example_nurbs_curve + + +example_nurbs_curve - + -program~example_nurbs_surface->proc~create~2 - - +program~example_nurbs_curve->proc~create~2 + + - + -program~shape_tetragon - - -shape_tetragon +program~shape_circle + + +shape_circle - + -program~shape_tetragon->proc~create~2 - - +program~shape_circle->proc~create~2 + + @@ -471,7 +471,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/is_rational~3.html b/proc/is_rational~3.html index 194348b62..5beb70f78 100644 --- a/proc/is_rational~3.html +++ b/proc/is_rational~3.html @@ -83,15 +83,15 @@

    is_rational
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure function is_rational(this) result(r)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    + + + + + + + + @@ -2715,7 +2653,7 @@

    Arguments

    Return Value - logical + real(kind=rk), allocatable, (:)

    @@ -2727,23 +2665,23 @@

    - +

    procedure, public :: - modify_Wc + get_multiplicity

    -

    Modify weights

    +

    Get multiplicity of the knot vector

    • - private pure subroutine modify_Wc(this, W, num) + private pure function get_multiplicity(this, dir) result(m)

      Author
      Seyed Ali Ghasemi
      @@ -2769,27 +2707,12 @@

      Arguments

      class(nurbs_surface), -

    - - - - - - - - + @@ -2804,7 +2727,7 @@

    Arguments

    - + @@ -2812,6 +2735,11 @@

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(in) @@ -182,265 +182,6 @@

    Return Value


    -
    -
    -

    Called by

    -
    -
    -
    - - - - - -proc~~is_rational~3~~CalledByGraph - - - -proc~is_rational~3 - -nurbs_curve%is_rational - - - -proc~basis~3 - - -nurbs_curve%basis - - - - - -proc~basis~3->proc~is_rational~3 - - - - - -proc~create~3 - - -nurbs_curve%create - - - - - -proc~create~3->proc~is_rational~3 - - - - - -proc~derivative~3 - - -nurbs_curve%derivative - - - - - -proc~derivative~3->proc~is_rational~3 - - - - - -proc~elevate_degree~3 - - -nurbs_curve%elevate_degree - - - - - -proc~elevate_degree~3->proc~is_rational~3 - - - - - -proc~insert_knots~3 - - -nurbs_curve%insert_knots - - - - - -proc~insert_knots~3->proc~is_rational~3 - - - - - -proc~remove_knots~3 - - -nurbs_curve%remove_knots - - - - - -proc~remove_knots~3->proc~is_rational~3 - - - - - -program~example1_curve - - -example1_curve - - - - - -program~example1_curve->proc~create~3 - - - - - -program~example1_curve->proc~elevate_degree~3 - - - - - -program~example1_curve->proc~insert_knots~3 - - - - - -program~example1_curve->proc~remove_knots~3 - - - - - -program~example_nurbs_curve - - -example_nurbs_curve - - - - - -program~example_nurbs_curve->proc~create~3 - - - - - -program~shape_circle - - -shape_circle - - - - - -program~shape_circle->proc~create~3 - - - - - -
    - Help -
    - -
    -
    -
    @@ -471,7 +212,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/isinf.html b/proc/isinf.html index d04d774fb..8ca756fad 100644 --- a/proc/isinf.html +++ b/proc/isinf.html @@ -220,9 +220,9 @@

    Called by

    proc~derivative - + -nurbs_volume%derivative +nurbs_surface%derivative @@ -235,24 +235,24 @@

    Called by

    proc~derivative~2 - - -nurbs_surface%derivative + + +nurbs_curve%derivative proc~derivative~2->proc~basis_bspline_der - - + + proc~derivative~3 - - -nurbs_curve%derivative + + +nurbs_volume%derivative @@ -376,7 +376,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/isnan.html b/proc/isnan.html index 9e8f57a93..ccc7b8146 100644 --- a/proc/isnan.html +++ b/proc/isnan.html @@ -210,7 +210,7 @@

    Return Value

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/kron.html b/proc/kron.html index 520b01f74..af2d433f3 100644 --- a/proc/kron.html +++ b/proc/kron.html @@ -220,9 +220,9 @@

    Called by

    proc~basis - + -nurbs_volume%basis +nurbs_surface%basis @@ -232,27 +232,27 @@

    Called by

    - + -proc~basis~2 - +proc~basis~3 + -nurbs_surface%basis +nurbs_volume%basis - + -proc~basis~2->proc~kron +proc~basis~3->proc~kron proc~create - + -nurbs_volume%create +nurbs_surface%create @@ -262,27 +262,27 @@

    Called by

    - + -proc~create~2 - +proc~create~3 + -nurbs_surface%create +nurbs_volume%create - + -proc~create~2->proc~kron +proc~create~3->proc~kron proc~derivative - + -nurbs_volume%derivative +nurbs_surface%derivative @@ -292,18 +292,18 @@

    Called by

    - + -proc~derivative~2 - +proc~derivative~3 + -nurbs_surface%derivative +nurbs_volume%derivative - + -proc~derivative~2->proc~kron +proc~derivative~3->proc~kron @@ -326,31 +326,31 @@

    Called by

    program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~create~2 - - + + +program~example3_surface->proc~create + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~create - - + + +program~example3_volume->proc~create~3 + + @@ -371,61 +371,61 @@

    Called by

    program~example_nurbs_surface - -example_nurbs_surface + +example_nurbs_surface - - -program~example_nurbs_surface->proc~create~2 - - + + +program~example_nurbs_surface->proc~create + + program~example_nurbs_volume - -example_nurbs_volume + +example_nurbs_volume - - -program~example_nurbs_volume->proc~create - - + + +program~example_nurbs_volume->proc~create~3 + + program~shape_hexahedron - -shape_hexahedron + +shape_hexahedron - - -program~shape_hexahedron->proc~create - - + + +program~shape_hexahedron->proc~create~3 + + program~shape_tetragon - -shape_tetragon + +shape_tetragon - - -program~shape_tetragon->proc~create~2 - - + + +program~shape_tetragon->proc~create + + @@ -541,7 +541,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/modify_wc.html b/proc/modify_wc.html index c70e78f91..c010ee515 100644 --- a/proc/modify_wc.html +++ b/proc/modify_wc.html @@ -78,20 +78,20 @@

    modify_Wc
  • 21 statements + title=" 0.5% of total for procedures.">20 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine modify_Wc(this, W, num)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -225,14 +225,14 @@

    Calls

    proc~modify_wc -nurbs_volume%modify_Wc +nurbs_surface%modify_Wc none~set - + -nurbs_volume%set +nurbs_surface%set @@ -245,9 +245,9 @@

    Calls

    proc~set1 - + -nurbs_volume%set1 +nurbs_surface%set1 @@ -260,9 +260,9 @@

    Calls

    proc~set2 - + -nurbs_volume%set2 +nurbs_surface%set2 @@ -275,9 +275,9 @@

    Calls

    proc~set3 - + -nurbs_volume%set3 +nurbs_surface%set3 @@ -290,9 +290,9 @@

    Calls

    none~get_degree - + -nurbs_volume%get_degree +nurbs_surface%get_degree @@ -305,9 +305,9 @@

    Calls

    proc~get_nc - + -nurbs_volume%get_nc +nurbs_surface%get_nc @@ -347,9 +347,9 @@

    Calls

    proc~get_degree_all - + -nurbs_volume%get_degree_all +nurbs_surface%get_degree_all @@ -362,9 +362,9 @@

    Calls

    proc~get_degree_dir - + -nurbs_volume%get_degree_dir +nurbs_surface%get_degree_dir @@ -437,9 +437,9 @@

    Calls

    proc~get_multiplicity - + -nurbs_volume%get_multiplicity +nurbs_surface%get_multiplicity @@ -579,7 +579,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/modify_wc~2.html b/proc/modify_wc~2.html index 70c5425b5..98eda673b 100644 --- a/proc/modify_wc~2.html +++ b/proc/modify_wc~2.html @@ -78,20 +78,20 @@

    modify_Wc
  • 20 statements + title=" 0.5% of total for procedures.">19 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine modify_Wc(this, W, num)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(inout) @@ -188,7 +188,7 @@

    Arguments

    - + integer, intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    @@ -251,7 +259,7 @@

    Components

    @@ -268,7 +276,7 @@

    Components

    @@ -285,7 +293,7 @@

    Components

    @@ -302,7 +310,7 @@

    Components

    @@ -319,7 +327,7 @@

    Components

    @@ -336,7 +344,7 @@

    Components

    @@ -353,7 +361,7 @@

    Components

    @@ -370,7 +378,7 @@

    Components

    @@ -387,7 +395,7 @@

    Components

    @@ -404,7 +412,7 @@

    Components

    @@ -421,7 +429,7 @@

    Components

    @@ -438,7 +446,7 @@

    Components

    @@ -466,7 +474,7 @@

    Type-Bound Procedures

    - +

    procedure, public :: basis @@ -482,7 +490,7 @@

    • - private pure subroutine basis(this, res1, res2, Xt1, Xt2, Tgc) + private pure subroutine basis(this, res1, res2, Xt1, Xt2, Tgc)

      Author
      Seyed Ali Ghasemi
      @@ -605,7 +613,7 @@

      Arguments

      - +

      procedure, public :: cmp_elem @@ -621,7 +629,7 @@

      • - private pure function cmp_elem(this) result(elemConn) + private pure function cmp_elem(this) result(elemConn)

        Author
        Seyed Ali Ghasemi
        @@ -674,7 +682,7 @@

        - +

        procedure, public :: cmp_elem_Xc_vis @@ -690,7 +698,7 @@

        • - private pure function cmp_elem_Xc_vis(this, p) result(elemConn) + private pure function cmp_elem_Xc_vis(this, p) result(elemConn)

          Author
          Seyed Ali Ghasemi
          @@ -758,7 +766,7 @@

          - +

          procedure, public :: cmp_elem_Xg_vis @@ -774,7 +782,7 @@

          • - private pure function cmp_elem_Xg_vis(this, p) result(elemConn) + private pure function cmp_elem_Xg_vis(this, p) result(elemConn)

            Author
            Seyed Ali Ghasemi
            @@ -842,7 +850,7 @@

            - +

            procedure, public :: create @@ -858,7 +866,7 @@

            • - private pure subroutine create(this, res1, res2, Xt1, Xt2, Xt) + private pure subroutine create(this, res1, res2, Xt1, Xt2, Xt)

              Author
              Seyed Ali Ghasemi
              @@ -981,7 +989,7 @@

              Arguments

              - +

              procedure, public :: derivative @@ -997,7 +1005,7 @@

              • - private pure subroutine derivative(this, res1, res2, Xt1, Xt2, dTgc) + private pure subroutine derivative(this, res1, res2, Xt1, Xt2, dTgc)

                Author
                Seyed Ali Ghasemi
                @@ -1120,7 +1128,7 @@

                Arguments

                - +

                procedure, public :: elevate_degree @@ -1136,7 +1144,7 @@

                • - private pure subroutine elevate_degree(this, dir, t) + private pure subroutine elevate_degree(this, dir, t)

                  Author
                  Seyed Ali Ghasemi
                  @@ -1214,7 +1222,7 @@

                  Arguments

                  - +

                  procedure, public :: export_Xc @@ -1230,7 +1238,7 @@

                  • - private impure subroutine export_Xc(this, filename) + private impure subroutine export_Xc(this, filename)

                    Author
                    Seyed Ali Ghasemi
                    @@ -1293,7 +1301,7 @@

                    Arguments

                    - +

                    procedure, public :: export_Xg @@ -1309,7 +1317,7 @@

                    • - private impure subroutine export_Xg(this, filename) + private impure subroutine export_Xg(this, filename)

                      Author
                      Seyed Ali Ghasemi
                      @@ -1372,7 +1380,7 @@

                      Arguments

                      - +

                      procedure, public :: finalize @@ -1388,7 +1396,7 @@

                      • - private pure subroutine finalize(this) + private pure subroutine finalize(this)

                        Author
                        Seyed Ali Ghasemi
                        @@ -1436,10 +1444,10 @@

                        Arguments

                        - +

                        - procedure, public :: - get_Wc + generic, public :: + get_Wc => get_Wc_all, get_Wci

                        @@ -1452,7 +1460,7 @@

                        • - private pure function get_Wc(this) result(Wc) + private pure function get_Wc_all(this) result(Wc)

                          Author
                          Seyed Ali Ghasemi
                          @@ -1498,30 +1506,9 @@

                        • -
                        -

                        - -
                        -
                        -
                        -
                        - -

                        - procedure, public :: - get_Xc - -

                        -
                        -
                        - -
                        -

                        Get control points

                        -
                        -
                        -
                        • - private pure function get_Xc(this) result(Xc) + private pure function get_Wci(this, n) result(Wc)

                          Author
                          Seyed Ali Ghasemi
                          @@ -1555,6 +1542,21 @@

                          Arguments

    + + + + + + + + @@ -1562,7 +1564,7 @@

    Arguments

    Return Value - real(kind=rk), allocatable, (:,:) + real(kind=rk)

    @@ -1574,23 +1576,23 @@

    - +

    - procedure, public :: - get_Xg + generic, public :: + get_Xc => get_Xc_all, get_Xci, get_Xcid

    -

    Get geometry points

    +

    Get control points

    • - private pure function get_Xg(this) result(Xg) + private pure function get_Xc_all(this) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -1636,30 +1638,9 @@

    • -
    -
    - -
    -
    -
    -
    - -

    - procedure, public :: - get_Xt - -

    -
    -
    - -
    -

    Get parameter values

    -
    -
    -
    • - private pure function get_Xt(this, dir) result(Xt) + private pure function get_Xci(this, n) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -1705,7 +1686,7 @@

      Arguments

    - + @@ -1720,30 +1701,9 @@

    - - - - -
    -
    -
    - -

    - procedure, public :: - get_continuity - -

    -
    -
    - -
    -

    Get continuity of the surface

    -
    -
    -
    • - private pure function get_continuity(this, dir) result(c) + private pure function get_Xcid(this, n, dir) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -1787,6 +1747,21 @@

      Arguments

    + + + + + + + + @@ -1799,7 +1774,7 @@

    Arguments

    Return Value - integer, allocatable, (:) + real(kind=rk)

    @@ -1811,23 +1786,23 @@

    - +

    generic, public :: - get_degree => get_degree_all, get_degree_dir + get_Xg => get_Xg_all, get_Xgi, get_Xgid

    -

    Get degree of the NURBS surface

    +

    Get geometry points

    • - private pure function get_degree_all(this) result(degree) + private pure function get_Xg_all(this) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -1868,14 +1843,14 @@

      Arguments

      Return Value - integer, (2) + real(kind=rk), allocatable, (:,:)

    • - private pure function get_degree_dir(this, dir) result(degree) + private pure function get_Xgi(this, n) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -1921,7 +1896,7 @@

      Arguments

    - + @@ -1931,35 +1906,14 @@

    Arguments

    Return Value - integer + real(kind=rk), allocatable, (:)

    - - - - -
    -
    -
    - -

    - procedure, public :: - get_elem - -

    -
    -
    - -
    -

    Get IGA element connectivity

    -
    -
    -
    • - private pure function get_elem(this) result(elemConn) + private pure function get_Xgid(this, n, dir) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -1993,6 +1947,36 @@

      Arguments

    + + + + + + + + + + + + + + + + @@ -2000,7 +1984,7 @@

    Arguments

    Return Value - integer, allocatable, (:,:) + real(kind=rk)

    @@ -2012,23 +1996,23 @@

    - +

    procedure, public :: - get_elem_Xc_vis + get_Xt

    -

    Get connectivity for control points

    +

    Get parameter values

    • - private pure function get_elem_Xc_vis(this) result(elemConn) + private pure function get_Xt(this, dir) result(Xt)

      Author
      Seyed Ali Ghasemi
      @@ -2062,6 +2046,21 @@

      Arguments

    + + + + + + + + @@ -2069,7 +2068,7 @@

    Arguments

    Return Value - integer, allocatable, (:,:) + real(kind=rk), allocatable, (:)

    @@ -2081,23 +2080,23 @@

    - +

    procedure, public :: - get_elem_Xg_vis + get_continuity

    -

    Get connectivity for geometry points

    +

    Get continuity of the surface

    • - private pure function get_elem_Xg_vis(this) result(elemConn) + private pure function get_continuity(this, dir) result(c)

      Author
      Seyed Ali Ghasemi
      @@ -2131,6 +2130,21 @@

      Arguments

    + + + + + + + + @@ -2138,7 +2152,7 @@

    Arguments

    Return Value - integer, allocatable, (:,:) + integer, allocatable, (:)

    @@ -2150,23 +2164,23 @@

    - +

    generic, public :: - get_knot => get_knoti, get_knot_all + get_degree => get_degree_all, get_degree_dir

    -

    Get knot vector

    +

    Get degree of the NURBS surface

    • - private pure function get_knoti(this, dir, i) result(knot) + private pure function get_degree_all(this) result(degree)

      Author
      Seyed Ali Ghasemi
      @@ -2200,36 +2214,6 @@

      Arguments

    - - - - - - - - - - - - - - - - @@ -2237,14 +2221,14 @@

    Arguments

    Return Value - real(kind=rk) + integer, (2)

  • - private pure function get_knot_all(this, dir) result(knot) + private pure function get_degree_dir(this, dir) result(degree)

    Author
    Seyed Ali Ghasemi
    @@ -2300,7 +2284,7 @@

    Arguments

    Return Value - real(kind=rk), allocatable, (:) + integer

    @@ -2312,23 +2296,23 @@

    - +

    procedure, public :: - get_multiplicity + get_elem

    -

    Get multiplicity of the knot vector

    +

    Get IGA element connectivity

    • - private pure function get_multiplicity(this, dir) result(m) + private pure function get_elem(this) result(elemConn)

      Author
      Seyed Ali Ghasemi
      @@ -2362,21 +2346,6 @@

      Arguments

  • - - - - - - - - @@ -2384,7 +2353,7 @@

    Arguments

    Return Value - integer, allocatable, (:) + integer, allocatable, (:,:)

    @@ -2396,23 +2365,23 @@

    - +

    procedure, public :: - get_nc + get_elem_Xc_vis

    -

    Get number of required control points

    +

    Get connectivity for control points

    • - private pure function get_nc(this, dir) result(nc) + private pure function get_elem_Xc_vis(this) result(elemConn)

      Author
      Seyed Ali Ghasemi
      @@ -2446,21 +2415,6 @@

      Arguments

    - - - - - - - - @@ -2468,7 +2422,7 @@

    Arguments

    Return Value - integer + integer, allocatable, (:,:)

    @@ -2480,23 +2434,23 @@

    - +

    procedure, public :: - get_ng + get_elem_Xg_vis

    -

    Get number of geometry points

    +

    Get connectivity for geometry points

    • - private pure function get_ng(this) result(ng) + private pure function get_elem_Xg_vis(this) result(elemConn)

      Author
      Seyed Ali Ghasemi
      @@ -2537,7 +2491,7 @@

      Arguments

      Return Value - integer, (2) + integer, allocatable, (:,:)

      @@ -2549,23 +2503,23 @@

      - +

      - procedure, public :: - insert_knots + generic, public :: + get_knot => get_knoti, get_knot_all

      -

      Insert knots into the knot vector

      +

      Get knot vector

      • - private pure subroutine insert_knots(this, dir, Xth, r) + private pure function get_knoti(this, dir, i) result(knot)

        Author
        Seyed Ali Ghasemi
        @@ -2591,7 +2545,7 @@

        Arguments

        class(nurbs_surface), -

    + @@ -2616,32 +2570,17 @@

    Arguments

    - - - - - - - - - + - + @@ -2649,32 +2588,16 @@

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -216,250 +216,187 @@

    Calls

    - - + + proc~~modify_wc~2~~CallsGraph - + proc~modify_wc~2 - -nurbs_surface%modify_Wc + +nurbs_curve%modify_Wc none~set~2 - - -nurbs_surface%set + + +nurbs_curve%set proc~modify_wc~2->none~set~2 - - + + proc~set1~2 - - -nurbs_surface%set1 + + +nurbs_curve%set1 none~set~2->proc~set1~2 - - + + proc~set2~2 - - -nurbs_surface%set2 + + +nurbs_curve%set2 none~set~2->proc~set2~2 - - + + proc~set3~2 - - -nurbs_surface%set3 + + +nurbs_curve%set3 none~set~2->proc~set3~2 - - + + - - -none~get_degree~2 - - -nurbs_surface%get_degree + + +proc~get_degree + + +nurbs_curve%get_degree - + -proc~set1~2->none~get_degree~2 - - - - - -proc~get_nc~2 - - -nurbs_surface%get_nc - - - - - -proc~set1~2->proc~get_nc~2 - - +proc~set1~2->proc~get_degree + + - + proc~compute_knot_vector - - -compute_knot_vector + + +compute_knot_vector - + proc~set2~2->proc~compute_knot_vector - - - - - -proc~set2~2->proc~get_nc~2 - - - - - -proc~set3~2->none~get_degree~2 - - - - - -proc~get_degree_all~2 - - -nurbs_surface%get_degree_all - + + - - - -none~get_degree~2->proc~get_degree_all~2 - - - - - -proc~get_degree_dir~2 - - -nurbs_surface%get_degree_dir - - - - - -none~get_degree~2->proc~get_degree_dir~2 - - + + +proc~set3~2->proc~get_degree + + - + proc~repelem - - -repelem + + +repelem - + proc~compute_knot_vector->proc~repelem - - + + + + + +proc~get_multiplicity~2 + + +nurbs_curve%get_multiplicity + + + + + +proc~get_degree->proc~get_multiplicity~2 + + - + interface~compute_multiplicity - - -compute_multiplicity + + +compute_multiplicity - - -proc~get_nc~2->interface~compute_multiplicity - - + + +proc~get_multiplicity~2->interface~compute_multiplicity + + - + proc~compute_multiplicity1 - - -compute_multiplicity1 + + +compute_multiplicity1 - + interface~compute_multiplicity->proc~compute_multiplicity1 - - + + - + proc~compute_multiplicity2 - - -compute_multiplicity2 + + +compute_multiplicity2 - + interface~compute_multiplicity->proc~compute_multiplicity2 - - - - - -proc~get_multiplicity~2 - - -nurbs_surface%get_multiplicity - - - - - -proc~get_degree_all~2->proc~get_multiplicity~2 - - - - - -proc~get_degree_dir~2->proc~get_multiplicity~2 - - - - - -proc~get_multiplicity~2->interface~compute_multiplicity - - + + @@ -579,7 +516,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/modify_wc~3.html b/proc/modify_wc~3.html index 831015b08..f60b7bc8a 100644 --- a/proc/modify_wc~3.html +++ b/proc/modify_wc~3.html @@ -78,20 +78,20 @@

    modify_Wc
  • 19 statements + title=" 0.5% of total for procedures.">21 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine modify_Wc(this, W, num)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -4117,14 +5107,29 @@

    Arguments

    - + + + + + + + + + @@ -4132,6 +5137,11 @@

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -216,187 +216,250 @@

    Calls

    - - + + proc~~modify_wc~3~~CallsGraph - + proc~modify_wc~3 - -nurbs_curve%modify_Wc + +nurbs_volume%modify_Wc none~set~3 - - -nurbs_curve%set + + +nurbs_volume%set proc~modify_wc~3->none~set~3 - - + + proc~set1~3 - - -nurbs_curve%set1 + + +nurbs_volume%set1 none~set~3->proc~set1~3 - - + + proc~set2~3 - - -nurbs_curve%set2 + + +nurbs_volume%set2 none~set~3->proc~set2~3 - - + + proc~set3~3 - - -nurbs_curve%set3 + + +nurbs_volume%set3 none~set~3->proc~set3~3 - - + + - - -proc~get_degree - - -nurbs_curve%get_degree + + +none~get_degree~3 + + +nurbs_volume%get_degree - + -proc~set1~3->proc~get_degree - - +proc~set1~3->none~get_degree~3 + + + + + +proc~get_nc~3 + + +nurbs_volume%get_nc + + + + + +proc~set1~3->proc~get_nc~3 + + - + proc~compute_knot_vector - - -compute_knot_vector + + +compute_knot_vector - + proc~set2~3->proc~compute_knot_vector - - + + - - -proc~set3~3->proc~get_degree - - + + +proc~set2~3->proc~get_nc~3 + + - - -proc~repelem - - -repelem + + +proc~set3~3->none~get_degree~3 + + + + + +proc~get_degree_all~2 + + +nurbs_volume%get_degree_all - - -proc~compute_knot_vector->proc~repelem - - + + +none~get_degree~3->proc~get_degree_all~2 + + - - -proc~get_multiplicity~3 - - -nurbs_curve%get_multiplicity + + +proc~get_degree_dir~2 + + +nurbs_volume%get_degree_dir - - -proc~get_degree->proc~get_multiplicity~3 - - + + +none~get_degree~3->proc~get_degree_dir~2 + + + + + +proc~repelem + + +repelem + + + + + +proc~compute_knot_vector->proc~repelem + + - + interface~compute_multiplicity - - -compute_multiplicity + + +compute_multiplicity - - -proc~get_multiplicity~3->interface~compute_multiplicity - - + + +proc~get_nc~3->interface~compute_multiplicity + + - + proc~compute_multiplicity1 - - -compute_multiplicity1 + + +compute_multiplicity1 - + interface~compute_multiplicity->proc~compute_multiplicity1 - - + + - + proc~compute_multiplicity2 - - -compute_multiplicity2 + + +compute_multiplicity2 - + interface~compute_multiplicity->proc~compute_multiplicity2 - - + + + + + +proc~get_multiplicity~3 + + +nurbs_volume%get_multiplicity + + + + + +proc~get_degree_all~2->proc~get_multiplicity~3 + + + + + +proc~get_degree_dir~2->proc~get_multiplicity~3 + + + + + +proc~get_multiplicity~3->interface~compute_multiplicity + + @@ -516,7 +579,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/modify_xc.html b/proc/modify_xc.html index 191c19e2b..7d4894255 100644 --- a/proc/modify_xc.html +++ b/proc/modify_xc.html @@ -83,15 +83,15 @@

    modify_Xc
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine modify_Xc(this, X, num, dir)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -203,7 +203,7 @@

    Arguments

    @@ -240,14 +240,14 @@

    Calls

    proc~modify_xc -nurbs_volume%modify_Xc +nurbs_surface%modify_Xc none~set - + -nurbs_volume%set +nurbs_surface%set @@ -260,9 +260,9 @@

    Calls

    proc~set1 - + -nurbs_volume%set1 +nurbs_surface%set1 @@ -275,9 +275,9 @@

    Calls

    proc~set2 - + -nurbs_volume%set2 +nurbs_surface%set2 @@ -290,9 +290,9 @@

    Calls

    proc~set3 - + -nurbs_volume%set3 +nurbs_surface%set3 @@ -305,9 +305,9 @@

    Calls

    none~get_degree - + -nurbs_volume%get_degree +nurbs_surface%get_degree @@ -320,9 +320,9 @@

    Calls

    proc~get_nc - + -nurbs_volume%get_nc +nurbs_surface%get_nc @@ -362,9 +362,9 @@

    Calls

    proc~get_degree_all - + -nurbs_volume%get_degree_all +nurbs_surface%get_degree_all @@ -377,9 +377,9 @@

    Calls

    proc~get_degree_dir - + -nurbs_volume%get_degree_dir +nurbs_surface%get_degree_dir @@ -452,9 +452,9 @@

    Calls

    proc~get_multiplicity - + -nurbs_volume%get_multiplicity +nurbs_surface%get_multiplicity @@ -594,7 +594,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/modify_xc~2.html b/proc/modify_xc~2.html index 8755223cc..22bc8879c 100644 --- a/proc/modify_xc~2.html +++ b/proc/modify_xc~2.html @@ -83,15 +83,15 @@

    modify_Xc
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine modify_Xc(this, X, num, dir)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(inout) @@ -188,7 +188,7 @@

    Arguments

    - + integer, intent(in)
    - + integer, intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    @@ -231,250 +231,187 @@

    Calls

    - - + + proc~~modify_xc~2~~CallsGraph - + proc~modify_xc~2 - -nurbs_surface%modify_Xc + +nurbs_curve%modify_Xc none~set~2 - - -nurbs_surface%set + + +nurbs_curve%set proc~modify_xc~2->none~set~2 - - + + proc~set1~2 - - -nurbs_surface%set1 + + +nurbs_curve%set1 none~set~2->proc~set1~2 - - + + proc~set2~2 - - -nurbs_surface%set2 + + +nurbs_curve%set2 none~set~2->proc~set2~2 - - + + proc~set3~2 - - -nurbs_surface%set3 + + +nurbs_curve%set3 none~set~2->proc~set3~2 - - + + - - -none~get_degree~2 - - -nurbs_surface%get_degree + + +proc~get_degree + + +nurbs_curve%get_degree - + -proc~set1~2->none~get_degree~2 - - - - - -proc~get_nc~2 - - -nurbs_surface%get_nc - - - - - -proc~set1~2->proc~get_nc~2 - - +proc~set1~2->proc~get_degree + + - + proc~compute_knot_vector - - -compute_knot_vector + + +compute_knot_vector - + proc~set2~2->proc~compute_knot_vector - - - - - -proc~set2~2->proc~get_nc~2 - - - - - -proc~set3~2->none~get_degree~2 - - - - - -proc~get_degree_all~2 - - -nurbs_surface%get_degree_all - + + - - - -none~get_degree~2->proc~get_degree_all~2 - - - - - -proc~get_degree_dir~2 - - -nurbs_surface%get_degree_dir - - - - - -none~get_degree~2->proc~get_degree_dir~2 - - + + +proc~set3~2->proc~get_degree + + - + proc~repelem - - -repelem + + +repelem - + proc~compute_knot_vector->proc~repelem - - + + + + + +proc~get_multiplicity~2 + + +nurbs_curve%get_multiplicity + + + + + +proc~get_degree->proc~get_multiplicity~2 + + - + interface~compute_multiplicity - - -compute_multiplicity + + +compute_multiplicity - - -proc~get_nc~2->interface~compute_multiplicity - - + + +proc~get_multiplicity~2->interface~compute_multiplicity + + - + proc~compute_multiplicity1 - - -compute_multiplicity1 + + +compute_multiplicity1 - + interface~compute_multiplicity->proc~compute_multiplicity1 - - + + - + proc~compute_multiplicity2 - - -compute_multiplicity2 + + +compute_multiplicity2 - + interface~compute_multiplicity->proc~compute_multiplicity2 - - - - - -proc~get_multiplicity~2 - - -nurbs_surface%get_multiplicity - - - - - -proc~get_degree_all~2->proc~get_multiplicity~2 - - - - - -proc~get_degree_dir~2->proc~get_multiplicity~2 - - - - - -proc~get_multiplicity~2->interface~compute_multiplicity - - + + @@ -594,7 +531,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/modify_xc~3.html b/proc/modify_xc~3.html index d3bd85428..69a21834d 100644 --- a/proc/modify_xc~3.html +++ b/proc/modify_xc~3.html @@ -83,15 +83,15 @@

    modify_Xc
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine modify_Xc(this, X, num, dir)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + real(kind=rk), intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    @@ -231,187 +231,250 @@

    Calls

    - - + + proc~~modify_xc~3~~CallsGraph - + proc~modify_xc~3 - -nurbs_curve%modify_Xc + +nurbs_volume%modify_Xc none~set~3 - - -nurbs_curve%set + + +nurbs_volume%set proc~modify_xc~3->none~set~3 - - + + proc~set1~3 - - -nurbs_curve%set1 + + +nurbs_volume%set1 none~set~3->proc~set1~3 - - + + proc~set2~3 - - -nurbs_curve%set2 + + +nurbs_volume%set2 none~set~3->proc~set2~3 - - + + proc~set3~3 - - -nurbs_curve%set3 + + +nurbs_volume%set3 none~set~3->proc~set3~3 - - + + - - -proc~get_degree - - -nurbs_curve%get_degree + + +none~get_degree~3 + + +nurbs_volume%get_degree - + -proc~set1~3->proc~get_degree - - +proc~set1~3->none~get_degree~3 + + + + + +proc~get_nc~3 + + +nurbs_volume%get_nc + + + + + +proc~set1~3->proc~get_nc~3 + + - + proc~compute_knot_vector - - -compute_knot_vector + + +compute_knot_vector - + proc~set2~3->proc~compute_knot_vector - - + + - - -proc~set3~3->proc~get_degree - - + + +proc~set2~3->proc~get_nc~3 + + - - -proc~repelem - - -repelem + + +proc~set3~3->none~get_degree~3 + + + + + +proc~get_degree_all~2 + + +nurbs_volume%get_degree_all - - -proc~compute_knot_vector->proc~repelem - - + + +none~get_degree~3->proc~get_degree_all~2 + + - - -proc~get_multiplicity~3 - - -nurbs_curve%get_multiplicity + + +proc~get_degree_dir~2 + + +nurbs_volume%get_degree_dir - - -proc~get_degree->proc~get_multiplicity~3 - - + + +none~get_degree~3->proc~get_degree_dir~2 + + + + + +proc~repelem + + +repelem + + + + + +proc~compute_knot_vector->proc~repelem + + - + interface~compute_multiplicity - - -compute_multiplicity + + +compute_multiplicity - - -proc~get_multiplicity~3->interface~compute_multiplicity - - + + +proc~get_nc~3->interface~compute_multiplicity + + - + proc~compute_multiplicity1 - - -compute_multiplicity1 + + +compute_multiplicity1 - + interface~compute_multiplicity->proc~compute_multiplicity1 - - + + - + proc~compute_multiplicity2 - - -compute_multiplicity2 + + +compute_multiplicity2 - + interface~compute_multiplicity->proc~compute_multiplicity2 - - + + + + + +proc~get_multiplicity~3 + + +nurbs_volume%get_multiplicity + + + + + +proc~get_degree_all~2->proc~get_multiplicity~3 + + + + + +proc~get_degree_dir~2->proc~get_multiplicity~3 + + + + + +proc~get_multiplicity~3->interface~compute_multiplicity + + @@ -531,7 +594,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/ndgrid2.html b/proc/ndgrid2.html index 9abe9e781..af9d4790f 100644 --- a/proc/ndgrid2.html +++ b/proc/ndgrid2.html @@ -186,7 +186,7 @@

    Arguments

    @@ -243,9 +243,9 @@

    Called by

    proc~basis - + -nurbs_volume%basis +nurbs_surface%basis @@ -255,27 +255,27 @@

    Called by

    - + -proc~basis~2 - +proc~basis~3 + -nurbs_surface%basis +nurbs_volume%basis - + -proc~basis~2->interface~ndgrid +proc~basis~3->interface~ndgrid proc~create - + -nurbs_volume%create +nurbs_surface%create @@ -285,27 +285,27 @@

    Called by

    - + -proc~create~2 - +proc~create~3 + -nurbs_surface%create +nurbs_volume%create - + -proc~create~2->interface~ndgrid +proc~create~3->interface~ndgrid proc~derivative - + -nurbs_volume%derivative +nurbs_surface%derivative @@ -315,18 +315,18 @@

    Called by

    - + -proc~derivative~2 - +proc~derivative~3 + -nurbs_surface%derivative +nurbs_volume%derivative - + -proc~derivative~2->interface~ndgrid +proc~derivative~3->interface~ndgrid @@ -334,91 +334,91 @@

    Called by

    program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~create~2 - - + + +program~example3_surface->proc~create + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~create - - + + +program~example3_volume->proc~create~3 + + program~example_nurbs_surface - -example_nurbs_surface + +example_nurbs_surface - - -program~example_nurbs_surface->proc~create~2 - - + + +program~example_nurbs_surface->proc~create + + program~example_nurbs_volume - -example_nurbs_volume + +example_nurbs_volume - - -program~example_nurbs_volume->proc~create - - + + +program~example_nurbs_volume->proc~create~3 + + program~shape_hexahedron - -shape_hexahedron + +shape_hexahedron - - -program~shape_hexahedron->proc~create - - + + +program~shape_hexahedron->proc~create~3 + + program~shape_tetragon - -shape_tetragon + +shape_tetragon - - -program~shape_tetragon->proc~create~2 - - + + +program~shape_tetragon->proc~create + + @@ -534,7 +534,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/ndgrid3.html b/proc/ndgrid3.html index daa55d74d..aeb603cc8 100644 --- a/proc/ndgrid3.html +++ b/proc/ndgrid3.html @@ -201,7 +201,7 @@

    Arguments

    @@ -258,9 +258,9 @@

    Called by

    proc~basis - + -nurbs_volume%basis +nurbs_surface%basis @@ -270,27 +270,27 @@

    Called by

    - + -proc~basis~2 - +proc~basis~3 + -nurbs_surface%basis +nurbs_volume%basis - + -proc~basis~2->interface~ndgrid +proc~basis~3->interface~ndgrid proc~create - + -nurbs_volume%create +nurbs_surface%create @@ -300,27 +300,27 @@

    Called by

    - + -proc~create~2 - +proc~create~3 + -nurbs_surface%create +nurbs_volume%create - + -proc~create~2->interface~ndgrid +proc~create~3->interface~ndgrid proc~derivative - + -nurbs_volume%derivative +nurbs_surface%derivative @@ -330,18 +330,18 @@

    Called by

    - + -proc~derivative~2 - +proc~derivative~3 + -nurbs_surface%derivative +nurbs_volume%derivative - + -proc~derivative~2->interface~ndgrid +proc~derivative~3->interface~ndgrid @@ -349,91 +349,91 @@

    Called by

    program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~create~2 - - + + +program~example3_surface->proc~create + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~create - - + + +program~example3_volume->proc~create~3 + + program~example_nurbs_surface - -example_nurbs_surface + +example_nurbs_surface - - -program~example_nurbs_surface->proc~create~2 - - + + +program~example_nurbs_surface->proc~create + + program~example_nurbs_volume - -example_nurbs_volume + +example_nurbs_volume - - -program~example_nurbs_volume->proc~create - - + + +program~example_nurbs_volume->proc~create~3 + + program~shape_hexahedron - -shape_hexahedron + +shape_hexahedron - - -program~shape_hexahedron->proc~create - - + + +program~shape_hexahedron->proc~create~3 + + program~shape_tetragon - -shape_tetragon + +shape_tetragon - - -program~shape_tetragon->proc~create~2 - - + + +program~shape_tetragon->proc~create + + @@ -549,7 +549,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/put_to_nurbs.html b/proc/put_to_nurbs.html index d006b10ba..44c4f47e5 100644 --- a/proc/put_to_nurbs.html +++ b/proc/put_to_nurbs.html @@ -78,7 +78,7 @@

    put_to_nurbs
  • 43 statements + title=" 1.1% of total for procedures.">43 statements
  • @@ -158,7 +158,7 @@

    Arguments

  • @@ -173,7 +173,7 @@

    Arguments

    @@ -188,7 +188,7 @@

    Arguments

    @@ -257,18 +257,18 @@

    Calls

    - + -proc~set_elem_xg_vis - +proc~set_elem_xg_vis~3 + nurbs_volume%set_elem_Xg_vis - + -proc~put_to_nurbs->proc~set_elem_xg_vis +proc~put_to_nurbs->proc~set_elem_xg_vis~3 @@ -506,7 +506,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/remove_knots.html b/proc/remove_knots.html index c5c1380ba..0301521c9 100644 --- a/proc/remove_knots.html +++ b/proc/remove_knots.html @@ -78,20 +78,20 @@

    remove_knots
  • 203 statements + title=" 3.5% of total for procedures.">133 statements
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine remove_knots(this, dir, Xth, r)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + real(kind=rk), intent(in)
    - + real(kind=rk), intent(out),
    - + real(kind=rk), intent(out),
    - + class(nurbs_volume), intent(inout)
    - + real(kind=rk), intent(in),
    - + integer, intent(in),
    @@ -158,8 +158,8 @@

    Arguments

    @@ -188,7 +188,7 @@

    Arguments

    @@ -203,7 +203,7 @@

    Arguments

    @@ -231,286 +231,301 @@

    Calls

    - - + + proc~~remove_knots~~CallsGraph - + proc~remove_knots - -nurbs_volume%remove_knots + +nurbs_surface%remove_knots interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity proc~remove_knots->interface~compute_multiplicity - - + + none~set - - -nurbs_volume%set + + +nurbs_surface%set proc~remove_knots->none~set - - + + proc~findspan - -findspan + +findspan proc~remove_knots->proc~findspan - - + + - + +proc~is_rational + + +nurbs_surface%is_rational + + + + + +proc~remove_knots->proc~is_rational + + + + + proc~remove_knots_a_5_8 - - -remove_knots_A_5_8 + + +remove_knots_A_5_8 - + proc~remove_knots->proc~remove_knots_a_5_8 - - + + - + proc~compute_multiplicity1 - - -compute_multiplicity1 + + +compute_multiplicity1 - + interface~compute_multiplicity->proc~compute_multiplicity1 - - + + - + proc~compute_multiplicity2 - - -compute_multiplicity2 + + +compute_multiplicity2 - + interface~compute_multiplicity->proc~compute_multiplicity2 - - + + - + proc~set1 - - -nurbs_volume%set1 + + +nurbs_surface%set1 - + none~set->proc~set1 - - + + - + proc~set2 - - -nurbs_volume%set2 + + +nurbs_surface%set2 - + none~set->proc~set2 - - + + - + proc~set3 - - -nurbs_volume%set3 + + +nurbs_surface%set3 - + none~set->proc~set3 - - + + - + none~get_degree - - -nurbs_volume%get_degree + + +nurbs_surface%get_degree - + proc~set1->none~get_degree - - + + - + proc~get_nc - - -nurbs_volume%get_nc + + +nurbs_surface%get_nc - + proc~set1->proc~get_nc - - + + - + proc~compute_knot_vector - - -compute_knot_vector + + +compute_knot_vector - + proc~set2->proc~compute_knot_vector - - + + - + proc~set2->proc~get_nc - - + + - + proc~set3->none~get_degree - - + + - + proc~get_degree_all - - -nurbs_volume%get_degree_all + + +nurbs_surface%get_degree_all - + none~get_degree->proc~get_degree_all - - + + - + proc~get_degree_dir - - -nurbs_volume%get_degree_dir + + +nurbs_surface%get_degree_dir - + none~get_degree->proc~get_degree_dir - - + + - + proc~repelem - - -repelem + + +repelem - + proc~compute_knot_vector->proc~repelem - - + + - + proc~get_nc->interface~compute_multiplicity - - + + - + proc~get_multiplicity - - -nurbs_volume%get_multiplicity + + +nurbs_surface%get_multiplicity - + proc~get_degree_all->proc~get_multiplicity - - + + - + proc~get_degree_dir->proc~get_multiplicity - - + + - + proc~get_multiplicity->interface~compute_multiplicity - - + + @@ -619,20 +634,20 @@

    Called by

    proc~remove_knots -nurbs_volume%remove_knots +nurbs_surface%remove_knots - + -program~example3_volume - +program~example3_surface + -example3_volume +example3_surface - + -program~example3_volume->proc~remove_knots +program~example3_surface->proc~remove_knots @@ -750,7 +765,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/remove_knots_a_5_8.html b/proc/remove_knots_a_5_8.html index 9d00390cb..a2dc6f1ca 100644 --- a/proc/remove_knots_a_5_8.html +++ b/proc/remove_knots_a_5_8.html @@ -78,7 +78,7 @@

    remove_knots_A_5_8
  • 92 statements + title=" 2.4% of total for procedures.">92 statements
  • @@ -156,7 +156,7 @@

    Arguments

  • @@ -171,7 +171,7 @@

    Arguments

    @@ -216,7 +216,7 @@

    Arguments

    @@ -231,7 +231,7 @@

    Arguments

    @@ -246,7 +246,7 @@

    Arguments

    @@ -261,7 +261,7 @@

    Arguments

    @@ -276,7 +276,7 @@

    Arguments

    @@ -333,9 +333,9 @@

    Called by

    proc~remove_knots - + -nurbs_volume%remove_knots +nurbs_surface%remove_knots @@ -348,24 +348,24 @@

    Called by

    proc~remove_knots~2 - - -nurbs_surface%remove_knots + + +nurbs_curve%remove_knots proc~remove_knots~2->proc~remove_knots_a_5_8 - - + + proc~remove_knots~3 - - -nurbs_curve%remove_knots + + +nurbs_volume%remove_knots @@ -379,46 +379,46 @@

    Called by

    program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->proc~remove_knots~3 - - + + +program~example1_curve->proc~remove_knots~2 + + program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~remove_knots~2 - - + + +program~example3_surface->proc~remove_knots + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~remove_knots - - + + +program~example3_volume->proc~remove_knots~3 + + @@ -534,7 +534,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/remove_knots~2.html b/proc/remove_knots~2.html index 5c8dde93d..65dc4fa43 100644 --- a/proc/remove_knots~2.html +++ b/proc/remove_knots~2.html @@ -78,20 +78,20 @@

    remove_knots
  • 133 statements + title=" 1.4% of total for procedures.">55 statements
  • - Source File + Source File
  • @@ -137,13 +137,13 @@

    Contents

    -

    private pure subroutine remove_knots(this, dir, Xth, r) +

    private pure subroutine remove_knots(this, Xth, r)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in)
    - + real(kind=rk), intent(in),
    - + integer, intent(in),
    - + integer, intent(in)
    - + real(kind=rk), intent(in),
    - + integer, intent(in)
    - + integer, intent(in)
    - + integer, intent(in)
    - + integer, intent(out)
    - + real(kind=rk), intent(out),
    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - - + + + + + + + +
    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -171,21 +171,6 @@

    Arguments

    - - integer, - intent(in) - - ::dir - -
    @@ -231,301 +216,238 @@

    Calls

    - - + + proc~~remove_knots~2~~CallsGraph - + proc~remove_knots~2 - -nurbs_surface%remove_knots + +nurbs_curve%remove_knots interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity proc~remove_knots~2->interface~compute_multiplicity - - + + none~set~2 - - -nurbs_surface%set + + +nurbs_curve%set proc~remove_knots~2->none~set~2 - - + + proc~findspan - -findspan + +findspan proc~remove_knots~2->proc~findspan - - + + proc~is_rational~2 - - -nurbs_surface%is_rational + + +nurbs_curve%is_rational proc~remove_knots~2->proc~is_rational~2 - - + + proc~remove_knots_a_5_8 - -remove_knots_A_5_8 + +remove_knots_A_5_8 proc~remove_knots~2->proc~remove_knots_a_5_8 - - + + proc~compute_multiplicity1 - -compute_multiplicity1 + +compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 - - + + proc~compute_multiplicity2 - -compute_multiplicity2 + +compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 - - + + proc~set1~2 - - -nurbs_surface%set1 + + +nurbs_curve%set1 none~set~2->proc~set1~2 - - + + proc~set2~2 - - -nurbs_surface%set2 + + +nurbs_curve%set2 none~set~2->proc~set2~2 - - + + proc~set3~2 - - -nurbs_surface%set3 + + +nurbs_curve%set3 none~set~2->proc~set3~2 - - + + - - -none~get_degree~2 - - -nurbs_surface%get_degree + + +proc~get_degree + + +nurbs_curve%get_degree - + -proc~set1~2->none~get_degree~2 - - - - - -proc~get_nc~2 - - -nurbs_surface%get_nc - - - - - -proc~set1~2->proc~get_nc~2 - - +proc~set1~2->proc~get_degree + + - + proc~compute_knot_vector - - -compute_knot_vector + + +compute_knot_vector - + proc~set2~2->proc~compute_knot_vector - - - - - -proc~set2~2->proc~get_nc~2 - - - - - -proc~set3~2->none~get_degree~2 - - - - - -proc~get_degree_all~2 - - -nurbs_surface%get_degree_all - - - - - -none~get_degree~2->proc~get_degree_all~2 - - - - - -proc~get_degree_dir~2 - - -nurbs_surface%get_degree_dir - - + + - - -none~get_degree~2->proc~get_degree_dir~2 - - + + +proc~set3~2->proc~get_degree + + - + proc~repelem - - -repelem + + +repelem - + proc~compute_knot_vector->proc~repelem - - - - - -proc~get_nc~2->interface~compute_multiplicity - - + + - + proc~get_multiplicity~2 - - -nurbs_surface%get_multiplicity + + +nurbs_curve%get_multiplicity - - -proc~get_degree_all~2->proc~get_multiplicity~2 - - - - - -proc~get_degree_dir~2->proc~get_multiplicity~2 - - + + +proc~get_degree->proc~get_multiplicity~2 + + - + proc~get_multiplicity~2->interface~compute_multiplicity - - + + @@ -625,31 +547,31 @@

    Called by

    - + proc~~remove_knots~2~~CalledByGraph - + proc~remove_knots~2 - -nurbs_surface%remove_knots + +nurbs_curve%remove_knots - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->proc~remove_knots~2 - - +program~example1_curve->proc~remove_knots~2 + + @@ -765,7 +687,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/remove_knots~3.html b/proc/remove_knots~3.html index b721955e3..7d9611830 100644 --- a/proc/remove_knots~3.html +++ b/proc/remove_knots~3.html @@ -78,20 +78,20 @@

    remove_knots
  • 55 statements + title=" 5.3% of total for procedures.">203 statements
  • - Source File + Source File
  • @@ -137,13 +137,13 @@

    Contents

    -

    private pure subroutine remove_knots(this, Xth, r) +

    private pure subroutine remove_knots(this, dir, Xth, r)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    + + + + + + + + - + @@ -3944,14 +4855,14 @@

    Arguments

    - + @@ -3959,14 +4870,14 @@

    Arguments

    - + @@ -3974,6 +4885,11 @@

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -171,6 +171,21 @@

    Arguments

    + + integer, + intent(in) + + ::dir + +
    @@ -216,238 +231,286 @@

    Calls

    - - + + proc~~remove_knots~3~~CallsGraph - + proc~remove_knots~3 - -nurbs_curve%remove_knots + +nurbs_volume%remove_knots interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity proc~remove_knots~3->interface~compute_multiplicity - - + + none~set~3 - - -nurbs_curve%set + + +nurbs_volume%set proc~remove_knots~3->none~set~3 - - + + proc~findspan - -findspan + +findspan proc~remove_knots~3->proc~findspan - - - - - -proc~is_rational~3 - - -nurbs_curve%is_rational - - - - - -proc~remove_knots~3->proc~is_rational~3 - - + + - + proc~remove_knots_a_5_8 - - -remove_knots_A_5_8 + + +remove_knots_A_5_8 - + proc~remove_knots~3->proc~remove_knots_a_5_8 - - + + - + proc~compute_multiplicity1 - - -compute_multiplicity1 + + +compute_multiplicity1 - + interface~compute_multiplicity->proc~compute_multiplicity1 - - + + - + proc~compute_multiplicity2 - - -compute_multiplicity2 + + +compute_multiplicity2 - + interface~compute_multiplicity->proc~compute_multiplicity2 - - + + - + proc~set1~3 - - -nurbs_curve%set1 + + +nurbs_volume%set1 - + none~set~3->proc~set1~3 - - + + - + proc~set2~3 - - -nurbs_curve%set2 + + +nurbs_volume%set2 - + none~set~3->proc~set2~3 - - + + - + proc~set3~3 - - -nurbs_curve%set3 + + +nurbs_volume%set3 - + none~set~3->proc~set3~3 - - + + - + + +none~get_degree~3 + + +nurbs_volume%get_degree + + + + + +proc~set1~3->none~get_degree~3 + + + + -proc~get_degree - - -nurbs_curve%get_degree +proc~get_nc~3 + + +nurbs_volume%get_nc - + -proc~set1~3->proc~get_degree - - +proc~set1~3->proc~get_nc~3 + + proc~compute_knot_vector - -compute_knot_vector + +compute_knot_vector proc~set2~3->proc~compute_knot_vector - - + + - + -proc~set3~3->proc~get_degree - - +proc~set2~3->proc~get_nc~3 + + - + + +proc~set3~3->none~get_degree~3 + + + + + +proc~get_degree_all~2 + + +nurbs_volume%get_degree_all + + + + + +none~get_degree~3->proc~get_degree_all~2 + + + + +proc~get_degree_dir~2 + + +nurbs_volume%get_degree_dir + + + + + +none~get_degree~3->proc~get_degree_dir~2 + + + + + proc~repelem - - -repelem + + +repelem - + proc~compute_knot_vector->proc~repelem - - + + + + + +proc~get_nc~3->interface~compute_multiplicity + + - + proc~get_multiplicity~3 - - -nurbs_curve%get_multiplicity + + +nurbs_volume%get_multiplicity - - -proc~get_degree->proc~get_multiplicity~3 - - + + +proc~get_degree_all~2->proc~get_multiplicity~3 + + + + + +proc~get_degree_dir~2->proc~get_multiplicity~3 + + - + proc~get_multiplicity~3->interface~compute_multiplicity - - + + @@ -547,31 +610,31 @@

    Called by

    - + proc~~remove_knots~3~~CalledByGraph - + proc~remove_knots~3 - -nurbs_curve%remove_knots + +nurbs_volume%remove_knots - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->proc~remove_knots~3 - - +program~example3_volume->proc~remove_knots~3 + + @@ -687,7 +750,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/repelem.html b/proc/repelem.html index 304e3ae52..bcf6747c8 100644 --- a/proc/repelem.html +++ b/proc/repelem.html @@ -195,7 +195,7 @@

    Arguments

    Return Value - + real(kind=rk), (sum(b))

    @@ -212,595 +212,595 @@

    Called by

    - - + + proc~~repelem~~CalledByGraph - + proc~repelem - -repelem + +repelem proc~compute_knot_vector - -compute_knot_vector + +compute_knot_vector proc~compute_knot_vector->proc~repelem - - + + proc~set2 - - -nurbs_volume%set2 + + +nurbs_surface%set2 proc~set2->proc~compute_knot_vector - - + + proc~set2~2 - - -nurbs_surface%set2 + + +nurbs_curve%set2 proc~set2~2->proc~compute_knot_vector - - + + proc~set2~3 - - -nurbs_curve%set2 + + +nurbs_volume%set2 proc~set2~3->proc~compute_knot_vector - - + + none~set - - -nurbs_volume%set + + +nurbs_surface%set none~set->proc~set2 - - + + none~set~2 - - -nurbs_surface%set + + +nurbs_curve%set none~set~2->proc~set2~2 - - + + none~set~3 - - -nurbs_curve%set + + +nurbs_volume%set none~set~3->proc~set2~3 - - + + proc~elevate_degree - + -nurbs_volume%elevate_degree +nurbs_surface%elevate_degree proc~elevate_degree->none~set - - + + proc~elevate_degree~2 - - -nurbs_surface%elevate_degree + + +nurbs_curve%elevate_degree - + proc~elevate_degree~2->none~set~2 - - + + proc~elevate_degree~3 - - -nurbs_curve%elevate_degree + + +nurbs_volume%elevate_degree - + proc~elevate_degree~3->none~set~3 - - + + proc~insert_knots - + -nurbs_volume%insert_knots +nurbs_surface%insert_knots proc~insert_knots->none~set - - + + proc~insert_knots~2 - - -nurbs_surface%insert_knots + + +nurbs_curve%insert_knots - + proc~insert_knots~2->none~set~2 - - + + proc~insert_knots~3 - - -nurbs_curve%insert_knots + + +nurbs_volume%insert_knots - + proc~insert_knots~3->none~set~3 - - + + proc~modify_wc - + -nurbs_volume%modify_Wc +nurbs_surface%modify_Wc proc~modify_wc->none~set - - + + proc~modify_wc~2 - - -nurbs_surface%modify_Wc + + +nurbs_curve%modify_Wc - + proc~modify_wc~2->none~set~2 - - + + proc~modify_wc~3 - - -nurbs_curve%modify_Wc + + +nurbs_volume%modify_Wc - + proc~modify_wc~3->none~set~3 - - + + proc~modify_xc - + -nurbs_volume%modify_Xc +nurbs_surface%modify_Xc proc~modify_xc->none~set - - + + proc~modify_xc~2 - - -nurbs_surface%modify_Xc + + +nurbs_curve%modify_Xc - + proc~modify_xc~2->none~set~2 - - + + proc~modify_xc~3 - - -nurbs_curve%modify_Xc + + +nurbs_volume%modify_Xc - + proc~modify_xc~3->none~set~3 - - + + proc~remove_knots - + -nurbs_volume%remove_knots +nurbs_surface%remove_knots proc~remove_knots->none~set - - + + proc~remove_knots~2 - - -nurbs_surface%remove_knots + + +nurbs_curve%remove_knots - + proc~remove_knots~2->none~set~2 - - + + proc~remove_knots~3 - - -nurbs_curve%remove_knots + + +nurbs_volume%remove_knots - + proc~remove_knots~3->none~set~3 - - + + proc~set_circle - -nurbs_curve%set_circle + +nurbs_curve%set_circle - - -proc~set_circle->none~set~3 - - + + +proc~set_circle->none~set~2 + + proc~set_hexahedron - -nurbs_volume%set_hexahedron + +nurbs_volume%set_hexahedron - - -proc~set_hexahedron->none~set - - + + +proc~set_hexahedron->none~set~3 + + proc~set_tetragon - -nurbs_surface%set_tetragon + +nurbs_surface%set_tetragon - - -proc~set_tetragon->none~set~2 - - + + +proc~set_tetragon->none~set + + program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->none~set~3 - - + + +program~example1_curve->none~set~2 + + - - -program~example1_curve->proc~elevate_degree~3 - - + + +program~example1_curve->proc~elevate_degree~2 + + - - -program~example1_curve->proc~insert_knots~3 - - + + +program~example1_curve->proc~insert_knots~2 + + - - -program~example1_curve->proc~remove_knots~3 - - + + +program~example1_curve->proc~remove_knots~2 + + program~example3_surface - -example3_surface - - - - - -program~example3_surface->none~set~2 - - - - - -program~example3_surface->proc~elevate_degree~2 - - - - - -program~example3_surface->proc~insert_knots~2 - - - - - -program~example3_surface->proc~remove_knots~2 - - - - - -program~example3_volume - -example3_volume +example3_surface - + -program~example3_volume->none~set - - +program~example3_surface->none~set + + - + -program~example3_volume->proc~elevate_degree +program~example3_surface->proc~elevate_degree - + -program~example3_volume->proc~insert_knots +program~example3_surface->proc~insert_knots - + -program~example3_volume->proc~remove_knots +program~example3_surface->proc~remove_knots + + +program~example3_volume + + +example3_volume + + + + + +program~example3_volume->none~set~3 + + + + + +program~example3_volume->proc~elevate_degree~3 + + + + + +program~example3_volume->proc~insert_knots~3 + + + + + +program~example3_volume->proc~remove_knots~3 + + + program~example_morph - -example_morph + +example_morph - - -program~example_morph->none~set - - + + +program~example_morph->none~set~3 + + program~example_nurbs_curve - -example_nurbs_curve + +example_nurbs_curve - - -program~example_nurbs_curve->none~set~3 - - + + +program~example_nurbs_curve->none~set~2 + + program~example_nurbs_surface - -example_nurbs_surface + +example_nurbs_surface - - -program~example_nurbs_surface->none~set~2 - - + + +program~example_nurbs_surface->none~set + + program~example_nurbs_volume - -example_nurbs_volume + +example_nurbs_volume - - -program~example_nurbs_volume->none~set - - + + +program~example_nurbs_volume->none~set~3 + + program~shape_circle - -shape_circle + +shape_circle program~shape_circle->proc~set_circle - - + + program~shape_hexahedron - -shape_hexahedron + +shape_hexahedron program~shape_hexahedron->proc~set_hexahedron - - + + program~shape_tetragon - -shape_tetragon + +shape_tetragon program~shape_tetragon->proc~set_tetragon - - + + @@ -939,7 +939,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/rotate_xc.html b/proc/rotate_xc.html index 422b52a7b..5dbeff7f2 100644 --- a/proc/rotate_xc.html +++ b/proc/rotate_xc.html @@ -83,15 +83,15 @@

    rotate_Xc
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine rotate_Xc(this, alpha, beta, theta)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -188,7 +188,7 @@

    Arguments

    @@ -203,7 +203,7 @@

    Arguments

    @@ -240,7 +240,7 @@

    Calls

    proc~rotate_xc -nurbs_volume%rotate_Xc +nurbs_surface%rotate_Xc @@ -384,20 +384,20 @@

    Called by

    proc~rotate_xc -nurbs_volume%rotate_Xc +nurbs_surface%rotate_Xc - + -program~example3_volume - +program~example3_surface + -example3_volume +example3_surface - + -program~example3_volume->proc~rotate_xc +program~example3_surface->proc~rotate_xc @@ -515,7 +515,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/rotate_xc~2.html b/proc/rotate_xc~2.html index 9e96d293b..2a4d82553 100644 --- a/proc/rotate_xc~2.html +++ b/proc/rotate_xc~2.html @@ -83,15 +83,15 @@

    rotate_Xc
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine rotate_Xc(this, alpha, beta, theta)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + real(kind=rk), intent(in)
    - + real(kind=rk), intent(in)
    - + real(kind=rk), intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -3867,12 +4773,12 @@

    Arguments

    integer, - + - + @@ -3880,6 +4786,11 @@

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -231,55 +231,55 @@

    Calls

    - + proc~~rotate_xc~2~~CallsGraph - + proc~rotate_xc~2 - -nurbs_surface%rotate_Xc + +nurbs_curve%rotate_Xc proc~rotation - -rotation + +rotation proc~rotate_xc~2->proc~rotation - - + + cosd - -cosd + +cosd proc~rotation->cosd - - + + sind - -sind + +sind proc~rotation->sind - - + + @@ -375,31 +375,31 @@

    Called by

    - + proc~~rotate_xc~2~~CalledByGraph - + proc~rotate_xc~2 - -nurbs_surface%rotate_Xc + +nurbs_curve%rotate_Xc - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->proc~rotate_xc~2 - - +program~example1_curve->proc~rotate_xc~2 + + @@ -515,7 +515,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/rotate_xc~3.html b/proc/rotate_xc~3.html index a5b663000..6d8275b27 100644 --- a/proc/rotate_xc~3.html +++ b/proc/rotate_xc~3.html @@ -83,15 +83,15 @@

    rotate_Xc
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine rotate_Xc(this, alpha, beta, theta)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -3781,26 +4697,16 @@

    Arguments

    - - - - - - - -
    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -231,55 +231,55 @@

    Calls

    - + proc~~rotate_xc~3~~CallsGraph - + proc~rotate_xc~3 - -nurbs_curve%rotate_Xc + +nurbs_volume%rotate_Xc proc~rotation - -rotation + +rotation proc~rotate_xc~3->proc~rotation - - + + cosd - -cosd + +cosd proc~rotation->cosd - - + + sind - -sind + +sind proc~rotation->sind - - + + @@ -375,31 +375,31 @@

    Called by

    - + proc~~rotate_xc~3~~CalledByGraph - + proc~rotate_xc~3 - -nurbs_curve%rotate_Xc + +nurbs_volume%rotate_Xc - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->proc~rotate_xc~3 - - +program~example3_volume->proc~rotate_xc~3 + + @@ -515,7 +515,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/rotate_xg.html b/proc/rotate_xg.html index df2980de8..418f55a76 100644 --- a/proc/rotate_xg.html +++ b/proc/rotate_xg.html @@ -83,15 +83,15 @@

    rotate_Xg
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine rotate_Xg(this, alpha, beta, theta)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -188,7 +188,7 @@

    Arguments

    @@ -203,7 +203,7 @@

    Arguments

    @@ -240,7 +240,7 @@

    Calls

    proc~rotate_xg -nurbs_volume%rotate_Xg +nurbs_surface%rotate_Xg @@ -384,20 +384,20 @@

    Called by

    proc~rotate_xg -nurbs_volume%rotate_Xg +nurbs_surface%rotate_Xg - + -program~example3_volume - +program~example3_surface + -example3_volume +example3_surface - + -program~example3_volume->proc~rotate_xg +program~example3_surface->proc~rotate_xg @@ -515,7 +515,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/rotate_xg~2.html b/proc/rotate_xg~2.html index d1c08ca9b..080b9a78b 100644 --- a/proc/rotate_xg~2.html +++ b/proc/rotate_xg~2.html @@ -83,15 +83,15 @@

    rotate_Xg
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine rotate_Xg(this, alpha, beta, theta)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + real(kind=rk), intent(in)
    - + real(kind=rk), intent(in)
    - + real(kind=rk), intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -3709,12 +4620,12 @@

    Arguments

    integer, - + - + @@ -3722,6 +4633,11 @@

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -231,55 +231,55 @@

    Calls

    - + proc~~rotate_xg~2~~CallsGraph - + proc~rotate_xg~2 - -nurbs_surface%rotate_Xg + +nurbs_curve%rotate_Xg proc~rotation - -rotation + +rotation proc~rotate_xg~2->proc~rotation - - + + cosd - -cosd + +cosd proc~rotation->cosd - - + + sind - -sind + +sind proc~rotation->sind - - + + @@ -375,31 +375,31 @@

    Called by

    - + proc~~rotate_xg~2~~CalledByGraph - + proc~rotate_xg~2 - -nurbs_surface%rotate_Xg + +nurbs_curve%rotate_Xg - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->proc~rotate_xg~2 - - +program~example1_curve->proc~rotate_xg~2 + + @@ -515,7 +515,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/rotate_xg~3.html b/proc/rotate_xg~3.html index 68270cf92..4a5e637dd 100644 --- a/proc/rotate_xg~3.html +++ b/proc/rotate_xg~3.html @@ -83,15 +83,15 @@

    rotate_Xg
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine rotate_Xg(this, alpha, beta, theta)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -171,7 +171,7 @@

    Arguments

    @@ -186,7 +186,7 @@

    Arguments

    @@ -364,9 +364,9 @@

    Called by

    proc~rotate_xc - + -nurbs_volume%rotate_Xc +nurbs_surface%rotate_Xc @@ -379,24 +379,24 @@

    Called by

    proc~rotate_xc~2 - - -nurbs_surface%rotate_Xc + + +nurbs_curve%rotate_Xc proc~rotate_xc~2->proc~rotation - - + + proc~rotate_xc~3 - - -nurbs_curve%rotate_Xc + + +nurbs_volume%rotate_Xc @@ -409,9 +409,9 @@

    Called by

    proc~rotate_xg - + -nurbs_volume%rotate_Xg +nurbs_surface%rotate_Xg @@ -424,24 +424,24 @@

    Called by

    proc~rotate_xg~2 - - -nurbs_surface%rotate_Xg + + +nurbs_curve%rotate_Xg proc~rotate_xg~2->proc~rotation - - + + proc~rotate_xg~3 - - -nurbs_curve%rotate_Xg + + +nurbs_volume%rotate_Xg @@ -455,64 +455,64 @@

    Called by

    program~example1_curve - -example1_curve + +example1_curve - - -program~example1_curve->proc~rotate_xc~3 - - + + +program~example1_curve->proc~rotate_xc~2 + + - - -program~example1_curve->proc~rotate_xg~3 - - + + +program~example1_curve->proc~rotate_xg~2 + + program~example3_surface - -example3_surface + +example3_surface - - -program~example3_surface->proc~rotate_xc~2 - - + + +program~example3_surface->proc~rotate_xc + + - - -program~example3_surface->proc~rotate_xg~2 - - + + +program~example3_surface->proc~rotate_xg + + program~example3_volume - -example3_volume + +example3_volume - - -program~example3_volume->proc~rotate_xc - - + + +program~example3_volume->proc~rotate_xc~3 + + - - -program~example3_volume->proc~rotate_xg - - + + +program~example3_volume->proc~rotate_xg~3 + + @@ -628,7 +628,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/set1.html b/proc/set1.html index 51ea61b58..7b273b970 100644 --- a/proc/set1.html +++ b/proc/set1.html @@ -78,20 +78,20 @@

    set1
  • 26 statements + title=" 0.6% of total for procedures.">24 statements
  • - Source File + Source File
  • -

    private pure subroutine set1(this, knot1, knot2, knot3, Xc, Wc) +

    private pure subroutine set1(this, knot1, knot2, Xc, Wc)

    -

    Set control points and weights for the NURBS volume object.

    +

    Set knot vectors, control points and weights for the NURBS surface object.

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -231,55 +231,55 @@

    Calls

    - + proc~~rotate_xg~3~~CallsGraph - + proc~rotate_xg~3 - -nurbs_curve%rotate_Xg + +nurbs_volume%rotate_Xg proc~rotation - -rotation + +rotation proc~rotate_xg~3->proc~rotation - - + + cosd - -cosd + +cosd proc~rotation->cosd - - + + sind - -sind + +sind proc~rotation->sind - - + + @@ -375,31 +375,31 @@

    Called by

    - + proc~~rotate_xg~3~~CalledByGraph - + proc~rotate_xg~3 - -nurbs_curve%rotate_Xg + +nurbs_volume%rotate_Xg - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->proc~rotate_xg~3 - - +program~example3_volume->proc~rotate_xg~3 + + @@ -515,7 +515,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/rotation.html b/proc/rotation.html index 416c37a7f..cefd810d3 100644 --- a/proc/rotation.html +++ b/proc/rotation.html @@ -78,7 +78,7 @@

    rotation
  • 13 statements + title=" 0.3% of total for procedures.">13 statements
  • @@ -156,7 +156,7 @@

    Arguments

  • - + real(kind=rk), intent(in)
    - + real(kind=rk), intent(in)
    - + real(kind=rk), intent(in)
    @@ -160,7 +160,7 @@

    Arguments

    @@ -189,7 +189,7 @@

    Arguments

    @@ -204,22 +204,7 @@

    Arguments

    - - - - - - - - @@ -234,7 +219,7 @@

    Arguments

    @@ -271,14 +256,14 @@

    Calls

    proc~set1 -nurbs_volume%set1 +nurbs_surface%set1 none~get_degree - + -nurbs_volume%get_degree +nurbs_surface%get_degree @@ -291,9 +276,9 @@

    Calls

    proc~get_nc - + -nurbs_volume%get_nc +nurbs_surface%get_nc @@ -306,9 +291,9 @@

    Calls

    proc~get_degree_all - + -nurbs_volume%get_degree_all +nurbs_surface%get_degree_all @@ -321,9 +306,9 @@

    Calls

    proc~get_degree_dir - + -nurbs_volume%get_degree_dir +nurbs_surface%get_degree_dir @@ -381,9 +366,9 @@

    Calls

    proc~get_multiplicity - + -nurbs_volume%get_multiplicity +nurbs_surface%get_multiplicity @@ -503,207 +488,188 @@

    Called by

    - - + + proc~~set1~~CalledByGraph - + proc~set1 - -nurbs_volume%set1 + +nurbs_surface%set1 none~set - - -nurbs_volume%set + + +nurbs_surface%set none~set->proc~set1 - - + + proc~elevate_degree - - -nurbs_volume%elevate_degree + + +nurbs_surface%elevate_degree proc~elevate_degree->none~set - - + + proc~insert_knots - - -nurbs_volume%insert_knots + + +nurbs_surface%insert_knots proc~insert_knots->none~set - - + + proc~modify_wc - - -nurbs_volume%modify_Wc + + +nurbs_surface%modify_Wc proc~modify_wc->none~set - - + + proc~modify_xc - - -nurbs_volume%modify_Xc + + +nurbs_surface%modify_Xc proc~modify_xc->none~set - - + + proc~remove_knots - - -nurbs_volume%remove_knots + + +nurbs_surface%remove_knots proc~remove_knots->none~set - - + + - + -proc~set_hexahedron - - -nurbs_volume%set_hexahedron +proc~set_tetragon + + +nurbs_surface%set_tetragon - + -proc~set_hexahedron->none~set - - +proc~set_tetragon->none~set + + - + -program~example3_volume - - -example3_volume +program~example3_surface + + +example3_surface - + -program~example3_volume->none~set - - +program~example3_surface->none~set + + - + + +program~example3_surface->proc~elevate_degree + + + + -program~example3_volume->proc~elevate_degree - - +program~example3_surface->proc~insert_knots + + - + -program~example3_volume->proc~insert_knots - - - - - -program~example3_volume->proc~remove_knots - - +program~example3_surface->proc~remove_knots + + - + -program~example_morph - - -example_morph +program~example_nurbs_surface + + +example_nurbs_surface - + -program~example_morph->none~set - - +program~example_nurbs_surface->none~set + + - + -program~example_nurbs_volume - - -example_nurbs_volume +program~shape_tetragon + + +shape_tetragon - - -program~example_nurbs_volume->none~set - - - - - -program~shape_hexahedron - - -shape_hexahedron - - - - - -program~shape_hexahedron->proc~set_hexahedron - - + + +program~shape_tetragon->proc~set_tetragon + + -
    +

    diff --git a/proc/set1~2.html b/proc/set1~2.html index a9a60e560..e20bd834b 100644 --- a/proc/set1~2.html +++ b/proc/set1~2.html @@ -78,20 +78,20 @@

    set1
  • 24 statements + title=" 0.5% of total for procedures.">20 statements
  • - Source File + Source File
  • -

    private pure subroutine set1(this, knot1, knot2, Xc, Wc) +

    private pure subroutine set1(this, knot, Xc, Wc)

    -

    Set knot vectors, control points and weights for the NURBS surface object.

    +

    Set knot vector, control points and weights for the NURBS curve object.

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - class(nurbs_volume), + class(nurbs_surface), intent(inout) @@ -174,7 +174,7 @@

    Arguments

    - + real(kind=rk), intent(in),
    - + real(kind=rk), intent(in),
    - - real(kind=rk), - intent(in), - contiguous - ::knot3(:) - -
    - + real(kind=rk), intent(in),
    - + real(kind=rk), intent(in),
    @@ -159,8 +159,8 @@

    Arguments

    @@ -182,29 +182,14 @@

    Arguments

    contiguous - + - - - - - - - - @@ -219,7 +204,7 @@

    Arguments

    @@ -247,148 +232,91 @@

    Calls

    - - + + proc~~set1~2~~CallsGraph - + proc~set1~2 - -nurbs_surface%set1 + +nurbs_curve%set1 - + -none~get_degree~2 - - -nurbs_surface%get_degree +proc~get_degree + + +nurbs_curve%get_degree - + -proc~set1~2->none~get_degree~2 - - +proc~set1~2->proc~get_degree + + - + -proc~get_nc~2 - - -nurbs_surface%get_nc +proc~get_multiplicity~2 + + +nurbs_curve%get_multiplicity - + -proc~set1~2->proc~get_nc~2 - - - - - -proc~get_degree_all~2 - - -nurbs_surface%get_degree_all - - - - - -none~get_degree~2->proc~get_degree_all~2 - - - - - -proc~get_degree_dir~2 - - -nurbs_surface%get_degree_dir - - - - - -none~get_degree~2->proc~get_degree_dir~2 - - +proc~get_degree->proc~get_multiplicity~2 + + interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity - - -proc~get_nc~2->interface~compute_multiplicity - - + + +proc~get_multiplicity~2->interface~compute_multiplicity + + - + proc~compute_multiplicity1 - - -compute_multiplicity1 + + +compute_multiplicity1 - + interface~compute_multiplicity->proc~compute_multiplicity1 - - + + - + proc~compute_multiplicity2 - - -compute_multiplicity2 + + +compute_multiplicity2 - + interface~compute_multiplicity->proc~compute_multiplicity2 - - - - - -proc~get_multiplicity~2 - - -nurbs_surface%get_multiplicity - - - - - -proc~get_degree_all~2->proc~get_multiplicity~2 - - - - - -proc~get_degree_dir~2->proc~get_multiplicity~2 - - - - - -proc~get_multiplicity~2->interface~compute_multiplicity - - + + @@ -488,184 +416,184 @@

    Called by

    - - + + proc~~set1~2~~CalledByGraph - + proc~set1~2 - -nurbs_surface%set1 + +nurbs_curve%set1 none~set~2 - - -nurbs_surface%set + + +nurbs_curve%set none~set~2->proc~set1~2 - - + + proc~elevate_degree~2 - - -nurbs_surface%elevate_degree + + +nurbs_curve%elevate_degree proc~elevate_degree~2->none~set~2 - - + + proc~insert_knots~2 - - -nurbs_surface%insert_knots + + +nurbs_curve%insert_knots proc~insert_knots~2->none~set~2 - - + + proc~modify_wc~2 - - -nurbs_surface%modify_Wc + + +nurbs_curve%modify_Wc proc~modify_wc~2->none~set~2 - - + + proc~modify_xc~2 - - -nurbs_surface%modify_Xc + + +nurbs_curve%modify_Xc proc~modify_xc~2->none~set~2 - - + + proc~remove_knots~2 - - -nurbs_surface%remove_knots + + +nurbs_curve%remove_knots proc~remove_knots~2->none~set~2 - - + + - + -proc~set_tetragon - - -nurbs_surface%set_tetragon +proc~set_circle + + +nurbs_curve%set_circle - + -proc~set_tetragon->none~set~2 - - +proc~set_circle->none~set~2 + + - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->none~set~2 - - +program~example1_curve->none~set~2 + + - + -program~example3_surface->proc~elevate_degree~2 - - +program~example1_curve->proc~elevate_degree~2 + + - + -program~example3_surface->proc~insert_knots~2 - - +program~example1_curve->proc~insert_knots~2 + + - + -program~example3_surface->proc~remove_knots~2 - - +program~example1_curve->proc~remove_knots~2 + + - + -program~example_nurbs_surface - - -example_nurbs_surface +program~example_nurbs_curve + + +example_nurbs_curve - + -program~example_nurbs_surface->none~set~2 - - +program~example_nurbs_curve->none~set~2 + + - + -program~shape_tetragon - - -shape_tetragon +program~shape_circle + + +shape_circle - + -program~shape_tetragon->proc~set_tetragon - - +program~shape_circle->proc~set_circle + + @@ -781,7 +709,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/set1~3.html b/proc/set1~3.html index ae4a37c05..1e92fdfc1 100644 --- a/proc/set1~3.html +++ b/proc/set1~3.html @@ -78,20 +78,20 @@

    set1
  • 20 statements + title=" 0.7% of total for procedures.">26 statements
  • - Source File + Source File
  • -

    private pure subroutine set1(this, knot, Xc, Wc) +

    private pure subroutine set1(this, knot1, knot2, knot3, Xc, Wc)

    -

    Set knot vector, control points and weights for the NURBS curve object.

    +

    Set control points and weights for the NURBS volume object.

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -174,7 +174,7 @@

    Arguments

    - + real(kind=rk), intent(in), ::knot1(:)knot(:)
    - - real(kind=rk), - intent(in), - contiguous - ::knot2(:) - -
    - + real(kind=rk), intent(in),
    - + real(kind=rk), intent(in),
    @@ -159,8 +159,8 @@

    Arguments

    @@ -182,14 +182,44 @@

    Arguments

    contiguous - + + + + + + + + + + + + + + + + + @@ -204,7 +234,7 @@

    Arguments

    @@ -232,91 +262,148 @@

    Calls

    - - + + proc~~set1~3~~CallsGraph - + proc~set1~3 - -nurbs_curve%set1 + +nurbs_volume%set1 - + -proc~get_degree - - -nurbs_curve%get_degree +none~get_degree~3 + + +nurbs_volume%get_degree - + -proc~set1~3->proc~get_degree - - +proc~set1~3->none~get_degree~3 + + - + -proc~get_multiplicity~3 - - -nurbs_curve%get_multiplicity +proc~get_nc~3 + + +nurbs_volume%get_nc - + -proc~get_degree->proc~get_multiplicity~3 - - +proc~set1~3->proc~get_nc~3 + + + + + +proc~get_degree_all~2 + + +nurbs_volume%get_degree_all + + + + + +none~get_degree~3->proc~get_degree_all~2 + + + + + +proc~get_degree_dir~2 + + +nurbs_volume%get_degree_dir + + + + + +none~get_degree~3->proc~get_degree_dir~2 + + interface~compute_multiplicity - -compute_multiplicity + +compute_multiplicity - - -proc~get_multiplicity~3->interface~compute_multiplicity - - + + +proc~get_nc~3->interface~compute_multiplicity + + - + proc~compute_multiplicity1 - - -compute_multiplicity1 + + +compute_multiplicity1 - + interface~compute_multiplicity->proc~compute_multiplicity1 - - + + - + proc~compute_multiplicity2 - - -compute_multiplicity2 + + +compute_multiplicity2 - + interface~compute_multiplicity->proc~compute_multiplicity2 - - + + + + + +proc~get_multiplicity~3 + + +nurbs_volume%get_multiplicity + + + + + +proc~get_degree_all~2->proc~get_multiplicity~3 + + + + + +proc~get_degree_dir~2->proc~get_multiplicity~3 + + + + + +proc~get_multiplicity~3->interface~compute_multiplicity + + @@ -416,188 +503,207 @@

    Called by

    - - + + proc~~set1~3~~CalledByGraph - + proc~set1~3 - -nurbs_curve%set1 + +nurbs_volume%set1 none~set~3 - - -nurbs_curve%set + + +nurbs_volume%set none~set~3->proc~set1~3 - - + + proc~elevate_degree~3 - - -nurbs_curve%elevate_degree + + +nurbs_volume%elevate_degree proc~elevate_degree~3->none~set~3 - - + + proc~insert_knots~3 - - -nurbs_curve%insert_knots + + +nurbs_volume%insert_knots proc~insert_knots~3->none~set~3 - - + + proc~modify_wc~3 - - -nurbs_curve%modify_Wc + + +nurbs_volume%modify_Wc proc~modify_wc~3->none~set~3 - - + + proc~modify_xc~3 - - -nurbs_curve%modify_Xc + + +nurbs_volume%modify_Xc proc~modify_xc~3->none~set~3 - - + + proc~remove_knots~3 - - -nurbs_curve%remove_knots + + +nurbs_volume%remove_knots proc~remove_knots~3->none~set~3 - - + + - + -proc~set_circle - - -nurbs_curve%set_circle +proc~set_hexahedron + + +nurbs_volume%set_hexahedron - + -proc~set_circle->none~set~3 - - +proc~set_hexahedron->none~set~3 + + - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->none~set~3 - - +program~example3_volume->none~set~3 + + - - -program~example1_curve->proc~elevate_degree~3 - - - - + -program~example1_curve->proc~insert_knots~3 - - +program~example3_volume->proc~elevate_degree~3 + + - + -program~example1_curve->proc~remove_knots~3 - - +program~example3_volume->proc~insert_knots~3 + + + + + +program~example3_volume->proc~remove_knots~3 + + - + -program~example_nurbs_curve - - -example_nurbs_curve +program~example_morph + + +example_morph - + -program~example_nurbs_curve->none~set~3 - - +program~example_morph->none~set~3 + + - + -program~shape_circle - - -shape_circle +program~example_nurbs_volume + + +example_nurbs_volume - - -program~shape_circle->proc~set_circle - - + + +program~example_nurbs_volume->none~set~3 + + + + + +program~shape_hexahedron + + +shape_hexahedron + + + + + +program~shape_hexahedron->proc~set_hexahedron + + -
    +

    diff --git a/proc/set2.html b/proc/set2.html index 1ab6e2505..4002928b7 100644 --- a/proc/set2.html +++ b/proc/set2.html @@ -78,20 +78,20 @@

    set2
  • 19 statements + title=" 0.4% of total for procedures.">16 statements
  • - Source File + Source File
  • -

    private pure subroutine set2(this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc) +

    private pure subroutine set2(this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc)

    -

    Set control points and weights for the NURBS volume object.

    +

    Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -174,7 +174,7 @@

    Arguments

    - + real(kind=rk), intent(in), ::knot(:)knot1(:)
    - + + real(kind=rk), + intent(in), + contiguous + ::knot2(:) + +
    + + real(kind=rk), + intent(in), + contiguous + ::knot3(:) + +
    + real(kind=rk), intent(in),
    - + real(kind=rk), intent(in),
    @@ -160,7 +160,7 @@

    Arguments

    - - - - - - - - @@ -264,22 +249,7 @@

    Arguments

    - - - - - - - - @@ -294,7 +264,7 @@

    Arguments

    @@ -331,7 +301,7 @@

    Calls

    proc~set2 -nurbs_volume%set2 +nurbs_surface%set2 @@ -351,9 +321,9 @@

    Calls

    proc~get_nc - + -nurbs_volume%get_nc +nurbs_surface%get_nc @@ -517,207 +487,188 @@

    Called by

    - - + + proc~~set2~~CalledByGraph - + proc~set2 - -nurbs_volume%set2 + +nurbs_surface%set2 none~set - - -nurbs_volume%set + + +nurbs_surface%set none~set->proc~set2 - - + + proc~elevate_degree - - -nurbs_volume%elevate_degree + + +nurbs_surface%elevate_degree proc~elevate_degree->none~set - - + + proc~insert_knots - - -nurbs_volume%insert_knots + + +nurbs_surface%insert_knots proc~insert_knots->none~set - - + + proc~modify_wc - - -nurbs_volume%modify_Wc + + +nurbs_surface%modify_Wc proc~modify_wc->none~set - - + + proc~modify_xc - - -nurbs_volume%modify_Xc + + +nurbs_surface%modify_Xc proc~modify_xc->none~set - - + + proc~remove_knots - - -nurbs_volume%remove_knots + + +nurbs_surface%remove_knots proc~remove_knots->none~set - - + + - + -proc~set_hexahedron - - -nurbs_volume%set_hexahedron +proc~set_tetragon + + +nurbs_surface%set_tetragon - + -proc~set_hexahedron->none~set - - +proc~set_tetragon->none~set + + - + -program~example3_volume - - -example3_volume +program~example3_surface + + +example3_surface - + -program~example3_volume->none~set - - +program~example3_surface->none~set + + + + + +program~example3_surface->proc~elevate_degree + + - + -program~example3_volume->proc~elevate_degree - - +program~example3_surface->proc~insert_knots + + - + -program~example3_volume->proc~insert_knots - - - - - -program~example3_volume->proc~remove_knots - - +program~example3_surface->proc~remove_knots + + - + -program~example_morph - - -example_morph +program~example_nurbs_surface + + +example_nurbs_surface - + -program~example_morph->none~set - - +program~example_nurbs_surface->none~set + + - + -program~example_nurbs_volume - - -example_nurbs_volume +program~shape_tetragon + + +shape_tetragon - - -program~example_nurbs_volume->none~set - - - - - -program~shape_hexahedron - - -shape_hexahedron - - - - - -program~shape_hexahedron->proc~set_hexahedron - - + + +program~shape_tetragon->proc~set_tetragon + + -
    +

    diff --git a/proc/set2~2.html b/proc/set2~2.html index e6fa5a25d..c72269750 100644 --- a/proc/set2~2.html +++ b/proc/set2~2.html @@ -78,20 +78,20 @@

    set2
  • 16 statements + title=" 0.6% of total for procedures.">22 statements
  • - Source File + Source File
  • -

    private pure subroutine set2(this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc) +

    private pure subroutine set2(this, Xth_dir, degree, continuity, Xc, Wc)

    -

    Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights

    +

    Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights.

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - class(nurbs_volume), + class(nurbs_surface), intent(inout) @@ -204,22 +204,7 @@

    Arguments

    - - real(kind=rk), - intent(in), - contiguous - ::Xth_dir3(:) - -
    - + integer, intent(in),
    - - integer, - intent(in), - contiguous - ::continuity3(:) - -
    - + real(kind=rk), intent(in),
    - + real(kind=rk), intent(in),
    @@ -159,8 +159,8 @@

    Arguments

    @@ -182,22 +182,7 @@

    Arguments

    contiguous - - - - - - - - - + @@ -207,34 +192,19 @@

    Arguments

    integer, - - - - - - - - - + - + @@ -242,14 +212,14 @@

    Arguments

    contiguous - + @@ -264,7 +234,7 @@

    Arguments

    @@ -292,106 +262,46 @@

    Calls

    - - + + proc~~set2~2~~CallsGraph - + proc~set2~2 - -nurbs_surface%set2 + +nurbs_curve%set2 proc~compute_knot_vector - -compute_knot_vector + +compute_knot_vector proc~set2~2->proc~compute_knot_vector - - - - - -proc~get_nc~2 - - -nurbs_surface%get_nc - - - - - -proc~set2~2->proc~get_nc~2 - - + + - + proc~repelem - - -repelem + + +repelem - + proc~compute_knot_vector->proc~repelem - - - - - -interface~compute_multiplicity - - -compute_multiplicity - - - - - -proc~get_nc~2->interface~compute_multiplicity - - - - - -proc~compute_multiplicity1 - - -compute_multiplicity1 - - - - - -interface~compute_multiplicity->proc~compute_multiplicity1 - - - - - -proc~compute_multiplicity2 - - -compute_multiplicity2 - - - - - -interface~compute_multiplicity->proc~compute_multiplicity2 - - + + @@ -487,184 +397,184 @@

    Called by

    - - + + proc~~set2~2~~CalledByGraph - + proc~set2~2 - -nurbs_surface%set2 + +nurbs_curve%set2 none~set~2 - - -nurbs_surface%set + + +nurbs_curve%set none~set~2->proc~set2~2 - - + + proc~elevate_degree~2 - - -nurbs_surface%elevate_degree + + +nurbs_curve%elevate_degree proc~elevate_degree~2->none~set~2 - - + + proc~insert_knots~2 - - -nurbs_surface%insert_knots + + +nurbs_curve%insert_knots proc~insert_knots~2->none~set~2 - - + + proc~modify_wc~2 - - -nurbs_surface%modify_Wc + + +nurbs_curve%modify_Wc proc~modify_wc~2->none~set~2 - - + + proc~modify_xc~2 - - -nurbs_surface%modify_Xc + + +nurbs_curve%modify_Xc proc~modify_xc~2->none~set~2 - - + + proc~remove_knots~2 - - -nurbs_surface%remove_knots + + +nurbs_curve%remove_knots proc~remove_knots~2->none~set~2 - - + + - + -proc~set_tetragon - - -nurbs_surface%set_tetragon +proc~set_circle + + +nurbs_curve%set_circle - + -proc~set_tetragon->none~set~2 - - +proc~set_circle->none~set~2 + + - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->none~set~2 - - +program~example1_curve->none~set~2 + + - + -program~example3_surface->proc~elevate_degree~2 - - +program~example1_curve->proc~elevate_degree~2 + + - + -program~example3_surface->proc~insert_knots~2 - - +program~example1_curve->proc~insert_knots~2 + + - + -program~example3_surface->proc~remove_knots~2 - - +program~example1_curve->proc~remove_knots~2 + + - + -program~example_nurbs_surface - - -example_nurbs_surface +program~example_nurbs_curve + + +example_nurbs_curve - + -program~example_nurbs_surface->none~set~2 - - +program~example_nurbs_curve->none~set~2 + + - + -program~shape_tetragon - - -shape_tetragon +program~shape_circle + + +shape_circle - + -program~shape_tetragon->proc~set_tetragon - - +program~shape_circle->proc~set_circle + + @@ -780,7 +690,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/set2~3.html b/proc/set2~3.html index 80a7ce948..168a6f72e 100644 --- a/proc/set2~3.html +++ b/proc/set2~3.html @@ -78,20 +78,20 @@

    set2
  • 22 statements + title=" 0.5% of total for procedures.">19 statements
  • - Source File + Source File
  • -

    private pure subroutine set2(this, Xth_dir, degree, continuity, Xc, Wc) +

    private pure subroutine set2(this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc)

    -

    Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights.

    +

    Set control points and weights for the NURBS volume object.

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -174,7 +174,7 @@

    Arguments

    - + real(kind=rk), intent(in), ::Xth_dir1(:) - -
    - - real(kind=rk), - intent(in), - contiguous - ::Xth_dir2(:)Xth_dir(:) intent(in), - contiguous - ::degree(:) - -
    - - integer, - intent(in),intent(in) - contiguous + ::continuity1(:)degree
    - + integer, intent(in), ::continuity2(:)continuity(:)
    - + real(kind=rk), intent(in),
    - + real(kind=rk), intent(in),
    @@ -159,8 +159,8 @@

    Arguments

    @@ -182,29 +182,74 @@

    Arguments

    contiguous - + + + + + + + + + + + + + + + + + - + + + + + + + + + - + @@ -212,14 +257,29 @@

    Arguments

    contiguous - + + + + + + + + + @@ -234,7 +294,7 @@

    Arguments

    @@ -262,46 +322,106 @@

    Calls

    - - + + proc~~set2~3~~CallsGraph - + proc~set2~3 - -nurbs_curve%set2 + +nurbs_volume%set2 proc~compute_knot_vector - -compute_knot_vector + +compute_knot_vector proc~set2~3->proc~compute_knot_vector - - + + - + +proc~get_nc~3 + + +nurbs_volume%get_nc + + + + + +proc~set2~3->proc~get_nc~3 + + + + + proc~repelem - - -repelem + + +repelem - + proc~compute_knot_vector->proc~repelem - - + + + + + +interface~compute_multiplicity + + +compute_multiplicity + + + + + +proc~get_nc~3->interface~compute_multiplicity + + + + + +proc~compute_multiplicity1 + + +compute_multiplicity1 + + + + + +interface~compute_multiplicity->proc~compute_multiplicity1 + + + + + +proc~compute_multiplicity2 + + +compute_multiplicity2 + + + + + +interface~compute_multiplicity->proc~compute_multiplicity2 + + @@ -397,188 +517,207 @@

    Called by

    - - + + proc~~set2~3~~CalledByGraph - + proc~set2~3 - -nurbs_curve%set2 + +nurbs_volume%set2 none~set~3 - - -nurbs_curve%set + + +nurbs_volume%set none~set~3->proc~set2~3 - - + + proc~elevate_degree~3 - - -nurbs_curve%elevate_degree + + +nurbs_volume%elevate_degree proc~elevate_degree~3->none~set~3 - - + + proc~insert_knots~3 - - -nurbs_curve%insert_knots + + +nurbs_volume%insert_knots proc~insert_knots~3->none~set~3 - - + + proc~modify_wc~3 - - -nurbs_curve%modify_Wc + + +nurbs_volume%modify_Wc proc~modify_wc~3->none~set~3 - - + + proc~modify_xc~3 - - -nurbs_curve%modify_Xc + + +nurbs_volume%modify_Xc proc~modify_xc~3->none~set~3 - - + + proc~remove_knots~3 - - -nurbs_curve%remove_knots + + +nurbs_volume%remove_knots proc~remove_knots~3->none~set~3 - - + + - + -proc~set_circle - - -nurbs_curve%set_circle +proc~set_hexahedron + + +nurbs_volume%set_hexahedron - + -proc~set_circle->none~set~3 - - +proc~set_hexahedron->none~set~3 + + - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->none~set~3 - - +program~example3_volume->none~set~3 + + - - -program~example1_curve->proc~elevate_degree~3 - - - - + -program~example1_curve->proc~insert_knots~3 - - +program~example3_volume->proc~elevate_degree~3 + + - + -program~example1_curve->proc~remove_knots~3 - - +program~example3_volume->proc~insert_knots~3 + + - + + +program~example3_volume->proc~remove_knots~3 + + + + -program~example_nurbs_curve - - -example_nurbs_curve +program~example_morph + + +example_morph - + -program~example_nurbs_curve->none~set~3 - - +program~example_morph->none~set~3 + + - + -program~shape_circle - - -shape_circle +program~example_nurbs_volume + + +example_nurbs_volume - - -program~shape_circle->proc~set_circle - - + + +program~example_nurbs_volume->none~set~3 + + + + + +program~shape_hexahedron + + +shape_hexahedron + + + + + +program~shape_hexahedron->proc~set_hexahedron + + -
    +

    diff --git a/proc/set3.html b/proc/set3.html index 78ed69fc7..d69988ae5 100644 --- a/proc/set3.html +++ b/proc/set3.html @@ -78,20 +78,20 @@

    set3
  • 30 statements + title=" 0.7% of total for procedures.">26 statements
  • - Source File + Source File
  • @@ -141,10 +141,10 @@

    private pure subroutine set3(this, nc, Xc, Wc)

    -

    Set Bezier or Rational Bezier volume using control points and weights.

    +

    Set Bezier or Rational Bezier surface using control points and weights.

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -174,7 +174,7 @@

    Arguments

    - + real(kind=rk), intent(in), ::Xth_dir(:)Xth_dir1(:)
    - + + real(kind=rk), + intent(in), + contiguous + ::Xth_dir2(:) + +
    + + real(kind=rk), + intent(in), + contiguous + ::Xth_dir3(:) + +
    + integer, intent(in)intent(in), - + contiguous + ::degree(:) + +
    + + integer, + intent(in), + contiguous ::degreecontinuity1(:)
    - + integer, intent(in), ::continuity(:)continuity2(:)
    - + + integer, + intent(in), + contiguous + ::continuity3(:) + +
    + real(kind=rk), intent(in),
    - + real(kind=rk), intent(in),
    @@ -160,7 +160,7 @@

    Arguments

    @@ -189,7 +189,7 @@

    Arguments

    @@ -204,7 +204,7 @@

    Arguments

    @@ -241,14 +241,14 @@

    Calls

    proc~set3 -nurbs_volume%set3 +nurbs_surface%set3 none~get_degree - + -nurbs_volume%get_degree +nurbs_surface%get_degree @@ -261,9 +261,9 @@

    Calls

    proc~get_degree_all - + -nurbs_volume%get_degree_all +nurbs_surface%get_degree_all @@ -276,9 +276,9 @@

    Calls

    proc~get_degree_dir - + -nurbs_volume%get_degree_dir +nurbs_surface%get_degree_dir @@ -291,9 +291,9 @@

    Calls

    proc~get_multiplicity - + -nurbs_volume%get_multiplicity +nurbs_surface%get_multiplicity @@ -452,207 +452,188 @@

    Called by

    - - + + proc~~set3~~CalledByGraph - + proc~set3 - -nurbs_volume%set3 + +nurbs_surface%set3 none~set - - -nurbs_volume%set + + +nurbs_surface%set none~set->proc~set3 - - + + proc~elevate_degree - - -nurbs_volume%elevate_degree + + +nurbs_surface%elevate_degree proc~elevate_degree->none~set - - + + proc~insert_knots - - -nurbs_volume%insert_knots + + +nurbs_surface%insert_knots proc~insert_knots->none~set - - + + proc~modify_wc - - -nurbs_volume%modify_Wc + + +nurbs_surface%modify_Wc proc~modify_wc->none~set - - + + proc~modify_xc - - -nurbs_volume%modify_Xc + + +nurbs_surface%modify_Xc proc~modify_xc->none~set - - + + proc~remove_knots - - -nurbs_volume%remove_knots + + +nurbs_surface%remove_knots proc~remove_knots->none~set - - + + - + -proc~set_hexahedron - - -nurbs_volume%set_hexahedron +proc~set_tetragon + + +nurbs_surface%set_tetragon - + -proc~set_hexahedron->none~set - - +proc~set_tetragon->none~set + + - + -program~example3_volume - - -example3_volume +program~example3_surface + + +example3_surface - + -program~example3_volume->none~set - - +program~example3_surface->none~set + + - + + +program~example3_surface->proc~elevate_degree + + + + -program~example3_volume->proc~elevate_degree - - +program~example3_surface->proc~insert_knots + + - + -program~example3_volume->proc~insert_knots - - - - - -program~example3_volume->proc~remove_knots - - +program~example3_surface->proc~remove_knots + + - + -program~example_morph - - -example_morph +program~example_nurbs_surface + + +example_nurbs_surface - + -program~example_morph->none~set - - +program~example_nurbs_surface->none~set + + - + -program~example_nurbs_volume - - -example_nurbs_volume +program~shape_tetragon + + +shape_tetragon - - -program~example_nurbs_volume->none~set - - - - - -program~shape_hexahedron - - -shape_hexahedron - - - - - -program~shape_hexahedron->proc~set_hexahedron - - + + +program~shape_tetragon->proc~set_tetragon + + -
    +

    diff --git a/proc/set3~2.html b/proc/set3~2.html index 9b601c6b7..9ea04b4be 100644 --- a/proc/set3~2.html +++ b/proc/set3~2.html @@ -78,20 +78,20 @@

    set3
  • 26 statements + title=" 0.6% of total for procedures.">22 statements
  • - Source File + Source File
  • -

    private pure subroutine set3(this, nc, Xc, Wc) +

    private pure subroutine set3(this, Xc, Wc)

    -

    Set Bezier or Rational Bezier surface using control points and weights.

    +

    Set Bezier or Rational Bezier curve using control points and weights.

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - class(nurbs_volume), + class(nurbs_surface), intent(inout) @@ -174,7 +174,7 @@

    Arguments

    - + integer, intent(in),
    - + real(kind=rk), intent(in),
    - + real(kind=rk), intent(in),
    @@ -159,8 +159,8 @@

    Arguments

    - - - - - - - - @@ -204,7 +189,7 @@

    Arguments

    @@ -232,127 +217,91 @@

    Calls

    - - + + proc~~set3~2~~CallsGraph - + proc~set3~2 - -nurbs_surface%set3 + +nurbs_curve%set3 - + -none~get_degree~2 - - -nurbs_surface%get_degree +proc~get_degree + + +nurbs_curve%get_degree - + -proc~set3~2->none~get_degree~2 - - - - - -proc~get_degree_all~2 - - -nurbs_surface%get_degree_all - - - - - -none~get_degree~2->proc~get_degree_all~2 - - - - - -proc~get_degree_dir~2 - - -nurbs_surface%get_degree_dir - - - - - -none~get_degree~2->proc~get_degree_dir~2 - - +proc~set3~2->proc~get_degree + + - + proc~get_multiplicity~2 - - -nurbs_surface%get_multiplicity + + +nurbs_curve%get_multiplicity - - -proc~get_degree_all~2->proc~get_multiplicity~2 - - - - - -proc~get_degree_dir~2->proc~get_multiplicity~2 - - + + +proc~get_degree->proc~get_multiplicity~2 + + - + interface~compute_multiplicity - - -compute_multiplicity + + +compute_multiplicity - + proc~get_multiplicity~2->interface~compute_multiplicity - - + + - + proc~compute_multiplicity1 - - -compute_multiplicity1 + + +compute_multiplicity1 - + interface~compute_multiplicity->proc~compute_multiplicity1 - - + + - + proc~compute_multiplicity2 - - -compute_multiplicity2 + + +compute_multiplicity2 - + interface~compute_multiplicity->proc~compute_multiplicity2 - - + + @@ -452,184 +401,184 @@

    Called by

    - - + + proc~~set3~2~~CalledByGraph - + proc~set3~2 - -nurbs_surface%set3 + +nurbs_curve%set3 none~set~2 - - -nurbs_surface%set + + +nurbs_curve%set none~set~2->proc~set3~2 - - + + proc~elevate_degree~2 - - -nurbs_surface%elevate_degree + + +nurbs_curve%elevate_degree proc~elevate_degree~2->none~set~2 - - + + proc~insert_knots~2 - - -nurbs_surface%insert_knots + + +nurbs_curve%insert_knots proc~insert_knots~2->none~set~2 - - + + proc~modify_wc~2 - - -nurbs_surface%modify_Wc + + +nurbs_curve%modify_Wc proc~modify_wc~2->none~set~2 - - + + proc~modify_xc~2 - - -nurbs_surface%modify_Xc + + +nurbs_curve%modify_Xc proc~modify_xc~2->none~set~2 - - + + proc~remove_knots~2 - - -nurbs_surface%remove_knots + + +nurbs_curve%remove_knots proc~remove_knots~2->none~set~2 - - + + - + -proc~set_tetragon - - -nurbs_surface%set_tetragon +proc~set_circle + + +nurbs_curve%set_circle - + -proc~set_tetragon->none~set~2 - - +proc~set_circle->none~set~2 + + - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->none~set~2 - - +program~example1_curve->none~set~2 + + - + -program~example3_surface->proc~elevate_degree~2 - - +program~example1_curve->proc~elevate_degree~2 + + - + -program~example3_surface->proc~insert_knots~2 - - +program~example1_curve->proc~insert_knots~2 + + - + -program~example3_surface->proc~remove_knots~2 - - +program~example1_curve->proc~remove_knots~2 + + - + -program~example_nurbs_surface - - -example_nurbs_surface +program~example_nurbs_curve + + +example_nurbs_curve - + -program~example_nurbs_surface->none~set~2 - - +program~example_nurbs_curve->none~set~2 + + - + -program~shape_tetragon - - -shape_tetragon +program~shape_circle + + +shape_circle - + -program~shape_tetragon->proc~set_tetragon - - +program~shape_circle->proc~set_circle + + @@ -745,7 +694,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/set3~3.html b/proc/set3~3.html index c2705527d..000a911a4 100644 --- a/proc/set3~3.html +++ b/proc/set3~3.html @@ -78,20 +78,20 @@

    set3
  • 22 statements + title=" 0.8% of total for procedures.">30 statements
  • - Source File + Source File
  • -

    private pure subroutine set3(this, Xc, Wc) +

    private pure subroutine set3(this, nc, Xc, Wc)

    -

    Set Bezier or Rational Bezier curve using control points and weights.

    +

    Set Bezier or Rational Bezier volume using control points and weights.

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -174,22 +174,7 @@

    Arguments

    - - integer, - intent(in), - contiguous - ::nc(:) - -
    - + real(kind=rk), intent(in),
    - + real(kind=rk), intent(in),
    @@ -159,8 +159,8 @@

    Arguments

    + + + + + + + + @@ -189,7 +204,7 @@

    Arguments

    @@ -217,91 +232,127 @@

    Calls

    - - + + proc~~set3~3~~CallsGraph - + proc~set3~3 - -nurbs_curve%set3 + +nurbs_volume%set3 - + -proc~get_degree - - -nurbs_curve%get_degree +none~get_degree~3 + + +nurbs_volume%get_degree - + -proc~set3~3->proc~get_degree - - +proc~set3~3->none~get_degree~3 + + - + -proc~get_multiplicity~3 - - -nurbs_curve%get_multiplicity +proc~get_degree_all~2 + + +nurbs_volume%get_degree_all - + -proc~get_degree->proc~get_multiplicity~3 - - +none~get_degree~3->proc~get_degree_all~2 + + - + +proc~get_degree_dir~2 + + +nurbs_volume%get_degree_dir + + + + + +none~get_degree~3->proc~get_degree_dir~2 + + + + + +proc~get_multiplicity~3 + + +nurbs_volume%get_multiplicity + + + + + +proc~get_degree_all~2->proc~get_multiplicity~3 + + + + + +proc~get_degree_dir~2->proc~get_multiplicity~3 + + + + + interface~compute_multiplicity - - -compute_multiplicity + + +compute_multiplicity - + proc~get_multiplicity~3->interface~compute_multiplicity - - + + - + proc~compute_multiplicity1 - - -compute_multiplicity1 + + +compute_multiplicity1 - + interface~compute_multiplicity->proc~compute_multiplicity1 - - + + - + proc~compute_multiplicity2 - - -compute_multiplicity2 + + +compute_multiplicity2 - + interface~compute_multiplicity->proc~compute_multiplicity2 - - + + @@ -401,188 +452,207 @@

    Called by

    - - + + proc~~set3~3~~CalledByGraph - + proc~set3~3 - -nurbs_curve%set3 + +nurbs_volume%set3 none~set~3 - - -nurbs_curve%set + + +nurbs_volume%set none~set~3->proc~set3~3 - - + + proc~elevate_degree~3 - - -nurbs_curve%elevate_degree + + +nurbs_volume%elevate_degree proc~elevate_degree~3->none~set~3 - - + + proc~insert_knots~3 - - -nurbs_curve%insert_knots + + +nurbs_volume%insert_knots proc~insert_knots~3->none~set~3 - - + + proc~modify_wc~3 - - -nurbs_curve%modify_Wc + + +nurbs_volume%modify_Wc proc~modify_wc~3->none~set~3 - - + + proc~modify_xc~3 - - -nurbs_curve%modify_Xc + + +nurbs_volume%modify_Xc proc~modify_xc~3->none~set~3 - - + + proc~remove_knots~3 - - -nurbs_curve%remove_knots + + +nurbs_volume%remove_knots proc~remove_knots~3->none~set~3 - - + + - + -proc~set_circle - - -nurbs_curve%set_circle +proc~set_hexahedron + + +nurbs_volume%set_hexahedron - + -proc~set_circle->none~set~3 - - +proc~set_hexahedron->none~set~3 + + - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->none~set~3 - - +program~example3_volume->none~set~3 + + - - -program~example1_curve->proc~elevate_degree~3 - - - - + -program~example1_curve->proc~insert_knots~3 - - +program~example3_volume->proc~elevate_degree~3 + + - + -program~example1_curve->proc~remove_knots~3 - - +program~example3_volume->proc~insert_knots~3 + + + + + +program~example3_volume->proc~remove_knots~3 + + - + -program~example_nurbs_curve - - -example_nurbs_curve +program~example_morph + + +example_morph - + -program~example_nurbs_curve->none~set~3 - - +program~example_morph->none~set~3 + + - + -program~shape_circle - - -shape_circle +program~example_nurbs_volume + + +example_nurbs_volume - - -program~shape_circle->proc~set_circle - - + + +program~example_nurbs_volume->none~set~3 + + + + + +program~shape_hexahedron + + +shape_hexahedron + + + + + +program~shape_hexahedron->proc~set_hexahedron + + -
    +

    diff --git a/proc/set_circle.html b/proc/set_circle.html index 4915424e0..7f7a4fa8f 100644 --- a/proc/set_circle.html +++ b/proc/set_circle.html @@ -78,7 +78,7 @@

    set_circle
  • 21 statements + title=" 0.5% of total for procedures.">21 statements
  • @@ -158,7 +158,7 @@

    Arguments

  • @@ -227,63 +227,63 @@

    Calls

    nurbs_curve%set_circle - + -none~set~3 - +none~set~2 + nurbs_curve%set - + -proc~set_circle->none~set~3 +proc~set_circle->none~set~2 - + -proc~set1~3 - +proc~set1~2 + nurbs_curve%set1 - + -none~set~3->proc~set1~3 +none~set~2->proc~set1~2 - + -proc~set2~3 - +proc~set2~2 + nurbs_curve%set2 - + -none~set~3->proc~set2~3 +none~set~2->proc~set2~2 - + -proc~set3~3 - +proc~set3~2 + nurbs_curve%set3 - + -none~set~3->proc~set3~3 +none~set~2->proc~set3~2 @@ -296,9 +296,9 @@

    Calls

    - + -proc~set1~3->proc~get_degree +proc~set1~2->proc~get_degree @@ -311,15 +311,15 @@

    Calls

    - + -proc~set2~3->proc~compute_knot_vector +proc~set2~2->proc~compute_knot_vector - + -proc~set3~3->proc~get_degree +proc~set3~2->proc~get_degree @@ -338,18 +338,18 @@

    Calls

    - + -proc~get_multiplicity~3 - +proc~get_multiplicity~2 + nurbs_curve%get_multiplicity - + -proc~get_degree->proc~get_multiplicity~3 +proc~get_degree->proc~get_multiplicity~2 @@ -362,9 +362,9 @@

    Calls

    - + -proc~get_multiplicity~3->interface~compute_multiplicity +proc~get_multiplicity~2->interface~compute_multiplicity @@ -636,7 +636,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/set_elem.html b/proc/set_elem.html index 0cc991942..2cfa79a6f 100644 --- a/proc/set_elem.html +++ b/proc/set_elem.html @@ -83,15 +83,15 @@

    set_elem
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine set_elem(this, elemConn)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -174,7 +174,22 @@

    Arguments

    - + + integer, + intent(in), + contiguous + ::nc(:) + +
    + real(kind=rk), intent(in),
    - + real(kind=rk), intent(in),
    - + class(nurbs_curve), intent(inout)
    @@ -158,8 +158,8 @@

    Arguments

    @@ -220,7 +220,7 @@

    Arguments

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/set_elem_xc_vis.html b/proc/set_elem_xc_vis.html index ef6389d35..15f3af5e3 100644 --- a/proc/set_elem_xc_vis.html +++ b/proc/set_elem_xc_vis.html @@ -83,15 +83,15 @@

    set_elem_Xc_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine set_elem_Xc_vis(this, elemConn)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in),
    @@ -158,8 +158,8 @@

    Arguments

    @@ -220,7 +220,7 @@

    Arguments

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/set_elem_xc_vis~2.html b/proc/set_elem_xc_vis~2.html index 5f6ba3a36..7fa59b6fc 100644 --- a/proc/set_elem_xc_vis~2.html +++ b/proc/set_elem_xc_vis~2.html @@ -83,15 +83,15 @@

    set_elem_Xc_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine set_elem_Xc_vis(this, elemConn)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in),
    @@ -158,8 +158,8 @@

    Arguments

    @@ -220,7 +220,7 @@

    Arguments

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/set_elem_xc_vis~3.html b/proc/set_elem_xc_vis~3.html index 74196218a..549b19475 100644 --- a/proc/set_elem_xc_vis~3.html +++ b/proc/set_elem_xc_vis~3.html @@ -83,15 +83,15 @@

    set_elem_Xc_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine set_elem_Xc_vis(this, elemConn)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in),
    @@ -158,8 +158,8 @@

    Arguments

    @@ -220,7 +220,7 @@

    Arguments

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/set_elem_xg_vis.html b/proc/set_elem_xg_vis.html index ab2d0ebb2..5770a7fa3 100644 --- a/proc/set_elem_xg_vis.html +++ b/proc/set_elem_xg_vis.html @@ -83,15 +83,15 @@

    set_elem_Xg_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine set_elem_Xg_vis(this, elemConn)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in),
    @@ -158,8 +158,8 @@

    Arguments

    @@ -190,142 +190,6 @@

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in),

    -
    -
    -

    Called by

    -
    -
    -
    - - - - - -proc~~set_elem_xg_vis~~CalledByGraph - - - -proc~set_elem_xg_vis - -nurbs_volume%set_elem_Xg_vis - - - -proc~put_to_nurbs - - -nurbs_volume%put_to_nurbs - - - - - -proc~put_to_nurbs->proc~set_elem_xg_vis - - - - - -program~example_morph - - -example_morph - - - - - -program~example_morph->proc~put_to_nurbs - - - - - -
    - Help -
    - -
    -
    -
    @@ -356,7 +220,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/set_elem_xg_vis~2.html b/proc/set_elem_xg_vis~2.html index da9a67aef..4eb3f2eb6 100644 --- a/proc/set_elem_xg_vis~2.html +++ b/proc/set_elem_xg_vis~2.html @@ -83,15 +83,15 @@

    set_elem_Xg_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine set_elem_Xg_vis(this, elemConn)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -220,7 +220,7 @@

    Arguments

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/set_elem_xg_vis~3.html b/proc/set_elem_xg_vis~3.html index 5e715322d..f4bed9bcc 100644 --- a/proc/set_elem_xg_vis~3.html +++ b/proc/set_elem_xg_vis~3.html @@ -83,15 +83,15 @@

    set_elem_Xg_vis
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine set_elem_Xg_vis(this, elemConn)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in),
    @@ -158,8 +158,8 @@

    Arguments

    @@ -190,6 +190,142 @@

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in),

    +
    +
    +

    Called by

    +
    +
    +
    + + + + + +proc~~set_elem_xg_vis~3~~CalledByGraph + + + +proc~set_elem_xg_vis~3 + +nurbs_volume%set_elem_Xg_vis + + + +proc~put_to_nurbs + + +nurbs_volume%put_to_nurbs + + + + + +proc~put_to_nurbs->proc~set_elem_xg_vis~3 + + + + + +program~example_morph + + +example_morph + + + + + +program~example_morph->proc~put_to_nurbs + + + + + +
    + Help +
    + +
    +
    +
    @@ -220,7 +356,7 @@

    Arguments

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/set_elem~2.html b/proc/set_elem~2.html index bf382af48..8cb6ddc77 100644 --- a/proc/set_elem~2.html +++ b/proc/set_elem~2.html @@ -83,15 +83,15 @@

    set_elem
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine set_elem(this, elemConn)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -220,7 +220,7 @@

    Arguments

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/set_elem~3.html b/proc/set_elem~3.html index 3c96bba4f..9fcc2101a 100644 --- a/proc/set_elem~3.html +++ b/proc/set_elem~3.html @@ -83,15 +83,15 @@

    set_elem
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine set_elem(this, elemConn)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in),
    @@ -158,8 +158,8 @@

    Arguments

    @@ -220,7 +220,7 @@

    Arguments

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/set_hexahedron.html b/proc/set_hexahedron.html index 9cb0a6135..2103820e2 100644 --- a/proc/set_hexahedron.html +++ b/proc/set_hexahedron.html @@ -158,7 +158,7 @@

    Arguments

    @@ -173,7 +173,7 @@

    Arguments

    @@ -188,7 +188,7 @@

    Arguments

    @@ -203,7 +203,7 @@

    Arguments

    @@ -242,18 +242,18 @@

    Calls

    nurbs_volume%set_hexahedron - + -none~set - +none~set~3 + nurbs_volume%set - + -proc~set_hexahedron->none~set +proc~set_hexahedron->none~set~3 @@ -272,78 +272,78 @@

    Calls

    - + -proc~set1 - +proc~set1~3 + nurbs_volume%set1 - + -none~set->proc~set1 +none~set~3->proc~set1~3 - + -proc~set2 - +proc~set2~3 + nurbs_volume%set2 - + -none~set->proc~set2 +none~set~3->proc~set2~3 - + -proc~set3 - +proc~set3~3 + nurbs_volume%set3 - + -none~set->proc~set3 +none~set~3->proc~set3~3 - + -none~get_degree - +none~get_degree~3 + nurbs_volume%get_degree - + -proc~set1->none~get_degree +proc~set1~3->none~get_degree~3 - + -proc~get_nc - +proc~get_nc~3 + nurbs_volume%get_nc - + -proc~set1->proc~get_nc +proc~set1~3->proc~get_nc~3 @@ -356,51 +356,51 @@

    Calls

    - + -proc~set2->proc~compute_knot_vector +proc~set2~3->proc~compute_knot_vector - + -proc~set2->proc~get_nc +proc~set2~3->proc~get_nc~3 - + -proc~set3->none~get_degree +proc~set3~3->none~get_degree~3 - + -proc~get_degree_all - +proc~get_degree_all~2 + nurbs_volume%get_degree_all - + -none~get_degree->proc~get_degree_all +none~get_degree~3->proc~get_degree_all~2 - + -proc~get_degree_dir - +proc~get_degree_dir~2 + nurbs_volume%get_degree_dir - + -none~get_degree->proc~get_degree_dir +none~get_degree~3->proc~get_degree_dir~2 @@ -428,9 +428,9 @@

    Calls

    - + -proc~get_nc->interface~compute_multiplicity +proc~get_nc~3->interface~compute_multiplicity @@ -464,30 +464,30 @@

    Calls

    - + -proc~get_multiplicity - +proc~get_multiplicity~3 + nurbs_volume%get_multiplicity - + -proc~get_degree_all->proc~get_multiplicity +proc~get_degree_all~2->proc~get_multiplicity~3 - + -proc~get_degree_dir->proc~get_multiplicity +proc~get_degree_dir~2->proc~get_multiplicity~3 - + -proc~get_multiplicity->interface~compute_multiplicity +proc~get_multiplicity~3->interface~compute_multiplicity @@ -729,7 +729,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/set_tetragon.html b/proc/set_tetragon.html index ca5f9e3fb..8e639f3fe 100644 --- a/proc/set_tetragon.html +++ b/proc/set_tetragon.html @@ -158,7 +158,7 @@

    Arguments

    @@ -173,7 +173,7 @@

    Arguments

    @@ -188,7 +188,7 @@

    Arguments

    @@ -203,7 +203,7 @@

    Arguments

    @@ -242,18 +242,18 @@

    Calls

    nurbs_surface%set_tetragon - + -none~set~2 - +none~set + nurbs_surface%set - + -proc~set_tetragon->none~set~2 +proc~set_tetragon->none~set @@ -272,78 +272,78 @@

    Calls

    - + -proc~set1~2 - +proc~set1 + nurbs_surface%set1 - + -none~set~2->proc~set1~2 +none~set->proc~set1 - + -proc~set2~2 - +proc~set2 + nurbs_surface%set2 - + -none~set~2->proc~set2~2 +none~set->proc~set2 - + -proc~set3~2 - +proc~set3 + nurbs_surface%set3 - + -none~set~2->proc~set3~2 +none~set->proc~set3 - + -none~get_degree~2 - +none~get_degree + nurbs_surface%get_degree - + -proc~set1~2->none~get_degree~2 +proc~set1->none~get_degree - + -proc~get_nc~2 - +proc~get_nc + nurbs_surface%get_nc - + -proc~set1~2->proc~get_nc~2 +proc~set1->proc~get_nc @@ -356,51 +356,51 @@

    Calls

    - + -proc~set2~2->proc~compute_knot_vector +proc~set2->proc~compute_knot_vector - + -proc~set2~2->proc~get_nc~2 +proc~set2->proc~get_nc - + -proc~set3~2->none~get_degree~2 +proc~set3->none~get_degree - + -proc~get_degree_all~2 - +proc~get_degree_all + nurbs_surface%get_degree_all - + -none~get_degree~2->proc~get_degree_all~2 +none~get_degree->proc~get_degree_all - + -proc~get_degree_dir~2 - +proc~get_degree_dir + nurbs_surface%get_degree_dir - + -none~get_degree~2->proc~get_degree_dir~2 +none~get_degree->proc~get_degree_dir @@ -428,9 +428,9 @@

    Calls

    - + -proc~get_nc~2->interface~compute_multiplicity +proc~get_nc->interface~compute_multiplicity @@ -464,30 +464,30 @@

    Calls

    - + -proc~get_multiplicity~2 - +proc~get_multiplicity + nurbs_surface%get_multiplicity - + -proc~get_degree_all~2->proc~get_multiplicity~2 +proc~get_degree_all->proc~get_multiplicity - + -proc~get_degree_dir~2->proc~get_multiplicity~2 +proc~get_degree_dir->proc~get_multiplicity - + -proc~get_multiplicity~2->interface~compute_multiplicity +proc~get_multiplicity->interface~compute_multiplicity @@ -729,7 +729,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/show.html b/proc/show.html index 05645be88..c61d9bca3 100644 --- a/proc/show.html +++ b/proc/show.html @@ -83,15 +83,15 @@

    show
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + integer, intent(in),
    - + class(nurbs_volume), intent(inout)
    - + real(kind=rk), intent(in),
    - + integer, intent(in),
    - + real(kind=rk), intent(in),
    - + class(nurbs_surface), intent(inout)
    - + real(kind=rk), intent(in)
    - + integer, intent(in)
    - + real(kind=rk), intent(in),
    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - - + @@ -2892,14 +2824,14 @@

    Arguments

    - + @@ -2916,23 +2848,23 @@

    Arguments

    - +

    - generic, public :: - set => set1, set2, set3 + procedure, public :: + modify_Xc

    -

    Set NURBS curve

    +

    Modify control points

    • - private pure subroutine set1(this, knot, Xc, Wc) + private pure subroutine modify_Xc(this, X, num, dir)

      Author
      Seyed Ali Ghasemi
      @@ -2940,7 +2872,7 @@

      -

      Set knot vector, control points and weights for the NURBS curve object.

      +

      Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(inout) @@ -216,76 +216,61 @@

    Called by

    - - + + proc~~show~~CalledByGraph - + proc~show - -nurbs_volume%show + +nurbs_surface%show - + -program~example3_volume - - -example3_volume +program~example3_surface + + +example3_surface - + -program~example3_volume->proc~show - - +program~example3_surface->proc~show + + - + -program~example_morph - - -example_morph +program~example_nurbs_surface + + +example_nurbs_surface - + -program~example_morph->proc~show - - +program~example_nurbs_surface->proc~show + + - + -program~example_nurbs_volume - - -example_nurbs_volume +program~shape_tetragon + + +shape_tetragon - + -program~example_nurbs_volume->proc~show - - - - - -program~shape_hexahedron - - -shape_hexahedron - - - - - -program~shape_hexahedron->proc~show - - +program~shape_tetragon->proc~show + + @@ -401,7 +386,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/show~2.html b/proc/show~2.html index b79769ff8..e79e4fdd8 100644 --- a/proc/show~2.html +++ b/proc/show~2.html @@ -83,15 +83,15 @@

    show
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    +
    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -216,61 +216,61 @@

    Called by

    - + proc~~show~2~~CalledByGraph - + proc~show~2 - -nurbs_surface%show + +nurbs_curve%show - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->proc~show~2 - - +program~example1_curve->proc~show~2 + + - + -program~example_nurbs_surface - - -example_nurbs_surface +program~example_nurbs_curve + + +example_nurbs_curve - + -program~example_nurbs_surface->proc~show~2 - - +program~example_nurbs_curve->proc~show~2 + + - + -program~shape_tetragon - - -shape_tetragon +program~shape_circle + + +shape_circle - + -program~shape_tetragon->proc~show~2 - - +program~shape_circle->proc~show~2 + + @@ -386,7 +386,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/show~3.html b/proc/show~3.html index 697cd34f0..5bab32445 100644 --- a/proc/show~3.html +++ b/proc/show~3.html @@ -83,15 +83,15 @@

    show
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -171,7 +171,7 @@

    Arguments

    @@ -189,7 +189,7 @@

    Arguments

    Return Value - + real(kind=rk), allocatable, (:,:)

    @@ -361,7 +361,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/translate_xc.html b/proc/translate_xc.html index 8b55d6a3d..3c729703a 100644 --- a/proc/translate_xc.html +++ b/proc/translate_xc.html @@ -83,15 +83,15 @@

    translate_Xc
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine translate_Xc(this, vec)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -216,61 +216,76 @@

    Called by

    - - + + proc~~show~3~~CalledByGraph - + proc~show~3 - -nurbs_curve%show + +nurbs_volume%show - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->proc~show~3 - - +program~example3_volume->proc~show~3 + + - + -program~example_nurbs_curve - - -example_nurbs_curve +program~example_morph + + +example_morph - + -program~example_nurbs_curve->proc~show~3 - - +program~example_morph->proc~show~3 + + - + -program~shape_circle - - -shape_circle +program~example_nurbs_volume + + +example_nurbs_volume - + -program~shape_circle->proc~show~3 - - +program~example_nurbs_volume->proc~show~3 + + + + + +program~shape_hexahedron + + +shape_hexahedron + + + + + +program~shape_hexahedron->proc~show~3 + + @@ -386,7 +401,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/tetragon_xc.html b/proc/tetragon_xc.html index 75cd5bb96..fd9c4325c 100644 --- a/proc/tetragon_xc.html +++ b/proc/tetragon_xc.html @@ -156,7 +156,7 @@

    Arguments

    - + real(kind=rk), intent(in)
    - + integer, intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    @@ -210,20 +210,20 @@

    Called by

    proc~translate_xc -nurbs_volume%translate_Xc +nurbs_surface%translate_Xc - + -program~example3_volume - +program~example3_surface + -example3_volume +example3_surface - + -program~example3_volume->proc~translate_xc +program~example3_surface->proc~translate_xc @@ -341,7 +341,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/translate_xc~2.html b/proc/translate_xc~2.html index 978fb1ede..72eab70f0 100644 --- a/proc/translate_xc~2.html +++ b/proc/translate_xc~2.html @@ -83,15 +83,15 @@

    translate_Xc
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine translate_Xc(this, vec)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + real(kind=rk), intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    - + @@ -2750,54 +2737,14 @@

    Arguments

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -201,31 +201,31 @@

    Called by

    - + proc~~translate_xc~2~~CalledByGraph - + proc~translate_xc~2 - -nurbs_surface%translate_Xc + +nurbs_curve%translate_Xc - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->proc~translate_xc~2 - - +program~example1_curve->proc~translate_xc~2 + + @@ -341,7 +341,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/translate_xc~3.html b/proc/translate_xc~3.html index bdbe59a08..6eb7ac973 100644 --- a/proc/translate_xc~3.html +++ b/proc/translate_xc~3.html @@ -83,15 +83,15 @@

    translate_Xc
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine translate_Xc(this, vec)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -2595,6 +2577,11 @@

    Arguments

    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -201,31 +201,31 @@

    Called by

    - + proc~~translate_xc~3~~CalledByGraph - + proc~translate_xc~3 - -nurbs_curve%translate_Xc + +nurbs_volume%translate_Xc - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->proc~translate_xc~3 - - +program~example3_volume->proc~translate_xc~3 + + @@ -341,7 +341,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/translate_xg.html b/proc/translate_xg.html index 635a08e2e..aab4f922a 100644 --- a/proc/translate_xg.html +++ b/proc/translate_xg.html @@ -83,15 +83,15 @@

    translate_Xg
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine translate_Xg(this, vec)

    Type Bound

    -

    nurbs_volume

    +

    nurbs_surface

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -210,20 +210,20 @@

    Called by

    proc~translate_xg -nurbs_volume%translate_Xg +nurbs_surface%translate_Xg - + -program~example3_volume - +program~example3_surface + -example3_volume +example3_surface - + -program~example3_volume->proc~translate_xg +program~example3_surface->proc~translate_xg @@ -341,7 +341,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/translate_xg~2.html b/proc/translate_xg~2.html index c4ec53703..ffa04cd64 100644 --- a/proc/translate_xg~2.html +++ b/proc/translate_xg~2.html @@ -83,15 +83,15 @@

    translate_Xg
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine translate_Xg(this, vec)

    Type Bound

    -

    nurbs_surface

    +

    nurbs_curve

    Arguments

    - - class(nurbs_volume), + + class(nurbs_surface), intent(inout) @@ -173,7 +173,7 @@

    Arguments

    - + real(kind=rk), intent(in)
    @@ -158,8 +158,8 @@

    Arguments

    - - - - - - - - - - - - - - - - - + @@ -2486,6 +2508,11 @@

    Arguments

    - - class(nurbs_surface), + + class(nurbs_curve), intent(inout) @@ -201,31 +201,31 @@

    Called by

    - + proc~~translate_xg~2~~CalledByGraph - + proc~translate_xg~2 - -nurbs_surface%translate_Xg + +nurbs_curve%translate_Xg - + -program~example3_surface - - -example3_surface +program~example1_curve + + +example1_curve - + -program~example3_surface->proc~translate_xg~2 - - +program~example1_curve->proc~translate_xg~2 + + @@ -341,7 +341,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/translate_xg~3.html b/proc/translate_xg~3.html index ae80dbf94..fb0cf7352 100644 --- a/proc/translate_xg~3.html +++ b/proc/translate_xg~3.html @@ -83,15 +83,15 @@

    translate_Xg
  • - Source File + Source File
  • @@ -143,7 +143,7 @@

    private pure subroutine translate_Xg(this, vec)

    Type Bound

    -

    nurbs_curve

    +

    nurbs_volume

    Arguments

    @@ -158,8 +158,8 @@

    Arguments

    @@ -220,9 +220,9 @@

    Called by

    proc~cmp_elem - + -nurbs_volume%cmp_elem +nurbs_surface%cmp_elem @@ -235,24 +235,24 @@

    Called by

    proc~cmp_elem~2 - - -nurbs_surface%cmp_elem + + +nurbs_curve%cmp_elem proc~cmp_elem~2->interface~unique - - + + proc~cmp_elem~3 - - -nurbs_curve%cmp_elem + + +nurbs_volume%cmp_elem @@ -376,7 +376,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/unique_real.html b/proc/unique_real.html index 1cbee8b26..b9d823206 100644 --- a/proc/unique_real.html +++ b/proc/unique_real.html @@ -156,7 +156,7 @@

    Arguments

    @@ -220,9 +220,9 @@

    Called by

    proc~cmp_elem - + -nurbs_volume%cmp_elem +nurbs_surface%cmp_elem @@ -235,24 +235,24 @@

    Called by

    proc~cmp_elem~2 - - -nurbs_surface%cmp_elem + + +nurbs_curve%cmp_elem proc~cmp_elem~2->interface~unique - - + + proc~cmp_elem~3 - - -nurbs_curve%cmp_elem + + +nurbs_volume%cmp_elem @@ -376,7 +376,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/program/example1_curve.html b/program/example1_curve.html index ba67373b4..244c766b0 100644 --- a/program/example1_curve.html +++ b/program/example1_curve.html @@ -115,9 +115,9 @@

    Variables

    - Wc - Xc - knot + Wc + Xc + knot nurbs
    @@ -408,108 +408,108 @@

    Calls

    example1_curve - + -none~get_knot~3 - +none~get_knot~2 + nurbs_curve%get_knot - + -program~example1_curve->none~get_knot~3 +program~example1_curve->none~get_knot~2 - + -none~set~3 - +none~set~2 + nurbs_curve%set - + -program~example1_curve->none~set~3 +program~example1_curve->none~set~2 - + -proc~create~3 - +proc~create~2 + nurbs_curve%create - + -program~example1_curve->proc~create~3 +program~example1_curve->proc~create~2 - + -proc~elevate_degree~3 - +proc~elevate_degree~2 + nurbs_curve%elevate_degree - + -program~example1_curve->proc~elevate_degree~3 +program~example1_curve->proc~elevate_degree~2 - + -proc~export_xc~3 - +proc~export_xc~2 + nurbs_curve%export_Xc - + -program~example1_curve->proc~export_xc~3 +program~example1_curve->proc~export_xc~2 - + -proc~export_xg~3 - +proc~export_xg~2 + nurbs_curve%export_Xg - + -program~example1_curve->proc~export_xg~3 +program~example1_curve->proc~export_xg~2 - + -proc~finalize~3 - +proc~finalize~2 + nurbs_curve%finalize - + -program~example1_curve->proc~finalize~3 +program~example1_curve->proc~finalize~2 @@ -528,183 +528,183 @@

    Calls

    - + -proc~insert_knots~3 - +proc~insert_knots~2 + nurbs_curve%insert_knots - + -program~example1_curve->proc~insert_knots~3 +program~example1_curve->proc~insert_knots~2 - + -proc~remove_knots~3 - +proc~remove_knots~2 + nurbs_curve%remove_knots - + -program~example1_curve->proc~remove_knots~3 +program~example1_curve->proc~remove_knots~2 - + -proc~rotate_xc~3 - +proc~rotate_xc~2 + nurbs_curve%rotate_Xc - + -program~example1_curve->proc~rotate_xc~3 +program~example1_curve->proc~rotate_xc~2 - + -proc~rotate_xg~3 - +proc~rotate_xg~2 + nurbs_curve%rotate_Xg - + -program~example1_curve->proc~rotate_xg~3 +program~example1_curve->proc~rotate_xg~2 - + -proc~show~3 - +proc~show~2 + nurbs_curve%show - + -program~example1_curve->proc~show~3 +program~example1_curve->proc~show~2 - + -proc~translate_xc~3 - +proc~translate_xc~2 + nurbs_curve%translate_Xc - + -program~example1_curve->proc~translate_xc~3 +program~example1_curve->proc~translate_xc~2 - + -proc~translate_xg~3 - +proc~translate_xg~2 + nurbs_curve%translate_Xg - + -program~example1_curve->proc~translate_xg~3 +program~example1_curve->proc~translate_xg~2 - + -proc~get_knot_all~3 - +proc~get_knot_all~2 + nurbs_curve%get_knot_all - + -none~get_knot~3->proc~get_knot_all~3 +none~get_knot~2->proc~get_knot_all~2 - + -proc~get_knoti~3 - +proc~get_knoti~2 + nurbs_curve%get_knoti - + -none~get_knot~3->proc~get_knoti~3 +none~get_knot~2->proc~get_knoti~2 - + -proc~set1~3 - +proc~set1~2 + nurbs_curve%set1 - + -none~set~3->proc~set1~3 +none~set~2->proc~set1~2 - + -proc~set2~3 - +proc~set2~2 + nurbs_curve%set2 - + -none~set~3->proc~set2~3 +none~set~2->proc~set2~2 - + -proc~set3~3 - +proc~set3~2 + nurbs_curve%set3 - + -none~set~3->proc~set3~3 +none~set~2->proc~set3~2 @@ -717,30 +717,30 @@

    Calls

    - + -proc~create~3->proc~basis_bspline +proc~create~2->proc~basis_bspline - + -proc~is_rational~3 - +proc~is_rational~2 + nurbs_curve%is_rational - + -proc~create~3->proc~is_rational~3 +proc~create~2->proc~is_rational~2 - + -proc~elevate_degree~3->none~set~3 +proc~elevate_degree~2->none~set~2 @@ -753,66 +753,66 @@

    Calls

    - + -proc~elevate_degree~3->proc~elevate_degree_a_5_9 +proc~elevate_degree~2->proc~elevate_degree_a_5_9 - + -proc~elevate_degree~3->proc~is_rational~3 +proc~elevate_degree~2->proc~is_rational~2 - + -proc~cmp_elem_xc_vis~3 - +proc~cmp_elem_xc_vis~2 + nurbs_curve%cmp_elem_Xc_vis - + -proc~export_xc~3->proc~cmp_elem_xc_vis~3 +proc~export_xc~2->proc~cmp_elem_xc_vis~2 - + -proc~cmp_elem_xg_vis~3 - +proc~cmp_elem_xg_vis~2 + nurbs_curve%cmp_elem_Xg_vis - + -proc~export_xg~3->proc~cmp_elem_xg_vis~3 +proc~export_xg~2->proc~cmp_elem_xg_vis~2 - + -proc~get_multiplicity~3 - +proc~get_multiplicity~2 + nurbs_curve%get_multiplicity - + -proc~get_degree->proc~get_multiplicity~3 +proc~get_degree->proc~get_multiplicity~2 - + -proc~insert_knots~3->none~set~3 +proc~insert_knots~2->none~set~2 @@ -825,9 +825,9 @@

    Calls

    - + -proc~insert_knots~3->interface~compute_multiplicity +proc~insert_knots~2->interface~compute_multiplicity @@ -840,9 +840,9 @@

    Calls

    - + -proc~insert_knots~3->proc~findspan +proc~insert_knots~2->proc~findspan @@ -855,39 +855,39 @@

    Calls

    - + -proc~insert_knots~3->proc~insert_knot_a_5_1 +proc~insert_knots~2->proc~insert_knot_a_5_1 - + -proc~insert_knots~3->proc~is_rational~3 +proc~insert_knots~2->proc~is_rational~2 - + -proc~remove_knots~3->none~set~3 +proc~remove_knots~2->none~set~2 - + -proc~remove_knots~3->interface~compute_multiplicity +proc~remove_knots~2->interface~compute_multiplicity - + -proc~remove_knots~3->proc~findspan +proc~remove_knots~2->proc~findspan - + -proc~remove_knots~3->proc~is_rational~3 +proc~remove_knots~2->proc~is_rational~2 @@ -900,9 +900,9 @@

    Calls

    - + -proc~remove_knots~3->proc~remove_knots_a_5_8 +proc~remove_knots~2->proc~remove_knots_a_5_8 @@ -915,15 +915,15 @@

    Calls

    - + -proc~rotate_xc~3->proc~rotation +proc~rotate_xc~2->proc~rotation - + -proc~rotate_xg~3->proc~rotation +proc~rotate_xg~2->proc~rotation @@ -966,15 +966,15 @@

    Calls

    - + -proc~cmp_elem_xc_vis~3->interface~elemconn_c0 +proc~cmp_elem_xc_vis~2->interface~elemconn_c0 - + -proc~cmp_elem_xg_vis~3->interface~elemconn_c0 +proc~cmp_elem_xg_vis~2->interface~elemconn_c0 @@ -999,9 +999,9 @@

    Calls

    - + -proc~get_multiplicity~3->interface~compute_multiplicity +proc~get_multiplicity~2->interface~compute_multiplicity @@ -1029,9 +1029,9 @@

    Calls

    - + -proc~set1~3->proc~get_degree +proc~set1~2->proc~get_degree @@ -1044,15 +1044,15 @@

    Calls

    - + -proc~set2~3->proc~compute_knot_vector +proc~set2~2->proc~compute_knot_vector - + -proc~set3~3->proc~get_degree +proc~set3~2->proc~get_degree @@ -1234,7 +1234,7 @@

    Variables

    @@ -1509,7 +1509,7 @@

    Arguments

    @@ -1524,7 +1524,7 @@

    Arguments

    @@ -1748,7 +1748,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/program/example3_volume.html b/program/example3_volume.html index f22ad2fdd..2b363877d 100644 --- a/program/example3_volume.html +++ b/program/example3_volume.html @@ -115,12 +115,12 @@

    Variables

    - Wc - Xc - knot1 - knot2 - knot3 - nurbs + Wc + Xc + knot1 + knot2 + knot3 + nurbs
    @@ -141,7 +141,7 @@

    Functions

    @@ -420,348 +420,348 @@

    Calls

    example3_volume - + -none~get_degree - +none~get_degree~3 + nurbs_volume%get_degree - + -program~example3_volume->none~get_degree +program~example3_volume->none~get_degree~3 - + -none~get_knot - +none~get_knot~3 + nurbs_volume%get_knot - + -program~example3_volume->none~get_knot +program~example3_volume->none~get_knot~3 - + -none~set - +none~set~3 + nurbs_volume%set - + -program~example3_volume->none~set +program~example3_volume->none~set~3 - + -proc~create - +proc~create~3 + nurbs_volume%create - + -program~example3_volume->proc~create +program~example3_volume->proc~create~3 - + -proc~elevate_degree - +proc~elevate_degree~3 + nurbs_volume%elevate_degree - + -program~example3_volume->proc~elevate_degree +program~example3_volume->proc~elevate_degree~3 - + -proc~export_xc - +proc~export_xc~3 + nurbs_volume%export_Xc - + -program~example3_volume->proc~export_xc +program~example3_volume->proc~export_xc~3 - + -proc~export_xg - +proc~export_xg~3 + nurbs_volume%export_Xg - + -program~example3_volume->proc~export_xg +program~example3_volume->proc~export_xg~3 - + -proc~finalize - +proc~finalize~3 + nurbs_volume%finalize - + -program~example3_volume->proc~finalize +program~example3_volume->proc~finalize~3 - + -proc~generate_xc~3 - +proc~generate_xc~4 + generate_Xc - + -program~example3_volume->proc~generate_xc~3 +program~example3_volume->proc~generate_xc~4 - + -proc~insert_knots - +proc~insert_knots~3 + nurbs_volume%insert_knots - + -program~example3_volume->proc~insert_knots +program~example3_volume->proc~insert_knots~3 - + -proc~remove_knots - +proc~remove_knots~3 + nurbs_volume%remove_knots - + -program~example3_volume->proc~remove_knots +program~example3_volume->proc~remove_knots~3 - + -proc~rotate_xc - +proc~rotate_xc~3 + nurbs_volume%rotate_Xc - + -program~example3_volume->proc~rotate_xc +program~example3_volume->proc~rotate_xc~3 - + -proc~rotate_xg - +proc~rotate_xg~3 + nurbs_volume%rotate_Xg - + -program~example3_volume->proc~rotate_xg +program~example3_volume->proc~rotate_xg~3 - + -proc~show - +proc~show~3 + nurbs_volume%show - + -program~example3_volume->proc~show +program~example3_volume->proc~show~3 - + -proc~translate_xc - +proc~translate_xc~3 + nurbs_volume%translate_Xc - + -program~example3_volume->proc~translate_xc +program~example3_volume->proc~translate_xc~3 - + -proc~translate_xg - +proc~translate_xg~3 + nurbs_volume%translate_Xg - + -program~example3_volume->proc~translate_xg +program~example3_volume->proc~translate_xg~3 - + -proc~get_degree_all - +proc~get_degree_all~2 + nurbs_volume%get_degree_all - + -none~get_degree->proc~get_degree_all +none~get_degree~3->proc~get_degree_all~2 - + -proc~get_degree_dir - +proc~get_degree_dir~2 + nurbs_volume%get_degree_dir - + -none~get_degree->proc~get_degree_dir +none~get_degree~3->proc~get_degree_dir~2 - + -proc~get_knot_all - +proc~get_knot_all~3 + nurbs_volume%get_knot_all - + -none~get_knot->proc~get_knot_all +none~get_knot~3->proc~get_knot_all~3 - + -proc~get_knoti - +proc~get_knoti~3 + nurbs_volume%get_knoti - + -none~get_knot->proc~get_knoti +none~get_knot~3->proc~get_knoti~3 - + -proc~set1 - +proc~set1~3 + nurbs_volume%set1 - + -none~set->proc~set1 +none~set~3->proc~set1~3 - + -proc~set2 - +proc~set2~3 + nurbs_volume%set2 - + -none~set->proc~set2 +none~set~3->proc~set2~3 - + -proc~set3 - +proc~set3~3 + nurbs_volume%set3 - + -none~set->proc~set3 +none~set~3->proc~set3~3 @@ -774,9 +774,9 @@

    Calls

    - + -proc~create->interface~ndgrid +proc~create~3->interface~ndgrid @@ -789,9 +789,9 @@

    Calls

    - + -proc~create->proc~basis_bspline +proc~create~3->proc~basis_bspline @@ -804,15 +804,15 @@

    Calls

    - + -proc~create->proc~kron +proc~create~3->proc~kron - + -proc~elevate_degree->none~set +proc~elevate_degree~3->none~set~3 @@ -825,45 +825,45 @@

    Calls

    - + -proc~elevate_degree->proc~elevate_degree_a_5_9 +proc~elevate_degree~3->proc~elevate_degree_a_5_9 - + -proc~cmp_elem_xc_vis - +proc~cmp_elem_xc_vis~3 + nurbs_volume%cmp_elem_Xc_vis - + -proc~export_xc->proc~cmp_elem_xc_vis +proc~export_xc~3->proc~cmp_elem_xc_vis~3 - + -proc~cmp_elem_xg_vis - +proc~cmp_elem_xg_vis~3 + nurbs_volume%cmp_elem_Xg_vis - + -proc~export_xg->proc~cmp_elem_xg_vis +proc~export_xg~3->proc~cmp_elem_xg_vis~3 - + -proc~insert_knots->none~set +proc~insert_knots~3->none~set~3 @@ -876,9 +876,9 @@

    Calls

    - + -proc~insert_knots->interface~compute_multiplicity +proc~insert_knots~3->interface~compute_multiplicity @@ -891,9 +891,9 @@

    Calls

    - + -proc~insert_knots->proc~findspan +proc~insert_knots~3->proc~findspan @@ -906,27 +906,27 @@

    Calls

    - + -proc~insert_knots->proc~insert_knot_a_5_1 +proc~insert_knots~3->proc~insert_knot_a_5_1 - + -proc~remove_knots->none~set +proc~remove_knots~3->none~set~3 - + -proc~remove_knots->interface~compute_multiplicity +proc~remove_knots~3->interface~compute_multiplicity - + -proc~remove_knots->proc~findspan +proc~remove_knots~3->proc~findspan @@ -939,9 +939,9 @@

    Calls

    - + -proc~remove_knots->proc~remove_knots_a_5_8 +proc~remove_knots~3->proc~remove_knots_a_5_8 @@ -954,15 +954,15 @@

    Calls

    - + -proc~rotate_xc->proc~rotation +proc~rotate_xc~3->proc~rotation - + -proc~rotate_xg->proc~rotation +proc~rotate_xg~3->proc~rotation @@ -1035,15 +1035,15 @@

    Calls

    - + -proc~cmp_elem_xc_vis->interface~elemconn_c0 +proc~cmp_elem_xc_vis~3->interface~elemconn_c0 - + -proc~cmp_elem_xg_vis->interface~elemconn_c0 +proc~cmp_elem_xg_vis~3->interface~elemconn_c0 @@ -1068,24 +1068,24 @@

    Calls

    - + -proc~get_multiplicity - +proc~get_multiplicity~3 + nurbs_volume%get_multiplicity - + -proc~get_degree_all->proc~get_multiplicity +proc~get_degree_all~2->proc~get_multiplicity~3 - + -proc~get_degree_dir->proc~get_multiplicity +proc~get_degree_dir~2->proc~get_multiplicity~3 @@ -1113,24 +1113,24 @@

    Calls

    - + -proc~set1->none~get_degree +proc~set1~3->none~get_degree~3 - + -proc~get_nc - +proc~get_nc~3 + nurbs_volume%get_nc - + -proc~set1->proc~get_nc +proc~set1~3->proc~get_nc~3 @@ -1143,21 +1143,21 @@

    Calls

    - + -proc~set2->proc~compute_knot_vector +proc~set2~3->proc~compute_knot_vector - + -proc~set2->proc~get_nc +proc~set2~3->proc~get_nc~3 - + -proc~set3->none~get_degree +proc~set3~3->none~get_degree~3 @@ -1236,15 +1236,15 @@

    Calls

    - + -proc~get_multiplicity->interface~compute_multiplicity +proc~get_multiplicity~3->interface~compute_multiplicity - + -proc~get_nc->interface~compute_multiplicity +proc~get_nc~3->interface~compute_multiplicity @@ -1351,7 +1351,7 @@

    Variables

    @@ -1104,7 +1104,7 @@

    Arguments

    @@ -1119,7 +1119,7 @@

    Arguments

    @@ -1250,7 +1250,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/program/example_nurbs_volume.html b/program/example_nurbs_volume.html index 6feb992fa..b85b8f540 100644 --- a/program/example_nurbs_volume.html +++ b/program/example_nurbs_volume.html @@ -115,9 +115,9 @@

    Variables

    - Wc - Xc - nurbs + Wc + Xc + nurbs
    @@ -138,7 +138,7 @@

    Functions

    @@ -397,153 +397,153 @@

    Calls

    example_nurbs_volume - + -none~set - +none~set~3 + nurbs_volume%set - + -program~example_nurbs_volume->none~set +program~example_nurbs_volume->none~set~3 - + -proc~create - +proc~create~3 + nurbs_volume%create - + -program~example_nurbs_volume->proc~create +program~example_nurbs_volume->proc~create~3 - + -proc~export_xc - +proc~export_xc~3 + nurbs_volume%export_Xc - + -program~example_nurbs_volume->proc~export_xc +program~example_nurbs_volume->proc~export_xc~3 - + -proc~export_xg - +proc~export_xg~3 + nurbs_volume%export_Xg - + -program~example_nurbs_volume->proc~export_xg +program~example_nurbs_volume->proc~export_xg~3 - + -proc~finalize - +proc~finalize~3 + nurbs_volume%finalize - + -program~example_nurbs_volume->proc~finalize +program~example_nurbs_volume->proc~finalize~3 - + -proc~generate_xc~4 - +proc~generate_xc~2 + generate_Xc - + -program~example_nurbs_volume->proc~generate_xc~4 +program~example_nurbs_volume->proc~generate_xc~2 - + -proc~show - +proc~show~3 + nurbs_volume%show - + -program~example_nurbs_volume->proc~show +program~example_nurbs_volume->proc~show~3 - + -proc~set1 - +proc~set1~3 + nurbs_volume%set1 - + -none~set->proc~set1 +none~set~3->proc~set1~3 - + -proc~set2 - +proc~set2~3 + nurbs_volume%set2 - + -none~set->proc~set2 +none~set~3->proc~set2~3 - + -proc~set3 - +proc~set3~3 + nurbs_volume%set3 - + -none~set->proc~set3 +none~set~3->proc~set3~3 @@ -556,9 +556,9 @@

    Calls

    - + -proc~create->interface~ndgrid +proc~create~3->interface~ndgrid @@ -571,9 +571,9 @@

    Calls

    - + -proc~create->proc~basis_bspline +proc~create~3->proc~basis_bspline @@ -586,39 +586,39 @@

    Calls

    - + -proc~create->proc~kron +proc~create~3->proc~kron - + -proc~cmp_elem_xc_vis - +proc~cmp_elem_xc_vis~3 + nurbs_volume%cmp_elem_Xc_vis - + -proc~export_xc->proc~cmp_elem_xc_vis +proc~export_xc~3->proc~cmp_elem_xc_vis~3 - + -proc~cmp_elem_xg_vis - +proc~cmp_elem_xg_vis~3 + nurbs_volume%cmp_elem_Xg_vis - + -proc~export_xg->proc~cmp_elem_xg_vis +proc~export_xg~3->proc~cmp_elem_xg_vis~3 @@ -661,45 +661,45 @@

    Calls

    - + -proc~cmp_elem_xc_vis->interface~elemconn_c0 +proc~cmp_elem_xc_vis~3->interface~elemconn_c0 - + -proc~cmp_elem_xg_vis->interface~elemconn_c0 +proc~cmp_elem_xg_vis~3->interface~elemconn_c0 - + -none~get_degree - +none~get_degree~3 + nurbs_volume%get_degree - + -proc~set1->none~get_degree +proc~set1~3->none~get_degree~3 - + -proc~get_nc - +proc~get_nc~3 + nurbs_volume%get_nc - + -proc~set1->proc~get_nc +proc~set1~3->proc~get_nc~3 @@ -712,21 +712,21 @@

    Calls

    - + -proc~set2->proc~compute_knot_vector +proc~set2~3->proc~compute_knot_vector - + -proc~set2->proc~get_nc +proc~set2~3->proc~get_nc~3 - + -proc~set3->none~get_degree +proc~set3~3->none~get_degree~3 @@ -775,33 +775,33 @@

    Calls

    - + -proc~get_degree_all - +proc~get_degree_all~2 + nurbs_volume%get_degree_all - + -none~get_degree->proc~get_degree_all +none~get_degree~3->proc~get_degree_all~2 - + -proc~get_degree_dir - +proc~get_degree_dir~2 + nurbs_volume%get_degree_dir - + -none~get_degree->proc~get_degree_dir +none~get_degree~3->proc~get_degree_dir~2 @@ -829,9 +829,9 @@

    Calls

    - + -proc~get_nc->interface~compute_multiplicity +proc~get_nc~3->interface~compute_multiplicity @@ -865,30 +865,30 @@

    Calls

    - + -proc~get_multiplicity - +proc~get_multiplicity~3 + nurbs_volume%get_multiplicity - + -proc~get_degree_all->proc~get_multiplicity +proc~get_degree_all~2->proc~get_multiplicity~3 - + -proc~get_degree_dir->proc~get_multiplicity +proc~get_degree_dir~2->proc~get_multiplicity~3 - + -proc~get_multiplicity->interface~compute_multiplicity +proc~get_multiplicity~3->interface~compute_multiplicity @@ -995,7 +995,7 @@

    Variables

    @@ -1200,7 +1200,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/program/shape_circle.html b/program/shape_circle.html index 7c9e92c57..4bf45c4cc 100644 --- a/program/shape_circle.html +++ b/program/shape_circle.html @@ -373,63 +373,63 @@

    Calls

    shape_circle - + -proc~create~3 - +proc~create~2 + nurbs_curve%create - + -program~shape_circle->proc~create~3 +program~shape_circle->proc~create~2 - + -proc~export_xc~3 - +proc~export_xc~2 + nurbs_curve%export_Xc - + -program~shape_circle->proc~export_xc~3 +program~shape_circle->proc~export_xc~2 - + -proc~export_xg~3 - +proc~export_xg~2 + nurbs_curve%export_Xg - + -program~shape_circle->proc~export_xg~3 +program~shape_circle->proc~export_xg~2 - + -proc~finalize~3 - +proc~finalize~2 + nurbs_curve%finalize - + -program~shape_circle->proc~finalize~3 +program~shape_circle->proc~finalize~2 @@ -448,18 +448,18 @@

    Calls

    - + -proc~show~3 - +proc~show~2 + nurbs_curve%show - + -program~shape_circle->proc~show~3 +program~shape_circle->proc~show~2 @@ -472,114 +472,114 @@

    Calls

    - + -proc~create~3->proc~basis_bspline +proc~create~2->proc~basis_bspline - + -proc~is_rational~3 - +proc~is_rational~2 + nurbs_curve%is_rational - + -proc~create~3->proc~is_rational~3 +proc~create~2->proc~is_rational~2 - + -proc~cmp_elem_xc_vis~3 - +proc~cmp_elem_xc_vis~2 + nurbs_curve%cmp_elem_Xc_vis - + -proc~export_xc~3->proc~cmp_elem_xc_vis~3 +proc~export_xc~2->proc~cmp_elem_xc_vis~2 - + -proc~cmp_elem_xg_vis~3 - +proc~cmp_elem_xg_vis~2 + nurbs_curve%cmp_elem_Xg_vis - + -proc~export_xg~3->proc~cmp_elem_xg_vis~3 +proc~export_xg~2->proc~cmp_elem_xg_vis~2 - + -none~set~3 - +none~set~2 + nurbs_curve%set - + -proc~set_circle->none~set~3 +proc~set_circle->none~set~2 - + -proc~set1~3 - +proc~set1~2 + nurbs_curve%set1 - + -none~set~3->proc~set1~3 +none~set~2->proc~set1~2 - + -proc~set2~3 - +proc~set2~2 + nurbs_curve%set2 - + -none~set~3->proc~set2~3 +none~set~2->proc~set2~2 - + -proc~set3~3 - +proc~set3~2 + nurbs_curve%set3 - + -none~set~3->proc~set3~3 +none~set~2->proc~set3~2 @@ -592,15 +592,15 @@

    Calls

    - + -proc~cmp_elem_xc_vis~3->interface~elemconn_c0 +proc~cmp_elem_xc_vis~2->interface~elemconn_c0 - + -proc~cmp_elem_xg_vis~3->interface~elemconn_c0 +proc~cmp_elem_xg_vis~2->interface~elemconn_c0 @@ -658,9 +658,9 @@

    Calls

    - + -proc~set1~3->proc~get_degree +proc~set1~2->proc~get_degree @@ -673,15 +673,15 @@

    Calls

    - + -proc~set2~3->proc~compute_knot_vector +proc~set2~2->proc~compute_knot_vector - + -proc~set3~3->proc~get_degree +proc~set3~2->proc~get_degree @@ -700,18 +700,18 @@

    Calls

    - + -proc~get_multiplicity~3 - +proc~get_multiplicity~2 + nurbs_curve%get_multiplicity - + -proc~get_degree->proc~get_multiplicity~3 +proc~get_degree->proc~get_multiplicity~2 @@ -724,9 +724,9 @@

    Calls

    - + -proc~get_multiplicity~3->interface~compute_multiplicity +proc~get_multiplicity~2->interface~compute_multiplicity @@ -910,7 +910,7 @@

    Variables

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/program/shape_hexahedron.html b/program/shape_hexahedron.html index 3e7679798..4197f709d 100644 --- a/program/shape_hexahedron.html +++ b/program/shape_hexahedron.html @@ -115,7 +115,7 @@

    Variables

    - shape + shape
    @@ -374,63 +374,63 @@

    Calls

    shape_hexahedron - + -proc~create - +proc~create~3 + nurbs_volume%create - + -program~shape_hexahedron->proc~create +program~shape_hexahedron->proc~create~3 - + -proc~export_xc - +proc~export_xc~3 + nurbs_volume%export_Xc - + -program~shape_hexahedron->proc~export_xc +program~shape_hexahedron->proc~export_xc~3 - + -proc~export_xg - +proc~export_xg~3 + nurbs_volume%export_Xg - + -program~shape_hexahedron->proc~export_xg +program~shape_hexahedron->proc~export_xg~3 - + -proc~finalize - +proc~finalize~3 + nurbs_volume%finalize - + -program~shape_hexahedron->proc~finalize +program~shape_hexahedron->proc~finalize~3 @@ -449,18 +449,18 @@

    Calls

    - + -proc~show - +proc~show~3 + nurbs_volume%show - + -program~shape_hexahedron->proc~show +program~shape_hexahedron->proc~show~3 @@ -473,9 +473,9 @@

    Calls

    - + -proc~create->interface~ndgrid +proc~create~3->interface~ndgrid @@ -488,9 +488,9 @@

    Calls

    - + -proc~create->proc~basis_bspline +proc~create~3->proc~basis_bspline @@ -503,54 +503,54 @@

    Calls

    - + -proc~create->proc~kron +proc~create~3->proc~kron - + -proc~cmp_elem_xc_vis - +proc~cmp_elem_xc_vis~3 + nurbs_volume%cmp_elem_Xc_vis - + -proc~export_xc->proc~cmp_elem_xc_vis +proc~export_xc~3->proc~cmp_elem_xc_vis~3 - + -proc~cmp_elem_xg_vis - +proc~cmp_elem_xg_vis~3 + nurbs_volume%cmp_elem_Xg_vis - + -proc~export_xg->proc~cmp_elem_xg_vis +proc~export_xg~3->proc~cmp_elem_xg_vis~3 - + -none~set - +none~set~3 + nurbs_volume%set - + -proc~set_hexahedron->none~set +proc~set_hexahedron->none~set~3 @@ -599,48 +599,48 @@

    Calls

    - + -proc~set1 - +proc~set1~3 + nurbs_volume%set1 - + -none~set->proc~set1 +none~set~3->proc~set1~3 - + -proc~set2 - +proc~set2~3 + nurbs_volume%set2 - + -none~set->proc~set2 +none~set~3->proc~set2~3 - + -proc~set3 - +proc~set3~3 + nurbs_volume%set3 - + -none~set->proc~set3 +none~set~3->proc~set3~3 @@ -653,15 +653,15 @@

    Calls

    - + -proc~cmp_elem_xc_vis->interface~elemconn_c0 +proc~cmp_elem_xc_vis~3->interface~elemconn_c0 - + -proc~cmp_elem_xg_vis->interface~elemconn_c0 +proc~cmp_elem_xg_vis~3->interface~elemconn_c0 @@ -710,33 +710,33 @@

    Calls

    - + -none~get_degree - +none~get_degree~3 + nurbs_volume%get_degree - + -proc~set1->none~get_degree +proc~set1~3->none~get_degree~3 - + -proc~get_nc - +proc~get_nc~3 + nurbs_volume%get_nc - + -proc~set1->proc~get_nc +proc~set1~3->proc~get_nc~3 @@ -749,51 +749,51 @@

    Calls

    - + -proc~set2->proc~compute_knot_vector +proc~set2~3->proc~compute_knot_vector - + -proc~set2->proc~get_nc +proc~set2~3->proc~get_nc~3 - + -proc~set3->none~get_degree +proc~set3~3->none~get_degree~3 - + -proc~get_degree_all - +proc~get_degree_all~2 + nurbs_volume%get_degree_all - + -none~get_degree->proc~get_degree_all +none~get_degree~3->proc~get_degree_all~2 - + -proc~get_degree_dir - +proc~get_degree_dir~2 + nurbs_volume%get_degree_dir - + -none~get_degree->proc~get_degree_dir +none~get_degree~3->proc~get_degree_dir~2 @@ -821,9 +821,9 @@

    Calls

    - + -proc~get_nc->interface~compute_multiplicity +proc~get_nc~3->interface~compute_multiplicity @@ -857,30 +857,30 @@

    Calls

    - + -proc~get_multiplicity - +proc~get_multiplicity~3 + nurbs_volume%get_multiplicity - + -proc~get_degree_all->proc~get_multiplicity +proc~get_degree_all~2->proc~get_multiplicity~3 - + -proc~get_degree_dir->proc~get_multiplicity +proc~get_degree_dir~2->proc~get_multiplicity~3 - + -proc~get_multiplicity->interface~compute_multiplicity +proc~get_multiplicity~3->interface~compute_multiplicity @@ -987,7 +987,7 @@

    Variables

    @@ -247,7 +255,7 @@

    Components

    @@ -281,7 +289,7 @@

    Components

    @@ -298,7 +306,7 @@

    Components

    @@ -315,7 +323,7 @@

    Components

    @@ -332,7 +340,7 @@

    Components

    @@ -349,7 +357,7 @@

    Components

    @@ -366,7 +374,7 @@

    Components

    @@ -383,7 +391,7 @@

    Components

    @@ -400,7 +408,7 @@

    Components

    @@ -428,7 +436,7 @@

    Type-Bound Procedures

    - +

    procedure, public :: basis @@ -444,7 +452,7 @@

    • - private pure subroutine basis(this, res, Xt, Tgc) + private pure subroutine basis(this, res, Xt, Tgc)

      Author
      Seyed Ali Ghasemi
      @@ -537,7 +545,7 @@

      Arguments

      - +

      procedure, public :: cmp_elem @@ -553,7 +561,7 @@

      • - private pure function cmp_elem(this) result(elemConn) + private pure function cmp_elem(this) result(elemConn)

        Author
        Seyed Ali Ghasemi
        @@ -606,7 +614,7 @@

        - +

        procedure, public :: cmp_elem_Xc_vis @@ -622,7 +630,7 @@

        • - private pure function cmp_elem_Xc_vis(this, p) result(elemConn) + private pure function cmp_elem_Xc_vis(this, p) result(elemConn)

          Author
          Seyed Ali Ghasemi
          @@ -690,7 +698,7 @@

          - +

          procedure, public :: cmp_elem_Xg_vis @@ -706,7 +714,7 @@

          • - private pure function cmp_elem_Xg_vis(this, p) result(elemConn) + private pure function cmp_elem_Xg_vis(this, p) result(elemConn)

            Author
            Seyed Ali Ghasemi
            @@ -774,7 +782,7 @@

            - +

            procedure, public :: create @@ -790,7 +798,7 @@

            • - private pure subroutine create(this, res, Xt) + private pure subroutine create(this, res, Xt)

              Author
              Seyed Ali Ghasemi
              @@ -868,7 +876,7 @@

              Arguments

              - +

              procedure, public :: derivative @@ -884,7 +892,7 @@

              • - private pure subroutine derivative(this, res, Xt, dTgc) + private pure subroutine derivative(this, res, Xt, dTgc)

                Author
                Seyed Ali Ghasemi
                @@ -977,7 +985,7 @@

                Arguments

                - +

                procedure, public :: elevate_degree @@ -993,7 +1001,7 @@

                • - private pure subroutine elevate_degree(this, t) + private pure subroutine elevate_degree(this, t)

                  Author
                  Seyed Ali Ghasemi
                  @@ -1056,7 +1064,7 @@

                  Arguments

                  - +

                  procedure, public :: export_Xc @@ -1072,7 +1080,7 @@

                  • - private impure subroutine export_Xc(this, filename) + private impure subroutine export_Xc(this, filename)

                    Author
                    Seyed Ali Ghasemi
                    @@ -1135,7 +1143,7 @@

                    Arguments

                    - +

                    procedure, public :: export_Xg @@ -1151,7 +1159,7 @@

                    • - private impure subroutine export_Xg(this, filename) + private impure subroutine export_Xg(this, filename)

                      Author
                      Seyed Ali Ghasemi
                      @@ -1214,7 +1222,7 @@

                      Arguments

                      - +

                      procedure, public :: finalize @@ -1230,7 +1238,7 @@

                      • - private pure subroutine finalize(this) + private pure subroutine finalize(this)

                        Author
                        Seyed Ali Ghasemi
                        @@ -1278,10 +1286,10 @@

                        Arguments

                        - +

                        - procedure, public :: - get_Wc + generic, public :: + get_Wc => get_Wc_all, get_Wci

                        @@ -1294,7 +1302,7 @@

                        • - private pure function get_Wc(this) result(Wc) + private pure function get_Wc_all(this) result(Wc)

                          Author
                          Seyed Ali Ghasemi
                          @@ -1340,30 +1348,9 @@

                        • -
                        -

                        - -
                        -
                        -
                        -
                        - -

                        - procedure, public :: - get_Xc - -

                        -
                        -
                        - -
                        -

                        Get control points

                        -
                        -
                        -
                        • - private pure function get_Xc(this) result(Xc) + private pure function get_Wci(this, n) result(Wc)

                          Author
                          Seyed Ali Ghasemi
                          @@ -1397,6 +1384,21 @@

                          Arguments

    + + + + + + + + @@ -1404,7 +1406,7 @@

    Arguments

    Return Value - real(kind=rk), allocatable, (:,:) + real(kind=rk)

    @@ -1416,23 +1418,23 @@

    - +

    - procedure, public :: - get_Xg + generic, public :: + get_Xc => get_Xc_all, get_Xci, get_Xcid

    -

    Get geometry points

    +

    Get control points

    • - private pure function get_Xg(this) result(Xg) + private pure function get_Xc_all(this) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -1478,30 +1480,9 @@

    • -
    -
    - -
    -
    -
    -
    - -

    - procedure, public :: - get_Xt - -

    -
    -
    - -
    -

    Get parameter values

    -
    -
    -
    • - private pure function get_Xt(this) result(Xt) + private pure function get_Xci(this, n) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -1535,6 +1516,21 @@

      Arguments

    + + + + + + + + @@ -1547,30 +1543,9 @@

    - - - - -
    -
    -
    - -

    - procedure, public :: - get_continuity - -

    -
    -
    - -
    -

    Get continuity of the curve

    -
    -
    -
    • - private pure function get_continuity(this) result(c) + private pure function get_Xcid(this, n, dir) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -1604,6 +1579,36 @@

      Arguments

    + + + + + + + + + + + + + + + + @@ -1611,7 +1616,7 @@

    Arguments

    Return Value - integer, allocatable, (:) + real(kind=rk)

    @@ -1623,23 +1628,23 @@

    - +

    - procedure, public :: - get_degree + generic, public :: + get_Xg => get_Xg_all, get_Xgi, get_Xgid

    -

    Get degree of the NURBS curve

    +

    Get geometry points

    • - private pure function get_degree(this) result(degree) + private pure function get_Xg_all(this) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -1680,35 +1685,14 @@

      Arguments

      Return Value - integer + real(kind=rk), allocatable, (:,:)

    • -
    -
    - -
    -
    -
    -
    - -

    - procedure, public :: - get_elem - -

    -
    -
    - -
    -

    Get IGA element connectivity

    -
    -
    -
    • - private pure function get_elem(this) result(elemConn) + private pure function get_Xgi(this, n) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -1742,6 +1726,21 @@

      Arguments

    + + + + + + + + @@ -1749,35 +1748,14 @@

    Arguments

    Return Value - integer, allocatable, (:,:) + real(kind=rk), allocatable, (:)

    - - - - -
    -
    -
    - -

    - procedure, public :: - get_elem_Xc_vis - -

    -
    -
    - -
    -

    Get connectivity for control points

    -
    -
    -
    • - private pure function get_elem_Xc_vis(this) result(elemConn) + private pure function get_Xgid(this, n, dir) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -1811,6 +1789,36 @@

      Arguments

    + + + + + + + + + + + + + + + + @@ -1818,7 +1826,7 @@

    Arguments

    Return Value - integer, allocatable, (:,:) + real(kind=rk)

    @@ -1830,23 +1838,23 @@

    - +

    procedure, public :: - get_elem_Xg_vis + get_Xt

    -

    Get connectivity for geometry points

    +

    Get parameter values

    • - private pure function get_elem_Xg_vis(this) result(elemConn) + private pure function get_Xt(this) result(Xt)

      Author
      Seyed Ali Ghasemi
      @@ -1887,7 +1895,7 @@

      Arguments

      Return Value - integer, allocatable, (:,:) + real(kind=rk), allocatable, (:)

      @@ -1899,23 +1907,23 @@

      - +

      - generic, public :: - get_knot => get_knoti, get_knot_all + procedure, public :: + get_continuity

      -

      Get knot vector

      +

      Get continuity of the curve

      • - private pure function get_knoti(this, i) result(knot) + private pure function get_continuity(this) result(c)

        Author
        Seyed Ali Ghasemi
        @@ -1949,21 +1957,6 @@

        Arguments

    - - - - - - - - @@ -1971,19 +1964,40 @@

    Arguments

    Return Value - real(kind=rk) + integer, allocatable, (:)

    -
  • -

    - private pure function get_knot_all(this) result(knot) -

    -
    -
    Author
    Seyed Ali Ghasemi
    -
    License
    BSD 3-Clause
    -
    + + + + +
    +
    +
    + +

    + procedure, public :: + get_degree + +

    +
    +
    + +
    +

    Get degree of the NURBS curve

    +
    +
    +
      +
    • +

      + private pure function get_degree(this) result(degree) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      @@ -2019,7 +2033,7 @@

      Arguments

      Return Value - real(kind=rk), allocatable, (:) + integer

      @@ -2031,23 +2045,23 @@

      - +

      procedure, public :: - get_multiplicity + get_elem

      -

      Get multiplicity of the knot vector

      +

      Get IGA element connectivity

      • - private pure function get_multiplicity(this) result(m) + private pure function get_elem(this) result(elemConn)

        Author
        Seyed Ali Ghasemi
        @@ -2088,7 +2102,7 @@

        Arguments

        Return Value - integer, allocatable, (:) + integer, allocatable, (:,:)

        @@ -2100,23 +2114,23 @@

        - +

        procedure, public :: - get_nc + get_elem_Xc_vis

        -

        Get number of required control points

        +

        Get connectivity for control points

        • - private pure function get_nc(this) result(nc) + private pure function get_elem_Xc_vis(this) result(elemConn)

          Author
          Seyed Ali Ghasemi
          @@ -2157,7 +2171,7 @@

          Arguments

          Return Value - integer + integer, allocatable, (:,:)

          @@ -2169,23 +2183,23 @@

          - +

          procedure, public :: - get_ng + get_elem_Xg_vis

          -

          Get number of geometry points

          +

          Get connectivity for geometry points

          • - private pure function get_ng(this) result(ng) + private pure function get_elem_Xg_vis(this) result(elemConn)

            Author
            Seyed Ali Ghasemi
            @@ -2226,7 +2240,7 @@

            Arguments

            Return Value - integer + integer, allocatable, (:,:)

            @@ -2238,23 +2252,23 @@

            - +

            - procedure, public :: - insert_knots + generic, public :: + get_knot => get_knoti, get_knot_all

            -

            Insert knots into the knot vector

            +

            Get knot vector

            • - private pure subroutine insert_knots(this, Xth, r) + private pure function get_knoti(this, i) result(knot)

              Author
              Seyed Ali Ghasemi
              @@ -2280,7 +2294,7 @@

              Arguments

              class(nurbs_curve), -

  • + @@ -2293,29 +2307,62 @@

    Arguments

    - + - + + +
    - - class(nurbs_curve), + + class(nurbs_volume), intent(inout) @@ -201,31 +201,31 @@

    Called by

    - + proc~~translate_xg~3~~CalledByGraph - + proc~translate_xg~3 - -nurbs_curve%translate_Xg + +nurbs_volume%translate_Xg - + -program~example1_curve - - -example1_curve +program~example3_volume + + +example3_volume - + -program~example1_curve->proc~translate_xg~3 - - +program~example3_volume->proc~translate_xg~3 + + @@ -341,7 +341,7 @@

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/proc/unique_integer.html b/proc/unique_integer.html index fd0ca4750..3478581b9 100644 --- a/proc/unique_integer.html +++ b/proc/unique_integer.html @@ -156,7 +156,7 @@

    Arguments

    - + integer, intent(in),
    - + real(kind=rk), intent(in),
    - + real(kind=rk), @@ -1250,7 +1250,7 @@

    Variables

    - + real(kind=rk), @@ -1266,7 +1266,7 @@

    Variables

    - + real(kind=rk) @@ -1472,7 +1472,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/program/example3_surface.html b/program/example3_surface.html index ed3a95362..3d5d6f5ce 100644 --- a/program/example3_surface.html +++ b/program/example3_surface.html @@ -115,11 +115,11 @@

    Variables

    - Wc - Xc - knot1 - knot2 - nurbs + Wc + Xc + knot1 + knot2 + nurbs
    @@ -140,7 +140,7 @@

    Functions

    @@ -419,348 +419,348 @@

    Calls

    example3_surface - + -none~get_degree~2 - +none~get_degree + nurbs_surface%get_degree - + -program~example3_surface->none~get_degree~2 +program~example3_surface->none~get_degree - + -none~get_knot~2 - +none~get_knot + nurbs_surface%get_knot - + -program~example3_surface->none~get_knot~2 +program~example3_surface->none~get_knot - + -none~set~2 - +none~set + nurbs_surface%set - + -program~example3_surface->none~set~2 +program~example3_surface->none~set - + -proc~create~2 - +proc~create + nurbs_surface%create - + -program~example3_surface->proc~create~2 +program~example3_surface->proc~create - + -proc~elevate_degree~2 - +proc~elevate_degree + nurbs_surface%elevate_degree - + -program~example3_surface->proc~elevate_degree~2 +program~example3_surface->proc~elevate_degree - + -proc~export_xc~2 - +proc~export_xc + nurbs_surface%export_Xc - + -program~example3_surface->proc~export_xc~2 +program~example3_surface->proc~export_xc - + -proc~export_xg~2 - +proc~export_xg + nurbs_surface%export_Xg - + -program~example3_surface->proc~export_xg~2 +program~example3_surface->proc~export_xg - + -proc~finalize~2 - +proc~finalize + nurbs_surface%finalize - + -program~example3_surface->proc~finalize~2 +program~example3_surface->proc~finalize - + -proc~generate_xc~2 - +proc~generate_xc~3 + generate_Xc - + -program~example3_surface->proc~generate_xc~2 +program~example3_surface->proc~generate_xc~3 - + -proc~insert_knots~2 - +proc~insert_knots + nurbs_surface%insert_knots - + -program~example3_surface->proc~insert_knots~2 +program~example3_surface->proc~insert_knots - + -proc~remove_knots~2 - +proc~remove_knots + nurbs_surface%remove_knots - + -program~example3_surface->proc~remove_knots~2 +program~example3_surface->proc~remove_knots - + -proc~rotate_xc~2 - +proc~rotate_xc + nurbs_surface%rotate_Xc - + -program~example3_surface->proc~rotate_xc~2 +program~example3_surface->proc~rotate_xc - + -proc~rotate_xg~2 - +proc~rotate_xg + nurbs_surface%rotate_Xg - + -program~example3_surface->proc~rotate_xg~2 +program~example3_surface->proc~rotate_xg - + -proc~show~2 - +proc~show + nurbs_surface%show - + -program~example3_surface->proc~show~2 +program~example3_surface->proc~show - + -proc~translate_xc~2 - +proc~translate_xc + nurbs_surface%translate_Xc - + -program~example3_surface->proc~translate_xc~2 +program~example3_surface->proc~translate_xc - + -proc~translate_xg~2 - +proc~translate_xg + nurbs_surface%translate_Xg - + -program~example3_surface->proc~translate_xg~2 +program~example3_surface->proc~translate_xg - + -proc~get_degree_all~2 - +proc~get_degree_all + nurbs_surface%get_degree_all - + -none~get_degree~2->proc~get_degree_all~2 +none~get_degree->proc~get_degree_all - + -proc~get_degree_dir~2 - +proc~get_degree_dir + nurbs_surface%get_degree_dir - + -none~get_degree~2->proc~get_degree_dir~2 +none~get_degree->proc~get_degree_dir - + -proc~get_knot_all~2 - +proc~get_knot_all + nurbs_surface%get_knot_all - + -none~get_knot~2->proc~get_knot_all~2 +none~get_knot->proc~get_knot_all - + -proc~get_knoti~2 - +proc~get_knoti + nurbs_surface%get_knoti - + -none~get_knot~2->proc~get_knoti~2 +none~get_knot->proc~get_knoti - + -proc~set1~2 - +proc~set1 + nurbs_surface%set1 - + -none~set~2->proc~set1~2 +none~set->proc~set1 - + -proc~set2~2 - +proc~set2 + nurbs_surface%set2 - + -none~set~2->proc~set2~2 +none~set->proc~set2 - + -proc~set3~2 - +proc~set3 + nurbs_surface%set3 - + -none~set~2->proc~set3~2 +none~set->proc~set3 @@ -773,9 +773,9 @@

    Calls

    - + -proc~create~2->interface~ndgrid +proc~create->interface~ndgrid @@ -788,24 +788,24 @@

    Calls

    - + -proc~create~2->proc~basis_bspline +proc~create->proc~basis_bspline - + -proc~is_rational~2 - +proc~is_rational + nurbs_surface%is_rational - + -proc~create~2->proc~is_rational~2 +proc~create->proc~is_rational @@ -818,15 +818,15 @@

    Calls

    - + -proc~create~2->proc~kron +proc~create->proc~kron - + -proc~elevate_degree~2->none~set~2 +proc~elevate_degree->none~set @@ -839,51 +839,51 @@

    Calls

    - + -proc~elevate_degree~2->proc~elevate_degree_a_5_9 +proc~elevate_degree->proc~elevate_degree_a_5_9 - + -proc~elevate_degree~2->proc~is_rational~2 +proc~elevate_degree->proc~is_rational - + -proc~cmp_elem_xc_vis~2 - +proc~cmp_elem_xc_vis + nurbs_surface%cmp_elem_Xc_vis - + -proc~export_xc~2->proc~cmp_elem_xc_vis~2 +proc~export_xc->proc~cmp_elem_xc_vis - + -proc~cmp_elem_xg_vis~2 - +proc~cmp_elem_xg_vis + nurbs_surface%cmp_elem_Xg_vis - + -proc~export_xg~2->proc~cmp_elem_xg_vis~2 +proc~export_xg->proc~cmp_elem_xg_vis - + -proc~insert_knots~2->none~set~2 +proc~insert_knots->none~set @@ -896,9 +896,9 @@

    Calls

    - + -proc~insert_knots~2->interface~compute_multiplicity +proc~insert_knots->interface~compute_multiplicity @@ -911,9 +911,9 @@

    Calls

    - + -proc~insert_knots~2->proc~findspan +proc~insert_knots->proc~findspan @@ -926,39 +926,39 @@

    Calls

    - + -proc~insert_knots~2->proc~insert_knot_a_5_1 +proc~insert_knots->proc~insert_knot_a_5_1 - + -proc~insert_knots~2->proc~is_rational~2 +proc~insert_knots->proc~is_rational - + -proc~remove_knots~2->none~set~2 +proc~remove_knots->none~set - + -proc~remove_knots~2->interface~compute_multiplicity +proc~remove_knots->interface~compute_multiplicity - + -proc~remove_knots~2->proc~findspan +proc~remove_knots->proc~findspan - + -proc~remove_knots~2->proc~is_rational~2 +proc~remove_knots->proc~is_rational @@ -971,9 +971,9 @@

    Calls

    - + -proc~remove_knots~2->proc~remove_knots_a_5_8 +proc~remove_knots->proc~remove_knots_a_5_8 @@ -986,15 +986,15 @@

    Calls

    - + -proc~rotate_xc~2->proc~rotation +proc~rotate_xc->proc~rotation - + -proc~rotate_xg~2->proc~rotation +proc~rotate_xg->proc~rotation @@ -1067,15 +1067,15 @@

    Calls

    - + -proc~cmp_elem_xc_vis~2->interface~elemconn_c0 +proc~cmp_elem_xc_vis->interface~elemconn_c0 - + -proc~cmp_elem_xg_vis~2->interface~elemconn_c0 +proc~cmp_elem_xg_vis->interface~elemconn_c0 @@ -1100,24 +1100,24 @@

    Calls

    - + -proc~get_multiplicity~2 - +proc~get_multiplicity + nurbs_surface%get_multiplicity - + -proc~get_degree_all~2->proc~get_multiplicity~2 +proc~get_degree_all->proc~get_multiplicity - + -proc~get_degree_dir~2->proc~get_multiplicity~2 +proc~get_degree_dir->proc~get_multiplicity @@ -1145,24 +1145,24 @@

    Calls

    - + -proc~set1~2->none~get_degree~2 +proc~set1->none~get_degree - + -proc~get_nc~2 - +proc~get_nc + nurbs_surface%get_nc - + -proc~set1~2->proc~get_nc~2 +proc~set1->proc~get_nc @@ -1175,21 +1175,21 @@

    Calls

    - + -proc~set2~2->proc~compute_knot_vector +proc~set2->proc~compute_knot_vector - + -proc~set2~2->proc~get_nc~2 +proc~set2->proc~get_nc - + -proc~set3~2->none~get_degree~2 +proc~set3->none~get_degree @@ -1268,15 +1268,15 @@

    Calls

    - + -proc~get_multiplicity~2->interface~compute_multiplicity +proc~get_multiplicity->interface~compute_multiplicity - + -proc~get_nc~2->interface~compute_multiplicity +proc~get_nc->interface~compute_multiplicity @@ -1383,7 +1383,7 @@

    Variables

    - + real(kind=rk), @@ -1399,7 +1399,7 @@

    Variables

    - + real(kind=rk), @@ -1415,7 +1415,7 @@

    Variables

    - + real(kind=rk) @@ -1431,7 +1431,7 @@

    Variables

    - + real(kind=rk) @@ -1447,7 +1447,7 @@

    Variables

    - + type(nurbs_surface) @@ -1475,7 +1475,7 @@

    Variables

    Functions

    -

    function generate_Xc(num_rows, num_cols, peak_height) result(control_points) +

    function generate_Xc(num_rows, num_cols, peak_height) result(control_points)

    @@ -1494,7 +1494,7 @@

    Arguments

    - + integer, intent(in)
    - + integer, intent(in)
    - + real(kind=rk), intent(in)
    - + real(kind=rk), @@ -1367,7 +1367,7 @@

    Variables

    - + real(kind=rk), @@ -1383,7 +1383,7 @@

    Variables

    - + real(kind=rk) @@ -1399,7 +1399,7 @@

    Variables

    - + real(kind=rk) @@ -1415,7 +1415,7 @@

    Variables

    - + real(kind=rk) @@ -1431,7 +1431,7 @@

    Variables

    - + type(nurbs_volume) @@ -1459,7 +1459,7 @@

    Variables

    Functions

    -

    function generate_Xc(L) result(control_points) +

    function generate_Xc(L) result(control_points)

    @@ -1703,7 +1703,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/program/example_morph.html b/program/example_morph.html index 260a36999..4d6c63213 100644 --- a/program/example_morph.html +++ b/program/example_morph.html @@ -115,11 +115,11 @@

    Variables

    - X + X control_shape elem - i - nunit + i + nunit
    @@ -387,48 +387,48 @@

    Calls

    example_morph - + -none~set - +none~set~3 + nurbs_volume%set - + -program~example_morph->none~set +program~example_morph->none~set~3 - + -proc~export_xc - +proc~export_xc~3 + nurbs_volume%export_Xc - + -program~example_morph->proc~export_xc +program~example_morph->proc~export_xc~3 - + -proc~export_xg - +proc~export_xg~3 + nurbs_volume%export_Xg - + -program~example_morph->proc~export_xg +program~example_morph->proc~export_xg~3 @@ -462,93 +462,93 @@

    Calls

    - + -proc~show - +proc~show~3 + nurbs_volume%show - + -program~example_morph->proc~show +program~example_morph->proc~show~3 - + -proc~set1 - +proc~set1~3 + nurbs_volume%set1 - + -none~set->proc~set1 +none~set~3->proc~set1~3 - + -proc~set2 - +proc~set2~3 + nurbs_volume%set2 - + -none~set->proc~set2 +none~set~3->proc~set2~3 - + -proc~set3 - +proc~set3~3 + nurbs_volume%set3 - + -none~set->proc~set3 +none~set~3->proc~set3~3 - + -proc~cmp_elem_xc_vis - +proc~cmp_elem_xc_vis~3 + nurbs_volume%cmp_elem_Xc_vis - + -proc~export_xc->proc~cmp_elem_xc_vis +proc~export_xc~3->proc~cmp_elem_xc_vis~3 - + -proc~cmp_elem_xg_vis - +proc~cmp_elem_xg_vis~3 + nurbs_volume%cmp_elem_Xg_vis - + -proc~export_xg->proc~cmp_elem_xg_vis +proc~export_xg~3->proc~cmp_elem_xg_vis~3 @@ -582,18 +582,18 @@

    Calls

    - + -proc~set_elem_xg_vis - +proc~set_elem_xg_vis~3 + nurbs_volume%set_elem_Xg_vis - + -proc~put_to_nurbs->proc~set_elem_xg_vis +proc~put_to_nurbs->proc~set_elem_xg_vis~3 @@ -606,45 +606,45 @@

    Calls

    - + -proc~cmp_elem_xc_vis->interface~elemconn_c0 +proc~cmp_elem_xc_vis~3->interface~elemconn_c0 - + -proc~cmp_elem_xg_vis->interface~elemconn_c0 +proc~cmp_elem_xg_vis~3->interface~elemconn_c0 - + -none~get_degree - +none~get_degree~3 + nurbs_volume%get_degree - + -proc~set1->none~get_degree +proc~set1~3->none~get_degree~3 - + -proc~get_nc - +proc~get_nc~3 + nurbs_volume%get_nc - + -proc~set1->proc~get_nc +proc~set1~3->proc~get_nc~3 @@ -657,21 +657,21 @@

    Calls

    - + -proc~set2->proc~compute_knot_vector +proc~set2~3->proc~compute_knot_vector - + -proc~set2->proc~get_nc +proc~set2~3->proc~get_nc~3 - + -proc~set3->none~get_degree +proc~set3~3->none~get_degree~3 @@ -720,33 +720,33 @@

    Calls

    - + -proc~get_degree_all - +proc~get_degree_all~2 + nurbs_volume%get_degree_all - + -none~get_degree->proc~get_degree_all +none~get_degree~3->proc~get_degree_all~2 - + -proc~get_degree_dir - +proc~get_degree_dir~2 + nurbs_volume%get_degree_dir - + -none~get_degree->proc~get_degree_dir +none~get_degree~3->proc~get_degree_dir~2 @@ -774,9 +774,9 @@

    Calls

    - + -proc~get_nc->interface~compute_multiplicity +proc~get_nc~3->interface~compute_multiplicity @@ -810,30 +810,30 @@

    Calls

    - + -proc~get_multiplicity - +proc~get_multiplicity~3 + nurbs_volume%get_multiplicity - + -proc~get_degree_all->proc~get_multiplicity +proc~get_degree_all~2->proc~get_multiplicity~3 - + -proc~get_degree_dir->proc~get_multiplicity +proc~get_degree_dir~2->proc~get_multiplicity~3 - + -proc~get_multiplicity->interface~compute_multiplicity +proc~get_multiplicity~3->interface~compute_multiplicity @@ -940,7 +940,7 @@

    Variables

    - + real(kind=rk), @@ -988,7 +988,7 @@

    Variables

    - + integer @@ -1004,7 +1004,7 @@

    Variables

    - + integer @@ -1051,7 +1051,7 @@

    Variables

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/program/example_nurbs_curve.html b/program/example_nurbs_curve.html index 003201a59..dd1491153 100644 --- a/program/example_nurbs_curve.html +++ b/program/example_nurbs_curve.html @@ -115,9 +115,9 @@

    Variables

    - Wc - Xc - nurbs + Wc + Xc + nurbs
    @@ -138,7 +138,7 @@

    Functions

    @@ -397,153 +397,153 @@

    Calls

    example_nurbs_curve - + -none~set~3 - +none~set~2 + nurbs_curve%set - + -program~example_nurbs_curve->none~set~3 +program~example_nurbs_curve->none~set~2 - + -proc~create~3 - +proc~create~2 + nurbs_curve%create - + -program~example_nurbs_curve->proc~create~3 +program~example_nurbs_curve->proc~create~2 - + -proc~export_xc~3 - +proc~export_xc~2 + nurbs_curve%export_Xc - + -program~example_nurbs_curve->proc~export_xc~3 +program~example_nurbs_curve->proc~export_xc~2 - + -proc~export_xg~3 - +proc~export_xg~2 + nurbs_curve%export_Xg - + -program~example_nurbs_curve->proc~export_xg~3 +program~example_nurbs_curve->proc~export_xg~2 - + -proc~finalize~3 - +proc~finalize~2 + nurbs_curve%finalize - + -program~example_nurbs_curve->proc~finalize~3 +program~example_nurbs_curve->proc~finalize~2 - + -proc~generate_xc - +proc~generate_xc~5 + generate_Xc - + -program~example_nurbs_curve->proc~generate_xc +program~example_nurbs_curve->proc~generate_xc~5 - + -proc~show~3 - +proc~show~2 + nurbs_curve%show - + -program~example_nurbs_curve->proc~show~3 +program~example_nurbs_curve->proc~show~2 - + -proc~set1~3 - +proc~set1~2 + nurbs_curve%set1 - + -none~set~3->proc~set1~3 +none~set~2->proc~set1~2 - + -proc~set2~3 - +proc~set2~2 + nurbs_curve%set2 - + -none~set~3->proc~set2~3 +none~set~2->proc~set2~2 - + -proc~set3~3 - +proc~set3~2 + nurbs_curve%set3 - + -none~set~3->proc~set3~3 +none~set~2->proc~set3~2 @@ -556,54 +556,54 @@

    Calls

    - + -proc~create~3->proc~basis_bspline +proc~create~2->proc~basis_bspline - + -proc~is_rational~3 - +proc~is_rational~2 + nurbs_curve%is_rational - + -proc~create~3->proc~is_rational~3 +proc~create~2->proc~is_rational~2 - + -proc~cmp_elem_xc_vis~3 - +proc~cmp_elem_xc_vis~2 + nurbs_curve%cmp_elem_Xc_vis - + -proc~export_xc~3->proc~cmp_elem_xc_vis~3 +proc~export_xc~2->proc~cmp_elem_xc_vis~2 - + -proc~cmp_elem_xg_vis~3 - +proc~cmp_elem_xg_vis~2 + nurbs_curve%cmp_elem_Xg_vis - + -proc~export_xg~3->proc~cmp_elem_xg_vis~3 +proc~export_xg~2->proc~cmp_elem_xg_vis~2 @@ -616,15 +616,15 @@

    Calls

    - + -proc~cmp_elem_xc_vis~3->interface~elemconn_c0 +proc~cmp_elem_xc_vis~2->interface~elemconn_c0 - + -proc~cmp_elem_xg_vis~3->interface~elemconn_c0 +proc~cmp_elem_xg_vis~2->interface~elemconn_c0 @@ -637,9 +637,9 @@

    Calls

    - + -proc~set1~3->proc~get_degree +proc~set1~2->proc~get_degree @@ -652,15 +652,15 @@

    Calls

    - + -proc~set2~3->proc~compute_knot_vector +proc~set2~2->proc~compute_knot_vector - + -proc~set3~3->proc~get_degree +proc~set3~2->proc~get_degree @@ -724,18 +724,18 @@

    Calls

    - + -proc~get_multiplicity~3 - +proc~get_multiplicity~2 + nurbs_curve%get_multiplicity - + -proc~get_degree->proc~get_multiplicity~3 +proc~get_degree->proc~get_multiplicity~2 @@ -748,9 +748,9 @@

    Calls

    - + -proc~get_multiplicity~3->interface~compute_multiplicity +proc~get_multiplicity~2->interface~compute_multiplicity @@ -887,7 +887,7 @@

    Variables

    - + real(kind=rk), @@ -903,7 +903,7 @@

    Variables

    - + real(kind=rk), @@ -919,7 +919,7 @@

    Variables

    - + type(nurbs_curve) @@ -947,7 +947,7 @@

    Variables

    Functions

    -

    function generate_Xc(num_coils, radius, height, num_points_per_coil) result(control_points) +

    function generate_Xc(num_coils, radius, height, num_points_per_coil) result(control_points)

    @@ -1139,7 +1139,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/program/example_nurbs_surface.html b/program/example_nurbs_surface.html index 7608a9aa0..e09671f2c 100644 --- a/program/example_nurbs_surface.html +++ b/program/example_nurbs_surface.html @@ -115,9 +115,9 @@

    Variables

    - Wc - Xc - nurbs + Wc + Xc + nurbs
    @@ -138,7 +138,7 @@

    Functions

    @@ -397,153 +397,153 @@

    Calls

    example_nurbs_surface - + -none~set~2 - +none~set + nurbs_surface%set - + -program~example_nurbs_surface->none~set~2 +program~example_nurbs_surface->none~set - + -proc~create~2 - +proc~create + nurbs_surface%create - + -program~example_nurbs_surface->proc~create~2 +program~example_nurbs_surface->proc~create - + -proc~export_xc~2 - +proc~export_xc + nurbs_surface%export_Xc - + -program~example_nurbs_surface->proc~export_xc~2 +program~example_nurbs_surface->proc~export_xc - + -proc~export_xg~2 - +proc~export_xg + nurbs_surface%export_Xg - + -program~example_nurbs_surface->proc~export_xg~2 +program~example_nurbs_surface->proc~export_xg - + -proc~finalize~2 - +proc~finalize + nurbs_surface%finalize - + -program~example_nurbs_surface->proc~finalize~2 +program~example_nurbs_surface->proc~finalize - + -proc~generate_xc~5 - +proc~generate_xc + generate_Xc - + -program~example_nurbs_surface->proc~generate_xc~5 +program~example_nurbs_surface->proc~generate_xc - + -proc~show~2 - +proc~show + nurbs_surface%show - + -program~example_nurbs_surface->proc~show~2 +program~example_nurbs_surface->proc~show - + -proc~set1~2 - +proc~set1 + nurbs_surface%set1 - + -none~set~2->proc~set1~2 +none~set->proc~set1 - + -proc~set2~2 - +proc~set2 + nurbs_surface%set2 - + -none~set~2->proc~set2~2 +none~set->proc~set2 - + -proc~set3~2 - +proc~set3 + nurbs_surface%set3 - + -none~set~2->proc~set3~2 +none~set->proc~set3 @@ -556,9 +556,9 @@

    Calls

    - + -proc~create~2->interface~ndgrid +proc~create->interface~ndgrid @@ -571,24 +571,24 @@

    Calls

    - + -proc~create~2->proc~basis_bspline +proc~create->proc~basis_bspline - + -proc~is_rational~2 - +proc~is_rational + nurbs_surface%is_rational - + -proc~create~2->proc~is_rational~2 +proc~create->proc~is_rational @@ -601,39 +601,39 @@

    Calls

    - + -proc~create~2->proc~kron +proc~create->proc~kron - + -proc~cmp_elem_xc_vis~2 - +proc~cmp_elem_xc_vis + nurbs_surface%cmp_elem_Xc_vis - + -proc~export_xc~2->proc~cmp_elem_xc_vis~2 +proc~export_xc->proc~cmp_elem_xc_vis - + -proc~cmp_elem_xg_vis~2 - +proc~cmp_elem_xg_vis + nurbs_surface%cmp_elem_Xg_vis - + -proc~export_xg~2->proc~cmp_elem_xg_vis~2 +proc~export_xg->proc~cmp_elem_xg_vis @@ -676,45 +676,45 @@

    Calls

    - + -proc~cmp_elem_xc_vis~2->interface~elemconn_c0 +proc~cmp_elem_xc_vis->interface~elemconn_c0 - + -proc~cmp_elem_xg_vis~2->interface~elemconn_c0 +proc~cmp_elem_xg_vis->interface~elemconn_c0 - + -none~get_degree~2 - +none~get_degree + nurbs_surface%get_degree - + -proc~set1~2->none~get_degree~2 +proc~set1->none~get_degree - + -proc~get_nc~2 - +proc~get_nc + nurbs_surface%get_nc - + -proc~set1~2->proc~get_nc~2 +proc~set1->proc~get_nc @@ -727,21 +727,21 @@

    Calls

    - + -proc~set2~2->proc~compute_knot_vector +proc~set2->proc~compute_knot_vector - + -proc~set2~2->proc~get_nc~2 +proc~set2->proc~get_nc - + -proc~set3~2->none~get_degree~2 +proc~set3->none~get_degree @@ -790,33 +790,33 @@

    Calls

    - + -proc~get_degree_all~2 - +proc~get_degree_all + nurbs_surface%get_degree_all - + -none~get_degree~2->proc~get_degree_all~2 +none~get_degree->proc~get_degree_all - + -proc~get_degree_dir~2 - +proc~get_degree_dir + nurbs_surface%get_degree_dir - + -none~get_degree~2->proc~get_degree_dir~2 +none~get_degree->proc~get_degree_dir @@ -844,9 +844,9 @@

    Calls

    - + -proc~get_nc~2->interface~compute_multiplicity +proc~get_nc->interface~compute_multiplicity @@ -880,30 +880,30 @@

    Calls

    - + -proc~get_multiplicity~2 - +proc~get_multiplicity + nurbs_surface%get_multiplicity - + -proc~get_degree_all~2->proc~get_multiplicity~2 +proc~get_degree_all->proc~get_multiplicity - + -proc~get_degree_dir~2->proc~get_multiplicity~2 +proc~get_degree_dir->proc~get_multiplicity - + -proc~get_multiplicity~2->interface~compute_multiplicity +proc~get_multiplicity->interface~compute_multiplicity @@ -1010,7 +1010,7 @@

    Variables

    - + real(kind=rk), @@ -1026,7 +1026,7 @@

    Variables

    - + real(kind=rk), @@ -1042,7 +1042,7 @@

    Variables

    - + type(nurbs_surface) @@ -1070,7 +1070,7 @@

    Variables

    Functions

    -

    function generate_Xc(num_rows, num_cols, peak_height) result(control_points) +

    function generate_Xc(num_rows, num_cols, peak_height) result(control_points)

    @@ -1089,7 +1089,7 @@

    Arguments

    - + integer, intent(in)
    - + integer, intent(in)
    - + real(kind=rk), intent(in)
    - + real(kind=rk), @@ -1011,7 +1011,7 @@

    Variables

    - + real(kind=rk), @@ -1027,7 +1027,7 @@

    Variables

    - + type(nurbs_volume) @@ -1055,7 +1055,7 @@

    Variables

    Functions

    -

    function generate_Xc(L) result(control_points) +

    function generate_Xc(L) result(control_points)

    @@ -1074,7 +1074,7 @@

    Arguments

    - + real(kind=rk), intent(in)
    - + type(nurbs_volume) @@ -1034,7 +1034,7 @@

    Variables

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/program/shape_tetragon.html b/program/shape_tetragon.html index 3730d6ddf..7b2eb4e1a 100644 --- a/program/shape_tetragon.html +++ b/program/shape_tetragon.html @@ -115,11 +115,11 @@

    Variables

    - Wc - Xc - knot1 - knot2 - shape + Wc + Xc + knot1 + knot2 + shape
    @@ -378,63 +378,63 @@

    Calls

    shape_tetragon - + -proc~create~2 - +proc~create + nurbs_surface%create - + -program~shape_tetragon->proc~create~2 +program~shape_tetragon->proc~create - + -proc~export_xc~2 - +proc~export_xc + nurbs_surface%export_Xc - + -program~shape_tetragon->proc~export_xc~2 +program~shape_tetragon->proc~export_xc - + -proc~export_xg~2 - +proc~export_xg + nurbs_surface%export_Xg - + -program~shape_tetragon->proc~export_xg~2 +program~shape_tetragon->proc~export_xg - + -proc~finalize~2 - +proc~finalize + nurbs_surface%finalize - + -program~shape_tetragon->proc~finalize~2 +program~shape_tetragon->proc~finalize @@ -453,18 +453,18 @@

    Calls

    - + -proc~show~2 - +proc~show + nurbs_surface%show - + -program~shape_tetragon->proc~show~2 +program~shape_tetragon->proc~show @@ -477,9 +477,9 @@

    Calls

    - + -proc~create~2->interface~ndgrid +proc~create->interface~ndgrid @@ -492,24 +492,24 @@

    Calls

    - + -proc~create~2->proc~basis_bspline +proc~create->proc~basis_bspline - + -proc~is_rational~2 - +proc~is_rational + nurbs_surface%is_rational - + -proc~create~2->proc~is_rational~2 +proc~create->proc~is_rational @@ -522,54 +522,54 @@

    Calls

    - + -proc~create~2->proc~kron +proc~create->proc~kron - + -proc~cmp_elem_xc_vis~2 - +proc~cmp_elem_xc_vis + nurbs_surface%cmp_elem_Xc_vis - + -proc~export_xc~2->proc~cmp_elem_xc_vis~2 +proc~export_xc->proc~cmp_elem_xc_vis - + -proc~cmp_elem_xg_vis~2 - +proc~cmp_elem_xg_vis + nurbs_surface%cmp_elem_Xg_vis - + -proc~export_xg~2->proc~cmp_elem_xg_vis~2 +proc~export_xg->proc~cmp_elem_xg_vis - + -none~set~2 - +none~set + nurbs_surface%set - + -proc~set_tetragon->none~set~2 +proc~set_tetragon->none~set @@ -618,48 +618,48 @@

    Calls

    - + -proc~set1~2 - +proc~set1 + nurbs_surface%set1 - + -none~set~2->proc~set1~2 +none~set->proc~set1 - + -proc~set2~2 - +proc~set2 + nurbs_surface%set2 - + -none~set~2->proc~set2~2 +none~set->proc~set2 - + -proc~set3~2 - +proc~set3 + nurbs_surface%set3 - + -none~set~2->proc~set3~2 +none~set->proc~set3 @@ -672,15 +672,15 @@

    Calls

    - + -proc~cmp_elem_xc_vis~2->interface~elemconn_c0 +proc~cmp_elem_xc_vis->interface~elemconn_c0 - + -proc~cmp_elem_xg_vis~2->interface~elemconn_c0 +proc~cmp_elem_xg_vis->interface~elemconn_c0 @@ -729,33 +729,33 @@

    Calls

    - + -none~get_degree~2 - +none~get_degree + nurbs_surface%get_degree - + -proc~set1~2->none~get_degree~2 +proc~set1->none~get_degree - + -proc~get_nc~2 - +proc~get_nc + nurbs_surface%get_nc - + -proc~set1~2->proc~get_nc~2 +proc~set1->proc~get_nc @@ -768,51 +768,51 @@

    Calls

    - + -proc~set2~2->proc~compute_knot_vector +proc~set2->proc~compute_knot_vector - + -proc~set2~2->proc~get_nc~2 +proc~set2->proc~get_nc - + -proc~set3~2->none~get_degree~2 +proc~set3->none~get_degree - + -proc~get_degree_all~2 - +proc~get_degree_all + nurbs_surface%get_degree_all - + -none~get_degree~2->proc~get_degree_all~2 +none~get_degree->proc~get_degree_all - + -proc~get_degree_dir~2 - +proc~get_degree_dir + nurbs_surface%get_degree_dir - + -none~get_degree~2->proc~get_degree_dir~2 +none~get_degree->proc~get_degree_dir @@ -840,9 +840,9 @@

    Calls

    - + -proc~get_nc~2->interface~compute_multiplicity +proc~get_nc->interface~compute_multiplicity @@ -876,30 +876,30 @@

    Calls

    - + -proc~get_multiplicity~2 - +proc~get_multiplicity + nurbs_surface%get_multiplicity - + -proc~get_degree_all~2->proc~get_multiplicity~2 +proc~get_degree_all->proc~get_multiplicity - + -proc~get_degree_dir~2->proc~get_multiplicity~2 +proc~get_degree_dir->proc~get_multiplicity - + -proc~get_multiplicity~2->interface~compute_multiplicity +proc~get_multiplicity->interface~compute_multiplicity @@ -1006,7 +1006,7 @@

    Variables

    - + real(kind=rk), @@ -1022,7 +1022,7 @@

    Variables

    - + real(kind=rk), @@ -1038,7 +1038,7 @@

    Variables

    - + real(kind=rk), @@ -1054,7 +1054,7 @@

    Variables

    - + real(kind=rk), @@ -1070,7 +1070,7 @@

    Variables

    - + type(nurbs_surface) @@ -1117,7 +1117,7 @@

    Variables

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/search.html b/search.html index 63a453516..abc694c13 100644 --- a/search.html +++ b/search.html @@ -101,7 +101,7 @@

    Search Results

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/sourcefile/demo_curve.f90.html b/sourcefile/demo_curve.f90.html index 08d3cec40..f30d130e9 100644 --- a/sourcefile/demo_curve.f90.html +++ b/sourcefile/demo_curve.f90.html @@ -419,7 +419,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/sourcefile/demo_surface.f90.html b/sourcefile/demo_surface.f90.html index dffd5810b..f6b3a2e5f 100644 --- a/sourcefile/demo_surface.f90.html +++ b/sourcefile/demo_surface.f90.html @@ -422,7 +422,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/sourcefile/demo_volume.f90.html b/sourcefile/demo_volume.f90.html index f19b26cc3..d323fd52a 100644 --- a/sourcefile/demo_volume.f90.html +++ b/sourcefile/demo_volume.f90.html @@ -417,7 +417,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/sourcefile/example_curve_1.f90.html b/sourcefile/example_curve_1.f90.html index dc91876d4..391d5e233 100644 --- a/sourcefile/example_curve_1.f90.html +++ b/sourcefile/example_curve_1.f90.html @@ -77,7 +77,7 @@

    example_curve_1.f90
  • 40 statements + title=" 0.9% of total for source files.">40 statements
  • @@ -483,7 +483,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/sourcefile/example_surface_1.f90.html b/sourcefile/example_surface_1.f90.html index ee3147f39..67883cf24 100644 --- a/sourcefile/example_surface_1.f90.html +++ b/sourcefile/example_surface_1.f90.html @@ -77,7 +77,7 @@

    example_surface_1.f90
  • 66 statements + title=" 1.5% of total for source files.">66 statements
  • @@ -514,7 +514,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/sourcefile/example_volume_1.f90.html b/sourcefile/example_volume_1.f90.html index bb840d065..1ac2e921d 100644 --- a/sourcefile/example_volume_1.f90.html +++ b/sourcefile/example_volume_1.f90.html @@ -77,7 +77,7 @@

    example_volume_1.f90
  • 70 statements + title=" 1.6% of total for source files.">70 statements
  • @@ -515,7 +515,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/sourcefile/forcad.f90.html b/sourcefile/forcad.f90.html index d22f92076..80b23422e 100644 --- a/sourcefile/forcad.f90.html +++ b/sourcefile/forcad.f90.html @@ -565,7 +565,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/sourcefile/forcad_nurbs_curve.f90.html b/sourcefile/forcad_nurbs_curve.f90.html index 7c99e9038..0d337fa36 100644 --- a/sourcefile/forcad_nurbs_curve.f90.html +++ b/sourcefile/forcad_nurbs_curve.f90.html @@ -77,7 +77,7 @@

    forcad_nurbs_curve.f90
  • 682 statements + title="17.1% of total for source files.">742 statements
  • @@ -517,1056 +517,1056 @@

    Source Code

    procedure :: set3 !!> Set Bezier or Rational Bezier curve using control points and weights generic :: set => set1, set2, set3 !!> Set NURBS curve procedure :: create !!> Generate geometry points - procedure :: get_Xc !!> Get control points - procedure :: get_Xg !!> Get geometry points - procedure :: get_Wc !!> Get weights - procedure :: get_Xt !!> Get parameter values - procedure, private :: get_knot_all !!> Get all knot vectors - procedure, private :: get_knoti !!> Get i-th knot value - generic :: get_knot => get_knoti, get_knot_all !!> Get knot vector - procedure :: get_ng !!> Get number of geometry points - procedure :: get_degree !!> Get degree of the NURBS curve - procedure :: finalize !!> Finalize the NURBS curve object - procedure :: cmp_elem_Xc_vis !!> Generate connectivity for control points - procedure :: cmp_elem_Xg_vis !!> Generate connectivity for geometry points - procedure :: cmp_elem !!> Generate IGA element connectivity - procedure :: get_elem_Xc_vis !!> Get connectivity for control points - procedure :: get_elem_Xg_vis !!> Get connectivity for geometry points - procedure :: get_elem !!> Get IGA element connectivity - procedure :: set_elem_Xc_vis !!> Set connectivity for control points - procedure :: set_elem_Xg_vis !!> Set connectivity for geometry points - procedure :: set_elem !!> Set IGA element connectivity - procedure :: export_Xc !!> Export control points to VTK file - procedure :: export_Xg !!> Export geometry points to VTK file - procedure :: modify_Xc !!> Modify control points - procedure :: modify_Wc !!> Modify weights - procedure :: get_multiplicity !!> Get multiplicity of the knot vector - procedure :: get_continuity !!> Get continuity of the curve - procedure :: get_nc !!> Get number of required control points - procedure :: insert_knots !!> Insert knots into the knot vector - procedure :: elevate_degree !!> Elevate the degree of the curve - procedure :: derivative !!> Compute the derivative of the NURBS curve - procedure :: basis !!> Compute the basis functions of the NURBS curve - procedure :: is_rational !!> Check if the NURBS curve is rational - procedure :: remove_knots !!> Remove knots from the knot vector - procedure :: rotate_Xc !!> Rotate control points - procedure :: rotate_Xg !!> Rotate geometry points - procedure :: translate_Xc !!> Translate control points - procedure :: translate_Xg !!> Translate geometry points - procedure :: show !!> Show the NURBS object using PyVista - - ! Shapes - procedure :: set_circle !!> Set a circle - end type - !=============================================================================== - -contains - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - !> Set knot vector, control points and weights for the NURBS curve object. - pure subroutine set1(this, knot, Xc, Wc) - class(nurbs_curve), intent(inout) :: this - real(rk), intent(in), contiguous :: knot(:) - real(rk), intent(in), contiguous :: Xc(:,:) - real(rk), intent(in), contiguous, optional :: Wc(:) - - if (allocated(this%knot)) deallocate(this%knot) - if (allocated(this%Xc)) deallocate(this%Xc) - - this%knot = knot - this%degree = this%get_degree() - this%Xc = Xc - this%nc = size(this%Xc, 1) - if (present(Wc)) then - if (size(Wc) /= this%nc) then - error stop 'Number of weights does not match the number of control points.' - else - if (allocated(this%Wc)) deallocate(this%Wc) - this%Wc = Wc - end if - end if - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - !> Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights. - pure subroutine set2(this, Xth_dir, degree, continuity, Xc, Wc) - class(nurbs_curve), intent(inout) :: this - real(rk), intent(in), contiguous :: Xth_dir(:) - integer, intent(in) :: degree - integer, intent(in), contiguous :: continuity(:) - real(rk), intent(in), contiguous :: Xc(:,:) - real(rk), intent(in), contiguous, optional :: Wc(:) - - if (allocated(this%knot)) deallocate(this%knot) - if (allocated(this%Xc)) deallocate(this%Xc) - - this%knot = compute_knot_vector(Xth_dir, degree, continuity) - this%degree = degree - this%Xc = Xc - this%nc = size(this%Xc, 1) - if (present(Wc)) then - if (size(Wc) /= this%nc) then - error stop 'Number of weights does not match the number of control points.' - else - if (allocated(this%Wc)) deallocate(this%Wc) - this%Wc = Wc - end if - end if - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - !> Set Bezier or Rational Bezier curve using control points and weights. - pure subroutine set3(this, Xc, Wc) - class(nurbs_curve), intent(inout) :: this - real(rk), intent(in), contiguous :: Xc(:,:) - real(rk), intent(in), contiguous, optional :: Wc(:) - - if (allocated(this%knot)) deallocate(this%knot) - if (allocated(this%Xc)) deallocate(this%Xc) - - this%Xc = Xc - this%nc = size(this%Xc, 1) - - if (allocated(this%knot)) deallocate(this%knot) - allocate(this%knot(2*this%nc)) - this%knot(1:this%nc) = 0.0_rk - this%knot(this%nc+1:2*this%nc) = 1.0_rk + procedure, private :: get_Xc_all !!> Get all control points + procedure, private :: get_Xci !!> Get i-th control point + procedure, private :: get_Xcid !!> Get i-th control point in a specific direction + generic :: get_Xc => get_Xc_all, get_Xci, get_Xcid !!> Get control points + procedure, private :: get_Xg_all !!> Get all geometry points + procedure, private :: get_Xgi !!> Get i-th geometry point + procedure, private :: get_Xgid !!> Get i-th geometry point in a specific direction + generic :: get_Xg => get_Xg_all, get_Xgi, get_Xgid !!> Get geometry points + procedure, private :: get_Wc_all !!> Get all weights + procedure, private :: get_Wci !!> Get i-th weight + generic :: get_Wc => get_Wc_all, get_Wci !!> Get weights + procedure :: get_Xt !!> Get parameter values + procedure, private :: get_knot_all !!> Get all knot vectors + procedure, private :: get_knoti !!> Get i-th knot value + generic :: get_knot => get_knoti, get_knot_all !!> Get knot vector + procedure :: get_ng !!> Get number of geometry points + procedure :: get_degree !!> Get degree of the NURBS curve + procedure :: finalize !!> Finalize the NURBS curve object + procedure :: cmp_elem_Xc_vis !!> Generate connectivity for control points + procedure :: cmp_elem_Xg_vis !!> Generate connectivity for geometry points + procedure :: cmp_elem !!> Generate IGA element connectivity + procedure :: get_elem_Xc_vis !!> Get connectivity for control points + procedure :: get_elem_Xg_vis !!> Get connectivity for geometry points + procedure :: get_elem !!> Get IGA element connectivity + procedure :: set_elem_Xc_vis !!> Set connectivity for control points + procedure :: set_elem_Xg_vis !!> Set connectivity for geometry points + procedure :: set_elem !!> Set IGA element connectivity + procedure :: export_Xc !!> Export control points to VTK file + procedure :: export_Xg !!> Export geometry points to VTK file + procedure :: modify_Xc !!> Modify control points + procedure :: modify_Wc !!> Modify weights + procedure :: get_multiplicity !!> Get multiplicity of the knot vector + procedure :: get_continuity !!> Get continuity of the curve + procedure :: get_nc !!> Get number of required control points + procedure :: insert_knots !!> Insert knots into the knot vector + procedure :: elevate_degree !!> Elevate the degree of the curve + procedure :: derivative !!> Compute the derivative of the NURBS curve + procedure :: basis !!> Compute the basis functions of the NURBS curve + procedure :: is_rational !!> Check if the NURBS curve is rational + procedure :: remove_knots !!> Remove knots from the knot vector + procedure :: rotate_Xc !!> Rotate control points + procedure :: rotate_Xg !!> Rotate geometry points + procedure :: translate_Xc !!> Translate control points + procedure :: translate_Xg !!> Translate geometry points + procedure :: show !!> Show the NURBS object using PyVista + + ! Shapes + procedure :: set_circle !!> Set a circle + end type + !=============================================================================== + +contains + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + !> Set knot vector, control points and weights for the NURBS curve object. + pure subroutine set1(this, knot, Xc, Wc) + class(nurbs_curve), intent(inout) :: this + real(rk), intent(in), contiguous :: knot(:) + real(rk), intent(in), contiguous :: Xc(:,:) + real(rk), intent(in), contiguous, optional :: Wc(:) + + if (allocated(this%knot)) deallocate(this%knot) + if (allocated(this%Xc)) deallocate(this%Xc) + + this%knot = knot + this%degree = this%get_degree() + this%Xc = Xc + this%nc = size(this%Xc, 1) + if (present(Wc)) then + if (size(Wc) /= this%nc) then + error stop 'Number of weights does not match the number of control points.' + else + if (allocated(this%Wc)) deallocate(this%Wc) + this%Wc = Wc + end if + end if + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + !> Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights. + pure subroutine set2(this, Xth_dir, degree, continuity, Xc, Wc) + class(nurbs_curve), intent(inout) :: this + real(rk), intent(in), contiguous :: Xth_dir(:) + integer, intent(in) :: degree + integer, intent(in), contiguous :: continuity(:) + real(rk), intent(in), contiguous :: Xc(:,:) + real(rk), intent(in), contiguous, optional :: Wc(:) + + if (allocated(this%knot)) deallocate(this%knot) + if (allocated(this%Xc)) deallocate(this%Xc) + + this%knot = compute_knot_vector(Xth_dir, degree, continuity) + this%degree = degree + this%Xc = Xc + this%nc = size(this%Xc, 1) + if (present(Wc)) then + if (size(Wc) /= this%nc) then + error stop 'Number of weights does not match the number of control points.' + else + if (allocated(this%Wc)) deallocate(this%Wc) + this%Wc = Wc + end if + end if + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + !> Set Bezier or Rational Bezier curve using control points and weights. + pure subroutine set3(this, Xc, Wc) + class(nurbs_curve), intent(inout) :: this + real(rk), intent(in), contiguous :: Xc(:,:) + real(rk), intent(in), contiguous, optional :: Wc(:) + + if (allocated(this%knot)) deallocate(this%knot) + if (allocated(this%Xc)) deallocate(this%Xc) - this%degree = this%get_degree() - if (present(Wc)) then - if (size(Wc) /= this%nc) then - error stop 'Number of weights does not match the number of control points.' - else - if (allocated(this%Wc)) deallocate(this%Wc) - this%Wc = Wc - end if - end if - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine create(this, res, Xt) - class(nurbs_curve), intent(inout) :: this - integer, intent(in), optional :: res - real(rk), intent(in), contiguous, optional :: Xt(:) - real(rk), allocatable :: Tgc(:) - integer :: i, j - - ! check - if (.not.allocated(this%Xc)) then - error stop 'Control points are not set.' - end if - - if (.not.allocated(this%knot)) then - error stop 'Knot vector is not set.' - end if - - ! Set parameter values - if (present(Xt)) then - if (allocated(this%Xt)) deallocate(this%Xt) - this%Xt = Xt - elseif (present(res)) then - if (allocated(this%Xt)) deallocate(this%Xt) - allocate(this%Xt(res)) - this%Xt = [(real(i-1, rk) / real(res-1, rk), i=1, res)] - ! else - ! this%Xt = this%Xt - end if - - ! Set number of geometry points - this%ng = size(this%Xt) - - ! Allocate memory for geometry points - if (allocated(this%Xg)) deallocate(this%Xg) - allocate(this%Xg(this%ng, size(this%Xc,2))) - - if (this%is_rational()) then ! NURBS - do i = 1, size(this%Xt, 1) - Tgc = basis_bspline(this%Xt(i), this%knot, this%nc, this%degree) - Tgc = Tgc*(this%Wc/(dot_product(Tgc,this%Wc))) - do j = 1, size(this%Xc, 2) - this%Xg(i,j) = dot_product(Tgc,this%Xc(:,j)) - end do - end do - else ! B-Spline + this%Xc = Xc + this%nc = size(this%Xc, 1) + + if (allocated(this%knot)) deallocate(this%knot) + allocate(this%knot(2*this%nc)) + this%knot(1:this%nc) = 0.0_rk + this%knot(this%nc+1:2*this%nc) = 1.0_rk + + this%degree = this%get_degree() + if (present(Wc)) then + if (size(Wc) /= this%nc) then + error stop 'Number of weights does not match the number of control points.' + else + if (allocated(this%Wc)) deallocate(this%Wc) + this%Wc = Wc + end if + end if + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine create(this, res, Xt) + class(nurbs_curve), intent(inout) :: this + integer, intent(in), optional :: res + real(rk), intent(in), contiguous, optional :: Xt(:) + real(rk), allocatable :: Tgc(:) + integer :: i, j + + ! check + if (.not.allocated(this%Xc)) then + error stop 'Control points are not set.' + end if + + if (.not.allocated(this%knot)) then + error stop 'Knot vector is not set.' + end if + + ! Set parameter values + if (present(Xt)) then + if (allocated(this%Xt)) deallocate(this%Xt) + this%Xt = Xt + elseif (present(res)) then + if (allocated(this%Xt)) deallocate(this%Xt) + allocate(this%Xt(res)) + this%Xt = [(real(i-1, rk) / real(res-1, rk), i=1, res)] + ! else + ! this%Xt = this%Xt + end if + + ! Set number of geometry points + this%ng = size(this%Xt) + + ! Allocate memory for geometry points + if (allocated(this%Xg)) deallocate(this%Xg) + allocate(this%Xg(this%ng, size(this%Xc,2))) + + if (this%is_rational()) then ! NURBS do i = 1, size(this%Xt, 1) Tgc = basis_bspline(this%Xt(i), this%knot, this%nc, this%degree) - do j = 1, size(this%Xc, 2) - this%Xg(i,j) = dot_product(Tgc,this%Xc(:,j)) - end do - end do - end if - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_Xc(this) result(Xc) - class(nurbs_curve), intent(in) :: this - real(rk), allocatable :: Xc(:,:) + Tgc = Tgc*(this%Wc/(dot_product(Tgc,this%Wc))) + do j = 1, size(this%Xc, 2) + this%Xg(i,j) = dot_product(Tgc,this%Xc(:,j)) + end do + end do + else ! B-Spline + do i = 1, size(this%Xt, 1) + Tgc = basis_bspline(this%Xt(i), this%knot, this%nc, this%degree) + do j = 1, size(this%Xc, 2) + this%Xg(i,j) = dot_product(Tgc,this%Xc(:,j)) + end do + end do + end if + end subroutine + !=============================================================================== - if (allocated(this%Xc)) then - Xc = this%Xc - else - error stop 'Control points are not set.' - end if - end function - !=============================================================================== + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xc_all(this) result(Xc) + class(nurbs_curve), intent(in) :: this + real(rk), allocatable :: Xc(:,:) - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_Xg(this) result(Xg) - class(nurbs_curve), intent(in) :: this - real(rk), allocatable :: Xg(:,:) + if (allocated(this%Xc)) then + Xc = this%Xc + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== - if (allocated(this%Xg)) then - Xg = this%Xg - else - error stop 'Geometry points are not set.' - end if - end function - !=============================================================================== - + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xci(this, n) result(Xc) + class(nurbs_curve), intent(in) :: this + integer, intent(in) :: n + real(rk), allocatable :: Xc(:) - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_Wc(this) result(Wc) - class(nurbs_curve), intent(in) :: this - real(rk), allocatable :: Wc(:) - - if (allocated(this%Wc)) then - Wc = this%Wc - else - error stop 'The NURBS curve is not rational.' - end if - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_Xt(this) result(Xt) - class(nurbs_curve), intent(in) :: this - real(rk), allocatable :: Xt(:) - - if (allocated(this%Xt)) then - Xt = this%Xt - else - error stop 'Parameter values are not set.' - end if - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_ng(this) result(ng) - class(nurbs_curve), intent(in) :: this - integer :: ng - - ng = this%ng - end function - !=============================================================================== + if (allocated(this%Xc)) then + Xc(:) = this%Xc(n,:) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xcid(this, n, dir) result(Xc) + class(nurbs_curve), intent(in) :: this + integer, intent(in) :: n + integer, intent(in) :: dir + real(rk) :: Xc + + if (allocated(this%Xc)) then + Xc = this%Xc(n, dir) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xg_all(this) result(Xg) + class(nurbs_curve), intent(in) :: this + real(rk), allocatable :: Xg(:,:) + + if (allocated(this%Xg)) then + Xg = this%Xg + else + error stop 'Geometry points are not set.' + end if + end function + !=============================================================================== + - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_degree(this) result(degree) - class(nurbs_curve), intent(in) :: this - integer :: degree - integer, allocatable :: m(:) - - m = this%get_multiplicity() - - degree = m(1) - 1 - end function - !=============================================================================== - + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xgi(this, n) result(Xg) + class(nurbs_curve), intent(in) :: this + integer, intent(in) :: n + real(rk), allocatable :: Xg(:) + + if (allocated(this%Xg)) then + Xg(:) = this%Xg(n,:) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_knot_all(this) result(knot) - class(nurbs_curve), intent(in) :: this - real(rk), allocatable :: knot(:) - - if (allocated(this%knot)) then - knot = this%knot - else - error stop 'Knot vector is not set.' - end if - end function - !=============================================================================== - - + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xgid(this, n, dir) result(Xg) + class(nurbs_curve), intent(in) :: this + integer, intent(in) :: n + integer, intent(in) :: dir + real(rk) :: Xg + + if (allocated(this%Xg)) then + Xg = this%Xg(n, dir) + else + error stop 'Control points are not set.' + end if + end function !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_knoti(this,i) result(knot) - class(nurbs_curve), intent(in) :: this - integer, intent(in) :: i - real(rk) :: knot - - if (allocated(this%knot)) then - if (i < 1 .or. i > size(this%knot)) then - error stop 'Invalid index for knot vector.' - else - knot = this%knot(i) - end if - else - error stop 'Knot vector is not set.' - end if - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine finalize(this) - class(nurbs_curve), intent(inout) :: this - if (allocated(this%Xc)) deallocate(this%Xc) - if (allocated(this%Xg)) deallocate(this%Xg) - if (allocated(this%Wc)) deallocate(this%Wc) - if (allocated(this%Xt)) deallocate(this%Xt) - if (allocated(this%knot)) deallocate(this%knot) - if (allocated(this%elemConn_Xc_vis)) deallocate(this%elemConn_Xc_vis) - if (allocated(this%elemConn_Xg_vis)) deallocate(this%elemConn_Xg_vis) - if (allocated(this%elemConn)) deallocate(this%elemConn) - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function cmp_elem_Xc_vis(this, p) result(elemConn) - class(nurbs_curve), intent(in) :: this - integer, allocatable :: elemConn(:,:) - integer, intent(in), optional :: p - - if (present(p)) then - elemConn = elemConn_C0(this%nc,p) - else - elemConn = elemConn_C0(this%nc,1) - end if - end function + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Wc_all(this) result(Wc) + class(nurbs_curve), intent(in) :: this + real(rk), allocatable :: Wc(:) + + if (allocated(this%Wc)) then + Wc = this%Wc + else + error stop 'The NURBS curve is not rational or weights are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Wci(this, n) result(Wc) + class(nurbs_curve), intent(in) :: this + integer, intent(in) :: n + real(rk) :: Wc + + if (allocated(this%Wc)) then + Wc = this%Wc(n) + else + error stop 'The NURBS curve is not rational or weights are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xt(this) result(Xt) + class(nurbs_curve), intent(in) :: this + real(rk), allocatable :: Xt(:) + + if (allocated(this%Xt)) then + Xt = this%Xt + else + error stop 'Parameter values are not set.' + end if + end function + !=============================================================================== + + !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function cmp_elem_Xg_vis(this, p) result(elemConn) - class(nurbs_curve), intent(in) :: this - integer, allocatable :: elemConn(:,:) - integer, intent(in), optional :: p + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_ng(this) result(ng) + class(nurbs_curve), intent(in) :: this + integer :: ng + + ng = this%ng + end function + !=============================================================================== - if (present(p)) then - elemConn = elemConn_C0(this%ng,p) - else - elemConn = elemConn_C0(this%ng,1) - end if - end function - !=============================================================================== - + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_degree(this) result(degree) + class(nurbs_curve), intent(in) :: this + integer :: degree + integer, allocatable :: m(:) - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - impure subroutine export_Xc(this, filename) - class(nurbs_curve), intent(in) :: this - character(len=*), intent(in) :: filename - integer :: i, nc, nunit - integer, allocatable :: elemConn(:,:) - - ! check - if (.not.allocated(this%Xc)) then - error stop 'Control points are not set.' - end if + m = this%get_multiplicity() + + degree = m(1) - 1 + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_knot_all(this) result(knot) + class(nurbs_curve), intent(in) :: this + real(rk), allocatable :: knot(:) - if (.not.allocated(this%elemConn_Xc_vis)) then - elemConn = this%cmp_elem_Xc_vis() + if (allocated(this%knot)) then + knot = this%knot else - elemConn = this%elemConn_Xc_vis + error stop 'Knot vector is not set.' end if - - nc = size(this%Xc, 1) + end function + !=============================================================================== - open(newunit=nunit, file=filename, action='write') - write(nunit,'(a)') '# vtk DataFile Version 2.0' - write(nunit,'(a)') 'Generated by ForCAD' - write(nunit,'(a)') 'ASCII' - write(nunit,'(a)') 'DATASET UNSTRUCTURED_GRID' - write(nunit,'(a," ",g0," ",a)') 'POINTS', nc, 'double' - - if (size(this%Xc, 2) == 2) then - write(nunit,'(g0," ",g0," ",g0)') (this%Xc(i,1), this%Xc(i,2), 0.0_rk , i = 1, nc) - elseif (size(this%Xc, 2) == 3) then - write(nunit,'(g0," ",g0," ",g0)') (this%Xc(i,1), this%Xc(i,2), this%Xc(i,3) , i = 1, nc) - else - error stop 'Invalid dimension of the control points.' - end if - - write(nunit,'(a," ",g0," ",g0)') 'CELLS', size(elemConn,1), size(elemConn,1)*(size(elemConn,2)+1) - write(nunit,'(g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0)')& - (2, elemConn(i,1)-1,elemConn(i,2)-1, i = 1, size(elemConn,1)) - - write(nunit,'(a," ",g0)') 'CELL_TYPES', size(elemConn,1) - write(nunit,'(g0)') (3 , i = 1, size(elemConn,1)) - close(nunit) - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - impure subroutine export_Xg(this, filename) - class(nurbs_curve), intent(in) :: this - character(len=*), intent(in) :: filename - integer :: i, ng, nunit - integer, allocatable :: elemConn(:,:) - - ! check - if (.not.allocated(this%Xg)) then - error stop 'Geometry points are not set.' - end if - - if (.not.allocated(this%elemConn_Xg_vis)) then - elemConn = this%cmp_elem_Xg_vis() - else - elemConn = this%elemConn_Xg_vis - end if - - ng = size(this%Xg, 1) - - open(newunit=nunit, file=filename, action='write') - write(nunit,'(a)') '# vtk DataFile Version 2.0' - write(nunit,'(a)') 'Generated by ForCAD' - write(nunit,'(a)') 'ASCII' - write(nunit,'(a)') 'DATASET UNSTRUCTURED_GRID' - write(nunit,'(a," ",g0," ",a)') 'POINTS', ng, 'double' + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_knoti(this,i) result(knot) + class(nurbs_curve), intent(in) :: this + integer, intent(in) :: i + real(rk) :: knot + + if (allocated(this%knot)) then + if (i < 1 .or. i > size(this%knot)) then + error stop 'Invalid index for knot vector.' + else + knot = this%knot(i) + end if + else + error stop 'Knot vector is not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine finalize(this) + class(nurbs_curve), intent(inout) :: this + if (allocated(this%Xc)) deallocate(this%Xc) + if (allocated(this%Xg)) deallocate(this%Xg) + if (allocated(this%Wc)) deallocate(this%Wc) + if (allocated(this%Xt)) deallocate(this%Xt) + if (allocated(this%knot)) deallocate(this%knot) + if (allocated(this%elemConn_Xc_vis)) deallocate(this%elemConn_Xc_vis) + if (allocated(this%elemConn_Xg_vis)) deallocate(this%elemConn_Xg_vis) + if (allocated(this%elemConn)) deallocate(this%elemConn) + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function cmp_elem_Xc_vis(this, p) result(elemConn) + class(nurbs_curve), intent(in) :: this + integer, allocatable :: elemConn(:,:) + integer, intent(in), optional :: p + + if (present(p)) then + elemConn = elemConn_C0(this%nc,p) + else + elemConn = elemConn_C0(this%nc,1) + end if + end function + !=============================================================================== - if (size(this%Xg, 2) == 2) then - write(nunit,'(g0," ",g0," ",g0)') (this%Xg(i,1), this%Xg(i,2), 0.0_rk , i = 1, ng) - elseif (size(this%Xg, 2) == 3) then - write(nunit,'(g0," ",g0," ",g0)') (this%Xg(i,1), this%Xg(i,2), this%Xg(i,3) , i = 1, ng) - else - error stop 'Invalid dimension of the geometry points.' - end if - - write(nunit,'(a," ",g0," ",g0)') 'CELLS', size(elemConn,1), size(elemConn,1)*(size(elemConn,2)+1) - write(nunit,'(g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0)')& - (2, elemConn(i,1)-1,elemConn(i,2)-1, i = 1, size(elemConn,1)) - - write(nunit,'(a," ",g0)') 'CELL_TYPES', size(elemConn,1) - write(nunit,'(g0)') (3 , i = 1, size(elemConn,1)) - close(nunit) - end subroutine - !=============================================================================== + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function cmp_elem_Xg_vis(this, p) result(elemConn) + class(nurbs_curve), intent(in) :: this + integer, allocatable :: elemConn(:,:) + integer, intent(in), optional :: p + + if (present(p)) then + elemConn = elemConn_C0(this%ng,p) + else + elemConn = elemConn_C0(this%ng,1) + end if + end function + !=============================================================================== + - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine modify_Xc(this,X,num,dir) - class(nurbs_curve), intent(inout) :: this - real(rk), intent(in) :: X - integer, intent(in) :: num - integer, intent(in) :: dir - - if (allocated(this%Xc)) then - this%Xc(num,dir) = X - call this%set(knot = this%knot, Xc = this%Xc, Wc = this%Wc) - else - error stop 'Control points are not set.' - end if - end subroutine - !=============================================================================== - + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + impure subroutine export_Xc(this, filename) + class(nurbs_curve), intent(in) :: this + character(len=*), intent(in) :: filename + integer :: i, nc, nunit + integer, allocatable :: elemConn(:,:) + + ! check + if (.not.allocated(this%Xc)) then + error stop 'Control points are not set.' + end if + + if (.not.allocated(this%elemConn_Xc_vis)) then + elemConn = this%cmp_elem_Xc_vis() + else + elemConn = this%elemConn_Xc_vis + end if - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine modify_Wc(this,W,num) - class(nurbs_curve), intent(inout) :: this - real(rk), intent(in) :: W - integer, intent(in) :: num - real(rk), allocatable :: knot(:), Xc(:,:), Wc(:) + nc = size(this%Xc, 1) + + open(newunit=nunit, file=filename, action='write') + write(nunit,'(a)') '# vtk DataFile Version 2.0' + write(nunit,'(a)') 'Generated by ForCAD' + write(nunit,'(a)') 'ASCII' + write(nunit,'(a)') 'DATASET UNSTRUCTURED_GRID' + write(nunit,'(a," ",g0," ",a)') 'POINTS', nc, 'double' - if (allocated(this%Wc)) then - this%Wc(num) = W - Xc = this%Xc - Wc = this%Wc - if (allocated(this%knot)) then - knot = this%knot - call this%set(knot = knot, Xc = Xc, Wc = Wc) - else - call this%set(Xc = Xc, Wc = Wc) - end if - else - error stop 'The NURBS curve is not rational.' - end if - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_multiplicity(this) result(m) - class(nurbs_curve), intent(in) :: this - integer, allocatable :: m(:) - - ! check - if (.not.allocated(this%knot)) then - error stop 'Knot vector is not set.' - else - m = compute_multiplicity(this%knot) - end if - end function - !=============================================================================== + if (size(this%Xc, 2) == 2) then + write(nunit,'(g0," ",g0," ",g0)') (this%Xc(i,1), this%Xc(i,2), 0.0_rk , i = 1, nc) + elseif (size(this%Xc, 2) == 3) then + write(nunit,'(g0," ",g0," ",g0)') (this%Xc(i,1), this%Xc(i,2), this%Xc(i,3) , i = 1, nc) + else + error stop 'Invalid dimension of the control points.' + end if + + write(nunit,'(a," ",g0," ",g0)') 'CELLS', size(elemConn,1), size(elemConn,1)*(size(elemConn,2)+1) + write(nunit,'(g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0)')& + (2, elemConn(i,1)-1,elemConn(i,2)-1, i = 1, size(elemConn,1)) + + write(nunit,'(a," ",g0)') 'CELL_TYPES', size(elemConn,1) + write(nunit,'(g0)') (3 , i = 1, size(elemConn,1)) + close(nunit) + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + impure subroutine export_Xg(this, filename) + class(nurbs_curve), intent(in) :: this + character(len=*), intent(in) :: filename + integer :: i, ng, nunit + integer, allocatable :: elemConn(:,:) + + ! check + if (.not.allocated(this%Xg)) then + error stop 'Geometry points are not set.' + end if - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_continuity(this) result(c) - class(nurbs_curve), intent(in) :: this - integer, allocatable :: c(:) + if (.not.allocated(this%elemConn_Xg_vis)) then + elemConn = this%cmp_elem_Xg_vis() + else + elemConn = this%elemConn_Xg_vis + end if + + ng = size(this%Xg, 1) - ! check - if (.not.allocated(this%knot)) then - error stop 'Knot vector is not set.' - else - c = this%degree - compute_multiplicity(this%knot) - end if - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_nc(this) result(nc) - class(nurbs_curve), intent(in) :: this - integer :: nc - - nc = sum(compute_multiplicity(this%knot)) - this%degree - 1 - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine insert_knots(this,Xth,r) - class(nurbs_curve), intent(inout) :: this - real(rk), intent(in), contiguous :: Xth(:) - integer, intent(in), contiguous :: r(:) - integer :: k, i, s, dim, j, n_new - real(rk), allocatable :: Xcw(:,:), Xcw_new(:,:), Xc_new(:,:), Wc_new(:), knot_new(:) - - if (this%is_rational()) then ! NURBS - - do i = 1, size(Xth) - k = findspan(this%nc-1,this%degree,Xth(i),this%knot) - if (this%knot(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot,Xth(i)) - else - s = 0 - end if - - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) + open(newunit=nunit, file=filename, action='write') + write(nunit,'(a)') '# vtk DataFile Version 2.0' + write(nunit,'(a)') 'Generated by ForCAD' + write(nunit,'(a)') 'ASCII' + write(nunit,'(a)') 'DATASET UNSTRUCTURED_GRID' + write(nunit,'(a," ",g0," ",a)') 'POINTS', ng, 'double' + + if (size(this%Xg, 2) == 2) then + write(nunit,'(g0," ",g0," ",g0)') (this%Xg(i,1), this%Xg(i,2), 0.0_rk , i = 1, ng) + elseif (size(this%Xg, 2) == 3) then + write(nunit,'(g0," ",g0," ",g0)') (this%Xg(i,1), this%Xg(i,2), this%Xg(i,3) , i = 1, ng) + else + error stop 'Invalid dimension of the geometry points.' + end if + + write(nunit,'(a," ",g0," ",g0)') 'CELLS', size(elemConn,1), size(elemConn,1)*(size(elemConn,2)+1) + write(nunit,'(g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0)')& + (2, elemConn(i,1)-1,elemConn(i,2)-1, i = 1, size(elemConn,1)) + + write(nunit,'(a," ",g0)') 'CELL_TYPES', size(elemConn,1) + write(nunit,'(g0)') (3 , i = 1, size(elemConn,1)) + close(nunit) + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine modify_Xc(this,X,num,dir) + class(nurbs_curve), intent(inout) :: this + real(rk), intent(in) :: X + integer, intent(in) :: num + integer, intent(in) :: dir + + if (allocated(this%Xc)) then + this%Xc(num,dir) = X + call this%set(knot = this%knot, Xc = this%Xc, Wc = this%Wc) + else + error stop 'Control points are not set.' + end if + end subroutine + !=============================================================================== + - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do - Xcw(:,dim+1) = this%Wc(:) - - call insert_knot_A_5_1(& - this%degree,& - this%knot,& - Xcw,& - Xth(i),& - k,& - s,& - r(i),& - n_new,& - knot_new,& - Xcw_new) - - allocate(Xc_new(1:n_new+1,1:dim)) - allocate(Wc_new(1:n_new+1)) - do j = 1, n_new+1 - Xc_new(j,1:dim) = Xcw_new(j-1,1:dim)/Xcw_new(j-1,dim+1) - Wc_new(j) = Xcw_new(j-1,dim+1) - end do - - call this%set(knot=knot_new, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw, Xcw_new, Xc_new, Wc_new) - end do - - else ! B-Spline - - do i = 1, size(Xth) - k = findspan(this%nc-1,this%degree,Xth(i),this%knot) - if (this%knot(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot,Xth(i)) - else - s = 0 - end if - - call insert_knot_A_5_1(& - this%degree,& - this%knot,& - this%Xc,& - Xth(i),& - k,& - s,& - r(i),& - n_new,& - knot_new,& - Xc_new) + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine modify_Wc(this,W,num) + class(nurbs_curve), intent(inout) :: this + real(rk), intent(in) :: W + integer, intent(in) :: num + real(rk), allocatable :: knot(:), Xc(:,:), Wc(:) + + if (allocated(this%Wc)) then + this%Wc(num) = W + Xc = this%Xc + Wc = this%Wc + if (allocated(this%knot)) then + knot = this%knot + call this%set(knot = knot, Xc = Xc, Wc = Wc) + else + call this%set(Xc = Xc, Wc = Wc) + end if + else + error stop 'The NURBS curve is not rational.' + end if + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_multiplicity(this) result(m) + class(nurbs_curve), intent(in) :: this + integer, allocatable :: m(:) + + ! check + if (.not.allocated(this%knot)) then + error stop 'Knot vector is not set.' + else + m = compute_multiplicity(this%knot) + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_continuity(this) result(c) + class(nurbs_curve), intent(in) :: this + integer, allocatable :: c(:) - call this%set(knot=knot_new, Xc=Xc_new) - end do - - end if - - end subroutine - !=============================================================================== - + ! check + if (.not.allocated(this%knot)) then + error stop 'Knot vector is not set.' + else + c = this%degree - compute_multiplicity(this%knot) + end if + end function + !=============================================================================== - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine elevate_degree(this, t) - class(nurbs_curve), intent(inout) :: this - integer, intent(in) :: t - real(rk), allocatable :: Xcw(:,:), Xcw_new(:,:), knot_new(:), Xc_new(:,:), Wc_new(:) - integer :: dim, j, nc_new - - if (this%is_rational()) then ! NURBS - - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - Xcw(j,dim+1) = this%Wc(j) - end do - - call elevate_degree_A_5_9(t, this%knot, this%degree, Xcw, nc_new, knot_new, Xcw_new) - - allocate(Xc_new(1:nc_new,1:dim)) - allocate(Wc_new(1:nc_new)) - do j = 1, nc_new - Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do - Wc_new(:) = Xcw_new(:,dim+1) - - call this%set(knot=knot_new, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw, Xcw_new, Xc_new, Wc_new) - - else ! B-Spline - - dim = size(this%Xc,2) - - call elevate_degree_A_5_9(t, this%knot, this%degree, this%Xc, nc_new, knot_new, Xc_new) + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_nc(this) result(nc) + class(nurbs_curve), intent(in) :: this + integer :: nc + + nc = sum(compute_multiplicity(this%knot)) - this%degree - 1 + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine insert_knots(this,Xth,r) + class(nurbs_curve), intent(inout) :: this + real(rk), intent(in), contiguous :: Xth(:) + integer, intent(in), contiguous :: r(:) + integer :: k, i, s, dim, j, n_new + real(rk), allocatable :: Xcw(:,:), Xcw_new(:,:), Xc_new(:,:), Wc_new(:), knot_new(:) + + if (this%is_rational()) then ! NURBS + + do i = 1, size(Xth) + k = findspan(this%nc-1,this%degree,Xth(i),this%knot) + if (this%knot(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot,Xth(i)) + else + s = 0 + end if + + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) - call this%set(knot=knot_new, Xc=Xc_new) - deallocate(Xc_new) - - end if + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do + Xcw(:,dim+1) = this%Wc(:) - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine derivative(this, res, Xt, dTgc) - class(nurbs_curve), intent(inout) :: this - integer, intent(in), optional :: res - real(rk), intent(in), contiguous, optional :: Xt(:) - real(rk), allocatable, intent(out) :: dTgc(:,:) - real(rk), allocatable :: dTgci(:) - integer :: i - - ! Set parameter values - if (present(Xt)) then - if (allocated(this%Xt)) deallocate(this%Xt) - this%Xt = Xt - elseif (present(res)) then - if (allocated(this%Xt)) deallocate(this%Xt) - allocate(this%Xt(res)) - this%Xt = [(real(i-1, rk) / real(res-1, rk), i=1, res)] - ! else - ! this%Xt = this%Xt - end if - - allocate(dTgc(size(this%Xt, 1), this%nc)) - - if (this%is_rational()) then ! NURBS - do i = 1, size(this%Xt, 1) - dTgci = basis_bspline_der(this%Xt(i), this%knot, this%nc, this%degree) - dTgci = dTgci*(this%Wc/(dot_product(dTgci,this%Wc))) - dTgc(i,:) = dTgci - end do - else ! B-Spline - do i = 1, size(this%Xt, 1) - dTgci = basis_bspline_der(this%Xt(i), this%knot, this%nc, this%degree) - dTgc(i,:) = dTgci - end do - end if - end subroutine - !=============================================================================== - + call insert_knot_A_5_1(& + this%degree,& + this%knot,& + Xcw,& + Xth(i),& + k,& + s,& + r(i),& + n_new,& + knot_new,& + Xcw_new) + + allocate(Xc_new(1:n_new+1,1:dim)) + allocate(Wc_new(1:n_new+1)) + do j = 1, n_new+1 + Xc_new(j,1:dim) = Xcw_new(j-1,1:dim)/Xcw_new(j-1,dim+1) + Wc_new(j) = Xcw_new(j-1,dim+1) + end do + + call this%set(knot=knot_new, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw, Xcw_new, Xc_new, Wc_new) + end do + + else ! B-Spline + + do i = 1, size(Xth) + k = findspan(this%nc-1,this%degree,Xth(i),this%knot) + if (this%knot(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot,Xth(i)) + else + s = 0 + end if + + call insert_knot_A_5_1(& + this%degree,& + this%knot,& + this%Xc,& + Xth(i),& + k,& + s,& + r(i),& + n_new,& + knot_new,& + Xc_new) - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine basis(this, res, Xt, Tgc) - class(nurbs_curve), intent(inout) :: this - integer, intent(in), optional :: res - real(rk), intent(in), contiguous, optional :: Xt(:) - real(rk), allocatable, intent(out) :: Tgc(:,:) - real(rk), allocatable :: Tgci(:) - integer :: i - - ! Set parameter values - if (present(Xt)) then - if (allocated(this%Xt)) deallocate(this%Xt) - this%Xt = Xt - elseif (present(res)) then - if (allocated(this%Xt)) deallocate(this%Xt) - allocate(this%Xt(res)) - this%Xt = [(real(i-1, rk) / real(res-1, rk), i=1, res)] - ! else - ! this%Xt = this%Xt - end if - - allocate(Tgc(size(this%Xt, 1), this%nc)) - - if (this%is_rational()) then ! NURBS - do i = 1, size(this%Xt, 1) - Tgci = basis_bspline(this%Xt(i), this%knot, this%nc, this%degree) - Tgci = Tgci*(this%Wc/(dot_product(Tgci,this%Wc))) - Tgc(i,:) = Tgci - end do - else ! B-Spline - do i = 1, size(this%Xt, 1) - Tgci = basis_bspline(this%Xt(i), this%knot, this%nc, this%degree) - Tgc(i,:) = Tgci - end do - end if - end subroutine - !=============================================================================== - + call this%set(knot=knot_new, Xc=Xc_new) + end do + + end if + + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine elevate_degree(this, t) + class(nurbs_curve), intent(inout) :: this + integer, intent(in) :: t + real(rk), allocatable :: Xcw(:,:), Xcw_new(:,:), knot_new(:), Xc_new(:,:), Wc_new(:) + integer :: dim, j, nc_new + + if (this%is_rational()) then ! NURBS + + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + Xcw(j,dim+1) = this%Wc(j) + end do + + call elevate_degree_A_5_9(t, this%knot, this%degree, Xcw, nc_new, knot_new, Xcw_new) + + allocate(Xc_new(1:nc_new,1:dim)) + allocate(Wc_new(1:nc_new)) + do j = 1, nc_new + Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do + Wc_new(:) = Xcw_new(:,dim+1) + + call this%set(knot=knot_new, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw, Xcw_new, Xc_new, Wc_new) + + else ! B-Spline - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function is_rational(this) result(r) - class(nurbs_curve), intent(in) :: this - logical :: r + dim = size(this%Xc,2) + + call elevate_degree_A_5_9(t, this%knot, this%degree, this%Xc, nc_new, knot_new, Xc_new) + + call this%set(knot=knot_new, Xc=Xc_new) + deallocate(Xc_new) - r = .false. - if (allocated(this%Wc)) then - if (any(this%Wc /= this%Wc(1))) then - r = .true. - end if - end if - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine set_elem_Xc_vis(this, elemConn) - class(nurbs_curve), intent(inout) :: this - integer, intent(in), contiguous :: elemConn(:,:) + end if + + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine derivative(this, res, Xt, dTgc) + class(nurbs_curve), intent(inout) :: this + integer, intent(in), optional :: res + real(rk), intent(in), contiguous, optional :: Xt(:) + real(rk), allocatable, intent(out) :: dTgc(:,:) + real(rk), allocatable :: dTgci(:) + integer :: i - if (allocated(this%elemConn_Xc_vis)) deallocate(this%elemConn_Xc_vis) - this%elemConn_Xc_vis = elemConn - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine set_elem_Xg_vis(this, elemConn) - class(nurbs_curve), intent(inout) :: this - integer, intent(in), contiguous :: elemConn(:,:) - - if (allocated(this%elemConn_Xg_vis)) deallocate(this%elemConn_Xg_vis) - this%elemConn_Xg_vis = elemConn - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine set_elem(this, elemConn) - class(nurbs_curve), intent(inout) :: this - integer, intent(in), contiguous :: elemConn(:,:) - - if (allocated(this%elemConn)) deallocate(this%elemConn) - this%elemConn = elemConn - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_elem_Xc_vis(this) result(elemConn) - class(nurbs_curve), intent(in) :: this - integer, allocatable :: elemConn(:,:) - - elemConn = this%elemConn_Xc_vis - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_elem_Xg_vis(this) result(elemConn) - class(nurbs_curve), intent(in) :: this - integer, allocatable :: elemConn(:,:) - - elemConn = this%elemConn_Xg_vis - end function - !=============================================================================== + ! Set parameter values + if (present(Xt)) then + if (allocated(this%Xt)) deallocate(this%Xt) + this%Xt = Xt + elseif (present(res)) then + if (allocated(this%Xt)) deallocate(this%Xt) + allocate(this%Xt(res)) + this%Xt = [(real(i-1, rk) / real(res-1, rk), i=1, res)] + ! else + ! this%Xt = this%Xt + end if + + allocate(dTgc(size(this%Xt, 1), this%nc)) + + if (this%is_rational()) then ! NURBS + do i = 1, size(this%Xt, 1) + dTgci = basis_bspline_der(this%Xt(i), this%knot, this%nc, this%degree) + dTgci = dTgci*(this%Wc/(dot_product(dTgci,this%Wc))) + dTgc(i,:) = dTgci + end do + else ! B-Spline + do i = 1, size(this%Xt, 1) + dTgci = basis_bspline_der(this%Xt(i), this%knot, this%nc, this%degree) + dTgc(i,:) = dTgci + end do + end if + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine basis(this, res, Xt, Tgc) + class(nurbs_curve), intent(inout) :: this + integer, intent(in), optional :: res + real(rk), intent(in), contiguous, optional :: Xt(:) + real(rk), allocatable, intent(out) :: Tgc(:,:) + real(rk), allocatable :: Tgci(:) + integer :: i + + ! Set parameter values + if (present(Xt)) then + if (allocated(this%Xt)) deallocate(this%Xt) + this%Xt = Xt + elseif (present(res)) then + if (allocated(this%Xt)) deallocate(this%Xt) + allocate(this%Xt(res)) + this%Xt = [(real(i-1, rk) / real(res-1, rk), i=1, res)] + ! else + ! this%Xt = this%Xt + end if + + allocate(Tgc(size(this%Xt, 1), this%nc)) - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_elem(this) result(elemConn) - class(nurbs_curve), intent(in) :: this - integer, allocatable :: elemConn(:,:) - - elemConn = this%elemConn - end function - !=============================================================================== - - + if (this%is_rational()) then ! NURBS + do i = 1, size(this%Xt, 1) + Tgci = basis_bspline(this%Xt(i), this%knot, this%nc, this%degree) + Tgci = Tgci*(this%Wc/(dot_product(Tgci,this%Wc))) + Tgc(i,:) = Tgci + end do + else ! B-Spline + do i = 1, size(this%Xt, 1) + Tgci = basis_bspline(this%Xt(i), this%knot, this%nc, this%degree) + Tgc(i,:) = Tgci + end do + end if + end subroutine !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine remove_knots(this,Xth,r) - class(nurbs_curve), intent(inout) :: this - real(rk), intent(in), contiguous :: Xth(:) - integer, intent(in), contiguous :: r(:) - integer :: k, i, s, dim, j, nc_new, t - real(rk), allocatable :: Xcw(:,:), Xcw_new(:,:), Xc_new(:,:), Wc_new(:), knot_new(:) + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function is_rational(this) result(r) + class(nurbs_curve), intent(in) :: this + logical :: r - if (this%is_rational()) then ! NURBS - - do i = 1, size(Xth) - k = findspan(this%nc-1,this%degree,Xth(i),this%knot) - if (this%knot(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot,Xth(i)) - else - s = 0 - end if - k = k + 1 - - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do - Xcw(:,dim+1) = this%Wc(:) - - call remove_knots_A_5_8(& - this%degree,& - this%knot,& - Xcw,& - Xth(i),& - k,& - s,& - r(i),& - t,& - knot_new,& - Xcw_new) + r = .false. + if (allocated(this%Wc)) then + if (any(this%Wc /= this%Wc(1))) then + r = .true. + end if + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine set_elem_Xc_vis(this, elemConn) + class(nurbs_curve), intent(inout) :: this + integer, intent(in), contiguous :: elemConn(:,:) + + if (allocated(this%elemConn_Xc_vis)) deallocate(this%elemConn_Xc_vis) + this%elemConn_Xc_vis = elemConn + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine set_elem_Xg_vis(this, elemConn) + class(nurbs_curve), intent(inout) :: this + integer, intent(in), contiguous :: elemConn(:,:) - if (allocated(Xcw)) deallocate(Xcw) - - if (t == 0) then - ! no change - else - nc_new = size(Xcw_new,1) - allocate(Xc_new(nc_new,dim)) - allocate(Wc_new(nc_new)) - do j = 1, nc_new - Xc_new(j,:) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do - Wc_new(:) = Xcw_new(:,dim+1) + if (allocated(this%elemConn_Xg_vis)) deallocate(this%elemConn_Xg_vis) + this%elemConn_Xg_vis = elemConn + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine set_elem(this, elemConn) + class(nurbs_curve), intent(inout) :: this + integer, intent(in), contiguous :: elemConn(:,:) - call this%set(knot=knot_new, Xc=Xc_new, Wc=Wc_new) - if (allocated(Xcw_new)) deallocate(Xcw_new) - if (allocated(Xc_new)) deallocate(Xc_new) - if (allocated(Wc_new)) deallocate(Wc_new) - end if - end do - - else ! B-Spline - - do i = 1, size(Xth) - k = findspan(this%nc-1,this%degree,Xth(i),this%knot) - if (this%knot(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot,Xth(i)) - else - s = 0 - end if - k = k + 1 + if (allocated(this%elemConn)) deallocate(this%elemConn) + this%elemConn = elemConn + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_elem_Xc_vis(this) result(elemConn) + class(nurbs_curve), intent(in) :: this + integer, allocatable :: elemConn(:,:) + + elemConn = this%elemConn_Xc_vis + end function + !=============================================================================== + - call remove_knots_A_5_8(& - this%degree,& - this%knot,& - this%Xc,& - Xth(i),& - k,& - s,& - r(i),& - t,& - knot_new,& - Xc_new) + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_elem_Xg_vis(this) result(elemConn) + class(nurbs_curve), intent(in) :: this + integer, allocatable :: elemConn(:,:) + + elemConn = this%elemConn_Xg_vis + end function + !=============================================================================== + - if (t == 0) then - ! no change - else - call this%set(knot=knot_new, Xc=Xc_new) - end if - end do + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_elem(this) result(elemConn) + class(nurbs_curve), intent(in) :: this + integer, allocatable :: elemConn(:,:) - end if - - end subroutine - !=============================================================================== + elemConn = this%elemConn + end function + !=============================================================================== + - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine set_circle(this, center, radius) - class(nurbs_curve), intent(inout) :: this - real(rk), intent(in), contiguous :: center(:) - real(rk), intent(in) :: radius - real(rk), allocatable :: Xc(:,:), Wc(:), knot(:) - integer :: i - - ! Define control points for circle - allocate(Xc(7, 3)) - Xc(1,:)= [ 1.0_rk, 0.0_rk, 0.0_rk] - Xc(2,:)= [ 1.0_rk, sqrt(3.0_rk), 0.0_rk] - Xc(3,:)= [-0.5_rk, sqrt(3.0_rk)/2.0_rk, 0.0_rk] - Xc(4,:)= [-2.0_rk, 0.0_rk, 0.0_rk] - Xc(5,:)= [-0.5_rk, -sqrt(3.0_rk)/2.0_rk, 0.0_rk] - Xc(6,:)= [ 1.0_rk, -sqrt(3.0_rk), 0.0_rk] - Xc(7,:)= [ 1.0_rk, 0.0_rk, 0.0_rk] + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine remove_knots(this,Xth,r) + class(nurbs_curve), intent(inout) :: this + real(rk), intent(in), contiguous :: Xth(:) + integer, intent(in), contiguous :: r(:) + integer :: k, i, s, dim, j, nc_new, t + real(rk), allocatable :: Xcw(:,:), Xcw_new(:,:), Xc_new(:,:), Wc_new(:), knot_new(:) + + if (this%is_rational()) then ! NURBS + + do i = 1, size(Xth) + k = findspan(this%nc-1,this%degree,Xth(i),this%knot) + if (this%knot(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot,Xth(i)) + else + s = 0 + end if + k = k + 1 - ! Scale and translate the control points - do i = 1, size(Xc, 1) - Xc(i,:) = center + Xc(i,:) * radius - end do - - ! Define weights for the control points - Wc = [1.0_rk, 0.5_rk, 1.0_rk, 0.5_rk, 1.0_rk, 0.5_rk, 1.0_rk] - - ! Define knot vector - knot = [0.0_rk, 0.0_rk, 0.0_rk, 1.0_rk/3.0_rk, 1.0_rk/3.0_rk, 2.0_rk/3.0_rk, 2.0_rk/3.0_rk, 1.0_rk, 1.0_rk, 1.0_rk] - - ! Set knot vector, control points, and weights - call this%set(knot, Xc, Wc) - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function cmp_elem(this) result(elemConn) - class(nurbs_curve), intent(in) :: this - integer, allocatable :: elemConn(:,:) - - call elemConn_Cn(this%nc, this%degree, unique(this%knot), this%get_multiplicity(),& - elemConn) - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine rotate_Xc(this, alpha, beta, theta) - class(nurbs_curve), intent(inout) :: this - real(rk), intent(in) :: alpha, beta, theta - integer :: i - - do i = 1, this%nc - this%Xc(i, :) = matmul(rotation(alpha,beta,theta), this%Xc(i, :)) - end do - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine rotate_Xg(this, alpha, beta, theta) - class(nurbs_curve), intent(inout) :: this - real(rk), intent(in) :: alpha, beta, theta - integer :: i - - do i = 1, this%ng - this%Xg(i, :) = matmul(rotation(alpha,beta,theta), this%Xg(i, :)) - end do - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine translate_Xc(this, vec) - class(nurbs_curve), intent(inout) :: this - real(rk), intent(in) :: vec(:) - integer :: i - - do i = 1, this%nc - this%Xc(i, :) = this%Xc(i, :) + vec - end do + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do + Xcw(:,dim+1) = this%Wc(:) + + call remove_knots_A_5_8(& + this%degree,& + this%knot,& + Xcw,& + Xth(i),& + k,& + s,& + r(i),& + t,& + knot_new,& + Xcw_new) + + if (allocated(Xcw)) deallocate(Xcw) + + if (t == 0) then + ! no change + else + nc_new = size(Xcw_new,1) + allocate(Xc_new(nc_new,dim)) + allocate(Wc_new(nc_new)) + do j = 1, nc_new + Xc_new(j,:) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do + Wc_new(:) = Xcw_new(:,dim+1) + + call this%set(knot=knot_new, Xc=Xc_new, Wc=Wc_new) + if (allocated(Xcw_new)) deallocate(Xcw_new) + if (allocated(Xc_new)) deallocate(Xc_new) + if (allocated(Wc_new)) deallocate(Wc_new) + end if + end do + + else ! B-Spline + + do i = 1, size(Xth) + k = findspan(this%nc-1,this%degree,Xth(i),this%knot) + if (this%knot(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot,Xth(i)) + else + s = 0 + end if + k = k + 1 + + call remove_knots_A_5_8(& + this%degree,& + this%knot,& + this%Xc,& + Xth(i),& + k,& + s,& + r(i),& + t,& + knot_new,& + Xc_new) + + if (t == 0) then + ! no change + else + call this%set(knot=knot_new, Xc=Xc_new) + end if + end do + + end if + end subroutine !=============================================================================== @@ -1574,138 +1574,233 @@

    Source Code

    !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause - pure subroutine translate_Xg(this, vec) + pure subroutine set_circle(this, center, radius) class(nurbs_curve), intent(inout) :: this - real(rk), intent(in) :: vec(:) - integer :: i - - do i = 1, this%nc - this%Xg(i, :) = this%Xg(i, :) + vec - end do - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) - class(nurbs_curve), intent(inout) :: this - character(len=*), intent(in) :: vtkfile_Xc, vtkfile_Xg - character(len=3000) :: pyvista_script - - pyvista_script = & - "import pyvista as pv"//achar(10)//& - "pv.global_theme.color = 'white'"//achar(10)//& - "Xc = pv.read('"//trim(vtkfile_Xc)//"')"//achar(10)//& - "Xg = pv.read('"//trim(vtkfile_Xg)//"')"//achar(10)//& - "p = pv.Plotter(lighting='light kit')"//achar(10)//& - "actor_Xcp = p.add_mesh("//achar(10)//& - " Xc,"//achar(10)//& - " style='points',"//achar(10)//& - " point_size=10,"//achar(10)//& - " color='red',"//achar(10)//& - " render_points_as_spheres=True,"//achar(10)//& - " opacity=0.5,"//achar(10)//& - ")"//achar(10)//& - "actor_Xcw = p.add_mesh("//achar(10)//& - " Xc,"//achar(10)//& - " show_edges=True,"//achar(10)//& - " color='yellow',"//achar(10)//& - " line_width=3,"//achar(10)//& - " style='wireframe',"//achar(10)//& - " opacity=0.2"//achar(10)//& - ")"//achar(10)//& - "actor_Xg = p.add_mesh("//achar(10)//& - " Xg,"//achar(10)//& - " show_edges=False,"//achar(10)//& - " color='cyan',"//achar(10)//& - " line_width=7,"//achar(10)//& - " metallic=0.6,"//achar(10)//& - " pbr=True,"//achar(10)//& - " split_sharp_edges=True,"//achar(10)//& - ")"//achar(10)//& - "p.add_axes(interactive=False)"//achar(10)//& - "def point_picker_callback(point):"//achar(10)//& - " mesh = Xc"//achar(10)//& - " point_id = mesh.find_closest_point(point)"//achar(10)//& - " point_coords = mesh.points[point_id]"//achar(10)//& - " label = f'ID: {point_id + 1}\n({point_coords[0]:.3f}, {point_coords[1]:.3f}, {point_coords[2]:.3f})'"//achar(10)//& - " p.add_point_labels("//achar(10)//& - " [point_coords],"//achar(10)//& - " [label],"//achar(10)//& - " font_size=14,"//achar(10)//& - " text_color='black',"//achar(10)//& - " show_points=False,"//achar(10)//& - " fill_shape=False,"//achar(10)//& - " shape=None,"//achar(10)//& - " )"//achar(10)//& - "picker = p.enable_point_picking(callback=point_picker_callback, show_message=False)"//achar(10)//& - "window_size = p.window_size"//achar(10)//& - "y_pos = window_size[1]"//achar(10)//& - "def Xcp_toggle_vis(flag):"//achar(10)//& - " actor_Xcp.SetVisibility(flag)"//achar(10)//& - "def Xcw_toggle_vis(flag):"//achar(10)//& - " actor_Xcw.SetVisibility(flag)"//achar(10)//& - "def Xg_toggle_vis(flag):"//achar(10)//& - " actor_Xg.SetVisibility(flag)"//achar(10)//& - "p.add_checkbox_button_widget("//achar(10)//& - " Xcp_toggle_vis,"//achar(10)//& - " value=True,"//achar(10)//& - " color_on='red',"//achar(10)//& - " size=25,"//achar(10)//& - " position=(0, y_pos - 1 * 25),"//achar(10)//& - ")"//achar(10)//& - "p.add_checkbox_button_widget("//achar(10)//& - " Xcw_toggle_vis,"//achar(10)//& - " value=True,"//achar(10)//& - " color_on='yellow',"//achar(10)//& - " size=25,"//achar(10)//& - " position=(0, y_pos - 2 * 25),"//achar(10)//& - ")"//achar(10)//& - "p.add_checkbox_button_widget("//achar(10)//& - " Xg_toggle_vis,"//achar(10)//& - " value=True,"//achar(10)//& - " color_on='cyan',"//achar(10)//& - " size=25,"//achar(10)//& - " position=(0, y_pos - 3 * 25),"//achar(10)//& - ")"//achar(10)//& - "p.add_text("//achar(10)//& - " 'Xc (Points)',"//achar(10)//& - " position=(25 + 3, y_pos - 1 * 25),"//achar(10)//& - " font_size=8,"//achar(10)//& - " color='black',"//achar(10)//& - " font='times',"//achar(10)//& - ")"//achar(10)//& - "p.add_text("//achar(10)//& - " 'Xc (Control geometry)',"//achar(10)//& - " position=(25 + 3, y_pos - 2 * 25),"//achar(10)//& - " font_size=8,"//achar(10)//& - " color='black',"//achar(10)//& - " font='times',"//achar(10)//& - ")"//achar(10)//& - "p.add_text("//achar(10)//& - " 'Xg (Geometry)',"//achar(10)//& - " position=(25 + 3, y_pos - 3 * 25),"//achar(10)//& - " font_size=8,"//achar(10)//& - " color='black',"//achar(10)//& - " font='times',"//achar(10)//& - ")"//achar(10)//& - "p.add_text('ForCAD', position=(0.0, 10.0), font_size=14, color='black', font='times')"//achar(10)//& - "p.add_text("//achar(10)//& - " 'https://github.com/gha3mi/forcad',"//achar(10)//& - " position=(0.0, 0.0),"//achar(10)//& - " font_size=7,"//achar(10)//& - " color='blue',"//achar(10)//& - " font='times',"//achar(10)//& - ")"//achar(10)//& - "p.show(title='ForCAD', interactive=True)" - - call execute_command_line('python -c "'//trim(adjustl(pyvista_script))//'"') - end subroutine - !=============================================================================== - -end module forcad_nurbs_curve + real(rk), intent(in), contiguous :: center(:) + real(rk), intent(in) :: radius + real(rk), allocatable :: Xc(:,:), Wc(:), knot(:) + integer :: i + + ! Define control points for circle + allocate(Xc(7, 3)) + Xc(1,:)= [ 1.0_rk, 0.0_rk, 0.0_rk] + Xc(2,:)= [ 1.0_rk, sqrt(3.0_rk), 0.0_rk] + Xc(3,:)= [-0.5_rk, sqrt(3.0_rk)/2.0_rk, 0.0_rk] + Xc(4,:)= [-2.0_rk, 0.0_rk, 0.0_rk] + Xc(5,:)= [-0.5_rk, -sqrt(3.0_rk)/2.0_rk, 0.0_rk] + Xc(6,:)= [ 1.0_rk, -sqrt(3.0_rk), 0.0_rk] + Xc(7,:)= [ 1.0_rk, 0.0_rk, 0.0_rk] + + ! Scale and translate the control points + do i = 1, size(Xc, 1) + Xc(i,:) = center + Xc(i,:) * radius + end do + + ! Define weights for the control points + Wc = [1.0_rk, 0.5_rk, 1.0_rk, 0.5_rk, 1.0_rk, 0.5_rk, 1.0_rk] + + ! Define knot vector + knot = [0.0_rk, 0.0_rk, 0.0_rk, 1.0_rk/3.0_rk, 1.0_rk/3.0_rk, 2.0_rk/3.0_rk, 2.0_rk/3.0_rk, 1.0_rk, 1.0_rk, 1.0_rk] + + ! Set knot vector, control points, and weights + call this%set(knot, Xc, Wc) + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function cmp_elem(this) result(elemConn) + class(nurbs_curve), intent(in) :: this + integer, allocatable :: elemConn(:,:) + + call elemConn_Cn(this%nc, this%degree, unique(this%knot), this%get_multiplicity(),& + elemConn) + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine rotate_Xc(this, alpha, beta, theta) + class(nurbs_curve), intent(inout) :: this + real(rk), intent(in) :: alpha, beta, theta + integer :: i + + do i = 1, this%nc + this%Xc(i, :) = matmul(rotation(alpha,beta,theta), this%Xc(i, :)) + end do + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine rotate_Xg(this, alpha, beta, theta) + class(nurbs_curve), intent(inout) :: this + real(rk), intent(in) :: alpha, beta, theta + integer :: i + + do i = 1, this%ng + this%Xg(i, :) = matmul(rotation(alpha,beta,theta), this%Xg(i, :)) + end do + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine translate_Xc(this, vec) + class(nurbs_curve), intent(inout) :: this + real(rk), intent(in) :: vec(:) + integer :: i + + do i = 1, this%nc + this%Xc(i, :) = this%Xc(i, :) + vec + end do + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine translate_Xg(this, vec) + class(nurbs_curve), intent(inout) :: this + real(rk), intent(in) :: vec(:) + integer :: i + + do i = 1, this%nc + this%Xg(i, :) = this%Xg(i, :) + vec + end do + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) + class(nurbs_curve), intent(inout) :: this + character(len=*), intent(in) :: vtkfile_Xc, vtkfile_Xg + character(len=3000) :: pyvista_script + + pyvista_script = & + "import pyvista as pv"//achar(10)//& + "pv.global_theme.color = 'white'"//achar(10)//& + "Xc = pv.read('"//trim(vtkfile_Xc)//"')"//achar(10)//& + "Xg = pv.read('"//trim(vtkfile_Xg)//"')"//achar(10)//& + "p = pv.Plotter(lighting='light kit')"//achar(10)//& + "actor_Xcp = p.add_mesh("//achar(10)//& + " Xc,"//achar(10)//& + " style='points',"//achar(10)//& + " point_size=10,"//achar(10)//& + " color='red',"//achar(10)//& + " render_points_as_spheres=True,"//achar(10)//& + " opacity=0.5,"//achar(10)//& + ")"//achar(10)//& + "actor_Xcw = p.add_mesh("//achar(10)//& + " Xc,"//achar(10)//& + " show_edges=True,"//achar(10)//& + " color='yellow',"//achar(10)//& + " line_width=3,"//achar(10)//& + " style='wireframe',"//achar(10)//& + " opacity=0.2"//achar(10)//& + ")"//achar(10)//& + "actor_Xg = p.add_mesh("//achar(10)//& + " Xg,"//achar(10)//& + " show_edges=False,"//achar(10)//& + " color='cyan',"//achar(10)//& + " line_width=7,"//achar(10)//& + " metallic=0.6,"//achar(10)//& + " pbr=True,"//achar(10)//& + " split_sharp_edges=True,"//achar(10)//& + ")"//achar(10)//& + "p.add_axes(interactive=False)"//achar(10)//& + "def point_picker_callback(point):"//achar(10)//& + " mesh = Xc"//achar(10)//& + " point_id = mesh.find_closest_point(point)"//achar(10)//& + " point_coords = mesh.points[point_id]"//achar(10)//& + " label = f'ID: {point_id + 1}\n({point_coords[0]:.3f}, {point_coords[1]:.3f}, {point_coords[2]:.3f})'"//achar(10)//& + " p.add_point_labels("//achar(10)//& + " [point_coords],"//achar(10)//& + " [label],"//achar(10)//& + " font_size=14,"//achar(10)//& + " text_color='black',"//achar(10)//& + " show_points=False,"//achar(10)//& + " fill_shape=False,"//achar(10)//& + " shape=None,"//achar(10)//& + " )"//achar(10)//& + "picker = p.enable_point_picking(callback=point_picker_callback, show_message=False)"//achar(10)//& + "window_size = p.window_size"//achar(10)//& + "y_pos = window_size[1]"//achar(10)//& + "def Xcp_toggle_vis(flag):"//achar(10)//& + " actor_Xcp.SetVisibility(flag)"//achar(10)//& + "def Xcw_toggle_vis(flag):"//achar(10)//& + " actor_Xcw.SetVisibility(flag)"//achar(10)//& + "def Xg_toggle_vis(flag):"//achar(10)//& + " actor_Xg.SetVisibility(flag)"//achar(10)//& + "p.add_checkbox_button_widget("//achar(10)//& + " Xcp_toggle_vis,"//achar(10)//& + " value=True,"//achar(10)//& + " color_on='red',"//achar(10)//& + " size=25,"//achar(10)//& + " position=(0, y_pos - 1 * 25),"//achar(10)//& + ")"//achar(10)//& + "p.add_checkbox_button_widget("//achar(10)//& + " Xcw_toggle_vis,"//achar(10)//& + " value=True,"//achar(10)//& + " color_on='yellow',"//achar(10)//& + " size=25,"//achar(10)//& + " position=(0, y_pos - 2 * 25),"//achar(10)//& + ")"//achar(10)//& + "p.add_checkbox_button_widget("//achar(10)//& + " Xg_toggle_vis,"//achar(10)//& + " value=True,"//achar(10)//& + " color_on='cyan',"//achar(10)//& + " size=25,"//achar(10)//& + " position=(0, y_pos - 3 * 25),"//achar(10)//& + ")"//achar(10)//& + "p.add_text("//achar(10)//& + " 'Xc (Points)',"//achar(10)//& + " position=(25 + 3, y_pos - 1 * 25),"//achar(10)//& + " font_size=8,"//achar(10)//& + " color='black',"//achar(10)//& + " font='times',"//achar(10)//& + ")"//achar(10)//& + "p.add_text("//achar(10)//& + " 'Xc (Control geometry)',"//achar(10)//& + " position=(25 + 3, y_pos - 2 * 25),"//achar(10)//& + " font_size=8,"//achar(10)//& + " color='black',"//achar(10)//& + " font='times',"//achar(10)//& + ")"//achar(10)//& + "p.add_text("//achar(10)//& + " 'Xg (Geometry)',"//achar(10)//& + " position=(25 + 3, y_pos - 3 * 25),"//achar(10)//& + " font_size=8,"//achar(10)//& + " color='black',"//achar(10)//& + " font='times',"//achar(10)//& + ")"//achar(10)//& + "p.add_text('ForCAD', position=(0.0, 10.0), font_size=14, color='black', font='times')"//achar(10)//& + "p.add_text("//achar(10)//& + " 'https://github.com/gha3mi/forcad',"//achar(10)//& + " position=(0.0, 0.0),"//achar(10)//& + " font_size=7,"//achar(10)//& + " color='blue',"//achar(10)//& + " font='times',"//achar(10)//& + ")"//achar(10)//& + "p.show(title='ForCAD', interactive=True)" + + call execute_command_line('python -c "'//trim(adjustl(pyvista_script))//'"') + end subroutine + !=============================================================================== + +end module forcad_nurbs_curve @@ -1727,7 +1822,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/sourcefile/forcad_nurbs_surface.f90.html b/sourcefile/forcad_nurbs_surface.f90.html index c29671be4..a2f931b4f 100644 --- a/sourcefile/forcad_nurbs_surface.f90.html +++ b/sourcefile/forcad_nurbs_surface.f90.html @@ -77,7 +77,7 @@

    forcad_nurbs_surface.f90
  • 1015 statements + title="24.8% of total for source files.">1075 statements
  • @@ -519,1700 +519,1795 @@

    Source Code

    procedure :: set3 !!> Set Bezier or Rational Bezier surface using control points and weights generic :: set => set1, set2, set3 !!> Set NURBS surface procedure :: create !!> Generate geometry points - procedure :: get_Xc !!> Get control points - procedure :: get_Xg !!> Get geometry points - procedure :: get_Wc !!> Get weights - procedure :: get_Xt !!> Get parameter values - procedure, private :: get_knot_all !!> Get all knot vectors - procedure, private :: get_knoti !!> Get i-th knot value - generic :: get_knot => get_knoti, get_knot_all !!> Get knot vector - procedure :: get_ng !!> Get number of geometry points - procedure, private :: get_degree_all!!> Get degree of the NURBS surface in both directions - procedure, private :: get_degree_dir!!> Get degree of the NURBS surface in a specific direction - generic :: get_degree => get_degree_all, get_degree_dir !!> Get degree of the NURBS surface - procedure :: finalize !!> Finalize the NURBS surface object - procedure :: cmp_elem_Xc_vis !!> Generate connectivity for control points - procedure :: cmp_elem_Xg_vis !!> Generate connectivity for geometry points - procedure :: cmp_elem !!> Generate IGA element connectivity - procedure :: get_elem_Xc_vis !!> Get connectivity for control points - procedure :: get_elem_Xg_vis !!> Get connectivity for geometry points - procedure :: get_elem !!> Get IGA element connectivity - procedure :: set_elem_Xc_vis !!> Set connectivity for control points - procedure :: set_elem_Xg_vis !!> Set connectivity for geometry points - procedure :: set_elem !!> Set IGA element connectivity - procedure :: export_Xc !!> Export control points to VTK file - procedure :: export_Xg !!> Export geometry points to VTK file - procedure :: modify_Xc !!> Modify control points - procedure :: modify_Wc !!> Modify weights - procedure :: get_multiplicity !!> Get multiplicity of the knot vector - procedure :: get_continuity !!> Get continuity of the surface - procedure :: get_nc !!> Get number of required control points - procedure :: derivative !!> Compute the derivative of the NURBS surface - procedure :: basis !!> Compute the basis functions of the NURBS surface - procedure :: insert_knots !!> Insert knots into the knot vector - procedure :: elevate_degree !!> Elevate degree - procedure :: is_rational !!> Check if the NURBS surface is rational - procedure :: remove_knots !!> Remove knots from the knot vector - procedure :: rotate_Xc !!> Rotate control points - procedure :: rotate_Xg !!> Rotate geometry points - procedure :: translate_Xc !!> Translate control points - procedure :: translate_Xg !!> Translate geometry points - procedure :: show !!> Show the NURBS object using PyVista - - ! Shapes - procedure :: set_tetragon !!> Set a tetragon - end type - !=============================================================================== - -contains - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - !> Set knot vectors, control points and weights for the NURBS surface object. - pure subroutine set1(this, knot1, knot2, Xc, Wc) - class(nurbs_surface), intent(inout) :: this - real(rk), intent(in), contiguous :: knot1(:) - real(rk), intent(in), contiguous :: knot2(:) - real(rk), intent(in), contiguous :: Xc(:,:) - real(rk), intent(in), contiguous, optional :: Wc(:) - - if (allocated(this%knot1)) deallocate(this%knot1) - if (allocated(this%knot2)) deallocate(this%knot2) - if (allocated(this%Xc)) deallocate(this%Xc) - - this%knot1 = knot1 - this%knot2 = knot2 - this%degree = this%get_degree() - this%nc(1) = this%get_nc(1) - this%nc(2) = this%get_nc(2) - this%Xc = Xc - if (present(Wc)) then - if (size(Wc) /= this%nc(1)*this%nc(2)) then - error stop 'Number of weights does not match the number of control points.' - else - if (allocated(this%Wc)) deallocate(this%Wc) - this%Wc = Wc - end if - end if - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - !> Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights - pure subroutine set2(this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc) - class(nurbs_surface), intent(inout) :: this - real(rk), intent(in), contiguous :: Xth_dir1(:), Xth_dir2(:) - integer, intent(in), contiguous :: degree(:) - integer, intent(in), contiguous :: continuity1(:), continuity2(:) - real(rk), intent(in), contiguous :: Xc(:,:) - real(rk), intent(in), contiguous, optional :: Wc(:) - - this%knot1 = compute_knot_vector(Xth_dir1, degree(1), continuity1) - this%knot2 = compute_knot_vector(Xth_dir2, degree(2), continuity2) - this%degree(1) = degree(1) - this%degree(2) = degree(2) - this%nc(1) = this%get_nc(1) - this%nc(2) = this%get_nc(2) - this%Xc = Xc - if (present(Wc)) this%Wc = Wc - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - !> Set Bezier or Rational Bezier surface using control points and weights. - pure subroutine set3(this, nc, Xc, Wc) - class(nurbs_surface), intent(inout) :: this - integer, intent(in), contiguous :: nc(:) - real(rk), intent(in), contiguous :: Xc(:,:) - real(rk), intent(in), contiguous, optional :: Wc(:) - - if (allocated(this%Xc)) deallocate(this%Xc) - - this%Xc = Xc - this%nc = nc - - if (allocated(this%knot1)) deallocate(this%knot1) - allocate(this%knot1(2*this%nc(1))) - this%knot1(1:this%nc(1)) = 0.0_rk - this%knot1(this%nc(1)+1:2*this%nc(1)) = 1.0_rk + procedure, private :: get_Xc_all !!> Get all control points + procedure, private :: get_Xci !!> Get i-th control point + procedure, private :: get_Xcid !!> Get i-th control point in a specific direction + generic :: get_Xc => get_Xc_all, get_Xci, get_Xcid !!> Get control points + procedure, private :: get_Xg_all !!> Get all geometry points + procedure, private :: get_Xgi !!> Get i-th geometry point + procedure, private :: get_Xgid !!> Get i-th geometry point in a specific direction + generic :: get_Xg => get_Xg_all, get_Xgi, get_Xgid !!> Get geometry points + procedure, private :: get_Wc_all !!> Get all weights + procedure, private :: get_Wci !!> Get i-th weight + generic :: get_Wc => get_Wc_all, get_Wci !!> Get weights + procedure :: get_Xt !!> Get parameter values + procedure, private :: get_knot_all !!> Get all knot vectors + procedure, private :: get_knoti !!> Get i-th knot value + generic :: get_knot => get_knoti, get_knot_all !!> Get knot vector + procedure :: get_ng !!> Get number of geometry points + procedure, private :: get_degree_all!!> Get degree of the NURBS surface in both directions + procedure, private :: get_degree_dir!!> Get degree of the NURBS surface in a specific direction + generic :: get_degree => get_degree_all, get_degree_dir !!> Get degree of the NURBS surface + procedure :: finalize !!> Finalize the NURBS surface object + procedure :: cmp_elem_Xc_vis !!> Generate connectivity for control points + procedure :: cmp_elem_Xg_vis !!> Generate connectivity for geometry points + procedure :: cmp_elem !!> Generate IGA element connectivity + procedure :: get_elem_Xc_vis !!> Get connectivity for control points + procedure :: get_elem_Xg_vis !!> Get connectivity for geometry points + procedure :: get_elem !!> Get IGA element connectivity + procedure :: set_elem_Xc_vis !!> Set connectivity for control points + procedure :: set_elem_Xg_vis !!> Set connectivity for geometry points + procedure :: set_elem !!> Set IGA element connectivity + procedure :: export_Xc !!> Export control points to VTK file + procedure :: export_Xg !!> Export geometry points to VTK file + procedure :: modify_Xc !!> Modify control points + procedure :: modify_Wc !!> Modify weights + procedure :: get_multiplicity !!> Get multiplicity of the knot vector + procedure :: get_continuity !!> Get continuity of the surface + procedure :: get_nc !!> Get number of required control points + procedure :: derivative !!> Compute the derivative of the NURBS surface + procedure :: basis !!> Compute the basis functions of the NURBS surface + procedure :: insert_knots !!> Insert knots into the knot vector + procedure :: elevate_degree !!> Elevate degree + procedure :: is_rational !!> Check if the NURBS surface is rational + procedure :: remove_knots !!> Remove knots from the knot vector + procedure :: rotate_Xc !!> Rotate control points + procedure :: rotate_Xg !!> Rotate geometry points + procedure :: translate_Xc !!> Translate control points + procedure :: translate_Xg !!> Translate geometry points + procedure :: show !!> Show the NURBS object using PyVista + + ! Shapes + procedure :: set_tetragon !!> Set a tetragon + end type + !=============================================================================== + +contains + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + !> Set knot vectors, control points and weights for the NURBS surface object. + pure subroutine set1(this, knot1, knot2, Xc, Wc) + class(nurbs_surface), intent(inout) :: this + real(rk), intent(in), contiguous :: knot1(:) + real(rk), intent(in), contiguous :: knot2(:) + real(rk), intent(in), contiguous :: Xc(:,:) + real(rk), intent(in), contiguous, optional :: Wc(:) + + if (allocated(this%knot1)) deallocate(this%knot1) + if (allocated(this%knot2)) deallocate(this%knot2) + if (allocated(this%Xc)) deallocate(this%Xc) + + this%knot1 = knot1 + this%knot2 = knot2 + this%degree = this%get_degree() + this%nc(1) = this%get_nc(1) + this%nc(2) = this%get_nc(2) + this%Xc = Xc + if (present(Wc)) then + if (size(Wc) /= this%nc(1)*this%nc(2)) then + error stop 'Number of weights does not match the number of control points.' + else + if (allocated(this%Wc)) deallocate(this%Wc) + this%Wc = Wc + end if + end if + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + !> Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights + pure subroutine set2(this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc) + class(nurbs_surface), intent(inout) :: this + real(rk), intent(in), contiguous :: Xth_dir1(:), Xth_dir2(:) + integer, intent(in), contiguous :: degree(:) + integer, intent(in), contiguous :: continuity1(:), continuity2(:) + real(rk), intent(in), contiguous :: Xc(:,:) + real(rk), intent(in), contiguous, optional :: Wc(:) + + this%knot1 = compute_knot_vector(Xth_dir1, degree(1), continuity1) + this%knot2 = compute_knot_vector(Xth_dir2, degree(2), continuity2) + this%degree(1) = degree(1) + this%degree(2) = degree(2) + this%nc(1) = this%get_nc(1) + this%nc(2) = this%get_nc(2) + this%Xc = Xc + if (present(Wc)) this%Wc = Wc + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + !> Set Bezier or Rational Bezier surface using control points and weights. + pure subroutine set3(this, nc, Xc, Wc) + class(nurbs_surface), intent(inout) :: this + integer, intent(in), contiguous :: nc(:) + real(rk), intent(in), contiguous :: Xc(:,:) + real(rk), intent(in), contiguous, optional :: Wc(:) + + if (allocated(this%Xc)) deallocate(this%Xc) - if (allocated(this%knot2)) deallocate(this%knot2) - allocate(this%knot2(2*this%nc(2))) - this%knot2(1:this%nc(2)) = 0.0_rk - this%knot2(this%nc(2)+1:2*this%nc(2)) = 1.0_rk - - this%degree = this%get_degree() - if (present(Wc)) then - if (size(Wc) /= this%nc(1)*this%nc(2)) then - error stop 'Number of weights does not match the number of control points.' - else - if (allocated(this%Wc)) deallocate(this%Wc) - this%Wc = Wc - end if - end if - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine create(this, res1, res2, Xt1, Xt2, Xt) - class(nurbs_surface), intent(inout) :: this - integer, intent(in), optional :: res1, res2 - real(rk), intent(in), contiguous, optional :: Xt1(:), Xt2(:) - real(rk), contiguous, intent(in), optional :: Xt(:,:) - integer :: i, j - real(rk), allocatable :: Tgc1(:), Tgc2(:), Tgc(:) - real(rk), allocatable :: Xt_(:,:) - - ! check - if (.not.allocated(this%Xc)) then - error stop 'Control points are not set.' - end if - - if (.not.allocated(this%knot1) .or. .not.allocated(this%knot2)) then - error stop 'Knot vector(s) is/are not set.' - end if - - - ! Set parameter values - if (present(Xt1)) then - if (allocated(this%Xt1)) deallocate(this%Xt1) - this%Xt1 = Xt1 - elseif (present(res1)) then - if (allocated(this%Xt1)) deallocate(this%Xt1) - allocate(this%Xt1(res1)) - this%Xt1 = [(real(i-1, rk) / real(res1-1, rk), i=1, res1)] - ! else - ! this%Xt1 = this%Xt1 - end if - - ! Set parameter values - if (present(Xt2)) then - if (allocated(this%Xt2)) deallocate(this%Xt2) - this%Xt2 = Xt2 - elseif (present(res2)) then - if (allocated(this%Xt2)) deallocate(this%Xt2) - allocate(this%Xt2(res2)) - this%Xt2 = [(real(i-1, rk) / real(res2-1, rk), i=1, res2)] - ! else - ! this%Xt2 = this%Xt2 - end if - - if (present(Xt)) then - Xt_ = Xt - else - - ! Set number of geometry points - this%ng(1) = size(this%Xt1,1) - this%ng(2) = size(this%Xt2,1) + this%Xc = Xc + this%nc = nc + + if (allocated(this%knot1)) deallocate(this%knot1) + allocate(this%knot1(2*this%nc(1))) + this%knot1(1:this%nc(1)) = 0.0_rk + this%knot1(this%nc(1)+1:2*this%nc(1)) = 1.0_rk + + if (allocated(this%knot2)) deallocate(this%knot2) + allocate(this%knot2(2*this%nc(2))) + this%knot2(1:this%nc(2)) = 0.0_rk + this%knot2(this%nc(2)+1:2*this%nc(2)) = 1.0_rk + + this%degree = this%get_degree() + if (present(Wc)) then + if (size(Wc) /= this%nc(1)*this%nc(2)) then + error stop 'Number of weights does not match the number of control points.' + else + if (allocated(this%Wc)) deallocate(this%Wc) + this%Wc = Wc + end if + end if + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine create(this, res1, res2, Xt1, Xt2, Xt) + class(nurbs_surface), intent(inout) :: this + integer, intent(in), optional :: res1, res2 + real(rk), intent(in), contiguous, optional :: Xt1(:), Xt2(:) + real(rk), contiguous, intent(in), optional :: Xt(:,:) + integer :: i, j + real(rk), allocatable :: Tgc1(:), Tgc2(:), Tgc(:) + real(rk), allocatable :: Xt_(:,:) + + ! check + if (.not.allocated(this%Xc)) then + error stop 'Control points are not set.' + end if + + if (.not.allocated(this%knot1) .or. .not.allocated(this%knot2)) then + error stop 'Knot vector(s) is/are not set.' + end if + + + ! Set parameter values + if (present(Xt1)) then + if (allocated(this%Xt1)) deallocate(this%Xt1) + this%Xt1 = Xt1 + elseif (present(res1)) then + if (allocated(this%Xt1)) deallocate(this%Xt1) + allocate(this%Xt1(res1)) + this%Xt1 = [(real(i-1, rk) / real(res1-1, rk), i=1, res1)] + ! else + ! this%Xt1 = this%Xt1 + end if + + ! Set parameter values + if (present(Xt2)) then + if (allocated(this%Xt2)) deallocate(this%Xt2) + this%Xt2 = Xt2 + elseif (present(res2)) then + if (allocated(this%Xt2)) deallocate(this%Xt2) + allocate(this%Xt2(res2)) + this%Xt2 = [(real(i-1, rk) / real(res2-1, rk), i=1, res2)] + ! else + ! this%Xt2 = this%Xt2 + end if - call ndgrid(this%Xt1, this%Xt2, Xt_) - end if - - if (allocated(this%Xg)) deallocate(this%Xg) - allocate(this%Xg(size(Xt_,1), size(this%Xc,2))) - - if (this%is_rational()) then ! NURBS - do i = 1, size(Xt_, 1) - Tgc1 = basis_bspline(Xt_(i,1), this%knot1, this%nc(1), this%degree(1)) - Tgc2 = basis_bspline(Xt_(i,2), this%knot2, this%nc(2), this%degree(2)) - Tgc = kron(Tgc2, Tgc1) - Tgc = Tgc*(this%Wc/(dot_product(Tgc,this%Wc))) - do j = 1, size(this%Xc, 2) - this%Xg(i,j) = dot_product(Tgc,this%Xc(:,j)) - end do - end do - else ! B-Spline - do i = 1, size(Xt_, 1) - Tgc1 = basis_bspline(Xt_(i,1), this%knot1, this%nc(1), this%degree(1)) - Tgc2 = basis_bspline(Xt_(i,2), this%knot2, this%nc(2), this%degree(2)) - Tgc = kron(Tgc2, Tgc1) - do j = 1, size(this%Xc, 2) - this%Xg(i,j) = dot_product(Tgc,this%Xc(:,j)) - end do - end do - end if - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_Xc(this) result(Xc) - class(nurbs_surface), intent(in) :: this - real(rk), allocatable :: Xc(:,:) + if (present(Xt)) then + Xt_ = Xt + else + + ! Set number of geometry points + this%ng(1) = size(this%Xt1,1) + this%ng(2) = size(this%Xt2,1) + + call ndgrid(this%Xt1, this%Xt2, Xt_) + end if + + if (allocated(this%Xg)) deallocate(this%Xg) + allocate(this%Xg(size(Xt_,1), size(this%Xc,2))) + + if (this%is_rational()) then ! NURBS + do i = 1, size(Xt_, 1) + Tgc1 = basis_bspline(Xt_(i,1), this%knot1, this%nc(1), this%degree(1)) + Tgc2 = basis_bspline(Xt_(i,2), this%knot2, this%nc(2), this%degree(2)) + Tgc = kron(Tgc2, Tgc1) + Tgc = Tgc*(this%Wc/(dot_product(Tgc,this%Wc))) + do j = 1, size(this%Xc, 2) + this%Xg(i,j) = dot_product(Tgc,this%Xc(:,j)) + end do + end do + else ! B-Spline + do i = 1, size(Xt_, 1) + Tgc1 = basis_bspline(Xt_(i,1), this%knot1, this%nc(1), this%degree(1)) + Tgc2 = basis_bspline(Xt_(i,2), this%knot2, this%nc(2), this%degree(2)) + Tgc = kron(Tgc2, Tgc1) + do j = 1, size(this%Xc, 2) + this%Xg(i,j) = dot_product(Tgc,this%Xc(:,j)) + end do + end do + end if + end subroutine + !=============================================================================== - if (allocated(this%Xc)) then - Xc = this%Xc - else - error stop 'Control points are not set.' - end if - end function - !=============================================================================== + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xc_all(this) result(Xc) + class(nurbs_surface), intent(in) :: this + real(rk), allocatable :: Xc(:,:) - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_Xg(this) result(Xg) - class(nurbs_surface), intent(in) :: this - real(rk), allocatable :: Xg(:,:) + if (allocated(this%Xc)) then + Xc = this%Xc + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== - if (allocated(this%Xg)) then - Xg = this%Xg - else - error stop 'Geometry points are not set.' - end if - end function - !=============================================================================== - + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xci(this, n) result(Xc) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: n + real(rk), allocatable :: Xc(:) - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_Wc(this) result(Wc) - class(nurbs_surface), intent(in) :: this - real(rk), allocatable :: Wc(:) - - if (allocated(this%Wc)) then - Wc = this%Wc - else - error stop 'The NURBS surface is not rational.' - end if - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_Xt(this, dir) result(Xt) - class(nurbs_surface), intent(in) :: this - integer, intent(in) :: dir - real(rk), allocatable :: Xt(:) - - if (dir == 1) then - if (allocated(this%Xt1)) then - Xt = this%Xt1 - else - error stop 'Parameter values are not set.' - end if - elseif (dir == 2) then - if (allocated(this%Xt2)) then - Xt = this%Xt2 - else - error stop 'Parameter values are not set.' - end if - else - error stop 'Invalid direction for parameter values.' + if (allocated(this%Xc)) then + Xc(:) = this%Xc(n,:) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xcid(this, n, dir) result(Xc) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: n + integer, intent(in) :: dir + real(rk) :: Xc + + if (allocated(this%Xc)) then + Xc = this%Xc(n, dir) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xg_all(this) result(Xg) + class(nurbs_surface), intent(in) :: this + real(rk), allocatable :: Xg(:,:) + + if (allocated(this%Xg)) then + Xg = this%Xg + else + error stop 'Geometry points are not set.' end if - - end function - !=============================================================================== + end function + !=============================================================================== + - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_ng(this) result(ng) - class(nurbs_surface), intent(in) :: this - integer :: ng(2) + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xgi(this, n) result(Xg) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: n + real(rk), allocatable :: Xg(:) - ng = this%ng - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_degree_all(this) result(degree) - class(nurbs_surface), intent(in) :: this - integer :: degree(2) - integer, allocatable :: m1(:), m2(:) - - m1 = this%get_multiplicity(1) - m2 = this%get_multiplicity(2) - - degree(1) = m1(1) - 1 - degree(2) = m2(1) - 1 - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_degree_dir(this,dir) result(degree) - class(nurbs_surface), intent(in) :: this - integer, intent(in) :: dir - integer :: degree - integer, allocatable :: m1(:), m2(:) - - if (dir == 1) then - m1 = this%get_multiplicity(1) - degree = m1(1) - 1 - else if (dir == 2) then - m2 = this%get_multiplicity(2) - degree = m2(1) - 1 - else - error stop 'Invalid direction for degree.' - end if - end function - !=============================================================================== + if (allocated(this%Xg)) then + Xg(:) = this%Xg(n,:) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xgid(this, n, dir) result(Xg) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: n + integer, intent(in) :: dir + real(rk) :: Xg + + if (allocated(this%Xg)) then + Xg = this%Xg(n, dir) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Wc_all(this) result(Wc) + class(nurbs_surface), intent(in) :: this + real(rk), allocatable :: Wc(:) + + if (allocated(this%Wc)) then + Wc = this%Wc + else + error stop 'The NURBS surface is not rational or weights are not set.' + end if + end function + !=============================================================================== + - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_knot_all(this, dir) result(knot) - class(nurbs_surface), intent(in) :: this - integer, intent(in) :: dir - real(rk), allocatable :: knot(:) - - if (dir == 1) then - if (allocated(this%knot1)) then - knot = this%knot1 - else - error stop 'Knot vector is not set.' - end if - elseif (dir == 2) then - if (allocated(this%knot2)) then - knot = this%knot2 - else - error stop 'Knot vector is not set.' - end if - else - error stop 'Invalid direction for knot vector.' - end if + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Wci(this, n) result(Wc) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: n + real(rk) :: Wc + + if (allocated(this%Wc)) then + Wc = this%Wc(n) + else + error stop 'The NURBS surface is not rational or weights are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xt(this, dir) result(Xt) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: dir + real(rk), allocatable :: Xt(:) - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_knoti(this, dir, i) result(knot) - class(nurbs_surface), intent(in) :: this - integer, intent(in) :: dir - integer, intent(in) :: i - real(rk) :: knot - - if (dir == 1) then - if (allocated(this%knot1)) then - if (i < 1 .or. i > size(this%knot1)) then - error stop 'Invalid index for knot vector.' - else - knot = this%knot1(i) - end if - else - error stop 'Knot vector is not set.' - end if - elseif (dir == 2) then - if (allocated(this%knot2)) then - if (i < 1 .or. i > size(this%knot2)) then - error stop 'Invalid index for knot vector.' - else - knot = this%knot2(i) - end if - else - error stop 'Knot vector is not set.' - end if - else - error stop 'Invalid direction for knot vector.' - end if - - end function - !=============================================================================== + if (dir == 1) then + if (allocated(this%Xt1)) then + Xt = this%Xt1 + else + error stop 'Parameter values are not set.' + end if + elseif (dir == 2) then + if (allocated(this%Xt2)) then + Xt = this%Xt2 + else + error stop 'Parameter values are not set.' + end if + else + error stop 'Invalid direction for parameter values.' + end if + + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_ng(this) result(ng) + class(nurbs_surface), intent(in) :: this + integer :: ng(2) + + ng = this%ng + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_degree_all(this) result(degree) + class(nurbs_surface), intent(in) :: this + integer :: degree(2) + integer, allocatable :: m1(:), m2(:) - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine finalize(this) - class(nurbs_surface), intent(inout) :: this - if (allocated(this%Xc)) deallocate(this%Xc) - if (allocated(this%Xg)) deallocate(this%Xg) - if (allocated(this%Wc)) deallocate(this%Wc) - if (allocated(this%Xt1)) deallocate(this%Xt1) - if (allocated(this%Xt2)) deallocate(this%Xt2) - if (allocated(this%knot1)) deallocate(this%knot1) - if (allocated(this%knot2)) deallocate(this%knot2) - if (allocated(this%elemConn_Xc_vis)) deallocate(this%elemConn_Xc_vis) - if (allocated(this%elemConn_Xg_vis)) deallocate(this%elemConn_Xg_vis) - if (allocated(this%elemConn)) deallocate(this%elemConn) - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function cmp_elem_Xc_vis(this, p) result(elemConn) - class(nurbs_surface), intent(in) :: this - integer, allocatable :: elemConn(:,:) - integer, intent(in), contiguous, optional :: p(:) - - if (present(p)) then - elemConn = elemConn_C0(this%nc(1), this%nc(2), p(1), p(2)) - else - elemConn = elemConn_C0(this%nc(1), this%nc(2), 1, 1) - end if - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function cmp_elem_Xg_vis(this, p) result(elemConn) - class(nurbs_surface), intent(in) :: this - integer, allocatable :: elemConn(:,:) - integer, intent(in), contiguous, optional :: p(:) - - if (present(p)) then - elemConn = elemConn_C0(this%ng(1), this%ng(2), p(1), p(2)) - else - elemConn = elemConn_C0(this%ng(1), this%ng(2), 1, 1) - end if - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - impure subroutine export_Xc(this, filename) - class(nurbs_surface), intent(in) :: this - character(len=*), intent(in) :: filename - integer :: i, nc, nunit - integer, allocatable :: elemConn(:,:) - - ! check - if (.not.allocated(this%Xc)) then - error stop 'Control points are not set.' - end if + m1 = this%get_multiplicity(1) + m2 = this%get_multiplicity(2) + + degree(1) = m1(1) - 1 + degree(2) = m2(1) - 1 + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_degree_dir(this,dir) result(degree) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: dir + integer :: degree + integer, allocatable :: m1(:), m2(:) + + if (dir == 1) then + m1 = this%get_multiplicity(1) + degree = m1(1) - 1 + else if (dir == 2) then + m2 = this%get_multiplicity(2) + degree = m2(1) - 1 + else + error stop 'Invalid direction for degree.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_knot_all(this, dir) result(knot) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: dir + real(rk), allocatable :: knot(:) + + if (dir == 1) then + if (allocated(this%knot1)) then + knot = this%knot1 + else + error stop 'Knot vector is not set.' + end if + elseif (dir == 2) then + if (allocated(this%knot2)) then + knot = this%knot2 + else + error stop 'Knot vector is not set.' + end if + else + error stop 'Invalid direction for knot vector.' + end if + + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_knoti(this, dir, i) result(knot) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: dir + integer, intent(in) :: i + real(rk) :: knot - if (.not.allocated(this%elemConn_Xc_vis)) then - elemConn = this%cmp_elem_Xc_vis() - else - elemConn = this%elemConn_Xc_vis - end if - - nc = size(this%Xc, 1) - - open(newunit=nunit, file=filename, action='write') - write(nunit,'(a)') '# vtk DataFile Version 2.0' - write(nunit,'(a)') 'Generated by ForCAD' - write(nunit,'(a)') 'ASCII' - write(nunit,'(a)') 'DATASET UNSTRUCTURED_GRID' - write(nunit,'(a," ",g0," ",a)') 'POINTS', nc, 'double' - - if (size(this%Xc,2) == 2) then - write(nunit,'(g0," ",g0," ",g0)') (this%Xc(i,1), this%Xc(i,2), 0.0_rk , i = 1, nc) - elseif (size(this%Xc,2) == 3) then - write(nunit,'(g0," ",g0," ",g0)') (this%Xc(i,1), this%Xc(i,2), this%Xc(i,3) , i = 1, nc) - else - error stop 'Invalid dimension for control points.' - end if - - write(nunit,'(a," ",g0," ",g0)') 'CELLS', size(elemConn,1), size(elemConn,1)*(size(elemConn,2)+1) - write(nunit,'(g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0)')& - (4, elemConn(i,1)-1,elemConn(i,2)-1,elemConn(i,4)-1,elemConn(i,3)-1, i = 1, size(elemConn,1)) + if (dir == 1) then + if (allocated(this%knot1)) then + if (i < 1 .or. i > size(this%knot1)) then + error stop 'Invalid index for knot vector.' + else + knot = this%knot1(i) + end if + else + error stop 'Knot vector is not set.' + end if + elseif (dir == 2) then + if (allocated(this%knot2)) then + if (i < 1 .or. i > size(this%knot2)) then + error stop 'Invalid index for knot vector.' + else + knot = this%knot2(i) + end if + else + error stop 'Knot vector is not set.' + end if + else + error stop 'Invalid direction for knot vector.' + end if + + end function + !=============================================================================== - write(nunit,'(a," ",g0)') 'CELL_TYPES', size(elemConn,1) - write(nunit,'(g0)') (9 , i = 1, size(elemConn,1)) - close(nunit) - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - impure subroutine export_Xg(this, filename) - class(nurbs_surface), intent(in) :: this - character(len=*), intent(in) :: filename - integer :: i, ng, nunit - integer, allocatable :: elemConn(:,:) - - ! check - if (.not.allocated(this%Xg)) then - error stop 'Geometry points are not set.' - end if - - if (.not.allocated(this%elemConn_Xg_vis)) then - elemConn = this%cmp_elem_Xg_vis() - else - elemConn = this%elemConn_Xg_vis - end if - - ng = size(this%Xg, 1) - - open(newunit=nunit, file=filename, action='write') - write(nunit,'(a)') '# vtk DataFile Version 2.0' - write(nunit,'(a)') 'Generated by ForCAD' - write(nunit,'(a)') 'ASCII' - write(nunit,'(a)') 'DATASET UNSTRUCTURED_GRID' - write(nunit,'(a," ",g0," ",a)') 'POINTS', ng, 'double' + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine finalize(this) + class(nurbs_surface), intent(inout) :: this + if (allocated(this%Xc)) deallocate(this%Xc) + if (allocated(this%Xg)) deallocate(this%Xg) + if (allocated(this%Wc)) deallocate(this%Wc) + if (allocated(this%Xt1)) deallocate(this%Xt1) + if (allocated(this%Xt2)) deallocate(this%Xt2) + if (allocated(this%knot1)) deallocate(this%knot1) + if (allocated(this%knot2)) deallocate(this%knot2) + if (allocated(this%elemConn_Xc_vis)) deallocate(this%elemConn_Xc_vis) + if (allocated(this%elemConn_Xg_vis)) deallocate(this%elemConn_Xg_vis) + if (allocated(this%elemConn)) deallocate(this%elemConn) + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function cmp_elem_Xc_vis(this, p) result(elemConn) + class(nurbs_surface), intent(in) :: this + integer, allocatable :: elemConn(:,:) + integer, intent(in), contiguous, optional :: p(:) + + if (present(p)) then + elemConn = elemConn_C0(this%nc(1), this%nc(2), p(1), p(2)) + else + elemConn = elemConn_C0(this%nc(1), this%nc(2), 1, 1) + end if + end function + !=============================================================================== - if (size(this%Xg,2) == 2) then - write(nunit,'(g0," ",g0," ",g0)') (this%Xg(i,1), this%Xg(i,2), 0.0_rk , i = 1, ng) - elseif (size(this%Xg,2) == 3) then - write(nunit,'(g0," ",g0," ",g0)') (this%Xg(i,1), this%Xg(i,2), this%Xg(i,3) , i = 1, ng) - else - error stop 'Invalid dimension for geometry points.' - end if - - write(nunit,'(a," ",g0," ",g0)') 'CELLS', size(elemConn,1), size(elemConn,1)*(size(elemConn,2)+1) - write(nunit,'(g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0)')& - (4, elemConn(i,1)-1,elemConn(i,2)-1,elemConn(i,4)-1,elemConn(i,3)-1, i = 1, size(elemConn,1)) - - write(nunit,'(a," ",g0)') 'CELL_TYPES', size(elemConn,1) - write(nunit,'(g0)') (9 , i = 1, size(elemConn,1)) - close(nunit) - end subroutine - !=============================================================================== + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function cmp_elem_Xg_vis(this, p) result(elemConn) + class(nurbs_surface), intent(in) :: this + integer, allocatable :: elemConn(:,:) + integer, intent(in), contiguous, optional :: p(:) + + if (present(p)) then + elemConn = elemConn_C0(this%ng(1), this%ng(2), p(1), p(2)) + else + elemConn = elemConn_C0(this%ng(1), this%ng(2), 1, 1) + end if + end function + !=============================================================================== + - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine modify_Xc(this,X,num,dir) - class(nurbs_surface), intent(inout) :: this - real(rk), intent(in) :: X - integer, intent(in) :: num - integer, intent(in) :: dir - - if (allocated(this%Xc)) then - this%Xc(num,dir) = X - call this%set(knot1 = this%knot1, knot2 = this%knot2, Xc = this%Xc, Wc = this%Wc) - else - error stop 'Control points are not set.' - end if - end subroutine - !=============================================================================== - + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + impure subroutine export_Xc(this, filename) + class(nurbs_surface), intent(in) :: this + character(len=*), intent(in) :: filename + integer :: i, nc, nunit + integer, allocatable :: elemConn(:,:) + + ! check + if (.not.allocated(this%Xc)) then + error stop 'Control points are not set.' + end if + + if (.not.allocated(this%elemConn_Xc_vis)) then + elemConn = this%cmp_elem_Xc_vis() + else + elemConn = this%elemConn_Xc_vis + end if - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine modify_Wc(this,W,num) - class(nurbs_surface), intent(inout) :: this - real(rk), intent(in) :: W - integer, intent(in) :: num - real(rk), allocatable :: knot1(:), knot2(:), Xc(:,:), Wc(:) + nc = size(this%Xc, 1) + + open(newunit=nunit, file=filename, action='write') + write(nunit,'(a)') '# vtk DataFile Version 2.0' + write(nunit,'(a)') 'Generated by ForCAD' + write(nunit,'(a)') 'ASCII' + write(nunit,'(a)') 'DATASET UNSTRUCTURED_GRID' + write(nunit,'(a," ",g0," ",a)') 'POINTS', nc, 'double' - if (allocated(this%Wc)) then - this%Wc(num) = W - Xc = this%Xc - Wc = this%Wc - if (allocated(this%knot1) .and. allocated(this%knot2)) then - knot1 = this%knot1 - knot2 = this%knot2 - call this%set(knot1 = knot1, knot2 = knot2, Xc = Xc, Wc = Wc) - else - call this%set(nc = this%nc, Xc = Xc, Wc = Wc) - end if - else - error stop 'The NURBS surface is not rational.' - end if - end subroutine - !=============================================================================== - + if (size(this%Xc,2) == 2) then + write(nunit,'(g0," ",g0," ",g0)') (this%Xc(i,1), this%Xc(i,2), 0.0_rk , i = 1, nc) + elseif (size(this%Xc,2) == 3) then + write(nunit,'(g0," ",g0," ",g0)') (this%Xc(i,1), this%Xc(i,2), this%Xc(i,3) , i = 1, nc) + else + error stop 'Invalid dimension for control points.' + end if + + write(nunit,'(a," ",g0," ",g0)') 'CELLS', size(elemConn,1), size(elemConn,1)*(size(elemConn,2)+1) + write(nunit,'(g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0)')& + (4, elemConn(i,1)-1,elemConn(i,2)-1,elemConn(i,4)-1,elemConn(i,3)-1, i = 1, size(elemConn,1)) + + write(nunit,'(a," ",g0)') 'CELL_TYPES', size(elemConn,1) + write(nunit,'(g0)') (9 , i = 1, size(elemConn,1)) + close(nunit) + end subroutine + !=============================================================================== - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_multiplicity(this, dir) result(m) - class(nurbs_surface), intent(in) :: this - integer, intent(in) :: dir - integer, allocatable :: m(:) - - if (dir == 1) then + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + impure subroutine export_Xg(this, filename) + class(nurbs_surface), intent(in) :: this + character(len=*), intent(in) :: filename + integer :: i, ng, nunit + integer, allocatable :: elemConn(:,:) - ! check - if (.not.allocated(this%knot1)) then - error stop 'Knot vector is not set.' - else - m = compute_multiplicity(this%knot1) - end if - - elseif (dir == 2) then - - ! check - if (.not.allocated(this%knot2)) then - error stop 'Knot vector is not set.' - else - m = compute_multiplicity(this%knot2) - end if - - else - error stop 'Invalid direction.' - end if + ! check + if (.not.allocated(this%Xg)) then + error stop 'Geometry points are not set.' + end if + + if (.not.allocated(this%elemConn_Xg_vis)) then + elemConn = this%cmp_elem_Xg_vis() + else + elemConn = this%elemConn_Xg_vis + end if + + ng = size(this%Xg, 1) + + open(newunit=nunit, file=filename, action='write') + write(nunit,'(a)') '# vtk DataFile Version 2.0' + write(nunit,'(a)') 'Generated by ForCAD' + write(nunit,'(a)') 'ASCII' + write(nunit,'(a)') 'DATASET UNSTRUCTURED_GRID' + write(nunit,'(a," ",g0," ",a)') 'POINTS', ng, 'double' - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_continuity(this, dir) result(c) - class(nurbs_surface), intent(in) :: this - integer, intent(in) :: dir - integer, allocatable :: c(:) + if (size(this%Xg,2) == 2) then + write(nunit,'(g0," ",g0," ",g0)') (this%Xg(i,1), this%Xg(i,2), 0.0_rk , i = 1, ng) + elseif (size(this%Xg,2) == 3) then + write(nunit,'(g0," ",g0," ",g0)') (this%Xg(i,1), this%Xg(i,2), this%Xg(i,3) , i = 1, ng) + else + error stop 'Invalid dimension for geometry points.' + end if + + write(nunit,'(a," ",g0," ",g0)') 'CELLS', size(elemConn,1), size(elemConn,1)*(size(elemConn,2)+1) + write(nunit,'(g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0)')& + (4, elemConn(i,1)-1,elemConn(i,2)-1,elemConn(i,4)-1,elemConn(i,3)-1, i = 1, size(elemConn,1)) - if (dir == 1) then - - ! check - if (.not.allocated(this%knot1)) then - error stop 'Knot vector is not set.' - else - c = this%degree(1) - compute_multiplicity(this%knot1) - end if - - elseif (dir == 2) then - - ! check - if (.not.allocated(this%knot2)) then - error stop 'Knot vector is not set.' - else - c = this%degree(2) - compute_multiplicity(this%knot2) - end if - - else - error stop 'Invalid direction.' - end if - - end function + write(nunit,'(a," ",g0)') 'CELL_TYPES', size(elemConn,1) + write(nunit,'(g0)') (9 , i = 1, size(elemConn,1)) + close(nunit) + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine modify_Xc(this,X,num,dir) + class(nurbs_surface), intent(inout) :: this + real(rk), intent(in) :: X + integer, intent(in) :: num + integer, intent(in) :: dir + + if (allocated(this%Xc)) then + this%Xc(num,dir) = X + call this%set(knot1 = this%knot1, knot2 = this%knot2, Xc = this%Xc, Wc = this%Wc) + else + error stop 'Control points are not set.' + end if + end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause - pure function get_nc(this, dir) result(nc) - class(nurbs_surface), intent(in) :: this - integer, intent(in) :: dir - integer :: nc - - if (dir == 1) then - - ! check - if (.not.allocated(this%knot1)) then - error stop 'Knot vector is not set.' - else - nc = sum(compute_multiplicity(this%knot1)) - this%degree(1) - 1 - end if - - elseif (dir == 2) then - - ! check - if (.not.allocated(this%knot2)) then - error stop 'Knot vector is not set.' - else - nc = sum(compute_multiplicity(this%knot2)) - this%degree(2) - 1 - end if + pure subroutine modify_Wc(this,W,num) + class(nurbs_surface), intent(inout) :: this + real(rk), intent(in) :: W + integer, intent(in) :: num + real(rk), allocatable :: knot1(:), knot2(:), Xc(:,:), Wc(:) + + if (allocated(this%Wc)) then + this%Wc(num) = W + Xc = this%Xc + Wc = this%Wc + if (allocated(this%knot1) .and. allocated(this%knot2)) then + knot1 = this%knot1 + knot2 = this%knot2 + call this%set(knot1 = knot1, knot2 = knot2, Xc = Xc, Wc = Wc) + else + call this%set(nc = this%nc, Xc = Xc, Wc = Wc) + end if + else + error stop 'The NURBS surface is not rational.' + end if + end subroutine + !=============================================================================== - else - error stop 'Invalid direction.' - end if - - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine derivative(this, res1, res2, Xt1, Xt2, dTgc) - class(nurbs_surface), intent(inout) :: this - integer, intent(in), optional :: res1, res2 - real(rk), intent(in), contiguous, optional :: Xt1(:), Xt2(:) - real(rk), allocatable, intent(out) :: dTgc(:,:) - real(rk), allocatable :: dTgci(:) - integer :: i - real(rk), allocatable :: dTgc1(:), dTgc2(:) - real(rk), allocatable :: Xt(:,:) - - ! Set parameter values - if (present(Xt1)) then - if (allocated(this%Xt1)) deallocate(this%Xt1) - this%Xt1 = Xt1 - elseif (present(res1)) then - if (allocated(this%Xt1)) deallocate(this%Xt1) - allocate(this%Xt1(res1)) - this%Xt1 = [(real(i-1, rk) / real(res1-1, rk), i=1, res1)] - ! else - ! this%Xt1 = this%Xt1 - end if - - ! Set parameter values - if (present(Xt2)) then - if (allocated(this%Xt2)) deallocate(this%Xt2) - this%Xt2 = Xt2 - elseif (present(res2)) then - if (allocated(this%Xt2)) deallocate(this%Xt2) - allocate(this%Xt2(res2)) - this%Xt2 = [(real(i-1, rk) / real(res2-1, rk), i=1, res2)] - ! else - ! this%Xt2 = this%Xt2 - end if + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_multiplicity(this, dir) result(m) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: dir + integer, allocatable :: m(:) + + if (dir == 1) then + + ! check + if (.not.allocated(this%knot1)) then + error stop 'Knot vector is not set.' + else + m = compute_multiplicity(this%knot1) + end if + + elseif (dir == 2) then + + ! check + if (.not.allocated(this%knot2)) then + error stop 'Knot vector is not set.' + else + m = compute_multiplicity(this%knot2) + end if + + else + error stop 'Invalid direction.' + end if + + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_continuity(this, dir) result(c) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: dir + integer, allocatable :: c(:) + + if (dir == 1) then - ! Set number of geometry points - this%ng(1) = size(this%Xt1,1) - this%ng(2) = size(this%Xt2,1) - - call ndgrid(this%Xt1, this%Xt2, Xt) - - allocate(dTgc(this%ng(1)*this%ng(2), this%nc(1)*this%nc(2))) - - if (this%is_rational()) then ! NURBS - do i = 1, size(Xt, 1) - dTgc1 = basis_bspline_der(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) - dTgc2 = basis_bspline_der(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) - dTgci = kron(dTgc2, dTgc1) - dTgci = dTgci*(this%Wc/(dot_product(dTgci,this%Wc))) - dTgc(i,:) = dTgci - end do - else ! B-Spline - do i = 1, size(Xt, 1) - dTgc1 = basis_bspline_der(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) - dTgc2 = basis_bspline_der(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) - dTgci = kron(dTgc2, dTgc1) - dTgc(i,:) = dTgci - end do - end if - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine basis(this, res1, res2, Xt1, Xt2, Tgc) - class(nurbs_surface), intent(inout) :: this - integer, intent(in), optional :: res1, res2 - real(rk), intent(in), contiguous, optional :: Xt1(:), Xt2(:) - real(rk), allocatable, intent(out) :: Tgc(:,:) - real(rk), allocatable :: Tgci(:) - integer :: i - real(rk), allocatable :: Tgc1(:), Tgc2(:) - real(rk), allocatable :: Xt(:,:) + ! check + if (.not.allocated(this%knot1)) then + error stop 'Knot vector is not set.' + else + c = this%degree(1) - compute_multiplicity(this%knot1) + end if + + elseif (dir == 2) then + + ! check + if (.not.allocated(this%knot2)) then + error stop 'Knot vector is not set.' + else + c = this%degree(2) - compute_multiplicity(this%knot2) + end if + + else + error stop 'Invalid direction.' + end if + + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_nc(this, dir) result(nc) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: dir + integer :: nc + + if (dir == 1) then + + ! check + if (.not.allocated(this%knot1)) then + error stop 'Knot vector is not set.' + else + nc = sum(compute_multiplicity(this%knot1)) - this%degree(1) - 1 + end if - ! Set parameter values - if (present(Xt1)) then - if (allocated(this%Xt1)) deallocate(this%Xt1) - this%Xt1 = Xt1 - elseif (present(res1)) then - if (allocated(this%Xt1)) deallocate(this%Xt1) - allocate(this%Xt1(res1)) - this%Xt1 = [(real(i-1, rk) / real(res1-1, rk), i=1, res1)] - ! else - ! this%Xt1 = this%Xt1 - end if - - ! Set parameter values - if (present(Xt2)) then - if (allocated(this%Xt2)) deallocate(this%Xt2) - this%Xt2 = Xt2 - elseif (present(res2)) then - if (allocated(this%Xt2)) deallocate(this%Xt2) - allocate(this%Xt2(res2)) - this%Xt2 = [(real(i-1, rk) / real(res2-1, rk), i=1, res2)] - ! else - ! this%Xt2 = this%Xt2 - end if - - ! Set number of geometry points - this%ng(1) = size(this%Xt1,1) - this%ng(2) = size(this%Xt2,1) - - call ndgrid(this%Xt1, this%Xt2, Xt) + elseif (dir == 2) then + + ! check + if (.not.allocated(this%knot2)) then + error stop 'Knot vector is not set.' + else + nc = sum(compute_multiplicity(this%knot2)) - this%degree(2) - 1 + end if + + else + error stop 'Invalid direction.' + end if + + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine derivative(this, res1, res2, Xt1, Xt2, dTgc) + class(nurbs_surface), intent(inout) :: this + integer, intent(in), optional :: res1, res2 + real(rk), intent(in), contiguous, optional :: Xt1(:), Xt2(:) + real(rk), allocatable, intent(out) :: dTgc(:,:) + real(rk), allocatable :: dTgci(:) + integer :: i + real(rk), allocatable :: dTgc1(:), dTgc2(:) + real(rk), allocatable :: Xt(:,:) - allocate(Tgc(this%ng(1)*this%ng(2), this%nc(1)*this%nc(2))) - - if (this%is_rational()) then ! NURBS - do i = 1, size(Xt, 1) - Tgc1 = basis_bspline(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) - Tgc2 = basis_bspline(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) - Tgci = kron(Tgc2, Tgc1) - Tgci = Tgci*(this%Wc/(dot_product(Tgci,this%Wc))) - Tgc(i,:) = Tgci - end do - else ! B-Spline - do i = 1, size(Xt, 1) - Tgc1 = basis_bspline(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) - Tgc2 = basis_bspline(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) - Tgci = kron(Tgc2, Tgc1) - Tgc(i,:) = Tgci - end do - end if - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine insert_knots(this, dir ,Xth,r) - class(nurbs_surface), intent(inout) :: this - integer, intent(in) :: dir - real(rk), intent(in), contiguous :: Xth(:) - integer, intent(in), contiguous :: r(:) - integer :: k, i, s, dim, j, n_new - real(rk), allocatable :: Xc(:,:), Xcw(:,:), Xcw_new(:,:), Xc_new(:,:), Wc_new(:), knot_new(:) - real(rk), allocatable:: Xc3(:,:,:) - real(rk), allocatable :: knot1(:), knot2(:) - - - if (dir == 1) then ! direction 1 - - if(this%is_rational()) then ! NURBS - - do i = 1, size(Xth) - k = findspan(this%nc(1)-1,this%degree(1),Xth(i),this%knot1) - if (this%knot1(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot1, Xth(i)) - else - s = 0 - end if - - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do - Xcw(:,dim+1) = this%Wc(:) - - Xcw = reshape(Xcw,[this%nc(1),this%nc(2)*(dim+1)]) - - call insert_knot_A_5_1(& - this%degree(1),& - this%knot1,& - Xcw,& - Xth(i),& - k,& - s,& - r(i),& - n_new,& - knot_new,& - Xcw_new) - - Xcw_new = reshape(Xcw_new,[this%nc(2)*(n_new+1),dim+1]) - - allocate(Xc_new(1:this%nc(2)*(n_new+1),1:dim)) - allocate(Wc_new(1:this%nc(2)*(n_new+1))) - do j = 1, this%nc(2)*(n_new+1) - Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do - Wc_new(:) = Xcw_new(:,dim+1) - - knot2 = this%knot2 - call this%set(knot1=knot_new, knot2=knot2, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw, Xcw_new, Xc_new, Wc_new) - end do - - - else ! B-Spline - - do i = 1, size(Xth) - k = findspan(this%nc(1)-1,this%degree(1),Xth(i),this%knot1) - if (this%knot1(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot1, Xth(i)) - else - s = 0 - end if - - dim = size(this%Xc,2) - - Xc = reshape(this%Xc,[this%nc(1),this%nc(2)*dim]) - - call insert_knot_A_5_1(& - this%degree(1),& - this%knot1,& - Xc,& - Xth(i),& - k,& - s,& - r(i),& - n_new,& - knot_new,& - Xc_new) - - Xc_new = reshape(Xc_new,[(this%nc(2))*(n_new+1),dim]) - - knot2 = this%knot2 - call this%set(knot1=knot_new, knot2=knot2, Xc=Xc_new) - end do + ! Set parameter values + if (present(Xt1)) then + if (allocated(this%Xt1)) deallocate(this%Xt1) + this%Xt1 = Xt1 + elseif (present(res1)) then + if (allocated(this%Xt1)) deallocate(this%Xt1) + allocate(this%Xt1(res1)) + this%Xt1 = [(real(i-1, rk) / real(res1-1, rk), i=1, res1)] + ! else + ! this%Xt1 = this%Xt1 + end if + + ! Set parameter values + if (present(Xt2)) then + if (allocated(this%Xt2)) deallocate(this%Xt2) + this%Xt2 = Xt2 + elseif (present(res2)) then + if (allocated(this%Xt2)) deallocate(this%Xt2) + allocate(this%Xt2(res2)) + this%Xt2 = [(real(i-1, rk) / real(res2-1, rk), i=1, res2)] + ! else + ! this%Xt2 = this%Xt2 + end if + + ! Set number of geometry points + this%ng(1) = size(this%Xt1,1) + this%ng(2) = size(this%Xt2,1) + + call ndgrid(this%Xt1, this%Xt2, Xt) + + allocate(dTgc(this%ng(1)*this%ng(2), this%nc(1)*this%nc(2))) + + if (this%is_rational()) then ! NURBS + do i = 1, size(Xt, 1) + dTgc1 = basis_bspline_der(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) + dTgc2 = basis_bspline_der(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) + dTgci = kron(dTgc2, dTgc1) + dTgci = dTgci*(this%Wc/(dot_product(dTgci,this%Wc))) + dTgc(i,:) = dTgci + end do + else ! B-Spline + do i = 1, size(Xt, 1) + dTgc1 = basis_bspline_der(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) + dTgc2 = basis_bspline_der(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) + dTgci = kron(dTgc2, dTgc1) + dTgc(i,:) = dTgci + end do + end if + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine basis(this, res1, res2, Xt1, Xt2, Tgc) + class(nurbs_surface), intent(inout) :: this + integer, intent(in), optional :: res1, res2 + real(rk), intent(in), contiguous, optional :: Xt1(:), Xt2(:) + real(rk), allocatable, intent(out) :: Tgc(:,:) + real(rk), allocatable :: Tgci(:) + integer :: i + real(rk), allocatable :: Tgc1(:), Tgc2(:) + real(rk), allocatable :: Xt(:,:) + + ! Set parameter values + if (present(Xt1)) then + if (allocated(this%Xt1)) deallocate(this%Xt1) + this%Xt1 = Xt1 + elseif (present(res1)) then + if (allocated(this%Xt1)) deallocate(this%Xt1) + allocate(this%Xt1(res1)) + this%Xt1 = [(real(i-1, rk) / real(res1-1, rk), i=1, res1)] + ! else + ! this%Xt1 = this%Xt1 + end if + + ! Set parameter values + if (present(Xt2)) then + if (allocated(this%Xt2)) deallocate(this%Xt2) + this%Xt2 = Xt2 + elseif (present(res2)) then + if (allocated(this%Xt2)) deallocate(this%Xt2) + allocate(this%Xt2(res2)) + this%Xt2 = [(real(i-1, rk) / real(res2-1, rk), i=1, res2)] + ! else + ! this%Xt2 = this%Xt2 + end if + + ! Set number of geometry points + this%ng(1) = size(this%Xt1,1) + this%ng(2) = size(this%Xt2,1) + + call ndgrid(this%Xt1, this%Xt2, Xt) + + allocate(Tgc(this%ng(1)*this%ng(2), this%nc(1)*this%nc(2))) + + if (this%is_rational()) then ! NURBS + do i = 1, size(Xt, 1) + Tgc1 = basis_bspline(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) + Tgc2 = basis_bspline(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) + Tgci = kron(Tgc2, Tgc1) + Tgci = Tgci*(this%Wc/(dot_product(Tgci,this%Wc))) + Tgc(i,:) = Tgci + end do + else ! B-Spline + do i = 1, size(Xt, 1) + Tgc1 = basis_bspline(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) + Tgc2 = basis_bspline(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) + Tgci = kron(Tgc2, Tgc1) + Tgc(i,:) = Tgci + end do + end if + end subroutine + !=============================================================================== - end if - - - elseif (dir == 2) then! direction 2 - - if(this%is_rational()) then ! NURBS - - do i = 1, size(Xth) - k = findspan(this%nc(2)-1,this%degree(2),Xth(i),this%knot2) - if (this%knot2(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot2, Xth(i)) - else - s = 0 - end if + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine insert_knots(this, dir ,Xth,r) + class(nurbs_surface), intent(inout) :: this + integer, intent(in) :: dir + real(rk), intent(in), contiguous :: Xth(:) + integer, intent(in), contiguous :: r(:) + integer :: k, i, s, dim, j, n_new + real(rk), allocatable :: Xc(:,:), Xcw(:,:), Xcw_new(:,:), Xc_new(:,:), Wc_new(:), knot_new(:) + real(rk), allocatable:: Xc3(:,:,:) + real(rk), allocatable :: knot1(:), knot2(:) + - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do - Xcw(:,dim+1) = this%Wc(:) - - Xc3 = reshape(Xcw, [this%nc(1),this%nc(2),dim+1]) - Xc3 = reshape(Xc3, [this%nc(2),this%nc(1),dim+1], order=[2,1,3]) - Xcw = reshape(Xc3,[this%nc(2),this%nc(1)*(dim+1)]) - - call insert_knot_A_5_1(& - this%degree(2),& - this%knot2,& - Xcw,& - Xth(i),& - k,& - s,& - r(i),& - n_new,& - knot_new,& - Xcw_new) - - Xc3 = reshape(Xcw_new, [n_new+1,this%nc(1),dim+1]) - Xc3 = reshape(Xc3, [this%nc(1),n_new+1,dim+1], order=[2,1,3]) - Xcw_new = reshape(Xc3,[(this%nc(1))*(n_new+1),dim+1]) - - allocate(Xc_new(1:(n_new+1)*this%nc(1),1:dim)) - allocate(Wc_new(1:(n_new+1)*this%nc(1))) - do j = 1, (n_new+1)*this%nc(1) - Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do - Wc_new(:) = Xcw_new(:,dim+1) - - knot1 = this%knot1 - call this%set(knot2=knot_new, knot1=knot1, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw, Xcw_new, Xc_new, Wc_new) - end do - - else ! B-Spline - - do i = 1, size(Xth) - k = findspan(this%nc(2)-1,this%degree(2),Xth(i),this%knot2) - if (this%knot2(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot2, Xth(i)) - else - s = 0 - end if - - dim = size(this%Xc,2) - - Xc3 = reshape(this%Xc, [this%nc(1),this%nc(2),dim]) - Xc3 = reshape(Xc3, [this%nc(2),this%nc(1),dim], order=[2,1,3]) - Xc = reshape(Xc3,[this%nc(2),this%nc(1)*dim]) - - call insert_knot_A_5_1(& - this%degree(2),& - this%knot2,& - Xc,& - Xth(i),& - k,& - s,& - r(i),& - n_new,& - knot_new,& - Xc_new) - - Xc3 = reshape(Xc_new, [n_new+1,this%nc(1),dim]) - Xc3 = reshape(Xc3, [this%nc(1),n_new+1,dim], order=[2,1,3]) - Xc_new = reshape(Xc3,[(this%nc(1))*(n_new+1),dim]) - - knot1 = this%knot1 - call this%set(knot2=knot_new, knot1=knot1, Xc=Xc_new) - end do - + if (dir == 1) then ! direction 1 + + if(this%is_rational()) then ! NURBS + + do i = 1, size(Xth) + k = findspan(this%nc(1)-1,this%degree(1),Xth(i),this%knot1) + if (this%knot1(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot1, Xth(i)) + else + s = 0 + end if + + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do + Xcw(:,dim+1) = this%Wc(:) + + Xcw = reshape(Xcw,[this%nc(1),this%nc(2)*(dim+1)]) + + call insert_knot_A_5_1(& + this%degree(1),& + this%knot1,& + Xcw,& + Xth(i),& + k,& + s,& + r(i),& + n_new,& + knot_new,& + Xcw_new) + + Xcw_new = reshape(Xcw_new,[this%nc(2)*(n_new+1),dim+1]) + + allocate(Xc_new(1:this%nc(2)*(n_new+1),1:dim)) + allocate(Wc_new(1:this%nc(2)*(n_new+1))) + do j = 1, this%nc(2)*(n_new+1) + Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do + Wc_new(:) = Xcw_new(:,dim+1) + + knot2 = this%knot2 + call this%set(knot1=knot_new, knot2=knot2, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw, Xcw_new, Xc_new, Wc_new) + end do + + + else ! B-Spline + + do i = 1, size(Xth) + k = findspan(this%nc(1)-1,this%degree(1),Xth(i),this%knot1) + if (this%knot1(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot1, Xth(i)) + else + s = 0 + end if + + dim = size(this%Xc,2) + + Xc = reshape(this%Xc,[this%nc(1),this%nc(2)*dim]) + + call insert_knot_A_5_1(& + this%degree(1),& + this%knot1,& + Xc,& + Xth(i),& + k,& + s,& + r(i),& + n_new,& + knot_new,& + Xc_new) + + Xc_new = reshape(Xc_new,[(this%nc(2))*(n_new+1),dim]) - end if - - else - error stop 'Invalid direction.' - end if + knot2 = this%knot2 + call this%set(knot1=knot_new, knot2=knot2, Xc=Xc_new) + end do + + end if - end subroutine - !=============================================================================== + + elseif (dir == 2) then! direction 2 - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine elevate_degree(this, dir, t) - class(nurbs_surface), intent(inout) :: this - integer, intent(in) :: dir - integer, intent(in) :: t - real(rk), allocatable :: Xc(:,:), Xcw(:,:), Xcw_new(:,:), knot_new(:), Xc_new(:,:), Wc_new(:) - integer :: dim, j, nc_new - real(rk), allocatable:: Xc3(:,:,:) - real(rk), allocatable :: knot1(:), knot2(:) - - - if (dir == 1) then ! direction 1 - - if(this%is_rational()) then ! NURBS - - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do - Xcw(:,dim+1) = this%Wc(:) - - Xcw = reshape(Xcw,[this%nc(1),this%nc(2)*(dim+1)],order=[1,2]) - - call elevate_degree_A_5_9(t, this%knot1, this%degree(1), Xcw, nc_new, knot_new, Xcw_new) - - Xcw_new = reshape(Xcw_new,[this%nc(2)*nc_new,dim+1],order=[1,2]) - - allocate(Xc_new(1:this%nc(2)*nc_new,1:dim)) - allocate(Wc_new(1:this%nc(2)*nc_new)) - do j = 1, this%nc(2)*nc_new - Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do + if(this%is_rational()) then ! NURBS + + do i = 1, size(Xth) + k = findspan(this%nc(2)-1,this%degree(2),Xth(i),this%knot2) + if (this%knot2(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot2, Xth(i)) + else + s = 0 + end if + + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do + Xcw(:,dim+1) = this%Wc(:) + + Xc3 = reshape(Xcw, [this%nc(1),this%nc(2),dim+1]) + Xc3 = reshape(Xc3, [this%nc(2),this%nc(1),dim+1], order=[2,1,3]) + Xcw = reshape(Xc3,[this%nc(2),this%nc(1)*(dim+1)]) + + call insert_knot_A_5_1(& + this%degree(2),& + this%knot2,& + Xcw,& + Xth(i),& + k,& + s,& + r(i),& + n_new,& + knot_new,& + Xcw_new) + + Xc3 = reshape(Xcw_new, [n_new+1,this%nc(1),dim+1]) + Xc3 = reshape(Xc3, [this%nc(1),n_new+1,dim+1], order=[2,1,3]) + Xcw_new = reshape(Xc3,[(this%nc(1))*(n_new+1),dim+1]) - Wc_new(:) = Xcw_new(:,dim+1) - - knot2 = this%knot2 - call this%set(knot1=knot_new, knot2=knot2, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw, Xcw_new, Xc_new, Wc_new) - - else ! B-Spline - - dim = size(this%Xc,2) - Xc = reshape(this%Xc,[this%nc(1),this%nc(2)*(dim)],order=[1,2]) - - call elevate_degree_A_5_9(t, this%knot1, this%degree(1), Xc, nc_new, knot_new, Xc_new) - - Xc_new = reshape(Xc_new,[this%nc(2)*nc_new,dim],order=[1,2]) - - knot2 = this%knot2 - call this%set(knot1=knot_new, knot2=knot2, Xc=Xc_new) - deallocate(Xc, Xc_new) - - end if - - elseif (dir == 2) then ! direction 2 - - if(this%is_rational()) then ! NURBS - - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do - - Xcw(:,dim+1) = this%Wc(:) - - Xc3 = reshape(Xcw, [this%nc(1),this%nc(2),dim+1]) - Xc3 = reshape(Xc3, [this%nc(2),this%nc(1),dim+1], order=[2,1,3]) - Xcw = reshape(Xc3,[this%nc(2),this%nc(1)*(dim+1)]) - - call elevate_degree_A_5_9(t, this%knot2, this%degree(2), Xcw, nc_new, knot_new, Xcw_new) - - Xc3 = reshape(Xcw_new, [nc_new,this%nc(1),dim+1]) - Xc3 = reshape(Xc3, [this%nc(1),nc_new,dim+1], order=[2,1,3]) - Xcw_new = reshape(Xc3,[(this%nc(1))*nc_new,dim+1]) - - allocate(Xc_new(1:nc_new*this%nc(1),1:dim)) - allocate(Wc_new(1:nc_new*this%nc(1))) - do j = 1, nc_new*this%nc(1) - Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do + allocate(Xc_new(1:(n_new+1)*this%nc(1),1:dim)) + allocate(Wc_new(1:(n_new+1)*this%nc(1))) + do j = 1, (n_new+1)*this%nc(1) + Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do + Wc_new(:) = Xcw_new(:,dim+1) + + knot1 = this%knot1 + call this%set(knot2=knot_new, knot1=knot1, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw, Xcw_new, Xc_new, Wc_new) + end do + + else ! B-Spline + + do i = 1, size(Xth) + k = findspan(this%nc(2)-1,this%degree(2),Xth(i),this%knot2) + if (this%knot2(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot2, Xth(i)) + else + s = 0 + end if + + dim = size(this%Xc,2) + + Xc3 = reshape(this%Xc, [this%nc(1),this%nc(2),dim]) + Xc3 = reshape(Xc3, [this%nc(2),this%nc(1),dim], order=[2,1,3]) + Xc = reshape(Xc3,[this%nc(2),this%nc(1)*dim]) + + call insert_knot_A_5_1(& + this%degree(2),& + this%knot2,& + Xc,& + Xth(i),& + k,& + s,& + r(i),& + n_new,& + knot_new,& + Xc_new) + + Xc3 = reshape(Xc_new, [n_new+1,this%nc(1),dim]) + Xc3 = reshape(Xc3, [this%nc(1),n_new+1,dim], order=[2,1,3]) + Xc_new = reshape(Xc3,[(this%nc(1))*(n_new+1),dim]) + + knot1 = this%knot1 + call this%set(knot2=knot_new, knot1=knot1, Xc=Xc_new) + end do + - Wc_new(:) = Xcw_new(:,dim+1) + end if - knot1 = this%knot1 - call this%set(knot2=knot_new, knot1=knot1, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw, Xcw_new, Xc_new, Wc_new) + else + error stop 'Invalid direction.' + end if - else ! B-Spline - - dim = size(this%Xc,2) + end subroutine + !=============================================================================== + - Xc3 = reshape(this%Xc, [this%nc(1),this%nc(2),dim]) - Xc3 = reshape(Xc3, [this%nc(2),this%nc(1),dim], order=[2,1,3]) - Xc = reshape(Xc3,[this%nc(2),this%nc(1)*dim]) - - call elevate_degree_A_5_9(t, this%knot2, this%degree(2), Xc, nc_new, knot_new, Xc_new) - - Xc3 = reshape(Xc_new, [nc_new,this%nc(1),dim]) - Xc3 = reshape(Xc3, [this%nc(1),nc_new,dim], order=[2,1,3]) - Xc_new = reshape(Xc3,[(this%nc(1))*nc_new,dim]) - - knot1 = this%knot1 - call this%set(knot2=knot_new, knot1=knot1, Xc=Xc_new) + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine elevate_degree(this, dir, t) + class(nurbs_surface), intent(inout) :: this + integer, intent(in) :: dir + integer, intent(in) :: t + real(rk), allocatable :: Xc(:,:), Xcw(:,:), Xcw_new(:,:), knot_new(:), Xc_new(:,:), Wc_new(:) + integer :: dim, j, nc_new + real(rk), allocatable:: Xc3(:,:,:) + real(rk), allocatable :: knot1(:), knot2(:) + - end if + if (dir == 1) then ! direction 1 - else - error stop 'Invalid direction.' - end if - - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function is_rational(this) result(r) - class(nurbs_surface), intent(in) :: this - logical :: r + if(this%is_rational()) then ! NURBS + + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do + Xcw(:,dim+1) = this%Wc(:) + + Xcw = reshape(Xcw,[this%nc(1),this%nc(2)*(dim+1)],order=[1,2]) + + call elevate_degree_A_5_9(t, this%knot1, this%degree(1), Xcw, nc_new, knot_new, Xcw_new) + + Xcw_new = reshape(Xcw_new,[this%nc(2)*nc_new,dim+1],order=[1,2]) - r = .false. - if(allocated(this%Wc)) then - if (any(this%Wc /= this%Wc(1))) then - r = .true. - end if - end if - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine set_elem_Xc_vis(this, elemConn) - class(nurbs_surface), intent(inout) :: this - integer, intent(in), contiguous :: elemConn(:,:) + allocate(Xc_new(1:this%nc(2)*nc_new,1:dim)) + allocate(Wc_new(1:this%nc(2)*nc_new)) + do j = 1, this%nc(2)*nc_new + Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do + + Wc_new(:) = Xcw_new(:,dim+1) + + knot2 = this%knot2 + call this%set(knot1=knot_new, knot2=knot2, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw, Xcw_new, Xc_new, Wc_new) + + else ! B-Spline + + dim = size(this%Xc,2) + Xc = reshape(this%Xc,[this%nc(1),this%nc(2)*(dim)],order=[1,2]) - if (allocated(this%elemConn_Xc_vis)) deallocate(this%elemConn_Xc_vis) - this%elemConn_Xc_vis = elemConn - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine set_elem_Xg_vis(this, elemConn) - class(nurbs_surface), intent(inout) :: this - integer, intent(in), contiguous :: elemConn(:,:) - - if (allocated(this%elemConn_Xg_vis)) deallocate(this%elemConn_Xg_vis) - this%elemConn_Xg_vis = elemConn - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine set_elem(this, elemConn) - class(nurbs_surface), intent(inout) :: this - integer, intent(in), contiguous :: elemConn(:,:) + call elevate_degree_A_5_9(t, this%knot1, this%degree(1), Xc, nc_new, knot_new, Xc_new) + + Xc_new = reshape(Xc_new,[this%nc(2)*nc_new,dim],order=[1,2]) + + knot2 = this%knot2 + call this%set(knot1=knot_new, knot2=knot2, Xc=Xc_new) + deallocate(Xc, Xc_new) + + end if + + elseif (dir == 2) then ! direction 2 + + if(this%is_rational()) then ! NURBS + + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do + + Xcw(:,dim+1) = this%Wc(:) + + Xc3 = reshape(Xcw, [this%nc(1),this%nc(2),dim+1]) + Xc3 = reshape(Xc3, [this%nc(2),this%nc(1),dim+1], order=[2,1,3]) + Xcw = reshape(Xc3,[this%nc(2),this%nc(1)*(dim+1)]) - if (allocated(this%elemConn)) deallocate(this%elemConn) - this%elemConn = elemConn - end subroutine - !=============================================================================== - + call elevate_degree_A_5_9(t, this%knot2, this%degree(2), Xcw, nc_new, knot_new, Xcw_new) + + Xc3 = reshape(Xcw_new, [nc_new,this%nc(1),dim+1]) + Xc3 = reshape(Xc3, [this%nc(1),nc_new,dim+1], order=[2,1,3]) + Xcw_new = reshape(Xc3,[(this%nc(1))*nc_new,dim+1]) - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_elem_Xc_vis(this) result(elemConn) - class(nurbs_surface), intent(in) :: this - integer, allocatable :: elemConn(:,:) - - elemConn = this%elemConn_Xc_vis - end function - !=============================================================================== - + allocate(Xc_new(1:nc_new*this%nc(1),1:dim)) + allocate(Wc_new(1:nc_new*this%nc(1))) + do j = 1, nc_new*this%nc(1) + Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do + + Wc_new(:) = Xcw_new(:,dim+1) + + knot1 = this%knot1 + call this%set(knot2=knot_new, knot1=knot1, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw, Xcw_new, Xc_new, Wc_new) - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_elem_Xg_vis(this) result(elemConn) - class(nurbs_surface), intent(in) :: this - integer, allocatable :: elemConn(:,:) - - elemConn = this%elemConn_Xg_vis - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_elem(this) result(elemConn) - class(nurbs_surface), intent(in) :: this - integer, allocatable :: elemConn(:,:) + else ! B-Spline + + dim = size(this%Xc,2) + + Xc3 = reshape(this%Xc, [this%nc(1),this%nc(2),dim]) + Xc3 = reshape(Xc3, [this%nc(2),this%nc(1),dim], order=[2,1,3]) + Xc = reshape(Xc3,[this%nc(2),this%nc(1)*dim]) + + call elevate_degree_A_5_9(t, this%knot2, this%degree(2), Xc, nc_new, knot_new, Xc_new) + + Xc3 = reshape(Xc_new, [nc_new,this%nc(1),dim]) + Xc3 = reshape(Xc3, [this%nc(1),nc_new,dim], order=[2,1,3]) + Xc_new = reshape(Xc3,[(this%nc(1))*nc_new,dim]) + + knot1 = this%knot1 + call this%set(knot2=knot_new, knot1=knot1, Xc=Xc_new) + + end if - elemConn = this%elemConn - end function - !=============================================================================== + else + error stop 'Invalid direction.' + end if - + end subroutine !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine remove_knots(this, dir ,Xth,r) - class(nurbs_surface), intent(inout) :: this - integer, intent(in) :: dir - real(rk), intent(in), contiguous :: Xth(:) - integer, intent(in), contiguous :: r(:) - integer :: k, i, s, dim, j, nc_new, t - real(rk), allocatable :: Xc(:,:), Xcw(:,:), Xcw_new(:,:), Xc_new(:,:), Wc_new(:), knot_new(:) - real(rk), allocatable:: Xc3(:,:,:) - real(rk), allocatable :: knot1(:), knot2(:) - - - if (dir == 1) then ! direction 1 - - if(this%is_rational()) then ! NURBS - - do i = 1, size(Xth) - k = findspan(this%nc(1)-1,this%degree(1),Xth(i),this%knot1) - if (this%knot1(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot1, Xth(i)) - else - s = 0 - end if - k = k + 1 + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function is_rational(this) result(r) + class(nurbs_surface), intent(in) :: this + logical :: r + + r = .false. + if(allocated(this%Wc)) then + if (any(this%Wc /= this%Wc(1))) then + r = .true. + end if + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine set_elem_Xc_vis(this, elemConn) + class(nurbs_surface), intent(inout) :: this + integer, intent(in), contiguous :: elemConn(:,:) - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do - Xcw(:,dim+1) = this%Wc(:) - - Xcw = reshape(Xcw,[this%nc(1),this%nc(2)*(dim+1)],order=[1,2]) - - call remove_knots_A_5_8(& - this%degree(1),& - this%knot1,& - Xcw,& - Xth(i),& - k,& - s,& - r(i),& - t,& - knot_new,& - Xcw_new) - - if (allocated(Xcw)) deallocate(Xcw) - - if (t == 0) then - ! no change - else - nc_new = size(Xcw_new,1) - Xcw_new = reshape(Xcw_new,[this%nc(2)*(nc_new),dim+1],order=[1,2]) - - allocate(Xc_new(1:this%nc(2)*(nc_new),1:dim)) - allocate(Wc_new(1:this%nc(2)*(nc_new))) - do j = 1, this%nc(2)*(nc_new) - Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do - - Wc_new(:) = Xcw_new(:,dim+1) - - knot2 = this%knot2 - call this%set(knot1=knot_new, knot2=knot2, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw_new, Xc_new, Wc_new) - end if - end do + if (allocated(this%elemConn_Xc_vis)) deallocate(this%elemConn_Xc_vis) + this%elemConn_Xc_vis = elemConn + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine set_elem_Xg_vis(this, elemConn) + class(nurbs_surface), intent(inout) :: this + integer, intent(in), contiguous :: elemConn(:,:) + + if (allocated(this%elemConn_Xg_vis)) deallocate(this%elemConn_Xg_vis) + this%elemConn_Xg_vis = elemConn + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine set_elem(this, elemConn) + class(nurbs_surface), intent(inout) :: this + integer, intent(in), contiguous :: elemConn(:,:) + + if (allocated(this%elemConn)) deallocate(this%elemConn) + this%elemConn = elemConn + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_elem_Xc_vis(this) result(elemConn) + class(nurbs_surface), intent(in) :: this + integer, allocatable :: elemConn(:,:) + + elemConn = this%elemConn_Xc_vis + end function + !=============================================================================== - else ! B-Spline - - do i = 1, size(Xth) - k = findspan(this%nc(1)-1,this%degree(1),Xth(i),this%knot1) - if (this%knot1(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot1, Xth(i)) - else - s = 0 - end if - k = k + 1 + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_elem_Xg_vis(this) result(elemConn) + class(nurbs_surface), intent(in) :: this + integer, allocatable :: elemConn(:,:) + + elemConn = this%elemConn_Xg_vis + end function + !=============================================================================== - dim = size(this%Xc,2) - - Xc = reshape(this%Xc,[this%nc(1),this%nc(2)*dim],order=[1,2]) - - call remove_knots_A_5_8(& - this%degree(1),& - this%knot1,& - Xc,& - Xth(i),& - k,& - s,& - r(i),& - t,& - knot_new,& - Xc_new) - - if (allocated(Xc)) deallocate(Xc) - - if (t == 0) then - ! no change - else - nc_new = size(Xc_new,1) - Xc_new = reshape(Xc_new,[(this%nc(2))*(nc_new),dim],order=[1,2]) - - knot2 = this%knot2 - call this%set(knot1=knot_new, knot2=knot2, Xc=Xc_new) - end if - end do + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_elem(this) result(elemConn) + class(nurbs_surface), intent(in) :: this + integer, allocatable :: elemConn(:,:) + + elemConn = this%elemConn + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine remove_knots(this, dir ,Xth,r) + class(nurbs_surface), intent(inout) :: this + integer, intent(in) :: dir + real(rk), intent(in), contiguous :: Xth(:) + integer, intent(in), contiguous :: r(:) + integer :: k, i, s, dim, j, nc_new, t + real(rk), allocatable :: Xc(:,:), Xcw(:,:), Xcw_new(:,:), Xc_new(:,:), Wc_new(:), knot_new(:) + real(rk), allocatable:: Xc3(:,:,:) + real(rk), allocatable :: knot1(:), knot2(:) + + + if (dir == 1) then ! direction 1 - end if + if(this%is_rational()) then ! NURBS - - elseif (dir == 2) then! direction 2 - - if(this%is_rational()) then ! NURBS - - do i = 1, size(Xth) - k = findspan(this%nc(2)-1,this%degree(2),Xth(i),this%knot2) - if (this%knot2(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot2, Xth(i)) - else - s = 0 - end if - k = k + 1 - - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do - - Xcw(:,dim+1) = this%Wc(:) - - Xc3 = reshape(Xcw, [this%nc(1),this%nc(2),dim+1]) - Xc3 = reshape(Xc3, [this%nc(2),this%nc(1),dim+1], order=[2,1,3]) - Xcw = reshape(Xc3, [this%nc(2),this%nc(1)*(dim+1)]) - - call remove_knots_A_5_8(& - this%degree(2),& - this%knot2,& - Xcw,& - Xth(i),& - k,& - s,& - r(i),& - t,& - knot_new,& - Xcw_new) + do i = 1, size(Xth) + k = findspan(this%nc(1)-1,this%degree(1),Xth(i),this%knot1) + if (this%knot1(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot1, Xth(i)) + else + s = 0 + end if + k = k + 1 + + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do + Xcw(:,dim+1) = this%Wc(:) + + Xcw = reshape(Xcw,[this%nc(1),this%nc(2)*(dim+1)],order=[1,2]) + + call remove_knots_A_5_8(& + this%degree(1),& + this%knot1,& + Xcw,& + Xth(i),& + k,& + s,& + r(i),& + t,& + knot_new,& + Xcw_new) + + if (allocated(Xcw)) deallocate(Xcw) + + if (t == 0) then + ! no change + else + nc_new = size(Xcw_new,1) + Xcw_new = reshape(Xcw_new,[this%nc(2)*(nc_new),dim+1],order=[1,2]) - if (allocated(Xcw)) deallocate(Xcw) - - if (t == 0) then - ! no change - else + allocate(Xc_new(1:this%nc(2)*(nc_new),1:dim)) + allocate(Wc_new(1:this%nc(2)*(nc_new))) + do j = 1, this%nc(2)*(nc_new) + Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do - nc_new = size(Xcw_new,1) - Xc3 = reshape(Xcw_new, [nc_new,this%nc(1),dim+1]) - Xc3 = reshape(Xc3, [this%nc(1),nc_new,dim+1], order=[2,1,3]) - Xcw_new = reshape(Xc3,[(this%nc(1))*(nc_new),dim+1]) - - allocate(Xc_new(1:(nc_new)*this%nc(1),1:dim)) - allocate(Wc_new(1:(nc_new)*this%nc(1))) - do j = 1, (nc_new)*this%nc(1) - Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do + Wc_new(:) = Xcw_new(:,dim+1) + + knot2 = this%knot2 + call this%set(knot1=knot_new, knot2=knot2, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw_new, Xc_new, Wc_new) + end if + end do + + + else ! B-Spline - Wc_new(:) = Xcw_new(:,dim+1) - - knot1 = this%knot1 - call this%set(knot2=knot_new, knot1=knot1, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw_new, Xc_new, Wc_new) - end if - - end do + do i = 1, size(Xth) + k = findspan(this%nc(1)-1,this%degree(1),Xth(i),this%knot1) + if (this%knot1(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot1, Xth(i)) + else + s = 0 + end if + k = k + 1 - else ! B-Spline + dim = size(this%Xc,2) - do i = 1, size(Xth) - k = findspan(this%nc(2)-1,this%degree(2),Xth(i),this%knot2) - if (this%knot2(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot2, Xth(i)) - else - s = 0 - end if - k = k + 1 - - dim = size(this%Xc,2) - - Xc3 = reshape(this%Xc, [this%nc(1),this%nc(2),dim]) - Xc3 = reshape(Xc3, [this%nc(2),this%nc(1),dim], order=[2,1,3]) - Xc = reshape(Xc3,[this%nc(2),this%nc(1)*dim]) - - call remove_knots_A_5_8(& - this%degree(2),& - this%knot2,& - Xc,& - Xth(i),& - k,& - s,& - r(i),& - t,& - knot_new,& - Xc_new) + Xc = reshape(this%Xc,[this%nc(1),this%nc(2)*dim],order=[1,2]) + + call remove_knots_A_5_8(& + this%degree(1),& + this%knot1,& + Xc,& + Xth(i),& + k,& + s,& + r(i),& + t,& + knot_new,& + Xc_new) + + if (allocated(Xc)) deallocate(Xc) + + if (t == 0) then + ! no change + else + nc_new = size(Xc_new,1) + Xc_new = reshape(Xc_new,[(this%nc(2))*(nc_new),dim],order=[1,2]) + + knot2 = this%knot2 + call this%set(knot1=knot_new, knot2=knot2, Xc=Xc_new) + end if + end do - if (allocated(Xc)) deallocate(Xc) + end if - if (t == 0) then - ! no change - else - nc_new = size(Xc_new,1) + + elseif (dir == 2) then! direction 2 + + if(this%is_rational()) then ! NURBS - Xc3 = reshape(Xc_new, [nc_new,this%nc(1),dim]) - Xc3 = reshape(Xc3, [this%nc(1),nc_new,dim], order=[2,1,3]) - Xc_new = reshape(Xc3,[(this%nc(1))*(nc_new),dim]) - - knot1 = this%knot1 - call this%set(knot2=knot_new, knot1=knot1, Xc=Xc_new) + do i = 1, size(Xth) + k = findspan(this%nc(2)-1,this%degree(2),Xth(i),this%knot2) + if (this%knot2(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot2, Xth(i)) + else + s = 0 end if - - end do - - - end if - - else - error stop 'Invalid direction.' - end if + k = k + 1 + + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do + + Xcw(:,dim+1) = this%Wc(:) - end subroutine - !=============================================================================== - + Xc3 = reshape(Xcw, [this%nc(1),this%nc(2),dim+1]) + Xc3 = reshape(Xc3, [this%nc(2),this%nc(1),dim+1], order=[2,1,3]) + Xcw = reshape(Xc3, [this%nc(2),this%nc(1)*(dim+1)]) - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine set_tetragon(this, L, nc, Wc) - class(nurbs_surface), intent(inout) :: this - real(rk), intent(in) :: L(2) - integer, intent(in) :: nc(2) - real(rk), intent(in), contiguous, optional :: Wc(:) - - call this%set(nc = nc, Xc = tetragon_Xc(L, nc), Wc = Wc) - end subroutine - !=============================================================================== - + call remove_knots_A_5_8(& + this%degree(2),& + this%knot2,& + Xcw,& + Xth(i),& + k,& + s,& + r(i),& + t,& + knot_new,& + Xcw_new) + + if (allocated(Xcw)) deallocate(Xcw) - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function cmp_elem(this) result(elemConn) - class(nurbs_surface), intent(in) :: this - integer, allocatable :: elemConn(:,:) - - call elemConn_Cn(this%nc(1), this%nc(2),& - this%degree(1),this%degree(2),& - unique(this%knot1),unique(this%knot2),& - this%get_multiplicity(1),this%get_multiplicity(2),& - elemConn) - end function - !=============================================================================== + if (t == 0) then + ! no change + else + + nc_new = size(Xcw_new,1) + Xc3 = reshape(Xcw_new, [nc_new,this%nc(1),dim+1]) + Xc3 = reshape(Xc3, [this%nc(1),nc_new,dim+1], order=[2,1,3]) + Xcw_new = reshape(Xc3,[(this%nc(1))*(nc_new),dim+1]) + + allocate(Xc_new(1:(nc_new)*this%nc(1),1:dim)) + allocate(Wc_new(1:(nc_new)*this%nc(1))) + do j = 1, (nc_new)*this%nc(1) + Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine rotate_Xc(this, alpha, beta, theta) - class(nurbs_surface), intent(inout) :: this - real(rk), intent(in) :: alpha, beta, theta - integer :: i + Wc_new(:) = Xcw_new(:,dim+1) + + knot1 = this%knot1 + call this%set(knot2=knot_new, knot1=knot1, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw_new, Xc_new, Wc_new) + end if + + end do - do i = 1, this%nc(1)*this%nc(2) - this%Xc(i, :) = matmul(rotation(alpha,beta,theta), this%Xc(i, :)) - end do - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine rotate_Xg(this, alpha, beta, theta) - class(nurbs_surface), intent(inout) :: this - real(rk), intent(in) :: alpha, beta, theta - integer :: i - - do i = 1, this%ng(1)*this%ng(2) - this%Xg(i, :) = matmul(rotation(alpha,beta,theta), this%Xg(i, :)) - end do - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine translate_Xc(this, vec) - class(nurbs_surface), intent(inout) :: this - real(rk), intent(in) :: vec(:) - integer :: i - - do i = 1, this%nc(1)*this%nc(2) - this%Xc(i, :) = this%Xc(i, :) + vec - end do - end subroutine - !=============================================================================== + else ! B-Spline + + do i = 1, size(Xth) + k = findspan(this%nc(2)-1,this%degree(2),Xth(i),this%knot2) + if (this%knot2(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot2, Xth(i)) + else + s = 0 + end if + k = k + 1 + + dim = size(this%Xc,2) + + Xc3 = reshape(this%Xc, [this%nc(1),this%nc(2),dim]) + Xc3 = reshape(Xc3, [this%nc(2),this%nc(1),dim], order=[2,1,3]) + Xc = reshape(Xc3,[this%nc(2),this%nc(1)*dim]) + + call remove_knots_A_5_8(& + this%degree(2),& + this%knot2,& + Xc,& + Xth(i),& + k,& + s,& + r(i),& + t,& + knot_new,& + Xc_new) + + if (allocated(Xc)) deallocate(Xc) + + if (t == 0) then + ! no change + else + nc_new = size(Xc_new,1) - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine translate_Xg(this, vec) - class(nurbs_surface), intent(inout) :: this - real(rk), intent(in) :: vec(:) - integer :: i - - do i = 1, this%ng(1)*this%ng(2) - this%Xg(i, :) = this%Xg(i, :) + vec - end do - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) - class(nurbs_surface), intent(inout) :: this - character(len=*), intent(in) :: vtkfile_Xc, vtkfile_Xg - character(len=3000) :: pyvista_script - - pyvista_script = & - "import pyvista as pv"//achar(10)//& - "pv.global_theme.color = 'white'"//achar(10)//& - "Xc = pv.read('"//trim(vtkfile_Xc)//"')"//achar(10)//& - "Xg = pv.read('"//trim(vtkfile_Xg)//"')"//achar(10)//& - "p = pv.Plotter(lighting='light kit')"//achar(10)//& - "actor_Xcp = p.add_mesh("//achar(10)//& - " Xc,"//achar(10)//& - " style='points',"//achar(10)//& - " point_size=10,"//achar(10)//& - " color='red',"//achar(10)//& - " render_points_as_spheres=True,"//achar(10)//& - " opacity=0.5,"//achar(10)//& - ")"//achar(10)//& - "actor_Xcw = p.add_mesh("//achar(10)//& - " Xc,"//achar(10)//& - " show_edges=True,"//achar(10)//& - " color='yellow',"//achar(10)//& - " line_width=3,"//achar(10)//& - " style='wireframe',"//achar(10)//& - " opacity=0.2"//achar(10)//& - ")"//achar(10)//& - "actor_Xg = p.add_mesh("//achar(10)//& - " Xg,"//achar(10)//& - " show_edges=False,"//achar(10)//& - " color='cyan',"//achar(10)//& - " line_width=7,"//achar(10)//& - " metallic=0.6,"//achar(10)//& - " pbr=True,"//achar(10)//& - " split_sharp_edges=True,"//achar(10)//& - ")"//achar(10)//& - "p.add_axes(interactive=False)"//achar(10)//& - "def point_picker_callback(point):"//achar(10)//& - " mesh = Xc"//achar(10)//& - " point_id = mesh.find_closest_point(point)"//achar(10)//& - " point_coords = mesh.points[point_id]"//achar(10)//& - " label = f'ID: {point_id + 1}\n({point_coords[0]:.3f}, {point_coords[1]:.3f}, {point_coords[2]:.3f})'"//achar(10)//& - " p.add_point_labels("//achar(10)//& - " [point_coords],"//achar(10)//& - " [label],"//achar(10)//& - " font_size=14,"//achar(10)//& - " text_color='black',"//achar(10)//& - " show_points=False,"//achar(10)//& - " fill_shape=False,"//achar(10)//& - " shape=None,"//achar(10)//& - " )"//achar(10)//& - "picker = p.enable_point_picking(callback=point_picker_callback, show_message=False)"//achar(10)//& - "window_size = p.window_size"//achar(10)//& - "y_pos = window_size[1]"//achar(10)//& - "def Xcp_toggle_vis(flag):"//achar(10)//& - " actor_Xcp.SetVisibility(flag)"//achar(10)//& - "def Xcw_toggle_vis(flag):"//achar(10)//& - " actor_Xcw.SetVisibility(flag)"//achar(10)//& - "def Xg_toggle_vis(flag):"//achar(10)//& - " actor_Xg.SetVisibility(flag)"//achar(10)//& - "p.add_checkbox_button_widget("//achar(10)//& - " Xcp_toggle_vis,"//achar(10)//& - " value=True,"//achar(10)//& - " color_on='red',"//achar(10)//& - " size=25,"//achar(10)//& - " position=(0, y_pos - 1 * 25),"//achar(10)//& - ")"//achar(10)//& - "p.add_checkbox_button_widget("//achar(10)//& - " Xcw_toggle_vis,"//achar(10)//& - " value=True,"//achar(10)//& - " color_on='yellow',"//achar(10)//& - " size=25,"//achar(10)//& - " position=(0, y_pos - 2 * 25),"//achar(10)//& - ")"//achar(10)//& - "p.add_checkbox_button_widget("//achar(10)//& - " Xg_toggle_vis,"//achar(10)//& - " value=True,"//achar(10)//& - " color_on='cyan',"//achar(10)//& - " size=25,"//achar(10)//& - " position=(0, y_pos - 3 * 25),"//achar(10)//& - ")"//achar(10)//& - "p.add_text("//achar(10)//& - " 'Xc (Points)',"//achar(10)//& - " position=(25 + 3, y_pos - 1 * 25),"//achar(10)//& - " font_size=8,"//achar(10)//& - " color='black',"//achar(10)//& - " font='times',"//achar(10)//& - ")"//achar(10)//& - "p.add_text("//achar(10)//& - " 'Xc (Control geometry)',"//achar(10)//& - " position=(25 + 3, y_pos - 2 * 25),"//achar(10)//& - " font_size=8,"//achar(10)//& - " color='black',"//achar(10)//& - " font='times',"//achar(10)//& - ")"//achar(10)//& - "p.add_text("//achar(10)//& - " 'Xg (Geometry)',"//achar(10)//& - " position=(25 + 3, y_pos - 3 * 25),"//achar(10)//& - " font_size=8,"//achar(10)//& - " color='black',"//achar(10)//& - " font='times',"//achar(10)//& - ")"//achar(10)//& - "p.add_text('ForCAD', position=(0.0, 10.0), font_size=14, color='black', font='times')"//achar(10)//& - "p.add_text("//achar(10)//& - " 'https://github.com/gha3mi/forcad',"//achar(10)//& - " position=(0.0, 0.0),"//achar(10)//& - " font_size=7,"//achar(10)//& - " color='blue',"//achar(10)//& - " font='times',"//achar(10)//& - ")"//achar(10)//& - "p.show(title='ForCAD', interactive=True)" - - call execute_command_line('python -c "'//trim(adjustl(pyvista_script))//'"') - end subroutine - !=============================================================================== - -end module forcad_nurbs_surface + Xc3 = reshape(Xc_new, [nc_new,this%nc(1),dim]) + Xc3 = reshape(Xc3, [this%nc(1),nc_new,dim], order=[2,1,3]) + Xc_new = reshape(Xc3,[(this%nc(1))*(nc_new),dim]) + + knot1 = this%knot1 + call this%set(knot2=knot_new, knot1=knot1, Xc=Xc_new) + end if + + end do + + + end if + + else + error stop 'Invalid direction.' + end if + + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine set_tetragon(this, L, nc, Wc) + class(nurbs_surface), intent(inout) :: this + real(rk), intent(in) :: L(2) + integer, intent(in) :: nc(2) + real(rk), intent(in), contiguous, optional :: Wc(:) + + call this%set(nc = nc, Xc = tetragon_Xc(L, nc), Wc = Wc) + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function cmp_elem(this) result(elemConn) + class(nurbs_surface), intent(in) :: this + integer, allocatable :: elemConn(:,:) + + call elemConn_Cn(this%nc(1), this%nc(2),& + this%degree(1),this%degree(2),& + unique(this%knot1),unique(this%knot2),& + this%get_multiplicity(1),this%get_multiplicity(2),& + elemConn) + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine rotate_Xc(this, alpha, beta, theta) + class(nurbs_surface), intent(inout) :: this + real(rk), intent(in) :: alpha, beta, theta + integer :: i + + do i = 1, this%nc(1)*this%nc(2) + this%Xc(i, :) = matmul(rotation(alpha,beta,theta), this%Xc(i, :)) + end do + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine rotate_Xg(this, alpha, beta, theta) + class(nurbs_surface), intent(inout) :: this + real(rk), intent(in) :: alpha, beta, theta + integer :: i + + do i = 1, this%ng(1)*this%ng(2) + this%Xg(i, :) = matmul(rotation(alpha,beta,theta), this%Xg(i, :)) + end do + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine translate_Xc(this, vec) + class(nurbs_surface), intent(inout) :: this + real(rk), intent(in) :: vec(:) + integer :: i + + do i = 1, this%nc(1)*this%nc(2) + this%Xc(i, :) = this%Xc(i, :) + vec + end do + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine translate_Xg(this, vec) + class(nurbs_surface), intent(inout) :: this + real(rk), intent(in) :: vec(:) + integer :: i + + do i = 1, this%ng(1)*this%ng(2) + this%Xg(i, :) = this%Xg(i, :) + vec + end do + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) + class(nurbs_surface), intent(inout) :: this + character(len=*), intent(in) :: vtkfile_Xc, vtkfile_Xg + character(len=3000) :: pyvista_script + + pyvista_script = & + "import pyvista as pv"//achar(10)//& + "pv.global_theme.color = 'white'"//achar(10)//& + "Xc = pv.read('"//trim(vtkfile_Xc)//"')"//achar(10)//& + "Xg = pv.read('"//trim(vtkfile_Xg)//"')"//achar(10)//& + "p = pv.Plotter(lighting='light kit')"//achar(10)//& + "actor_Xcp = p.add_mesh("//achar(10)//& + " Xc,"//achar(10)//& + " style='points',"//achar(10)//& + " point_size=10,"//achar(10)//& + " color='red',"//achar(10)//& + " render_points_as_spheres=True,"//achar(10)//& + " opacity=0.5,"//achar(10)//& + ")"//achar(10)//& + "actor_Xcw = p.add_mesh("//achar(10)//& + " Xc,"//achar(10)//& + " show_edges=True,"//achar(10)//& + " color='yellow',"//achar(10)//& + " line_width=3,"//achar(10)//& + " style='wireframe',"//achar(10)//& + " opacity=0.2"//achar(10)//& + ")"//achar(10)//& + "actor_Xg = p.add_mesh("//achar(10)//& + " Xg,"//achar(10)//& + " show_edges=False,"//achar(10)//& + " color='cyan',"//achar(10)//& + " line_width=7,"//achar(10)//& + " metallic=0.6,"//achar(10)//& + " pbr=True,"//achar(10)//& + " split_sharp_edges=True,"//achar(10)//& + ")"//achar(10)//& + "p.add_axes(interactive=False)"//achar(10)//& + "def point_picker_callback(point):"//achar(10)//& + " mesh = Xc"//achar(10)//& + " point_id = mesh.find_closest_point(point)"//achar(10)//& + " point_coords = mesh.points[point_id]"//achar(10)//& + " label = f'ID: {point_id + 1}\n({point_coords[0]:.3f}, {point_coords[1]:.3f}, {point_coords[2]:.3f})'"//achar(10)//& + " p.add_point_labels("//achar(10)//& + " [point_coords],"//achar(10)//& + " [label],"//achar(10)//& + " font_size=14,"//achar(10)//& + " text_color='black',"//achar(10)//& + " show_points=False,"//achar(10)//& + " fill_shape=False,"//achar(10)//& + " shape=None,"//achar(10)//& + " )"//achar(10)//& + "picker = p.enable_point_picking(callback=point_picker_callback, show_message=False)"//achar(10)//& + "window_size = p.window_size"//achar(10)//& + "y_pos = window_size[1]"//achar(10)//& + "def Xcp_toggle_vis(flag):"//achar(10)//& + " actor_Xcp.SetVisibility(flag)"//achar(10)//& + "def Xcw_toggle_vis(flag):"//achar(10)//& + " actor_Xcw.SetVisibility(flag)"//achar(10)//& + "def Xg_toggle_vis(flag):"//achar(10)//& + " actor_Xg.SetVisibility(flag)"//achar(10)//& + "p.add_checkbox_button_widget("//achar(10)//& + " Xcp_toggle_vis,"//achar(10)//& + " value=True,"//achar(10)//& + " color_on='red',"//achar(10)//& + " size=25,"//achar(10)//& + " position=(0, y_pos - 1 * 25),"//achar(10)//& + ")"//achar(10)//& + "p.add_checkbox_button_widget("//achar(10)//& + " Xcw_toggle_vis,"//achar(10)//& + " value=True,"//achar(10)//& + " color_on='yellow',"//achar(10)//& + " size=25,"//achar(10)//& + " position=(0, y_pos - 2 * 25),"//achar(10)//& + ")"//achar(10)//& + "p.add_checkbox_button_widget("//achar(10)//& + " Xg_toggle_vis,"//achar(10)//& + " value=True,"//achar(10)//& + " color_on='cyan',"//achar(10)//& + " size=25,"//achar(10)//& + " position=(0, y_pos - 3 * 25),"//achar(10)//& + ")"//achar(10)//& + "p.add_text("//achar(10)//& + " 'Xc (Points)',"//achar(10)//& + " position=(25 + 3, y_pos - 1 * 25),"//achar(10)//& + " font_size=8,"//achar(10)//& + " color='black',"//achar(10)//& + " font='times',"//achar(10)//& + ")"//achar(10)//& + "p.add_text("//achar(10)//& + " 'Xc (Control geometry)',"//achar(10)//& + " position=(25 + 3, y_pos - 2 * 25),"//achar(10)//& + " font_size=8,"//achar(10)//& + " color='black',"//achar(10)//& + " font='times',"//achar(10)//& + ")"//achar(10)//& + "p.add_text("//achar(10)//& + " 'Xg (Geometry)',"//achar(10)//& + " position=(25 + 3, y_pos - 3 * 25),"//achar(10)//& + " font_size=8,"//achar(10)//& + " color='black',"//achar(10)//& + " font='times',"//achar(10)//& + ")"//achar(10)//& + "p.add_text('ForCAD', position=(0.0, 10.0), font_size=14, color='black', font='times')"//achar(10)//& + "p.add_text("//achar(10)//& + " 'https://github.com/gha3mi/forcad',"//achar(10)//& + " position=(0.0, 0.0),"//achar(10)//& + " font_size=7,"//achar(10)//& + " color='blue',"//achar(10)//& + " font='times',"//achar(10)//& + ")"//achar(10)//& + "p.show(title='ForCAD', interactive=True)" + + call execute_command_line('python -c "'//trim(adjustl(pyvista_script))//'"') + end subroutine + !=============================================================================== + +end module forcad_nurbs_surface @@ -2234,7 +2329,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/sourcefile/forcad_nurbs_volume.f90.html b/sourcefile/forcad_nurbs_volume.f90.html index 50cf95489..be908cc3d 100644 --- a/sourcefile/forcad_nurbs_volume.f90.html +++ b/sourcefile/forcad_nurbs_volume.f90.html @@ -77,7 +77,7 @@

    forcad_nurbs_volume.f90
  • 1324 statements + title="32.0% of total for source files.">1384 statements
  • @@ -521,2140 +521,2235 @@

    Source Code

    procedure :: set3 !!> Set Bezier or Rational Bezier volume using control points and weights generic :: set => set1, set2, set3 !!> Set NURBS volume procedure :: create !!> Generate geometry points - procedure :: get_Xc !!> Get control points - procedure :: get_Xg !!> Get geometry points - procedure :: get_Wc !!> Get weights - procedure :: get_Xt !!> Get parameter values - procedure, private :: get_knot_all !!> Get all knot vectors - procedure, private :: get_knoti !!> Get i-th knot value - generic :: get_knot => get_knoti, get_knot_all !!> Get knot vector - procedure :: get_ng !!> Get number of geometry points - procedure, private :: get_degree_all!!> Get degree of the NURBS volume in all directions - procedure, private :: get_degree_dir!!> Get degree of the NURBS volume in a specific direction - generic :: get_degree => get_degree_all, get_degree_dir !!> Get degree of the NURBS volume - procedure :: finalize !!> Finalize the NURBS volume object - procedure :: cmp_elem_Xc_vis !!> Generate connectivity for control points - procedure :: cmp_elem_Xg_vis !!> Generate connectivity for geometry points - procedure :: cmp_elem !!> Generate IGA element connectivity - procedure :: get_elem_Xc_vis !!> Get connectivity for control points - procedure :: get_elem_Xg_vis !!> Get connectivity for geometry points - procedure :: get_elem !!> Get IGA element connectivity - procedure :: set_elem_Xc_vis !!> Set connectivity for control points - procedure :: set_elem_Xg_vis !!> Set connectivity for geometry points - procedure :: set_elem !!> Set IGA element connectivity - procedure :: export_Xc !!> Export control points to VTK file - procedure :: export_Xg !!> Export geometry points to VTK file - procedure :: modify_Xc !!> Modify control points - procedure :: modify_Wc !!> Modify weights - procedure :: get_multiplicity !!> Get multiplicity of the knot vector - procedure :: get_continuity !!> Get continuity of the volume - procedure :: get_nc !!> Get number of required control points - procedure :: derivative !!> Compute the derivative of the NURBS volume - procedure :: basis !!> Compute the basis functions of the NURBS volume - procedure :: insert_knots !!> Insert knots into the knot vector - procedure :: elevate_degree !!> Elevate the degree of the NURBS volume - procedure :: is_rational !!> Check if the NURBS volume is rational - procedure :: put_to_nurbs !!> Put a shape to a NURBS volume - procedure :: remove_knots !!> Remove knots from the knot vector - procedure :: rotate_Xc !!> Rotate control points - procedure :: rotate_Xg !!> Rotate geometry points - procedure :: translate_Xc !!> Translate control points - procedure :: translate_Xg !!> Translate geometry points - procedure :: show !!> Show the NURBS object using PyVista - - ! Shapes - procedure :: set_hexahedron !!> Set a hexahedron - end type - !=============================================================================== - -contains - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - !> Set control points and weights for the NURBS volume object. - pure subroutine set1(this, knot1, knot2, knot3, Xc, Wc) - class(nurbs_volume), intent(inout) :: this - real(rk), intent(in), contiguous :: knot1(:), knot2(:), knot3(:) - real(rk), intent(in), contiguous :: Xc(:,:) - real(rk), intent(in), contiguous, optional :: Wc(:) - - if (allocated(this%knot1)) deallocate(this%knot1) - if (allocated(this%knot2)) deallocate(this%knot2) - if (allocated(this%knot3)) deallocate(this%knot3) - if (allocated(this%Xc)) deallocate(this%Xc) - - this%knot1 = knot1 - this%knot2 = knot2 - this%knot3 = knot3 - this%degree = this%get_degree() - this%nc(1) = this%get_nc(1) - this%nc(2) = this%get_nc(2) - this%nc(3) = this%get_nc(3) - this%Xc = Xc - if (present(Wc)) then - if (size(Wc) /= this%nc(1)*this%nc(2)*this%nc(3)) then - error stop 'Number of weights does not match the number of control points.' - else - if (allocated(this%Wc)) deallocate(this%Wc) - this%Wc = Wc - end if - end if - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - !> Set control points and weights for the NURBS volume object. - pure subroutine set2(this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc) - class(nurbs_volume), intent(inout) :: this - real(rk), intent(in), contiguous :: Xth_dir1(:), Xth_dir2(:), Xth_dir3(:) - integer, intent(in), contiguous :: degree(:) - integer, intent(in), contiguous :: continuity1(:), continuity2(:), continuity3(:) - real(rk), intent(in), contiguous :: Xc(:,:) - real(rk), intent(in), contiguous, optional :: Wc(:) - - this%knot1 = compute_knot_vector(Xth_dir1, degree(1), continuity1) - this%knot2 = compute_knot_vector(Xth_dir2, degree(2), continuity2) - this%knot3 = compute_knot_vector(Xth_dir3, degree(3), continuity3) - this%degree(1) = degree(1) - this%degree(2) = degree(2) - this%degree(3) = degree(3) - this%nc(1) = this%get_nc(1) - this%nc(2) = this%get_nc(2) - this%nc(3) = this%get_nc(3) - this%Xc = Xc - if (present(Wc)) this%Wc = Wc - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - !> Set Bezier or Rational Bezier volume using control points and weights. - pure subroutine set3(this, nc, Xc, Wc) - class(nurbs_volume), intent(inout) :: this - integer, intent(in), contiguous :: nc(:) - real(rk), intent(in), contiguous :: Xc(:,:) - real(rk), intent(in), contiguous, optional :: Wc(:) - - if (allocated(this%Xc)) deallocate(this%Xc) - - this%Xc = Xc - this%nc = nc - - if (allocated(this%knot1)) deallocate(this%knot1) - allocate(this%knot1(2*this%nc(1))) - this%knot1(1:this%nc(1)) = 0.0_rk - this%knot1(this%nc(1)+1:2*this%nc(1)) = 1.0_rk + procedure, private :: get_Xc_all !!> Get all control points + procedure, private :: get_Xci !!> Get i-th control point + procedure, private :: get_Xcid !!> Get i-th control point in a specific direction + generic :: get_Xc => get_Xc_all, get_Xci, get_Xcid !!> Get control points + procedure, private :: get_Xg_all !!> Get all geometry points + procedure, private :: get_Xgi !!> Get i-th geometry point + procedure, private :: get_Xgid !!> Get i-th geometry point in a specific direction + generic :: get_Xg => get_Xg_all, get_Xgi, get_Xgid !!> Get geometry points + procedure, private :: get_Wc_all !!> Get all weights + procedure, private :: get_Wci !!> Get i-th weight + generic :: get_Wc => get_Wc_all, get_Wci !!> Get weights + procedure :: get_Xt !!> Get parameter values + procedure, private :: get_knot_all !!> Get all knot vectors + procedure, private :: get_knoti !!> Get i-th knot value + generic :: get_knot => get_knoti, get_knot_all !!> Get knot vector + procedure :: get_ng !!> Get number of geometry points + procedure, private :: get_degree_all!!> Get degree of the NURBS volume in all directions + procedure, private :: get_degree_dir!!> Get degree of the NURBS volume in a specific direction + generic :: get_degree => get_degree_all, get_degree_dir !!> Get degree of the NURBS volume + procedure :: finalize !!> Finalize the NURBS volume object + procedure :: cmp_elem_Xc_vis !!> Generate connectivity for control points + procedure :: cmp_elem_Xg_vis !!> Generate connectivity for geometry points + procedure :: cmp_elem !!> Generate IGA element connectivity + procedure :: get_elem_Xc_vis !!> Get connectivity for control points + procedure :: get_elem_Xg_vis !!> Get connectivity for geometry points + procedure :: get_elem !!> Get IGA element connectivity + procedure :: set_elem_Xc_vis !!> Set connectivity for control points + procedure :: set_elem_Xg_vis !!> Set connectivity for geometry points + procedure :: set_elem !!> Set IGA element connectivity + procedure :: export_Xc !!> Export control points to VTK file + procedure :: export_Xg !!> Export geometry points to VTK file + procedure :: modify_Xc !!> Modify control points + procedure :: modify_Wc !!> Modify weights + procedure :: get_multiplicity !!> Get multiplicity of the knot vector + procedure :: get_continuity !!> Get continuity of the volume + procedure :: get_nc !!> Get number of required control points + procedure :: derivative !!> Compute the derivative of the NURBS volume + procedure :: basis !!> Compute the basis functions of the NURBS volume + procedure :: insert_knots !!> Insert knots into the knot vector + procedure :: elevate_degree !!> Elevate the degree of the NURBS volume + procedure :: is_rational !!> Check if the NURBS volume is rational + procedure :: put_to_nurbs !!> Put a shape to a NURBS volume + procedure :: remove_knots !!> Remove knots from the knot vector + procedure :: rotate_Xc !!> Rotate control points + procedure :: rotate_Xg !!> Rotate geometry points + procedure :: translate_Xc !!> Translate control points + procedure :: translate_Xg !!> Translate geometry points + procedure :: show !!> Show the NURBS object using PyVista + + ! Shapes + procedure :: set_hexahedron !!> Set a hexahedron + end type + !=============================================================================== + +contains + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + !> Set control points and weights for the NURBS volume object. + pure subroutine set1(this, knot1, knot2, knot3, Xc, Wc) + class(nurbs_volume), intent(inout) :: this + real(rk), intent(in), contiguous :: knot1(:), knot2(:), knot3(:) + real(rk), intent(in), contiguous :: Xc(:,:) + real(rk), intent(in), contiguous, optional :: Wc(:) + + if (allocated(this%knot1)) deallocate(this%knot1) + if (allocated(this%knot2)) deallocate(this%knot2) + if (allocated(this%knot3)) deallocate(this%knot3) + if (allocated(this%Xc)) deallocate(this%Xc) + + this%knot1 = knot1 + this%knot2 = knot2 + this%knot3 = knot3 + this%degree = this%get_degree() + this%nc(1) = this%get_nc(1) + this%nc(2) = this%get_nc(2) + this%nc(3) = this%get_nc(3) + this%Xc = Xc + if (present(Wc)) then + if (size(Wc) /= this%nc(1)*this%nc(2)*this%nc(3)) then + error stop 'Number of weights does not match the number of control points.' + else + if (allocated(this%Wc)) deallocate(this%Wc) + this%Wc = Wc + end if + end if + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + !> Set control points and weights for the NURBS volume object. + pure subroutine set2(this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc) + class(nurbs_volume), intent(inout) :: this + real(rk), intent(in), contiguous :: Xth_dir1(:), Xth_dir2(:), Xth_dir3(:) + integer, intent(in), contiguous :: degree(:) + integer, intent(in), contiguous :: continuity1(:), continuity2(:), continuity3(:) + real(rk), intent(in), contiguous :: Xc(:,:) + real(rk), intent(in), contiguous, optional :: Wc(:) + + this%knot1 = compute_knot_vector(Xth_dir1, degree(1), continuity1) + this%knot2 = compute_knot_vector(Xth_dir2, degree(2), continuity2) + this%knot3 = compute_knot_vector(Xth_dir3, degree(3), continuity3) + this%degree(1) = degree(1) + this%degree(2) = degree(2) + this%degree(3) = degree(3) + this%nc(1) = this%get_nc(1) + this%nc(2) = this%get_nc(2) + this%nc(3) = this%get_nc(3) + this%Xc = Xc + if (present(Wc)) this%Wc = Wc + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + !> Set Bezier or Rational Bezier volume using control points and weights. + pure subroutine set3(this, nc, Xc, Wc) + class(nurbs_volume), intent(inout) :: this + integer, intent(in), contiguous :: nc(:) + real(rk), intent(in), contiguous :: Xc(:,:) + real(rk), intent(in), contiguous, optional :: Wc(:) + + if (allocated(this%Xc)) deallocate(this%Xc) - if (allocated(this%knot2)) deallocate(this%knot2) - allocate(this%knot2(2*this%nc(2))) - this%knot2(1:this%nc(2)) = 0.0_rk - this%knot2(this%nc(2)+1:2*this%nc(2)) = 1.0_rk - - if (allocated(this%knot3)) deallocate(this%knot3) - allocate(this%knot3(2*this%nc(3))) - this%knot3(1:this%nc(3)) = 0.0_rk - this%knot3(this%nc(3)+1:2*this%nc(3)) = 1.0_rk - - this%degree = this%get_degree() - if (present(Wc)) then - if (size(Wc) /= this%nc(1)*this%nc(2)*this%nc(3)) then - error stop 'Number of weights does not match the number of control points.' - else - if (allocated(this%Wc)) deallocate(this%Wc) - this%Wc = Wc - end if - end if - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine create(this, res1, res2, res3, Xt1, Xt2, Xt3, Xt) - class(nurbs_volume), intent(inout) :: this - integer, intent(in), optional :: res1, res2, res3 - real(rk), intent(in), contiguous, optional :: Xt1(:), Xt2(:), Xt3(:) - real(rk), intent(in), contiguous, optional :: Xt(:,:) - integer :: i, j - real(rk), allocatable :: Tgc1(:), Tgc2(:), Tgc3(:), Tgc(:) - real(rk), allocatable :: Xt_(:,:) - - ! check - if (.not.allocated(this%Xc)) then - error stop 'Control points are not set.' - end if - - if (.not.allocated(this%knot1) .or. .not.allocated(this%knot2) .or. .not.allocated(this%knot3)) then - error stop 'Knot vector(s) is/are not set.' - end if - - ! Set parameter values - if (present(Xt1)) then - if (allocated(this%Xt1)) deallocate(this%Xt1) - this%Xt1 = Xt1 - elseif (present(res1)) then - if (allocated(this%Xt1)) deallocate(this%Xt1) - allocate(this%Xt1(res1)) - this%Xt1 = [(real(i-1, rk) / real(res1-1, rk), i=1, res1)] - ! else - ! this%Xt1 = this%Xt1 - end if - - ! Set parameter values - if (present(Xt2)) then - if (allocated(this%Xt2)) deallocate(this%Xt2) - this%Xt2 = Xt2 - elseif (present(res2)) then - if (allocated(this%Xt2)) deallocate(this%Xt2) - allocate(this%Xt2(res2)) - this%Xt2 = [(real(i-1, rk) / real(res2-1, rk), i=1, res2)] - ! else - ! this%Xt2 = this%Xt2 - end if - - ! Set parameter values - if (present(Xt3)) then - if (allocated(this%Xt3)) deallocate(this%Xt3) - this%Xt3 = Xt3 - elseif (present(res3)) then - if (allocated(this%Xt3)) deallocate(this%Xt3) - allocate(this%Xt3(res3)) - this%Xt3 = [(real(i-1, rk) / real(res3-1, rk), i=1, res3)] - ! else - ! this%Xt3 = this%Xt3 - end if - - if (present(Xt)) then - Xt_ = Xt - else - - ! Set number of geometry points - this%ng(1) = size(this%Xt1,1) - this%ng(2) = size(this%Xt2,1) - this%ng(3) = size(this%Xt3,1) - - call ndgrid(this%Xt1, this%Xt2, this%Xt3, Xt_) - end if + this%Xc = Xc + this%nc = nc + + if (allocated(this%knot1)) deallocate(this%knot1) + allocate(this%knot1(2*this%nc(1))) + this%knot1(1:this%nc(1)) = 0.0_rk + this%knot1(this%nc(1)+1:2*this%nc(1)) = 1.0_rk + + if (allocated(this%knot2)) deallocate(this%knot2) + allocate(this%knot2(2*this%nc(2))) + this%knot2(1:this%nc(2)) = 0.0_rk + this%knot2(this%nc(2)+1:2*this%nc(2)) = 1.0_rk + + if (allocated(this%knot3)) deallocate(this%knot3) + allocate(this%knot3(2*this%nc(3))) + this%knot3(1:this%nc(3)) = 0.0_rk + this%knot3(this%nc(3)+1:2*this%nc(3)) = 1.0_rk + + this%degree = this%get_degree() + if (present(Wc)) then + if (size(Wc) /= this%nc(1)*this%nc(2)*this%nc(3)) then + error stop 'Number of weights does not match the number of control points.' + else + if (allocated(this%Wc)) deallocate(this%Wc) + this%Wc = Wc + end if + end if + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine create(this, res1, res2, res3, Xt1, Xt2, Xt3, Xt) + class(nurbs_volume), intent(inout) :: this + integer, intent(in), optional :: res1, res2, res3 + real(rk), intent(in), contiguous, optional :: Xt1(:), Xt2(:), Xt3(:) + real(rk), intent(in), contiguous, optional :: Xt(:,:) + integer :: i, j + real(rk), allocatable :: Tgc1(:), Tgc2(:), Tgc3(:), Tgc(:) + real(rk), allocatable :: Xt_(:,:) + + ! check + if (.not.allocated(this%Xc)) then + error stop 'Control points are not set.' + end if + + if (.not.allocated(this%knot1) .or. .not.allocated(this%knot2) .or. .not.allocated(this%knot3)) then + error stop 'Knot vector(s) is/are not set.' + end if + + ! Set parameter values + if (present(Xt1)) then + if (allocated(this%Xt1)) deallocate(this%Xt1) + this%Xt1 = Xt1 + elseif (present(res1)) then + if (allocated(this%Xt1)) deallocate(this%Xt1) + allocate(this%Xt1(res1)) + this%Xt1 = [(real(i-1, rk) / real(res1-1, rk), i=1, res1)] + ! else + ! this%Xt1 = this%Xt1 + end if + + ! Set parameter values + if (present(Xt2)) then + if (allocated(this%Xt2)) deallocate(this%Xt2) + this%Xt2 = Xt2 + elseif (present(res2)) then + if (allocated(this%Xt2)) deallocate(this%Xt2) + allocate(this%Xt2(res2)) + this%Xt2 = [(real(i-1, rk) / real(res2-1, rk), i=1, res2)] + ! else + ! this%Xt2 = this%Xt2 + end if + + ! Set parameter values + if (present(Xt3)) then + if (allocated(this%Xt3)) deallocate(this%Xt3) + this%Xt3 = Xt3 + elseif (present(res3)) then + if (allocated(this%Xt3)) deallocate(this%Xt3) + allocate(this%Xt3(res3)) + this%Xt3 = [(real(i-1, rk) / real(res3-1, rk), i=1, res3)] + ! else + ! this%Xt3 = this%Xt3 + end if + + if (present(Xt)) then + Xt_ = Xt + else - if (allocated(this%Xg)) deallocate(this%Xg) - allocate(this%Xg(size(Xt_,1), size(this%Xc,2))) - - if (allocated(this%Wc)) then ! NURBS volume - do i = 1, size(Xt_, 1) - Tgc1 = basis_bspline(Xt_(i,1), this%knot1, this%nc(1), this%degree(1)) - Tgc2 = basis_bspline(Xt_(i,2), this%knot2, this%nc(2), this%degree(2)) - Tgc3 = basis_bspline(Xt_(i,3), this%knot3, this%nc(3), this%degree(3)) - Tgc = kron(Tgc3, kron(Tgc2, Tgc1)) - Tgc = Tgc*(this%Wc/(dot_product(Tgc,this%Wc))) - do j = 1, size(this%Xc, 2) - this%Xg(i,j) = dot_product(Tgc,this%Xc(:,j)) - end do - end do - else - do i = 1, size(Xt_, 1) - Tgc1 = basis_bspline(Xt_(i,1), this%knot1, this%nc(1), this%degree(1)) - Tgc2 = basis_bspline(Xt_(i,2), this%knot2, this%nc(2), this%degree(2)) - Tgc3 = basis_bspline(Xt_(i,3), this%knot3, this%nc(3), this%degree(3)) - Tgc = kron(Tgc3, kron(Tgc2, Tgc1)) - do j = 1, size(this%Xc, 2) - this%Xg(i,j) = dot_product(Tgc,this%Xc(:,j)) - end do - end do - end if - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_Xc(this) result(Xc) - class(nurbs_volume), intent(in) :: this - real(rk), allocatable :: Xc(:,:) + ! Set number of geometry points + this%ng(1) = size(this%Xt1,1) + this%ng(2) = size(this%Xt2,1) + this%ng(3) = size(this%Xt3,1) + + call ndgrid(this%Xt1, this%Xt2, this%Xt3, Xt_) + end if + + if (allocated(this%Xg)) deallocate(this%Xg) + allocate(this%Xg(size(Xt_,1), size(this%Xc,2))) + + if (allocated(this%Wc)) then ! NURBS volume + do i = 1, size(Xt_, 1) + Tgc1 = basis_bspline(Xt_(i,1), this%knot1, this%nc(1), this%degree(1)) + Tgc2 = basis_bspline(Xt_(i,2), this%knot2, this%nc(2), this%degree(2)) + Tgc3 = basis_bspline(Xt_(i,3), this%knot3, this%nc(3), this%degree(3)) + Tgc = kron(Tgc3, kron(Tgc2, Tgc1)) + Tgc = Tgc*(this%Wc/(dot_product(Tgc,this%Wc))) + do j = 1, size(this%Xc, 2) + this%Xg(i,j) = dot_product(Tgc,this%Xc(:,j)) + end do + end do + else + do i = 1, size(Xt_, 1) + Tgc1 = basis_bspline(Xt_(i,1), this%knot1, this%nc(1), this%degree(1)) + Tgc2 = basis_bspline(Xt_(i,2), this%knot2, this%nc(2), this%degree(2)) + Tgc3 = basis_bspline(Xt_(i,3), this%knot3, this%nc(3), this%degree(3)) + Tgc = kron(Tgc3, kron(Tgc2, Tgc1)) + do j = 1, size(this%Xc, 2) + this%Xg(i,j) = dot_product(Tgc,this%Xc(:,j)) + end do + end do + end if + end subroutine + !=============================================================================== - if (allocated(this%Xc)) then - Xc = this%Xc - else - error stop 'Control points are not set.' - end if - end function - !=============================================================================== + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xc_all(this) result(Xc) + class(nurbs_volume), intent(in) :: this + real(rk), allocatable :: Xc(:,:) - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_Xg(this) result(Xg) - class(nurbs_volume), intent(in) :: this - real(rk), allocatable :: Xg(:,:) + if (allocated(this%Xc)) then + Xc = this%Xc + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== - if (allocated(this%Xg)) then - Xg = this%Xg - else - error stop 'Geometry points are not set.' - end if - end function - !=============================================================================== - + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xci(this, n) result(Xc) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: n + real(rk), allocatable :: Xc(:) - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_Wc(this) result(Wc) - class(nurbs_volume), intent(in) :: this - real(rk), allocatable :: Wc(:) - - if (allocated(this%Wc)) then - Wc = this%Wc - else - error stop 'The NURBS volume is not rational.' - end if - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_Xt(this, dir) result(Xt) - class(nurbs_volume), intent(in) :: this - integer, intent(in) :: dir - real(rk), allocatable :: Xt(:) - - if (dir == 1) then - if (allocated(this%Xt1)) then - Xt = this%Xt1 - else - error stop 'Parameter values are not set.' - end if - elseif (dir == 2) then - if (allocated(this%Xt2)) then - Xt = this%Xt2 - else - error stop 'Parameter values are not set.' - end if - elseif (dir == 3) then - if (allocated(this%Xt3)) then - Xt = this%Xt3 - else - error stop 'Parameter values are not set.' - end if - else - error stop 'Invalid direction for parameter values.' - end if - - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_ng(this) result(ng) - class(nurbs_volume), intent(in) :: this - integer :: ng(3) - - ng = this%ng - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_degree_all(this) result(degree) - class(nurbs_volume), intent(in) :: this - integer :: degree(3) - integer, allocatable :: m1(:), m2(:), m3(:) - - m1 = this%get_multiplicity(1) - m2 = this%get_multiplicity(2) - m3 = this%get_multiplicity(3) - - degree(1) = m1(1) - 1 - degree(2) = m2(1) - 1 - degree(3) = m3(1) - 1 - end function + if (allocated(this%Xc)) then + Xc(:) = this%Xc(n,:) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xcid(this, n, dir) result(Xc) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: n + integer, intent(in) :: dir + real(rk) :: Xc + + if (allocated(this%Xc)) then + Xc = this%Xc(n, dir) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xg_all(this) result(Xg) + class(nurbs_volume), intent(in) :: this + real(rk), allocatable :: Xg(:,:) + + if (allocated(this%Xg)) then + Xg = this%Xg + else + error stop 'Geometry points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xgi(this, n) result(Xg) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: n + real(rk), allocatable :: Xg(:) + + if (allocated(this%Xg)) then + Xg(:) = this%Xg(n,:) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xgid(this, n, dir) result(Xg) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: n + integer, intent(in) :: dir + real(rk) :: Xg + + if (allocated(this%Xg)) then + Xg = this%Xg(n, dir) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_degree_dir(this, dir) result(degree) - class(nurbs_volume), intent(in) :: this - integer, intent(in) :: dir - integer :: degree - integer, allocatable :: m1(:), m2(:), m3(:) - - if (dir == 1) then - m1 = this%get_multiplicity(1) - degree = m1(1) - 1 - else if (dir == 2) then - m2 = this%get_multiplicity(2) - degree = m2(1) - 1 - else if (dir == 3) then - m3 = this%get_multiplicity(3) - degree = m3(1) - 1 - else - error stop 'Invalid direction for degree.' - end if - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_knot_all(this, dir) result(knot) - class(nurbs_volume), intent(in) :: this - integer, intent(in) :: dir - real(rk), allocatable :: knot(:) - - if (dir == 1) then - if (allocated(this%knot1)) then - knot = this%knot1 - else - error stop 'Knot vector is not set.' - end if - elseif (dir == 2) then - if (allocated(this%knot2)) then - knot = this%knot2 - else - error stop 'Knot vector is not set.' - end if - elseif (dir == 3) then - if (allocated(this%knot3)) then - knot = this%knot3 - else - error stop 'Knot vector is not set.' - end if - else - error stop 'Invalid direction for knot vector.' - end if - - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_knoti(this, dir, i) result(knot) - class(nurbs_volume), intent(in) :: this - integer, intent(in) :: dir - integer, intent(in) :: i - real(rk) :: knot - - if (dir == 1) then - if (allocated(this%knot1)) then - if (i < 1 .or. i > size(this%knot1)) then - error stop 'Invalid index for knot vector.' - else - knot = this%knot1(i) - end if - else - error stop 'Knot vector is not set.' - end if - elseif (dir == 2) then - if (allocated(this%knot2)) then - if (i < 1 .or. i > size(this%knot2)) then - error stop 'Invalid index for knot vector.' - else - knot = this%knot2(i) - end if - else - error stop 'Knot vector is not set.' - end if - elseif (dir == 3) then - if (allocated(this%knot3)) then - if (i < 1 .or. i > size(this%knot3)) then - error stop 'Invalid index for knot vector.' - else - knot = this%knot3(i) - end if - else - error stop 'Knot vector is not set.' - end if - else - error stop 'Invalid direction for knot vector.' - end if - - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine finalize(this) - class(nurbs_volume), intent(inout) :: this - if (allocated(this%Xc)) deallocate(this%Xc) - if (allocated(this%Xg)) deallocate(this%Xg) - if (allocated(this%Wc)) deallocate(this%Wc) - if (allocated(this%Xt1)) deallocate(this%Xt1) - if (allocated(this%Xt2)) deallocate(this%Xt2) - if (allocated(this%Xt3)) deallocate(this%Xt3) - if (allocated(this%knot1)) deallocate(this%knot1) - if (allocated(this%knot2)) deallocate(this%knot2) - if (allocated(this%knot3)) deallocate(this%knot3) - if (allocated(this%elemConn_Xc_vis)) deallocate(this%elemConn_Xc_vis) - if (allocated(this%elemConn_Xg_vis)) deallocate(this%elemConn_Xg_vis) - if (allocated(this%elemConn)) deallocate(this%elemConn) - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function cmp_elem_Xc_vis(this, p) result(elemConn) - class(nurbs_volume), intent(in) :: this - integer, allocatable :: elemConn(:,:) - integer, intent(in), contiguous, optional :: p(:) - - if (present(p)) then - elemConn = elemConn_C0(this%nc(1), this%nc(2), this%nc(3), p(1), p(2), p(3)) - else - elemConn = elemConn_C0(this%nc(1), this%nc(2), this%nc(3), 1, 1, 1) - end if - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function cmp_elem_Xg_vis(this, p) result(elemConn) - class(nurbs_volume), intent(in) :: this - integer, allocatable :: elemConn(:,:) - integer, intent(in), contiguous, optional :: p(:) - - if (present(p)) then - elemConn = elemConn_C0(this%ng(1), this%ng(2), this%ng(3), p(1), p(2), p(3)) - else - elemConn = elemConn_C0(this%ng(1), this%ng(2), this%ng(3), 1, 1, 1) - end if - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - impure subroutine export_Xc(this, filename) - class(nurbs_volume), intent(in) :: this - character(len=*), intent(in) :: filename - integer :: i, nc, nunit - integer, allocatable :: elemConn(:,:) - - ! check - if (.not.allocated(this%Xc)) then - error stop 'Control points are not set.' - end if - - if (.not.allocated(this%elemConn_Xc_vis)) then - elemConn = this%cmp_elem_Xc_vis() - else - elemConn = this%elemConn_Xc_vis - end if - - nc = size(this%Xc, 1) - - open(newunit=nunit, file=filename, action='write') - write(nunit,'(a)') '# vtk DataFile Version 2.0' - write(nunit,'(a)') 'Generated by ForCAD' - write(nunit,'(a)') 'ASCII' - write(nunit,'(a)') 'DATASET UNSTRUCTURED_GRID' - write(nunit,'(a," ",g0," ",a)') 'POINTS', nc, 'double' - - if (size(this%Xc,2) == 2) then - write(nunit,'(g0," ",g0," ",g0)') (this%Xc(i,1), this%Xc(i,2), 0.0_rk , i = 1, nc) - elseif (size(this%Xc,2) == 3) then - write(nunit,'(g0," ",g0," ",g0)') (this%Xc(i,1), this%Xc(i,2), this%Xc(i,3) , i = 1, nc) - else - error stop 'Invalid dimension for control points.' - end if - - write(nunit,'(a," ",g0," ",g0)') 'CELLS', size(elemConn,1), size(elemConn,1)*(size(elemConn,2)+1) - write(nunit,'(g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0)')& - (8, elemConn(i,1)-1,elemConn(i,2)-1,elemConn(i,4)-1,elemConn(i,3)-1,& - elemConn(i,5)-1,elemConn(i,6)-1,elemConn(i,8)-1,elemConn(i,7)-1, i = 1, size(elemConn,1)) - - write(nunit,'(a," ",g0)') 'CELL_TYPES', size(elemConn,1) - write(nunit,'(g0)') (12 , i = 1, size(elemConn,1)) - close(nunit) - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - impure subroutine export_Xg(this, filename) - class(nurbs_volume), intent(in) :: this - character(len=*), intent(in) :: filename - integer :: i, ng, nunit - integer, allocatable :: elemConn(:,:) - - ! check - if (.not.allocated(this%Xg)) then - error stop 'Geometry points are not set.' - end if - - if (.not.allocated(this%elemConn_Xg_vis)) then - elemConn = this%cmp_elem_Xg_vis() - else - elemConn = this%elemConn_Xg_vis - end if + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Wc_all(this) result(Wc) + class(nurbs_volume), intent(in) :: this + real(rk), allocatable :: Wc(:) + + if (allocated(this%Wc)) then + Wc = this%Wc + else + error stop 'The NURBS volume is not rational or weights are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Wci(this, n) result(Wc) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: n + real(rk) :: Wc + + if (allocated(this%Wc)) then + Wc = this%Wc(n) + else + error stop 'The NURBS volume is not rational or weights are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xt(this, dir) result(Xt) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: dir + real(rk), allocatable :: Xt(:) + + if (dir == 1) then + if (allocated(this%Xt1)) then + Xt = this%Xt1 + else + error stop 'Parameter values are not set.' + end if + elseif (dir == 2) then + if (allocated(this%Xt2)) then + Xt = this%Xt2 + else + error stop 'Parameter values are not set.' + end if + elseif (dir == 3) then + if (allocated(this%Xt3)) then + Xt = this%Xt3 + else + error stop 'Parameter values are not set.' + end if + else + error stop 'Invalid direction for parameter values.' + end if + + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_ng(this) result(ng) + class(nurbs_volume), intent(in) :: this + integer :: ng(3) + + ng = this%ng + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_degree_all(this) result(degree) + class(nurbs_volume), intent(in) :: this + integer :: degree(3) + integer, allocatable :: m1(:), m2(:), m3(:) + + m1 = this%get_multiplicity(1) + m2 = this%get_multiplicity(2) + m3 = this%get_multiplicity(3) + + degree(1) = m1(1) - 1 + degree(2) = m2(1) - 1 + degree(3) = m3(1) - 1 + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_degree_dir(this, dir) result(degree) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: dir + integer :: degree + integer, allocatable :: m1(:), m2(:), m3(:) + + if (dir == 1) then + m1 = this%get_multiplicity(1) + degree = m1(1) - 1 + else if (dir == 2) then + m2 = this%get_multiplicity(2) + degree = m2(1) - 1 + else if (dir == 3) then + m3 = this%get_multiplicity(3) + degree = m3(1) - 1 + else + error stop 'Invalid direction for degree.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_knot_all(this, dir) result(knot) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: dir + real(rk), allocatable :: knot(:) + + if (dir == 1) then + if (allocated(this%knot1)) then + knot = this%knot1 + else + error stop 'Knot vector is not set.' + end if + elseif (dir == 2) then + if (allocated(this%knot2)) then + knot = this%knot2 + else + error stop 'Knot vector is not set.' + end if + elseif (dir == 3) then + if (allocated(this%knot3)) then + knot = this%knot3 + else + error stop 'Knot vector is not set.' + end if + else + error stop 'Invalid direction for knot vector.' + end if + + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_knoti(this, dir, i) result(knot) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: dir + integer, intent(in) :: i + real(rk) :: knot + + if (dir == 1) then + if (allocated(this%knot1)) then + if (i < 1 .or. i > size(this%knot1)) then + error stop 'Invalid index for knot vector.' + else + knot = this%knot1(i) + end if + else + error stop 'Knot vector is not set.' + end if + elseif (dir == 2) then + if (allocated(this%knot2)) then + if (i < 1 .or. i > size(this%knot2)) then + error stop 'Invalid index for knot vector.' + else + knot = this%knot2(i) + end if + else + error stop 'Knot vector is not set.' + end if + elseif (dir == 3) then + if (allocated(this%knot3)) then + if (i < 1 .or. i > size(this%knot3)) then + error stop 'Invalid index for knot vector.' + else + knot = this%knot3(i) + end if + else + error stop 'Knot vector is not set.' + end if + else + error stop 'Invalid direction for knot vector.' + end if + + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine finalize(this) + class(nurbs_volume), intent(inout) :: this + if (allocated(this%Xc)) deallocate(this%Xc) + if (allocated(this%Xg)) deallocate(this%Xg) + if (allocated(this%Wc)) deallocate(this%Wc) + if (allocated(this%Xt1)) deallocate(this%Xt1) + if (allocated(this%Xt2)) deallocate(this%Xt2) + if (allocated(this%Xt3)) deallocate(this%Xt3) + if (allocated(this%knot1)) deallocate(this%knot1) + if (allocated(this%knot2)) deallocate(this%knot2) + if (allocated(this%knot3)) deallocate(this%knot3) + if (allocated(this%elemConn_Xc_vis)) deallocate(this%elemConn_Xc_vis) + if (allocated(this%elemConn_Xg_vis)) deallocate(this%elemConn_Xg_vis) + if (allocated(this%elemConn)) deallocate(this%elemConn) + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function cmp_elem_Xc_vis(this, p) result(elemConn) + class(nurbs_volume), intent(in) :: this + integer, allocatable :: elemConn(:,:) + integer, intent(in), contiguous, optional :: p(:) - ng = size(this%Xg, 1) - - open(newunit=nunit, file=filename, action='write') - write(nunit,'(a)') '# vtk DataFile Version 2.0' - write(nunit,'(a)') 'Generated by ForCAD' - write(nunit,'(a)') 'ASCII' - write(nunit,'(a)') 'DATASET UNSTRUCTURED_GRID' - write(nunit,'(a," ",g0," ",a)') 'POINTS', ng, 'double' + if (present(p)) then + elemConn = elemConn_C0(this%nc(1), this%nc(2), this%nc(3), p(1), p(2), p(3)) + else + elemConn = elemConn_C0(this%nc(1), this%nc(2), this%nc(3), 1, 1, 1) + end if + end function + !=============================================================================== + - if (size(this%Xg,2) == 2) then - write(nunit,'(g0," ",g0," ",g0)') (this%Xg(i,1), this%Xg(i,2), 0.0_rk , i = 1, ng) - elseif (size(this%Xg,2) == 3) then - write(nunit,'(g0," ",g0," ",g0)') (this%Xg(i,1), this%Xg(i,2), this%Xg(i,3) , i = 1, ng) - else - error stop 'Invalid dimension for geometry points.' - end if + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function cmp_elem_Xg_vis(this, p) result(elemConn) + class(nurbs_volume), intent(in) :: this + integer, allocatable :: elemConn(:,:) + integer, intent(in), contiguous, optional :: p(:) - write(nunit,'(a," ",g0," ",g0)') 'CELLS', size(elemConn,1), size(elemConn,1)*(size(elemConn,2)+1) - write(nunit,'(g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0)')& - (8, elemConn(i,1)-1,elemConn(i,2)-1,elemConn(i,4)-1,elemConn(i,3)-1,& - elemConn(i,5)-1,elemConn(i,6)-1,elemConn(i,8)-1,elemConn(i,7)-1, i = 1, size(elemConn,1)) - - write(nunit,'(a," ",g0)') 'CELL_TYPES', size(elemConn,1) - write(nunit,'(g0)') (12 , i = 1, size(elemConn,1)) - close(nunit) - end subroutine + if (present(p)) then + elemConn = elemConn_C0(this%ng(1), this%ng(2), this%ng(3), p(1), p(2), p(3)) + else + elemConn = elemConn_C0(this%ng(1), this%ng(2), this%ng(3), 1, 1, 1) + end if + end function + !=============================================================================== + + !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine modify_Xc(this,X,num,dir) - class(nurbs_volume), intent(inout) :: this - real(rk), intent(in) :: X - integer, intent(in) :: num - integer, intent(in) :: dir - - if (allocated(this%Xc)) then - this%Xc(num,dir) = X - call this%set(knot1 = this%knot1, knot2 = this%knot2, knot3 = this%knot3, Xc = this%Xc, Wc = this%Wc) - else - error stop 'Control points are not set.' - end if - end subroutine - !=============================================================================== - + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + impure subroutine export_Xc(this, filename) + class(nurbs_volume), intent(in) :: this + character(len=*), intent(in) :: filename + integer :: i, nc, nunit + integer, allocatable :: elemConn(:,:) + + ! check + if (.not.allocated(this%Xc)) then + error stop 'Control points are not set.' + end if + + if (.not.allocated(this%elemConn_Xc_vis)) then + elemConn = this%cmp_elem_Xc_vis() + else + elemConn = this%elemConn_Xc_vis + end if + + nc = size(this%Xc, 1) - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine modify_Wc(this,W,num) - class(nurbs_volume), intent(inout) :: this - real(rk), intent(in) :: W - integer, intent(in) :: num - real(rk), allocatable :: knot1(:), knot2(:), knot3(:), Xc(:,:), Wc(:) - - if (allocated(this%Wc)) then - this%Wc(num) = W - Xc = this%Xc - Wc = this%Wc - if (allocated(this%knot1) .and. allocated(this%knot2) .and. allocated(this%knot3)) then - knot1 = this%knot1 - knot2 = this%knot2 - knot3 = this%knot3 - call this%set(knot1 = knot1, knot2 = knot2, knot3 = knot3, Xc = Xc, Wc = Wc) - else - call this%set(nc = this%nc, Xc = Xc, Wc = Wc) - end if - else - error stop 'The NURBS volume is not rational.' - end if - end subroutine - !=============================================================================== + open(newunit=nunit, file=filename, action='write') + write(nunit,'(a)') '# vtk DataFile Version 2.0' + write(nunit,'(a)') 'Generated by ForCAD' + write(nunit,'(a)') 'ASCII' + write(nunit,'(a)') 'DATASET UNSTRUCTURED_GRID' + write(nunit,'(a," ",g0," ",a)') 'POINTS', nc, 'double' + + if (size(this%Xc,2) == 2) then + write(nunit,'(g0," ",g0," ",g0)') (this%Xc(i,1), this%Xc(i,2), 0.0_rk , i = 1, nc) + elseif (size(this%Xc,2) == 3) then + write(nunit,'(g0," ",g0," ",g0)') (this%Xc(i,1), this%Xc(i,2), this%Xc(i,3) , i = 1, nc) + else + error stop 'Invalid dimension for control points.' + end if + + write(nunit,'(a," ",g0," ",g0)') 'CELLS', size(elemConn,1), size(elemConn,1)*(size(elemConn,2)+1) + write(nunit,'(g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0)')& + (8, elemConn(i,1)-1,elemConn(i,2)-1,elemConn(i,4)-1,elemConn(i,3)-1,& + elemConn(i,5)-1,elemConn(i,6)-1,elemConn(i,8)-1,elemConn(i,7)-1, i = 1, size(elemConn,1)) + + write(nunit,'(a," ",g0)') 'CELL_TYPES', size(elemConn,1) + write(nunit,'(g0)') (12 , i = 1, size(elemConn,1)) + close(nunit) + end subroutine + !=============================================================================== + - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_multiplicity(this, dir) result(m) - class(nurbs_volume), intent(in) :: this - integer, intent(in) :: dir - integer, allocatable :: m(:) + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + impure subroutine export_Xg(this, filename) + class(nurbs_volume), intent(in) :: this + character(len=*), intent(in) :: filename + integer :: i, ng, nunit + integer, allocatable :: elemConn(:,:) - if (dir == 1) then - - ! check - if (.not.allocated(this%knot1)) then - error stop 'Knot vector is not set.' - else - m = compute_multiplicity(this%knot1) - end if - - elseif (dir == 2) then + ! check + if (.not.allocated(this%Xg)) then + error stop 'Geometry points are not set.' + end if + + if (.not.allocated(this%elemConn_Xg_vis)) then + elemConn = this%cmp_elem_Xg_vis() + else + elemConn = this%elemConn_Xg_vis + end if - ! check - if (.not.allocated(this%knot2)) then - error stop 'Knot vector is not set.' - else - m = compute_multiplicity(this%knot2) - end if - - elseif (dir == 3) then + ng = size(this%Xg, 1) + + open(newunit=nunit, file=filename, action='write') + write(nunit,'(a)') '# vtk DataFile Version 2.0' + write(nunit,'(a)') 'Generated by ForCAD' + write(nunit,'(a)') 'ASCII' + write(nunit,'(a)') 'DATASET UNSTRUCTURED_GRID' + write(nunit,'(a," ",g0," ",a)') 'POINTS', ng, 'double' - ! check - if (.not.allocated(this%knot3)) then - error stop 'Knot vector is not set.' - else - m = compute_multiplicity(this%knot3) - end if - - else - error stop 'Invalid direction.' - end if - - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_continuity(this, dir) result(c) - class(nurbs_volume), intent(in) :: this - integer, intent(in) :: dir - integer, allocatable :: c(:) - - if (dir == 1) then - - ! check - if (.not.allocated(this%knot1)) then - error stop 'Knot vector is not set.' - else - c = this%degree(1) - compute_multiplicity(this%knot1) - end if - - elseif (dir == 2) then - - ! check - if (.not.allocated(this%knot2)) then - error stop 'Knot vector is not set.' - else - c = this%degree(2) - compute_multiplicity(this%knot2) - end if - - elseif (dir == 3) then - - ! check - if (.not.allocated(this%knot3)) then - error stop 'Knot vector is not set.' - else - c = this%degree(3) - compute_multiplicity(this%knot3) - end if - - else - error stop 'Invalid direction.' - end if - - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_nc(this, dir) result(nc) - class(nurbs_volume), intent(in) :: this - integer, intent(in) :: dir - integer :: nc + if (size(this%Xg,2) == 2) then + write(nunit,'(g0," ",g0," ",g0)') (this%Xg(i,1), this%Xg(i,2), 0.0_rk , i = 1, ng) + elseif (size(this%Xg,2) == 3) then + write(nunit,'(g0," ",g0," ",g0)') (this%Xg(i,1), this%Xg(i,2), this%Xg(i,3) , i = 1, ng) + else + error stop 'Invalid dimension for geometry points.' + end if + + write(nunit,'(a," ",g0," ",g0)') 'CELLS', size(elemConn,1), size(elemConn,1)*(size(elemConn,2)+1) + write(nunit,'(g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0," ",g0)')& + (8, elemConn(i,1)-1,elemConn(i,2)-1,elemConn(i,4)-1,elemConn(i,3)-1,& + elemConn(i,5)-1,elemConn(i,6)-1,elemConn(i,8)-1,elemConn(i,7)-1, i = 1, size(elemConn,1)) + + write(nunit,'(a," ",g0)') 'CELL_TYPES', size(elemConn,1) + write(nunit,'(g0)') (12 , i = 1, size(elemConn,1)) + close(nunit) + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine modify_Xc(this,X,num,dir) + class(nurbs_volume), intent(inout) :: this + real(rk), intent(in) :: X + integer, intent(in) :: num + integer, intent(in) :: dir + + if (allocated(this%Xc)) then + this%Xc(num,dir) = X + call this%set(knot1 = this%knot1, knot2 = this%knot2, knot3 = this%knot3, Xc = this%Xc, Wc = this%Wc) + else + error stop 'Control points are not set.' + end if + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine modify_Wc(this,W,num) + class(nurbs_volume), intent(inout) :: this + real(rk), intent(in) :: W + integer, intent(in) :: num + real(rk), allocatable :: knot1(:), knot2(:), knot3(:), Xc(:,:), Wc(:) + + if (allocated(this%Wc)) then + this%Wc(num) = W + Xc = this%Xc + Wc = this%Wc + if (allocated(this%knot1) .and. allocated(this%knot2) .and. allocated(this%knot3)) then + knot1 = this%knot1 + knot2 = this%knot2 + knot3 = this%knot3 + call this%set(knot1 = knot1, knot2 = knot2, knot3 = knot3, Xc = Xc, Wc = Wc) + else + call this%set(nc = this%nc, Xc = Xc, Wc = Wc) + end if + else + error stop 'The NURBS volume is not rational.' + end if + end subroutine + !=============================================================================== - if (dir == 1) then - - ! check - if (.not.allocated(this%knot1)) then - error stop 'Knot vector is not set.' - else - nc = sum(compute_multiplicity(this%knot1)) - this%degree(1) - 1 - end if + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_multiplicity(this, dir) result(m) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: dir + integer, allocatable :: m(:) - elseif (dir == 2) then + if (dir == 1) then ! check - if (.not.allocated(this%knot2)) then + if (.not.allocated(this%knot1)) then error stop 'Knot vector is not set.' else - nc = sum(compute_multiplicity(this%knot2)) - this%degree(2) - 1 + m = compute_multiplicity(this%knot1) end if - elseif (dir == 3) then + elseif (dir == 2) then ! check - if (.not.allocated(this%knot3)) then + if (.not.allocated(this%knot2)) then error stop 'Knot vector is not set.' else - nc = sum(compute_multiplicity(this%knot3)) - this%degree(3) - 1 + m = compute_multiplicity(this%knot2) end if - else - error stop 'Invalid direction.' - end if - - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine derivative(this, res1, res2, res3, Xt1, Xt2, Xt3, dTgc) - class(nurbs_volume), intent(inout) :: this - integer, intent(in), optional :: res1, res2, res3 - real(rk), intent(in), contiguous, optional :: Xt1(:), Xt2(:), Xt3(:) - real(rk), allocatable, intent(out) :: dTgc(:,:) - real(rk), allocatable :: dTgci(:) - integer :: i - real(rk), allocatable :: dTgc1(:), dTgc2(:), dTgc3(:) - real(rk), allocatable :: Xt(:,:) - - ! Set parameter values - if (present(Xt1)) then - if (allocated(this%Xt1)) deallocate(this%Xt1) - this%Xt1 = Xt1 - elseif (present(res1)) then - if (allocated(this%Xt1)) deallocate(this%Xt1) - allocate(this%Xt1(res1)) - this%Xt1 = [(real(i-1, rk) / real(res1-1, rk), i=1, res1)] - ! else - ! this%Xt1 = this%Xt1 - end if - - ! Set parameter values - if (present(Xt2)) then - if (allocated(this%Xt2)) deallocate(this%Xt2) - this%Xt2 = Xt2 - elseif (present(res2)) then - if (allocated(this%Xt2)) deallocate(this%Xt2) - allocate(this%Xt2(res2)) - this%Xt2 = [(real(i-1, rk) / real(res2-1, rk), i=1, res2)] - ! else - ! this%Xt2 = this%Xt2 - end if + elseif (dir == 3) then + + ! check + if (.not.allocated(this%knot3)) then + error stop 'Knot vector is not set.' + else + m = compute_multiplicity(this%knot3) + end if + + else + error stop 'Invalid direction.' + end if + + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_continuity(this, dir) result(c) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: dir + integer, allocatable :: c(:) + + if (dir == 1) then + + ! check + if (.not.allocated(this%knot1)) then + error stop 'Knot vector is not set.' + else + c = this%degree(1) - compute_multiplicity(this%knot1) + end if + + elseif (dir == 2) then + + ! check + if (.not.allocated(this%knot2)) then + error stop 'Knot vector is not set.' + else + c = this%degree(2) - compute_multiplicity(this%knot2) + end if + + elseif (dir == 3) then - ! Set parameter values - if (present(Xt3)) then - if (allocated(this%Xt3)) deallocate(this%Xt3) - this%Xt3 = Xt3 - elseif (present(res3)) then - if (allocated(this%Xt3)) deallocate(this%Xt3) - allocate(this%Xt3(res3)) - this%Xt3 = [(real(i-1, rk) / real(res3-1, rk), i=1, res3)] - ! else - ! this%Xt3 = this%Xt3 - end if - - ! Set number of geometry points - this%ng(1) = size(this%Xt1,1) - this%ng(2) = size(this%Xt2,1) - this%ng(3) = size(this%Xt3,1) - - call ndgrid(this%Xt1, this%Xt2, this%Xt3, Xt) - - allocate(dTgc(this%ng(1)*this%ng(2)*this%ng(3), this%nc(1)*this%nc(2)*this%nc(3))) - - if (allocated(this%Wc)) then ! NURBS volume - do i = 1, size(Xt, 1) - dTgc1 = basis_bspline_der(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) - dTgc2 = basis_bspline_der(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) - dTgc3 = basis_bspline_der(Xt(i,3), this%knot3, this%nc(3), this%degree(3)) - dTgci = kron(dTgc3, kron(dTgc2, dTgc1)) - dTgci = dTgci*(this%Wc/(dot_product(dTgci,this%Wc))) - dTgc(i,:) = dTgci - end do - else - do i = 1, size(Xt, 1) - dTgc1 = basis_bspline_der(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) - dTgc2 = basis_bspline_der(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) - dTgc3 = basis_bspline_der(Xt(i,3), this%knot3, this%nc(3), this%degree(3)) - dTgci = kron(dTgc3, kron(dTgc2, dTgc1)) - dTgc(i,:) = dTgci - end do - end if - end subroutine - !=============================================================================== - + ! check + if (.not.allocated(this%knot3)) then + error stop 'Knot vector is not set.' + else + c = this%degree(3) - compute_multiplicity(this%knot3) + end if + + else + error stop 'Invalid direction.' + end if + + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_nc(this, dir) result(nc) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: dir + integer :: nc + + if (dir == 1) then + + ! check + if (.not.allocated(this%knot1)) then + error stop 'Knot vector is not set.' + else + nc = sum(compute_multiplicity(this%knot1)) - this%degree(1) - 1 + end if + + elseif (dir == 2) then + + ! check + if (.not.allocated(this%knot2)) then + error stop 'Knot vector is not set.' + else + nc = sum(compute_multiplicity(this%knot2)) - this%degree(2) - 1 + end if + + elseif (dir == 3) then - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine basis(this, res1, res2, res3, Xt1, Xt2, Xt3, Tgc) - class(nurbs_volume), intent(inout) :: this - integer, intent(in), optional :: res1, res2, res3 - real(rk), intent(in), contiguous, optional :: Xt1(:), Xt2(:), Xt3(:) - real(rk), allocatable, intent(out) :: Tgc(:,:) - real(rk), allocatable :: Tgci(:) - integer :: i - real(rk), allocatable :: Tgc1(:), Tgc2(:), Tgc3(:) - real(rk), allocatable :: Xt(:,:) - - ! Set parameter values - if (present(Xt1)) then - if (allocated(this%Xt1)) deallocate(this%Xt1) - this%Xt1 = Xt1 - elseif (present(res1)) then - if (allocated(this%Xt1)) deallocate(this%Xt1) - allocate(this%Xt1(res1)) - this%Xt1 = [(real(i-1, rk) / real(res1-1, rk), i=1, res1)] - ! else - ! this%Xt1 = this%Xt1 - end if - - ! Set parameter values - if (present(Xt2)) then - if (allocated(this%Xt2)) deallocate(this%Xt2) - this%Xt2 = Xt2 - elseif (present(res2)) then - if (allocated(this%Xt2)) deallocate(this%Xt2) - allocate(this%Xt2(res2)) - this%Xt2 = [(real(i-1, rk) / real(res2-1, rk), i=1, res2)] - ! else - ! this%Xt2 = this%Xt2 - end if - - ! Set parameter values - if (present(Xt3)) then - if (allocated(this%Xt3)) deallocate(this%Xt3) - this%Xt3 = Xt3 - elseif (present(res3)) then - if (allocated(this%Xt3)) deallocate(this%Xt3) - allocate(this%Xt3(res3)) - this%Xt3 = [(real(i-1, rk) / real(res3-1, rk), i=1, res3)] - ! else - ! this%Xt3 = this%Xt3 - end if - - ! Set number of geometry points - this%ng(1) = size(this%Xt1,1) - this%ng(2) = size(this%Xt2,1) - this%ng(3) = size(this%Xt3,1) - - call ndgrid(this%Xt1, this%Xt2, this%Xt3, Xt) - - allocate(Tgc(this%ng(1)*this%ng(2)*this%ng(3), this%nc(1)*this%nc(2)*this%nc(3))) - - if (allocated(this%Wc)) then ! NURBS volume - do i = 1, size(Xt, 1) - Tgc1 = basis_bspline(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) - Tgc2 = basis_bspline(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) - Tgc3 = basis_bspline(Xt(i,3), this%knot3, this%nc(3), this%degree(3)) - Tgci = kron(Tgc3, kron(Tgc2, Tgc1)) - Tgci = Tgci*(this%Wc/(dot_product(Tgci,this%Wc))) - Tgc(i,:) = Tgci - end do - else - do i = 1, size(Xt, 1) - Tgc1 = basis_bspline(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) - Tgc2 = basis_bspline(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) - Tgc3 = basis_bspline(Xt(i,3), this%knot3, this%nc(3), this%degree(3)) - Tgci = kron(Tgc3, kron(Tgc2, Tgc1)) - Tgc(i,:) = Tgci - end do - end if - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine insert_knots(this, dir ,Xth,r) - class(nurbs_volume), intent(inout) :: this - integer, intent(in) :: dir - real(rk), intent(in), contiguous :: Xth(:) - integer, intent(in), contiguous :: r(:) - integer :: k, i, s, dim, j, n_new - real(rk), allocatable :: Xc(:,:), Xcw(:,:), Xcw_new(:,:), Xc_new(:,:), Wc_new(:), knot_new(:) - real(rk), allocatable :: Xc4(:,:,:,:) - real(rk), allocatable :: knot1(:), knot2(:), knot3(:) - + ! check + if (.not.allocated(this%knot3)) then + error stop 'Knot vector is not set.' + else + nc = sum(compute_multiplicity(this%knot3)) - this%degree(3) - 1 + end if + + else + error stop 'Invalid direction.' + end if + + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine derivative(this, res1, res2, res3, Xt1, Xt2, Xt3, dTgc) + class(nurbs_volume), intent(inout) :: this + integer, intent(in), optional :: res1, res2, res3 + real(rk), intent(in), contiguous, optional :: Xt1(:), Xt2(:), Xt3(:) + real(rk), allocatable, intent(out) :: dTgc(:,:) + real(rk), allocatable :: dTgci(:) + integer :: i + real(rk), allocatable :: dTgc1(:), dTgc2(:), dTgc3(:) + real(rk), allocatable :: Xt(:,:) + + ! Set parameter values + if (present(Xt1)) then + if (allocated(this%Xt1)) deallocate(this%Xt1) + this%Xt1 = Xt1 + elseif (present(res1)) then + if (allocated(this%Xt1)) deallocate(this%Xt1) + allocate(this%Xt1(res1)) + this%Xt1 = [(real(i-1, rk) / real(res1-1, rk), i=1, res1)] + ! else + ! this%Xt1 = this%Xt1 + end if + + ! Set parameter values + if (present(Xt2)) then + if (allocated(this%Xt2)) deallocate(this%Xt2) + this%Xt2 = Xt2 + elseif (present(res2)) then + if (allocated(this%Xt2)) deallocate(this%Xt2) + allocate(this%Xt2(res2)) + this%Xt2 = [(real(i-1, rk) / real(res2-1, rk), i=1, res2)] + ! else + ! this%Xt2 = this%Xt2 + end if + + ! Set parameter values + if (present(Xt3)) then + if (allocated(this%Xt3)) deallocate(this%Xt3) + this%Xt3 = Xt3 + elseif (present(res3)) then + if (allocated(this%Xt3)) deallocate(this%Xt3) + allocate(this%Xt3(res3)) + this%Xt3 = [(real(i-1, rk) / real(res3-1, rk), i=1, res3)] + ! else + ! this%Xt3 = this%Xt3 + end if + + ! Set number of geometry points + this%ng(1) = size(this%Xt1,1) + this%ng(2) = size(this%Xt2,1) + this%ng(3) = size(this%Xt3,1) + + call ndgrid(this%Xt1, this%Xt2, this%Xt3, Xt) + + allocate(dTgc(this%ng(1)*this%ng(2)*this%ng(3), this%nc(1)*this%nc(2)*this%nc(3))) + + if (allocated(this%Wc)) then ! NURBS volume + do i = 1, size(Xt, 1) + dTgc1 = basis_bspline_der(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) + dTgc2 = basis_bspline_der(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) + dTgc3 = basis_bspline_der(Xt(i,3), this%knot3, this%nc(3), this%degree(3)) + dTgci = kron(dTgc3, kron(dTgc2, dTgc1)) + dTgci = dTgci*(this%Wc/(dot_product(dTgci,this%Wc))) + dTgc(i,:) = dTgci + end do + else + do i = 1, size(Xt, 1) + dTgc1 = basis_bspline_der(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) + dTgc2 = basis_bspline_der(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) + dTgc3 = basis_bspline_der(Xt(i,3), this%knot3, this%nc(3), this%degree(3)) + dTgci = kron(dTgc3, kron(dTgc2, dTgc1)) + dTgc(i,:) = dTgci + end do + end if + end subroutine + !=============================================================================== - if (dir == 1) then ! direction 1 - - if (allocated(this%Wc)) then ! NURBS - - do i = 1, size(Xth) - k = findspan(this%nc(1)-1,this%degree(1),Xth(i),this%knot1) - if (this%knot1(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot1, Xth(i)) - else - s = 0 - end if - - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do - Xcw(:,dim+1) = this%Wc(:) - - Xcw = reshape(Xcw,[this%nc(1),this%nc(2)*this%nc(3)*(dim+1)]) - - call insert_knot_A_5_1(& - this%degree(1),& - this%knot1,& - Xcw,& - Xth(i),& - k,& - s,& - r(i),& - n_new,& - knot_new,& - Xcw_new) - - Xcw_new = reshape(Xcw_new,[(n_new+1)*this%nc(2)*this%nc(3),dim+1]) - - allocate(Xc_new(1:(n_new+1)*this%nc(2)*this%nc(3),1:dim)) - allocate(Wc_new(1:(n_new+1)*this%nc(2)*this%nc(3))) - do j = 1, (n_new+1)*this%nc(2)*this%nc(3) - Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do - Wc_new(:) = Xcw_new(:,dim+1) - - knot2 = this%knot2 - knot3 = this%knot3 - call this%set(knot1=knot_new, knot2=knot2, knot3=knot3, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw, Xcw_new, Xc_new, Wc_new) - end do - - - else ! B-Spline - - do i = 1, size(Xth) - k = findspan(this%nc(1)-1,this%degree(1),Xth(i),this%knot1) - if (this%knot1(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot1, Xth(i)) - else - s = 0 - end if + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine basis(this, res1, res2, res3, Xt1, Xt2, Xt3, Tgc) + class(nurbs_volume), intent(inout) :: this + integer, intent(in), optional :: res1, res2, res3 + real(rk), intent(in), contiguous, optional :: Xt1(:), Xt2(:), Xt3(:) + real(rk), allocatable, intent(out) :: Tgc(:,:) + real(rk), allocatable :: Tgci(:) + integer :: i + real(rk), allocatable :: Tgc1(:), Tgc2(:), Tgc3(:) + real(rk), allocatable :: Xt(:,:) + + ! Set parameter values + if (present(Xt1)) then + if (allocated(this%Xt1)) deallocate(this%Xt1) + this%Xt1 = Xt1 + elseif (present(res1)) then + if (allocated(this%Xt1)) deallocate(this%Xt1) + allocate(this%Xt1(res1)) + this%Xt1 = [(real(i-1, rk) / real(res1-1, rk), i=1, res1)] + ! else + ! this%Xt1 = this%Xt1 + end if + + ! Set parameter values + if (present(Xt2)) then + if (allocated(this%Xt2)) deallocate(this%Xt2) + this%Xt2 = Xt2 + elseif (present(res2)) then + if (allocated(this%Xt2)) deallocate(this%Xt2) + allocate(this%Xt2(res2)) + this%Xt2 = [(real(i-1, rk) / real(res2-1, rk), i=1, res2)] + ! else + ! this%Xt2 = this%Xt2 + end if + + ! Set parameter values + if (present(Xt3)) then + if (allocated(this%Xt3)) deallocate(this%Xt3) + this%Xt3 = Xt3 + elseif (present(res3)) then + if (allocated(this%Xt3)) deallocate(this%Xt3) + allocate(this%Xt3(res3)) + this%Xt3 = [(real(i-1, rk) / real(res3-1, rk), i=1, res3)] + ! else + ! this%Xt3 = this%Xt3 + end if + + ! Set number of geometry points + this%ng(1) = size(this%Xt1,1) + this%ng(2) = size(this%Xt2,1) + this%ng(3) = size(this%Xt3,1) + + call ndgrid(this%Xt1, this%Xt2, this%Xt3, Xt) + + allocate(Tgc(this%ng(1)*this%ng(2)*this%ng(3), this%nc(1)*this%nc(2)*this%nc(3))) - dim = size(this%Xc,2) - - Xc = reshape(this%Xc,[this%nc(1),this%nc(2)*this%nc(3)*dim]) - - call insert_knot_A_5_1(& - this%degree(1),& - this%knot1,& - Xc,& - Xth(i),& - k,& - s,& - r(i),& - n_new,& - knot_new,& - Xc_new) - - Xc_new = reshape(Xc_new,[(n_new+1)*this%nc(2)*this%nc(3),dim]) - - knot2 = this%knot2 - knot3 = this%knot3 - call this%set(knot1=knot_new, knot2=knot2, knot3=knot3, Xc=Xc_new) - end do - - end if - - elseif (dir == 2) then! direction 2 - - if (allocated(this%Wc)) then ! NURBS - - do i = 1, size(Xth) - k = findspan(this%nc(2)-1,this%degree(2),Xth(i),this%knot2) - if (this%knot2(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot2, Xth(i)) - else - s = 0 - end if - - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do - Xcw(:,dim+1) = this%Wc(:) - - Xc4 = reshape(Xcw, [this%nc(1),this%nc(2),this%nc(3),dim+1]) - Xc4 = reshape(Xc4, [this%nc(2),this%nc(1),this%nc(3),dim+1], order=[2,1,3,4]) - Xcw = reshape(Xc4,[this%nc(2),this%nc(1)*this%nc(3)*(dim+1)]) + if (allocated(this%Wc)) then ! NURBS volume + do i = 1, size(Xt, 1) + Tgc1 = basis_bspline(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) + Tgc2 = basis_bspline(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) + Tgc3 = basis_bspline(Xt(i,3), this%knot3, this%nc(3), this%degree(3)) + Tgci = kron(Tgc3, kron(Tgc2, Tgc1)) + Tgci = Tgci*(this%Wc/(dot_product(Tgci,this%Wc))) + Tgc(i,:) = Tgci + end do + else + do i = 1, size(Xt, 1) + Tgc1 = basis_bspline(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) + Tgc2 = basis_bspline(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) + Tgc3 = basis_bspline(Xt(i,3), this%knot3, this%nc(3), this%degree(3)) + Tgci = kron(Tgc3, kron(Tgc2, Tgc1)) + Tgc(i,:) = Tgci + end do + end if + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine insert_knots(this, dir ,Xth,r) + class(nurbs_volume), intent(inout) :: this + integer, intent(in) :: dir + real(rk), intent(in), contiguous :: Xth(:) + integer, intent(in), contiguous :: r(:) + integer :: k, i, s, dim, j, n_new + real(rk), allocatable :: Xc(:,:), Xcw(:,:), Xcw_new(:,:), Xc_new(:,:), Wc_new(:), knot_new(:) + real(rk), allocatable :: Xc4(:,:,:,:) + real(rk), allocatable :: knot1(:), knot2(:), knot3(:) + + + if (dir == 1) then ! direction 1 + + if (allocated(this%Wc)) then ! NURBS + + do i = 1, size(Xth) + k = findspan(this%nc(1)-1,this%degree(1),Xth(i),this%knot1) + if (this%knot1(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot1, Xth(i)) + else + s = 0 + end if - call insert_knot_A_5_1(& - this%degree(2),& - this%knot2,& - Xcw,& - Xth(i),& - k,& - s,& - r(i),& - n_new,& - knot_new,& - Xcw_new) - - Xc4 = reshape(Xcw_new, [n_new+1,this%nc(1),this%nc(3),dim+1]) - Xc4 = reshape(Xc4, [this%nc(1),n_new+1,this%nc(3),dim+1], order=[2,1,3,4]) - Xcw_new = reshape(Xc4,[this%nc(1)*(n_new+1)*this%nc(3),dim+1]) - - allocate(Xc_new(1:this%nc(1)*(n_new+1)*this%nc(3),1:dim)) - allocate(Wc_new(1:this%nc(1)*(n_new+1)*this%nc(3))) - do j = 1, this%nc(1)*(n_new+1)*this%nc(3) - Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do - Wc_new(:) = Xcw_new(:,dim+1) + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do + Xcw(:,dim+1) = this%Wc(:) + + Xcw = reshape(Xcw,[this%nc(1),this%nc(2)*this%nc(3)*(dim+1)]) + + call insert_knot_A_5_1(& + this%degree(1),& + this%knot1,& + Xcw,& + Xth(i),& + k,& + s,& + r(i),& + n_new,& + knot_new,& + Xcw_new) + + Xcw_new = reshape(Xcw_new,[(n_new+1)*this%nc(2)*this%nc(3),dim+1]) - knot1 = this%knot1 - knot3 = this%knot3 - call this%set(knot1=knot1, knot2=knot_new, knot3=knot3, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw, Xcw_new, Xc_new, Wc_new) - end do - - else ! B-Spline - - do i = 1, size(Xth) - k = findspan(this%nc(2)-1,this%degree(2),Xth(i),this%knot2) - if (this%knot2(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot2, Xth(i)) - else - s = 0 - end if + allocate(Xc_new(1:(n_new+1)*this%nc(2)*this%nc(3),1:dim)) + allocate(Wc_new(1:(n_new+1)*this%nc(2)*this%nc(3))) + do j = 1, (n_new+1)*this%nc(2)*this%nc(3) + Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do + Wc_new(:) = Xcw_new(:,dim+1) + + knot2 = this%knot2 + knot3 = this%knot3 + call this%set(knot1=knot_new, knot2=knot2, knot3=knot3, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw, Xcw_new, Xc_new, Wc_new) + end do + + + else ! B-Spline - dim = size(this%Xc,2) - - Xc4 = reshape(this%Xc, [this%nc(1),this%nc(2),this%nc(3),dim]) - Xc4 = reshape(Xc4, [this%nc(2),this%nc(1),this%nc(3),dim], order=[2,1,3,4]) - Xc = reshape(Xc4,[this%nc(2),this%nc(1)*this%nc(3)*dim]) - - call insert_knot_A_5_1(& - this%degree(2),& - this%knot2,& - Xc,& - Xth(i),& - k,& - s,& - r(i),& - n_new,& - knot_new,& - Xc_new) - - Xc4 = reshape(Xc_new, [n_new+1,this%nc(1),this%nc(3),dim]) - Xc4 = reshape(Xc4, [this%nc(1),n_new+1,this%nc(3),dim], order=[2,1,3,4]) - Xc_new = reshape(Xc4,[this%nc(1)*(n_new+1)*this%nc(3),dim]) - - knot1 = this%knot1 - knot3 = this%knot3 - call this%set(knot1=knot1, knot2=knot_new, knot3=knot3, Xc=Xc_new) - end do - - - end if - - elseif (dir == 3) then! direction 3 - - if (allocated(this%Wc)) then ! NURBS - - do i = 1, size(Xth) - k = findspan(this%nc(3)-1,this%degree(3),Xth(i),this%knot3) - if (this%knot3(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot3, Xth(i)) - else - s = 0 - end if - - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do - Xcw(:,dim+1) = this%Wc(:) - - Xc4 = reshape(Xcw, [this%nc(1),this%nc(2),this%nc(3),dim+1]) - Xc4 = reshape(Xc4, [this%nc(3),this%nc(2),this%nc(1),dim+1], order=[3,2,1,4]) - Xcw = reshape(Xc4,[this%nc(3),this%nc(2)*this%nc(1)*(dim+1)]) - - call insert_knot_A_5_1(& - this%degree(3),& - this%knot3,& - Xcw,& - Xth(i),& - k,& - s,& - r(i),& - n_new,& - knot_new,& - Xcw_new) - - Xc4 = reshape(Xcw_new, [n_new+1,this%nc(2),this%nc(1),dim+1]) - Xc4 = reshape(Xc4, [this%nc(1),this%nc(2),n_new+1,dim+1], order=[3,2,1,4]) - Xcw_new = reshape(Xc4,[this%nc(1)*this%nc(2)*(n_new+1),dim+1]) - - allocate(Xc_new(1:this%nc(1)*this%nc(2)*(n_new+1),1:dim)) - allocate(Wc_new(1:this%nc(1)*this%nc(2)*(n_new+1))) - do j = 1, this%nc(1)*this%nc(2)*(n_new+1) - Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do - Wc_new(:) = Xcw_new(:,dim+1) - - knot1 = this%knot1 - knot2 = this%knot2 - call this%set(knot1=knot1, knot2=knot2, knot3=knot_new, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw, Xcw_new, Xc_new, Wc_new) - end do - - else ! B-Spline - - do i = 1, size(Xth) - k = findspan(this%nc(3)-1,this%degree(3),Xth(i),this%knot3) - if (this%knot3(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot3, Xth(i)) - else - s = 0 - end if - - dim = size(this%Xc,2) - - Xc4 = reshape(this%Xc, [this%nc(1),this%nc(2),this%nc(3),dim]) - Xc4 = reshape(Xc4, [this%nc(3),this%nc(2),this%nc(1),dim], order=[3,2,1,4]) - Xc = reshape(Xc4,[this%nc(3),this%nc(2)*this%nc(1)*dim]) - - call insert_knot_A_5_1(& - this%degree(3),& - this%knot3,& - Xc,& - Xth(i),& - k,& - s,& - r(i),& - n_new,& - knot_new,& - Xc_new) - - Xc4 = reshape(Xc_new, [n_new+1,this%nc(2),this%nc(1),dim]) - Xc4 = reshape(Xc4, [this%nc(1),this%nc(2),n_new+1,dim], order=[3,2,1,4]) - Xc_new = reshape(Xc4, [this%nc(1)*this%nc(2)*(n_new+1),dim]) - - knot1 = this%knot1 - knot2 = this%knot2 - call this%set(knot1=knot1, knot2=knot2, knot3=knot_new, Xc=Xc_new) - end do - - end if - - else - error stop 'Invalid direction.' - end if + do i = 1, size(Xth) + k = findspan(this%nc(1)-1,this%degree(1),Xth(i),this%knot1) + if (this%knot1(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot1, Xth(i)) + else + s = 0 + end if + + dim = size(this%Xc,2) + + Xc = reshape(this%Xc,[this%nc(1),this%nc(2)*this%nc(3)*dim]) + + call insert_knot_A_5_1(& + this%degree(1),& + this%knot1,& + Xc,& + Xth(i),& + k,& + s,& + r(i),& + n_new,& + knot_new,& + Xc_new) + + Xc_new = reshape(Xc_new,[(n_new+1)*this%nc(2)*this%nc(3),dim]) + + knot2 = this%knot2 + knot3 = this%knot3 + call this%set(knot1=knot_new, knot2=knot2, knot3=knot3, Xc=Xc_new) + end do + + end if + + elseif (dir == 2) then! direction 2 + + if (allocated(this%Wc)) then ! NURBS + + do i = 1, size(Xth) + k = findspan(this%nc(2)-1,this%degree(2),Xth(i),this%knot2) + if (this%knot2(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot2, Xth(i)) + else + s = 0 + end if + + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do + Xcw(:,dim+1) = this%Wc(:) + + Xc4 = reshape(Xcw, [this%nc(1),this%nc(2),this%nc(3),dim+1]) + Xc4 = reshape(Xc4, [this%nc(2),this%nc(1),this%nc(3),dim+1], order=[2,1,3,4]) + Xcw = reshape(Xc4,[this%nc(2),this%nc(1)*this%nc(3)*(dim+1)]) + + call insert_knot_A_5_1(& + this%degree(2),& + this%knot2,& + Xcw,& + Xth(i),& + k,& + s,& + r(i),& + n_new,& + knot_new,& + Xcw_new) + + Xc4 = reshape(Xcw_new, [n_new+1,this%nc(1),this%nc(3),dim+1]) + Xc4 = reshape(Xc4, [this%nc(1),n_new+1,this%nc(3),dim+1], order=[2,1,3,4]) + Xcw_new = reshape(Xc4,[this%nc(1)*(n_new+1)*this%nc(3),dim+1]) + + allocate(Xc_new(1:this%nc(1)*(n_new+1)*this%nc(3),1:dim)) + allocate(Wc_new(1:this%nc(1)*(n_new+1)*this%nc(3))) + do j = 1, this%nc(1)*(n_new+1)*this%nc(3) + Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do + Wc_new(:) = Xcw_new(:,dim+1) + + knot1 = this%knot1 + knot3 = this%knot3 + call this%set(knot1=knot1, knot2=knot_new, knot3=knot3, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw, Xcw_new, Xc_new, Wc_new) + end do + + else ! B-Spline + + do i = 1, size(Xth) + k = findspan(this%nc(2)-1,this%degree(2),Xth(i),this%knot2) + if (this%knot2(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot2, Xth(i)) + else + s = 0 + end if + + dim = size(this%Xc,2) + + Xc4 = reshape(this%Xc, [this%nc(1),this%nc(2),this%nc(3),dim]) + Xc4 = reshape(Xc4, [this%nc(2),this%nc(1),this%nc(3),dim], order=[2,1,3,4]) + Xc = reshape(Xc4,[this%nc(2),this%nc(1)*this%nc(3)*dim]) + + call insert_knot_A_5_1(& + this%degree(2),& + this%knot2,& + Xc,& + Xth(i),& + k,& + s,& + r(i),& + n_new,& + knot_new,& + Xc_new) + + Xc4 = reshape(Xc_new, [n_new+1,this%nc(1),this%nc(3),dim]) + Xc4 = reshape(Xc4, [this%nc(1),n_new+1,this%nc(3),dim], order=[2,1,3,4]) + Xc_new = reshape(Xc4,[this%nc(1)*(n_new+1)*this%nc(3),dim]) + + knot1 = this%knot1 + knot3 = this%knot3 + call this%set(knot1=knot1, knot2=knot_new, knot3=knot3, Xc=Xc_new) + end do + + + end if - end subroutine - !=============================================================================== - + elseif (dir == 3) then! direction 3 + + if (allocated(this%Wc)) then ! NURBS - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine elevate_degree(this, dir, t) - class(nurbs_volume), intent(inout) :: this - integer, intent(in) :: dir - integer, intent(in) :: t - real(rk), allocatable :: Xc(:,:), Xcw(:,:), Xcw_new(:,:), Xc_new(:,:), Wc_new(:), knot_new(:) - integer :: nc_new, dim, j - real(rk), allocatable:: Xc4(:,:,:,:) - real(rk), allocatable :: knot1(:), knot2(:), knot3(:) - - - if (dir == 1) then ! direction 1 + do i = 1, size(Xth) + k = findspan(this%nc(3)-1,this%degree(3),Xth(i),this%knot3) + if (this%knot3(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot3, Xth(i)) + else + s = 0 + end if + + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do + Xcw(:,dim+1) = this%Wc(:) - if (allocated(this%Wc)) then ! NURBS - - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do - Xcw(:,dim+1) = this%Wc(:) - - Xcw = reshape(Xcw,[this%nc(1),this%nc(2)*this%nc(3)*(dim+1)],order=[1,2]) - - call elevate_degree_A_5_9(t, this%knot1, this%degree(1), Xcw, nc_new, knot_new, Xcw_new) - - Xcw_new = reshape(Xcw_new,[nc_new*this%nc(2)*this%nc(3),dim+1],order=[1,2]) - - allocate(Xc_new(1:nc_new*this%nc(2)*this%nc(3),1:dim)) - allocate(Wc_new(1:nc_new*this%nc(2)*this%nc(3))) - do j = 1, nc_new*this%nc(2)*this%nc(3) - Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do - Wc_new(:) = Xcw_new(:,dim+1) - - knot2 = this%knot2 - knot3 = this%knot3 - call this%set(knot1=knot_new, knot2=knot2, knot3=knot3, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw, Xcw_new, Xc_new, Wc_new) + Xc4 = reshape(Xcw, [this%nc(1),this%nc(2),this%nc(3),dim+1]) + Xc4 = reshape(Xc4, [this%nc(3),this%nc(2),this%nc(1),dim+1], order=[3,2,1,4]) + Xcw = reshape(Xc4,[this%nc(3),this%nc(2)*this%nc(1)*(dim+1)]) + + call insert_knot_A_5_1(& + this%degree(3),& + this%knot3,& + Xcw,& + Xth(i),& + k,& + s,& + r(i),& + n_new,& + knot_new,& + Xcw_new) + + Xc4 = reshape(Xcw_new, [n_new+1,this%nc(2),this%nc(1),dim+1]) + Xc4 = reshape(Xc4, [this%nc(1),this%nc(2),n_new+1,dim+1], order=[3,2,1,4]) + Xcw_new = reshape(Xc4,[this%nc(1)*this%nc(2)*(n_new+1),dim+1]) + + allocate(Xc_new(1:this%nc(1)*this%nc(2)*(n_new+1),1:dim)) + allocate(Wc_new(1:this%nc(1)*this%nc(2)*(n_new+1))) + do j = 1, this%nc(1)*this%nc(2)*(n_new+1) + Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do + Wc_new(:) = Xcw_new(:,dim+1) - else ! B-Spline - - dim = size(this%Xc,2) - - Xc = reshape(this%Xc,[this%nc(1),this%nc(2)*this%nc(3)*dim],order=[1,2]) + knot1 = this%knot1 + knot2 = this%knot2 + call this%set(knot1=knot1, knot2=knot2, knot3=knot_new, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw, Xcw_new, Xc_new, Wc_new) + end do - call elevate_degree_A_5_9(t, this%knot1, this%degree(1), Xc, nc_new, knot_new, Xc_new) + else ! B-Spline - Xc_new = reshape(Xc_new,[nc_new*this%nc(2)*this%nc(3),dim],order=[1,2]) - - knot2 = this%knot2 - knot3 = this%knot3 - call this%set(knot1=knot_new, knot2=knot2, knot3=knot3, Xc=Xc_new) - - end if + do i = 1, size(Xth) + k = findspan(this%nc(3)-1,this%degree(3),Xth(i),this%knot3) + if (this%knot3(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot3, Xth(i)) + else + s = 0 + end if - elseif (dir == 2) then ! direction 2 + dim = size(this%Xc,2) - if (allocated(this%Wc)) then ! NURBS - - - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do - - Xcw(:,dim+1) = this%Wc(:) - - Xc4 = reshape(Xcw, [this%nc(1),this%nc(2),this%nc(3),dim+1]) - Xc4 = reshape(Xc4, [this%nc(2),this%nc(1),this%nc(3),dim+1], order=[2,1,3,4]) - Xcw = reshape(Xc4,[this%nc(2),this%nc(1)*this%nc(3)*(dim+1)]) - + Xc4 = reshape(this%Xc, [this%nc(1),this%nc(2),this%nc(3),dim]) + Xc4 = reshape(Xc4, [this%nc(3),this%nc(2),this%nc(1),dim], order=[3,2,1,4]) + Xc = reshape(Xc4,[this%nc(3),this%nc(2)*this%nc(1)*dim]) + + call insert_knot_A_5_1(& + this%degree(3),& + this%knot3,& + Xc,& + Xth(i),& + k,& + s,& + r(i),& + n_new,& + knot_new,& + Xc_new) - call elevate_degree_A_5_9(t, this%knot2, this%degree(2), Xcw, nc_new, knot_new, Xcw_new) - - Xc4 = reshape(Xcw_new, [nc_new,this%nc(1),this%nc(3),dim+1]) - Xc4 = reshape(Xc4, [this%nc(1),nc_new,this%nc(3),dim+1], order=[2,1,3,4]) - Xcw_new = reshape(Xc4,[this%nc(1)*nc_new*this%nc(3),dim+1]) - - allocate(Xc_new(1:this%nc(1)*nc_new*this%nc(3),1:dim)) - allocate(Wc_new(1:this%nc(1)*nc_new*this%nc(3))) - do j = 1, this%nc(1)*nc_new*this%nc(3) - Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do - - Wc_new(:) = Xcw_new(:,dim+1) - - knot1 = this%knot1 - knot3 = this%knot3 - call this%set(knot1=knot1, knot2=knot_new, knot3=knot3, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw, Xcw_new, Xc_new, Wc_new) + Xc4 = reshape(Xc_new, [n_new+1,this%nc(2),this%nc(1),dim]) + Xc4 = reshape(Xc4, [this%nc(1),this%nc(2),n_new+1,dim], order=[3,2,1,4]) + Xc_new = reshape(Xc4, [this%nc(1)*this%nc(2)*(n_new+1),dim]) + + knot1 = this%knot1 + knot2 = this%knot2 + call this%set(knot1=knot1, knot2=knot2, knot3=knot_new, Xc=Xc_new) + end do + + end if + + else + error stop 'Invalid direction.' + end if + + end subroutine + !=============================================================================== + - else ! B-Spline - - dim = size(this%Xc,2) - - Xc4 = reshape(this%Xc, [this%nc(1),this%nc(2),this%nc(3),dim]) - Xc4 = reshape(Xc4, [this%nc(2),this%nc(1),this%nc(3),dim], order=[2,1,3,4]) - Xc = reshape(Xc4,[this%nc(2),this%nc(1)*this%nc(3)*dim]) - - call elevate_degree_A_5_9(t, this%knot2, this%degree(2), Xc, nc_new, knot_new, Xc_new) - - Xc4 = reshape(Xc_new, [nc_new,this%nc(1),this%nc(3),dim]) - Xc4 = reshape(Xc4, [this%nc(1),nc_new,this%nc(3),dim], order=[2,1,3,4]) - Xc_new = reshape(Xc4,[this%nc(1)*nc_new*this%nc(3),dim]) - - knot1 = this%knot1 - knot3 = this%knot3 - call this%set(knot1=knot1, knot2=knot_new, knot3=knot3, Xc=Xc_new) - - end if - - elseif (dir == 3) then ! direction 3 - - if (allocated(this%Wc)) then ! NURBS + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine elevate_degree(this, dir, t) + class(nurbs_volume), intent(inout) :: this + integer, intent(in) :: dir + integer, intent(in) :: t + real(rk), allocatable :: Xc(:,:), Xcw(:,:), Xcw_new(:,:), Xc_new(:,:), Wc_new(:), knot_new(:) + integer :: nc_new, dim, j + real(rk), allocatable:: Xc4(:,:,:,:) + real(rk), allocatable :: knot1(:), knot2(:), knot3(:) + + + if (dir == 1) then ! direction 1 + + if (allocated(this%Wc)) then ! NURBS + + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do + Xcw(:,dim+1) = this%Wc(:) - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do + Xcw = reshape(Xcw,[this%nc(1),this%nc(2)*this%nc(3)*(dim+1)],order=[1,2]) + + call elevate_degree_A_5_9(t, this%knot1, this%degree(1), Xcw, nc_new, knot_new, Xcw_new) + + Xcw_new = reshape(Xcw_new,[nc_new*this%nc(2)*this%nc(3),dim+1],order=[1,2]) - Xcw(:,dim+1) = this%Wc(:) - - Xc4 = reshape(Xcw, [this%nc(1),this%nc(2),this%nc(3),dim+1]) - Xc4 = reshape(Xc4, [this%nc(3),this%nc(2),this%nc(1),dim+1], order=[3,2,1,4]) - Xcw = reshape(Xc4,[this%nc(3),this%nc(2)*this%nc(1)*(dim+1)]) - - call elevate_degree_A_5_9(t, this%knot3, this%degree(3), Xcw, nc_new, knot_new, Xcw_new) - - Xc4 = reshape(Xcw_new, [nc_new,this%nc(2),this%nc(1),dim+1]) - Xc4 = reshape(Xc4, [this%nc(1),this%nc(2),nc_new,dim+1], order=[3,2,1,4]) - Xcw_new = reshape(Xc4,[this%nc(1)*this%nc(2)*nc_new,dim+1]) + allocate(Xc_new(1:nc_new*this%nc(2)*this%nc(3),1:dim)) + allocate(Wc_new(1:nc_new*this%nc(2)*this%nc(3))) + do j = 1, nc_new*this%nc(2)*this%nc(3) + Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do + Wc_new(:) = Xcw_new(:,dim+1) + + knot2 = this%knot2 + knot3 = this%knot3 + call this%set(knot1=knot_new, knot2=knot2, knot3=knot3, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw, Xcw_new, Xc_new, Wc_new) - allocate(Xc_new(1:this%nc(1)*this%nc(2)*nc_new,1:dim)) - allocate(Wc_new(1:this%nc(1)*this%nc(2)*nc_new)) - do j = 1, this%nc(1)*this%nc(2)*nc_new - Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do + else ! B-Spline + + dim = size(this%Xc,2) + + Xc = reshape(this%Xc,[this%nc(1),this%nc(2)*this%nc(3)*dim],order=[1,2]) - Wc_new(:) = Xcw_new(:,dim+1) + call elevate_degree_A_5_9(t, this%knot1, this%degree(1), Xc, nc_new, knot_new, Xc_new) - knot1 = this%knot1 - knot2 = this%knot2 - call this%set(knot1=knot1, knot2=knot2, knot3=knot_new, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw, Xcw_new, Xc_new, Wc_new) - - else ! B-Spline - - dim = size(this%Xc,2) - - Xc4 = reshape(this%Xc, [this%nc(1),this%nc(2),this%nc(3),dim]) - Xc4 = reshape(Xc4, [this%nc(3),this%nc(2),this%nc(1),dim], order=[3,2,1,4]) - Xc = reshape(Xc4,[this%nc(3),this%nc(2)*this%nc(1)*dim]) + Xc_new = reshape(Xc_new,[nc_new*this%nc(2)*this%nc(3),dim],order=[1,2]) + + knot2 = this%knot2 + knot3 = this%knot3 + call this%set(knot1=knot_new, knot2=knot2, knot3=knot3, Xc=Xc_new) + + end if + + elseif (dir == 2) then ! direction 2 + + if (allocated(this%Wc)) then ! NURBS + - call elevate_degree_A_5_9(t, this%knot3, this%degree(3), Xc, nc_new, knot_new, Xc_new) - - Xc4 = reshape(Xc_new, [nc_new,this%nc(2),this%nc(1),dim]) - Xc4 = reshape(Xc4, [this%nc(1),this%nc(2),nc_new,dim], order=[3,2,1,4]) - Xc_new = reshape(Xc4,[this%nc(1)*this%nc(2)*nc_new,dim]) + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do - knot1 = this%knot1 - knot2 = this%knot2 - call this%set(knot1=knot1, knot2=knot2, knot3=knot_new, Xc=Xc_new) - - end if + Xcw(:,dim+1) = this%Wc(:) + + Xc4 = reshape(Xcw, [this%nc(1),this%nc(2),this%nc(3),dim+1]) + Xc4 = reshape(Xc4, [this%nc(2),this%nc(1),this%nc(3),dim+1], order=[2,1,3,4]) + Xcw = reshape(Xc4,[this%nc(2),this%nc(1)*this%nc(3)*(dim+1)]) - else - error stop 'Invalid direction.' - end if - - end subroutine - !=============================================================================== + + call elevate_degree_A_5_9(t, this%knot2, this%degree(2), Xcw, nc_new, knot_new, Xcw_new) + + Xc4 = reshape(Xcw_new, [nc_new,this%nc(1),this%nc(3),dim+1]) + Xc4 = reshape(Xc4, [this%nc(1),nc_new,this%nc(3),dim+1], order=[2,1,3,4]) + Xcw_new = reshape(Xc4,[this%nc(1)*nc_new*this%nc(3),dim+1]) - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function is_rational(this) result(r) - class(nurbs_volume), intent(in) :: this - logical :: r + allocate(Xc_new(1:this%nc(1)*nc_new*this%nc(3),1:dim)) + allocate(Wc_new(1:this%nc(1)*nc_new*this%nc(3))) + do j = 1, this%nc(1)*nc_new*this%nc(3) + Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do + + Wc_new(:) = Xcw_new(:,dim+1) - r = .false. - if (allocated(this%Wc)) then - if (any(this%Wc /= this%Wc(1))) then - r = .true. - end if - end if - end function - !=============================================================================== + knot1 = this%knot1 + knot3 = this%knot3 + call this%set(knot1=knot1, knot2=knot_new, knot3=knot3, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw, Xcw_new, Xc_new, Wc_new) + + else ! B-Spline + + dim = size(this%Xc,2) - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine set_elem_Xc_vis(this, elemConn) - class(nurbs_volume), intent(inout) :: this - integer, intent(in), contiguous :: elemConn(:,:) - - if (allocated(this%elemConn_Xc_vis)) deallocate(this%elemConn_Xc_vis) - this%elemConn_Xc_vis = elemConn - end subroutine - !=============================================================================== - + Xc4 = reshape(this%Xc, [this%nc(1),this%nc(2),this%nc(3),dim]) + Xc4 = reshape(Xc4, [this%nc(2),this%nc(1),this%nc(3),dim], order=[2,1,3,4]) + Xc = reshape(Xc4,[this%nc(2),this%nc(1)*this%nc(3)*dim]) + + call elevate_degree_A_5_9(t, this%knot2, this%degree(2), Xc, nc_new, knot_new, Xc_new) + + Xc4 = reshape(Xc_new, [nc_new,this%nc(1),this%nc(3),dim]) + Xc4 = reshape(Xc4, [this%nc(1),nc_new,this%nc(3),dim], order=[2,1,3,4]) + Xc_new = reshape(Xc4,[this%nc(1)*nc_new*this%nc(3),dim]) + + knot1 = this%knot1 + knot3 = this%knot3 + call this%set(knot1=knot1, knot2=knot_new, knot3=knot3, Xc=Xc_new) - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine set_elem_Xg_vis(this, elemConn) - class(nurbs_volume), intent(inout) :: this - integer, intent(in), contiguous :: elemConn(:,:) - - if (allocated(this%elemConn_Xg_vis)) deallocate(this%elemConn_Xg_vis) - this%elemConn_Xg_vis = elemConn - end subroutine - !=============================================================================== + end if + + elseif (dir == 3) then ! direction 3 + + if (allocated(this%Wc)) then ! NURBS + + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine set_elem(this, elemConn) - class(nurbs_volume), intent(inout) :: this - integer, intent(in), contiguous :: elemConn(:,:) + Xcw(:,dim+1) = this%Wc(:) + + Xc4 = reshape(Xcw, [this%nc(1),this%nc(2),this%nc(3),dim+1]) + Xc4 = reshape(Xc4, [this%nc(3),this%nc(2),this%nc(1),dim+1], order=[3,2,1,4]) + Xcw = reshape(Xc4,[this%nc(3),this%nc(2)*this%nc(1)*(dim+1)]) + + call elevate_degree_A_5_9(t, this%knot3, this%degree(3), Xcw, nc_new, knot_new, Xcw_new) - if (allocated(this%elemConn)) deallocate(this%elemConn) - this%elemConn = elemConn - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_elem_Xc_vis(this) result(elemConn) - class(nurbs_volume), intent(in) :: this - integer, allocatable :: elemConn(:,:) - - elemConn = this%elemConn_Xc_vis - end function - !=============================================================================== + Xc4 = reshape(Xcw_new, [nc_new,this%nc(2),this%nc(1),dim+1]) + Xc4 = reshape(Xc4, [this%nc(1),this%nc(2),nc_new,dim+1], order=[3,2,1,4]) + Xcw_new = reshape(Xc4,[this%nc(1)*this%nc(2)*nc_new,dim+1]) + + allocate(Xc_new(1:this%nc(1)*this%nc(2)*nc_new,1:dim)) + allocate(Wc_new(1:this%nc(1)*this%nc(2)*nc_new)) + do j = 1, this%nc(1)*this%nc(2)*nc_new + Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do + + Wc_new(:) = Xcw_new(:,dim+1) + + knot1 = this%knot1 + knot2 = this%knot2 + call this%set(knot1=knot1, knot2=knot2, knot3=knot_new, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw, Xcw_new, Xc_new, Wc_new) - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_elem_Xg_vis(this) result(elemConn) - class(nurbs_volume), intent(in) :: this - integer, allocatable :: elemConn(:,:) + else ! B-Spline + + dim = size(this%Xc,2) + + Xc4 = reshape(this%Xc, [this%nc(1),this%nc(2),this%nc(3),dim]) + Xc4 = reshape(Xc4, [this%nc(3),this%nc(2),this%nc(1),dim], order=[3,2,1,4]) + Xc = reshape(Xc4,[this%nc(3),this%nc(2)*this%nc(1)*dim]) - elemConn = this%elemConn_Xg_vis - end function - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function get_elem(this) result(elemConn) - class(nurbs_volume), intent(in) :: this - integer, allocatable :: elemConn(:,:) + call elevate_degree_A_5_9(t, this%knot3, this%degree(3), Xc, nc_new, knot_new, Xc_new) + + Xc4 = reshape(Xc_new, [nc_new,this%nc(2),this%nc(1),dim]) + Xc4 = reshape(Xc4, [this%nc(1),this%nc(2),nc_new,dim], order=[3,2,1,4]) + Xc_new = reshape(Xc4,[this%nc(1)*this%nc(2)*nc_new,dim]) + + knot1 = this%knot1 + knot2 = this%knot2 + call this%set(knot1=knot1, knot2=knot2, knot3=knot_new, Xc=Xc_new) + + end if - elemConn = this%elemConn - end function - !=============================================================================== + else + error stop 'Invalid direction.' + end if - + end subroutine !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine set_hexahedron(this, L, nc, Wc) - class(nurbs_volume), intent(inout) :: this - real(rk), intent(in), contiguous :: L(:) - integer, intent(in), contiguous :: nc(:) - real(rk), intent(in), contiguous, optional :: Wc(:) - - if (present(Wc)) then - call this%set(nc, hexahedron_Xc(L, nc), Wc) - else - call this%set(nc, hexahedron_Xc(L, nc)) - end if - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine put_to_nurbs(this, X, elemConn) - class(nurbs_volume), intent(inout) :: this - real(rk), intent(in), contiguous :: X(:,:) - integer, intent(in), contiguous :: elemConn(:,:) - integer :: i, j - real(rk), allocatable :: Tgc1(:), Tgc2(:), Tgc3(:), Tgc(:) - real(rk), allocatable :: Xt(:,:) - real(rk) :: min_X1, max_X1, min_X2, max_X2, min_X3, max_X3 - - ! Assuming knot vectors are in the range [0,1] - ! Normalize the X coordinates to the range [0,1] - allocate(Xt(size(X,1), size(X,2))) - min_X1 = minval(X(:,1)) - max_X1 = maxval(X(:,1)) - - min_X2 = minval(X(:,2)) - max_X2 = maxval(X(:,2)) - - min_X3 = minval(X(:,3)) - max_X3 = maxval(X(:,3)) - - Xt(:,1) = (X(:,1) - min_X1) / (max_X1 - min_X1) - Xt(:,2) = (X(:,2) - min_X2) / (max_X2 - min_X2) - Xt(:,3) = (X(:,3) - min_X3) / (max_X3 - min_X3) + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function is_rational(this) result(r) + class(nurbs_volume), intent(in) :: this + logical :: r + + r = .false. + if (allocated(this%Wc)) then + if (any(this%Wc /= this%Wc(1))) then + r = .true. + end if + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine set_elem_Xc_vis(this, elemConn) + class(nurbs_volume), intent(inout) :: this + integer, intent(in), contiguous :: elemConn(:,:) + + if (allocated(this%elemConn_Xc_vis)) deallocate(this%elemConn_Xc_vis) + this%elemConn_Xc_vis = elemConn + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine set_elem_Xg_vis(this, elemConn) + class(nurbs_volume), intent(inout) :: this + integer, intent(in), contiguous :: elemConn(:,:) + + if (allocated(this%elemConn_Xg_vis)) deallocate(this%elemConn_Xg_vis) + this%elemConn_Xg_vis = elemConn + end subroutine + !=============================================================================== + - allocate(this%Xg(size(Xt,1), size(this%Xc,2))) - - if (allocated(this%Wc)) then ! NURBS volume - do i = 1, size(Xt, 1) - Tgc1 = basis_bspline(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) - Tgc2 = basis_bspline(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) - Tgc3 = basis_bspline(Xt(i,3), this%knot3, this%nc(3), this%degree(3)) - Tgc = kron(Tgc3, kron(Tgc2, Tgc1)) - Tgc = Tgc*(this%Wc/(dot_product(Tgc,this%Wc))) - do j = 1, size(this%Xc, 2) - this%Xg(i,j) = dot_product(Tgc,this%Xc(:,j)) - end do - end do - else ! B-Spline volume - do i = 1, size(Xt, 1) - Tgc1 = basis_bspline(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) - Tgc2 = basis_bspline(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) - Tgc3 = basis_bspline(Xt(i,3), this%knot3, this%nc(3), this%degree(3)) - Tgc = kron(Tgc3, kron(Tgc2, Tgc1)) - do j = 1, size(this%Xc, 2) - this%Xg(i,j) = dot_product(Tgc,this%Xc(:,j)) - end do - end do - end if + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine set_elem(this, elemConn) + class(nurbs_volume), intent(inout) :: this + integer, intent(in), contiguous :: elemConn(:,:) + + if (allocated(this%elemConn)) deallocate(this%elemConn) + this%elemConn = elemConn + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_elem_Xc_vis(this) result(elemConn) + class(nurbs_volume), intent(in) :: this + integer, allocatable :: elemConn(:,:) + + elemConn = this%elemConn_Xc_vis + end function + !=============================================================================== + - call this%set_elem_Xg_vis(elemConn) - - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine remove_knots(this, dir ,Xth,r) - class(nurbs_volume), intent(inout) :: this - integer, intent(in) :: dir - real(rk), intent(in), contiguous :: Xth(:) - integer, intent(in), contiguous :: r(:) - integer :: k, i, s, dim, j, nc_new, t - real(rk), allocatable :: Xc(:,:), Xcw(:,:), Xcw_new(:,:), Xc_new(:,:), Wc_new(:), knot_new(:) - real(rk), allocatable :: Xc4(:,:,:,:) - real(rk), allocatable :: knot1(:), knot2(:), knot3(:) + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_elem_Xg_vis(this) result(elemConn) + class(nurbs_volume), intent(in) :: this + integer, allocatable :: elemConn(:,:) + + elemConn = this%elemConn_Xg_vis + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_elem(this) result(elemConn) + class(nurbs_volume), intent(in) :: this + integer, allocatable :: elemConn(:,:) - - if (dir == 1) then ! direction 1 - - if (allocated(this%Wc)) then ! NURBS + elemConn = this%elemConn + end function + !=============================================================================== + - do i = 1, size(Xth) - k = findspan(this%nc(1)-1,this%degree(1),Xth(i),this%knot1) - if (this%knot1(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot1, Xth(i)) - else - s = 0 - end if - k = k + 1 + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine set_hexahedron(this, L, nc, Wc) + class(nurbs_volume), intent(inout) :: this + real(rk), intent(in), contiguous :: L(:) + integer, intent(in), contiguous :: nc(:) + real(rk), intent(in), contiguous, optional :: Wc(:) - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do - Xcw(:,dim+1) = this%Wc(:) - - Xcw = reshape(Xcw,[this%nc(1),this%nc(2)*this%nc(3)*(dim+1)],order=[1,2]) + if (present(Wc)) then + call this%set(nc, hexahedron_Xc(L, nc), Wc) + else + call this%set(nc, hexahedron_Xc(L, nc)) + end if + end subroutine + !=============================================================================== + - call remove_knots_A_5_8(& - this%degree(1),& - this%knot1,& - Xcw,& - Xth(i),& - k,& - s,& - r(i),& - t,& - knot_new,& - Xcw_new) + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine put_to_nurbs(this, X, elemConn) + class(nurbs_volume), intent(inout) :: this + real(rk), intent(in), contiguous :: X(:,:) + integer, intent(in), contiguous :: elemConn(:,:) + integer :: i, j + real(rk), allocatable :: Tgc1(:), Tgc2(:), Tgc3(:), Tgc(:) + real(rk), allocatable :: Xt(:,:) + real(rk) :: min_X1, max_X1, min_X2, max_X2, min_X3, max_X3 - if (allocated(Xcw)) deallocate(Xcw) - - if (t == 0) then - ! no change - else - nc_new = size(Xcw_new,1) - Xcw_new = reshape(Xcw_new,[(nc_new)*this%nc(2)*this%nc(3),dim+1],order=[1,2]) - - allocate(Xc_new(1:(nc_new)*this%nc(2)*this%nc(3),1:dim)) - allocate(Wc_new(1:(nc_new)*this%nc(2)*this%nc(3))) - do j = 1, (nc_new)*this%nc(2)*this%nc(3) - Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do - Wc_new(:) = Xcw_new(:,dim+1) - - knot2 = this%knot2 - knot3 = this%knot3 - call this%set(knot1=knot_new, knot2=knot2, knot3=knot3, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw_new, Xc_new, Wc_new) - end if - end do - - - else ! B-Spline - - do i = 1, size(Xth) - k = findspan(this%nc(1)-1,this%degree(1),Xth(i),this%knot1) - if (this%knot1(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot1, Xth(i)) - else - s = 0 - end if - k = k + 1 - - dim = size(this%Xc,2) - - Xc = reshape(this%Xc,[this%nc(1),this%nc(2)*this%nc(3)*dim]) - - call remove_knots_A_5_8(& - this%degree(1),& - this%knot1,& - Xc,& - Xth(i),& - k,& - s,& - r(i),& - t,& - knot_new,& - Xc_new) - - if (allocated(Xc)) deallocate(Xc) - - if (t == 0) then - ! no change - else - nc_new = size(Xcw_new,1) - Xc_new = reshape(Xc_new,[(nc_new)*this%nc(2)*this%nc(3),dim]) - - knot2 = this%knot2 - knot3 = this%knot3 - call this%set(knot1=knot_new, knot2=knot2, knot3=knot3, Xc=Xc_new) - end if - end do - - end if - - elseif (dir == 2) then! direction 2 - - if (allocated(this%Wc)) then ! NURBS - - do i = 1, size(Xth) - k = findspan(this%nc(2)-1,this%degree(2),Xth(i),this%knot2) - if (this%knot2(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot2, Xth(i)) - else - s = 0 - end if - k = k + 1 - - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do - - Xcw(:,dim+1) = this%Wc(:) - - Xc4 = reshape(Xcw, [this%nc(1),this%nc(2),this%nc(3),dim+1]) - Xc4 = reshape(Xc4, [this%nc(2),this%nc(1),this%nc(3),dim+1], order=[2,1,3,4]) - Xcw = reshape(Xc4,[this%nc(2),this%nc(1)*this%nc(3)*(dim+1)]) - - call remove_knots_A_5_8(& - this%degree(2),& - this%knot2,& - Xcw,& - Xth(i),& - k,& - s,& - r(i),& - t,& - knot_new,& - Xcw_new) + ! Assuming knot vectors are in the range [0,1] + ! Normalize the X coordinates to the range [0,1] + allocate(Xt(size(X,1), size(X,2))) + min_X1 = minval(X(:,1)) + max_X1 = maxval(X(:,1)) + + min_X2 = minval(X(:,2)) + max_X2 = maxval(X(:,2)) + + min_X3 = minval(X(:,3)) + max_X3 = maxval(X(:,3)) + + Xt(:,1) = (X(:,1) - min_X1) / (max_X1 - min_X1) + Xt(:,2) = (X(:,2) - min_X2) / (max_X2 - min_X2) + Xt(:,3) = (X(:,3) - min_X3) / (max_X3 - min_X3) + + allocate(this%Xg(size(Xt,1), size(this%Xc,2))) + + if (allocated(this%Wc)) then ! NURBS volume + do i = 1, size(Xt, 1) + Tgc1 = basis_bspline(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) + Tgc2 = basis_bspline(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) + Tgc3 = basis_bspline(Xt(i,3), this%knot3, this%nc(3), this%degree(3)) + Tgc = kron(Tgc3, kron(Tgc2, Tgc1)) + Tgc = Tgc*(this%Wc/(dot_product(Tgc,this%Wc))) + do j = 1, size(this%Xc, 2) + this%Xg(i,j) = dot_product(Tgc,this%Xc(:,j)) + end do + end do + else ! B-Spline volume + do i = 1, size(Xt, 1) + Tgc1 = basis_bspline(Xt(i,1), this%knot1, this%nc(1), this%degree(1)) + Tgc2 = basis_bspline(Xt(i,2), this%knot2, this%nc(2), this%degree(2)) + Tgc3 = basis_bspline(Xt(i,3), this%knot3, this%nc(3), this%degree(3)) + Tgc = kron(Tgc3, kron(Tgc2, Tgc1)) + do j = 1, size(this%Xc, 2) + this%Xg(i,j) = dot_product(Tgc,this%Xc(:,j)) + end do + end do + end if + + call this%set_elem_Xg_vis(elemConn) + + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine remove_knots(this, dir ,Xth,r) + class(nurbs_volume), intent(inout) :: this + integer, intent(in) :: dir + real(rk), intent(in), contiguous :: Xth(:) + integer, intent(in), contiguous :: r(:) + integer :: k, i, s, dim, j, nc_new, t + real(rk), allocatable :: Xc(:,:), Xcw(:,:), Xcw_new(:,:), Xc_new(:,:), Wc_new(:), knot_new(:) + real(rk), allocatable :: Xc4(:,:,:,:) + real(rk), allocatable :: knot1(:), knot2(:), knot3(:) + + + if (dir == 1) then ! direction 1 + + if (allocated(this%Wc)) then ! NURBS + + do i = 1, size(Xth) + k = findspan(this%nc(1)-1,this%degree(1),Xth(i),this%knot1) + if (this%knot1(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot1, Xth(i)) + else + s = 0 + end if + k = k + 1 + + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do + Xcw(:,dim+1) = this%Wc(:) + + Xcw = reshape(Xcw,[this%nc(1),this%nc(2)*this%nc(3)*(dim+1)],order=[1,2]) + + call remove_knots_A_5_8(& + this%degree(1),& + this%knot1,& + Xcw,& + Xth(i),& + k,& + s,& + r(i),& + t,& + knot_new,& + Xcw_new) + + if (allocated(Xcw)) deallocate(Xcw) + + if (t == 0) then + ! no change + else + nc_new = size(Xcw_new,1) + Xcw_new = reshape(Xcw_new,[(nc_new)*this%nc(2)*this%nc(3),dim+1],order=[1,2]) - if (allocated(Xcw)) deallocate(Xcw) - - if (t == 0) then - ! no change - else - nc_new = size(Xcw_new,1) + allocate(Xc_new(1:(nc_new)*this%nc(2)*this%nc(3),1:dim)) + allocate(Wc_new(1:(nc_new)*this%nc(2)*this%nc(3))) + do j = 1, (nc_new)*this%nc(2)*this%nc(3) + Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do + Wc_new(:) = Xcw_new(:,dim+1) - Xc4 = reshape(Xcw_new, [nc_new,this%nc(1),this%nc(3),dim+1]) - Xc4 = reshape(Xc4, [this%nc(1),nc_new,this%nc(3),dim+1], order=[2,1,3,4]) - Xcw_new = reshape(Xc4,[this%nc(1)*(nc_new)*this%nc(3),dim+1]) - - allocate(Xc_new(1:this%nc(1)*(nc_new)*this%nc(3),1:dim)) - allocate(Wc_new(1:this%nc(1)*(nc_new)*this%nc(3))) - do j = 1, this%nc(1)*(nc_new)*this%nc(3) - Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do + knot2 = this%knot2 + knot3 = this%knot3 + call this%set(knot1=knot_new, knot2=knot2, knot3=knot3, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw_new, Xc_new, Wc_new) + end if + end do + + + else ! B-Spline - Wc_new(:) = Xcw_new(:,dim+1) - - knot1 = this%knot1 - knot3 = this%knot3 - call this%set(knot1=knot1, knot2=knot_new, knot3=knot3, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw_new, Xc_new, Wc_new) + do i = 1, size(Xth) + k = findspan(this%nc(1)-1,this%degree(1),Xth(i),this%knot1) + if (this%knot1(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot1, Xth(i)) + else + s = 0 end if - end do + k = k + 1 - else ! B-Spline + dim = size(this%Xc,2) - do i = 1, size(Xth) - k = findspan(this%nc(2)-1,this%degree(2),Xth(i),this%knot2) - if (this%knot2(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot2, Xth(i)) - else - s = 0 - end if - k = k + 1 - - dim = size(this%Xc,2) - - Xc4 = reshape(this%Xc, [this%nc(1),this%nc(2),this%nc(3),dim]) - Xc4 = reshape(Xc4, [this%nc(2),this%nc(1),this%nc(3),dim], order=[2,1,3,4]) - Xc = reshape(Xc4, [this%nc(2),this%nc(1)*this%nc(3)*dim]) - - call remove_knots_A_5_8(& - this%degree(2),& - this%knot2,& - Xc,& - Xth(i),& - k,& - s,& - r(i),& - t,& - knot_new,& - Xc_new) - - if (allocated(Xc)) deallocate(Xc) - - if (t == 0) then - ! no change - else - nc_new = size(Xcw_new,1) + Xc = reshape(this%Xc,[this%nc(1),this%nc(2)*this%nc(3)*dim]) + + call remove_knots_A_5_8(& + this%degree(1),& + this%knot1,& + Xc,& + Xth(i),& + k,& + s,& + r(i),& + t,& + knot_new,& + Xc_new) + + if (allocated(Xc)) deallocate(Xc) + + if (t == 0) then + ! no change + else + nc_new = size(Xcw_new,1) + Xc_new = reshape(Xc_new,[(nc_new)*this%nc(2)*this%nc(3),dim]) + + knot2 = this%knot2 + knot3 = this%knot3 + call this%set(knot1=knot_new, knot2=knot2, knot3=knot3, Xc=Xc_new) + end if + end do + + end if + + elseif (dir == 2) then! direction 2 + + if (allocated(this%Wc)) then ! NURBS - Xc4 = reshape(Xc_new, [nc_new,this%nc(1),this%nc(3),dim]) - Xc4 = reshape(Xc4, [this%nc(1),nc_new,this%nc(3),dim], order=[2,1,3,4]) - Xc_new = reshape(Xc4, [this%nc(1)*(nc_new)*this%nc(3),dim]) - - knot1 = this%knot1 - knot3 = this%knot3 - call this%set(knot1=knot1, knot2=knot_new, knot3=knot3, Xc=Xc_new) - end if - end do - - end if - - elseif (dir == 3) then! direction 3 - - if (allocated(this%Wc)) then ! NURBS - - do i = 1, size(Xth) - k = findspan(this%nc(3)-1,this%degree(3),Xth(i),this%knot3) - if (this%knot3(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot3, Xth(i)) - else - s = 0 - end if - k = k + 1 - - dim = size(this%Xc,2) - allocate(Xcw(size(this%Xc,1),dim+1)) - do j = 1, size(this%Xc,1) - Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) - end do - Xcw(:,dim+1) = this%Wc(:) - - Xc4 = reshape(Xcw, [this%nc(1),this%nc(2),this%nc(3),dim+1]) - Xc4 = reshape(Xc4, [this%nc(3),this%nc(2),this%nc(1),dim+1], order=[3,2,1,4]) - Xcw = reshape(Xc4, [this%nc(3),this%nc(2)*this%nc(1)*(dim+1)]) - - call remove_knots_A_5_8(& - this%degree(3),& - this%knot3,& - Xcw,& - Xth(i),& - k,& - s,& - r(i),& - t,& - knot_new,& - Xcw_new) - - if (allocated(Xcw)) deallocate(Xcw) + do i = 1, size(Xth) + k = findspan(this%nc(2)-1,this%degree(2),Xth(i),this%knot2) + if (this%knot2(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot2, Xth(i)) + else + s = 0 + end if + k = k + 1 + + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do + + Xcw(:,dim+1) = this%Wc(:) + + Xc4 = reshape(Xcw, [this%nc(1),this%nc(2),this%nc(3),dim+1]) + Xc4 = reshape(Xc4, [this%nc(2),this%nc(1),this%nc(3),dim+1], order=[2,1,3,4]) + Xcw = reshape(Xc4,[this%nc(2),this%nc(1)*this%nc(3)*(dim+1)]) + + call remove_knots_A_5_8(& + this%degree(2),& + this%knot2,& + Xcw,& + Xth(i),& + k,& + s,& + r(i),& + t,& + knot_new,& + Xcw_new) + + if (allocated(Xcw)) deallocate(Xcw) + + if (t == 0) then + ! no change + else + nc_new = size(Xcw_new,1) + + Xc4 = reshape(Xcw_new, [nc_new,this%nc(1),this%nc(3),dim+1]) + Xc4 = reshape(Xc4, [this%nc(1),nc_new,this%nc(3),dim+1], order=[2,1,3,4]) + Xcw_new = reshape(Xc4,[this%nc(1)*(nc_new)*this%nc(3),dim+1]) + + allocate(Xc_new(1:this%nc(1)*(nc_new)*this%nc(3),1:dim)) + allocate(Wc_new(1:this%nc(1)*(nc_new)*this%nc(3))) + do j = 1, this%nc(1)*(nc_new)*this%nc(3) + Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do - if (t == 0) then - ! no change - else - nc_new = size(Xcw_new,1) - - Xc4 = reshape(Xcw_new, [nc_new,this%nc(2),this%nc(1),dim+1]) - Xc4 = reshape(Xc4, [this%nc(1),this%nc(2),nc_new,dim+1], order=[3,2,1,4]) - Xcw_new = reshape(Xc4, [this%nc(1)*this%nc(2)*(nc_new),dim+1]) + Wc_new(:) = Xcw_new(:,dim+1) + + knot1 = this%knot1 + knot3 = this%knot3 + call this%set(knot1=knot1, knot2=knot_new, knot3=knot3, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw_new, Xc_new, Wc_new) + end if + end do - allocate(Xc_new(1:this%nc(1)*this%nc(2)*(nc_new),1:dim)) - allocate(Wc_new(1:this%nc(1)*this%nc(2)*(nc_new))) - do j = 1, this%nc(1)*this%nc(2)*(nc_new) - Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) - end do - Wc_new(:) = Xcw_new(:,dim+1) - - knot1 = this%knot1 - knot2 = this%knot2 - call this%set(knot1=knot1, knot2=knot2, knot3=knot_new, Xc=Xc_new, Wc=Wc_new) - deallocate(Xcw_new, Xc_new, Wc_new) - end if - end do - - else ! B-Spline - - do i = 1, size(Xth) - k = findspan(this%nc(3)-1,this%degree(3),Xth(i),this%knot3) - if (this%knot3(k+1) == Xth(i)) then - s = compute_multiplicity(this%knot3, Xth(i)) - else - s = 0 - end if - k = k + 1 - - dim = size(this%Xc,2) - - Xc4 = reshape(this%Xc, [this%nc(1),this%nc(2),this%nc(3),dim]) - Xc4 = reshape(Xc4, [this%nc(3),this%nc(2),this%nc(1),dim], order=[3,2,1,4]) - Xc = reshape(Xc4, [this%nc(3),this%nc(2)*this%nc(1)*dim]) + else ! B-Spline + + do i = 1, size(Xth) + k = findspan(this%nc(2)-1,this%degree(2),Xth(i),this%knot2) + if (this%knot2(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot2, Xth(i)) + else + s = 0 + end if + k = k + 1 + + dim = size(this%Xc,2) + + Xc4 = reshape(this%Xc, [this%nc(1),this%nc(2),this%nc(3),dim]) + Xc4 = reshape(Xc4, [this%nc(2),this%nc(1),this%nc(3),dim], order=[2,1,3,4]) + Xc = reshape(Xc4, [this%nc(2),this%nc(1)*this%nc(3)*dim]) + + call remove_knots_A_5_8(& + this%degree(2),& + this%knot2,& + Xc,& + Xth(i),& + k,& + s,& + r(i),& + t,& + knot_new,& + Xc_new) + + if (allocated(Xc)) deallocate(Xc) - call remove_knots_A_5_8(& - this%degree(3),& - this%knot3,& - Xc,& - Xth(i),& - k,& - s,& - r(i),& - t,& - knot_new,& - Xc_new) - - if (allocated(Xc)) deallocate(Xc) - - if (t == 0) then - ! no change - else - nc_new = size(Xcw_new,1) + if (t == 0) then + ! no change + else + nc_new = size(Xcw_new,1) + + Xc4 = reshape(Xc_new, [nc_new,this%nc(1),this%nc(3),dim]) + Xc4 = reshape(Xc4, [this%nc(1),nc_new,this%nc(3),dim], order=[2,1,3,4]) + Xc_new = reshape(Xc4, [this%nc(1)*(nc_new)*this%nc(3),dim]) + + knot1 = this%knot1 + knot3 = this%knot3 + call this%set(knot1=knot1, knot2=knot_new, knot3=knot3, Xc=Xc_new) + end if + end do + + end if + + elseif (dir == 3) then! direction 3 - Xc4 = reshape(Xc_new, [nc_new,this%nc(2),this%nc(1),dim]) - Xc4 = reshape(Xc4, [this%nc(1),this%nc(2),nc_new,dim], order=[3,2,1,4]) - Xc_new = reshape(Xc4, [this%nc(1)*this%nc(2)*(nc_new),dim]) - - knot1 = this%knot1 - knot2 = this%knot2 - call this%set(knot1=knot1, knot2=knot2, knot3=knot_new, Xc=Xc_new) - end if - end do - + if (allocated(this%Wc)) then ! NURBS + + do i = 1, size(Xth) + k = findspan(this%nc(3)-1,this%degree(3),Xth(i),this%knot3) + if (this%knot3(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot3, Xth(i)) + else + s = 0 + end if + k = k + 1 - end if - - else - error stop 'Invalid direction.' - end if - - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure function cmp_elem(this) result(elemConn) - class(nurbs_volume), intent(in) :: this - integer, allocatable :: elemConn(:,:) - - call elemConn_Cn(this%nc(1), this%nc(2), this%nc(3),& - this%degree(1),this%degree(2),this%degree(3),& - unique(this%knot1),unique(this%knot2),unique(this%knot3),& - this%get_multiplicity(1),this%get_multiplicity(2),this%get_multiplicity(3),& - elemConn) - end function - !=============================================================================== + dim = size(this%Xc,2) + allocate(Xcw(size(this%Xc,1),dim+1)) + do j = 1, size(this%Xc,1) + Xcw(j,1:dim) = this%Xc(j,1:dim)*this%Wc(j) + end do + Xcw(:,dim+1) = this%Wc(:) + + Xc4 = reshape(Xcw, [this%nc(1),this%nc(2),this%nc(3),dim+1]) + Xc4 = reshape(Xc4, [this%nc(3),this%nc(2),this%nc(1),dim+1], order=[3,2,1,4]) + Xcw = reshape(Xc4, [this%nc(3),this%nc(2)*this%nc(1)*(dim+1)]) + + call remove_knots_A_5_8(& + this%degree(3),& + this%knot3,& + Xcw,& + Xth(i),& + k,& + s,& + r(i),& + t,& + knot_new,& + Xcw_new) + + if (allocated(Xcw)) deallocate(Xcw) - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine rotate_Xc(this, alpha, beta, theta) - class(nurbs_volume), intent(inout) :: this - real(rk), intent(in) :: alpha, beta, theta - integer :: i + if (t == 0) then + ! no change + else + nc_new = size(Xcw_new,1) + + Xc4 = reshape(Xcw_new, [nc_new,this%nc(2),this%nc(1),dim+1]) + Xc4 = reshape(Xc4, [this%nc(1),this%nc(2),nc_new,dim+1], order=[3,2,1,4]) + Xcw_new = reshape(Xc4, [this%nc(1)*this%nc(2)*(nc_new),dim+1]) - do i = 1, this%nc(1)*this%nc(2)*this%nc(3) - this%Xc(i, :) = matmul(rotation(alpha,beta,theta), this%Xc(i, :)) - end do - end subroutine - !=============================================================================== - + allocate(Xc_new(1:this%nc(1)*this%nc(2)*(nc_new),1:dim)) + allocate(Wc_new(1:this%nc(1)*this%nc(2)*(nc_new))) + do j = 1, this%nc(1)*this%nc(2)*(nc_new) + Xc_new(j,1:dim) = Xcw_new(j,1:dim)/Xcw_new(j,dim+1) + end do + Wc_new(:) = Xcw_new(:,dim+1) - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine rotate_Xg(this, alpha, beta, theta) - class(nurbs_volume), intent(inout) :: this - real(rk), intent(in) :: alpha, beta, theta - integer :: i - - do i = 1, this%ng(1)*this%ng(2)*this%ng(3) - this%Xg(i, :) = matmul(rotation(alpha,beta,theta), this%Xg(i, :)) - end do - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine translate_Xc(this, vec) - class(nurbs_volume), intent(inout) :: this - real(rk), intent(in) :: vec(:) - integer :: i - - do i = 1, this%nc(1)*this%nc(2)*this%nc(3) - this%Xc(i, :) = this%Xc(i, :) + vec - end do - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - pure subroutine translate_Xg(this, vec) - class(nurbs_volume), intent(inout) :: this - real(rk), intent(in) :: vec(:) - integer :: i + knot1 = this%knot1 + knot2 = this%knot2 + call this%set(knot1=knot1, knot2=knot2, knot3=knot_new, Xc=Xc_new, Wc=Wc_new) + deallocate(Xcw_new, Xc_new, Wc_new) + end if + end do + + else ! B-Spline + + do i = 1, size(Xth) + k = findspan(this%nc(3)-1,this%degree(3),Xth(i),this%knot3) + if (this%knot3(k+1) == Xth(i)) then + s = compute_multiplicity(this%knot3, Xth(i)) + else + s = 0 + end if + k = k + 1 + + dim = size(this%Xc,2) + + Xc4 = reshape(this%Xc, [this%nc(1),this%nc(2),this%nc(3),dim]) + Xc4 = reshape(Xc4, [this%nc(3),this%nc(2),this%nc(1),dim], order=[3,2,1,4]) + Xc = reshape(Xc4, [this%nc(3),this%nc(2)*this%nc(1)*dim]) + + call remove_knots_A_5_8(& + this%degree(3),& + this%knot3,& + Xc,& + Xth(i),& + k,& + s,& + r(i),& + t,& + knot_new,& + Xc_new) + + if (allocated(Xc)) deallocate(Xc) - do i = 1, this%ng(1)*this%ng(2)*this%ng(3) - this%Xg(i, :) = this%Xg(i, :) + vec - end do - end subroutine - !=============================================================================== - - - !=============================================================================== - !> author: Seyed Ali Ghasemi - !> license: BSD 3-Clause - impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) - class(nurbs_volume), intent(inout) :: this - character(len=*), intent(in) :: vtkfile_Xc, vtkfile_Xg - character(len=3000) :: pyvista_script + if (t == 0) then + ! no change + else + nc_new = size(Xcw_new,1) + + Xc4 = reshape(Xc_new, [nc_new,this%nc(2),this%nc(1),dim]) + Xc4 = reshape(Xc4, [this%nc(1),this%nc(2),nc_new,dim], order=[3,2,1,4]) + Xc_new = reshape(Xc4, [this%nc(1)*this%nc(2)*(nc_new),dim]) + + knot1 = this%knot1 + knot2 = this%knot2 + call this%set(knot1=knot1, knot2=knot2, knot3=knot_new, Xc=Xc_new) + end if + end do - pyvista_script = & - "import pyvista as pv"//achar(10)//& - "pv.global_theme.color = 'white'"//achar(10)//& - "Xc = pv.read('"//trim(vtkfile_Xc)//"')"//achar(10)//& - "Xg = pv.read('"//trim(vtkfile_Xg)//"')"//achar(10)//& - "p = pv.Plotter(lighting='light kit')"//achar(10)//& - "actor_Xcp = p.add_mesh("//achar(10)//& - " Xc,"//achar(10)//& - " style='points',"//achar(10)//& - " point_size=10,"//achar(10)//& - " color='red',"//achar(10)//& - " render_points_as_spheres=True,"//achar(10)//& - " opacity=0.5,"//achar(10)//& - ")"//achar(10)//& - "actor_Xcw = p.add_mesh("//achar(10)//& - " Xc,"//achar(10)//& - " show_edges=True,"//achar(10)//& - " color='yellow',"//achar(10)//& - " line_width=3,"//achar(10)//& - " style='wireframe',"//achar(10)//& - " opacity=0.2"//achar(10)//& - ")"//achar(10)//& - "actor_Xg = p.add_mesh("//achar(10)//& - " Xg,"//achar(10)//& - " show_edges=False,"//achar(10)//& - " color='cyan',"//achar(10)//& - " line_width=7,"//achar(10)//& - " metallic=0.6,"//achar(10)//& - " pbr=True,"//achar(10)//& - " split_sharp_edges=True,"//achar(10)//& - ")"//achar(10)//& - "p.add_axes(interactive=False)"//achar(10)//& - "def point_picker_callback(point):"//achar(10)//& - " mesh = Xc"//achar(10)//& - " point_id = mesh.find_closest_point(point)"//achar(10)//& - " point_coords = mesh.points[point_id]"//achar(10)//& - " label = f'ID: {point_id + 1}\n({point_coords[0]:.3f}, {point_coords[1]:.3f}, {point_coords[2]:.3f})'"//achar(10)//& - " p.add_point_labels("//achar(10)//& - " [point_coords],"//achar(10)//& - " [label],"//achar(10)//& - " font_size=14,"//achar(10)//& - " text_color='black',"//achar(10)//& - " show_points=False,"//achar(10)//& - " fill_shape=False,"//achar(10)//& - " shape=None,"//achar(10)//& - " )"//achar(10)//& - "picker = p.enable_point_picking(callback=point_picker_callback, show_message=False)"//achar(10)//& - "window_size = p.window_size"//achar(10)//& - "y_pos = window_size[1]"//achar(10)//& - "def Xcp_toggle_vis(flag):"//achar(10)//& - " actor_Xcp.SetVisibility(flag)"//achar(10)//& - "def Xcw_toggle_vis(flag):"//achar(10)//& - " actor_Xcw.SetVisibility(flag)"//achar(10)//& - "def Xg_toggle_vis(flag):"//achar(10)//& - " actor_Xg.SetVisibility(flag)"//achar(10)//& - "p.add_checkbox_button_widget("//achar(10)//& - " Xcp_toggle_vis,"//achar(10)//& - " value=True,"//achar(10)//& - " color_on='red',"//achar(10)//& - " size=25,"//achar(10)//& - " position=(0, y_pos - 1 * 25),"//achar(10)//& - ")"//achar(10)//& - "p.add_checkbox_button_widget("//achar(10)//& - " Xcw_toggle_vis,"//achar(10)//& - " value=True,"//achar(10)//& - " color_on='yellow',"//achar(10)//& - " size=25,"//achar(10)//& - " position=(0, y_pos - 2 * 25),"//achar(10)//& - ")"//achar(10)//& - "p.add_checkbox_button_widget("//achar(10)//& - " Xg_toggle_vis,"//achar(10)//& - " value=True,"//achar(10)//& - " color_on='cyan',"//achar(10)//& - " size=25,"//achar(10)//& - " position=(0, y_pos - 3 * 25),"//achar(10)//& - ")"//achar(10)//& - "p.add_text("//achar(10)//& - " 'Xc (Points)',"//achar(10)//& - " position=(25 + 3, y_pos - 1 * 25),"//achar(10)//& - " font_size=8,"//achar(10)//& - " color='black',"//achar(10)//& - " font='times',"//achar(10)//& - ")"//achar(10)//& - "p.add_text("//achar(10)//& - " 'Xc (Control geometry)',"//achar(10)//& - " position=(25 + 3, y_pos - 2 * 25),"//achar(10)//& - " font_size=8,"//achar(10)//& - " color='black',"//achar(10)//& - " font='times',"//achar(10)//& - ")"//achar(10)//& - "p.add_text("//achar(10)//& - " 'Xg (Geometry)',"//achar(10)//& - " position=(25 + 3, y_pos - 3 * 25),"//achar(10)//& - " font_size=8,"//achar(10)//& - " color='black',"//achar(10)//& - " font='times',"//achar(10)//& - ")"//achar(10)//& - "p.add_text('ForCAD', position=(0.0, 10.0), font_size=14, color='black', font='times')"//achar(10)//& - "p.add_text("//achar(10)//& - " 'https://github.com/gha3mi/forcad',"//achar(10)//& - " position=(0.0, 0.0),"//achar(10)//& - " font_size=7,"//achar(10)//& - " color='blue',"//achar(10)//& - " font='times',"//achar(10)//& - ")"//achar(10)//& - "p.show(title='ForCAD', interactive=True)" - - call execute_command_line('python -c "'//trim(adjustl(pyvista_script))//'"') - end subroutine - !=============================================================================== - -end module forcad_nurbs_volume + + end if + + else + error stop 'Invalid direction.' + end if + + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function cmp_elem(this) result(elemConn) + class(nurbs_volume), intent(in) :: this + integer, allocatable :: elemConn(:,:) + + call elemConn_Cn(this%nc(1), this%nc(2), this%nc(3),& + this%degree(1),this%degree(2),this%degree(3),& + unique(this%knot1),unique(this%knot2),unique(this%knot3),& + this%get_multiplicity(1),this%get_multiplicity(2),this%get_multiplicity(3),& + elemConn) + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine rotate_Xc(this, alpha, beta, theta) + class(nurbs_volume), intent(inout) :: this + real(rk), intent(in) :: alpha, beta, theta + integer :: i + + do i = 1, this%nc(1)*this%nc(2)*this%nc(3) + this%Xc(i, :) = matmul(rotation(alpha,beta,theta), this%Xc(i, :)) + end do + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine rotate_Xg(this, alpha, beta, theta) + class(nurbs_volume), intent(inout) :: this + real(rk), intent(in) :: alpha, beta, theta + integer :: i + + do i = 1, this%ng(1)*this%ng(2)*this%ng(3) + this%Xg(i, :) = matmul(rotation(alpha,beta,theta), this%Xg(i, :)) + end do + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine translate_Xc(this, vec) + class(nurbs_volume), intent(inout) :: this + real(rk), intent(in) :: vec(:) + integer :: i + + do i = 1, this%nc(1)*this%nc(2)*this%nc(3) + this%Xc(i, :) = this%Xc(i, :) + vec + end do + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure subroutine translate_Xg(this, vec) + class(nurbs_volume), intent(inout) :: this + real(rk), intent(in) :: vec(:) + integer :: i + + do i = 1, this%ng(1)*this%ng(2)*this%ng(3) + this%Xg(i, :) = this%Xg(i, :) + vec + end do + end subroutine + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) + class(nurbs_volume), intent(inout) :: this + character(len=*), intent(in) :: vtkfile_Xc, vtkfile_Xg + character(len=3000) :: pyvista_script + + pyvista_script = & + "import pyvista as pv"//achar(10)//& + "pv.global_theme.color = 'white'"//achar(10)//& + "Xc = pv.read('"//trim(vtkfile_Xc)//"')"//achar(10)//& + "Xg = pv.read('"//trim(vtkfile_Xg)//"')"//achar(10)//& + "p = pv.Plotter(lighting='light kit')"//achar(10)//& + "actor_Xcp = p.add_mesh("//achar(10)//& + " Xc,"//achar(10)//& + " style='points',"//achar(10)//& + " point_size=10,"//achar(10)//& + " color='red',"//achar(10)//& + " render_points_as_spheres=True,"//achar(10)//& + " opacity=0.5,"//achar(10)//& + ")"//achar(10)//& + "actor_Xcw = p.add_mesh("//achar(10)//& + " Xc,"//achar(10)//& + " show_edges=True,"//achar(10)//& + " color='yellow',"//achar(10)//& + " line_width=3,"//achar(10)//& + " style='wireframe',"//achar(10)//& + " opacity=0.2"//achar(10)//& + ")"//achar(10)//& + "actor_Xg = p.add_mesh("//achar(10)//& + " Xg,"//achar(10)//& + " show_edges=False,"//achar(10)//& + " color='cyan',"//achar(10)//& + " line_width=7,"//achar(10)//& + " metallic=0.6,"//achar(10)//& + " pbr=True,"//achar(10)//& + " split_sharp_edges=True,"//achar(10)//& + ")"//achar(10)//& + "p.add_axes(interactive=False)"//achar(10)//& + "def point_picker_callback(point):"//achar(10)//& + " mesh = Xc"//achar(10)//& + " point_id = mesh.find_closest_point(point)"//achar(10)//& + " point_coords = mesh.points[point_id]"//achar(10)//& + " label = f'ID: {point_id + 1}\n({point_coords[0]:.3f}, {point_coords[1]:.3f}, {point_coords[2]:.3f})'"//achar(10)//& + " p.add_point_labels("//achar(10)//& + " [point_coords],"//achar(10)//& + " [label],"//achar(10)//& + " font_size=14,"//achar(10)//& + " text_color='black',"//achar(10)//& + " show_points=False,"//achar(10)//& + " fill_shape=False,"//achar(10)//& + " shape=None,"//achar(10)//& + " )"//achar(10)//& + "picker = p.enable_point_picking(callback=point_picker_callback, show_message=False)"//achar(10)//& + "window_size = p.window_size"//achar(10)//& + "y_pos = window_size[1]"//achar(10)//& + "def Xcp_toggle_vis(flag):"//achar(10)//& + " actor_Xcp.SetVisibility(flag)"//achar(10)//& + "def Xcw_toggle_vis(flag):"//achar(10)//& + " actor_Xcw.SetVisibility(flag)"//achar(10)//& + "def Xg_toggle_vis(flag):"//achar(10)//& + " actor_Xg.SetVisibility(flag)"//achar(10)//& + "p.add_checkbox_button_widget("//achar(10)//& + " Xcp_toggle_vis,"//achar(10)//& + " value=True,"//achar(10)//& + " color_on='red',"//achar(10)//& + " size=25,"//achar(10)//& + " position=(0, y_pos - 1 * 25),"//achar(10)//& + ")"//achar(10)//& + "p.add_checkbox_button_widget("//achar(10)//& + " Xcw_toggle_vis,"//achar(10)//& + " value=True,"//achar(10)//& + " color_on='yellow',"//achar(10)//& + " size=25,"//achar(10)//& + " position=(0, y_pos - 2 * 25),"//achar(10)//& + ")"//achar(10)//& + "p.add_checkbox_button_widget("//achar(10)//& + " Xg_toggle_vis,"//achar(10)//& + " value=True,"//achar(10)//& + " color_on='cyan',"//achar(10)//& + " size=25,"//achar(10)//& + " position=(0, y_pos - 3 * 25),"//achar(10)//& + ")"//achar(10)//& + "p.add_text("//achar(10)//& + " 'Xc (Points)',"//achar(10)//& + " position=(25 + 3, y_pos - 1 * 25),"//achar(10)//& + " font_size=8,"//achar(10)//& + " color='black',"//achar(10)//& + " font='times',"//achar(10)//& + ")"//achar(10)//& + "p.add_text("//achar(10)//& + " 'Xc (Control geometry)',"//achar(10)//& + " position=(25 + 3, y_pos - 2 * 25),"//achar(10)//& + " font_size=8,"//achar(10)//& + " color='black',"//achar(10)//& + " font='times',"//achar(10)//& + ")"//achar(10)//& + "p.add_text("//achar(10)//& + " 'Xg (Geometry)',"//achar(10)//& + " position=(25 + 3, y_pos - 3 * 25),"//achar(10)//& + " font_size=8,"//achar(10)//& + " color='black',"//achar(10)//& + " font='times',"//achar(10)//& + ")"//achar(10)//& + "p.add_text('ForCAD', position=(0.0, 10.0), font_size=14, color='black', font='times')"//achar(10)//& + "p.add_text("//achar(10)//& + " 'https://github.com/gha3mi/forcad',"//achar(10)//& + " position=(0.0, 0.0),"//achar(10)//& + " font_size=7,"//achar(10)//& + " color='blue',"//achar(10)//& + " font='times',"//achar(10)//& + ")"//achar(10)//& + "p.show(title='ForCAD', interactive=True)" + + call execute_command_line('python -c "'//trim(adjustl(pyvista_script))//'"') + end subroutine + !=============================================================================== + +end module forcad_nurbs_volume @@ -2676,7 +2771,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/sourcefile/forcad_utils.f90.html b/sourcefile/forcad_utils.f90.html index 30a6521f7..46758fd4a 100644 --- a/sourcefile/forcad_utils.f90.html +++ b/sourcefile/forcad_utils.f90.html @@ -77,7 +77,7 @@

    forcad_utils.f90
  • 783 statements + title="18.1% of total for source files.">783 statements
  • @@ -1528,7 +1528,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/sourcefile/put_to_nurbs.f90.html b/sourcefile/put_to_nurbs.f90.html index bf3972e57..6170a11f3 100644 --- a/sourcefile/put_to_nurbs.f90.html +++ b/sourcefile/put_to_nurbs.f90.html @@ -398,7 +398,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/sourcefile/shape_circle.f90.html b/sourcefile/shape_circle.f90.html index 58748fde8..838f6012c 100644 --- a/sourcefile/shape_circle.f90.html +++ b/sourcefile/shape_circle.f90.html @@ -385,7 +385,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/sourcefile/shape_hexahedron.f90.html b/sourcefile/shape_hexahedron.f90.html index f83daf2ad..2180b7558 100644 --- a/sourcefile/shape_hexahedron.f90.html +++ b/sourcefile/shape_hexahedron.f90.html @@ -380,7 +380,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/sourcefile/shape_tetragon.f90.html b/sourcefile/shape_tetragon.f90.html index 47c724057..682f54c57 100644 --- a/sourcefile/shape_tetragon.f90.html +++ b/sourcefile/shape_tetragon.f90.html @@ -389,7 +389,7 @@

    Source Code

    Documentation generated by FORD - on 2024-04-16T12:26:30.084942

    + on 2024-04-16T18:31:38.142193


    diff --git a/src/forcad_nurbs_curve.f90 b/src/forcad_nurbs_curve.f90 index 447b8a557..a44e80735 100644 --- a/src/forcad_nurbs_curve.f90 +++ b/src/forcad_nurbs_curve.f90 @@ -33,9 +33,17 @@ module forcad_nurbs_curve procedure :: set3 !!> Set Bezier or Rational Bezier curve using control points and weights generic :: set => set1, set2, set3 !!> Set NURBS curve procedure :: create !!> Generate geometry points - procedure :: get_Xc !!> Get control points - procedure :: get_Xg !!> Get geometry points - procedure :: get_Wc !!> Get weights + procedure, private :: get_Xc_all !!> Get all control points + procedure, private :: get_Xci !!> Get i-th control point + procedure, private :: get_Xcid !!> Get i-th control point in a specific direction + generic :: get_Xc => get_Xc_all, get_Xci, get_Xcid !!> Get control points + procedure, private :: get_Xg_all !!> Get all geometry points + procedure, private :: get_Xgi !!> Get i-th geometry point + procedure, private :: get_Xgid !!> Get i-th geometry point in a specific direction + generic :: get_Xg => get_Xg_all, get_Xgi, get_Xgid !!> Get geometry points + procedure, private :: get_Wc_all !!> Get all weights + procedure, private :: get_Wci !!> Get i-th weight + generic :: get_Wc => get_Wc_all, get_Wci !!> Get weights procedure :: get_Xt !!> Get parameter values procedure, private :: get_knot_all !!> Get all knot vectors procedure, private :: get_knoti !!> Get i-th knot value @@ -232,7 +240,7 @@ pure subroutine create(this, res, Xt) !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause - pure function get_Xc(this) result(Xc) + pure function get_Xc_all(this) result(Xc) class(nurbs_curve), intent(in) :: this real(rk), allocatable :: Xc(:,:) @@ -248,7 +256,42 @@ pure function get_Xc(this) result(Xc) !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause - pure function get_Xg(this) result(Xg) + pure function get_Xci(this, n) result(Xc) + class(nurbs_curve), intent(in) :: this + integer, intent(in) :: n + real(rk), allocatable :: Xc(:) + + if (allocated(this%Xc)) then + Xc(:) = this%Xc(n,:) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xcid(this, n, dir) result(Xc) + class(nurbs_curve), intent(in) :: this + integer, intent(in) :: n + integer, intent(in) :: dir + real(rk) :: Xc + + if (allocated(this%Xc)) then + Xc = this%Xc(n, dir) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xg_all(this) result(Xg) class(nurbs_curve), intent(in) :: this real(rk), allocatable :: Xg(:,:) @@ -264,14 +307,66 @@ pure function get_Xg(this) result(Xg) !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause - pure function get_Wc(this) result(Wc) + pure function get_Xgi(this, n) result(Xg) + class(nurbs_curve), intent(in) :: this + integer, intent(in) :: n + real(rk), allocatable :: Xg(:) + + if (allocated(this%Xg)) then + Xg(:) = this%Xg(n,:) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xgid(this, n, dir) result(Xg) + class(nurbs_curve), intent(in) :: this + integer, intent(in) :: n + integer, intent(in) :: dir + real(rk) :: Xg + + if (allocated(this%Xg)) then + Xg = this%Xg(n, dir) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Wc_all(this) result(Wc) class(nurbs_curve), intent(in) :: this real(rk), allocatable :: Wc(:) if (allocated(this%Wc)) then Wc = this%Wc else - error stop 'The NURBS curve is not rational.' + error stop 'The NURBS curve is not rational or weights are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Wci(this, n) result(Wc) + class(nurbs_curve), intent(in) :: this + integer, intent(in) :: n + real(rk) :: Wc + + if (allocated(this%Wc)) then + Wc = this%Wc(n) + else + error stop 'The NURBS curve is not rational or weights are not set.' end if end function !=============================================================================== diff --git a/src/forcad_nurbs_surface.f90 b/src/forcad_nurbs_surface.f90 index a67ae3ac1..c9e1b2d20 100644 --- a/src/forcad_nurbs_surface.f90 +++ b/src/forcad_nurbs_surface.f90 @@ -35,9 +35,17 @@ module forcad_nurbs_surface procedure :: set3 !!> Set Bezier or Rational Bezier surface using control points and weights generic :: set => set1, set2, set3 !!> Set NURBS surface procedure :: create !!> Generate geometry points - procedure :: get_Xc !!> Get control points - procedure :: get_Xg !!> Get geometry points - procedure :: get_Wc !!> Get weights + procedure, private :: get_Xc_all !!> Get all control points + procedure, private :: get_Xci !!> Get i-th control point + procedure, private :: get_Xcid !!> Get i-th control point in a specific direction + generic :: get_Xc => get_Xc_all, get_Xci, get_Xcid !!> Get control points + procedure, private :: get_Xg_all !!> Get all geometry points + procedure, private :: get_Xgi !!> Get i-th geometry point + procedure, private :: get_Xgid !!> Get i-th geometry point in a specific direction + generic :: get_Xg => get_Xg_all, get_Xgi, get_Xgid !!> Get geometry points + procedure, private :: get_Wc_all !!> Get all weights + procedure, private :: get_Wci !!> Get i-th weight + generic :: get_Wc => get_Wc_all, get_Wci !!> Get weights procedure :: get_Xt !!> Get parameter values procedure, private :: get_knot_all !!> Get all knot vectors procedure, private :: get_knoti !!> Get i-th knot value @@ -264,7 +272,7 @@ pure subroutine create(this, res1, res2, Xt1, Xt2, Xt) !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause - pure function get_Xc(this) result(Xc) + pure function get_Xc_all(this) result(Xc) class(nurbs_surface), intent(in) :: this real(rk), allocatable :: Xc(:,:) @@ -280,7 +288,42 @@ pure function get_Xc(this) result(Xc) !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause - pure function get_Xg(this) result(Xg) + pure function get_Xci(this, n) result(Xc) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: n + real(rk), allocatable :: Xc(:) + + if (allocated(this%Xc)) then + Xc(:) = this%Xc(n,:) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xcid(this, n, dir) result(Xc) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: n + integer, intent(in) :: dir + real(rk) :: Xc + + if (allocated(this%Xc)) then + Xc = this%Xc(n, dir) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xg_all(this) result(Xg) class(nurbs_surface), intent(in) :: this real(rk), allocatable :: Xg(:,:) @@ -296,14 +339,66 @@ pure function get_Xg(this) result(Xg) !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause - pure function get_Wc(this) result(Wc) + pure function get_Xgi(this, n) result(Xg) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: n + real(rk), allocatable :: Xg(:) + + if (allocated(this%Xg)) then + Xg(:) = this%Xg(n,:) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xgid(this, n, dir) result(Xg) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: n + integer, intent(in) :: dir + real(rk) :: Xg + + if (allocated(this%Xg)) then + Xg = this%Xg(n, dir) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Wc_all(this) result(Wc) class(nurbs_surface), intent(in) :: this real(rk), allocatable :: Wc(:) if (allocated(this%Wc)) then Wc = this%Wc else - error stop 'The NURBS surface is not rational.' + error stop 'The NURBS surface is not rational or weights are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Wci(this, n) result(Wc) + class(nurbs_surface), intent(in) :: this + integer, intent(in) :: n + real(rk) :: Wc + + if (allocated(this%Wc)) then + Wc = this%Wc(n) + else + error stop 'The NURBS surface is not rational or weights are not set.' end if end function !=============================================================================== diff --git a/src/forcad_nurbs_volume.f90 b/src/forcad_nurbs_volume.f90 index 50fc9eb6b..62f000a6a 100644 --- a/src/forcad_nurbs_volume.f90 +++ b/src/forcad_nurbs_volume.f90 @@ -37,9 +37,17 @@ module forcad_nurbs_volume procedure :: set3 !!> Set Bezier or Rational Bezier volume using control points and weights generic :: set => set1, set2, set3 !!> Set NURBS volume procedure :: create !!> Generate geometry points - procedure :: get_Xc !!> Get control points - procedure :: get_Xg !!> Get geometry points - procedure :: get_Wc !!> Get weights + procedure, private :: get_Xc_all !!> Get all control points + procedure, private :: get_Xci !!> Get i-th control point + procedure, private :: get_Xcid !!> Get i-th control point in a specific direction + generic :: get_Xc => get_Xc_all, get_Xci, get_Xcid !!> Get control points + procedure, private :: get_Xg_all !!> Get all geometry points + procedure, private :: get_Xgi !!> Get i-th geometry point + procedure, private :: get_Xgid !!> Get i-th geometry point in a specific direction + generic :: get_Xg => get_Xg_all, get_Xgi, get_Xgid !!> Get geometry points + procedure, private :: get_Wc_all !!> Get all weights + procedure, private :: get_Wci !!> Get i-th weight + generic :: get_Wc => get_Wc_all, get_Wci !!> Get weights procedure :: get_Xt !!> Get parameter values procedure, private :: get_knot_all !!> Get all knot vectors procedure, private :: get_knoti !!> Get i-th knot value @@ -291,7 +299,7 @@ pure subroutine create(this, res1, res2, res3, Xt1, Xt2, Xt3, Xt) !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause - pure function get_Xc(this) result(Xc) + pure function get_Xc_all(this) result(Xc) class(nurbs_volume), intent(in) :: this real(rk), allocatable :: Xc(:,:) @@ -307,7 +315,42 @@ pure function get_Xc(this) result(Xc) !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause - pure function get_Xg(this) result(Xg) + pure function get_Xci(this, n) result(Xc) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: n + real(rk), allocatable :: Xc(:) + + if (allocated(this%Xc)) then + Xc(:) = this%Xc(n,:) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xcid(this, n, dir) result(Xc) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: n + integer, intent(in) :: dir + real(rk) :: Xc + + if (allocated(this%Xc)) then + Xc = this%Xc(n, dir) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xg_all(this) result(Xg) class(nurbs_volume), intent(in) :: this real(rk), allocatable :: Xg(:,:) @@ -323,14 +366,66 @@ pure function get_Xg(this) result(Xg) !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause - pure function get_Wc(this) result(Wc) + pure function get_Xgi(this, n) result(Xg) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: n + real(rk), allocatable :: Xg(:) + + if (allocated(this%Xg)) then + Xg(:) = this%Xg(n,:) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Xgid(this, n, dir) result(Xg) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: n + integer, intent(in) :: dir + real(rk) :: Xg + + if (allocated(this%Xg)) then + Xg = this%Xg(n, dir) + else + error stop 'Control points are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Wc_all(this) result(Wc) class(nurbs_volume), intent(in) :: this real(rk), allocatable :: Wc(:) if (allocated(this%Wc)) then Wc = this%Wc else - error stop 'The NURBS volume is not rational.' + error stop 'The NURBS volume is not rational or weights are not set.' + end if + end function + !=============================================================================== + + + !=============================================================================== + !> author: Seyed Ali Ghasemi + !> license: BSD 3-Clause + pure function get_Wci(this, n) result(Wc) + class(nurbs_volume), intent(in) :: this + integer, intent(in) :: n + real(rk) :: Wc + + if (allocated(this%Wc)) then + Wc = this%Wc(n) + else + error stop 'The NURBS volume is not rational or weights are not set.' end if end function !=============================================================================== diff --git a/tipuesearch/tipuesearch_content.js b/tipuesearch/tipuesearch_content.js index 836fba113..fa93dad28 100644 --- a/tipuesearch/tipuesearch_content.js +++ b/tipuesearch/tipuesearch_content.js @@ -1 +1 @@ -var tipuesearch = {"pages":[{"title":" ForCAD ","text":"ForCAD ForCAD : A Fortran library for Geometric Modeling using NURBS (Non-Uniform Rational B-Splines). ForCAD supports B-Spline , NURBS , Bezier , and Rational Bezier curves, surfaces, and volumes. Main Features Create NURBS objects by specifying control points, weights and knots. Refine NURBS objects by inserting or removing knots and elevating degree. Compute basis functions and derivatives of NURBS objects. Obtain IGA elements connectivity. Obtain visualized elements connectivity and coordinates for geometry and control geometry. Mesh insertion into a NURBS object. Export NURBS objects to VTK files for visualization. Includes predefined NURBS shapes: Circle, Tetragon, Hexahedron. Rotate and translate NURBS objects. Visualization using provided python PyVista scripts. Installation Requirements A Fortran compiler, such as GNU Fortran ( gfortran ), Intel Fortran Compiler ( ifx/ifort ) or NVIDIA HPC SDK Fortran compiler ( nvfortran ). The Fortran Package Manager fpm . PyVista (Recommended) or ParaView for visualization. (Optional) Clone the repository Clone the ForCAD repository from GitHub: git clone https://github.com/gha3mi/forcad.git cd forcad Install PyVista (Optional) To install PyVista, run the following command: pip install pyvista Running Examples with fpm fpm run --example After executing the examples, .vtk files will be generated in the vtk directory. To visualize these files, a show() method is provided which utilizes PyVista. Alternatively, other visualization tools like ParaView can also be used. Using ForCAD as a fpm Dependency If you want to use ForCAD as a dependency in your own fpm project,\nyou can easily include it by adding the following line to your fpm.toml file: [dependencies] forcad = { git = \"https://github.com/gha3mi/forcad.git\" } API documentation The most up-to-date API documentation for the master branch is available here .\nTo generate the API documentation for ForCAD using ford run the following\ncommand: ford ford.yml Roadmap For a detailed roadmap outlining upcoming features and enhancements, please refer to ROADMAP.md . Contributing Contributions to ForCAD are welcome! If you find any issues or would like to suggest improvements, please open an issue. If you've implemented new features, fixed bugs, or enhanced existing functionality, please consider submitting a pull request (PR). Please share your examples by submitting a pull request (PR). Citation If you use ForCAD in your research, please cite it as follows: @software { seyed_ali_ghasemi_2024_10904447 , author = {Ghasemi, S. A.} , title = {gha3mi/ForCAD} , year = 2024 , publisher = {Zenodo} , doi = {10.5281/zenodo.10904447} , url = {https://doi.org/10.5281/zenodo.10904447} } References Piegl, L., & Tiller, W. (1995). The NURBS Book. In Monographs in Visual Communications. Springer Berlin Heidelberg. https://doi.org/10.1007/978-3-642-97385-7 An Introduction to NURBS. (2001). Elsevier. https://doi.org/10.1016/b978-1-55860-669-2.x5000-3 Sullivan et al., (2019). PyVista: 3D plotting and mesh analysis through a streamlined interface for the Visualization Toolkit (VTK). Journal of Open Source Software, 4(37), 1450, https://doi.org/10.21105/joss.01450 Developer Info Seyed Ali Ghasemi","tags":"home","loc":"index.html"},{"title":"nurbs_volume – ForCAD ","text":"type, public :: nurbs_volume Components Type Visibility Attributes Name Initial real(kind=rk), private, allocatable :: Wc (:) Weights for the control points (1D array: [nc(1) nc(2) nc(3)]) real(kind=rk), private, allocatable :: Xc (:,:) Control points (2D array: [nc(1) nc(2) nc(3), dim]) real(kind=rk), private, allocatable :: Xg (:,:) Geometry points (2D array: [ng(1) ng(2) ng(3), dim]) real(kind=rk), private, allocatable :: Xt1 (:) Evaluation parameter values in the first direction (1D array: [ng(1)]) real(kind=rk), private, allocatable :: Xt2 (:) Evaluation parameter values in the second direction (1D array: [ng(2)]) real(kind=rk), private, allocatable :: Xt3 (:) Evaluation parameter values in the third direction (1D array: [ng(3)]) integer, private :: degree (3) Degree (order) of the volume integer, private, allocatable :: elemConn (:,:) IGA element connectivity integer, private, allocatable :: elemConn_Xc_vis (:,:) Connectivity for visualization of control points integer, private, allocatable :: elemConn_Xg_vis (:,:) Connectivity for visualization of geometry points real(kind=rk), private, allocatable :: knot1 (:) Knot vector in the first direction (1D array) real(kind=rk), private, allocatable :: knot2 (:) Knot vector in the second direction (1D array) real(kind=rk), private, allocatable :: knot3 (:) Knot vector in the third direction (1D array) integer, private :: nc (3) Number of control points in each direction integer, private :: ng (3) Number of geometry points in each direction Type-Bound Procedures procedure, public :: basis Compute the basis functions of the NURBS volume private pure subroutine basis (this, res1, res2, res3, Xt1, Xt2, Xt3, Tgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) procedure, public :: cmp_elem Generate IGA element connectivity private pure function cmp_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: cmp_elem_Xc_vis Generate connectivity for control points private pure function cmp_elem_Xc_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) procedure, public :: cmp_elem_Xg_vis Generate connectivity for geometry points private pure function cmp_elem_Xg_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) procedure, public :: create Generate geometry points private pure subroutine create (this, res1, res2, res3, Xt1, Xt2, Xt3, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(in), optional, contiguous :: Xt (:,:) procedure, public :: derivative Compute the derivative of the NURBS volume private pure subroutine derivative (this, res1, res2, res3, Xt1, Xt2, Xt3, dTgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) procedure, public :: elevate_degree Elevate the degree of the NURBS volume private pure subroutine elevate_degree (this, dir, t) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir integer, intent(in) :: t procedure, public :: export_Xc Export control points to VTK file private impure subroutine export_Xc (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this character(len=*), intent(in) :: filename procedure, public :: export_Xg Export geometry points to VTK file private impure subroutine export_Xg (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this character(len=*), intent(in) :: filename procedure, public :: finalize Finalize the NURBS volume object private pure subroutine finalize (this) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this procedure, public :: get_Wc Get weights private pure function get_Wc (this) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) procedure, public :: get_Xc Get control points private pure function get_Xc (this) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) procedure, public :: get_Xg Get geometry points private pure function get_Xg (this) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) procedure, public :: get_Xt Get parameter values private pure function get_Xt (this, dir) result(Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) procedure, public :: get_continuity Get continuity of the volume private pure function get_continuity (this, dir) result(c) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) generic, public :: get_degree => get_degree_all , get_degree_dir Get degree of the NURBS volume private pure function get_degree_all (this) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, (3) private pure function get_degree_dir (this, dir) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer procedure, public :: get_elem Get IGA element connectivity private pure function get_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: get_elem_Xc_vis Get connectivity for control points private pure function get_elem_Xc_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: get_elem_Xg_vis Get connectivity for geometry points private pure function get_elem_Xg_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) generic, public :: get_knot => get_knoti , get_knot_all Get knot vector private pure function get_knoti (this, dir, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir integer, intent(in) :: i Return Value real(kind=rk) private pure function get_knot_all (this, dir) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) procedure, public :: get_multiplicity Get multiplicity of the knot vector private pure function get_multiplicity (this, dir) result(m) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) procedure, public :: get_nc Get number of required control points private pure function get_nc (this, dir) result(nc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer procedure, public :: get_ng Get number of geometry points private pure function get_ng (this) result(ng) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, (3) procedure, public :: insert_knots Insert knots into the knot vector private pure subroutine insert_knots (this, dir, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) procedure, public :: is_rational Check if the NURBS volume is rational private pure function is_rational (this) result(r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value logical procedure, public :: modify_Wc Modify weights private pure subroutine modify_Wc (this, W, num) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num procedure, public :: modify_Xc Modify control points private pure subroutine modify_Xc (this, X, num, dir) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir procedure, public :: put_to_nurbs Put a shape to a NURBS volume private pure subroutine put_to_nurbs (this, X, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: X (:,:) integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: remove_knots Remove knots from the knot vector private pure subroutine remove_knots (this, dir, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) procedure, public :: rotate_Xc Rotate control points private pure subroutine rotate_Xc (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta procedure, public :: rotate_Xg Rotate geometry points private pure subroutine rotate_Xg (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta generic, public :: set => set1 , set2 , set3 Set NURBS volume private pure subroutine set1 (this, knot1, knot2, knot3, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set control points and weights for the NURBS volume object. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot1 (:) real(kind=rk), intent(in), contiguous :: knot2 (:) real(kind=rk), intent(in), contiguous :: knot3 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set2 (this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set control points and weights for the NURBS volume object. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir1 (:) real(kind=rk), intent(in), contiguous :: Xth_dir2 (:) real(kind=rk), intent(in), contiguous :: Xth_dir3 (:) integer, intent(in), contiguous :: degree (:) integer, intent(in), contiguous :: continuity1 (:) integer, intent(in), contiguous :: continuity2 (:) integer, intent(in), contiguous :: continuity3 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set3 (this, nc, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier volume using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set1 Set knot vectors, control points and weights for the NURBS volume object private pure subroutine set1 (this, knot1, knot2, knot3, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set control points and weights for the NURBS volume object. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot1 (:) real(kind=rk), intent(in), contiguous :: knot2 (:) real(kind=rk), intent(in), contiguous :: knot3 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set2 Set NURBS volume using nodes of parameter space, degree, continuity, control points and weights private pure subroutine set2 (this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set control points and weights for the NURBS volume object. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir1 (:) real(kind=rk), intent(in), contiguous :: Xth_dir2 (:) real(kind=rk), intent(in), contiguous :: Xth_dir3 (:) integer, intent(in), contiguous :: degree (:) integer, intent(in), contiguous :: continuity1 (:) integer, intent(in), contiguous :: continuity2 (:) integer, intent(in), contiguous :: continuity3 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set3 Set Bezier or Rational Bezier volume using control points and weights private pure subroutine set3 (this, nc, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier volume using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set_elem Set IGA element connectivity private pure subroutine set_elem (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: set_elem_Xc_vis Set connectivity for control points private pure subroutine set_elem_Xc_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: set_elem_Xg_vis Set connectivity for geometry points private pure subroutine set_elem_Xg_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: set_hexahedron Set a hexahedron private pure subroutine set_hexahedron (this, L, nc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: L (:) integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: show Show the NURBS object using PyVista private impure subroutine show (this, vtkfile_Xc, vtkfile_Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg procedure, public :: translate_Xc Translate control points private pure subroutine translate_Xc (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) procedure, public :: translate_Xg Translate geometry points private pure subroutine translate_Xg (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) procedure, private :: get_degree_all Get degree of the NURBS volume in all directions private pure function get_degree_all (this) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, (3) procedure, private :: get_degree_dir Get degree of the NURBS volume in a specific direction private pure function get_degree_dir (this, dir) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer procedure, private :: get_knot_all Get all knot vectors private pure function get_knot_all (this, dir) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) procedure, private :: get_knoti Get i-th knot value private pure function get_knoti (this, dir, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir integer, intent(in) :: i Return Value real(kind=rk)","tags":"","loc":"type/nurbs_volume.html"},{"title":"nurbs_surface – ForCAD ","text":"type, public :: nurbs_surface Components Type Visibility Attributes Name Initial real(kind=rk), private, allocatable :: Wc (:) Weights for control points (1D array: [nc(1)*nc(2)]) real(kind=rk), private, allocatable :: Xc (:,:) Control points (2D array: [nc(1)*nc(2), dim]) real(kind=rk), private, allocatable :: Xg (:,:) Geometry points (2D array: [ng(1)*ng(2), dim]) real(kind=rk), private, allocatable :: Xt1 (:) Evaluation parameter values in the first direction (1D array: [ng(1)]) real(kind=rk), private, allocatable :: Xt2 (:) Evaluation parameter values in the second direction (1D array: [ng(2)]) integer, private :: degree (2) Degree (order) of the surface integer, private, allocatable :: elemConn (:,:) IGA element connectivity integer, private, allocatable :: elemConn_Xc_vis (:,:) Connectivity for visualization of control points integer, private, allocatable :: elemConn_Xg_vis (:,:) Connectivity for visualization of geometry points real(kind=rk), private, allocatable :: knot1 (:) Knot vector in the first direction (1D array) real(kind=rk), private, allocatable :: knot2 (:) Knot vector in the second direction (1D array) integer, private :: nc (2) Number of control points in each direction integer, private :: ng (2) Number of geometry points in each direction Type-Bound Procedures procedure, public :: basis Compute the basis functions of the NURBS surface private pure subroutine basis (this, res1, res2, Xt1, Xt2, Tgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) procedure, public :: cmp_elem Generate IGA element connectivity private pure function cmp_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: cmp_elem_Xc_vis Generate connectivity for control points private pure function cmp_elem_Xc_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) procedure, public :: cmp_elem_Xg_vis Generate connectivity for geometry points private pure function cmp_elem_Xg_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) procedure, public :: create Generate geometry points private pure subroutine create (this, res1, res2, Xt1, Xt2, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt (:,:) procedure, public :: derivative Compute the derivative of the NURBS surface private pure subroutine derivative (this, res1, res2, Xt1, Xt2, dTgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) procedure, public :: elevate_degree Elevate degree private pure subroutine elevate_degree (this, dir, t) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir integer, intent(in) :: t procedure, public :: export_Xc Export control points to VTK file private impure subroutine export_Xc (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this character(len=*), intent(in) :: filename procedure, public :: export_Xg Export geometry points to VTK file private impure subroutine export_Xg (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this character(len=*), intent(in) :: filename procedure, public :: finalize Finalize the NURBS surface object private pure subroutine finalize (this) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this procedure, public :: get_Wc Get weights private pure function get_Wc (this) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) procedure, public :: get_Xc Get control points private pure function get_Xc (this) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) procedure, public :: get_Xg Get geometry points private pure function get_Xg (this) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) procedure, public :: get_Xt Get parameter values private pure function get_Xt (this, dir) result(Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) procedure, public :: get_continuity Get continuity of the surface private pure function get_continuity (this, dir) result(c) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) generic, public :: get_degree => get_degree_all , get_degree_dir Get degree of the NURBS surface private pure function get_degree_all (this) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, (2) private pure function get_degree_dir (this, dir) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer procedure, public :: get_elem Get IGA element connectivity private pure function get_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: get_elem_Xc_vis Get connectivity for control points private pure function get_elem_Xc_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: get_elem_Xg_vis Get connectivity for geometry points private pure function get_elem_Xg_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) generic, public :: get_knot => get_knoti , get_knot_all Get knot vector private pure function get_knoti (this, dir, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir integer, intent(in) :: i Return Value real(kind=rk) private pure function get_knot_all (this, dir) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) procedure, public :: get_multiplicity Get multiplicity of the knot vector private pure function get_multiplicity (this, dir) result(m) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) procedure, public :: get_nc Get number of required control points private pure function get_nc (this, dir) result(nc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer procedure, public :: get_ng Get number of geometry points private pure function get_ng (this) result(ng) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, (2) procedure, public :: insert_knots Insert knots into the knot vector private pure subroutine insert_knots (this, dir, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) procedure, public :: is_rational Check if the NURBS surface is rational private pure function is_rational (this) result(r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value logical procedure, public :: modify_Wc Modify weights private pure subroutine modify_Wc (this, W, num) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num procedure, public :: modify_Xc Modify control points private pure subroutine modify_Xc (this, X, num, dir) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir procedure, public :: remove_knots Remove knots from the knot vector private pure subroutine remove_knots (this, dir, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) procedure, public :: rotate_Xc Rotate control points private pure subroutine rotate_Xc (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta procedure, public :: rotate_Xg Rotate geometry points private pure subroutine rotate_Xg (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta generic, public :: set => set1 , set2 , set3 Set NURBS surface private pure subroutine set1 (this, knot1, knot2, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set knot vectors, control points and weights for the NURBS surface object. Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot1 (:) real(kind=rk), intent(in), contiguous :: knot2 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set2 (this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir1 (:) real(kind=rk), intent(in), contiguous :: Xth_dir2 (:) integer, intent(in), contiguous :: degree (:) integer, intent(in), contiguous :: continuity1 (:) integer, intent(in), contiguous :: continuity2 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set3 (this, nc, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier surface using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set1 Set knot vectors, control points and weights for the NURBS surface object private pure subroutine set1 (this, knot1, knot2, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set knot vectors, control points and weights for the NURBS surface object. Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot1 (:) real(kind=rk), intent(in), contiguous :: knot2 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set2 Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights private pure subroutine set2 (this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir1 (:) real(kind=rk), intent(in), contiguous :: Xth_dir2 (:) integer, intent(in), contiguous :: degree (:) integer, intent(in), contiguous :: continuity1 (:) integer, intent(in), contiguous :: continuity2 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set3 Set Bezier or Rational Bezier surface using control points and weights private pure subroutine set3 (this, nc, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier surface using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set_elem Set IGA element connectivity private pure subroutine set_elem (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: set_elem_Xc_vis Set connectivity for control points private pure subroutine set_elem_Xc_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: set_elem_Xg_vis Set connectivity for geometry points private pure subroutine set_elem_Xg_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: set_tetragon Set a tetragon private pure subroutine set_tetragon (this, L, nc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: L (2) integer, intent(in) :: nc (2) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: show Show the NURBS object using PyVista private impure subroutine show (this, vtkfile_Xc, vtkfile_Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg procedure, public :: translate_Xc Translate control points private pure subroutine translate_Xc (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) procedure, public :: translate_Xg Translate geometry points private pure subroutine translate_Xg (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) procedure, private :: get_degree_all Get degree of the NURBS surface in both directions private pure function get_degree_all (this) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, (2) procedure, private :: get_degree_dir Get degree of the NURBS surface in a specific direction private pure function get_degree_dir (this, dir) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer procedure, private :: get_knot_all Get all knot vectors private pure function get_knot_all (this, dir) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) procedure, private :: get_knoti Get i-th knot value private pure function get_knoti (this, dir, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir integer, intent(in) :: i Return Value real(kind=rk)","tags":"","loc":"type/nurbs_surface.html"},{"title":"nurbs_curve – ForCAD ","text":"type, public :: nurbs_curve Components Type Visibility Attributes Name Initial real(kind=rk), private, allocatable :: Wc (:) Weights for control points (1D array: [nc]) real(kind=rk), private, allocatable :: Xc (:,:) Control points (2D array: [nc, dim]) real(kind=rk), private, allocatable :: Xg (:,:) Geometry points (2D array: [ng, dim]) real(kind=rk), private, allocatable :: Xt (:) Evaluation points (1D array: [ng]) integer, private :: degree Degree (order) of the curve integer, private, allocatable :: elemConn (:,:) IGA element connectivity integer, private, allocatable :: elemConn_Xc_vis (:,:) Connectivity for visualization of control points integer, private, allocatable :: elemConn_Xg_vis (:,:) Connectivity for visualization of geometry points real(kind=rk), private, allocatable :: knot (:) Knot vector (1D array) integer, private :: nc Number of control points integer, private :: ng Number of geometry points Type-Bound Procedures procedure, public :: basis Compute the basis functions of the NURBS curve private pure subroutine basis (this, res, Xt, Tgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) procedure, public :: cmp_elem Generate IGA element connectivity private pure function cmp_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: cmp_elem_Xc_vis Generate connectivity for control points private pure function cmp_elem_Xc_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in), optional :: p Return Value integer, allocatable, (:,:) procedure, public :: cmp_elem_Xg_vis Generate connectivity for geometry points private pure function cmp_elem_Xg_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in), optional :: p Return Value integer, allocatable, (:,:) procedure, public :: create Generate geometry points private pure subroutine create (this, res, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) procedure, public :: derivative Compute the derivative of the NURBS curve private pure subroutine derivative (this, res, Xt, dTgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) procedure, public :: elevate_degree Elevate the degree of the curve private pure subroutine elevate_degree (this, t) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in) :: t procedure, public :: export_Xc Export control points to VTK file private impure subroutine export_Xc (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this character(len=*), intent(in) :: filename procedure, public :: export_Xg Export geometry points to VTK file private impure subroutine export_Xg (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this character(len=*), intent(in) :: filename procedure, public :: finalize Finalize the NURBS curve object private pure subroutine finalize (this) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this procedure, public :: get_Wc Get weights private pure function get_Wc (this) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) procedure, public :: get_Xc Get control points private pure function get_Xc (this) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) procedure, public :: get_Xg Get geometry points private pure function get_Xg (this) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) procedure, public :: get_Xt Get parameter values private pure function get_Xt (this) result(Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) procedure, public :: get_continuity Get continuity of the curve private pure function get_continuity (this) result(c) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:) procedure, public :: get_degree Get degree of the NURBS curve private pure function get_degree (this) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer procedure, public :: get_elem Get IGA element connectivity private pure function get_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: get_elem_Xc_vis Get connectivity for control points private pure function get_elem_Xc_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: get_elem_Xg_vis Get connectivity for geometry points private pure function get_elem_Xg_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) generic, public :: get_knot => get_knoti , get_knot_all Get knot vector private pure function get_knoti (this, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: i Return Value real(kind=rk) private pure function get_knot_all (this) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) procedure, public :: get_multiplicity Get multiplicity of the knot vector private pure function get_multiplicity (this) result(m) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:) procedure, public :: get_nc Get number of required control points private pure function get_nc (this) result(nc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer procedure, public :: get_ng Get number of geometry points private pure function get_ng (this) result(ng) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer procedure, public :: insert_knots Insert knots into the knot vector private pure subroutine insert_knots (this, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) procedure, public :: is_rational Check if the NURBS curve is rational private pure function is_rational (this) result(r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value logical procedure, public :: modify_Wc Modify weights private pure subroutine modify_Wc (this, W, num) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num procedure, public :: modify_Xc Modify control points private pure subroutine modify_Xc (this, X, num, dir) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir procedure, public :: remove_knots Remove knots from the knot vector private pure subroutine remove_knots (this, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) procedure, public :: rotate_Xc Rotate control points private pure subroutine rotate_Xc (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta procedure, public :: rotate_Xg Rotate geometry points private pure subroutine rotate_Xg (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta generic, public :: set => set1 , set2 , set3 Set NURBS curve private pure subroutine set1 (this, knot, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set knot vector, control points and weights for the NURBS curve object. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set2 (this, Xth_dir, degree, continuity, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir (:) integer, intent(in) :: degree integer, intent(in), contiguous :: continuity (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set3 (this, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier curve using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set1 Set knot vector, control points and weights for the NURBS curve object private pure subroutine set1 (this, knot, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set knot vector, control points and weights for the NURBS curve object. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set2 Set NURBS curve using nodes of parameter space, degree, continuity, control points and weights private pure subroutine set2 (this, Xth_dir, degree, continuity, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir (:) integer, intent(in) :: degree integer, intent(in), contiguous :: continuity (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set3 Set Bezier or Rational Bezier curve using control points and weights private pure subroutine set3 (this, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier curve using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set_circle Set a circle private pure subroutine set_circle (this, center, radius) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: center (:) real(kind=rk), intent(in) :: radius procedure, public :: set_elem Set IGA element connectivity private pure subroutine set_elem (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: set_elem_Xc_vis Set connectivity for control points private pure subroutine set_elem_Xc_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: set_elem_Xg_vis Set connectivity for geometry points private pure subroutine set_elem_Xg_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: show Show the NURBS object using PyVista private impure subroutine show (this, vtkfile_Xc, vtkfile_Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg procedure, public :: translate_Xc Translate control points private pure subroutine translate_Xc (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) procedure, public :: translate_Xg Translate geometry points private pure subroutine translate_Xg (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) procedure, private :: get_knot_all Get all knot vectors private pure function get_knot_all (this) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) procedure, private :: get_knoti Get i-th knot value private pure function get_knoti (this, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: i Return Value real(kind=rk)","tags":"","loc":"type/nurbs_curve.html"},{"title":"cmp_elem – ForCAD","text":"private pure function cmp_elem(this) result(elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem~~CallsGraph proc~cmp_elem nurbs_volume%cmp_elem interface~elemconn_cn elemConn_Cn proc~cmp_elem->interface~elemconn_cn interface~unique unique proc~cmp_elem->interface~unique proc~get_multiplicity nurbs_volume%get_multiplicity proc~cmp_elem->proc~get_multiplicity proc~cmp_elemconn_cn_l cmp_elemConn_Cn_L interface~elemconn_cn->proc~cmp_elemconn_cn_l proc~cmp_elemconn_cn_s cmp_elemConn_Cn_S interface~elemconn_cn->proc~cmp_elemconn_cn_s proc~cmp_elemconn_cn_v cmp_elemConn_Cn_V interface~elemconn_cn->proc~cmp_elemconn_cn_v proc~unique_integer unique_integer interface~unique->proc~unique_integer proc~unique_real unique_real interface~unique->proc~unique_real interface~compute_multiplicity compute_multiplicity proc~get_multiplicity->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem.html"},{"title":"cmp_elem_Xc_vis – ForCAD","text":"private pure function cmp_elem_Xc_vis(this, p) result(elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem_xc_vis~~CallsGraph proc~cmp_elem_xc_vis nurbs_volume%cmp_elem_Xc_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~cmp_elem_xc_vis~~CalledByGraph proc~cmp_elem_xc_vis nurbs_volume%cmp_elem_Xc_vis proc~export_xc nurbs_volume%export_Xc proc~export_xc->proc~cmp_elem_xc_vis program~example3_volume example3_volume program~example3_volume->proc~export_xc program~example_morph example_morph program~example_morph->proc~export_xc program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~export_xc program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~export_xc Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem_xc_vis.html"},{"title":"cmp_elem_Xg_vis – ForCAD","text":"private pure function cmp_elem_Xg_vis(this, p) result(elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem_xg_vis~~CallsGraph proc~cmp_elem_xg_vis nurbs_volume%cmp_elem_Xg_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xg_vis->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~cmp_elem_xg_vis~~CalledByGraph proc~cmp_elem_xg_vis nurbs_volume%cmp_elem_Xg_vis proc~export_xg nurbs_volume%export_Xg proc~export_xg->proc~cmp_elem_xg_vis program~example3_volume example3_volume program~example3_volume->proc~export_xg program~example_morph example_morph program~example_morph->proc~export_xg program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~export_xg program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~export_xg Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem_xg_vis.html"},{"title":"get_Wc – ForCAD","text":"private pure function get_Wc(this) result(Wc) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_wc.html"},{"title":"get_Xc – ForCAD","text":"private pure function get_Xc(this) result(Xc) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:)","tags":"","loc":"proc/get_xc.html"},{"title":"get_Xg – ForCAD","text":"private pure function get_Xg(this) result(Xg) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:)","tags":"","loc":"proc/get_xg.html"},{"title":"get_Xt – ForCAD","text":"private pure function get_Xt(this, dir) result(Xt) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_xt.html"},{"title":"get_continuity – ForCAD","text":"private pure function get_continuity(this, dir) result(c) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) Calls proc~~get_continuity~~CallsGraph proc~get_continuity nurbs_volume%get_continuity interface~compute_multiplicity compute_multiplicity proc~get_continuity->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_continuity.html"},{"title":"get_degree_all – ForCAD","text":"private pure function get_degree_all(this) result(degree) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, (3) Calls proc~~get_degree_all~~CallsGraph proc~get_degree_all nurbs_volume%get_degree_all proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_degree_all->proc~get_multiplicity interface~compute_multiplicity compute_multiplicity proc~get_multiplicity->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_degree_all~~CalledByGraph proc~get_degree_all nurbs_volume%get_degree_all none~get_degree nurbs_volume%get_degree none~get_degree->proc~get_degree_all proc~set1 nurbs_volume%set1 proc~set1->none~get_degree proc~set3 nurbs_volume%set3 proc~set3->none~get_degree program~example3_volume example3_volume program~example3_volume->none~get_degree none~set nurbs_volume%set program~example3_volume->none~set proc~elevate_degree nurbs_volume%elevate_degree program~example3_volume->proc~elevate_degree proc~insert_knots nurbs_volume%insert_knots program~example3_volume->proc~insert_knots proc~remove_knots nurbs_volume%remove_knots program~example3_volume->proc~remove_knots none~set->proc~set1 none~set->proc~set3 proc~elevate_degree->none~set proc~insert_knots->none~set proc~modify_wc nurbs_volume%modify_Wc proc~modify_wc->none~set proc~modify_xc nurbs_volume%modify_Xc proc~modify_xc->none~set proc~remove_knots->none~set proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set program~example_morph example_morph program~example_morph->none~set program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_degree_all.html"},{"title":"get_degree_dir – ForCAD","text":"private pure function get_degree_dir(this, dir) result(degree) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer Calls proc~~get_degree_dir~~CallsGraph proc~get_degree_dir nurbs_volume%get_degree_dir proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_degree_dir->proc~get_multiplicity interface~compute_multiplicity compute_multiplicity proc~get_multiplicity->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_degree_dir~~CalledByGraph proc~get_degree_dir nurbs_volume%get_degree_dir none~get_degree nurbs_volume%get_degree none~get_degree->proc~get_degree_dir proc~set1 nurbs_volume%set1 proc~set1->none~get_degree proc~set3 nurbs_volume%set3 proc~set3->none~get_degree program~example3_volume example3_volume program~example3_volume->none~get_degree none~set nurbs_volume%set program~example3_volume->none~set proc~elevate_degree nurbs_volume%elevate_degree program~example3_volume->proc~elevate_degree proc~insert_knots nurbs_volume%insert_knots program~example3_volume->proc~insert_knots proc~remove_knots nurbs_volume%remove_knots program~example3_volume->proc~remove_knots none~set->proc~set1 none~set->proc~set3 proc~elevate_degree->none~set proc~insert_knots->none~set proc~modify_wc nurbs_volume%modify_Wc proc~modify_wc->none~set proc~modify_xc nurbs_volume%modify_Xc proc~modify_xc->none~set proc~remove_knots->none~set proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set program~example_morph example_morph program~example_morph->none~set program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_degree_dir.html"},{"title":"get_elem – ForCAD","text":"private pure function get_elem(this) result(elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem.html"},{"title":"get_elem_Xc_vis – ForCAD","text":"private pure function get_elem_Xc_vis(this) result(elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem_xc_vis.html"},{"title":"get_elem_Xg_vis – ForCAD","text":"private pure function get_elem_Xg_vis(this) result(elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem_xg_vis.html"},{"title":"get_knot_all – ForCAD","text":"private pure function get_knot_all(this, dir) result(knot) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) Called by proc~~get_knot_all~~CalledByGraph proc~get_knot_all nurbs_volume%get_knot_all none~get_knot nurbs_volume%get_knot none~get_knot->proc~get_knot_all program~example3_volume example3_volume program~example3_volume->none~get_knot Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_knot_all.html"},{"title":"get_knoti – ForCAD","text":"private pure function get_knoti(this, dir, i) result(knot) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir integer, intent(in) :: i Return Value real(kind=rk) Called by proc~~get_knoti~~CalledByGraph proc~get_knoti nurbs_volume%get_knoti none~get_knot nurbs_volume%get_knot none~get_knot->proc~get_knoti program~example3_volume example3_volume program~example3_volume->none~get_knot Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_knoti.html"},{"title":"get_multiplicity – ForCAD","text":"private pure function get_multiplicity(this, dir) result(m) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) Calls proc~~get_multiplicity~~CallsGraph proc~get_multiplicity nurbs_volume%get_multiplicity interface~compute_multiplicity compute_multiplicity proc~get_multiplicity->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_multiplicity~~CalledByGraph proc~get_multiplicity nurbs_volume%get_multiplicity proc~cmp_elem nurbs_volume%cmp_elem proc~cmp_elem->proc~get_multiplicity proc~get_degree_all nurbs_volume%get_degree_all proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir nurbs_volume%get_degree_dir proc~get_degree_dir->proc~get_multiplicity none~get_degree nurbs_volume%get_degree none~get_degree->proc~get_degree_all none~get_degree->proc~get_degree_dir proc~set1 nurbs_volume%set1 proc~set1->none~get_degree proc~set3 nurbs_volume%set3 proc~set3->none~get_degree program~example3_volume example3_volume program~example3_volume->none~get_degree none~set nurbs_volume%set program~example3_volume->none~set proc~elevate_degree nurbs_volume%elevate_degree program~example3_volume->proc~elevate_degree proc~insert_knots nurbs_volume%insert_knots program~example3_volume->proc~insert_knots proc~remove_knots nurbs_volume%remove_knots program~example3_volume->proc~remove_knots none~set->proc~set1 none~set->proc~set3 proc~elevate_degree->none~set proc~insert_knots->none~set proc~modify_wc nurbs_volume%modify_Wc proc~modify_wc->none~set proc~modify_xc nurbs_volume%modify_Xc proc~modify_xc->none~set proc~remove_knots->none~set proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set program~example_morph example_morph program~example_morph->none~set program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_multiplicity.html"},{"title":"get_nc – ForCAD","text":"private pure function get_nc(this, dir) result(nc) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer Calls proc~~get_nc~~CallsGraph proc~get_nc nurbs_volume%get_nc interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_nc~~CalledByGraph proc~get_nc nurbs_volume%get_nc proc~set1 nurbs_volume%set1 proc~set1->proc~get_nc proc~set2 nurbs_volume%set2 proc~set2->proc~get_nc none~set nurbs_volume%set none~set->proc~set1 none~set->proc~set2 proc~elevate_degree nurbs_volume%elevate_degree proc~elevate_degree->none~set proc~insert_knots nurbs_volume%insert_knots proc~insert_knots->none~set proc~modify_wc nurbs_volume%modify_Wc proc~modify_wc->none~set proc~modify_xc nurbs_volume%modify_Xc proc~modify_xc->none~set proc~remove_knots nurbs_volume%remove_knots proc~remove_knots->none~set proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set program~example3_volume example3_volume program~example3_volume->none~set program~example3_volume->proc~elevate_degree program~example3_volume->proc~insert_knots program~example3_volume->proc~remove_knots program~example_morph example_morph program~example_morph->none~set program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_nc.html"},{"title":"get_ng – ForCAD","text":"private pure function get_ng(this) result(ng) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, (3)","tags":"","loc":"proc/get_ng.html"},{"title":"is_rational – ForCAD","text":"private pure function is_rational(this) result(r) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value logical","tags":"","loc":"proc/is_rational.html"},{"title":"basis – ForCAD","text":"private pure subroutine basis(this, res1, res2, res3, Xt1, Xt2, Xt3, Tgc) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) Calls proc~~basis~~CallsGraph proc~basis nurbs_volume%basis interface~ndgrid ndgrid proc~basis->interface~ndgrid proc~basis_bspline basis_bspline proc~basis->proc~basis_bspline proc~kron kron proc~basis->proc~kron proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/basis.html"},{"title":"create – ForCAD","text":"private pure subroutine create(this, res1, res2, res3, Xt1, Xt2, Xt3, Xt) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(in), optional, contiguous :: Xt (:,:) Calls proc~~create~~CallsGraph proc~create nurbs_volume%create interface~ndgrid ndgrid proc~create->interface~ndgrid proc~basis_bspline basis_bspline proc~create->proc~basis_bspline proc~kron kron proc~create->proc~kron proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~create~~CalledByGraph proc~create nurbs_volume%create program~example3_volume example3_volume program~example3_volume->proc~create program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~create program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~create Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/create.html"},{"title":"derivative – ForCAD","text":"private pure subroutine derivative(this, res1, res2, res3, Xt1, Xt2, Xt3, dTgc) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) Calls proc~~derivative~~CallsGraph proc~derivative nurbs_volume%derivative interface~ndgrid ndgrid proc~derivative->interface~ndgrid proc~basis_bspline_der basis_bspline_der proc~derivative->proc~basis_bspline_der proc~kron kron proc~derivative->proc~kron proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 proc~isinf isinf proc~basis_bspline_der->proc~isinf Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/derivative.html"},{"title":"elevate_degree – ForCAD","text":"private pure subroutine elevate_degree(this, dir, t) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir integer, intent(in) :: t Calls proc~~elevate_degree~~CallsGraph proc~elevate_degree nurbs_volume%elevate_degree none~set nurbs_volume%set proc~elevate_degree->none~set proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree->proc~elevate_degree_a_5_9 proc~set1 nurbs_volume%set1 none~set->proc~set1 proc~set2 nurbs_volume%set2 none~set->proc~set2 proc~set3 nurbs_volume%set3 none~set->proc~set3 interface~compute_multiplicity compute_multiplicity proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~bincoeff bincoeff proc~elevate_degree_a_5_9->proc~bincoeff proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~factln factln proc~bincoeff->proc~factln none~get_degree nurbs_volume%get_degree proc~set1->none~get_degree proc~get_nc nurbs_volume%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~get_degree_all nurbs_volume%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_volume%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_nc->interface~compute_multiplicity proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~elevate_degree~~CalledByGraph proc~elevate_degree nurbs_volume%elevate_degree program~example3_volume example3_volume program~example3_volume->proc~elevate_degree Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/elevate_degree.html"},{"title":"export_Xc – ForCAD","text":"private impure subroutine export_Xc(this, filename) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this character(len=*), intent(in) :: filename Calls proc~~export_xc~~CallsGraph proc~export_xc nurbs_volume%export_Xc proc~cmp_elem_xc_vis nurbs_volume%cmp_elem_Xc_vis proc~export_xc->proc~cmp_elem_xc_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~export_xc~~CalledByGraph proc~export_xc nurbs_volume%export_Xc program~example3_volume example3_volume program~example3_volume->proc~export_xc program~example_morph example_morph program~example_morph->proc~export_xc program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~export_xc program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~export_xc Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/export_xc.html"},{"title":"export_Xg – ForCAD","text":"private impure subroutine export_Xg(this, filename) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this character(len=*), intent(in) :: filename Calls proc~~export_xg~~CallsGraph proc~export_xg nurbs_volume%export_Xg proc~cmp_elem_xg_vis nurbs_volume%cmp_elem_Xg_vis proc~export_xg->proc~cmp_elem_xg_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xg_vis->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~export_xg~~CalledByGraph proc~export_xg nurbs_volume%export_Xg program~example3_volume example3_volume program~example3_volume->proc~export_xg program~example_morph example_morph program~example_morph->proc~export_xg program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~export_xg program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~export_xg Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/export_xg.html"},{"title":"finalize – ForCAD","text":"private pure subroutine finalize(this) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this Called by proc~~finalize~~CalledByGraph proc~finalize nurbs_volume%finalize program~example3_volume example3_volume program~example3_volume->proc~finalize program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~finalize program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~finalize Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/finalize.html"},{"title":"insert_knots – ForCAD","text":"private pure subroutine insert_knots(this, dir, Xth, r) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) Calls proc~~insert_knots~~CallsGraph proc~insert_knots nurbs_volume%insert_knots interface~compute_multiplicity compute_multiplicity proc~insert_knots->interface~compute_multiplicity none~set nurbs_volume%set proc~insert_knots->none~set proc~findspan findspan proc~insert_knots->proc~findspan proc~insert_knot_a_5_1 insert_knot_A_5_1 proc~insert_knots->proc~insert_knot_a_5_1 proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~set1 nurbs_volume%set1 none~set->proc~set1 proc~set2 nurbs_volume%set2 none~set->proc~set2 proc~set3 nurbs_volume%set3 none~set->proc~set3 none~get_degree nurbs_volume%get_degree proc~set1->none~get_degree proc~get_nc nurbs_volume%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~get_degree_all nurbs_volume%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_volume%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_nc->interface~compute_multiplicity proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~insert_knots~~CalledByGraph proc~insert_knots nurbs_volume%insert_knots program~example3_volume example3_volume program~example3_volume->proc~insert_knots Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/insert_knots.html"},{"title":"modify_Wc – ForCAD","text":"private pure subroutine modify_Wc(this, W, num) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num Calls proc~~modify_wc~~CallsGraph proc~modify_wc nurbs_volume%modify_Wc none~set nurbs_volume%set proc~modify_wc->none~set proc~set1 nurbs_volume%set1 none~set->proc~set1 proc~set2 nurbs_volume%set2 none~set->proc~set2 proc~set3 nurbs_volume%set3 none~set->proc~set3 none~get_degree nurbs_volume%get_degree proc~set1->none~get_degree proc~get_nc nurbs_volume%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~get_degree_all nurbs_volume%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_volume%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/modify_wc.html"},{"title":"modify_Xc – ForCAD","text":"private pure subroutine modify_Xc(this, X, num, dir) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir Calls proc~~modify_xc~~CallsGraph proc~modify_xc nurbs_volume%modify_Xc none~set nurbs_volume%set proc~modify_xc->none~set proc~set1 nurbs_volume%set1 none~set->proc~set1 proc~set2 nurbs_volume%set2 none~set->proc~set2 proc~set3 nurbs_volume%set3 none~set->proc~set3 none~get_degree nurbs_volume%get_degree proc~set1->none~get_degree proc~get_nc nurbs_volume%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~get_degree_all nurbs_volume%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_volume%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/modify_xc.html"},{"title":"put_to_nurbs – ForCAD","text":"private pure subroutine put_to_nurbs(this, X, elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: X (:,:) integer, intent(in), contiguous :: elemConn (:,:) Calls proc~~put_to_nurbs~~CallsGraph proc~put_to_nurbs nurbs_volume%put_to_nurbs proc~basis_bspline basis_bspline proc~put_to_nurbs->proc~basis_bspline proc~kron kron proc~put_to_nurbs->proc~kron proc~set_elem_xg_vis nurbs_volume%set_elem_Xg_vis proc~put_to_nurbs->proc~set_elem_xg_vis Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~put_to_nurbs~~CalledByGraph proc~put_to_nurbs nurbs_volume%put_to_nurbs program~example_morph example_morph program~example_morph->proc~put_to_nurbs Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/put_to_nurbs.html"},{"title":"remove_knots – ForCAD","text":"private pure subroutine remove_knots(this, dir, Xth, r) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) Calls proc~~remove_knots~~CallsGraph proc~remove_knots nurbs_volume%remove_knots interface~compute_multiplicity compute_multiplicity proc~remove_knots->interface~compute_multiplicity none~set nurbs_volume%set proc~remove_knots->none~set proc~findspan findspan proc~remove_knots->proc~findspan proc~remove_knots_a_5_8 remove_knots_A_5_8 proc~remove_knots->proc~remove_knots_a_5_8 proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~set1 nurbs_volume%set1 none~set->proc~set1 proc~set2 nurbs_volume%set2 none~set->proc~set2 proc~set3 nurbs_volume%set3 none~set->proc~set3 none~get_degree nurbs_volume%get_degree proc~set1->none~get_degree proc~get_nc nurbs_volume%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~get_degree_all nurbs_volume%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_volume%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_nc->interface~compute_multiplicity proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~remove_knots~~CalledByGraph proc~remove_knots nurbs_volume%remove_knots program~example3_volume example3_volume program~example3_volume->proc~remove_knots Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/remove_knots.html"},{"title":"rotate_Xc – ForCAD","text":"private pure subroutine rotate_Xc(this, alpha, beta, theta) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta Calls proc~~rotate_xc~~CallsGraph proc~rotate_xc nurbs_volume%rotate_Xc proc~rotation rotation proc~rotate_xc->proc~rotation cosd cosd proc~rotation->cosd sind sind proc~rotation->sind Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~rotate_xc~~CalledByGraph proc~rotate_xc nurbs_volume%rotate_Xc program~example3_volume example3_volume program~example3_volume->proc~rotate_xc Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/rotate_xc.html"},{"title":"rotate_Xg – ForCAD","text":"private pure subroutine rotate_Xg(this, alpha, beta, theta) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta Calls proc~~rotate_xg~~CallsGraph proc~rotate_xg nurbs_volume%rotate_Xg proc~rotation rotation proc~rotate_xg->proc~rotation cosd cosd proc~rotation->cosd sind sind proc~rotation->sind Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~rotate_xg~~CalledByGraph proc~rotate_xg nurbs_volume%rotate_Xg program~example3_volume example3_volume program~example3_volume->proc~rotate_xg Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/rotate_xg.html"},{"title":"set1 – ForCAD","text":"private pure subroutine set1(this, knot1, knot2, knot3, Xc, Wc) Set control points and weights for the NURBS volume object. Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot1 (:) real(kind=rk), intent(in), contiguous :: knot2 (:) real(kind=rk), intent(in), contiguous :: knot3 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set1~~CallsGraph proc~set1 nurbs_volume%set1 none~get_degree nurbs_volume%get_degree proc~set1->none~get_degree proc~get_nc nurbs_volume%get_nc proc~set1->proc~get_nc proc~get_degree_all nurbs_volume%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_volume%get_degree_dir none~get_degree->proc~get_degree_dir interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set1~~CalledByGraph proc~set1 nurbs_volume%set1 none~set nurbs_volume%set none~set->proc~set1 proc~elevate_degree nurbs_volume%elevate_degree proc~elevate_degree->none~set proc~insert_knots nurbs_volume%insert_knots proc~insert_knots->none~set proc~modify_wc nurbs_volume%modify_Wc proc~modify_wc->none~set proc~modify_xc nurbs_volume%modify_Xc proc~modify_xc->none~set proc~remove_knots nurbs_volume%remove_knots proc~remove_knots->none~set proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set program~example3_volume example3_volume program~example3_volume->none~set program~example3_volume->proc~elevate_degree program~example3_volume->proc~insert_knots program~example3_volume->proc~remove_knots program~example_morph example_morph program~example_morph->none~set program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set1.html"},{"title":"set2 – ForCAD","text":"private pure subroutine set2(this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc) Set control points and weights for the NURBS volume object. Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir1 (:) real(kind=rk), intent(in), contiguous :: Xth_dir2 (:) real(kind=rk), intent(in), contiguous :: Xth_dir3 (:) integer, intent(in), contiguous :: degree (:) integer, intent(in), contiguous :: continuity1 (:) integer, intent(in), contiguous :: continuity2 (:) integer, intent(in), contiguous :: continuity3 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set2~~CallsGraph proc~set2 nurbs_volume%set2 proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~get_nc nurbs_volume%get_nc proc~set2->proc~get_nc proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set2~~CalledByGraph proc~set2 nurbs_volume%set2 none~set nurbs_volume%set none~set->proc~set2 proc~elevate_degree nurbs_volume%elevate_degree proc~elevate_degree->none~set proc~insert_knots nurbs_volume%insert_knots proc~insert_knots->none~set proc~modify_wc nurbs_volume%modify_Wc proc~modify_wc->none~set proc~modify_xc nurbs_volume%modify_Xc proc~modify_xc->none~set proc~remove_knots nurbs_volume%remove_knots proc~remove_knots->none~set proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set program~example3_volume example3_volume program~example3_volume->none~set program~example3_volume->proc~elevate_degree program~example3_volume->proc~insert_knots program~example3_volume->proc~remove_knots program~example_morph example_morph program~example_morph->none~set program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set2.html"},{"title":"set3 – ForCAD","text":"private pure subroutine set3(this, nc, Xc, Wc) Set Bezier or Rational Bezier volume using control points and weights. Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set3~~CallsGraph proc~set3 nurbs_volume%set3 none~get_degree nurbs_volume%get_degree proc~set3->none~get_degree proc~get_degree_all nurbs_volume%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_volume%get_degree_dir none~get_degree->proc~get_degree_dir proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity interface~compute_multiplicity compute_multiplicity proc~get_multiplicity->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set3~~CalledByGraph proc~set3 nurbs_volume%set3 none~set nurbs_volume%set none~set->proc~set3 proc~elevate_degree nurbs_volume%elevate_degree proc~elevate_degree->none~set proc~insert_knots nurbs_volume%insert_knots proc~insert_knots->none~set proc~modify_wc nurbs_volume%modify_Wc proc~modify_wc->none~set proc~modify_xc nurbs_volume%modify_Xc proc~modify_xc->none~set proc~remove_knots nurbs_volume%remove_knots proc~remove_knots->none~set proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set program~example3_volume example3_volume program~example3_volume->none~set program~example3_volume->proc~elevate_degree program~example3_volume->proc~insert_knots program~example3_volume->proc~remove_knots program~example_morph example_morph program~example_morph->none~set program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set3.html"},{"title":"set_elem – ForCAD","text":"private pure subroutine set_elem(this, elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:)","tags":"","loc":"proc/set_elem.html"},{"title":"set_elem_Xc_vis – ForCAD","text":"private pure subroutine set_elem_Xc_vis(this, elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:)","tags":"","loc":"proc/set_elem_xc_vis.html"},{"title":"set_elem_Xg_vis – ForCAD","text":"private pure subroutine set_elem_Xg_vis(this, elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) Called by proc~~set_elem_xg_vis~~CalledByGraph proc~set_elem_xg_vis nurbs_volume%set_elem_Xg_vis proc~put_to_nurbs nurbs_volume%put_to_nurbs proc~put_to_nurbs->proc~set_elem_xg_vis program~example_morph example_morph program~example_morph->proc~put_to_nurbs Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set_elem_xg_vis.html"},{"title":"set_hexahedron – ForCAD","text":"private pure subroutine set_hexahedron(this, L, nc, Wc) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: L (:) integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set_hexahedron~~CallsGraph proc~set_hexahedron nurbs_volume%set_hexahedron none~set nurbs_volume%set proc~set_hexahedron->none~set proc~hexahedron_xc hexahedron_Xc proc~set_hexahedron->proc~hexahedron_xc proc~set1 nurbs_volume%set1 none~set->proc~set1 proc~set2 nurbs_volume%set2 none~set->proc~set2 proc~set3 nurbs_volume%set3 none~set->proc~set3 none~get_degree nurbs_volume%get_degree proc~set1->none~get_degree proc~get_nc nurbs_volume%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~get_degree_all nurbs_volume%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_volume%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set_hexahedron~~CalledByGraph proc~set_hexahedron nurbs_volume%set_hexahedron program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set_hexahedron.html"},{"title":"show – ForCAD","text":"private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg Called by proc~~show~~CalledByGraph proc~show nurbs_volume%show program~example3_volume example3_volume program~example3_volume->proc~show program~example_morph example_morph program~example_morph->proc~show program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~show program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~show Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/show.html"},{"title":"translate_Xc – ForCAD","text":"private pure subroutine translate_Xc(this, vec) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) Called by proc~~translate_xc~~CalledByGraph proc~translate_xc nurbs_volume%translate_Xc program~example3_volume example3_volume program~example3_volume->proc~translate_xc Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/translate_xc.html"},{"title":"translate_Xg – ForCAD","text":"private pure subroutine translate_Xg(this, vec) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) Called by proc~~translate_xg~~CalledByGraph proc~translate_xg nurbs_volume%translate_Xg program~example3_volume example3_volume program~example3_volume->proc~translate_xg Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/translate_xg.html"},{"title":"generate_Xc – ForCAD","text":"function generate_Xc(num_coils, radius, height, num_points_per_coil) result(control_points) Arguments 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 Return Value real(kind=rk), allocatable, (:,:) Called by proc~~generate_xc~~CalledByGraph proc~generate_xc generate_Xc program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~generate_xc Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/generate_xc.html"},{"title":"basis_bernstein – ForCAD","text":"public pure function basis_bernstein(Xt, nc) result(B) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: Xt integer, intent(in) :: nc Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/basis_bernstein.html"},{"title":"basis_bspline – ForCAD","text":"public pure function basis_bspline(Xt, knot, nc, degree) result(B) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: Xt real(kind=rk), intent(in), contiguous :: knot (:) integer, intent(in) :: nc integer, intent(in) :: degree Return Value real(kind=rk), allocatable, (:) Called by proc~~basis_bspline~~CalledByGraph proc~basis_bspline basis_bspline proc~basis nurbs_volume%basis proc~basis->proc~basis_bspline proc~basis~2 nurbs_surface%basis proc~basis~2->proc~basis_bspline proc~basis~3 nurbs_curve%basis proc~basis~3->proc~basis_bspline proc~create nurbs_volume%create proc~create->proc~basis_bspline proc~create~2 nurbs_surface%create proc~create~2->proc~basis_bspline proc~create~3 nurbs_curve%create proc~create~3->proc~basis_bspline proc~put_to_nurbs nurbs_volume%put_to_nurbs proc~put_to_nurbs->proc~basis_bspline program~example1_curve example1_curve program~example1_curve->proc~create~3 program~example3_surface example3_surface program~example3_surface->proc~create~2 program~example3_volume example3_volume program~example3_volume->proc~create program~example_morph example_morph program~example_morph->proc~put_to_nurbs program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~create~3 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~create~2 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~create program~shape_circle shape_circle program~shape_circle->proc~create~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~create program~shape_tetragon shape_tetragon program~shape_tetragon->proc~create~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/basis_bspline.html"},{"title":"basis_bspline_der – ForCAD","text":"public pure function basis_bspline_der(Xt, knot, nc, degree) result(dB) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: Xt real(kind=rk), intent(in), contiguous :: knot (:) integer, intent(in) :: nc integer, intent(in) :: degree Return Value real(kind=rk), allocatable, (:) Calls proc~~basis_bspline_der~~CallsGraph proc~basis_bspline_der basis_bspline_der proc~isinf isinf proc~basis_bspline_der->proc~isinf Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~basis_bspline_der~~CalledByGraph proc~basis_bspline_der basis_bspline_der proc~derivative nurbs_volume%derivative proc~derivative->proc~basis_bspline_der proc~derivative~2 nurbs_surface%derivative proc~derivative~2->proc~basis_bspline_der proc~derivative~3 nurbs_curve%derivative proc~derivative~3->proc~basis_bspline_der Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/basis_bspline_der.html"},{"title":"compute_knot_vector – ForCAD","text":"public pure function compute_knot_vector(Xth_dir, degree, continuity) result(knot) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: Xth_dir (:) integer, intent(in) :: degree integer, intent(in), contiguous :: continuity (:) Return Value real(kind=rk), allocatable, (:) Calls proc~~compute_knot_vector~~CallsGraph proc~compute_knot_vector compute_knot_vector proc~repelem repelem proc~compute_knot_vector->proc~repelem Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~compute_knot_vector~~CalledByGraph proc~compute_knot_vector compute_knot_vector proc~set2 nurbs_volume%set2 proc~set2->proc~compute_knot_vector proc~set2~2 nurbs_surface%set2 proc~set2~2->proc~compute_knot_vector proc~set2~3 nurbs_curve%set2 proc~set2~3->proc~compute_knot_vector none~set nurbs_volume%set none~set->proc~set2 none~set~2 nurbs_surface%set none~set~2->proc~set2~2 none~set~3 nurbs_curve%set none~set~3->proc~set2~3 proc~elevate_degree nurbs_volume%elevate_degree proc~elevate_degree->none~set proc~elevate_degree~2 nurbs_surface%elevate_degree proc~elevate_degree~2->none~set~2 proc~elevate_degree~3 nurbs_curve%elevate_degree proc~elevate_degree~3->none~set~3 proc~insert_knots nurbs_volume%insert_knots proc~insert_knots->none~set proc~insert_knots~2 nurbs_surface%insert_knots proc~insert_knots~2->none~set~2 proc~insert_knots~3 nurbs_curve%insert_knots proc~insert_knots~3->none~set~3 proc~modify_wc nurbs_volume%modify_Wc proc~modify_wc->none~set proc~modify_wc~2 nurbs_surface%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_wc~3 nurbs_curve%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc nurbs_volume%modify_Xc proc~modify_xc->none~set proc~modify_xc~2 nurbs_surface%modify_Xc proc~modify_xc~2->none~set~2 proc~modify_xc~3 nurbs_curve%modify_Xc proc~modify_xc~3->none~set~3 proc~remove_knots nurbs_volume%remove_knots proc~remove_knots->none~set proc~remove_knots~2 nurbs_surface%remove_knots proc~remove_knots~2->none~set~2 proc~remove_knots~3 nurbs_curve%remove_knots proc~remove_knots~3->none~set~3 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~3 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set~2 program~example1_curve example1_curve program~example1_curve->none~set~3 program~example1_curve->proc~elevate_degree~3 program~example1_curve->proc~insert_knots~3 program~example1_curve->proc~remove_knots~3 program~example3_surface example3_surface program~example3_surface->none~set~2 program~example3_surface->proc~elevate_degree~2 program~example3_surface->proc~insert_knots~2 program~example3_surface->proc~remove_knots~2 program~example3_volume example3_volume program~example3_volume->none~set program~example3_volume->proc~elevate_degree program~example3_volume->proc~insert_knots program~example3_volume->proc~remove_knots program~example_morph example_morph program~example_morph->none~set program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~3 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set~2 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set program~shape_circle shape_circle program~shape_circle->proc~set_circle program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/compute_knot_vector.html"},{"title":"findspan – ForCAD","text":"public pure function findspan(n, degree, Xth, knot) result(s) Arguments Type Intent Optional Attributes Name integer, intent(in) :: n integer, intent(in) :: degree real(kind=rk), intent(in) :: Xth real(kind=rk), intent(in), contiguous :: knot (:) Return Value integer Called by proc~~findspan~~CalledByGraph proc~findspan findspan proc~insert_knots nurbs_volume%insert_knots proc~insert_knots->proc~findspan proc~insert_knots~2 nurbs_surface%insert_knots proc~insert_knots~2->proc~findspan proc~insert_knots~3 nurbs_curve%insert_knots proc~insert_knots~3->proc~findspan proc~remove_knots nurbs_volume%remove_knots proc~remove_knots->proc~findspan proc~remove_knots~2 nurbs_surface%remove_knots proc~remove_knots~2->proc~findspan proc~remove_knots~3 nurbs_curve%remove_knots proc~remove_knots~3->proc~findspan program~example1_curve example1_curve program~example1_curve->proc~insert_knots~3 program~example1_curve->proc~remove_knots~3 program~example3_surface example3_surface program~example3_surface->proc~insert_knots~2 program~example3_surface->proc~remove_knots~2 program~example3_volume example3_volume program~example3_volume->proc~insert_knots program~example3_volume->proc~remove_knots Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/findspan.html"},{"title":"hexahedron_Xc – ForCAD","text":"public pure function hexahedron_Xc(L, nc) result(Xc) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: L (3) integer, intent(in) :: nc (3) Return Value real(kind=rk), allocatable, (:,:) Called by proc~~hexahedron_xc~~CalledByGraph proc~hexahedron_xc hexahedron_Xc proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->proc~hexahedron_xc program~example_morph example_morph program~example_morph->proc~hexahedron_xc program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/hexahedron_xc.html"},{"title":"kron – ForCAD","text":"public pure function kron(u, v) result(w) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: u (:) real(kind=rk), intent(in), contiguous :: v (:) Return Value real(kind=rk), (size(u)*size(v)) Called by proc~~kron~~CalledByGraph proc~kron kron proc~basis nurbs_volume%basis proc~basis->proc~kron proc~basis~2 nurbs_surface%basis proc~basis~2->proc~kron proc~create nurbs_volume%create proc~create->proc~kron proc~create~2 nurbs_surface%create proc~create~2->proc~kron proc~derivative nurbs_volume%derivative proc~derivative->proc~kron proc~derivative~2 nurbs_surface%derivative proc~derivative~2->proc~kron proc~put_to_nurbs nurbs_volume%put_to_nurbs proc~put_to_nurbs->proc~kron program~example3_surface example3_surface program~example3_surface->proc~create~2 program~example3_volume example3_volume program~example3_volume->proc~create program~example_morph example_morph program~example_morph->proc~put_to_nurbs program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~create~2 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~create program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~create program~shape_tetragon shape_tetragon program~shape_tetragon->proc~create~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/kron.html"},{"title":"rotation – ForCAD","text":"public pure function rotation(alpha, beta, theta) result(R) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta Return Value real(kind=rk), dimension(3,3) Calls proc~~rotation~~CallsGraph proc~rotation rotation cosd cosd proc~rotation->cosd sind sind proc~rotation->sind Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~rotation~~CalledByGraph proc~rotation rotation proc~rotate_xc nurbs_volume%rotate_Xc proc~rotate_xc->proc~rotation proc~rotate_xc~2 nurbs_surface%rotate_Xc proc~rotate_xc~2->proc~rotation proc~rotate_xc~3 nurbs_curve%rotate_Xc proc~rotate_xc~3->proc~rotation proc~rotate_xg nurbs_volume%rotate_Xg proc~rotate_xg->proc~rotation proc~rotate_xg~2 nurbs_surface%rotate_Xg proc~rotate_xg~2->proc~rotation proc~rotate_xg~3 nurbs_curve%rotate_Xg proc~rotate_xg~3->proc~rotation program~example1_curve example1_curve program~example1_curve->proc~rotate_xc~3 program~example1_curve->proc~rotate_xg~3 program~example3_surface example3_surface program~example3_surface->proc~rotate_xc~2 program~example3_surface->proc~rotate_xg~2 program~example3_volume example3_volume program~example3_volume->proc~rotate_xc program~example3_volume->proc~rotate_xg Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/rotation.html"},{"title":"tetragon_Xc – ForCAD","text":"public pure function tetragon_Xc(L, nc) result(Xc) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: L (2) integer, intent(in) :: nc (2) Return Value real(kind=rk), allocatable, (:,:) Called by proc~~tetragon_xc~~CalledByGraph proc~tetragon_xc tetragon_Xc proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->proc~tetragon_xc program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/tetragon_xc.html"},{"title":"bincoeff – ForCAD","text":"private pure function bincoeff(n, k) result(b) Arguments Type Intent Optional Attributes Name integer, intent(in) :: n integer, intent(in) :: k Return Value real(kind=rk) Calls proc~~bincoeff~~CallsGraph proc~bincoeff bincoeff proc~factln factln proc~bincoeff->proc~factln Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~bincoeff~~CalledByGraph proc~bincoeff bincoeff proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree_a_5_9->proc~bincoeff proc~elevate_degree nurbs_volume%elevate_degree proc~elevate_degree->proc~elevate_degree_a_5_9 proc~elevate_degree~2 nurbs_surface%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 proc~elevate_degree~3 nurbs_curve%elevate_degree proc~elevate_degree~3->proc~elevate_degree_a_5_9 program~example1_curve example1_curve program~example1_curve->proc~elevate_degree~3 program~example3_surface example3_surface program~example3_surface->proc~elevate_degree~2 program~example3_volume example3_volume program~example3_volume->proc~elevate_degree Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/bincoeff.html"},{"title":"cmp_elemConn_C0_L – ForCAD","text":"private pure function cmp_elemConn_C0_L(nnode, p) result(elemConn) Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode integer, intent(in) :: p Return Value integer, allocatable, (:,:) Called by proc~~cmp_elemconn_c0_l~~CalledByGraph proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0 elemConn_C0 interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elem_xc_vis nurbs_volume%cmp_elem_Xc_vis proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elem_xc_vis~2 nurbs_surface%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elem_xc_vis~3 nurbs_curve%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elem_xg_vis nurbs_volume%cmp_elem_Xg_vis proc~cmp_elem_xg_vis->interface~elemconn_c0 proc~cmp_elem_xg_vis~2 nurbs_surface%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~cmp_elem_xg_vis~3 nurbs_curve%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~export_xc nurbs_volume%export_Xc proc~export_xc->proc~cmp_elem_xc_vis proc~export_xc~2 nurbs_surface%export_Xc proc~export_xc~2->proc~cmp_elem_xc_vis~2 proc~export_xc~3 nurbs_curve%export_Xc proc~export_xc~3->proc~cmp_elem_xc_vis~3 proc~export_xg nurbs_volume%export_Xg proc~export_xg->proc~cmp_elem_xg_vis proc~export_xg~2 nurbs_surface%export_Xg proc~export_xg~2->proc~cmp_elem_xg_vis~2 proc~export_xg~3 nurbs_curve%export_Xg proc~export_xg~3->proc~cmp_elem_xg_vis~3 program~example1_curve example1_curve program~example1_curve->proc~export_xc~3 program~example1_curve->proc~export_xg~3 program~example3_surface example3_surface program~example3_surface->proc~export_xc~2 program~example3_surface->proc~export_xg~2 program~example3_volume example3_volume program~example3_volume->proc~export_xc program~example3_volume->proc~export_xg program~example_morph example_morph program~example_morph->proc~export_xc program~example_morph->proc~export_xg program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~export_xc~3 program~example_nurbs_curve->proc~export_xg~3 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~export_xc~2 program~example_nurbs_surface->proc~export_xg~2 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~export_xc program~example_nurbs_volume->proc~export_xg program~shape_circle shape_circle program~shape_circle->proc~export_xc~3 program~shape_circle->proc~export_xg~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~export_xc program~shape_hexahedron->proc~export_xg program~shape_tetragon shape_tetragon program~shape_tetragon->proc~export_xc~2 program~shape_tetragon->proc~export_xg~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elemconn_c0_l.html"},{"title":"cmp_elemConn_C0_S – ForCAD","text":"private pure function cmp_elemConn_C0_S(nnode1, nnode2, p1, p2) result(elemConn) Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: p1 integer, intent(in) :: p2 Return Value integer, allocatable, (:,:) Called by proc~~cmp_elemconn_c0_s~~CalledByGraph proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0 elemConn_C0 interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elem_xc_vis nurbs_volume%cmp_elem_Xc_vis proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elem_xc_vis~2 nurbs_surface%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elem_xc_vis~3 nurbs_curve%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elem_xg_vis nurbs_volume%cmp_elem_Xg_vis proc~cmp_elem_xg_vis->interface~elemconn_c0 proc~cmp_elem_xg_vis~2 nurbs_surface%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~cmp_elem_xg_vis~3 nurbs_curve%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~export_xc nurbs_volume%export_Xc proc~export_xc->proc~cmp_elem_xc_vis proc~export_xc~2 nurbs_surface%export_Xc proc~export_xc~2->proc~cmp_elem_xc_vis~2 proc~export_xc~3 nurbs_curve%export_Xc proc~export_xc~3->proc~cmp_elem_xc_vis~3 proc~export_xg nurbs_volume%export_Xg proc~export_xg->proc~cmp_elem_xg_vis proc~export_xg~2 nurbs_surface%export_Xg proc~export_xg~2->proc~cmp_elem_xg_vis~2 proc~export_xg~3 nurbs_curve%export_Xg proc~export_xg~3->proc~cmp_elem_xg_vis~3 program~example1_curve example1_curve program~example1_curve->proc~export_xc~3 program~example1_curve->proc~export_xg~3 program~example3_surface example3_surface program~example3_surface->proc~export_xc~2 program~example3_surface->proc~export_xg~2 program~example3_volume example3_volume program~example3_volume->proc~export_xc program~example3_volume->proc~export_xg program~example_morph example_morph program~example_morph->proc~export_xc program~example_morph->proc~export_xg program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~export_xc~3 program~example_nurbs_curve->proc~export_xg~3 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~export_xc~2 program~example_nurbs_surface->proc~export_xg~2 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~export_xc program~example_nurbs_volume->proc~export_xg program~shape_circle shape_circle program~shape_circle->proc~export_xc~3 program~shape_circle->proc~export_xg~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~export_xc program~shape_hexahedron->proc~export_xg program~shape_tetragon shape_tetragon program~shape_tetragon->proc~export_xc~2 program~shape_tetragon->proc~export_xg~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elemconn_c0_s.html"},{"title":"cmp_elemConn_C0_V – ForCAD","text":"private pure function cmp_elemConn_C0_V(nnode1, nnode2, nnode3, p1, p2, p3) result(elemConn) Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: nnode3 integer, intent(in) :: p1 integer, intent(in) :: p2 integer, intent(in) :: p3 Return Value integer, allocatable, (:,:) Called by proc~~cmp_elemconn_c0_v~~CalledByGraph proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0 elemConn_C0 interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~cmp_elem_xc_vis nurbs_volume%cmp_elem_Xc_vis proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elem_xc_vis~2 nurbs_surface%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elem_xc_vis~3 nurbs_curve%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elem_xg_vis nurbs_volume%cmp_elem_Xg_vis proc~cmp_elem_xg_vis->interface~elemconn_c0 proc~cmp_elem_xg_vis~2 nurbs_surface%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~cmp_elem_xg_vis~3 nurbs_curve%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~export_xc nurbs_volume%export_Xc proc~export_xc->proc~cmp_elem_xc_vis proc~export_xc~2 nurbs_surface%export_Xc proc~export_xc~2->proc~cmp_elem_xc_vis~2 proc~export_xc~3 nurbs_curve%export_Xc proc~export_xc~3->proc~cmp_elem_xc_vis~3 proc~export_xg nurbs_volume%export_Xg proc~export_xg->proc~cmp_elem_xg_vis proc~export_xg~2 nurbs_surface%export_Xg proc~export_xg~2->proc~cmp_elem_xg_vis~2 proc~export_xg~3 nurbs_curve%export_Xg proc~export_xg~3->proc~cmp_elem_xg_vis~3 program~example1_curve example1_curve program~example1_curve->proc~export_xc~3 program~example1_curve->proc~export_xg~3 program~example3_surface example3_surface program~example3_surface->proc~export_xc~2 program~example3_surface->proc~export_xg~2 program~example3_volume example3_volume program~example3_volume->proc~export_xc program~example3_volume->proc~export_xg program~example_morph example_morph program~example_morph->proc~export_xc program~example_morph->proc~export_xg program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~export_xc~3 program~example_nurbs_curve->proc~export_xg~3 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~export_xc~2 program~example_nurbs_surface->proc~export_xg~2 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~export_xc program~example_nurbs_volume->proc~export_xg program~shape_circle shape_circle program~shape_circle->proc~export_xc~3 program~shape_circle->proc~export_xg~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~export_xc program~shape_hexahedron->proc~export_xg program~shape_tetragon shape_tetragon program~shape_tetragon->proc~export_xc~2 program~shape_tetragon->proc~export_xg~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elemconn_c0_v.html"},{"title":"compute_multiplicity1 – ForCAD","text":"private pure function compute_multiplicity1(knot) result(multiplicity) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: knot (:) Return Value integer, allocatable, (:) Called by proc~~compute_multiplicity1~~CalledByGraph proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity compute_multiplicity interface~compute_multiplicity->proc~compute_multiplicity1 proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~get_continuity nurbs_volume%get_continuity proc~get_continuity->interface~compute_multiplicity proc~get_continuity~2 nurbs_surface%get_continuity proc~get_continuity~2->interface~compute_multiplicity proc~get_continuity~3 nurbs_curve%get_continuity proc~get_continuity~3->interface~compute_multiplicity proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_multiplicity->interface~compute_multiplicity proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~get_nc nurbs_volume%get_nc proc~get_nc->interface~compute_multiplicity proc~get_nc~2 nurbs_surface%get_nc proc~get_nc~2->interface~compute_multiplicity proc~get_nc~3 nurbs_curve%get_nc proc~get_nc~3->interface~compute_multiplicity proc~insert_knots nurbs_volume%insert_knots proc~insert_knots->interface~compute_multiplicity none~set nurbs_volume%set proc~insert_knots->none~set proc~insert_knots~2 nurbs_surface%insert_knots proc~insert_knots~2->interface~compute_multiplicity none~set~2 nurbs_surface%set proc~insert_knots~2->none~set~2 proc~insert_knots~3 nurbs_curve%insert_knots proc~insert_knots~3->interface~compute_multiplicity none~set~3 nurbs_curve%set proc~insert_knots~3->none~set~3 proc~remove_knots nurbs_volume%remove_knots proc~remove_knots->interface~compute_multiplicity proc~remove_knots->none~set proc~remove_knots~2 nurbs_surface%remove_knots proc~remove_knots~2->interface~compute_multiplicity proc~remove_knots~2->none~set~2 proc~remove_knots~3 nurbs_curve%remove_knots proc~remove_knots~3->interface~compute_multiplicity proc~remove_knots~3->none~set~3 proc~cmp_elem nurbs_volume%cmp_elem proc~cmp_elem->proc~get_multiplicity proc~cmp_elem~2 nurbs_surface%cmp_elem proc~cmp_elem~2->proc~get_multiplicity~2 proc~cmp_elem~3 nurbs_curve%cmp_elem proc~cmp_elem~3->proc~get_multiplicity~3 proc~elevate_degree nurbs_volume%elevate_degree proc~elevate_degree->proc~elevate_degree_a_5_9 proc~elevate_degree->none~set proc~elevate_degree~2 nurbs_surface%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 proc~elevate_degree~2->none~set~2 proc~elevate_degree~3 nurbs_curve%elevate_degree proc~elevate_degree~3->proc~elevate_degree_a_5_9 proc~elevate_degree~3->none~set~3 proc~get_degree nurbs_curve%get_degree proc~get_degree->proc~get_multiplicity~3 proc~get_degree_all nurbs_volume%get_degree_all proc~get_degree_all->proc~get_multiplicity proc~get_degree_all~2 nurbs_surface%get_degree_all proc~get_degree_all~2->proc~get_multiplicity~2 proc~get_degree_dir nurbs_volume%get_degree_dir proc~get_degree_dir->proc~get_multiplicity proc~get_degree_dir~2 nurbs_surface%get_degree_dir proc~get_degree_dir~2->proc~get_multiplicity~2 proc~set1 nurbs_volume%set1 proc~set1->proc~get_nc none~get_degree nurbs_volume%get_degree proc~set1->none~get_degree proc~set1~2 nurbs_surface%set1 proc~set1~2->proc~get_nc~2 none~get_degree~2 nurbs_surface%get_degree proc~set1~2->none~get_degree~2 proc~set2 nurbs_volume%set2 proc~set2->proc~get_nc proc~set2~2 nurbs_surface%set2 proc~set2~2->proc~get_nc~2 program~example1_curve example1_curve program~example1_curve->proc~insert_knots~3 program~example1_curve->proc~remove_knots~3 program~example1_curve->proc~elevate_degree~3 program~example1_curve->proc~get_degree program~example1_curve->none~set~3 program~example3_surface example3_surface program~example3_surface->proc~insert_knots~2 program~example3_surface->proc~remove_knots~2 program~example3_surface->proc~elevate_degree~2 program~example3_surface->none~get_degree~2 program~example3_surface->none~set~2 program~example3_volume example3_volume program~example3_volume->proc~insert_knots program~example3_volume->proc~remove_knots program~example3_volume->proc~elevate_degree program~example3_volume->none~get_degree program~example3_volume->none~set none~get_degree->proc~get_degree_all none~get_degree->proc~get_degree_dir none~get_degree~2->proc~get_degree_all~2 none~get_degree~2->proc~get_degree_dir~2 none~set->proc~set1 none~set->proc~set2 proc~set3 nurbs_volume%set3 none~set->proc~set3 none~set~2->proc~set1~2 none~set~2->proc~set2~2 proc~set3~2 nurbs_surface%set3 none~set~2->proc~set3~2 proc~set1~3 nurbs_curve%set1 proc~set1~3->proc~get_degree proc~set3~3 nurbs_curve%set3 proc~set3~3->proc~get_degree none~set~3->proc~set1~3 none~set~3->proc~set3~3 proc~modify_wc nurbs_volume%modify_Wc proc~modify_wc->none~set proc~modify_wc~2 nurbs_surface%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc nurbs_volume%modify_Xc proc~modify_xc->none~set proc~modify_xc~2 nurbs_surface%modify_Xc proc~modify_xc~2->none~set~2 proc~set3->none~get_degree proc~set3~2->none~get_degree~2 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set~2 program~example_morph example_morph program~example_morph->none~set program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set~2 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set proc~modify_wc~3 nurbs_curve%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc~3 nurbs_curve%modify_Xc proc~modify_xc~3->none~set~3 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/compute_multiplicity1.html"},{"title":"compute_multiplicity2 – ForCAD","text":"private pure function compute_multiplicity2(knot, Xth) result(multiplicity) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in) :: Xth Return Value integer Called by proc~~compute_multiplicity2~~CalledByGraph proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity compute_multiplicity interface~compute_multiplicity->proc~compute_multiplicity2 proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~get_continuity nurbs_volume%get_continuity proc~get_continuity->interface~compute_multiplicity proc~get_continuity~2 nurbs_surface%get_continuity proc~get_continuity~2->interface~compute_multiplicity proc~get_continuity~3 nurbs_curve%get_continuity proc~get_continuity~3->interface~compute_multiplicity proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_multiplicity->interface~compute_multiplicity proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~get_nc nurbs_volume%get_nc proc~get_nc->interface~compute_multiplicity proc~get_nc~2 nurbs_surface%get_nc proc~get_nc~2->interface~compute_multiplicity proc~get_nc~3 nurbs_curve%get_nc proc~get_nc~3->interface~compute_multiplicity proc~insert_knots nurbs_volume%insert_knots proc~insert_knots->interface~compute_multiplicity none~set nurbs_volume%set proc~insert_knots->none~set proc~insert_knots~2 nurbs_surface%insert_knots proc~insert_knots~2->interface~compute_multiplicity none~set~2 nurbs_surface%set proc~insert_knots~2->none~set~2 proc~insert_knots~3 nurbs_curve%insert_knots proc~insert_knots~3->interface~compute_multiplicity none~set~3 nurbs_curve%set proc~insert_knots~3->none~set~3 proc~remove_knots nurbs_volume%remove_knots proc~remove_knots->interface~compute_multiplicity proc~remove_knots->none~set proc~remove_knots~2 nurbs_surface%remove_knots proc~remove_knots~2->interface~compute_multiplicity proc~remove_knots~2->none~set~2 proc~remove_knots~3 nurbs_curve%remove_knots proc~remove_knots~3->interface~compute_multiplicity proc~remove_knots~3->none~set~3 proc~cmp_elem nurbs_volume%cmp_elem proc~cmp_elem->proc~get_multiplicity proc~cmp_elem~2 nurbs_surface%cmp_elem proc~cmp_elem~2->proc~get_multiplicity~2 proc~cmp_elem~3 nurbs_curve%cmp_elem proc~cmp_elem~3->proc~get_multiplicity~3 proc~elevate_degree nurbs_volume%elevate_degree proc~elevate_degree->proc~elevate_degree_a_5_9 proc~elevate_degree->none~set proc~elevate_degree~2 nurbs_surface%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 proc~elevate_degree~2->none~set~2 proc~elevate_degree~3 nurbs_curve%elevate_degree proc~elevate_degree~3->proc~elevate_degree_a_5_9 proc~elevate_degree~3->none~set~3 proc~get_degree nurbs_curve%get_degree proc~get_degree->proc~get_multiplicity~3 proc~get_degree_all nurbs_volume%get_degree_all proc~get_degree_all->proc~get_multiplicity proc~get_degree_all~2 nurbs_surface%get_degree_all proc~get_degree_all~2->proc~get_multiplicity~2 proc~get_degree_dir nurbs_volume%get_degree_dir proc~get_degree_dir->proc~get_multiplicity proc~get_degree_dir~2 nurbs_surface%get_degree_dir proc~get_degree_dir~2->proc~get_multiplicity~2 proc~set1 nurbs_volume%set1 proc~set1->proc~get_nc none~get_degree nurbs_volume%get_degree proc~set1->none~get_degree proc~set1~2 nurbs_surface%set1 proc~set1~2->proc~get_nc~2 none~get_degree~2 nurbs_surface%get_degree proc~set1~2->none~get_degree~2 proc~set2 nurbs_volume%set2 proc~set2->proc~get_nc proc~set2~2 nurbs_surface%set2 proc~set2~2->proc~get_nc~2 program~example1_curve example1_curve program~example1_curve->proc~insert_knots~3 program~example1_curve->proc~remove_knots~3 program~example1_curve->proc~elevate_degree~3 program~example1_curve->proc~get_degree program~example1_curve->none~set~3 program~example3_surface example3_surface program~example3_surface->proc~insert_knots~2 program~example3_surface->proc~remove_knots~2 program~example3_surface->proc~elevate_degree~2 program~example3_surface->none~get_degree~2 program~example3_surface->none~set~2 program~example3_volume example3_volume program~example3_volume->proc~insert_knots program~example3_volume->proc~remove_knots program~example3_volume->proc~elevate_degree program~example3_volume->none~get_degree program~example3_volume->none~set none~get_degree->proc~get_degree_all none~get_degree->proc~get_degree_dir none~get_degree~2->proc~get_degree_all~2 none~get_degree~2->proc~get_degree_dir~2 none~set->proc~set1 none~set->proc~set2 proc~set3 nurbs_volume%set3 none~set->proc~set3 none~set~2->proc~set1~2 none~set~2->proc~set2~2 proc~set3~2 nurbs_surface%set3 none~set~2->proc~set3~2 proc~set1~3 nurbs_curve%set1 proc~set1~3->proc~get_degree proc~set3~3 nurbs_curve%set3 proc~set3~3->proc~get_degree none~set~3->proc~set1~3 none~set~3->proc~set3~3 proc~modify_wc nurbs_volume%modify_Wc proc~modify_wc->none~set proc~modify_wc~2 nurbs_surface%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc nurbs_volume%modify_Xc proc~modify_xc->none~set proc~modify_xc~2 nurbs_surface%modify_Xc proc~modify_xc~2->none~set~2 proc~set3->none~get_degree proc~set3~2->none~get_degree~2 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set~2 program~example_morph example_morph program~example_morph->none~set program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set~2 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set proc~modify_wc~3 nurbs_curve%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc~3 nurbs_curve%modify_Xc proc~modify_xc~3->none~set~3 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/compute_multiplicity2.html"},{"title":"factln – ForCAD","text":"private pure function factln(n) result(f) Arguments Type Intent Optional Attributes Name integer, intent(in) :: n Return Value real(kind=rk) Called by proc~~factln~~CalledByGraph proc~factln factln proc~bincoeff bincoeff proc~bincoeff->proc~factln proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree_a_5_9->proc~bincoeff proc~elevate_degree nurbs_volume%elevate_degree proc~elevate_degree->proc~elevate_degree_a_5_9 proc~elevate_degree~2 nurbs_surface%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 proc~elevate_degree~3 nurbs_curve%elevate_degree proc~elevate_degree~3->proc~elevate_degree_a_5_9 program~example1_curve example1_curve program~example1_curve->proc~elevate_degree~3 program~example3_surface example3_surface program~example3_surface->proc~elevate_degree~2 program~example3_volume example3_volume program~example3_volume->proc~elevate_degree Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/factln.html"},{"title":"isinf – ForCAD","text":"private pure elemental function isinf(x) result(output) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: x Return Value logical Called by proc~~isinf~~CalledByGraph proc~isinf isinf proc~basis_bspline_der basis_bspline_der proc~basis_bspline_der->proc~isinf proc~derivative nurbs_volume%derivative proc~derivative->proc~basis_bspline_der proc~derivative~2 nurbs_surface%derivative proc~derivative~2->proc~basis_bspline_der proc~derivative~3 nurbs_curve%derivative proc~derivative~3->proc~basis_bspline_der Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/isinf.html"},{"title":"isnan – ForCAD","text":"private pure elemental function isnan(x) result(output) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: x Return Value logical","tags":"","loc":"proc/isnan.html"},{"title":"repelem – ForCAD","text":"private pure function repelem(a, b) result(c) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: a (:) integer, intent(in), contiguous :: b (:) Return Value real(kind=rk), (sum(b)) Called by proc~~repelem~~CalledByGraph proc~repelem repelem proc~compute_knot_vector compute_knot_vector proc~compute_knot_vector->proc~repelem proc~set2 nurbs_volume%set2 proc~set2->proc~compute_knot_vector proc~set2~2 nurbs_surface%set2 proc~set2~2->proc~compute_knot_vector proc~set2~3 nurbs_curve%set2 proc~set2~3->proc~compute_knot_vector none~set nurbs_volume%set none~set->proc~set2 none~set~2 nurbs_surface%set none~set~2->proc~set2~2 none~set~3 nurbs_curve%set none~set~3->proc~set2~3 proc~elevate_degree nurbs_volume%elevate_degree proc~elevate_degree->none~set proc~elevate_degree~2 nurbs_surface%elevate_degree proc~elevate_degree~2->none~set~2 proc~elevate_degree~3 nurbs_curve%elevate_degree proc~elevate_degree~3->none~set~3 proc~insert_knots nurbs_volume%insert_knots proc~insert_knots->none~set proc~insert_knots~2 nurbs_surface%insert_knots proc~insert_knots~2->none~set~2 proc~insert_knots~3 nurbs_curve%insert_knots proc~insert_knots~3->none~set~3 proc~modify_wc nurbs_volume%modify_Wc proc~modify_wc->none~set proc~modify_wc~2 nurbs_surface%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_wc~3 nurbs_curve%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc nurbs_volume%modify_Xc proc~modify_xc->none~set proc~modify_xc~2 nurbs_surface%modify_Xc proc~modify_xc~2->none~set~2 proc~modify_xc~3 nurbs_curve%modify_Xc proc~modify_xc~3->none~set~3 proc~remove_knots nurbs_volume%remove_knots proc~remove_knots->none~set proc~remove_knots~2 nurbs_surface%remove_knots proc~remove_knots~2->none~set~2 proc~remove_knots~3 nurbs_curve%remove_knots proc~remove_knots~3->none~set~3 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~3 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set~2 program~example1_curve example1_curve program~example1_curve->none~set~3 program~example1_curve->proc~elevate_degree~3 program~example1_curve->proc~insert_knots~3 program~example1_curve->proc~remove_knots~3 program~example3_surface example3_surface program~example3_surface->none~set~2 program~example3_surface->proc~elevate_degree~2 program~example3_surface->proc~insert_knots~2 program~example3_surface->proc~remove_knots~2 program~example3_volume example3_volume program~example3_volume->none~set program~example3_volume->proc~elevate_degree program~example3_volume->proc~insert_knots program~example3_volume->proc~remove_knots program~example_morph example_morph program~example_morph->none~set program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~3 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set~2 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set program~shape_circle shape_circle program~shape_circle->proc~set_circle program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code pure function repelem ( a , b ) result ( c ) real ( rk ), intent ( in ), contiguous :: a (:) integer , intent ( in ), contiguous :: b (:) real ( rk ) :: c ( sum ( b )) integer :: i , l , n l = 0 do i = 1 , size ( a ) n = b ( i ) c ( l + 1 : l + n ) = a ( i ) l = l + n end do end function repelem","tags":"","loc":"proc/repelem.html"},{"title":"unique_integer – ForCAD","text":"private pure function unique_integer(vec) result(output) Arguments Type Intent Optional Attributes Name integer, intent(in), dimension(:), contiguous :: vec Return Value integer, dimension(:), allocatable Called by proc~~unique_integer~~CalledByGraph proc~unique_integer unique_integer interface~unique unique interface~unique->proc~unique_integer proc~cmp_elem nurbs_volume%cmp_elem proc~cmp_elem->interface~unique proc~cmp_elem~2 nurbs_surface%cmp_elem proc~cmp_elem~2->interface~unique proc~cmp_elem~3 nurbs_curve%cmp_elem proc~cmp_elem~3->interface~unique Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/unique_integer.html"},{"title":"unique_real – ForCAD","text":"private pure function unique_real(vec) result(output) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), dimension(:), contiguous :: vec Return Value real(kind=rk), dimension(:), allocatable Called by proc~~unique_real~~CalledByGraph proc~unique_real unique_real interface~unique unique interface~unique->proc~unique_real proc~cmp_elem nurbs_volume%cmp_elem proc~cmp_elem->interface~unique proc~cmp_elem~2 nurbs_surface%cmp_elem proc~cmp_elem~2->interface~unique proc~cmp_elem~3 nurbs_curve%cmp_elem proc~cmp_elem~3->interface~unique Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/unique_real.html"},{"title":"elevate_degree_A_5_9 – ForCAD","text":"public pure subroutine elevate_degree_A_5_9(t, knot, degree, Xcw, nc_new, knot_new, Xcw_new) Arguments Type Intent Optional Attributes Name integer, intent(in) :: t real(kind=rk), intent(in), contiguous :: knot (:) integer, intent(in) :: degree real(kind=rk), intent(in), contiguous :: Xcw (:,:) integer, intent(out) :: nc_new real(kind=rk), intent(out), allocatable :: knot_new (:) real(kind=rk), intent(out), allocatable :: Xcw_new (:,:) Calls proc~~elevate_degree_a_5_9~~CallsGraph proc~elevate_degree_a_5_9 elevate_degree_A_5_9 interface~compute_multiplicity compute_multiplicity proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~bincoeff bincoeff proc~elevate_degree_a_5_9->proc~bincoeff proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~factln factln proc~bincoeff->proc~factln Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~elevate_degree_a_5_9~~CalledByGraph proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree nurbs_volume%elevate_degree proc~elevate_degree->proc~elevate_degree_a_5_9 proc~elevate_degree~2 nurbs_surface%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 proc~elevate_degree~3 nurbs_curve%elevate_degree proc~elevate_degree~3->proc~elevate_degree_a_5_9 program~example1_curve example1_curve program~example1_curve->proc~elevate_degree~3 program~example3_surface example3_surface program~example3_surface->proc~elevate_degree~2 program~example3_volume example3_volume program~example3_volume->proc~elevate_degree Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/elevate_degree_a_5_9.html"},{"title":"insert_knot_A_5_1 – ForCAD","text":"public pure subroutine insert_knot_A_5_1(p, UP, Pw, u, k, s, r, nq, UQ, Qw) Arguments Type Intent Optional Attributes Name integer, intent(in) :: p real(kind=rk), intent(in), contiguous :: UP (0:) real(kind=rk), intent(in), contiguous :: Pw (0:,:) real(kind=rk), intent(in) :: u integer, intent(in) :: k integer, intent(in) :: s integer, intent(in) :: r integer, intent(out) :: nq real(kind=rk), intent(out), allocatable :: UQ (:) real(kind=rk), intent(out), allocatable :: Qw (:,:) Called by proc~~insert_knot_a_5_1~~CalledByGraph proc~insert_knot_a_5_1 insert_knot_A_5_1 proc~insert_knots nurbs_volume%insert_knots proc~insert_knots->proc~insert_knot_a_5_1 proc~insert_knots~2 nurbs_surface%insert_knots proc~insert_knots~2->proc~insert_knot_a_5_1 proc~insert_knots~3 nurbs_curve%insert_knots proc~insert_knots~3->proc~insert_knot_a_5_1 program~example1_curve example1_curve program~example1_curve->proc~insert_knots~3 program~example3_surface example3_surface program~example3_surface->proc~insert_knots~2 program~example3_volume example3_volume program~example3_volume->proc~insert_knots Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/insert_knot_a_5_1.html"},{"title":"remove_knots_A_5_8 – ForCAD","text":"public pure subroutine remove_knots_A_5_8(p, knot, Pw, u, r, s, num, t, knot_new, Pw_new) Arguments Type Intent Optional Attributes Name integer, intent(in) :: p real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in), contiguous :: Pw (:,:) real(kind=rk), intent(in) :: u integer, intent(in) :: r integer, intent(in) :: s integer, intent(in) :: num integer, intent(out) :: t real(kind=rk), intent(out), allocatable :: knot_new (:) real(kind=rk), intent(out), allocatable :: Pw_new (:,:) Called by proc~~remove_knots_a_5_8~~CalledByGraph proc~remove_knots_a_5_8 remove_knots_A_5_8 proc~remove_knots nurbs_volume%remove_knots proc~remove_knots->proc~remove_knots_a_5_8 proc~remove_knots~2 nurbs_surface%remove_knots proc~remove_knots~2->proc~remove_knots_a_5_8 proc~remove_knots~3 nurbs_curve%remove_knots proc~remove_knots~3->proc~remove_knots_a_5_8 program~example1_curve example1_curve program~example1_curve->proc~remove_knots~3 program~example3_surface example3_surface program~example3_surface->proc~remove_knots~2 program~example3_volume example3_volume program~example3_volume->proc~remove_knots Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/remove_knots_a_5_8.html"},{"title":"cmp_elemConn_Cn_L – ForCAD","text":"private pure subroutine cmp_elemConn_Cn_L(nnode, p, Xth, vecKnot_mul, elemConn) Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode integer, intent(in) :: p real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: vecKnot_mul (:) integer, intent(out), allocatable :: elemConn (:,:) Called by proc~~cmp_elemconn_cn_l~~CalledByGraph proc~cmp_elemconn_cn_l cmp_elemConn_Cn_L interface~elemconn_cn elemConn_Cn interface~elemconn_cn->proc~cmp_elemconn_cn_l proc~cmp_elem nurbs_volume%cmp_elem proc~cmp_elem->interface~elemconn_cn proc~cmp_elem~2 nurbs_surface%cmp_elem proc~cmp_elem~2->interface~elemconn_cn proc~cmp_elem~3 nurbs_curve%cmp_elem proc~cmp_elem~3->interface~elemconn_cn Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elemconn_cn_l.html"},{"title":"cmp_elemConn_Cn_S – ForCAD","text":"private pure subroutine cmp_elemConn_Cn_S(nnode1, nnode2, p1, p2, Xth1, Xth2, vecKnot_mul1, vecKnot_mul2, elemConn) Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: p1 integer, intent(in) :: p2 real(kind=rk), intent(in), contiguous :: Xth1 (:) real(kind=rk), intent(in), contiguous :: Xth2 (:) integer, intent(in), contiguous :: vecKnot_mul1 (:) integer, intent(in), contiguous :: vecKnot_mul2 (:) integer, intent(out), allocatable :: elemConn (:,:) Called by proc~~cmp_elemconn_cn_s~~CalledByGraph proc~cmp_elemconn_cn_s cmp_elemConn_Cn_S interface~elemconn_cn elemConn_Cn interface~elemconn_cn->proc~cmp_elemconn_cn_s proc~cmp_elem nurbs_volume%cmp_elem proc~cmp_elem->interface~elemconn_cn proc~cmp_elem~2 nurbs_surface%cmp_elem proc~cmp_elem~2->interface~elemconn_cn proc~cmp_elem~3 nurbs_curve%cmp_elem proc~cmp_elem~3->interface~elemconn_cn Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elemconn_cn_s.html"},{"title":"cmp_elemConn_Cn_V – ForCAD","text":"private pure subroutine cmp_elemConn_Cn_V(nnode1, nnode2, nnode3, p1, p2, p3, Xth1, Xth2, Xth3, vecKnot_mul1, vecKnot_mul2, vecKnot_mul3, elemConn) Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: nnode3 integer, intent(in) :: p1 integer, intent(in) :: p2 integer, intent(in) :: p3 real(kind=rk), intent(in), contiguous :: Xth1 (:) real(kind=rk), intent(in), contiguous :: Xth2 (:) real(kind=rk), intent(in), contiguous :: Xth3 (:) integer, intent(in), contiguous :: vecKnot_mul1 (:) integer, intent(in), contiguous :: vecKnot_mul2 (:) integer, intent(in), contiguous :: vecKnot_mul3 (:) integer, intent(out), allocatable :: elemConn (:,:) Called by proc~~cmp_elemconn_cn_v~~CalledByGraph proc~cmp_elemconn_cn_v cmp_elemConn_Cn_V interface~elemconn_cn elemConn_Cn interface~elemconn_cn->proc~cmp_elemconn_cn_v proc~cmp_elem nurbs_volume%cmp_elem proc~cmp_elem->interface~elemconn_cn proc~cmp_elem~2 nurbs_surface%cmp_elem proc~cmp_elem~2->interface~elemconn_cn proc~cmp_elem~3 nurbs_curve%cmp_elem proc~cmp_elem~3->interface~elemconn_cn Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elemconn_cn_v.html"},{"title":"ndgrid2 – ForCAD","text":"private pure subroutine ndgrid2(X_dir1, X_dir2, Xt) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: X_dir1 (:) real(kind=rk), intent(in), contiguous :: X_dir2 (:) real(kind=rk), intent(out), allocatable :: Xt (:,:) Called by proc~~ndgrid2~~CalledByGraph proc~ndgrid2 ndgrid2 interface~ndgrid ndgrid interface~ndgrid->proc~ndgrid2 proc~basis nurbs_volume%basis proc~basis->interface~ndgrid proc~basis~2 nurbs_surface%basis proc~basis~2->interface~ndgrid proc~create nurbs_volume%create proc~create->interface~ndgrid proc~create~2 nurbs_surface%create proc~create~2->interface~ndgrid proc~derivative nurbs_volume%derivative proc~derivative->interface~ndgrid proc~derivative~2 nurbs_surface%derivative proc~derivative~2->interface~ndgrid program~example3_surface example3_surface program~example3_surface->proc~create~2 program~example3_volume example3_volume program~example3_volume->proc~create program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~create~2 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~create program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~create program~shape_tetragon shape_tetragon program~shape_tetragon->proc~create~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/ndgrid2.html"},{"title":"ndgrid3 – ForCAD","text":"private pure subroutine ndgrid3(X_dir1, X_dir2, X_dir3, Xt) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: X_dir1 (:) real(kind=rk), intent(in), contiguous :: X_dir2 (:) real(kind=rk), intent(in), contiguous :: X_dir3 (:) real(kind=rk), intent(out), allocatable :: Xt (:,:) Called by proc~~ndgrid3~~CalledByGraph proc~ndgrid3 ndgrid3 interface~ndgrid ndgrid interface~ndgrid->proc~ndgrid3 proc~basis nurbs_volume%basis proc~basis->interface~ndgrid proc~basis~2 nurbs_surface%basis proc~basis~2->interface~ndgrid proc~create nurbs_volume%create proc~create->interface~ndgrid proc~create~2 nurbs_surface%create proc~create~2->interface~ndgrid proc~derivative nurbs_volume%derivative proc~derivative->interface~ndgrid proc~derivative~2 nurbs_surface%derivative proc~derivative~2->interface~ndgrid program~example3_surface example3_surface program~example3_surface->proc~create~2 program~example3_volume example3_volume program~example3_volume->proc~create program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~create~2 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~create program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~create program~shape_tetragon shape_tetragon program~shape_tetragon->proc~create~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/ndgrid3.html"},{"title":"compute_multiplicity – ForCAD","text":"public interface compute_multiplicity Calls interface~~compute_multiplicity~~CallsGraph interface~compute_multiplicity compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by interface~~compute_multiplicity~~CalledByGraph interface~compute_multiplicity compute_multiplicity proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~get_continuity nurbs_volume%get_continuity proc~get_continuity->interface~compute_multiplicity proc~get_continuity~2 nurbs_surface%get_continuity proc~get_continuity~2->interface~compute_multiplicity proc~get_continuity~3 nurbs_curve%get_continuity proc~get_continuity~3->interface~compute_multiplicity proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_multiplicity->interface~compute_multiplicity proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~get_nc nurbs_volume%get_nc proc~get_nc->interface~compute_multiplicity proc~get_nc~2 nurbs_surface%get_nc proc~get_nc~2->interface~compute_multiplicity proc~get_nc~3 nurbs_curve%get_nc proc~get_nc~3->interface~compute_multiplicity proc~insert_knots nurbs_volume%insert_knots proc~insert_knots->interface~compute_multiplicity none~set nurbs_volume%set proc~insert_knots->none~set proc~insert_knots~2 nurbs_surface%insert_knots proc~insert_knots~2->interface~compute_multiplicity none~set~2 nurbs_surface%set proc~insert_knots~2->none~set~2 proc~insert_knots~3 nurbs_curve%insert_knots proc~insert_knots~3->interface~compute_multiplicity none~set~3 nurbs_curve%set proc~insert_knots~3->none~set~3 proc~remove_knots nurbs_volume%remove_knots proc~remove_knots->interface~compute_multiplicity proc~remove_knots->none~set proc~remove_knots~2 nurbs_surface%remove_knots proc~remove_knots~2->interface~compute_multiplicity proc~remove_knots~2->none~set~2 proc~remove_knots~3 nurbs_curve%remove_knots proc~remove_knots~3->interface~compute_multiplicity proc~remove_knots~3->none~set~3 proc~cmp_elem nurbs_volume%cmp_elem proc~cmp_elem->proc~get_multiplicity proc~cmp_elem~2 nurbs_surface%cmp_elem proc~cmp_elem~2->proc~get_multiplicity~2 proc~cmp_elem~3 nurbs_curve%cmp_elem proc~cmp_elem~3->proc~get_multiplicity~3 proc~elevate_degree nurbs_volume%elevate_degree proc~elevate_degree->proc~elevate_degree_a_5_9 proc~elevate_degree->none~set proc~elevate_degree~2 nurbs_surface%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 proc~elevate_degree~2->none~set~2 proc~elevate_degree~3 nurbs_curve%elevate_degree proc~elevate_degree~3->proc~elevate_degree_a_5_9 proc~elevate_degree~3->none~set~3 proc~get_degree nurbs_curve%get_degree proc~get_degree->proc~get_multiplicity~3 proc~get_degree_all nurbs_volume%get_degree_all proc~get_degree_all->proc~get_multiplicity proc~get_degree_all~2 nurbs_surface%get_degree_all proc~get_degree_all~2->proc~get_multiplicity~2 proc~get_degree_dir nurbs_volume%get_degree_dir proc~get_degree_dir->proc~get_multiplicity proc~get_degree_dir~2 nurbs_surface%get_degree_dir proc~get_degree_dir~2->proc~get_multiplicity~2 proc~set1 nurbs_volume%set1 proc~set1->proc~get_nc none~get_degree nurbs_volume%get_degree proc~set1->none~get_degree proc~set1~2 nurbs_surface%set1 proc~set1~2->proc~get_nc~2 none~get_degree~2 nurbs_surface%get_degree proc~set1~2->none~get_degree~2 proc~set2 nurbs_volume%set2 proc~set2->proc~get_nc proc~set2~2 nurbs_surface%set2 proc~set2~2->proc~get_nc~2 program~example1_curve example1_curve program~example1_curve->proc~insert_knots~3 program~example1_curve->proc~remove_knots~3 program~example1_curve->proc~elevate_degree~3 program~example1_curve->proc~get_degree program~example1_curve->none~set~3 program~example3_surface example3_surface program~example3_surface->proc~insert_knots~2 program~example3_surface->proc~remove_knots~2 program~example3_surface->proc~elevate_degree~2 program~example3_surface->none~get_degree~2 program~example3_surface->none~set~2 program~example3_volume example3_volume program~example3_volume->proc~insert_knots program~example3_volume->proc~remove_knots program~example3_volume->proc~elevate_degree program~example3_volume->none~get_degree program~example3_volume->none~set none~get_degree->proc~get_degree_all none~get_degree->proc~get_degree_dir none~get_degree~2->proc~get_degree_all~2 none~get_degree~2->proc~get_degree_dir~2 none~set->proc~set1 none~set->proc~set2 proc~set3 nurbs_volume%set3 none~set->proc~set3 none~set~2->proc~set1~2 none~set~2->proc~set2~2 proc~set3~2 nurbs_surface%set3 none~set~2->proc~set3~2 proc~set1~3 nurbs_curve%set1 proc~set1~3->proc~get_degree proc~set3~3 nurbs_curve%set3 proc~set3~3->proc~get_degree none~set~3->proc~set1~3 none~set~3->proc~set3~3 proc~modify_wc nurbs_volume%modify_Wc proc~modify_wc->none~set proc~modify_wc~2 nurbs_surface%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc nurbs_volume%modify_Xc proc~modify_xc->none~set proc~modify_xc~2 nurbs_surface%modify_Xc proc~modify_xc~2->none~set~2 proc~set3->none~get_degree proc~set3~2->none~get_degree~2 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set~2 program~example_morph example_morph program~example_morph->none~set program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set~2 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set proc~modify_wc~3 nurbs_curve%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc~3 nurbs_curve%modify_Xc proc~modify_xc~3->none~set~3 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Module Procedures private pure function compute_multiplicity1 (knot) result(multiplicity) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: knot (:) Return Value integer, allocatable, (:) private pure function compute_multiplicity2 (knot, Xth) result(multiplicity) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in) :: Xth Return Value integer","tags":"","loc":"interface/compute_multiplicity.html"},{"title":"elemConn_C0 – ForCAD","text":"public interface elemConn_C0 Calls interface~~elemconn_c0~~CallsGraph interface~elemconn_c0 elemConn_C0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by interface~~elemconn_c0~~CalledByGraph interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis nurbs_volume%cmp_elem_Xc_vis proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elem_xc_vis~2 nurbs_surface%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elem_xc_vis~3 nurbs_curve%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elem_xg_vis nurbs_volume%cmp_elem_Xg_vis proc~cmp_elem_xg_vis->interface~elemconn_c0 proc~cmp_elem_xg_vis~2 nurbs_surface%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~cmp_elem_xg_vis~3 nurbs_curve%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~export_xc nurbs_volume%export_Xc proc~export_xc->proc~cmp_elem_xc_vis proc~export_xc~2 nurbs_surface%export_Xc proc~export_xc~2->proc~cmp_elem_xc_vis~2 proc~export_xc~3 nurbs_curve%export_Xc proc~export_xc~3->proc~cmp_elem_xc_vis~3 proc~export_xg nurbs_volume%export_Xg proc~export_xg->proc~cmp_elem_xg_vis proc~export_xg~2 nurbs_surface%export_Xg proc~export_xg~2->proc~cmp_elem_xg_vis~2 proc~export_xg~3 nurbs_curve%export_Xg proc~export_xg~3->proc~cmp_elem_xg_vis~3 program~example1_curve example1_curve program~example1_curve->proc~export_xc~3 program~example1_curve->proc~export_xg~3 program~example3_surface example3_surface program~example3_surface->proc~export_xc~2 program~example3_surface->proc~export_xg~2 program~example3_volume example3_volume program~example3_volume->proc~export_xc program~example3_volume->proc~export_xg program~example_morph example_morph program~example_morph->proc~export_xc program~example_morph->proc~export_xg program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~export_xc~3 program~example_nurbs_curve->proc~export_xg~3 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~export_xc~2 program~example_nurbs_surface->proc~export_xg~2 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~export_xc program~example_nurbs_volume->proc~export_xg program~shape_circle shape_circle program~shape_circle->proc~export_xc~3 program~shape_circle->proc~export_xg~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~export_xc program~shape_hexahedron->proc~export_xg program~shape_tetragon shape_tetragon program~shape_tetragon->proc~export_xc~2 program~shape_tetragon->proc~export_xg~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Module Procedures private pure function cmp_elemConn_C0_L (nnode, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode integer, intent(in) :: p Return Value integer, allocatable, (:,:) private pure function cmp_elemConn_C0_S (nnode1, nnode2, p1, p2) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: p1 integer, intent(in) :: p2 Return Value integer, allocatable, (:,:) private pure function cmp_elemConn_C0_V (nnode1, nnode2, nnode3, p1, p2, p3) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: nnode3 integer, intent(in) :: p1 integer, intent(in) :: p2 integer, intent(in) :: p3 Return Value integer, allocatable, (:,:)","tags":"","loc":"interface/elemconn_c0.html"},{"title":"elemConn_Cn – ForCAD","text":"public interface elemConn_Cn Calls interface~~elemconn_cn~~CallsGraph interface~elemconn_cn elemConn_Cn proc~cmp_elemconn_cn_l cmp_elemConn_Cn_L interface~elemconn_cn->proc~cmp_elemconn_cn_l proc~cmp_elemconn_cn_s cmp_elemConn_Cn_S interface~elemconn_cn->proc~cmp_elemconn_cn_s proc~cmp_elemconn_cn_v cmp_elemConn_Cn_V interface~elemconn_cn->proc~cmp_elemconn_cn_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by interface~~elemconn_cn~~CalledByGraph interface~elemconn_cn elemConn_Cn proc~cmp_elem nurbs_volume%cmp_elem proc~cmp_elem->interface~elemconn_cn proc~cmp_elem~2 nurbs_surface%cmp_elem proc~cmp_elem~2->interface~elemconn_cn proc~cmp_elem~3 nurbs_curve%cmp_elem proc~cmp_elem~3->interface~elemconn_cn Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Module Procedures private pure subroutine cmp_elemConn_Cn_L (nnode, p, Xth, vecKnot_mul, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode integer, intent(in) :: p real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: vecKnot_mul (:) integer, intent(out), allocatable :: elemConn (:,:) private pure subroutine cmp_elemConn_Cn_S (nnode1, nnode2, p1, p2, Xth1, Xth2, vecKnot_mul1, vecKnot_mul2, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: p1 integer, intent(in) :: p2 real(kind=rk), intent(in), contiguous :: Xth1 (:) real(kind=rk), intent(in), contiguous :: Xth2 (:) integer, intent(in), contiguous :: vecKnot_mul1 (:) integer, intent(in), contiguous :: vecKnot_mul2 (:) integer, intent(out), allocatable :: elemConn (:,:) private pure subroutine cmp_elemConn_Cn_V (nnode1, nnode2, nnode3, p1, p2, p3, Xth1, Xth2, Xth3, vecKnot_mul1, vecKnot_mul2, vecKnot_mul3, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: nnode3 integer, intent(in) :: p1 integer, intent(in) :: p2 integer, intent(in) :: p3 real(kind=rk), intent(in), contiguous :: Xth1 (:) real(kind=rk), intent(in), contiguous :: Xth2 (:) real(kind=rk), intent(in), contiguous :: Xth3 (:) integer, intent(in), contiguous :: vecKnot_mul1 (:) integer, intent(in), contiguous :: vecKnot_mul2 (:) integer, intent(in), contiguous :: vecKnot_mul3 (:) integer, intent(out), allocatable :: elemConn (:,:)","tags":"","loc":"interface/elemconn_cn.html"},{"title":"ndgrid – ForCAD","text":"public interface ndgrid Calls interface~~ndgrid~~CallsGraph interface~ndgrid ndgrid proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by interface~~ndgrid~~CalledByGraph interface~ndgrid ndgrid proc~basis nurbs_volume%basis proc~basis->interface~ndgrid proc~basis~2 nurbs_surface%basis proc~basis~2->interface~ndgrid proc~create nurbs_volume%create proc~create->interface~ndgrid proc~create~2 nurbs_surface%create proc~create~2->interface~ndgrid proc~derivative nurbs_volume%derivative proc~derivative->interface~ndgrid proc~derivative~2 nurbs_surface%derivative proc~derivative~2->interface~ndgrid program~example3_surface example3_surface program~example3_surface->proc~create~2 program~example3_volume example3_volume program~example3_volume->proc~create program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~create~2 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~create program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~create program~shape_tetragon shape_tetragon program~shape_tetragon->proc~create~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Module Procedures private pure subroutine ndgrid2 (X_dir1, X_dir2, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: X_dir1 (:) real(kind=rk), intent(in), contiguous :: X_dir2 (:) real(kind=rk), intent(out), allocatable :: Xt (:,:) private pure subroutine ndgrid3 (X_dir1, X_dir2, X_dir3, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: X_dir1 (:) real(kind=rk), intent(in), contiguous :: X_dir2 (:) real(kind=rk), intent(in), contiguous :: X_dir3 (:) real(kind=rk), intent(out), allocatable :: Xt (:,:)","tags":"","loc":"interface/ndgrid.html"},{"title":"unique – ForCAD","text":"public interface unique Calls interface~~unique~~CallsGraph interface~unique unique proc~unique_integer unique_integer interface~unique->proc~unique_integer proc~unique_real unique_real interface~unique->proc~unique_real Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by interface~~unique~~CalledByGraph interface~unique unique proc~cmp_elem nurbs_volume%cmp_elem proc~cmp_elem->interface~unique proc~cmp_elem~2 nurbs_surface%cmp_elem proc~cmp_elem~2->interface~unique proc~cmp_elem~3 nurbs_curve%cmp_elem proc~cmp_elem~3->interface~unique Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Module Procedures private pure function unique_integer (vec) result(output) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in), dimension(:), contiguous :: vec Return Value integer, dimension(:), allocatable private pure function unique_real (vec) result(output) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), dimension(:), contiguous :: vec Return Value real(kind=rk), dimension(:), allocatable","tags":"","loc":"interface/unique.html"},{"title":"generate_Xc – ForCAD","text":"function generate_Xc(num_rows, num_cols, peak_height) result(control_points) Arguments Type Intent Optional Attributes Name integer, intent(in) :: num_rows integer, intent(in) :: num_cols real(kind=rk), intent(in) :: peak_height Return Value real(kind=rk), allocatable, (:,:) Called by proc~~generate_xc~2~~CalledByGraph proc~generate_xc~2 generate_Xc program~example3_surface example3_surface program~example3_surface->proc~generate_xc~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/generate_xc~2.html"},{"title":"generate_Xc – ForCAD","text":"function generate_Xc(L) result(control_points) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: L Return Value real(kind=rk), allocatable, (:,:) Called by proc~~generate_xc~3~~CalledByGraph proc~generate_xc~3 generate_Xc program~example3_volume example3_volume program~example3_volume->proc~generate_xc~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/generate_xc~3.html"},{"title":"generate_Xc – ForCAD","text":"function generate_Xc(L) result(control_points) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: L Return Value real(kind=rk), allocatable, (:,:) Called by proc~~generate_xc~4~~CalledByGraph proc~generate_xc~4 generate_Xc program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~generate_xc~4 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/generate_xc~4.html"},{"title":"cmp_elem – ForCAD","text":"private pure function cmp_elem(this) result(elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem~2~~CallsGraph proc~cmp_elem~2 nurbs_surface%cmp_elem interface~elemconn_cn elemConn_Cn proc~cmp_elem~2->interface~elemconn_cn interface~unique unique proc~cmp_elem~2->interface~unique proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~cmp_elem~2->proc~get_multiplicity~2 proc~cmp_elemconn_cn_l cmp_elemConn_Cn_L interface~elemconn_cn->proc~cmp_elemconn_cn_l proc~cmp_elemconn_cn_s cmp_elemConn_Cn_S interface~elemconn_cn->proc~cmp_elemconn_cn_s proc~cmp_elemconn_cn_v cmp_elemConn_Cn_V interface~elemconn_cn->proc~cmp_elemconn_cn_v proc~unique_integer unique_integer interface~unique->proc~unique_integer proc~unique_real unique_real interface~unique->proc~unique_real interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem~2.html"},{"title":"cmp_elem_Xc_vis – ForCAD","text":"private pure function cmp_elem_Xc_vis(this, p) result(elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem_xc_vis~2~~CallsGraph proc~cmp_elem_xc_vis~2 nurbs_surface%cmp_elem_Xc_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~cmp_elem_xc_vis~2~~CalledByGraph proc~cmp_elem_xc_vis~2 nurbs_surface%cmp_elem_Xc_vis proc~export_xc~2 nurbs_surface%export_Xc proc~export_xc~2->proc~cmp_elem_xc_vis~2 program~example3_surface example3_surface program~example3_surface->proc~export_xc~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~export_xc~2 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~export_xc~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem_xc_vis~2.html"},{"title":"cmp_elem_Xg_vis – ForCAD","text":"private pure function cmp_elem_Xg_vis(this, p) result(elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem_xg_vis~2~~CallsGraph proc~cmp_elem_xg_vis~2 nurbs_surface%cmp_elem_Xg_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~cmp_elem_xg_vis~2~~CalledByGraph proc~cmp_elem_xg_vis~2 nurbs_surface%cmp_elem_Xg_vis proc~export_xg~2 nurbs_surface%export_Xg proc~export_xg~2->proc~cmp_elem_xg_vis~2 program~example3_surface example3_surface program~example3_surface->proc~export_xg~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~export_xg~2 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~export_xg~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem_xg_vis~2.html"},{"title":"get_Wc – ForCAD","text":"private pure function get_Wc(this) result(Wc) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_wc~2.html"},{"title":"get_Xc – ForCAD","text":"private pure function get_Xc(this) result(Xc) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:)","tags":"","loc":"proc/get_xc~2.html"},{"title":"get_Xg – ForCAD","text":"private pure function get_Xg(this) result(Xg) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:)","tags":"","loc":"proc/get_xg~2.html"},{"title":"get_Xt – ForCAD","text":"private pure function get_Xt(this, dir) result(Xt) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_xt~2.html"},{"title":"get_continuity – ForCAD","text":"private pure function get_continuity(this, dir) result(c) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) Calls proc~~get_continuity~2~~CallsGraph proc~get_continuity~2 nurbs_surface%get_continuity interface~compute_multiplicity compute_multiplicity proc~get_continuity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_continuity~2.html"},{"title":"get_degree_all – ForCAD","text":"private pure function get_degree_all(this) result(degree) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, (2) Calls proc~~get_degree_all~2~~CallsGraph proc~get_degree_all~2 nurbs_surface%get_degree_all proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~2 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_degree_all~2~~CalledByGraph proc~get_degree_all~2 nurbs_surface%get_degree_all none~get_degree~2 nurbs_surface%get_degree none~get_degree~2->proc~get_degree_all~2 proc~set1~2 nurbs_surface%set1 proc~set1~2->none~get_degree~2 proc~set3~2 nurbs_surface%set3 proc~set3~2->none~get_degree~2 program~example3_surface example3_surface program~example3_surface->none~get_degree~2 none~set~2 nurbs_surface%set program~example3_surface->none~set~2 proc~elevate_degree~2 nurbs_surface%elevate_degree program~example3_surface->proc~elevate_degree~2 proc~insert_knots~2 nurbs_surface%insert_knots program~example3_surface->proc~insert_knots~2 proc~remove_knots~2 nurbs_surface%remove_knots program~example3_surface->proc~remove_knots~2 none~set~2->proc~set1~2 none~set~2->proc~set3~2 proc~elevate_degree~2->none~set~2 proc~insert_knots~2->none~set~2 proc~modify_wc~2 nurbs_surface%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc~2 nurbs_surface%modify_Xc proc~modify_xc~2->none~set~2 proc~remove_knots~2->none~set~2 proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set~2 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_degree_all~2.html"},{"title":"get_degree_dir – ForCAD","text":"private pure function get_degree_dir(this, dir) result(degree) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer Calls proc~~get_degree_dir~2~~CallsGraph proc~get_degree_dir~2 nurbs_surface%get_degree_dir proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~get_degree_dir~2->proc~get_multiplicity~2 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_degree_dir~2~~CalledByGraph proc~get_degree_dir~2 nurbs_surface%get_degree_dir none~get_degree~2 nurbs_surface%get_degree none~get_degree~2->proc~get_degree_dir~2 proc~set1~2 nurbs_surface%set1 proc~set1~2->none~get_degree~2 proc~set3~2 nurbs_surface%set3 proc~set3~2->none~get_degree~2 program~example3_surface example3_surface program~example3_surface->none~get_degree~2 none~set~2 nurbs_surface%set program~example3_surface->none~set~2 proc~elevate_degree~2 nurbs_surface%elevate_degree program~example3_surface->proc~elevate_degree~2 proc~insert_knots~2 nurbs_surface%insert_knots program~example3_surface->proc~insert_knots~2 proc~remove_knots~2 nurbs_surface%remove_knots program~example3_surface->proc~remove_knots~2 none~set~2->proc~set1~2 none~set~2->proc~set3~2 proc~elevate_degree~2->none~set~2 proc~insert_knots~2->none~set~2 proc~modify_wc~2 nurbs_surface%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc~2 nurbs_surface%modify_Xc proc~modify_xc~2->none~set~2 proc~remove_knots~2->none~set~2 proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set~2 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_degree_dir~2.html"},{"title":"get_elem – ForCAD","text":"private pure function get_elem(this) result(elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem~2.html"},{"title":"get_elem_Xc_vis – ForCAD","text":"private pure function get_elem_Xc_vis(this) result(elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem_xc_vis~2.html"},{"title":"get_elem_Xg_vis – ForCAD","text":"private pure function get_elem_Xg_vis(this) result(elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem_xg_vis~2.html"},{"title":"get_knot_all – ForCAD","text":"private pure function get_knot_all(this, dir) result(knot) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) Called by proc~~get_knot_all~2~~CalledByGraph proc~get_knot_all~2 nurbs_surface%get_knot_all none~get_knot~2 nurbs_surface%get_knot none~get_knot~2->proc~get_knot_all~2 program~example3_surface example3_surface program~example3_surface->none~get_knot~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_knot_all~2.html"},{"title":"get_knoti – ForCAD","text":"private pure function get_knoti(this, dir, i) result(knot) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir integer, intent(in) :: i Return Value real(kind=rk) Called by proc~~get_knoti~2~~CalledByGraph proc~get_knoti~2 nurbs_surface%get_knoti none~get_knot~2 nurbs_surface%get_knot none~get_knot~2->proc~get_knoti~2 program~example3_surface example3_surface program~example3_surface->none~get_knot~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_knoti~2.html"},{"title":"get_multiplicity – ForCAD","text":"private pure function get_multiplicity(this, dir) result(m) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) Calls proc~~get_multiplicity~2~~CallsGraph proc~get_multiplicity~2 nurbs_surface%get_multiplicity interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_multiplicity~2~~CalledByGraph proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~cmp_elem~2 nurbs_surface%cmp_elem proc~cmp_elem~2->proc~get_multiplicity~2 proc~get_degree_all~2 nurbs_surface%get_degree_all proc~get_degree_all~2->proc~get_multiplicity~2 proc~get_degree_dir~2 nurbs_surface%get_degree_dir proc~get_degree_dir~2->proc~get_multiplicity~2 none~get_degree~2 nurbs_surface%get_degree none~get_degree~2->proc~get_degree_all~2 none~get_degree~2->proc~get_degree_dir~2 proc~set1~2 nurbs_surface%set1 proc~set1~2->none~get_degree~2 proc~set3~2 nurbs_surface%set3 proc~set3~2->none~get_degree~2 program~example3_surface example3_surface program~example3_surface->none~get_degree~2 none~set~2 nurbs_surface%set program~example3_surface->none~set~2 proc~elevate_degree~2 nurbs_surface%elevate_degree program~example3_surface->proc~elevate_degree~2 proc~insert_knots~2 nurbs_surface%insert_knots program~example3_surface->proc~insert_knots~2 proc~remove_knots~2 nurbs_surface%remove_knots program~example3_surface->proc~remove_knots~2 none~set~2->proc~set1~2 none~set~2->proc~set3~2 proc~elevate_degree~2->none~set~2 proc~insert_knots~2->none~set~2 proc~modify_wc~2 nurbs_surface%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc~2 nurbs_surface%modify_Xc proc~modify_xc~2->none~set~2 proc~remove_knots~2->none~set~2 proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set~2 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_multiplicity~2.html"},{"title":"get_nc – ForCAD","text":"private pure function get_nc(this, dir) result(nc) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer Calls proc~~get_nc~2~~CallsGraph proc~get_nc~2 nurbs_surface%get_nc interface~compute_multiplicity compute_multiplicity proc~get_nc~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_nc~2~~CalledByGraph proc~get_nc~2 nurbs_surface%get_nc proc~set1~2 nurbs_surface%set1 proc~set1~2->proc~get_nc~2 proc~set2~2 nurbs_surface%set2 proc~set2~2->proc~get_nc~2 none~set~2 nurbs_surface%set none~set~2->proc~set1~2 none~set~2->proc~set2~2 proc~elevate_degree~2 nurbs_surface%elevate_degree proc~elevate_degree~2->none~set~2 proc~insert_knots~2 nurbs_surface%insert_knots proc~insert_knots~2->none~set~2 proc~modify_wc~2 nurbs_surface%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc~2 nurbs_surface%modify_Xc proc~modify_xc~2->none~set~2 proc~remove_knots~2 nurbs_surface%remove_knots proc~remove_knots~2->none~set~2 proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set~2 program~example3_surface example3_surface program~example3_surface->none~set~2 program~example3_surface->proc~elevate_degree~2 program~example3_surface->proc~insert_knots~2 program~example3_surface->proc~remove_knots~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set~2 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_nc~2.html"},{"title":"get_ng – ForCAD","text":"private pure function get_ng(this) result(ng) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, (2)","tags":"","loc":"proc/get_ng~2.html"},{"title":"is_rational – ForCAD","text":"private pure function is_rational(this) result(r) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value logical Called by proc~~is_rational~2~~CalledByGraph proc~is_rational~2 nurbs_surface%is_rational proc~basis~2 nurbs_surface%basis proc~basis~2->proc~is_rational~2 proc~create~2 nurbs_surface%create proc~create~2->proc~is_rational~2 proc~derivative~2 nurbs_surface%derivative proc~derivative~2->proc~is_rational~2 proc~elevate_degree~2 nurbs_surface%elevate_degree proc~elevate_degree~2->proc~is_rational~2 proc~insert_knots~2 nurbs_surface%insert_knots proc~insert_knots~2->proc~is_rational~2 proc~remove_knots~2 nurbs_surface%remove_knots proc~remove_knots~2->proc~is_rational~2 program~example3_surface example3_surface program~example3_surface->proc~create~2 program~example3_surface->proc~elevate_degree~2 program~example3_surface->proc~insert_knots~2 program~example3_surface->proc~remove_knots~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~create~2 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~create~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/is_rational~2.html"},{"title":"basis – ForCAD","text":"private pure subroutine basis(this, res1, res2, Xt1, Xt2, Tgc) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) Calls proc~~basis~2~~CallsGraph proc~basis~2 nurbs_surface%basis interface~ndgrid ndgrid proc~basis~2->interface~ndgrid proc~basis_bspline basis_bspline proc~basis~2->proc~basis_bspline proc~is_rational~2 nurbs_surface%is_rational proc~basis~2->proc~is_rational~2 proc~kron kron proc~basis~2->proc~kron proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/basis~2.html"},{"title":"create – ForCAD","text":"private pure subroutine create(this, res1, res2, Xt1, Xt2, Xt) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt (:,:) Calls proc~~create~2~~CallsGraph proc~create~2 nurbs_surface%create interface~ndgrid ndgrid proc~create~2->interface~ndgrid proc~basis_bspline basis_bspline proc~create~2->proc~basis_bspline proc~is_rational~2 nurbs_surface%is_rational proc~create~2->proc~is_rational~2 proc~kron kron proc~create~2->proc~kron proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~create~2~~CalledByGraph proc~create~2 nurbs_surface%create program~example3_surface example3_surface program~example3_surface->proc~create~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~create~2 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~create~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/create~2.html"},{"title":"derivative – ForCAD","text":"private pure subroutine derivative(this, res1, res2, Xt1, Xt2, dTgc) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) Calls proc~~derivative~2~~CallsGraph proc~derivative~2 nurbs_surface%derivative interface~ndgrid ndgrid proc~derivative~2->interface~ndgrid proc~basis_bspline_der basis_bspline_der proc~derivative~2->proc~basis_bspline_der proc~is_rational~2 nurbs_surface%is_rational proc~derivative~2->proc~is_rational~2 proc~kron kron proc~derivative~2->proc~kron proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 proc~isinf isinf proc~basis_bspline_der->proc~isinf Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/derivative~2.html"},{"title":"elevate_degree – ForCAD","text":"private pure subroutine elevate_degree(this, dir, t) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir integer, intent(in) :: t Calls proc~~elevate_degree~2~~CallsGraph proc~elevate_degree~2 nurbs_surface%elevate_degree none~set~2 nurbs_surface%set proc~elevate_degree~2->none~set~2 proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree~2->proc~elevate_degree_a_5_9 proc~is_rational~2 nurbs_surface%is_rational proc~elevate_degree~2->proc~is_rational~2 proc~set1~2 nurbs_surface%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_surface%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_surface%set3 none~set~2->proc~set3~2 interface~compute_multiplicity compute_multiplicity proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~bincoeff bincoeff proc~elevate_degree_a_5_9->proc~bincoeff proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~factln factln proc~bincoeff->proc~factln none~get_degree~2 nurbs_surface%get_degree proc~set1~2->none~get_degree~2 proc~get_nc~2 nurbs_surface%get_nc proc~set1~2->proc~get_nc~2 proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set2~2->proc~get_nc~2 proc~set3~2->none~get_degree~2 proc~get_degree_all~2 nurbs_surface%get_degree_all none~get_degree~2->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_surface%get_degree_dir none~get_degree~2->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_nc~2->interface~compute_multiplicity proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~2 proc~get_degree_dir~2->proc~get_multiplicity~2 proc~get_multiplicity~2->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~elevate_degree~2~~CalledByGraph proc~elevate_degree~2 nurbs_surface%elevate_degree program~example3_surface example3_surface program~example3_surface->proc~elevate_degree~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/elevate_degree~2.html"},{"title":"export_Xc – ForCAD","text":"private impure subroutine export_Xc(this, filename) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this character(len=*), intent(in) :: filename Calls proc~~export_xc~2~~CallsGraph proc~export_xc~2 nurbs_surface%export_Xc proc~cmp_elem_xc_vis~2 nurbs_surface%cmp_elem_Xc_vis proc~export_xc~2->proc~cmp_elem_xc_vis~2 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~export_xc~2~~CalledByGraph proc~export_xc~2 nurbs_surface%export_Xc program~example3_surface example3_surface program~example3_surface->proc~export_xc~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~export_xc~2 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~export_xc~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/export_xc~2.html"},{"title":"export_Xg – ForCAD","text":"private impure subroutine export_Xg(this, filename) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this character(len=*), intent(in) :: filename Calls proc~~export_xg~2~~CallsGraph proc~export_xg~2 nurbs_surface%export_Xg proc~cmp_elem_xg_vis~2 nurbs_surface%cmp_elem_Xg_vis proc~export_xg~2->proc~cmp_elem_xg_vis~2 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~export_xg~2~~CalledByGraph proc~export_xg~2 nurbs_surface%export_Xg program~example3_surface example3_surface program~example3_surface->proc~export_xg~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~export_xg~2 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~export_xg~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/export_xg~2.html"},{"title":"finalize – ForCAD","text":"private pure subroutine finalize(this) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this Called by proc~~finalize~2~~CalledByGraph proc~finalize~2 nurbs_surface%finalize program~example3_surface example3_surface program~example3_surface->proc~finalize~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~finalize~2 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~finalize~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/finalize~2.html"},{"title":"insert_knots – ForCAD","text":"private pure subroutine insert_knots(this, dir, Xth, r) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) Calls proc~~insert_knots~2~~CallsGraph proc~insert_knots~2 nurbs_surface%insert_knots interface~compute_multiplicity compute_multiplicity proc~insert_knots~2->interface~compute_multiplicity none~set~2 nurbs_surface%set proc~insert_knots~2->none~set~2 proc~findspan findspan proc~insert_knots~2->proc~findspan proc~insert_knot_a_5_1 insert_knot_A_5_1 proc~insert_knots~2->proc~insert_knot_a_5_1 proc~is_rational~2 nurbs_surface%is_rational proc~insert_knots~2->proc~is_rational~2 proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~set1~2 nurbs_surface%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_surface%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_surface%set3 none~set~2->proc~set3~2 none~get_degree~2 nurbs_surface%get_degree proc~set1~2->none~get_degree~2 proc~get_nc~2 nurbs_surface%get_nc proc~set1~2->proc~get_nc~2 proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set2~2->proc~get_nc~2 proc~set3~2->none~get_degree~2 proc~get_degree_all~2 nurbs_surface%get_degree_all none~get_degree~2->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_surface%get_degree_dir none~get_degree~2->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_nc~2->interface~compute_multiplicity proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~2 proc~get_degree_dir~2->proc~get_multiplicity~2 proc~get_multiplicity~2->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~insert_knots~2~~CalledByGraph proc~insert_knots~2 nurbs_surface%insert_knots program~example3_surface example3_surface program~example3_surface->proc~insert_knots~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/insert_knots~2.html"},{"title":"modify_Wc – ForCAD","text":"private pure subroutine modify_Wc(this, W, num) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num Calls proc~~modify_wc~2~~CallsGraph proc~modify_wc~2 nurbs_surface%modify_Wc none~set~2 nurbs_surface%set proc~modify_wc~2->none~set~2 proc~set1~2 nurbs_surface%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_surface%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_surface%set3 none~set~2->proc~set3~2 none~get_degree~2 nurbs_surface%get_degree proc~set1~2->none~get_degree~2 proc~get_nc~2 nurbs_surface%get_nc proc~set1~2->proc~get_nc~2 proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set2~2->proc~get_nc~2 proc~set3~2->none~get_degree~2 proc~get_degree_all~2 nurbs_surface%get_degree_all none~get_degree~2->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_surface%get_degree_dir none~get_degree~2->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~2 proc~get_degree_dir~2->proc~get_multiplicity~2 proc~get_multiplicity~2->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/modify_wc~2.html"},{"title":"modify_Xc – ForCAD","text":"private pure subroutine modify_Xc(this, X, num, dir) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir Calls proc~~modify_xc~2~~CallsGraph proc~modify_xc~2 nurbs_surface%modify_Xc none~set~2 nurbs_surface%set proc~modify_xc~2->none~set~2 proc~set1~2 nurbs_surface%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_surface%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_surface%set3 none~set~2->proc~set3~2 none~get_degree~2 nurbs_surface%get_degree proc~set1~2->none~get_degree~2 proc~get_nc~2 nurbs_surface%get_nc proc~set1~2->proc~get_nc~2 proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set2~2->proc~get_nc~2 proc~set3~2->none~get_degree~2 proc~get_degree_all~2 nurbs_surface%get_degree_all none~get_degree~2->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_surface%get_degree_dir none~get_degree~2->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~2 proc~get_degree_dir~2->proc~get_multiplicity~2 proc~get_multiplicity~2->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/modify_xc~2.html"},{"title":"remove_knots – ForCAD","text":"private pure subroutine remove_knots(this, dir, Xth, r) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) Calls proc~~remove_knots~2~~CallsGraph proc~remove_knots~2 nurbs_surface%remove_knots interface~compute_multiplicity compute_multiplicity proc~remove_knots~2->interface~compute_multiplicity none~set~2 nurbs_surface%set proc~remove_knots~2->none~set~2 proc~findspan findspan proc~remove_knots~2->proc~findspan proc~is_rational~2 nurbs_surface%is_rational proc~remove_knots~2->proc~is_rational~2 proc~remove_knots_a_5_8 remove_knots_A_5_8 proc~remove_knots~2->proc~remove_knots_a_5_8 proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~set1~2 nurbs_surface%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_surface%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_surface%set3 none~set~2->proc~set3~2 none~get_degree~2 nurbs_surface%get_degree proc~set1~2->none~get_degree~2 proc~get_nc~2 nurbs_surface%get_nc proc~set1~2->proc~get_nc~2 proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set2~2->proc~get_nc~2 proc~set3~2->none~get_degree~2 proc~get_degree_all~2 nurbs_surface%get_degree_all none~get_degree~2->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_surface%get_degree_dir none~get_degree~2->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_nc~2->interface~compute_multiplicity proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~2 proc~get_degree_dir~2->proc~get_multiplicity~2 proc~get_multiplicity~2->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~remove_knots~2~~CalledByGraph proc~remove_knots~2 nurbs_surface%remove_knots program~example3_surface example3_surface program~example3_surface->proc~remove_knots~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/remove_knots~2.html"},{"title":"rotate_Xc – ForCAD","text":"private pure subroutine rotate_Xc(this, alpha, beta, theta) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta Calls proc~~rotate_xc~2~~CallsGraph proc~rotate_xc~2 nurbs_surface%rotate_Xc proc~rotation rotation proc~rotate_xc~2->proc~rotation cosd cosd proc~rotation->cosd sind sind proc~rotation->sind Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~rotate_xc~2~~CalledByGraph proc~rotate_xc~2 nurbs_surface%rotate_Xc program~example3_surface example3_surface program~example3_surface->proc~rotate_xc~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/rotate_xc~2.html"},{"title":"rotate_Xg – ForCAD","text":"private pure subroutine rotate_Xg(this, alpha, beta, theta) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta Calls proc~~rotate_xg~2~~CallsGraph proc~rotate_xg~2 nurbs_surface%rotate_Xg proc~rotation rotation proc~rotate_xg~2->proc~rotation cosd cosd proc~rotation->cosd sind sind proc~rotation->sind Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~rotate_xg~2~~CalledByGraph proc~rotate_xg~2 nurbs_surface%rotate_Xg program~example3_surface example3_surface program~example3_surface->proc~rotate_xg~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/rotate_xg~2.html"},{"title":"set1 – ForCAD","text":"private pure subroutine set1(this, knot1, knot2, Xc, Wc) Set knot vectors, control points and weights for the NURBS surface object. Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot1 (:) real(kind=rk), intent(in), contiguous :: knot2 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set1~2~~CallsGraph proc~set1~2 nurbs_surface%set1 none~get_degree~2 nurbs_surface%get_degree proc~set1~2->none~get_degree~2 proc~get_nc~2 nurbs_surface%get_nc proc~set1~2->proc~get_nc~2 proc~get_degree_all~2 nurbs_surface%get_degree_all none~get_degree~2->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_surface%get_degree_dir none~get_degree~2->proc~get_degree_dir~2 interface~compute_multiplicity compute_multiplicity proc~get_nc~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~2 proc~get_degree_dir~2->proc~get_multiplicity~2 proc~get_multiplicity~2->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set1~2~~CalledByGraph proc~set1~2 nurbs_surface%set1 none~set~2 nurbs_surface%set none~set~2->proc~set1~2 proc~elevate_degree~2 nurbs_surface%elevate_degree proc~elevate_degree~2->none~set~2 proc~insert_knots~2 nurbs_surface%insert_knots proc~insert_knots~2->none~set~2 proc~modify_wc~2 nurbs_surface%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc~2 nurbs_surface%modify_Xc proc~modify_xc~2->none~set~2 proc~remove_knots~2 nurbs_surface%remove_knots proc~remove_knots~2->none~set~2 proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set~2 program~example3_surface example3_surface program~example3_surface->none~set~2 program~example3_surface->proc~elevate_degree~2 program~example3_surface->proc~insert_knots~2 program~example3_surface->proc~remove_knots~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set~2 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set1~2.html"},{"title":"set2 – ForCAD","text":"private pure subroutine set2(this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc) Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir1 (:) real(kind=rk), intent(in), contiguous :: Xth_dir2 (:) integer, intent(in), contiguous :: degree (:) integer, intent(in), contiguous :: continuity1 (:) integer, intent(in), contiguous :: continuity2 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set2~2~~CallsGraph proc~set2~2 nurbs_surface%set2 proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~get_nc~2 nurbs_surface%get_nc proc~set2~2->proc~get_nc~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set2~2~~CalledByGraph proc~set2~2 nurbs_surface%set2 none~set~2 nurbs_surface%set none~set~2->proc~set2~2 proc~elevate_degree~2 nurbs_surface%elevate_degree proc~elevate_degree~2->none~set~2 proc~insert_knots~2 nurbs_surface%insert_knots proc~insert_knots~2->none~set~2 proc~modify_wc~2 nurbs_surface%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc~2 nurbs_surface%modify_Xc proc~modify_xc~2->none~set~2 proc~remove_knots~2 nurbs_surface%remove_knots proc~remove_knots~2->none~set~2 proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set~2 program~example3_surface example3_surface program~example3_surface->none~set~2 program~example3_surface->proc~elevate_degree~2 program~example3_surface->proc~insert_knots~2 program~example3_surface->proc~remove_knots~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set~2 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set2~2.html"},{"title":"set3 – ForCAD","text":"private pure subroutine set3(this, nc, Xc, Wc) Set Bezier or Rational Bezier surface using control points and weights. Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set3~2~~CallsGraph proc~set3~2 nurbs_surface%set3 none~get_degree~2 nurbs_surface%get_degree proc~set3~2->none~get_degree~2 proc~get_degree_all~2 nurbs_surface%get_degree_all none~get_degree~2->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_surface%get_degree_dir none~get_degree~2->proc~get_degree_dir~2 proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~2 proc~get_degree_dir~2->proc~get_multiplicity~2 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set3~2~~CalledByGraph proc~set3~2 nurbs_surface%set3 none~set~2 nurbs_surface%set none~set~2->proc~set3~2 proc~elevate_degree~2 nurbs_surface%elevate_degree proc~elevate_degree~2->none~set~2 proc~insert_knots~2 nurbs_surface%insert_knots proc~insert_knots~2->none~set~2 proc~modify_wc~2 nurbs_surface%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc~2 nurbs_surface%modify_Xc proc~modify_xc~2->none~set~2 proc~remove_knots~2 nurbs_surface%remove_knots proc~remove_knots~2->none~set~2 proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set~2 program~example3_surface example3_surface program~example3_surface->none~set~2 program~example3_surface->proc~elevate_degree~2 program~example3_surface->proc~insert_knots~2 program~example3_surface->proc~remove_knots~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set~2 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set3~2.html"},{"title":"set_elem – ForCAD","text":"private pure subroutine set_elem(this, elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:)","tags":"","loc":"proc/set_elem~2.html"},{"title":"set_elem_Xc_vis – ForCAD","text":"private pure subroutine set_elem_Xc_vis(this, elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:)","tags":"","loc":"proc/set_elem_xc_vis~2.html"},{"title":"set_elem_Xg_vis – ForCAD","text":"private pure subroutine set_elem_Xg_vis(this, elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:)","tags":"","loc":"proc/set_elem_xg_vis~2.html"},{"title":"set_tetragon – ForCAD","text":"private pure subroutine set_tetragon(this, L, nc, Wc) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: L (2) integer, intent(in) :: nc (2) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set_tetragon~~CallsGraph proc~set_tetragon nurbs_surface%set_tetragon none~set~2 nurbs_surface%set proc~set_tetragon->none~set~2 proc~tetragon_xc tetragon_Xc proc~set_tetragon->proc~tetragon_xc proc~set1~2 nurbs_surface%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_surface%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_surface%set3 none~set~2->proc~set3~2 none~get_degree~2 nurbs_surface%get_degree proc~set1~2->none~get_degree~2 proc~get_nc~2 nurbs_surface%get_nc proc~set1~2->proc~get_nc~2 proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set2~2->proc~get_nc~2 proc~set3~2->none~get_degree~2 proc~get_degree_all~2 nurbs_surface%get_degree_all none~get_degree~2->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_surface%get_degree_dir none~get_degree~2->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~2 proc~get_degree_dir~2->proc~get_multiplicity~2 proc~get_multiplicity~2->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set_tetragon~~CalledByGraph proc~set_tetragon nurbs_surface%set_tetragon program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set_tetragon.html"},{"title":"show – ForCAD","text":"private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg Called by proc~~show~2~~CalledByGraph proc~show~2 nurbs_surface%show program~example3_surface example3_surface program~example3_surface->proc~show~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~show~2 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~show~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/show~2.html"},{"title":"translate_Xc – ForCAD","text":"private pure subroutine translate_Xc(this, vec) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) Called by proc~~translate_xc~2~~CalledByGraph proc~translate_xc~2 nurbs_surface%translate_Xc program~example3_surface example3_surface program~example3_surface->proc~translate_xc~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/translate_xc~2.html"},{"title":"translate_Xg – ForCAD","text":"private pure subroutine translate_Xg(this, vec) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) Called by proc~~translate_xg~2~~CalledByGraph proc~translate_xg~2 nurbs_surface%translate_Xg program~example3_surface example3_surface program~example3_surface->proc~translate_xg~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/translate_xg~2.html"},{"title":"cmp_elem – ForCAD","text":"private pure function cmp_elem(this) result(elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem~3~~CallsGraph proc~cmp_elem~3 nurbs_curve%cmp_elem interface~elemconn_cn elemConn_Cn proc~cmp_elem~3->interface~elemconn_cn interface~unique unique proc~cmp_elem~3->interface~unique proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~cmp_elem~3->proc~get_multiplicity~3 proc~cmp_elemconn_cn_l cmp_elemConn_Cn_L interface~elemconn_cn->proc~cmp_elemconn_cn_l proc~cmp_elemconn_cn_s cmp_elemConn_Cn_S interface~elemconn_cn->proc~cmp_elemconn_cn_s proc~cmp_elemconn_cn_v cmp_elemConn_Cn_V interface~elemconn_cn->proc~cmp_elemconn_cn_v proc~unique_integer unique_integer interface~unique->proc~unique_integer proc~unique_real unique_real interface~unique->proc~unique_real interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem~3.html"},{"title":"cmp_elem_Xc_vis – ForCAD","text":"private pure function cmp_elem_Xc_vis(this, p) result(elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in), optional :: p Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem_xc_vis~3~~CallsGraph proc~cmp_elem_xc_vis~3 nurbs_curve%cmp_elem_Xc_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~cmp_elem_xc_vis~3~~CalledByGraph proc~cmp_elem_xc_vis~3 nurbs_curve%cmp_elem_Xc_vis proc~export_xc~3 nurbs_curve%export_Xc proc~export_xc~3->proc~cmp_elem_xc_vis~3 program~example1_curve example1_curve program~example1_curve->proc~export_xc~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~export_xc~3 program~shape_circle shape_circle program~shape_circle->proc~export_xc~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem_xc_vis~3.html"},{"title":"cmp_elem_Xg_vis – ForCAD","text":"private pure function cmp_elem_Xg_vis(this, p) result(elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in), optional :: p Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem_xg_vis~3~~CallsGraph proc~cmp_elem_xg_vis~3 nurbs_curve%cmp_elem_Xg_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~cmp_elem_xg_vis~3~~CalledByGraph proc~cmp_elem_xg_vis~3 nurbs_curve%cmp_elem_Xg_vis proc~export_xg~3 nurbs_curve%export_Xg proc~export_xg~3->proc~cmp_elem_xg_vis~3 program~example1_curve example1_curve program~example1_curve->proc~export_xg~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~export_xg~3 program~shape_circle shape_circle program~shape_circle->proc~export_xg~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem_xg_vis~3.html"},{"title":"get_Wc – ForCAD","text":"private pure function get_Wc(this) result(Wc) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_wc~3.html"},{"title":"get_Xc – ForCAD","text":"private pure function get_Xc(this) result(Xc) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:)","tags":"","loc":"proc/get_xc~3.html"},{"title":"get_Xg – ForCAD","text":"private pure function get_Xg(this) result(Xg) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:)","tags":"","loc":"proc/get_xg~3.html"},{"title":"get_Xt – ForCAD","text":"private pure function get_Xt(this) result(Xt) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_xt~3.html"},{"title":"get_continuity – ForCAD","text":"private pure function get_continuity(this) result(c) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:) Calls proc~~get_continuity~3~~CallsGraph proc~get_continuity~3 nurbs_curve%get_continuity interface~compute_multiplicity compute_multiplicity proc~get_continuity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_continuity~3.html"},{"title":"get_degree – ForCAD","text":"private pure function get_degree(this) result(degree) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer Calls proc~~get_degree~~CallsGraph proc~get_degree nurbs_curve%get_degree proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~3 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_degree~~CalledByGraph proc~get_degree nurbs_curve%get_degree proc~set1~3 nurbs_curve%set1 proc~set1~3->proc~get_degree proc~set3~3 nurbs_curve%set3 proc~set3~3->proc~get_degree program~example1_curve example1_curve program~example1_curve->proc~get_degree none~set~3 nurbs_curve%set program~example1_curve->none~set~3 proc~elevate_degree~3 nurbs_curve%elevate_degree program~example1_curve->proc~elevate_degree~3 proc~insert_knots~3 nurbs_curve%insert_knots program~example1_curve->proc~insert_knots~3 proc~remove_knots~3 nurbs_curve%remove_knots program~example1_curve->proc~remove_knots~3 none~set~3->proc~set1~3 none~set~3->proc~set3~3 proc~elevate_degree~3->none~set~3 proc~insert_knots~3->none~set~3 proc~modify_wc~3 nurbs_curve%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc~3 nurbs_curve%modify_Xc proc~modify_xc~3->none~set~3 proc~remove_knots~3->none~set~3 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~3 program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_degree.html"},{"title":"get_elem – ForCAD","text":"private pure function get_elem(this) result(elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem~3.html"},{"title":"get_elem_Xc_vis – ForCAD","text":"private pure function get_elem_Xc_vis(this) result(elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem_xc_vis~3.html"},{"title":"get_elem_Xg_vis – ForCAD","text":"private pure function get_elem_Xg_vis(this) result(elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem_xg_vis~3.html"},{"title":"get_knot_all – ForCAD","text":"private pure function get_knot_all(this) result(knot) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) Called by proc~~get_knot_all~3~~CalledByGraph proc~get_knot_all~3 nurbs_curve%get_knot_all none~get_knot~3 nurbs_curve%get_knot none~get_knot~3->proc~get_knot_all~3 program~example1_curve example1_curve program~example1_curve->none~get_knot~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_knot_all~3.html"},{"title":"get_knoti – ForCAD","text":"private pure function get_knoti(this, i) result(knot) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: i Return Value real(kind=rk) Called by proc~~get_knoti~3~~CalledByGraph proc~get_knoti~3 nurbs_curve%get_knoti none~get_knot~3 nurbs_curve%get_knot none~get_knot~3->proc~get_knoti~3 program~example1_curve example1_curve program~example1_curve->none~get_knot~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_knoti~3.html"},{"title":"get_multiplicity – ForCAD","text":"private pure function get_multiplicity(this) result(m) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:) Calls proc~~get_multiplicity~3~~CallsGraph proc~get_multiplicity~3 nurbs_curve%get_multiplicity interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_multiplicity~3~~CalledByGraph proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~cmp_elem~3 nurbs_curve%cmp_elem proc~cmp_elem~3->proc~get_multiplicity~3 proc~get_degree nurbs_curve%get_degree proc~get_degree->proc~get_multiplicity~3 proc~set1~3 nurbs_curve%set1 proc~set1~3->proc~get_degree proc~set3~3 nurbs_curve%set3 proc~set3~3->proc~get_degree program~example1_curve example1_curve program~example1_curve->proc~get_degree none~set~3 nurbs_curve%set program~example1_curve->none~set~3 proc~elevate_degree~3 nurbs_curve%elevate_degree program~example1_curve->proc~elevate_degree~3 proc~insert_knots~3 nurbs_curve%insert_knots program~example1_curve->proc~insert_knots~3 proc~remove_knots~3 nurbs_curve%remove_knots program~example1_curve->proc~remove_knots~3 none~set~3->proc~set1~3 none~set~3->proc~set3~3 proc~elevate_degree~3->none~set~3 proc~insert_knots~3->none~set~3 proc~modify_wc~3 nurbs_curve%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc~3 nurbs_curve%modify_Xc proc~modify_xc~3->none~set~3 proc~remove_knots~3->none~set~3 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~3 program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_multiplicity~3.html"},{"title":"get_nc – ForCAD","text":"private pure function get_nc(this) result(nc) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer Calls proc~~get_nc~3~~CallsGraph proc~get_nc~3 nurbs_curve%get_nc interface~compute_multiplicity compute_multiplicity proc~get_nc~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_nc~3.html"},{"title":"get_ng – ForCAD","text":"private pure function get_ng(this) result(ng) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer","tags":"","loc":"proc/get_ng~3.html"},{"title":"is_rational – ForCAD","text":"private pure function is_rational(this) result(r) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value logical Called by proc~~is_rational~3~~CalledByGraph proc~is_rational~3 nurbs_curve%is_rational proc~basis~3 nurbs_curve%basis proc~basis~3->proc~is_rational~3 proc~create~3 nurbs_curve%create proc~create~3->proc~is_rational~3 proc~derivative~3 nurbs_curve%derivative proc~derivative~3->proc~is_rational~3 proc~elevate_degree~3 nurbs_curve%elevate_degree proc~elevate_degree~3->proc~is_rational~3 proc~insert_knots~3 nurbs_curve%insert_knots proc~insert_knots~3->proc~is_rational~3 proc~remove_knots~3 nurbs_curve%remove_knots proc~remove_knots~3->proc~is_rational~3 program~example1_curve example1_curve program~example1_curve->proc~create~3 program~example1_curve->proc~elevate_degree~3 program~example1_curve->proc~insert_knots~3 program~example1_curve->proc~remove_knots~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~create~3 program~shape_circle shape_circle program~shape_circle->proc~create~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/is_rational~3.html"},{"title":"basis – ForCAD","text":"private pure subroutine basis(this, res, Xt, Tgc) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) Calls proc~~basis~3~~CallsGraph proc~basis~3 nurbs_curve%basis proc~basis_bspline basis_bspline proc~basis~3->proc~basis_bspline proc~is_rational~3 nurbs_curve%is_rational proc~basis~3->proc~is_rational~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/basis~3.html"},{"title":"create – ForCAD","text":"private pure subroutine create(this, res, Xt) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) Calls proc~~create~3~~CallsGraph proc~create~3 nurbs_curve%create proc~basis_bspline basis_bspline proc~create~3->proc~basis_bspline proc~is_rational~3 nurbs_curve%is_rational proc~create~3->proc~is_rational~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~create~3~~CalledByGraph proc~create~3 nurbs_curve%create program~example1_curve example1_curve program~example1_curve->proc~create~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~create~3 program~shape_circle shape_circle program~shape_circle->proc~create~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/create~3.html"},{"title":"derivative – ForCAD","text":"private pure subroutine derivative(this, res, Xt, dTgc) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) Calls proc~~derivative~3~~CallsGraph proc~derivative~3 nurbs_curve%derivative proc~basis_bspline_der basis_bspline_der proc~derivative~3->proc~basis_bspline_der proc~is_rational~3 nurbs_curve%is_rational proc~derivative~3->proc~is_rational~3 proc~isinf isinf proc~basis_bspline_der->proc~isinf Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/derivative~3.html"},{"title":"elevate_degree – ForCAD","text":"private pure subroutine elevate_degree(this, t) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in) :: t Calls proc~~elevate_degree~3~~CallsGraph proc~elevate_degree~3 nurbs_curve%elevate_degree none~set~3 nurbs_curve%set proc~elevate_degree~3->none~set~3 proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree~3->proc~elevate_degree_a_5_9 proc~is_rational~3 nurbs_curve%is_rational proc~elevate_degree~3->proc~is_rational~3 proc~set1~3 nurbs_curve%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_curve%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_curve%set3 none~set~3->proc~set3~3 interface~compute_multiplicity compute_multiplicity proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~bincoeff bincoeff proc~elevate_degree_a_5_9->proc~bincoeff proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~factln factln proc~bincoeff->proc~factln proc~get_degree nurbs_curve%get_degree proc~set1~3->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set3~3->proc~get_degree proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~3 proc~get_multiplicity~3->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~elevate_degree~3~~CalledByGraph proc~elevate_degree~3 nurbs_curve%elevate_degree program~example1_curve example1_curve program~example1_curve->proc~elevate_degree~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/elevate_degree~3.html"},{"title":"export_Xc – ForCAD","text":"private impure subroutine export_Xc(this, filename) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this character(len=*), intent(in) :: filename Calls proc~~export_xc~3~~CallsGraph proc~export_xc~3 nurbs_curve%export_Xc proc~cmp_elem_xc_vis~3 nurbs_curve%cmp_elem_Xc_vis proc~export_xc~3->proc~cmp_elem_xc_vis~3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~export_xc~3~~CalledByGraph proc~export_xc~3 nurbs_curve%export_Xc program~example1_curve example1_curve program~example1_curve->proc~export_xc~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~export_xc~3 program~shape_circle shape_circle program~shape_circle->proc~export_xc~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/export_xc~3.html"},{"title":"export_Xg – ForCAD","text":"private impure subroutine export_Xg(this, filename) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this character(len=*), intent(in) :: filename Calls proc~~export_xg~3~~CallsGraph proc~export_xg~3 nurbs_curve%export_Xg proc~cmp_elem_xg_vis~3 nurbs_curve%cmp_elem_Xg_vis proc~export_xg~3->proc~cmp_elem_xg_vis~3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~export_xg~3~~CalledByGraph proc~export_xg~3 nurbs_curve%export_Xg program~example1_curve example1_curve program~example1_curve->proc~export_xg~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~export_xg~3 program~shape_circle shape_circle program~shape_circle->proc~export_xg~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/export_xg~3.html"},{"title":"finalize – ForCAD","text":"private pure subroutine finalize(this) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this Called by proc~~finalize~3~~CalledByGraph proc~finalize~3 nurbs_curve%finalize program~example1_curve example1_curve program~example1_curve->proc~finalize~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~finalize~3 program~shape_circle shape_circle program~shape_circle->proc~finalize~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/finalize~3.html"},{"title":"insert_knots – ForCAD","text":"private pure subroutine insert_knots(this, Xth, r) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) Calls proc~~insert_knots~3~~CallsGraph proc~insert_knots~3 nurbs_curve%insert_knots interface~compute_multiplicity compute_multiplicity proc~insert_knots~3->interface~compute_multiplicity none~set~3 nurbs_curve%set proc~insert_knots~3->none~set~3 proc~findspan findspan proc~insert_knots~3->proc~findspan proc~insert_knot_a_5_1 insert_knot_A_5_1 proc~insert_knots~3->proc~insert_knot_a_5_1 proc~is_rational~3 nurbs_curve%is_rational proc~insert_knots~3->proc~is_rational~3 proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~set1~3 nurbs_curve%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_curve%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_curve%set3 none~set~3->proc~set3~3 proc~get_degree nurbs_curve%get_degree proc~set1~3->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set3~3->proc~get_degree proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~3 proc~get_multiplicity~3->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~insert_knots~3~~CalledByGraph proc~insert_knots~3 nurbs_curve%insert_knots program~example1_curve example1_curve program~example1_curve->proc~insert_knots~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/insert_knots~3.html"},{"title":"modify_Wc – ForCAD","text":"private pure subroutine modify_Wc(this, W, num) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num Calls proc~~modify_wc~3~~CallsGraph proc~modify_wc~3 nurbs_curve%modify_Wc none~set~3 nurbs_curve%set proc~modify_wc~3->none~set~3 proc~set1~3 nurbs_curve%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_curve%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_curve%set3 none~set~3->proc~set3~3 proc~get_degree nurbs_curve%get_degree proc~set1~3->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set3~3->proc~get_degree proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~3 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/modify_wc~3.html"},{"title":"modify_Xc – ForCAD","text":"private pure subroutine modify_Xc(this, X, num, dir) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir Calls proc~~modify_xc~3~~CallsGraph proc~modify_xc~3 nurbs_curve%modify_Xc none~set~3 nurbs_curve%set proc~modify_xc~3->none~set~3 proc~set1~3 nurbs_curve%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_curve%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_curve%set3 none~set~3->proc~set3~3 proc~get_degree nurbs_curve%get_degree proc~set1~3->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set3~3->proc~get_degree proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~3 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/modify_xc~3.html"},{"title":"remove_knots – ForCAD","text":"private pure subroutine remove_knots(this, Xth, r) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) Calls proc~~remove_knots~3~~CallsGraph proc~remove_knots~3 nurbs_curve%remove_knots interface~compute_multiplicity compute_multiplicity proc~remove_knots~3->interface~compute_multiplicity none~set~3 nurbs_curve%set proc~remove_knots~3->none~set~3 proc~findspan findspan proc~remove_knots~3->proc~findspan proc~is_rational~3 nurbs_curve%is_rational proc~remove_knots~3->proc~is_rational~3 proc~remove_knots_a_5_8 remove_knots_A_5_8 proc~remove_knots~3->proc~remove_knots_a_5_8 proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~set1~3 nurbs_curve%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_curve%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_curve%set3 none~set~3->proc~set3~3 proc~get_degree nurbs_curve%get_degree proc~set1~3->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set3~3->proc~get_degree proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~3 proc~get_multiplicity~3->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~remove_knots~3~~CalledByGraph proc~remove_knots~3 nurbs_curve%remove_knots program~example1_curve example1_curve program~example1_curve->proc~remove_knots~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/remove_knots~3.html"},{"title":"rotate_Xc – ForCAD","text":"private pure subroutine rotate_Xc(this, alpha, beta, theta) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta Calls proc~~rotate_xc~3~~CallsGraph proc~rotate_xc~3 nurbs_curve%rotate_Xc proc~rotation rotation proc~rotate_xc~3->proc~rotation cosd cosd proc~rotation->cosd sind sind proc~rotation->sind Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~rotate_xc~3~~CalledByGraph proc~rotate_xc~3 nurbs_curve%rotate_Xc program~example1_curve example1_curve program~example1_curve->proc~rotate_xc~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/rotate_xc~3.html"},{"title":"rotate_Xg – ForCAD","text":"private pure subroutine rotate_Xg(this, alpha, beta, theta) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta Calls proc~~rotate_xg~3~~CallsGraph proc~rotate_xg~3 nurbs_curve%rotate_Xg proc~rotation rotation proc~rotate_xg~3->proc~rotation cosd cosd proc~rotation->cosd sind sind proc~rotation->sind Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~rotate_xg~3~~CalledByGraph proc~rotate_xg~3 nurbs_curve%rotate_Xg program~example1_curve example1_curve program~example1_curve->proc~rotate_xg~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/rotate_xg~3.html"},{"title":"set1 – ForCAD","text":"private pure subroutine set1(this, knot, Xc, Wc) Set knot vector, control points and weights for the NURBS curve object. Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set1~3~~CallsGraph proc~set1~3 nurbs_curve%set1 proc~get_degree nurbs_curve%get_degree proc~set1~3->proc~get_degree proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~3 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set1~3~~CalledByGraph proc~set1~3 nurbs_curve%set1 none~set~3 nurbs_curve%set none~set~3->proc~set1~3 proc~elevate_degree~3 nurbs_curve%elevate_degree proc~elevate_degree~3->none~set~3 proc~insert_knots~3 nurbs_curve%insert_knots proc~insert_knots~3->none~set~3 proc~modify_wc~3 nurbs_curve%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc~3 nurbs_curve%modify_Xc proc~modify_xc~3->none~set~3 proc~remove_knots~3 nurbs_curve%remove_knots proc~remove_knots~3->none~set~3 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~3 program~example1_curve example1_curve program~example1_curve->none~set~3 program~example1_curve->proc~elevate_degree~3 program~example1_curve->proc~insert_knots~3 program~example1_curve->proc~remove_knots~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~3 program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set1~3.html"},{"title":"set2 – ForCAD","text":"private pure subroutine set2(this, Xth_dir, degree, continuity, Xc, Wc) Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights. Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir (:) integer, intent(in) :: degree integer, intent(in), contiguous :: continuity (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set2~3~~CallsGraph proc~set2~3 nurbs_curve%set2 proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~repelem repelem proc~compute_knot_vector->proc~repelem Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set2~3~~CalledByGraph proc~set2~3 nurbs_curve%set2 none~set~3 nurbs_curve%set none~set~3->proc~set2~3 proc~elevate_degree~3 nurbs_curve%elevate_degree proc~elevate_degree~3->none~set~3 proc~insert_knots~3 nurbs_curve%insert_knots proc~insert_knots~3->none~set~3 proc~modify_wc~3 nurbs_curve%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc~3 nurbs_curve%modify_Xc proc~modify_xc~3->none~set~3 proc~remove_knots~3 nurbs_curve%remove_knots proc~remove_knots~3->none~set~3 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~3 program~example1_curve example1_curve program~example1_curve->none~set~3 program~example1_curve->proc~elevate_degree~3 program~example1_curve->proc~insert_knots~3 program~example1_curve->proc~remove_knots~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~3 program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set2~3.html"},{"title":"set3 – ForCAD","text":"private pure subroutine set3(this, Xc, Wc) Set Bezier or Rational Bezier curve using control points and weights. Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set3~3~~CallsGraph proc~set3~3 nurbs_curve%set3 proc~get_degree nurbs_curve%get_degree proc~set3~3->proc~get_degree proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~3 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set3~3~~CalledByGraph proc~set3~3 nurbs_curve%set3 none~set~3 nurbs_curve%set none~set~3->proc~set3~3 proc~elevate_degree~3 nurbs_curve%elevate_degree proc~elevate_degree~3->none~set~3 proc~insert_knots~3 nurbs_curve%insert_knots proc~insert_knots~3->none~set~3 proc~modify_wc~3 nurbs_curve%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc~3 nurbs_curve%modify_Xc proc~modify_xc~3->none~set~3 proc~remove_knots~3 nurbs_curve%remove_knots proc~remove_knots~3->none~set~3 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~3 program~example1_curve example1_curve program~example1_curve->none~set~3 program~example1_curve->proc~elevate_degree~3 program~example1_curve->proc~insert_knots~3 program~example1_curve->proc~remove_knots~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~3 program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set3~3.html"},{"title":"set_circle – ForCAD","text":"private pure subroutine set_circle(this, center, radius) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: center (:) real(kind=rk), intent(in) :: radius Calls proc~~set_circle~~CallsGraph proc~set_circle nurbs_curve%set_circle none~set~3 nurbs_curve%set proc~set_circle->none~set~3 proc~set1~3 nurbs_curve%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_curve%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_curve%set3 none~set~3->proc~set3~3 proc~get_degree nurbs_curve%get_degree proc~set1~3->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set3~3->proc~get_degree proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~3 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set_circle~~CalledByGraph proc~set_circle nurbs_curve%set_circle program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set_circle.html"},{"title":"set_elem – ForCAD","text":"private pure subroutine set_elem(this, elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:)","tags":"","loc":"proc/set_elem~3.html"},{"title":"set_elem_Xc_vis – ForCAD","text":"private pure subroutine set_elem_Xc_vis(this, elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:)","tags":"","loc":"proc/set_elem_xc_vis~3.html"},{"title":"set_elem_Xg_vis – ForCAD","text":"private pure subroutine set_elem_Xg_vis(this, elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:)","tags":"","loc":"proc/set_elem_xg_vis~3.html"},{"title":"show – ForCAD","text":"private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg Called by proc~~show~3~~CalledByGraph proc~show~3 nurbs_curve%show program~example1_curve example1_curve program~example1_curve->proc~show~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~show~3 program~shape_circle shape_circle program~shape_circle->proc~show~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/show~3.html"},{"title":"translate_Xc – ForCAD","text":"private pure subroutine translate_Xc(this, vec) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) Called by proc~~translate_xc~3~~CalledByGraph proc~translate_xc~3 nurbs_curve%translate_Xc program~example1_curve example1_curve program~example1_curve->proc~translate_xc~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/translate_xc~3.html"},{"title":"translate_Xg – ForCAD","text":"private pure subroutine translate_Xg(this, vec) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) Called by proc~~translate_xg~3~~CalledByGraph proc~translate_xg~3 nurbs_curve%translate_Xg program~example1_curve example1_curve program~example1_curve->proc~translate_xg~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/translate_xg~3.html"},{"title":"generate_Xc – ForCAD","text":"function generate_Xc(num_rows, num_cols, peak_height) result(control_points) Arguments Type Intent Optional Attributes Name integer, intent(in) :: num_rows integer, intent(in) :: num_cols real(kind=rk), intent(in) :: peak_height Return Value real(kind=rk), allocatable, (:,:) Called by proc~~generate_xc~5~~CalledByGraph proc~generate_xc~5 generate_Xc program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~generate_xc~5 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/generate_xc~5.html"},{"title":"forcad_nurbs_volume – ForCAD","text":"This module defines the 'nurbs_volume' type for representing a Non-Uniform Rational B-Spline (NURBS) volume. Uses forcad_utils module~~forcad_nurbs_volume~~UsesGraph module~forcad_nurbs_volume forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Used by module~~forcad_nurbs_volume~~UsedByGraph module~forcad_nurbs_volume forcad_nurbs_volume module~forcad forcad module~forcad->module~forcad_nurbs_volume program~example1_curve example1_curve program~example1_curve->module~forcad program~example3_surface example3_surface program~example3_surface->module~forcad program~example3_volume example3_volume program~example3_volume->module~forcad program~example_morph example_morph program~example_morph->module~forcad program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->module~forcad program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->module~forcad program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->module~forcad program~shape_circle shape_circle program~shape_circle->module~forcad program~shape_hexahedron shape_hexahedron program~shape_hexahedron->module~forcad program~shape_tetragon shape_tetragon program~shape_tetragon->module~forcad Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Derived Types type, public :: nurbs_volume Components Type Visibility Attributes Name Initial real(kind=rk), private, allocatable :: Wc (:) Weights for the control points (1D array: [nc(1) nc(2) nc(3)]) real(kind=rk), private, allocatable :: Xc (:,:) Control points (2D array: [nc(1) nc(2) nc(3), dim]) real(kind=rk), private, allocatable :: Xg (:,:) Geometry points (2D array: [ng(1) ng(2) ng(3), dim]) real(kind=rk), private, allocatable :: Xt1 (:) Evaluation parameter values in the first direction (1D array: [ng(1)]) real(kind=rk), private, allocatable :: Xt2 (:) Evaluation parameter values in the second direction (1D array: [ng(2)]) real(kind=rk), private, allocatable :: Xt3 (:) Evaluation parameter values in the third direction (1D array: [ng(3)]) integer, private :: degree (3) Degree (order) of the volume integer, private, allocatable :: elemConn (:,:) IGA element connectivity integer, private, allocatable :: elemConn_Xc_vis (:,:) Connectivity for visualization of control points integer, private, allocatable :: elemConn_Xg_vis (:,:) Connectivity for visualization of geometry points real(kind=rk), private, allocatable :: knot1 (:) Knot vector in the first direction (1D array) real(kind=rk), private, allocatable :: knot2 (:) Knot vector in the second direction (1D array) real(kind=rk), private, allocatable :: knot3 (:) Knot vector in the third direction (1D array) integer, private :: nc (3) Number of control points in each direction integer, private :: ng (3) Number of geometry points in each direction Type-Bound Procedures procedure, public :: basis Compute the basis functions of the NURBS volume Read more… procedure, public :: cmp_elem Generate IGA element connectivity Read more… procedure, public :: cmp_elem_Xc_vis Generate connectivity for control points Read more… procedure, public :: cmp_elem_Xg_vis Generate connectivity for geometry points Read more… procedure, public :: create Generate geometry points Read more… procedure, public :: derivative Compute the derivative of the NURBS volume Read more… procedure, public :: elevate_degree Elevate the degree of the NURBS volume Read more… procedure, public :: export_Xc Export control points to VTK file Read more… procedure, public :: export_Xg Export geometry points to VTK file Read more… procedure, public :: finalize Finalize the NURBS volume object Read more… procedure, public :: get_Wc Get weights Read more… procedure, public :: get_Xc Get control points Read more… procedure, public :: get_Xg Get geometry points Read more… procedure, public :: get_Xt Get parameter values Read more… procedure, public :: get_continuity Get continuity of the volume Read more… generic, public :: get_degree => get_degree_all , get_degree_dir Get degree of the NURBS volume Read more… procedure, public :: get_elem Get IGA element connectivity Read more… procedure, public :: get_elem_Xc_vis Get connectivity for control points Read more… procedure, public :: get_elem_Xg_vis Get connectivity for geometry points Read more… generic, public :: get_knot => get_knoti , get_knot_all Get knot vector Read more… procedure, public :: get_multiplicity Get multiplicity of the knot vector Read more… procedure, public :: get_nc Get number of required control points Read more… procedure, public :: get_ng Get number of geometry points Read more… procedure, public :: insert_knots Insert knots into the knot vector Read more… procedure, public :: is_rational Check if the NURBS volume is rational Read more… procedure, public :: modify_Wc Modify weights Read more… procedure, public :: modify_Xc Modify control points Read more… procedure, public :: put_to_nurbs Put a shape to a NURBS volume Read more… procedure, public :: remove_knots Remove knots from the knot vector Read more… procedure, public :: rotate_Xc Rotate control points Read more… procedure, public :: rotate_Xg Rotate geometry points Read more… generic, public :: set => set1 , set2 , set3 Set NURBS volume Read more… procedure, public :: set1 Set knot vectors, control points and weights for the NURBS volume object Read more… procedure, public :: set2 Set NURBS volume using nodes of parameter space, degree, continuity, control points and weights Read more… procedure, public :: set3 Set Bezier or Rational Bezier volume using control points and weights Read more… procedure, public :: set_elem Set IGA element connectivity Read more… procedure, public :: set_elem_Xc_vis Set connectivity for control points Read more… procedure, public :: set_elem_Xg_vis Set connectivity for geometry points Read more… procedure, public :: set_hexahedron Set a hexahedron Read more… procedure, public :: show Show the NURBS object using PyVista Read more… procedure, public :: translate_Xc Translate control points Read more… procedure, public :: translate_Xg Translate geometry points Read more… procedure, private :: get_degree_all Get degree of the NURBS volume in all directions Read more… procedure, private :: get_degree_dir Get degree of the NURBS volume in a specific direction Read more… procedure, private :: get_knot_all Get all knot vectors Read more… procedure, private :: get_knoti Get i-th knot value Read more… Functions private pure function cmp_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function cmp_elem_Xc_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) private pure function cmp_elem_Xg_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) private pure function get_Wc (this) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) private pure function get_Xc (this) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xg (this) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xt (this, dir) result(Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) private pure function get_continuity (this, dir) result(c) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) private pure function get_degree_all (this) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, (3) private pure function get_degree_dir (this, dir) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer private pure function get_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_elem_Xc_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_elem_Xg_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_knot_all (this, dir) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) private pure function get_knoti (this, dir, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir integer, intent(in) :: i Return Value real(kind=rk) private pure function get_multiplicity (this, dir) result(m) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) private pure function get_nc (this, dir) result(nc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer private pure function get_ng (this) result(ng) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, (3) private pure function is_rational (this) result(r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value logical Subroutines private pure subroutine basis (this, res1, res2, res3, Xt1, Xt2, Xt3, Tgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) private pure subroutine create (this, res1, res2, res3, Xt1, Xt2, Xt3, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(in), optional, contiguous :: Xt (:,:) private pure subroutine derivative (this, res1, res2, res3, Xt1, Xt2, Xt3, dTgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) private pure subroutine elevate_degree (this, dir, t) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir integer, intent(in) :: t private impure subroutine export_Xc (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this character(len=*), intent(in) :: filename private impure subroutine export_Xg (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this character(len=*), intent(in) :: filename private pure subroutine finalize (this) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this private pure subroutine insert_knots (this, dir, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) private pure subroutine modify_Wc (this, W, num) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num private pure subroutine modify_Xc (this, X, num, dir) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir private pure subroutine put_to_nurbs (this, X, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: X (:,:) integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine remove_knots (this, dir, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) private pure subroutine rotate_Xc (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta private pure subroutine rotate_Xg (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta private pure subroutine set1 (this, knot1, knot2, knot3, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set control points and weights for the NURBS volume object. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot1 (:) real(kind=rk), intent(in), contiguous :: knot2 (:) real(kind=rk), intent(in), contiguous :: knot3 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set2 (this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set control points and weights for the NURBS volume object. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir1 (:) real(kind=rk), intent(in), contiguous :: Xth_dir2 (:) real(kind=rk), intent(in), contiguous :: Xth_dir3 (:) integer, intent(in), contiguous :: degree (:) integer, intent(in), contiguous :: continuity1 (:) integer, intent(in), contiguous :: continuity2 (:) integer, intent(in), contiguous :: continuity3 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set3 (this, nc, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier volume using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set_elem (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine set_elem_Xc_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine set_elem_Xg_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine set_hexahedron (this, L, nc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: L (:) integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private impure subroutine show (this, vtkfile_Xc, vtkfile_Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg private pure subroutine translate_Xc (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) private pure subroutine translate_Xg (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:)","tags":"","loc":"module/forcad_nurbs_volume.html"},{"title":"forcad_utils – ForCAD","text":"This module contains parameters, functions and subroutines that are used in the library. Used by module~~forcad_utils~~UsedByGraph module~forcad_utils forcad_utils module~forcad forcad module~forcad->module~forcad_utils module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils program~example_morph example_morph program~example_morph->module~forcad_utils program~example_morph->module~forcad program~example1_curve example1_curve program~example1_curve->module~forcad program~example3_surface example3_surface program~example3_surface->module~forcad program~example3_volume example3_volume program~example3_volume->module~forcad program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->module~forcad program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->module~forcad program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->module~forcad program~shape_circle shape_circle program~shape_circle->module~forcad program~shape_hexahedron shape_hexahedron program~shape_hexahedron->module~forcad program~shape_tetragon shape_tetragon program~shape_tetragon->module~forcad Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables Type Visibility Attributes Name Initial integer, public, parameter :: rk = kind(1.0d0) Interfaces public interface compute_multiplicity private pure function compute_multiplicity1 (knot) result(multiplicity) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: knot (:) Return Value integer, allocatable, (:) private pure function compute_multiplicity2 (knot, Xth) result(multiplicity) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in) :: Xth Return Value integer public interface elemConn_C0 private pure function cmp_elemConn_C0_L (nnode, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode integer, intent(in) :: p Return Value integer, allocatable, (:,:) private pure function cmp_elemConn_C0_S (nnode1, nnode2, p1, p2) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: p1 integer, intent(in) :: p2 Return Value integer, allocatable, (:,:) private pure function cmp_elemConn_C0_V (nnode1, nnode2, nnode3, p1, p2, p3) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: nnode3 integer, intent(in) :: p1 integer, intent(in) :: p2 integer, intent(in) :: p3 Return Value integer, allocatable, (:,:) public interface elemConn_Cn private pure subroutine cmp_elemConn_Cn_L (nnode, p, Xth, vecKnot_mul, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode integer, intent(in) :: p real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: vecKnot_mul (:) integer, intent(out), allocatable :: elemConn (:,:) private pure subroutine cmp_elemConn_Cn_S (nnode1, nnode2, p1, p2, Xth1, Xth2, vecKnot_mul1, vecKnot_mul2, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: p1 integer, intent(in) :: p2 real(kind=rk), intent(in), contiguous :: Xth1 (:) real(kind=rk), intent(in), contiguous :: Xth2 (:) integer, intent(in), contiguous :: vecKnot_mul1 (:) integer, intent(in), contiguous :: vecKnot_mul2 (:) integer, intent(out), allocatable :: elemConn (:,:) private pure subroutine cmp_elemConn_Cn_V (nnode1, nnode2, nnode3, p1, p2, p3, Xth1, Xth2, Xth3, vecKnot_mul1, vecKnot_mul2, vecKnot_mul3, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: nnode3 integer, intent(in) :: p1 integer, intent(in) :: p2 integer, intent(in) :: p3 real(kind=rk), intent(in), contiguous :: Xth1 (:) real(kind=rk), intent(in), contiguous :: Xth2 (:) real(kind=rk), intent(in), contiguous :: Xth3 (:) integer, intent(in), contiguous :: vecKnot_mul1 (:) integer, intent(in), contiguous :: vecKnot_mul2 (:) integer, intent(in), contiguous :: vecKnot_mul3 (:) integer, intent(out), allocatable :: elemConn (:,:) public interface ndgrid private pure subroutine ndgrid2 (X_dir1, X_dir2, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: X_dir1 (:) real(kind=rk), intent(in), contiguous :: X_dir2 (:) real(kind=rk), intent(out), allocatable :: Xt (:,:) private pure subroutine ndgrid3 (X_dir1, X_dir2, X_dir3, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: X_dir1 (:) real(kind=rk), intent(in), contiguous :: X_dir2 (:) real(kind=rk), intent(in), contiguous :: X_dir3 (:) real(kind=rk), intent(out), allocatable :: Xt (:,:) public interface unique private pure function unique_integer (vec) result(output) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in), dimension(:), contiguous :: vec Return Value integer, dimension(:), allocatable private pure function unique_real (vec) result(output) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), dimension(:), contiguous :: vec Return Value real(kind=rk), dimension(:), allocatable Functions public pure function basis_bernstein (Xt, nc) result(B) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: Xt integer, intent(in) :: nc Return Value real(kind=rk), allocatable, (:) public pure function basis_bspline (Xt, knot, nc, degree) result(B) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: Xt real(kind=rk), intent(in), contiguous :: knot (:) integer, intent(in) :: nc integer, intent(in) :: degree Return Value real(kind=rk), allocatable, (:) public pure function basis_bspline_der (Xt, knot, nc, degree) result(dB) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: Xt real(kind=rk), intent(in), contiguous :: knot (:) integer, intent(in) :: nc integer, intent(in) :: degree Return Value real(kind=rk), allocatable, (:) public pure function compute_knot_vector (Xth_dir, degree, continuity) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: Xth_dir (:) integer, intent(in) :: degree integer, intent(in), contiguous :: continuity (:) Return Value real(kind=rk), allocatable, (:) public pure function findspan (n, degree, Xth, knot) result(s) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: n integer, intent(in) :: degree real(kind=rk), intent(in) :: Xth real(kind=rk), intent(in), contiguous :: knot (:) Return Value integer public pure function hexahedron_Xc (L, nc) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: L (3) integer, intent(in) :: nc (3) Return Value real(kind=rk), allocatable, (:,:) public pure function kron (u, v) result(w) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: u (:) real(kind=rk), intent(in), contiguous :: v (:) Return Value real(kind=rk), (size(u)*size(v)) public pure function rotation (alpha, beta, theta) result(R) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta Return Value real(kind=rk), dimension(3,3) public pure function tetragon_Xc (L, nc) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: L (2) integer, intent(in) :: nc (2) Return Value real(kind=rk), allocatable, (:,:) private pure function bincoeff (n, k) result(b) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: n integer, intent(in) :: k Return Value real(kind=rk) private pure function cmp_elemConn_C0_L (nnode, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode integer, intent(in) :: p Return Value integer, allocatable, (:,:) private pure function cmp_elemConn_C0_S (nnode1, nnode2, p1, p2) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: p1 integer, intent(in) :: p2 Return Value integer, allocatable, (:,:) private pure function cmp_elemConn_C0_V (nnode1, nnode2, nnode3, p1, p2, p3) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: nnode3 integer, intent(in) :: p1 integer, intent(in) :: p2 integer, intent(in) :: p3 Return Value integer, allocatable, (:,:) private pure function compute_multiplicity1 (knot) result(multiplicity) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: knot (:) Return Value integer, allocatable, (:) private pure function compute_multiplicity2 (knot, Xth) result(multiplicity) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in) :: Xth Return Value integer private pure function factln (n) result(f) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: n Return Value real(kind=rk) private pure elemental function isinf (x) result(output) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: x Return Value logical private pure elemental function isnan (x) result(output) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: x Return Value logical private pure function repelem (a, b) result(c) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: a (:) integer, intent(in), contiguous :: b (:) Return Value real(kind=rk), (sum(b)) private pure function unique_integer (vec) result(output) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in), dimension(:), contiguous :: vec Return Value integer, dimension(:), allocatable private pure function unique_real (vec) result(output) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), dimension(:), contiguous :: vec Return Value real(kind=rk), dimension(:), allocatable Subroutines public pure subroutine elevate_degree_A_5_9 (t, knot, degree, Xcw, nc_new, knot_new, Xcw_new) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: t real(kind=rk), intent(in), contiguous :: knot (:) integer, intent(in) :: degree real(kind=rk), intent(in), contiguous :: Xcw (:,:) integer, intent(out) :: nc_new real(kind=rk), intent(out), allocatable :: knot_new (:) real(kind=rk), intent(out), allocatable :: Xcw_new (:,:) public pure subroutine insert_knot_A_5_1 (p, UP, Pw, u, k, s, r, nq, UQ, Qw) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: p real(kind=rk), intent(in), contiguous :: UP (0:) real(kind=rk), intent(in), contiguous :: Pw (0:,:) real(kind=rk), intent(in) :: u integer, intent(in) :: k integer, intent(in) :: s integer, intent(in) :: r integer, intent(out) :: nq real(kind=rk), intent(out), allocatable :: UQ (:) real(kind=rk), intent(out), allocatable :: Qw (:,:) public pure subroutine remove_knots_A_5_8 (p, knot, Pw, u, r, s, num, t, knot_new, Pw_new) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: p real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in), contiguous :: Pw (:,:) real(kind=rk), intent(in) :: u integer, intent(in) :: r integer, intent(in) :: s integer, intent(in) :: num integer, intent(out) :: t real(kind=rk), intent(out), allocatable :: knot_new (:) real(kind=rk), intent(out), allocatable :: Pw_new (:,:) private pure subroutine cmp_elemConn_Cn_L (nnode, p, Xth, vecKnot_mul, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode integer, intent(in) :: p real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: vecKnot_mul (:) integer, intent(out), allocatable :: elemConn (:,:) private pure subroutine cmp_elemConn_Cn_S (nnode1, nnode2, p1, p2, Xth1, Xth2, vecKnot_mul1, vecKnot_mul2, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: p1 integer, intent(in) :: p2 real(kind=rk), intent(in), contiguous :: Xth1 (:) real(kind=rk), intent(in), contiguous :: Xth2 (:) integer, intent(in), contiguous :: vecKnot_mul1 (:) integer, intent(in), contiguous :: vecKnot_mul2 (:) integer, intent(out), allocatable :: elemConn (:,:) private pure subroutine cmp_elemConn_Cn_V (nnode1, nnode2, nnode3, p1, p2, p3, Xth1, Xth2, Xth3, vecKnot_mul1, vecKnot_mul2, vecKnot_mul3, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: nnode3 integer, intent(in) :: p1 integer, intent(in) :: p2 integer, intent(in) :: p3 real(kind=rk), intent(in), contiguous :: Xth1 (:) real(kind=rk), intent(in), contiguous :: Xth2 (:) real(kind=rk), intent(in), contiguous :: Xth3 (:) integer, intent(in), contiguous :: vecKnot_mul1 (:) integer, intent(in), contiguous :: vecKnot_mul2 (:) integer, intent(in), contiguous :: vecKnot_mul3 (:) integer, intent(out), allocatable :: elemConn (:,:) private pure subroutine ndgrid2 (X_dir1, X_dir2, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: X_dir1 (:) real(kind=rk), intent(in), contiguous :: X_dir2 (:) real(kind=rk), intent(out), allocatable :: Xt (:,:) private pure subroutine ndgrid3 (X_dir1, X_dir2, X_dir3, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: X_dir1 (:) real(kind=rk), intent(in), contiguous :: X_dir2 (:) real(kind=rk), intent(in), contiguous :: X_dir3 (:) real(kind=rk), intent(out), allocatable :: Xt (:,:)","tags":"","loc":"module/forcad_utils.html"},{"title":"forcad – ForCAD","text":"Uses forcad_nurbs_curve forcad_nurbs_volume forcad_nurbs_surface forcad_utils module~~forcad~~UsesGraph module~forcad forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Used by module~~forcad~~UsedByGraph module~forcad forcad program~example1_curve example1_curve program~example1_curve->module~forcad program~example3_surface example3_surface program~example3_surface->module~forcad program~example3_volume example3_volume program~example3_volume->module~forcad program~example_morph example_morph program~example_morph->module~forcad program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->module~forcad program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->module~forcad program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->module~forcad program~shape_circle shape_circle program~shape_circle->module~forcad program~shape_hexahedron shape_hexahedron program~shape_hexahedron->module~forcad program~shape_tetragon shape_tetragon program~shape_tetragon->module~forcad Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"module/forcad.html"},{"title":"forcad_nurbs_surface – ForCAD","text":"This module defines the 'nurbs_surface' type for representing a Non-Uniform Rational B-Spline (NURBS) surface. Uses forcad_utils module~~forcad_nurbs_surface~~UsesGraph module~forcad_nurbs_surface forcad_nurbs_surface module~forcad_utils forcad_utils module~forcad_nurbs_surface->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Used by module~~forcad_nurbs_surface~~UsedByGraph module~forcad_nurbs_surface forcad_nurbs_surface module~forcad forcad module~forcad->module~forcad_nurbs_surface program~example1_curve example1_curve program~example1_curve->module~forcad program~example3_surface example3_surface program~example3_surface->module~forcad program~example3_volume example3_volume program~example3_volume->module~forcad program~example_morph example_morph program~example_morph->module~forcad program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->module~forcad program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->module~forcad program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->module~forcad program~shape_circle shape_circle program~shape_circle->module~forcad program~shape_hexahedron shape_hexahedron program~shape_hexahedron->module~forcad program~shape_tetragon shape_tetragon program~shape_tetragon->module~forcad Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Derived Types type, public :: nurbs_surface Components Type Visibility Attributes Name Initial real(kind=rk), private, allocatable :: Wc (:) Weights for control points (1D array: [nc(1)*nc(2)]) real(kind=rk), private, allocatable :: Xc (:,:) Control points (2D array: [nc(1)*nc(2), dim]) real(kind=rk), private, allocatable :: Xg (:,:) Geometry points (2D array: [ng(1)*ng(2), dim]) real(kind=rk), private, allocatable :: Xt1 (:) Evaluation parameter values in the first direction (1D array: [ng(1)]) real(kind=rk), private, allocatable :: Xt2 (:) Evaluation parameter values in the second direction (1D array: [ng(2)]) integer, private :: degree (2) Degree (order) of the surface integer, private, allocatable :: elemConn (:,:) IGA element connectivity integer, private, allocatable :: elemConn_Xc_vis (:,:) Connectivity for visualization of control points integer, private, allocatable :: elemConn_Xg_vis (:,:) Connectivity for visualization of geometry points real(kind=rk), private, allocatable :: knot1 (:) Knot vector in the first direction (1D array) real(kind=rk), private, allocatable :: knot2 (:) Knot vector in the second direction (1D array) integer, private :: nc (2) Number of control points in each direction integer, private :: ng (2) Number of geometry points in each direction Type-Bound Procedures procedure, public :: basis Compute the basis functions of the NURBS surface Read more… procedure, public :: cmp_elem Generate IGA element connectivity Read more… procedure, public :: cmp_elem_Xc_vis Generate connectivity for control points Read more… procedure, public :: cmp_elem_Xg_vis Generate connectivity for geometry points Read more… procedure, public :: create Generate geometry points Read more… procedure, public :: derivative Compute the derivative of the NURBS surface Read more… procedure, public :: elevate_degree Elevate degree Read more… procedure, public :: export_Xc Export control points to VTK file Read more… procedure, public :: export_Xg Export geometry points to VTK file Read more… procedure, public :: finalize Finalize the NURBS surface object Read more… procedure, public :: get_Wc Get weights Read more… procedure, public :: get_Xc Get control points Read more… procedure, public :: get_Xg Get geometry points Read more… procedure, public :: get_Xt Get parameter values Read more… procedure, public :: get_continuity Get continuity of the surface Read more… generic, public :: get_degree => get_degree_all , get_degree_dir Get degree of the NURBS surface Read more… procedure, public :: get_elem Get IGA element connectivity Read more… procedure, public :: get_elem_Xc_vis Get connectivity for control points Read more… procedure, public :: get_elem_Xg_vis Get connectivity for geometry points Read more… generic, public :: get_knot => get_knoti , get_knot_all Get knot vector Read more… procedure, public :: get_multiplicity Get multiplicity of the knot vector Read more… procedure, public :: get_nc Get number of required control points Read more… procedure, public :: get_ng Get number of geometry points Read more… procedure, public :: insert_knots Insert knots into the knot vector Read more… procedure, public :: is_rational Check if the NURBS surface is rational Read more… procedure, public :: modify_Wc Modify weights Read more… procedure, public :: modify_Xc Modify control points Read more… procedure, public :: remove_knots Remove knots from the knot vector Read more… procedure, public :: rotate_Xc Rotate control points Read more… procedure, public :: rotate_Xg Rotate geometry points Read more… generic, public :: set => set1 , set2 , set3 Set NURBS surface Read more… procedure, public :: set1 Set knot vectors, control points and weights for the NURBS surface object Read more… procedure, public :: set2 Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights Read more… procedure, public :: set3 Set Bezier or Rational Bezier surface using control points and weights Read more… procedure, public :: set_elem Set IGA element connectivity Read more… procedure, public :: set_elem_Xc_vis Set connectivity for control points Read more… procedure, public :: set_elem_Xg_vis Set connectivity for geometry points Read more… procedure, public :: set_tetragon Set a tetragon Read more… procedure, public :: show Show the NURBS object using PyVista Read more… procedure, public :: translate_Xc Translate control points Read more… procedure, public :: translate_Xg Translate geometry points Read more… procedure, private :: get_degree_all Get degree of the NURBS surface in both directions Read more… procedure, private :: get_degree_dir Get degree of the NURBS surface in a specific direction Read more… procedure, private :: get_knot_all Get all knot vectors Read more… procedure, private :: get_knoti Get i-th knot value Read more… Functions private pure function cmp_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function cmp_elem_Xc_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) private pure function cmp_elem_Xg_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) private pure function get_Wc (this) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) private pure function get_Xc (this) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xg (this) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xt (this, dir) result(Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) private pure function get_continuity (this, dir) result(c) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) private pure function get_degree_all (this) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, (2) private pure function get_degree_dir (this, dir) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer private pure function get_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_elem_Xc_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_elem_Xg_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_knot_all (this, dir) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) private pure function get_knoti (this, dir, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir integer, intent(in) :: i Return Value real(kind=rk) private pure function get_multiplicity (this, dir) result(m) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) private pure function get_nc (this, dir) result(nc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer private pure function get_ng (this) result(ng) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, (2) private pure function is_rational (this) result(r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value logical Subroutines private pure subroutine basis (this, res1, res2, Xt1, Xt2, Tgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) private pure subroutine create (this, res1, res2, Xt1, Xt2, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt (:,:) private pure subroutine derivative (this, res1, res2, Xt1, Xt2, dTgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) private pure subroutine elevate_degree (this, dir, t) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir integer, intent(in) :: t private impure subroutine export_Xc (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this character(len=*), intent(in) :: filename private impure subroutine export_Xg (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this character(len=*), intent(in) :: filename private pure subroutine finalize (this) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this private pure subroutine insert_knots (this, dir, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) private pure subroutine modify_Wc (this, W, num) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num private pure subroutine modify_Xc (this, X, num, dir) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir private pure subroutine remove_knots (this, dir, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) private pure subroutine rotate_Xc (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta private pure subroutine rotate_Xg (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta private pure subroutine set1 (this, knot1, knot2, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set knot vectors, control points and weights for the NURBS surface object. Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot1 (:) real(kind=rk), intent(in), contiguous :: knot2 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set2 (this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir1 (:) real(kind=rk), intent(in), contiguous :: Xth_dir2 (:) integer, intent(in), contiguous :: degree (:) integer, intent(in), contiguous :: continuity1 (:) integer, intent(in), contiguous :: continuity2 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set3 (this, nc, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier surface using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set_elem (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine set_elem_Xc_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine set_elem_Xg_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine set_tetragon (this, L, nc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: L (2) integer, intent(in) :: nc (2) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private impure subroutine show (this, vtkfile_Xc, vtkfile_Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg private pure subroutine translate_Xc (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) private pure subroutine translate_Xg (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:)","tags":"","loc":"module/forcad_nurbs_surface.html"},{"title":"forcad_nurbs_curve – ForCAD","text":"This module defines the 'nurbs_curve' type for representing a Non-Uniform Rational B-Spline (NURBS) curve. Uses forcad_utils module~~forcad_nurbs_curve~~UsesGraph module~forcad_nurbs_curve forcad_nurbs_curve module~forcad_utils forcad_utils module~forcad_nurbs_curve->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Used by module~~forcad_nurbs_curve~~UsedByGraph module~forcad_nurbs_curve forcad_nurbs_curve module~forcad forcad module~forcad->module~forcad_nurbs_curve program~example1_curve example1_curve program~example1_curve->module~forcad program~example3_surface example3_surface program~example3_surface->module~forcad program~example3_volume example3_volume program~example3_volume->module~forcad program~example_morph example_morph program~example_morph->module~forcad program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->module~forcad program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->module~forcad program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->module~forcad program~shape_circle shape_circle program~shape_circle->module~forcad program~shape_hexahedron shape_hexahedron program~shape_hexahedron->module~forcad program~shape_tetragon shape_tetragon program~shape_tetragon->module~forcad Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Derived Types type, public :: nurbs_curve Components Type Visibility Attributes Name Initial real(kind=rk), private, allocatable :: Wc (:) Weights for control points (1D array: [nc]) real(kind=rk), private, allocatable :: Xc (:,:) Control points (2D array: [nc, dim]) real(kind=rk), private, allocatable :: Xg (:,:) Geometry points (2D array: [ng, dim]) real(kind=rk), private, allocatable :: Xt (:) Evaluation points (1D array: [ng]) integer, private :: degree Degree (order) of the curve integer, private, allocatable :: elemConn (:,:) IGA element connectivity integer, private, allocatable :: elemConn_Xc_vis (:,:) Connectivity for visualization of control points integer, private, allocatable :: elemConn_Xg_vis (:,:) Connectivity for visualization of geometry points real(kind=rk), private, allocatable :: knot (:) Knot vector (1D array) integer, private :: nc Number of control points integer, private :: ng Number of geometry points Type-Bound Procedures procedure, public :: basis Compute the basis functions of the NURBS curve Read more… procedure, public :: cmp_elem Generate IGA element connectivity Read more… procedure, public :: cmp_elem_Xc_vis Generate connectivity for control points Read more… procedure, public :: cmp_elem_Xg_vis Generate connectivity for geometry points Read more… procedure, public :: create Generate geometry points Read more… procedure, public :: derivative Compute the derivative of the NURBS curve Read more… procedure, public :: elevate_degree Elevate the degree of the curve Read more… procedure, public :: export_Xc Export control points to VTK file Read more… procedure, public :: export_Xg Export geometry points to VTK file Read more… procedure, public :: finalize Finalize the NURBS curve object Read more… procedure, public :: get_Wc Get weights Read more… procedure, public :: get_Xc Get control points Read more… procedure, public :: get_Xg Get geometry points Read more… procedure, public :: get_Xt Get parameter values Read more… procedure, public :: get_continuity Get continuity of the curve Read more… procedure, public :: get_degree Get degree of the NURBS curve Read more… procedure, public :: get_elem Get IGA element connectivity Read more… procedure, public :: get_elem_Xc_vis Get connectivity for control points Read more… procedure, public :: get_elem_Xg_vis Get connectivity for geometry points Read more… generic, public :: get_knot => get_knoti , get_knot_all Get knot vector Read more… procedure, public :: get_multiplicity Get multiplicity of the knot vector Read more… procedure, public :: get_nc Get number of required control points Read more… procedure, public :: get_ng Get number of geometry points Read more… procedure, public :: insert_knots Insert knots into the knot vector Read more… procedure, public :: is_rational Check if the NURBS curve is rational Read more… procedure, public :: modify_Wc Modify weights Read more… procedure, public :: modify_Xc Modify control points Read more… procedure, public :: remove_knots Remove knots from the knot vector Read more… procedure, public :: rotate_Xc Rotate control points Read more… procedure, public :: rotate_Xg Rotate geometry points Read more… generic, public :: set => set1 , set2 , set3 Set NURBS curve Read more… procedure, public :: set1 Set knot vector, control points and weights for the NURBS curve object Read more… procedure, public :: set2 Set NURBS curve using nodes of parameter space, degree, continuity, control points and weights Read more… procedure, public :: set3 Set Bezier or Rational Bezier curve using control points and weights Read more… procedure, public :: set_circle Set a circle Read more… procedure, public :: set_elem Set IGA element connectivity Read more… procedure, public :: set_elem_Xc_vis Set connectivity for control points Read more… procedure, public :: set_elem_Xg_vis Set connectivity for geometry points Read more… procedure, public :: show Show the NURBS object using PyVista Read more… procedure, public :: translate_Xc Translate control points Read more… procedure, public :: translate_Xg Translate geometry points Read more… procedure, private :: get_knot_all Get all knot vectors Read more… procedure, private :: get_knoti Get i-th knot value Read more… Functions private pure function cmp_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function cmp_elem_Xc_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in), optional :: p Return Value integer, allocatable, (:,:) private pure function cmp_elem_Xg_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in), optional :: p Return Value integer, allocatable, (:,:) private pure function get_Wc (this) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) private pure function get_Xc (this) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xg (this) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xt (this) result(Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) private pure function get_continuity (this) result(c) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:) private pure function get_degree (this) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer private pure function get_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_elem_Xc_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_elem_Xg_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_knot_all (this) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) private pure function get_knoti (this, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: i Return Value real(kind=rk) private pure function get_multiplicity (this) result(m) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:) private pure function get_nc (this) result(nc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer private pure function get_ng (this) result(ng) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer private pure function is_rational (this) result(r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value logical Subroutines private pure subroutine basis (this, res, Xt, Tgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) private pure subroutine create (this, res, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) private pure subroutine derivative (this, res, Xt, dTgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) private pure subroutine elevate_degree (this, t) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in) :: t private impure subroutine export_Xc (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this character(len=*), intent(in) :: filename private impure subroutine export_Xg (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this character(len=*), intent(in) :: filename private pure subroutine finalize (this) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this private pure subroutine insert_knots (this, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) private pure subroutine modify_Wc (this, W, num) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num private pure subroutine modify_Xc (this, X, num, dir) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir private pure subroutine remove_knots (this, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) private pure subroutine rotate_Xc (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta private pure subroutine rotate_Xg (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta private pure subroutine set1 (this, knot, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set knot vector, control points and weights for the NURBS curve object. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set2 (this, Xth_dir, degree, continuity, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir (:) integer, intent(in) :: degree integer, intent(in), contiguous :: continuity (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set3 (this, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier curve using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set_circle (this, center, radius) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: center (:) real(kind=rk), intent(in) :: radius private pure subroutine set_elem (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine set_elem_Xc_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine set_elem_Xg_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private impure subroutine show (this, vtkfile_Xc, vtkfile_Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg private pure subroutine translate_Xc (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) private pure subroutine translate_Xg (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:)","tags":"","loc":"module/forcad_nurbs_curve.html"},{"title":"example_morph – ForCAD","text":"Uses forcad forcad_utils program~~example_morph~~UsesGraph program~example_morph example_morph module~forcad forcad program~example_morph->module~forcad module~forcad_utils forcad_utils program~example_morph->module~forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. You can create your shape or use a predefined one\nRead coordinates from file\nRead element connectivities from file\nSet a control shape that will be used to put the shape into\nThe contol shape is a hexahedron with 100x40x10 with 10x5x3 number of control points\nBy modifying the control shape you can modify the shape Map the shape into the shape Export the shape and the control shape to vtk files\nShow the control geometry and geometry using PyVista Calls program~~example_morph~~CallsGraph program~example_morph example_morph none~set nurbs_volume%set program~example_morph->none~set proc~export_xc nurbs_volume%export_Xc program~example_morph->proc~export_xc proc~export_xg nurbs_volume%export_Xg program~example_morph->proc~export_xg proc~hexahedron_xc hexahedron_Xc program~example_morph->proc~hexahedron_xc proc~put_to_nurbs nurbs_volume%put_to_nurbs program~example_morph->proc~put_to_nurbs proc~show nurbs_volume%show program~example_morph->proc~show proc~set1 nurbs_volume%set1 none~set->proc~set1 proc~set2 nurbs_volume%set2 none~set->proc~set2 proc~set3 nurbs_volume%set3 none~set->proc~set3 proc~cmp_elem_xc_vis nurbs_volume%cmp_elem_Xc_vis proc~export_xc->proc~cmp_elem_xc_vis proc~cmp_elem_xg_vis nurbs_volume%cmp_elem_Xg_vis proc~export_xg->proc~cmp_elem_xg_vis proc~basis_bspline basis_bspline proc~put_to_nurbs->proc~basis_bspline proc~kron kron proc~put_to_nurbs->proc~kron proc~set_elem_xg_vis nurbs_volume%set_elem_Xg_vis proc~put_to_nurbs->proc~set_elem_xg_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elem_xg_vis->interface~elemconn_c0 none~get_degree nurbs_volume%get_degree proc~set1->none~get_degree proc~get_nc nurbs_volume%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~get_degree_all nurbs_volume%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_volume%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables Type Attributes Name Initial real(kind=rk), allocatable :: X (:,:) type( nurbs_volume ) :: control_shape integer, allocatable :: elem (:,:) integer :: i integer :: nunit","tags":"","loc":"program/example_morph.html"},{"title":"shape_hexahedron – ForCAD","text":"Uses forcad program~~shape_hexahedron~~UsesGraph program~shape_hexahedron shape_hexahedron module~forcad forcad program~shape_hexahedron->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Set up a hexahedron shape with dimensions L = [2.0, 4.0, 8.0] and a specified number of control points nc = [4, 6, 8].\nThe weights of the control points (Wc) are optional. Export the control points to a VTK file for visualization. Create the shape using the specified number of elements in each direction. Export the geometry to a VTK file for visualization. Show the control geometry and geometry using PyVista Finalize and clean up the shape object. Calls program~~shape_hexahedron~~CallsGraph program~shape_hexahedron shape_hexahedron proc~create nurbs_volume%create program~shape_hexahedron->proc~create proc~export_xc nurbs_volume%export_Xc program~shape_hexahedron->proc~export_xc proc~export_xg nurbs_volume%export_Xg program~shape_hexahedron->proc~export_xg proc~finalize nurbs_volume%finalize program~shape_hexahedron->proc~finalize proc~set_hexahedron nurbs_volume%set_hexahedron program~shape_hexahedron->proc~set_hexahedron proc~show nurbs_volume%show program~shape_hexahedron->proc~show interface~ndgrid ndgrid proc~create->interface~ndgrid proc~basis_bspline basis_bspline proc~create->proc~basis_bspline proc~kron kron proc~create->proc~kron proc~cmp_elem_xc_vis nurbs_volume%cmp_elem_Xc_vis proc~export_xc->proc~cmp_elem_xc_vis proc~cmp_elem_xg_vis nurbs_volume%cmp_elem_Xg_vis proc~export_xg->proc~cmp_elem_xg_vis none~set nurbs_volume%set proc~set_hexahedron->none~set proc~hexahedron_xc hexahedron_Xc proc~set_hexahedron->proc~hexahedron_xc proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 proc~set1 nurbs_volume%set1 none~set->proc~set1 proc~set2 nurbs_volume%set2 none~set->proc~set2 proc~set3 nurbs_volume%set3 none~set->proc~set3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elem_xg_vis->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v none~get_degree nurbs_volume%get_degree proc~set1->none~get_degree proc~get_nc nurbs_volume%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~get_degree_all nurbs_volume%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_volume%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables Type Attributes Name Initial type( nurbs_volume ) :: shape","tags":"","loc":"program/shape_hexahedron.html"},{"title":"example_nurbs_curve – ForCAD","text":"Uses forcad program~~example_nurbs_curve~~UsesGraph program~example_nurbs_curve example_nurbs_curve module~forcad forcad program~example_nurbs_curve->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. This program demonstrates the usage of a NURBS curve object to create, and finalize a NURBS curve.\nIt sets up control points and weights, generates the curve, and exports the control points\nand 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 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 Calls program~~example_nurbs_curve~~CallsGraph program~example_nurbs_curve example_nurbs_curve none~set~3 nurbs_curve%set program~example_nurbs_curve->none~set~3 proc~create~3 nurbs_curve%create program~example_nurbs_curve->proc~create~3 proc~export_xc~3 nurbs_curve%export_Xc program~example_nurbs_curve->proc~export_xc~3 proc~export_xg~3 nurbs_curve%export_Xg program~example_nurbs_curve->proc~export_xg~3 proc~finalize~3 nurbs_curve%finalize program~example_nurbs_curve->proc~finalize~3 proc~generate_xc generate_Xc program~example_nurbs_curve->proc~generate_xc proc~show~3 nurbs_curve%show program~example_nurbs_curve->proc~show~3 proc~set1~3 nurbs_curve%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_curve%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_curve%set3 none~set~3->proc~set3~3 proc~basis_bspline basis_bspline proc~create~3->proc~basis_bspline proc~is_rational~3 nurbs_curve%is_rational proc~create~3->proc~is_rational~3 proc~cmp_elem_xc_vis~3 nurbs_curve%cmp_elem_Xc_vis proc~export_xc~3->proc~cmp_elem_xc_vis~3 proc~cmp_elem_xg_vis~3 nurbs_curve%cmp_elem_Xg_vis proc~export_xg~3->proc~cmp_elem_xg_vis~3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~get_degree nurbs_curve%get_degree proc~set1~3->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set3~3->proc~get_degree proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~3 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables 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 Functions function generate_Xc (num_coils, radius, height, num_points_per_coil) result(control_points) Arguments 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 Return Value real(kind=rk), allocatable, (:,:) Source Code 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 ) !> 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","tags":"","loc":"program/example_nurbs_curve.html"},{"title":"shape_tetragon – ForCAD","text":"Uses forcad program~~shape_tetragon~~UsesGraph program~shape_tetragon shape_tetragon module~forcad forcad program~shape_tetragon->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Set a tetragon with lengths of 2.0 and 3.0 and 3 and 4 control points in each direction\nThe weights of the control points (Wc) are optional. Export the control points to a VTK file Generate the NURBS surface with resolutions of 30 in both dimensions Export the generated surface to a VTK file Show the control geometry and geometry using PyVista Finalize the NURBS surface object Calls program~~shape_tetragon~~CallsGraph program~shape_tetragon shape_tetragon proc~create~2 nurbs_surface%create program~shape_tetragon->proc~create~2 proc~export_xc~2 nurbs_surface%export_Xc program~shape_tetragon->proc~export_xc~2 proc~export_xg~2 nurbs_surface%export_Xg program~shape_tetragon->proc~export_xg~2 proc~finalize~2 nurbs_surface%finalize program~shape_tetragon->proc~finalize~2 proc~set_tetragon nurbs_surface%set_tetragon program~shape_tetragon->proc~set_tetragon proc~show~2 nurbs_surface%show program~shape_tetragon->proc~show~2 interface~ndgrid ndgrid proc~create~2->interface~ndgrid proc~basis_bspline basis_bspline proc~create~2->proc~basis_bspline proc~is_rational~2 nurbs_surface%is_rational proc~create~2->proc~is_rational~2 proc~kron kron proc~create~2->proc~kron proc~cmp_elem_xc_vis~2 nurbs_surface%cmp_elem_Xc_vis proc~export_xc~2->proc~cmp_elem_xc_vis~2 proc~cmp_elem_xg_vis~2 nurbs_surface%cmp_elem_Xg_vis proc~export_xg~2->proc~cmp_elem_xg_vis~2 none~set~2 nurbs_surface%set proc~set_tetragon->none~set~2 proc~tetragon_xc tetragon_Xc proc~set_tetragon->proc~tetragon_xc proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 proc~set1~2 nurbs_surface%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_surface%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_surface%set3 none~set~2->proc~set3~2 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v none~get_degree~2 nurbs_surface%get_degree proc~set1~2->none~get_degree~2 proc~get_nc~2 nurbs_surface%get_nc proc~set1~2->proc~get_nc~2 proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set2~2->proc~get_nc~2 proc~set3~2->none~get_degree~2 proc~get_degree_all~2 nurbs_surface%get_degree_all none~get_degree~2->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_surface%get_degree_dir none~get_degree~2->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~2 proc~get_degree_dir~2->proc~get_multiplicity~2 proc~get_multiplicity~2->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables 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 real(kind=rk), allocatable :: knot1 (:) Arrays for knot vectors in both dimensions real(kind=rk), allocatable :: knot2 (:) Arrays for knot vectors in both dimensions type( nurbs_surface ) :: shape Declare a NURBS surface object","tags":"","loc":"program/shape_tetragon.html"},{"title":"shape_circle – ForCAD","text":"Uses forcad program~~shape_circle~~UsesGraph program~shape_circle shape_circle module~forcad forcad program~shape_circle->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Set a circle with radius 2.0 and center at [0.0, 0.0, 0.0] Export control points to a VTK file Generate the NURBS circle with a resolution of 100 Export the generated cirlce to a VTK file Show the control geometry and geometry using PyVista Finalize the NURBS curve object Calls program~~shape_circle~~CallsGraph program~shape_circle shape_circle proc~create~3 nurbs_curve%create program~shape_circle->proc~create~3 proc~export_xc~3 nurbs_curve%export_Xc program~shape_circle->proc~export_xc~3 proc~export_xg~3 nurbs_curve%export_Xg program~shape_circle->proc~export_xg~3 proc~finalize~3 nurbs_curve%finalize program~shape_circle->proc~finalize~3 proc~set_circle nurbs_curve%set_circle program~shape_circle->proc~set_circle proc~show~3 nurbs_curve%show program~shape_circle->proc~show~3 proc~basis_bspline basis_bspline proc~create~3->proc~basis_bspline proc~is_rational~3 nurbs_curve%is_rational proc~create~3->proc~is_rational~3 proc~cmp_elem_xc_vis~3 nurbs_curve%cmp_elem_Xc_vis proc~export_xc~3->proc~cmp_elem_xc_vis~3 proc~cmp_elem_xg_vis~3 nurbs_curve%cmp_elem_Xg_vis proc~export_xg~3->proc~cmp_elem_xg_vis~3 none~set~3 nurbs_curve%set proc~set_circle->none~set~3 proc~set1~3 nurbs_curve%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_curve%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_curve%set3 none~set~3->proc~set3~3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~get_degree nurbs_curve%get_degree proc~set1~3->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set3~3->proc~get_degree proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~3 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables Type Attributes Name Initial type( nurbs_curve ) :: shape","tags":"","loc":"program/shape_circle.html"},{"title":"example3_surface – ForCAD","text":"Uses forcad program~~example3_surface~~UsesGraph program~example3_surface example3_surface module~forcad forcad program~example3_surface->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. This program demonstrates the usage of a NURBS (Non-Uniform Rational B-Spline) surface object to create and finalize a NURBS surface.\nIt sets up control points, weights, and knot vectors for all three dimensions, generates the surface, and exports the control points and the surface to VTK files. Define control points for the NURBS surface Define weights for the control points\nDefine knot vectors for both dimensions\nSet knot vectors, control points, and weights for the NURBS surface object Export the control points to a VTK file Generate the NURBS surface with resolutions of 30 in both dimensions Export the generated surface to a VTK file Show the control geometry and geometry using PyVista Print size of the knot vectors\nInsert knots 0.25, twice and 0.75, once in both directions\nPrint size of the knot vectors after inserting knots\nPrint the degrees Elevate degree by 2 in both directions\nPrint the degrees after elevating Print size of the knot vectors\nRemove knots 0.25, twice and 0.75, once in both directions\nPrint size of the knot vectors after removing knots\nGenerate the refined NURBS surface with resolutions of 30 in both dimensions Export updated control points to a VTK file Export the refined generated surface to a VTK file Show the control geometry and geometry using PyVista Rotate the control points Rotate the generated curve Translate the control points Translate the generated curve Export the transformed control points to a VTK file Export the transformed generated volume to a VTK file Show the control geometry and geometry using PyVista Finalize the NURBS surface object Calls program~~example3_surface~~CallsGraph program~example3_surface example3_surface none~get_degree~2 nurbs_surface%get_degree program~example3_surface->none~get_degree~2 none~get_knot~2 nurbs_surface%get_knot program~example3_surface->none~get_knot~2 none~set~2 nurbs_surface%set program~example3_surface->none~set~2 proc~create~2 nurbs_surface%create program~example3_surface->proc~create~2 proc~elevate_degree~2 nurbs_surface%elevate_degree program~example3_surface->proc~elevate_degree~2 proc~export_xc~2 nurbs_surface%export_Xc program~example3_surface->proc~export_xc~2 proc~export_xg~2 nurbs_surface%export_Xg program~example3_surface->proc~export_xg~2 proc~finalize~2 nurbs_surface%finalize program~example3_surface->proc~finalize~2 proc~generate_xc~2 generate_Xc program~example3_surface->proc~generate_xc~2 proc~insert_knots~2 nurbs_surface%insert_knots program~example3_surface->proc~insert_knots~2 proc~remove_knots~2 nurbs_surface%remove_knots program~example3_surface->proc~remove_knots~2 proc~rotate_xc~2 nurbs_surface%rotate_Xc program~example3_surface->proc~rotate_xc~2 proc~rotate_xg~2 nurbs_surface%rotate_Xg program~example3_surface->proc~rotate_xg~2 proc~show~2 nurbs_surface%show program~example3_surface->proc~show~2 proc~translate_xc~2 nurbs_surface%translate_Xc program~example3_surface->proc~translate_xc~2 proc~translate_xg~2 nurbs_surface%translate_Xg program~example3_surface->proc~translate_xg~2 proc~get_degree_all~2 nurbs_surface%get_degree_all none~get_degree~2->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_surface%get_degree_dir none~get_degree~2->proc~get_degree_dir~2 proc~get_knot_all~2 nurbs_surface%get_knot_all none~get_knot~2->proc~get_knot_all~2 proc~get_knoti~2 nurbs_surface%get_knoti none~get_knot~2->proc~get_knoti~2 proc~set1~2 nurbs_surface%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_surface%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_surface%set3 none~set~2->proc~set3~2 interface~ndgrid ndgrid proc~create~2->interface~ndgrid proc~basis_bspline basis_bspline proc~create~2->proc~basis_bspline proc~is_rational~2 nurbs_surface%is_rational proc~create~2->proc~is_rational~2 proc~kron kron proc~create~2->proc~kron proc~elevate_degree~2->none~set~2 proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree~2->proc~elevate_degree_a_5_9 proc~elevate_degree~2->proc~is_rational~2 proc~cmp_elem_xc_vis~2 nurbs_surface%cmp_elem_Xc_vis proc~export_xc~2->proc~cmp_elem_xc_vis~2 proc~cmp_elem_xg_vis~2 nurbs_surface%cmp_elem_Xg_vis proc~export_xg~2->proc~cmp_elem_xg_vis~2 proc~insert_knots~2->none~set~2 interface~compute_multiplicity compute_multiplicity proc~insert_knots~2->interface~compute_multiplicity proc~findspan findspan proc~insert_knots~2->proc~findspan proc~insert_knot_a_5_1 insert_knot_A_5_1 proc~insert_knots~2->proc~insert_knot_a_5_1 proc~insert_knots~2->proc~is_rational~2 proc~remove_knots~2->none~set~2 proc~remove_knots~2->interface~compute_multiplicity proc~remove_knots~2->proc~findspan proc~remove_knots~2->proc~is_rational~2 proc~remove_knots_a_5_8 remove_knots_A_5_8 proc~remove_knots~2->proc~remove_knots_a_5_8 proc~rotation rotation proc~rotate_xc~2->proc~rotation proc~rotate_xg~2->proc~rotation proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~bincoeff bincoeff proc~elevate_degree_a_5_9->proc~bincoeff proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~2 proc~get_degree_dir~2->proc~get_multiplicity~2 cosd cosd proc~rotation->cosd sind sind proc~rotation->sind proc~set1~2->none~get_degree~2 proc~get_nc~2 nurbs_surface%get_nc proc~set1~2->proc~get_nc~2 proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set2~2->proc~get_nc~2 proc~set3~2->none~get_degree~2 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~factln factln proc~bincoeff->proc~factln proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~2->interface~compute_multiplicity proc~get_nc~2->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables 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 real(kind=rk) :: knot1 (6) Arrays for knot vectors in both dimensions real(kind=rk) :: knot2 (6) Arrays for knot vectors in both dimensions type( nurbs_surface ) :: nurbs Declare a NURBS surface object Functions function generate_Xc (num_rows, num_cols, peak_height) result(control_points) Arguments Type Intent Optional Attributes Name integer, intent(in) :: num_rows integer, intent(in) :: num_cols real(kind=rk), intent(in) :: peak_height Return Value real(kind=rk), allocatable, (:,:) Source Code program example3_surface use forcad implicit none type ( nurbs_surface ) :: nurbs !! Declare a NURBS surface object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights real ( rk ) :: knot1 ( 6 ), knot2 ( 6 ) !! Arrays for knot vectors in both dimensions !----------------------------------------------------------------------------- ! Setting up the NURBS surface !----------------------------------------------------------------------------- !> Define control points for the NURBS surface Xc = generate_Xc ( 3 , 3 , 1.0_rk ) !> Define weights for the control points allocate ( Wc ( size ( Xc , 1 ))) Wc = 1.0_rk Wc ( 2 ) = 2.0_rk !> Define knot vectors for both dimensions knot1 = [ 0.0_rk , 0.0_rk , 0.0_rk , 1.0_rk , 1.0_rk , 1.0_rk ] knot2 = [ 0.0_rk , 0.0_rk , 0.0_rk , 1.0_rk , 1.0_rk , 1.0_rk ] !> Set knot vectors, control points, and weights for the NURBS surface object call nurbs % set ( knot1 , knot2 , Xc , Wc ) !> Export the control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_surface_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS surface !----------------------------------------------------------------------------- !> Generate the NURBS surface with resolutions of 30 in both dimensions call nurbs % create ( 30 , 30 ) !> Export the generated surface to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_surface_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/nurbs_surface_Xc.vtk' , 'vtk/nurbs_surface_Xg.vtk' ) !----------------------------------------------------------------------------- ! Refinements !----------------------------------------------------------------------------- !> Print size of the knot vectors print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) !> Insert knots 0.25, twice and 0.75, once in both directions call nurbs % insert_knots ( 1 , [ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) ! direction 1 call nurbs % insert_knots ( 2 , [ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) ! direction 2 !> Print size of the knot vectors after inserting knots print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) !> Print the degrees print * , nurbs % get_degree () !> Elevate degree by 2 in both directions call nurbs % elevate_degree ( 1 , 2 ) ! direction 1 call nurbs % elevate_degree ( 2 , 2 ) ! direction 2 !> Print the degrees after elevating print * , nurbs % get_degree () !> Print size of the knot vectors print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) !> Remove knots 0.25, twice and 0.75, once in both directions call nurbs % remove_knots ( 1 , [ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) ! direction 1 call nurbs % remove_knots ( 2 , [ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) ! direction 2 !> Print size of the knot vectors after removing knots print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) !> Generate the refined NURBS surface with resolutions of 30 in both dimensions call nurbs % create () !> Export updated control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_surface_Xc2.vtk' ) !> Export the refined generated surface to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_surface_Xg2.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/nurbs_surface_Xc2.vtk' , 'vtk/nurbs_surface_Xg2.vtk' ) !----------------------------------------------------------------------------- ! Transformations !----------------------------------------------------------------------------- !> Rotate the control points call nurbs % rotate_Xc ( alpha = 4 5.0_rk , beta = 0.0_rk , theta = 9 0.0_rk ) !> Rotate the generated curve call nurbs % rotate_Xg ( alpha =- 4 5.0_rk , beta = 0.0_rk , theta =- 9 0.0_rk ) !> Translate the control points call nurbs % translate_Xc ([ 1.0_rk , 2.0_rk , - 3.0_rk ]) !> Translate the generated curve call nurbs % translate_Xg ([ - 1.0_rk , - 2.0_rk , 3.0_rk ]) !> Export the transformed control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_surface_Xc3.vtk' ) !> Export the transformed generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_surface_Xg3.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/nurbs_surface_Xc3.vtk' , 'vtk/nurbs_surface_Xg3.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS surface object call nurbs % finalize () contains !----------------------------------------------------------------------------- function generate_Xc ( num_rows , num_cols , peak_height ) result ( control_points ) integer , intent ( in ) :: num_rows , num_cols real ( rk ), intent ( in ) :: peak_height real ( rk ), allocatable :: control_points (:,:) integer :: i , j real ( rk ) :: x_spacing , y_spacing , x_offset , y_offset x_spacing = 1.0_rk / real ( num_cols - 1 , rk ) y_spacing = 1.0_rk / real ( num_rows - 1 , rk ) x_offset = - 0.5_rk y_offset = - 0.5_rk allocate ( control_points ( num_rows * num_cols , 3 )) do i = 1 , num_rows do j = 1 , num_cols control_points (( i - 1 ) * num_cols + j , 1 ) = x_offset + real ( j - 1 , rk ) * x_spacing control_points (( i - 1 ) * num_cols + j , 2 ) = y_offset + real ( i - 1 , rk ) * y_spacing control_points (( i - 1 ) * num_cols + j , 3 ) = & peak_height * exp ( - (( control_points (( i - 1 ) * num_cols + j , 1 ) ** 2 ) & + ( control_points (( i - 1 ) * num_cols + j , 2 ) ** 2 ))) + 0.5_rk * peak_height * 0.2_rk end do end do end function !----------------------------------------------------------------------------- end program example3_surface","tags":"","loc":"program/example3_surface.html"},{"title":"example3_volume – ForCAD","text":"Uses forcad program~~example3_volume~~UsesGraph program~example3_volume example3_volume module~forcad forcad program~example3_volume->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. This program demonstrates the usage of a NURBS (Non-Uniform Rational B-Spline) volume object to create and finalize a NURBS volume.\nIt sets up control points, weights, and knot vectors for all three dimensions, generates the volume, and exports the control points and the volume to VTK files. Define the control points for the NURBS volume Define weights for the control points (optional)\nDefine knot vectors for all three dimensions\nSet knot vectors, control points, and weights for the NURBS volume object\nWc is optional. Export the control points to a VTK file Generate the NURBS volume with resolutions of 20, 20, and 20 in the three dimensions Export the generated volume to a VTK file Show the control geometry and geometry using PyVista Print size of knot vectors\nInsert knots 0.25 and 0.75 in all three directions\nPrint size of knot vectors after inserting knots\nPrint degrees Elevate degree by 2 in all three directions\nPrint degrees after elevating Print size of knot vectors\nPrint size of knot vectors after removing knots\nGenerate the refined NURBS volume with resolutions of 40, 40, and 40 in the three dimensions Export updated control points to a VTK file Export the refined generated volume to a VTK file Show the control geometry and geometry using PyVista Rotate the control points Rotate the generated curve Translate the control points Translate the generated curve Export the transformed control points to a VTK file Export the transformed generated volume to a VTK file Show the control geometry and geometry using PyVista Finalize the NURBS volume object Calls program~~example3_volume~~CallsGraph program~example3_volume example3_volume none~get_degree nurbs_volume%get_degree program~example3_volume->none~get_degree none~get_knot nurbs_volume%get_knot program~example3_volume->none~get_knot none~set nurbs_volume%set program~example3_volume->none~set proc~create nurbs_volume%create program~example3_volume->proc~create proc~elevate_degree nurbs_volume%elevate_degree program~example3_volume->proc~elevate_degree proc~export_xc nurbs_volume%export_Xc program~example3_volume->proc~export_xc proc~export_xg nurbs_volume%export_Xg program~example3_volume->proc~export_xg proc~finalize nurbs_volume%finalize program~example3_volume->proc~finalize proc~generate_xc~3 generate_Xc program~example3_volume->proc~generate_xc~3 proc~insert_knots nurbs_volume%insert_knots program~example3_volume->proc~insert_knots proc~remove_knots nurbs_volume%remove_knots program~example3_volume->proc~remove_knots proc~rotate_xc nurbs_volume%rotate_Xc program~example3_volume->proc~rotate_xc proc~rotate_xg nurbs_volume%rotate_Xg program~example3_volume->proc~rotate_xg proc~show nurbs_volume%show program~example3_volume->proc~show proc~translate_xc nurbs_volume%translate_Xc program~example3_volume->proc~translate_xc proc~translate_xg nurbs_volume%translate_Xg program~example3_volume->proc~translate_xg proc~get_degree_all nurbs_volume%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_volume%get_degree_dir none~get_degree->proc~get_degree_dir proc~get_knot_all nurbs_volume%get_knot_all none~get_knot->proc~get_knot_all proc~get_knoti nurbs_volume%get_knoti none~get_knot->proc~get_knoti proc~set1 nurbs_volume%set1 none~set->proc~set1 proc~set2 nurbs_volume%set2 none~set->proc~set2 proc~set3 nurbs_volume%set3 none~set->proc~set3 interface~ndgrid ndgrid proc~create->interface~ndgrid proc~basis_bspline basis_bspline proc~create->proc~basis_bspline proc~kron kron proc~create->proc~kron proc~elevate_degree->none~set proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree->proc~elevate_degree_a_5_9 proc~cmp_elem_xc_vis nurbs_volume%cmp_elem_Xc_vis proc~export_xc->proc~cmp_elem_xc_vis proc~cmp_elem_xg_vis nurbs_volume%cmp_elem_Xg_vis proc~export_xg->proc~cmp_elem_xg_vis proc~insert_knots->none~set interface~compute_multiplicity compute_multiplicity proc~insert_knots->interface~compute_multiplicity proc~findspan findspan proc~insert_knots->proc~findspan proc~insert_knot_a_5_1 insert_knot_A_5_1 proc~insert_knots->proc~insert_knot_a_5_1 proc~remove_knots->none~set proc~remove_knots->interface~compute_multiplicity proc~remove_knots->proc~findspan proc~remove_knots_a_5_8 remove_knots_A_5_8 proc~remove_knots->proc~remove_knots_a_5_8 proc~rotation rotation proc~rotate_xc->proc~rotation proc~rotate_xg->proc~rotation proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elem_xg_vis->interface~elemconn_c0 proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~bincoeff bincoeff proc~elevate_degree_a_5_9->proc~bincoeff proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity cosd cosd proc~rotation->cosd sind sind proc~rotation->sind proc~set1->none~get_degree proc~get_nc nurbs_volume%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~factln factln proc~bincoeff->proc~factln proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity->interface~compute_multiplicity proc~get_nc->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables 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 real(kind=rk) :: knot1 (4) Arrays for knot vectors in all three dimensions real(kind=rk) :: knot2 (4) Arrays for knot vectors in all three dimensions real(kind=rk) :: knot3 (4) Arrays for knot vectors in all three dimensions type( nurbs_volume ) :: nurbs Declare a NURBS volume object Functions function generate_Xc (L) result(control_points) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: L Return Value real(kind=rk), allocatable, (:,:) Source Code program example3_volume use forcad , only : rk , nurbs_volume implicit none type ( nurbs_volume ) :: nurbs !! Declare a NURBS volume object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights real ( rk ) :: knot1 ( 4 ), knot2 ( 4 ), knot3 ( 4 ) !! Arrays for knot vectors in all three dimensions !----------------------------------------------------------------------------- ! Setting up the NURBS volume !----------------------------------------------------------------------------- !> Define the control points for the NURBS volume Xc = generate_Xc ( 5.0_rk ) !> Define weights for the control points (optional) allocate ( Wc ( size ( Xc , 1 )), source = 1.0_rk ) Wc ( 2 ) = 5.0_rk !> Define knot vectors for all three dimensions 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 ] !> Set knot vectors, control points, and weights for the NURBS volume object !> Wc is optional. call nurbs % set ( knot1 , knot2 , knot3 , Xc , Wc ) !> Export the control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_volume_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS volume !----------------------------------------------------------------------------- !> Generate the NURBS volume with resolutions of 20, 20, and 20 in the three dimensions call nurbs % create ( 20 , 20 , 20 ) !> Export the generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_volume_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/nurbs_volume_Xc.vtk' , 'vtk/nurbs_volume_Xg.vtk' ) !----------------------------------------------------------------------------- ! Refinements !----------------------------------------------------------------------------- !> Print size of knot vectors print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) print * , size ( nurbs % get_knot ( 3 )) !> Insert knots 0.25 and 0.75 in all three directions call nurbs % insert_knots ( 1 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 1 call nurbs % insert_knots ( 2 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 2 call nurbs % insert_knots ( 3 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 3 !> Print size of knot vectors after inserting knots print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) print * , size ( nurbs % get_knot ( 3 )) !> Print degrees print * , nurbs % get_degree () !> Elevate degree by 2 in all three directions call nurbs % elevate_degree ( 1 , 2 ) ! direction 1 call nurbs % elevate_degree ( 2 , 2 ) ! direction 2 call nurbs % elevate_degree ( 3 , 2 ) ! direction 3 !> Print degrees after elevating print * , nurbs % get_degree () !> Print size of knot vectors print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) print * , size ( nurbs % get_knot ( 3 )) call nurbs % remove_knots ( 1 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 1 call nurbs % remove_knots ( 2 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 2 call nurbs % remove_knots ( 3 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 3 !> Print size of knot vectors after removing knots print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) print * , size ( nurbs % get_knot ( 3 )) !> Generate the refined NURBS volume with resolutions of 40, 40, and 40 in the three dimensions call nurbs % create () !> Export updated control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_volume_Xc2.vtk' ) !> Export the refined generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_volume_Xg2.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/nurbs_volume_Xc2.vtk' , 'vtk/nurbs_volume_Xg2.vtk' ) !----------------------------------------------------------------------------- ! Transformations !----------------------------------------------------------------------------- !> Rotate the control points call nurbs % rotate_Xc ( alpha =- 4 5.0_rk , beta = 0.0_rk , theta = 9 0.0_rk ) !> Rotate the generated curve call nurbs % rotate_Xg ( alpha =- 4 5.0_rk , beta = 0.0_rk , theta = 9 0.0_rk ) !> Translate the control points call nurbs % translate_Xc ([ 1.0_rk , 2.0_rk , - 3.0_rk ]) !> Translate the generated curve call nurbs % translate_Xg ([ 1.0_rk , 2.0_rk , - 3.0_rk ]) !> Export the transformed control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_volume_Xc3.vtk' ) !> Export the transformed generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_volume_Xg3.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/nurbs_volume_Xc3.vtk' , 'vtk/nurbs_volume_Xg3.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS volume object call nurbs % finalize () contains !----------------------------------------------------------------------------- function generate_Xc ( L ) result ( control_points ) implicit none real ( rk ), intent ( in ) :: L real ( rk ), allocatable :: control_points (:,:) real ( rk ) :: L2 L2 = L / 2.0_rk allocate ( control_points ( 8 , 3 )) control_points ( 1 ,:) = [ L2 , - L2 , L2 ] control_points ( 2 ,:) = [ L2 , - L2 , - L2 ] control_points ( 3 ,:) = [ - L2 , - L2 , L2 ] control_points ( 4 ,:) = [ - L2 , - L2 , - L2 ] control_points ( 5 ,:) = [ L2 , L2 , L2 ] control_points ( 6 ,:) = [ L2 , L2 , - L2 ] control_points ( 7 ,:) = [ - L2 , L2 , L2 ] control_points ( 8 ,:) = [ - L2 , L2 , - L2 ] end function !----------------------------------------------------------------------------- end program example3_volume","tags":"","loc":"program/example3_volume.html"},{"title":"example_nurbs_volume – ForCAD","text":"Uses forcad program~~example_nurbs_volume~~UsesGraph program~example_nurbs_volume example_nurbs_volume module~forcad forcad program~example_nurbs_volume->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. This program demonstrates the usage of a NURBS volume object to create, and finalize a NURBS volume.\nIt sets up control points and weights, generates the volume, and exports the control points\nand the volume to VTK files at various stages. Define control points for the NURBS volume Define weights for the control points Set control points and weights for the NURBS volume object Export initial control points to a VTK file Generate the NURBS volume with a resolution of 15X15X15 Export the generated volume to a VTK file Show the control geometry and geometry using PyVista Finalize the NURBS volume object Calls program~~example_nurbs_volume~~CallsGraph program~example_nurbs_volume example_nurbs_volume none~set nurbs_volume%set program~example_nurbs_volume->none~set proc~create nurbs_volume%create program~example_nurbs_volume->proc~create proc~export_xc nurbs_volume%export_Xc program~example_nurbs_volume->proc~export_xc proc~export_xg nurbs_volume%export_Xg program~example_nurbs_volume->proc~export_xg proc~finalize nurbs_volume%finalize program~example_nurbs_volume->proc~finalize proc~generate_xc~4 generate_Xc program~example_nurbs_volume->proc~generate_xc~4 proc~show nurbs_volume%show program~example_nurbs_volume->proc~show proc~set1 nurbs_volume%set1 none~set->proc~set1 proc~set2 nurbs_volume%set2 none~set->proc~set2 proc~set3 nurbs_volume%set3 none~set->proc~set3 interface~ndgrid ndgrid proc~create->interface~ndgrid proc~basis_bspline basis_bspline proc~create->proc~basis_bspline proc~kron kron proc~create->proc~kron proc~cmp_elem_xc_vis nurbs_volume%cmp_elem_Xc_vis proc~export_xc->proc~cmp_elem_xc_vis proc~cmp_elem_xg_vis nurbs_volume%cmp_elem_Xg_vis proc~export_xg->proc~cmp_elem_xg_vis proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elem_xg_vis->interface~elemconn_c0 none~get_degree nurbs_volume%get_degree proc~set1->none~get_degree proc~get_nc nurbs_volume%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~get_degree_all nurbs_volume%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_volume%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity nurbs_volume%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables 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_volume ) :: nurbs Declare a NURBS volume object Functions function generate_Xc (L) result(control_points) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: L Return Value real(kind=rk), allocatable, (:,:) Source Code program example_nurbs_volume use forcad , only : rk , nurbs_volume implicit none type ( nurbs_volume ) :: nurbs !! Declare a NURBS volume object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights !----------------------------------------------------------------------------- ! Setting up the NURBS volume !----------------------------------------------------------------------------- !> Define control points for the NURBS volume Xc = generate_Xc ( 1.0_rk ) !> Define weights for the control points allocate ( Wc ( size ( Xc , 1 )), source = 1.0_rk ) !> Set control points and weights for the NURBS volume object call nurbs % set ([ 2 , 2 , 2 ], Xc , Wc ) !> Export initial control points to a VTK file call nurbs % export_Xc ( 'vtk/demo_volume_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS volume !----------------------------------------------------------------------------- !> Generate the NURBS volume with a resolution of 15X15X15 call nurbs % create ( 15 , 15 , 15 ) !> Export the generated volume to a VTK file call nurbs % export_Xg ( 'vtk/demo_volume_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_volume_Xc.vtk' , 'vtk/demo_volume_Xg.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS volume object call nurbs % finalize () contains !----------------------------------------------------------------------------- function generate_Xc ( L ) result ( control_points ) implicit none real ( rk ), intent ( in ) :: L real ( rk ), allocatable :: control_points (:,:) real ( rk ) :: L2 L2 = L / 2.0_rk allocate ( control_points ( 8 , 3 )) control_points ( 1 ,:) = [ L2 , - L2 , L2 ] control_points ( 2 ,:) = [ L2 , - L2 , - L2 ] control_points ( 3 ,:) = [ - L2 , - L2 , L2 ] control_points ( 4 ,:) = [ - L2 , - L2 , - L2 ] control_points ( 5 ,:) = [ L2 , L2 , L2 ] control_points ( 6 ,:) = [ L2 , L2 , - L2 ] control_points ( 7 ,:) = [ - L2 , L2 , L2 ] control_points ( 8 ,:) = [ - L2 , L2 , - L2 ] end function !----------------------------------------------------------------------------- end program example_nurbs_volume","tags":"","loc":"program/example_nurbs_volume.html"},{"title":"example_nurbs_surface – ForCAD","text":"Uses forcad program~~example_nurbs_surface~~UsesGraph program~example_nurbs_surface example_nurbs_surface module~forcad forcad program~example_nurbs_surface->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. This program demonstrates the usage of a NURBS surface object to create, and finalize a NURBS surface.\nIt sets up control points and weights, generates the surface, and exports the control points\nand the surface to VTK files at various stages. Define control points for the NURBS surface Define weights for the control points Set control points and weights for the NURBS surface object Export initial control points to a VTK file Generate the NURBS surface with a resolution of 30x30 Export the generated surface to a VTK file Show the control geometry and geometry using PyVista Finalize the NURBS surface object Calls program~~example_nurbs_surface~~CallsGraph program~example_nurbs_surface example_nurbs_surface none~set~2 nurbs_surface%set program~example_nurbs_surface->none~set~2 proc~create~2 nurbs_surface%create program~example_nurbs_surface->proc~create~2 proc~export_xc~2 nurbs_surface%export_Xc program~example_nurbs_surface->proc~export_xc~2 proc~export_xg~2 nurbs_surface%export_Xg program~example_nurbs_surface->proc~export_xg~2 proc~finalize~2 nurbs_surface%finalize program~example_nurbs_surface->proc~finalize~2 proc~generate_xc~5 generate_Xc program~example_nurbs_surface->proc~generate_xc~5 proc~show~2 nurbs_surface%show program~example_nurbs_surface->proc~show~2 proc~set1~2 nurbs_surface%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_surface%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_surface%set3 none~set~2->proc~set3~2 interface~ndgrid ndgrid proc~create~2->interface~ndgrid proc~basis_bspline basis_bspline proc~create~2->proc~basis_bspline proc~is_rational~2 nurbs_surface%is_rational proc~create~2->proc~is_rational~2 proc~kron kron proc~create~2->proc~kron proc~cmp_elem_xc_vis~2 nurbs_surface%cmp_elem_Xc_vis proc~export_xc~2->proc~cmp_elem_xc_vis~2 proc~cmp_elem_xg_vis~2 nurbs_surface%cmp_elem_Xg_vis proc~export_xg~2->proc~cmp_elem_xg_vis~2 proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elem_xg_vis~2->interface~elemconn_c0 none~get_degree~2 nurbs_surface%get_degree proc~set1~2->none~get_degree~2 proc~get_nc~2 nurbs_surface%get_nc proc~set1~2->proc~get_nc~2 proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set2~2->proc~get_nc~2 proc~set3~2->none~get_degree~2 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~get_degree_all~2 nurbs_surface%get_degree_all none~get_degree~2->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_surface%get_degree_dir none~get_degree~2->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity~2 nurbs_surface%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~2 proc~get_degree_dir~2->proc~get_multiplicity~2 proc~get_multiplicity~2->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables 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_surface ) :: nurbs Declare a NURBS surface object Functions function generate_Xc (num_rows, num_cols, peak_height) result(control_points) Arguments Type Intent Optional Attributes Name integer, intent(in) :: num_rows integer, intent(in) :: num_cols real(kind=rk), intent(in) :: peak_height Return Value real(kind=rk), allocatable, (:,:) Source Code program example_nurbs_surface use forcad , only : rk , nurbs_surface implicit none type ( nurbs_surface ) :: nurbs !! Declare a NURBS surface object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights !----------------------------------------------------------------------------- ! Setting up the NURBS surface !----------------------------------------------------------------------------- !> Define control points for the NURBS surface Xc = generate_Xc ( 10 , 10 , 1.5_rk ) !> Define weights for the control points allocate ( Wc ( size ( Xc , 1 )), source = 1.0_rk ) !> Set control points and weights for the NURBS surface object call nurbs % set ([ 10 , 10 ], Xc , Wc ) !> Export initial control points to a VTK file call nurbs % export_Xc ( 'vtk/demo_surface_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS surface !----------------------------------------------------------------------------- !> Generate the NURBS surface with a resolution of 30x30 call nurbs % create ( res1 = 30 , res2 = 30 ) !> Export the generated surface to a VTK file call nurbs % export_Xg ( 'vtk/demo_surface_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_surface_Xc.vtk' , 'vtk/demo_surface_Xg.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS surface object call nurbs % finalize () contains !----------------------------------------------------------------------------- function generate_Xc ( num_rows , num_cols , peak_height ) result ( control_points ) integer , intent ( in ) :: num_rows , num_cols real ( rk ), intent ( in ) :: peak_height real ( rk ), allocatable :: control_points (:,:) integer :: i , j real ( rk ) :: x_spacing , y_spacing , x_offset , y_offset x_spacing = 1.0_rk / real ( num_cols - 1 , rk ) y_spacing = 1.0_rk / real ( num_rows - 1 , rk ) x_offset = - 0.5_rk y_offset = - 0.5_rk allocate ( control_points ( num_rows * num_cols , 3 )) do i = 1 , num_rows do j = 1 , num_cols control_points (( i - 1 ) * num_cols + j , 1 ) = x_offset + real ( j - 1 , rk ) * x_spacing control_points (( i - 1 ) * num_cols + j , 2 ) = y_offset + real ( i - 1 , rk ) * y_spacing control_points (( i - 1 ) * num_cols + j , 3 ) = & peak_height * exp ( - (( control_points (( i - 1 ) * num_cols + j , 1 ) ** 2 ) & + ( control_points (( i - 1 ) * num_cols + j , 2 ) ** 2 ))) + 0.5_rk * peak_height * 0.2_rk end do end do end function !----------------------------------------------------------------------------- end program example_nurbs_surface","tags":"","loc":"program/example_nurbs_surface.html"},{"title":"example1_curve – ForCAD","text":"Uses forcad program~~example1_curve~~UsesGraph program~example1_curve example1_curve module~forcad forcad program~example1_curve->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. This program demonstrates the usage of a NURBS (Non-Uniform Rational B-Spline) curve object to create and finalize a NURBS curve.\nIt sets up control points, weights, and knot vectors for all three dimensions, generates the curve, and exports the control points and the curve to VTK files. Define control points for the NURBS curve\nDefine weights for the control points (optional)\nDefine knot vector Set knot vector, control points, and weights for the NURBS curve object.\nWc is optional Export control points to a VTK file Generate the NURBS curve with a resolution of 20 Export the generated curve to a VTK file Show the control geometry and geometry using PyVista Print size of the knot vector Insert knots 0.25, twice and 0.75, once Print size of the updated knot vector Print the degree of the curve Elevate the degree of the curve (2 times) Print the updated degree of the curve Print size of the knot vector Remove knots 0.25, twice and 0.75, once Print size of the updated knot vector Generate the refined curve with a resolution of 20 Export updated control points to a VTK file Export the refined generated curve to a VTK file Show the control geometry and geometry using PyVista Rotate the control points Rotate the generated curve Translate the control points Translate the generated curve Export the transformed control points to a VTK file Export the transformed generated volume to a VTK file Show the control geometry and geometry using PyVista Finalize the NURBS curve object Calls program~~example1_curve~~CallsGraph program~example1_curve example1_curve none~get_knot~3 nurbs_curve%get_knot program~example1_curve->none~get_knot~3 none~set~3 nurbs_curve%set program~example1_curve->none~set~3 proc~create~3 nurbs_curve%create program~example1_curve->proc~create~3 proc~elevate_degree~3 nurbs_curve%elevate_degree program~example1_curve->proc~elevate_degree~3 proc~export_xc~3 nurbs_curve%export_Xc program~example1_curve->proc~export_xc~3 proc~export_xg~3 nurbs_curve%export_Xg program~example1_curve->proc~export_xg~3 proc~finalize~3 nurbs_curve%finalize program~example1_curve->proc~finalize~3 proc~get_degree nurbs_curve%get_degree program~example1_curve->proc~get_degree proc~insert_knots~3 nurbs_curve%insert_knots program~example1_curve->proc~insert_knots~3 proc~remove_knots~3 nurbs_curve%remove_knots program~example1_curve->proc~remove_knots~3 proc~rotate_xc~3 nurbs_curve%rotate_Xc program~example1_curve->proc~rotate_xc~3 proc~rotate_xg~3 nurbs_curve%rotate_Xg program~example1_curve->proc~rotate_xg~3 proc~show~3 nurbs_curve%show program~example1_curve->proc~show~3 proc~translate_xc~3 nurbs_curve%translate_Xc program~example1_curve->proc~translate_xc~3 proc~translate_xg~3 nurbs_curve%translate_Xg program~example1_curve->proc~translate_xg~3 proc~get_knot_all~3 nurbs_curve%get_knot_all none~get_knot~3->proc~get_knot_all~3 proc~get_knoti~3 nurbs_curve%get_knoti none~get_knot~3->proc~get_knoti~3 proc~set1~3 nurbs_curve%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_curve%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_curve%set3 none~set~3->proc~set3~3 proc~basis_bspline basis_bspline proc~create~3->proc~basis_bspline proc~is_rational~3 nurbs_curve%is_rational proc~create~3->proc~is_rational~3 proc~elevate_degree~3->none~set~3 proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree~3->proc~elevate_degree_a_5_9 proc~elevate_degree~3->proc~is_rational~3 proc~cmp_elem_xc_vis~3 nurbs_curve%cmp_elem_Xc_vis proc~export_xc~3->proc~cmp_elem_xc_vis~3 proc~cmp_elem_xg_vis~3 nurbs_curve%cmp_elem_Xg_vis proc~export_xg~3->proc~cmp_elem_xg_vis~3 proc~get_multiplicity~3 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~3 proc~insert_knots~3->none~set~3 interface~compute_multiplicity compute_multiplicity proc~insert_knots~3->interface~compute_multiplicity proc~findspan findspan proc~insert_knots~3->proc~findspan proc~insert_knot_a_5_1 insert_knot_A_5_1 proc~insert_knots~3->proc~insert_knot_a_5_1 proc~insert_knots~3->proc~is_rational~3 proc~remove_knots~3->none~set~3 proc~remove_knots~3->interface~compute_multiplicity proc~remove_knots~3->proc~findspan proc~remove_knots~3->proc~is_rational~3 proc~remove_knots_a_5_8 remove_knots_A_5_8 proc~remove_knots~3->proc~remove_knots_a_5_8 proc~rotation rotation proc~rotate_xc~3->proc~rotation proc~rotate_xg~3->proc~rotation proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~bincoeff bincoeff proc~elevate_degree_a_5_9->proc~bincoeff proc~get_multiplicity~3->interface~compute_multiplicity cosd cosd proc~rotation->cosd sind sind proc~rotation->sind proc~set1~3->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set3~3->proc~get_degree proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~factln factln proc~bincoeff->proc~factln proc~repelem repelem proc~compute_knot_vector->proc~repelem Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables 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 real(kind=rk) :: knot (6) Array for knot vector type( nurbs_curve ) :: nurbs Declare a NURBS curve object Source Code program example1_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 real ( rk ) :: knot ( 6 ) !! Array for knot vector !----------------------------------------------------------------------------- ! Setting up the NURBS curve !----------------------------------------------------------------------------- !> Define control points for the NURBS curve allocate ( Xc ( 3 , 3 )) Xc ( 1 ,:) = [ 0.0_rk , 0.0_rk , 0.0_rk ] Xc ( 2 ,:) = [ 0.0_rk , 5.0_rk , 0.0_rk ] Xc ( 3 ,:) = [ 5.0_rk , 5.0_rk , 0.0_rk ] !> Define weights for the control points (optional) allocate ( Wc ( 3 )) Wc = [ 1.0_rk , 2.0_rk , 0.3_rk ] !> Define knot vector knot = [ 0.0_rk , 0.0_rk , 0.0_rk , 1.0_rk , 1.0_rk , 1.0_rk ] !> Set knot vector, control points, and weights for the NURBS curve object. !> Wc is optional call nurbs % set ( knot , Xc , Wc ) !> Export control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_curve_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS curve !----------------------------------------------------------------------------- !> Generate the NURBS curve with a resolution of 20 call nurbs % create ( res = 20 ) !> Export the generated curve to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_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/nurbs_curve_Xc.vtk' , 'vtk/nurbs_curve_Xg.vtk' ) !----------------------------------------------------------------------------- ! Refinements !----------------------------------------------------------------------------- !> Print size of the knot vector print * , size ( nurbs % get_knot ()) !> Insert knots 0.25, twice and 0.75, once call nurbs % insert_knots ([ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) !> Print size of the updated knot vector print * , size ( nurbs % get_knot ()) !> Print the degree of the curve print * , nurbs % get_degree () !> Elevate the degree of the curve (2 times) call nurbs % elevate_degree ( 2 ) !> Print the updated degree of the curve print * , nurbs % get_degree () !> Print size of the knot vector print * , size ( nurbs % get_knot ()) !> Remove knots 0.25, twice and 0.75, once call nurbs % remove_knots ([ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) !> Print size of the updated knot vector print * , size ( nurbs % get_knot ()) !> Generate the refined curve with a resolution of 20 call nurbs % create () !> Export updated control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_curve_Xc2.vtk' ) !> Export the refined generated curve to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_curve_Xg2.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/nurbs_curve_Xc2.vtk' , 'vtk/nurbs_curve_Xg2.vtk' ) !----------------------------------------------------------------------------- ! Transformations !----------------------------------------------------------------------------- !> Rotate the control points call nurbs % rotate_Xc ( alpha = 4 5.0_rk , beta = 0.0_rk , theta = 9 0.0_rk ) !> Rotate the generated curve call nurbs % rotate_Xg ( alpha =- 4 5.0_rk , beta = 0.0_rk , theta =- 9 0.0_rk ) !> Translate the control points call nurbs % translate_Xc ([ 1.0_rk , 2.0_rk , - 3.0_rk ]) !> Translate the generated curve call nurbs % translate_Xg ([ - 1.0_rk , - 2.0_rk , 3.0_rk ]) !> Export the transformed control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_curve_Xc3.vtk' ) !> Export the transformed generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_curve_Xg3.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/nurbs_curve_Xc3.vtk' , 'vtk/nurbs_curve_Xg3.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS curve object call nurbs % finalize () end program example1_curve","tags":"","loc":"program/example1_curve.html"},{"title":"forcad_nurbs_volume.f90 – ForCAD","text":"This file depends on sourcefile~~forcad_nurbs_volume.f90~~EfferentGraph sourcefile~forcad_nurbs_volume.f90 forcad_nurbs_volume.f90 sourcefile~forcad_utils.f90 forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Files dependent on this one sourcefile~~forcad_nurbs_volume.f90~~AfferentGraph sourcefile~forcad_nurbs_volume.f90 forcad_nurbs_volume.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~forcad.f90->sourcefile~forcad_nurbs_volume.f90 sourcefile~demo_curve.f90 demo_curve.f90 sourcefile~demo_curve.f90->sourcefile~forcad.f90 sourcefile~demo_surface.f90 demo_surface.f90 sourcefile~demo_surface.f90->sourcefile~forcad.f90 sourcefile~demo_volume.f90 demo_volume.f90 sourcefile~demo_volume.f90->sourcefile~forcad.f90 sourcefile~example_curve_1.f90 example_curve_1.f90 sourcefile~example_curve_1.f90->sourcefile~forcad.f90 sourcefile~example_surface_1.f90 example_surface_1.f90 sourcefile~example_surface_1.f90->sourcefile~forcad.f90 sourcefile~example_volume_1.f90 example_volume_1.f90 sourcefile~example_volume_1.f90->sourcefile~forcad.f90 sourcefile~put_to_nurbs.f90 put_to_nurbs.f90 sourcefile~put_to_nurbs.f90->sourcefile~forcad.f90 sourcefile~shape_circle.f90 shape_circle.f90 sourcefile~shape_circle.f90->sourcefile~forcad.f90 sourcefile~shape_hexahedron.f90 shape_hexahedron.f90 sourcefile~shape_hexahedron.f90->sourcefile~forcad.f90 sourcefile~shape_tetragon.f90 shape_tetragon.f90 sourcefile~shape_tetragon.f90->sourcefile~forcad.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> This module defines the 'nurbs_volume' type for representing a Non-Uniform Rational B-Spline (NURBS) volume. module forcad_nurbs_volume use forcad_utils , only : rk , basis_bspline , elemConn_C0 , kron , ndgrid , compute_multiplicity , compute_knot_vector , & basis_bspline_der , insert_knot_A_5_1 , findspan , elevate_degree_A_5_9 , hexahedron_Xc , remove_knots_A_5_8 , & elemConn_Cn , unique , rotation implicit none private public nurbs_volume !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause type nurbs_volume real ( rk ), allocatable , private :: Xc (:,:) !! Control points (2D array: [nc(1)*nc(2)*nc(3), dim]) real ( rk ), allocatable , private :: Xg (:,:) !! Geometry points (2D array: [ng(1)*ng(2)*ng(3), dim]) real ( rk ), allocatable , private :: Wc (:) !! Weights for the control points (1D array: [nc(1)*nc(2)*nc(3)]) real ( rk ), allocatable , private :: Xt1 (:) !! Evaluation parameter values in the first direction (1D array: [ng(1)]) real ( rk ), allocatable , private :: Xt2 (:) !! Evaluation parameter values in the second direction (1D array: [ng(2)]) real ( rk ), allocatable , private :: Xt3 (:) !! Evaluation parameter values in the third direction (1D array: [ng(3)]) real ( rk ), allocatable , private :: knot1 (:) !! Knot vector in the first direction (1D array) real ( rk ), allocatable , private :: knot2 (:) !! Knot vector in the second direction (1D array) real ( rk ), allocatable , private :: knot3 (:) !! Knot vector in the third direction (1D array) integer , private :: degree ( 3 ) !! Degree (order) of the volume integer , private :: nc ( 3 ) !! Number of control points in each direction integer , private :: ng ( 3 ) !! Number of geometry points in each direction integer , allocatable , private :: elemConn_Xc_vis (:,:) !! Connectivity for visualization of control points integer , allocatable , private :: elemConn_Xg_vis (:,:) !! Connectivity for visualization of geometry points integer , allocatable , private :: elemConn (:,:) !! IGA element connectivity contains procedure :: set1 !!> Set knot vectors, control points and weights for the NURBS volume object procedure :: set2 !!> Set NURBS volume using nodes of parameter space, degree, continuity, control points and weights procedure :: set3 !!> Set Bezier or Rational Bezier volume using control points and weights generic :: set => set1 , set2 , set3 !!> Set NURBS volume procedure :: create !!> Generate geometry points procedure :: get_Xc !!> Get control points procedure :: get_Xg !!> Get geometry points procedure :: get_Wc !!> Get weights procedure :: get_Xt !!> Get parameter values procedure , private :: get_knot_all !!> Get all knot vectors procedure , private :: get_knoti !!> Get i-th knot value generic :: get_knot => get_knoti , get_knot_all !!> Get knot vector procedure :: get_ng !!> Get number of geometry points procedure , private :: get_degree_all !!> Get degree of the NURBS volume in all directions procedure , private :: get_degree_dir !!> Get degree of the NURBS volume in a specific direction generic :: get_degree => get_degree_all , get_degree_dir !!> Get degree of the NURBS volume procedure :: finalize !!> Finalize the NURBS volume object procedure :: cmp_elem_Xc_vis !!> Generate connectivity for control points procedure :: cmp_elem_Xg_vis !!> Generate connectivity for geometry points procedure :: cmp_elem !!> Generate IGA element connectivity procedure :: get_elem_Xc_vis !!> Get connectivity for control points procedure :: get_elem_Xg_vis !!> Get connectivity for geometry points procedure :: get_elem !!> Get IGA element connectivity procedure :: set_elem_Xc_vis !!> Set connectivity for control points procedure :: set_elem_Xg_vis !!> Set connectivity for geometry points procedure :: set_elem !!> Set IGA element connectivity procedure :: export_Xc !!> Export control points to VTK file procedure :: export_Xg !!> Export geometry points to VTK file procedure :: modify_Xc !!> Modify control points procedure :: modify_Wc !!> Modify weights procedure :: get_multiplicity !!> Get multiplicity of the knot vector procedure :: get_continuity !!> Get continuity of the volume procedure :: get_nc !!> Get number of required control points procedure :: derivative !!> Compute the derivative of the NURBS volume procedure :: basis !!> Compute the basis functions of the NURBS volume procedure :: insert_knots !!> Insert knots into the knot vector procedure :: elevate_degree !!> Elevate the degree of the NURBS volume procedure :: is_rational !!> Check if the NURBS volume is rational procedure :: put_to_nurbs !!> Put a shape to a NURBS volume procedure :: remove_knots !!> Remove knots from the knot vector procedure :: rotate_Xc !!> Rotate control points procedure :: rotate_Xg !!> Rotate geometry points procedure :: translate_Xc !!> Translate control points procedure :: translate_Xg !!> Translate geometry points procedure :: show !!> Show the NURBS object using PyVista ! Shapes procedure :: set_hexahedron !!> Set a hexahedron end type !=============================================================================== contains !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set control points and weights for the NURBS volume object. pure subroutine set1 ( this , knot1 , knot2 , knot3 , Xc , Wc ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: knot1 (:), knot2 (:), knot3 (:) real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) if ( allocated ( this % knot1 )) deallocate ( this % knot1 ) if ( allocated ( this % knot2 )) deallocate ( this % knot2 ) if ( allocated ( this % knot3 )) deallocate ( this % knot3 ) if ( allocated ( this % Xc )) deallocate ( this % Xc ) this % knot1 = knot1 this % knot2 = knot2 this % knot3 = knot3 this % degree = this % get_degree () this % nc ( 1 ) = this % get_nc ( 1 ) this % nc ( 2 ) = this % get_nc ( 2 ) this % nc ( 3 ) = this % get_nc ( 3 ) this % Xc = Xc if ( present ( Wc )) then if ( size ( Wc ) /= this % nc ( 1 ) * this % nc ( 2 ) * this % nc ( 3 )) then error stop 'Number of weights does not match the number of control points.' else if ( allocated ( this % Wc )) deallocate ( this % Wc ) this % Wc = Wc end if end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set control points and weights for the NURBS volume object. pure subroutine set2 ( this , Xth_dir1 , Xth_dir2 , Xth_dir3 , degree , continuity1 , continuity2 , continuity3 , Xc , Wc ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: Xth_dir1 (:), Xth_dir2 (:), Xth_dir3 (:) integer , intent ( in ), contiguous :: degree (:) integer , intent ( in ), contiguous :: continuity1 (:), continuity2 (:), continuity3 (:) real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) this % knot1 = compute_knot_vector ( Xth_dir1 , degree ( 1 ), continuity1 ) this % knot2 = compute_knot_vector ( Xth_dir2 , degree ( 2 ), continuity2 ) this % knot3 = compute_knot_vector ( Xth_dir3 , degree ( 3 ), continuity3 ) this % degree ( 1 ) = degree ( 1 ) this % degree ( 2 ) = degree ( 2 ) this % degree ( 3 ) = degree ( 3 ) this % nc ( 1 ) = this % get_nc ( 1 ) this % nc ( 2 ) = this % get_nc ( 2 ) this % nc ( 3 ) = this % get_nc ( 3 ) this % Xc = Xc if ( present ( Wc )) this % Wc = Wc end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set Bezier or Rational Bezier volume using control points and weights. pure subroutine set3 ( this , nc , Xc , Wc ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ), contiguous :: nc (:) real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) if ( allocated ( this % Xc )) deallocate ( this % Xc ) this % Xc = Xc this % nc = nc if ( allocated ( this % knot1 )) deallocate ( this % knot1 ) allocate ( this % knot1 ( 2 * this % nc ( 1 ))) this % knot1 ( 1 : this % nc ( 1 )) = 0.0_rk this % knot1 ( this % nc ( 1 ) + 1 : 2 * this % nc ( 1 )) = 1.0_rk if ( allocated ( this % knot2 )) deallocate ( this % knot2 ) allocate ( this % knot2 ( 2 * this % nc ( 2 ))) this % knot2 ( 1 : this % nc ( 2 )) = 0.0_rk this % knot2 ( this % nc ( 2 ) + 1 : 2 * this % nc ( 2 )) = 1.0_rk if ( allocated ( this % knot3 )) deallocate ( this % knot3 ) allocate ( this % knot3 ( 2 * this % nc ( 3 ))) this % knot3 ( 1 : this % nc ( 3 )) = 0.0_rk this % knot3 ( this % nc ( 3 ) + 1 : 2 * this % nc ( 3 )) = 1.0_rk this % degree = this % get_degree () if ( present ( Wc )) then if ( size ( Wc ) /= this % nc ( 1 ) * this % nc ( 2 ) * this % nc ( 3 )) then error stop 'Number of weights does not match the number of control points.' else if ( allocated ( this % Wc )) deallocate ( this % Wc ) this % Wc = Wc end if end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine create ( this , res1 , res2 , res3 , Xt1 , Xt2 , Xt3 , Xt ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ), optional :: res1 , res2 , res3 real ( rk ), intent ( in ), contiguous , optional :: Xt1 (:), Xt2 (:), Xt3 (:) real ( rk ), intent ( in ), contiguous , optional :: Xt (:,:) integer :: i , j real ( rk ), allocatable :: Tgc1 (:), Tgc2 (:), Tgc3 (:), Tgc (:) real ( rk ), allocatable :: Xt_ (:,:) ! check if (. not . allocated ( this % Xc )) then error stop 'Control points are not set.' end if if (. not . allocated ( this % knot1 ) . or . . not . allocated ( this % knot2 ) . or . . not . allocated ( this % knot3 )) then error stop 'Knot vector(s) is/are not set.' end if ! Set parameter values if ( present ( Xt1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) this % Xt1 = Xt1 elseif ( present ( res1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) allocate ( this % Xt1 ( res1 )) this % Xt1 = [( real ( i - 1 , rk ) / real ( res1 - 1 , rk ), i = 1 , res1 )] ! else ! this%Xt1 = this%Xt1 end if ! Set parameter values if ( present ( Xt2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) this % Xt2 = Xt2 elseif ( present ( res2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) allocate ( this % Xt2 ( res2 )) this % Xt2 = [( real ( i - 1 , rk ) / real ( res2 - 1 , rk ), i = 1 , res2 )] ! else ! this%Xt2 = this%Xt2 end if ! Set parameter values if ( present ( Xt3 )) then if ( allocated ( this % Xt3 )) deallocate ( this % Xt3 ) this % Xt3 = Xt3 elseif ( present ( res3 )) then if ( allocated ( this % Xt3 )) deallocate ( this % Xt3 ) allocate ( this % Xt3 ( res3 )) this % Xt3 = [( real ( i - 1 , rk ) / real ( res3 - 1 , rk ), i = 1 , res3 )] ! else ! this%Xt3 = this%Xt3 end if if ( present ( Xt )) then Xt_ = Xt else ! Set number of geometry points this % ng ( 1 ) = size ( this % Xt1 , 1 ) this % ng ( 2 ) = size ( this % Xt2 , 1 ) this % ng ( 3 ) = size ( this % Xt3 , 1 ) call ndgrid ( this % Xt1 , this % Xt2 , this % Xt3 , Xt_ ) end if if ( allocated ( this % Xg )) deallocate ( this % Xg ) allocate ( this % Xg ( size ( Xt_ , 1 ), size ( this % Xc , 2 ))) if ( allocated ( this % Wc )) then ! NURBS volume do i = 1 , size ( Xt_ , 1 ) Tgc1 = basis_bspline ( Xt_ ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt_ ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgc3 = basis_bspline ( Xt_ ( i , 3 ), this % knot3 , this % nc ( 3 ), this % degree ( 3 )) Tgc = kron ( Tgc3 , kron ( Tgc2 , Tgc1 )) Tgc = Tgc * ( this % Wc / ( dot_product ( Tgc , this % Wc ))) do j = 1 , size ( this % Xc , 2 ) this % Xg ( i , j ) = dot_product ( Tgc , this % Xc (:, j )) end do end do else do i = 1 , size ( Xt_ , 1 ) Tgc1 = basis_bspline ( Xt_ ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt_ ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgc3 = basis_bspline ( Xt_ ( i , 3 ), this % knot3 , this % nc ( 3 ), this % degree ( 3 )) Tgc = kron ( Tgc3 , kron ( Tgc2 , Tgc1 )) do j = 1 , size ( this % Xc , 2 ) this % Xg ( i , j ) = dot_product ( Tgc , this % Xc (:, j )) end do end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xc ( this ) result ( Xc ) class ( nurbs_volume ), intent ( in ) :: this real ( rk ), allocatable :: Xc (:,:) if ( allocated ( this % Xc )) then Xc = this % Xc else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xg ( this ) result ( Xg ) class ( nurbs_volume ), intent ( in ) :: this real ( rk ), allocatable :: Xg (:,:) if ( allocated ( this % Xg )) then Xg = this % Xg else error stop 'Geometry points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Wc ( this ) result ( Wc ) class ( nurbs_volume ), intent ( in ) :: this real ( rk ), allocatable :: Wc (:) if ( allocated ( this % Wc )) then Wc = this % Wc else error stop 'The NURBS volume is not rational.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xt ( this , dir ) result ( Xt ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: dir real ( rk ), allocatable :: Xt (:) if ( dir == 1 ) then if ( allocated ( this % Xt1 )) then Xt = this % Xt1 else error stop 'Parameter values are not set.' end if elseif ( dir == 2 ) then if ( allocated ( this % Xt2 )) then Xt = this % Xt2 else error stop 'Parameter values are not set.' end if elseif ( dir == 3 ) then if ( allocated ( this % Xt3 )) then Xt = this % Xt3 else error stop 'Parameter values are not set.' end if else error stop 'Invalid direction for parameter values.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_ng ( this ) result ( ng ) class ( nurbs_volume ), intent ( in ) :: this integer :: ng ( 3 ) ng = this % ng end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_degree_all ( this ) result ( degree ) class ( nurbs_volume ), intent ( in ) :: this integer :: degree ( 3 ) integer , allocatable :: m1 (:), m2 (:), m3 (:) m1 = this % get_multiplicity ( 1 ) m2 = this % get_multiplicity ( 2 ) m3 = this % get_multiplicity ( 3 ) degree ( 1 ) = m1 ( 1 ) - 1 degree ( 2 ) = m2 ( 1 ) - 1 degree ( 3 ) = m3 ( 1 ) - 1 end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_degree_dir ( this , dir ) result ( degree ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: dir integer :: degree integer , allocatable :: m1 (:), m2 (:), m3 (:) if ( dir == 1 ) then m1 = this % get_multiplicity ( 1 ) degree = m1 ( 1 ) - 1 else if ( dir == 2 ) then m2 = this % get_multiplicity ( 2 ) degree = m2 ( 1 ) - 1 else if ( dir == 3 ) then m3 = this % get_multiplicity ( 3 ) degree = m3 ( 1 ) - 1 else error stop 'Invalid direction for degree.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_knot_all ( this , dir ) result ( knot ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: dir real ( rk ), allocatable :: knot (:) if ( dir == 1 ) then if ( allocated ( this % knot1 )) then knot = this % knot1 else error stop 'Knot vector is not set.' end if elseif ( dir == 2 ) then if ( allocated ( this % knot2 )) then knot = this % knot2 else error stop 'Knot vector is not set.' end if elseif ( dir == 3 ) then if ( allocated ( this % knot3 )) then knot = this % knot3 else error stop 'Knot vector is not set.' end if else error stop 'Invalid direction for knot vector.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_knoti ( this , dir , i ) result ( knot ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: dir integer , intent ( in ) :: i real ( rk ) :: knot if ( dir == 1 ) then if ( allocated ( this % knot1 )) then if ( i < 1 . or . i > size ( this % knot1 )) then error stop 'Invalid index for knot vector.' else knot = this % knot1 ( i ) end if else error stop 'Knot vector is not set.' end if elseif ( dir == 2 ) then if ( allocated ( this % knot2 )) then if ( i < 1 . or . i > size ( this % knot2 )) then error stop 'Invalid index for knot vector.' else knot = this % knot2 ( i ) end if else error stop 'Knot vector is not set.' end if elseif ( dir == 3 ) then if ( allocated ( this % knot3 )) then if ( i < 1 . or . i > size ( this % knot3 )) then error stop 'Invalid index for knot vector.' else knot = this % knot3 ( i ) end if else error stop 'Knot vector is not set.' end if else error stop 'Invalid direction for knot vector.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine finalize ( this ) class ( nurbs_volume ), intent ( inout ) :: this if ( allocated ( this % Xc )) deallocate ( this % Xc ) if ( allocated ( this % Xg )) deallocate ( this % Xg ) if ( allocated ( this % Wc )) deallocate ( this % Wc ) if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) if ( allocated ( this % Xt3 )) deallocate ( this % Xt3 ) if ( allocated ( this % knot1 )) deallocate ( this % knot1 ) if ( allocated ( this % knot2 )) deallocate ( this % knot2 ) if ( allocated ( this % knot3 )) deallocate ( this % knot3 ) if ( allocated ( this % elemConn_Xc_vis )) deallocate ( this % elemConn_Xc_vis ) if ( allocated ( this % elemConn_Xg_vis )) deallocate ( this % elemConn_Xg_vis ) if ( allocated ( this % elemConn )) deallocate ( this % elemConn ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem_Xc_vis ( this , p ) result ( elemConn ) class ( nurbs_volume ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) integer , intent ( in ), contiguous , optional :: p (:) if ( present ( p )) then elemConn = elemConn_C0 ( this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), p ( 1 ), p ( 2 ), p ( 3 )) else elemConn = elemConn_C0 ( this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), 1 , 1 , 1 ) end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem_Xg_vis ( this , p ) result ( elemConn ) class ( nurbs_volume ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) integer , intent ( in ), contiguous , optional :: p (:) if ( present ( p )) then elemConn = elemConn_C0 ( this % ng ( 1 ), this % ng ( 2 ), this % ng ( 3 ), p ( 1 ), p ( 2 ), p ( 3 )) else elemConn = elemConn_C0 ( this % ng ( 1 ), this % ng ( 2 ), this % ng ( 3 ), 1 , 1 , 1 ) end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine export_Xc ( this , filename ) class ( nurbs_volume ), intent ( in ) :: this character ( len =* ), intent ( in ) :: filename integer :: i , nc , nunit integer , allocatable :: elemConn (:,:) ! check if (. not . allocated ( this % Xc )) then error stop 'Control points are not set.' end if if (. not . allocated ( this % elemConn_Xc_vis )) then elemConn = this % cmp_elem_Xc_vis () else elemConn = this % elemConn_Xc_vis end if nc = size ( this % Xc , 1 ) open ( newunit = nunit , file = filename , action = 'write' ) write ( nunit , '(a)' ) '# vtk DataFile Version 2.0' write ( nunit , '(a)' ) 'Generated by ForCAD' write ( nunit , '(a)' ) 'ASCII' write ( nunit , '(a)' ) 'DATASET UNSTRUCTURED_GRID' write ( nunit , '(a,\" \",g0,\" \",a)' ) 'POINTS' , nc , 'double' if ( size ( this % Xc , 2 ) == 2 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xc ( i , 1 ), this % Xc ( i , 2 ), 0.0_rk , i = 1 , nc ) elseif ( size ( this % Xc , 2 ) == 3 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xc ( i , 1 ), this % Xc ( i , 2 ), this % Xc ( i , 3 ) , i = 1 , nc ) else error stop 'Invalid dimension for control points.' end if write ( nunit , '(a,\" \",g0,\" \",g0)' ) 'CELLS' , size ( elemConn , 1 ), size ( elemConn , 1 ) * ( size ( elemConn , 2 ) + 1 ) write ( nunit , '(g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0)' )& ( 8 , elemConn ( i , 1 ) - 1 , elemConn ( i , 2 ) - 1 , elemConn ( i , 4 ) - 1 , elemConn ( i , 3 ) - 1 ,& elemConn ( i , 5 ) - 1 , elemConn ( i , 6 ) - 1 , elemConn ( i , 8 ) - 1 , elemConn ( i , 7 ) - 1 , i = 1 , size ( elemConn , 1 )) write ( nunit , '(a,\" \",g0)' ) 'CELL_TYPES' , size ( elemConn , 1 ) write ( nunit , '(g0)' ) ( 12 , i = 1 , size ( elemConn , 1 )) close ( nunit ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine export_Xg ( this , filename ) class ( nurbs_volume ), intent ( in ) :: this character ( len =* ), intent ( in ) :: filename integer :: i , ng , nunit integer , allocatable :: elemConn (:,:) ! check if (. not . allocated ( this % Xg )) then error stop 'Geometry points are not set.' end if if (. not . allocated ( this % elemConn_Xg_vis )) then elemConn = this % cmp_elem_Xg_vis () else elemConn = this % elemConn_Xg_vis end if ng = size ( this % Xg , 1 ) open ( newunit = nunit , file = filename , action = 'write' ) write ( nunit , '(a)' ) '# vtk DataFile Version 2.0' write ( nunit , '(a)' ) 'Generated by ForCAD' write ( nunit , '(a)' ) 'ASCII' write ( nunit , '(a)' ) 'DATASET UNSTRUCTURED_GRID' write ( nunit , '(a,\" \",g0,\" \",a)' ) 'POINTS' , ng , 'double' if ( size ( this % Xg , 2 ) == 2 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xg ( i , 1 ), this % Xg ( i , 2 ), 0.0_rk , i = 1 , ng ) elseif ( size ( this % Xg , 2 ) == 3 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xg ( i , 1 ), this % Xg ( i , 2 ), this % Xg ( i , 3 ) , i = 1 , ng ) else error stop 'Invalid dimension for geometry points.' end if write ( nunit , '(a,\" \",g0,\" \",g0)' ) 'CELLS' , size ( elemConn , 1 ), size ( elemConn , 1 ) * ( size ( elemConn , 2 ) + 1 ) write ( nunit , '(g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0)' )& ( 8 , elemConn ( i , 1 ) - 1 , elemConn ( i , 2 ) - 1 , elemConn ( i , 4 ) - 1 , elemConn ( i , 3 ) - 1 ,& elemConn ( i , 5 ) - 1 , elemConn ( i , 6 ) - 1 , elemConn ( i , 8 ) - 1 , elemConn ( i , 7 ) - 1 , i = 1 , size ( elemConn , 1 )) write ( nunit , '(a,\" \",g0)' ) 'CELL_TYPES' , size ( elemConn , 1 ) write ( nunit , '(g0)' ) ( 12 , i = 1 , size ( elemConn , 1 )) close ( nunit ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine modify_Xc ( this , X , num , dir ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ) :: X integer , intent ( in ) :: num integer , intent ( in ) :: dir if ( allocated ( this % Xc )) then this % Xc ( num , dir ) = X call this % set ( knot1 = this % knot1 , knot2 = this % knot2 , knot3 = this % knot3 , Xc = this % Xc , Wc = this % Wc ) else error stop 'Control points are not set.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine modify_Wc ( this , W , num ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ) :: W integer , intent ( in ) :: num real ( rk ), allocatable :: knot1 (:), knot2 (:), knot3 (:), Xc (:,:), Wc (:) if ( allocated ( this % Wc )) then this % Wc ( num ) = W Xc = this % Xc Wc = this % Wc if ( allocated ( this % knot1 ) . and . allocated ( this % knot2 ) . and . allocated ( this % knot3 )) then knot1 = this % knot1 knot2 = this % knot2 knot3 = this % knot3 call this % set ( knot1 = knot1 , knot2 = knot2 , knot3 = knot3 , Xc = Xc , Wc = Wc ) else call this % set ( nc = this % nc , Xc = Xc , Wc = Wc ) end if else error stop 'The NURBS volume is not rational.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_multiplicity ( this , dir ) result ( m ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: dir integer , allocatable :: m (:) if ( dir == 1 ) then ! check if (. not . allocated ( this % knot1 )) then error stop 'Knot vector is not set.' else m = compute_multiplicity ( this % knot1 ) end if elseif ( dir == 2 ) then ! check if (. not . allocated ( this % knot2 )) then error stop 'Knot vector is not set.' else m = compute_multiplicity ( this % knot2 ) end if elseif ( dir == 3 ) then ! check if (. not . allocated ( this % knot3 )) then error stop 'Knot vector is not set.' else m = compute_multiplicity ( this % knot3 ) end if else error stop 'Invalid direction.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_continuity ( this , dir ) result ( c ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: dir integer , allocatable :: c (:) if ( dir == 1 ) then ! check if (. not . allocated ( this % knot1 )) then error stop 'Knot vector is not set.' else c = this % degree ( 1 ) - compute_multiplicity ( this % knot1 ) end if elseif ( dir == 2 ) then ! check if (. not . allocated ( this % knot2 )) then error stop 'Knot vector is not set.' else c = this % degree ( 2 ) - compute_multiplicity ( this % knot2 ) end if elseif ( dir == 3 ) then ! check if (. not . allocated ( this % knot3 )) then error stop 'Knot vector is not set.' else c = this % degree ( 3 ) - compute_multiplicity ( this % knot3 ) end if else error stop 'Invalid direction.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_nc ( this , dir ) result ( nc ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: dir integer :: nc if ( dir == 1 ) then ! check if (. not . allocated ( this % knot1 )) then error stop 'Knot vector is not set.' else nc = sum ( compute_multiplicity ( this % knot1 )) - this % degree ( 1 ) - 1 end if elseif ( dir == 2 ) then ! check if (. not . allocated ( this % knot2 )) then error stop 'Knot vector is not set.' else nc = sum ( compute_multiplicity ( this % knot2 )) - this % degree ( 2 ) - 1 end if elseif ( dir == 3 ) then ! check if (. not . allocated ( this % knot3 )) then error stop 'Knot vector is not set.' else nc = sum ( compute_multiplicity ( this % knot3 )) - this % degree ( 3 ) - 1 end if else error stop 'Invalid direction.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine derivative ( this , res1 , res2 , res3 , Xt1 , Xt2 , Xt3 , dTgc ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ), optional :: res1 , res2 , res3 real ( rk ), intent ( in ), contiguous , optional :: Xt1 (:), Xt2 (:), Xt3 (:) real ( rk ), allocatable , intent ( out ) :: dTgc (:,:) real ( rk ), allocatable :: dTgci (:) integer :: i real ( rk ), allocatable :: dTgc1 (:), dTgc2 (:), dTgc3 (:) real ( rk ), allocatable :: Xt (:,:) ! Set parameter values if ( present ( Xt1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) this % Xt1 = Xt1 elseif ( present ( res1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) allocate ( this % Xt1 ( res1 )) this % Xt1 = [( real ( i - 1 , rk ) / real ( res1 - 1 , rk ), i = 1 , res1 )] ! else ! this%Xt1 = this%Xt1 end if ! Set parameter values if ( present ( Xt2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) this % Xt2 = Xt2 elseif ( present ( res2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) allocate ( this % Xt2 ( res2 )) this % Xt2 = [( real ( i - 1 , rk ) / real ( res2 - 1 , rk ), i = 1 , res2 )] ! else ! this%Xt2 = this%Xt2 end if ! Set parameter values if ( present ( Xt3 )) then if ( allocated ( this % Xt3 )) deallocate ( this % Xt3 ) this % Xt3 = Xt3 elseif ( present ( res3 )) then if ( allocated ( this % Xt3 )) deallocate ( this % Xt3 ) allocate ( this % Xt3 ( res3 )) this % Xt3 = [( real ( i - 1 , rk ) / real ( res3 - 1 , rk ), i = 1 , res3 )] ! else ! this%Xt3 = this%Xt3 end if ! Set number of geometry points this % ng ( 1 ) = size ( this % Xt1 , 1 ) this % ng ( 2 ) = size ( this % Xt2 , 1 ) this % ng ( 3 ) = size ( this % Xt3 , 1 ) call ndgrid ( this % Xt1 , this % Xt2 , this % Xt3 , Xt ) allocate ( dTgc ( this % ng ( 1 ) * this % ng ( 2 ) * this % ng ( 3 ), this % nc ( 1 ) * this % nc ( 2 ) * this % nc ( 3 ))) if ( allocated ( this % Wc )) then ! NURBS volume do i = 1 , size ( Xt , 1 ) dTgc1 = basis_bspline_der ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) dTgc2 = basis_bspline_der ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) dTgc3 = basis_bspline_der ( Xt ( i , 3 ), this % knot3 , this % nc ( 3 ), this % degree ( 3 )) dTgci = kron ( dTgc3 , kron ( dTgc2 , dTgc1 )) dTgci = dTgci * ( this % Wc / ( dot_product ( dTgci , this % Wc ))) dTgc ( i ,:) = dTgci end do else do i = 1 , size ( Xt , 1 ) dTgc1 = basis_bspline_der ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) dTgc2 = basis_bspline_der ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) dTgc3 = basis_bspline_der ( Xt ( i , 3 ), this % knot3 , this % nc ( 3 ), this % degree ( 3 )) dTgci = kron ( dTgc3 , kron ( dTgc2 , dTgc1 )) dTgc ( i ,:) = dTgci end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine basis ( this , res1 , res2 , res3 , Xt1 , Xt2 , Xt3 , Tgc ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ), optional :: res1 , res2 , res3 real ( rk ), intent ( in ), contiguous , optional :: Xt1 (:), Xt2 (:), Xt3 (:) real ( rk ), allocatable , intent ( out ) :: Tgc (:,:) real ( rk ), allocatable :: Tgci (:) integer :: i real ( rk ), allocatable :: Tgc1 (:), Tgc2 (:), Tgc3 (:) real ( rk ), allocatable :: Xt (:,:) ! Set parameter values if ( present ( Xt1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) this % Xt1 = Xt1 elseif ( present ( res1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) allocate ( this % Xt1 ( res1 )) this % Xt1 = [( real ( i - 1 , rk ) / real ( res1 - 1 , rk ), i = 1 , res1 )] ! else ! this%Xt1 = this%Xt1 end if ! Set parameter values if ( present ( Xt2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) this % Xt2 = Xt2 elseif ( present ( res2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) allocate ( this % Xt2 ( res2 )) this % Xt2 = [( real ( i - 1 , rk ) / real ( res2 - 1 , rk ), i = 1 , res2 )] ! else ! this%Xt2 = this%Xt2 end if ! Set parameter values if ( present ( Xt3 )) then if ( allocated ( this % Xt3 )) deallocate ( this % Xt3 ) this % Xt3 = Xt3 elseif ( present ( res3 )) then if ( allocated ( this % Xt3 )) deallocate ( this % Xt3 ) allocate ( this % Xt3 ( res3 )) this % Xt3 = [( real ( i - 1 , rk ) / real ( res3 - 1 , rk ), i = 1 , res3 )] ! else ! this%Xt3 = this%Xt3 end if ! Set number of geometry points this % ng ( 1 ) = size ( this % Xt1 , 1 ) this % ng ( 2 ) = size ( this % Xt2 , 1 ) this % ng ( 3 ) = size ( this % Xt3 , 1 ) call ndgrid ( this % Xt1 , this % Xt2 , this % Xt3 , Xt ) allocate ( Tgc ( this % ng ( 1 ) * this % ng ( 2 ) * this % ng ( 3 ), this % nc ( 1 ) * this % nc ( 2 ) * this % nc ( 3 ))) if ( allocated ( this % Wc )) then ! NURBS volume do i = 1 , size ( Xt , 1 ) Tgc1 = basis_bspline ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgc3 = basis_bspline ( Xt ( i , 3 ), this % knot3 , this % nc ( 3 ), this % degree ( 3 )) Tgci = kron ( Tgc3 , kron ( Tgc2 , Tgc1 )) Tgci = Tgci * ( this % Wc / ( dot_product ( Tgci , this % Wc ))) Tgc ( i ,:) = Tgci end do else do i = 1 , size ( Xt , 1 ) Tgc1 = basis_bspline ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgc3 = basis_bspline ( Xt ( i , 3 ), this % knot3 , this % nc ( 3 ), this % degree ( 3 )) Tgci = kron ( Tgc3 , kron ( Tgc2 , Tgc1 )) Tgc ( i ,:) = Tgci end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine insert_knots ( this , dir , Xth , r ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ) :: dir real ( rk ), intent ( in ), contiguous :: Xth (:) integer , intent ( in ), contiguous :: r (:) integer :: k , i , s , dim , j , n_new real ( rk ), allocatable :: Xc (:,:), Xcw (:,:), Xcw_new (:,:), Xc_new (:,:), Wc_new (:), knot_new (:) real ( rk ), allocatable :: Xc4 (:,:,:,:) real ( rk ), allocatable :: knot1 (:), knot2 (:), knot3 (:) if ( dir == 1 ) then ! direction 1 if ( allocated ( this % Wc )) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 1 ) - 1 , this % degree ( 1 ), Xth ( i ), this % knot1 ) if ( this % knot1 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot1 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xcw = reshape ( Xcw ,[ this % nc ( 1 ), this % nc ( 2 ) * this % nc ( 3 ) * ( dim + 1 )]) call insert_knot_A_5_1 (& this % degree ( 1 ),& this % knot1 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xcw_new ) Xcw_new = reshape ( Xcw_new ,[( n_new + 1 ) * this % nc ( 2 ) * this % nc ( 3 ), dim + 1 ]) allocate ( Xc_new ( 1 :( n_new + 1 ) * this % nc ( 2 ) * this % nc ( 3 ), 1 : dim )) allocate ( Wc_new ( 1 :( n_new + 1 ) * this % nc ( 2 ) * this % nc ( 3 ))) do j = 1 , ( n_new + 1 ) * this % nc ( 2 ) * this % nc ( 3 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot2 = this % knot2 knot3 = this % knot3 call this % set ( knot1 = knot_new , knot2 = knot2 , knot3 = knot3 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 1 ) - 1 , this % degree ( 1 ), Xth ( i ), this % knot1 ) if ( this % knot1 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot1 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) Xc = reshape ( this % Xc ,[ this % nc ( 1 ), this % nc ( 2 ) * this % nc ( 3 ) * dim ]) call insert_knot_A_5_1 (& this % degree ( 1 ),& this % knot1 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xc_new ) Xc_new = reshape ( Xc_new ,[( n_new + 1 ) * this % nc ( 2 ) * this % nc ( 3 ), dim ]) knot2 = this % knot2 knot3 = this % knot3 call this % set ( knot1 = knot_new , knot2 = knot2 , knot3 = knot3 , Xc = Xc_new ) end do end if elseif ( dir == 2 ) then ! direction 2 if ( allocated ( this % Wc )) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 2 ) - 1 , this % degree ( 2 ), Xth ( i ), this % knot2 ) if ( this % knot2 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot2 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc4 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 2 ), this % nc ( 1 ), this % nc ( 3 ), dim + 1 ], order = [ 2 , 1 , 3 , 4 ]) Xcw = reshape ( Xc4 ,[ this % nc ( 2 ), this % nc ( 1 ) * this % nc ( 3 ) * ( dim + 1 )]) call insert_knot_A_5_1 (& this % degree ( 2 ),& this % knot2 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xcw_new ) Xc4 = reshape ( Xcw_new , [ n_new + 1 , this % nc ( 1 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), n_new + 1 , this % nc ( 3 ), dim + 1 ], order = [ 2 , 1 , 3 , 4 ]) Xcw_new = reshape ( Xc4 ,[ this % nc ( 1 ) * ( n_new + 1 ) * this % nc ( 3 ), dim + 1 ]) allocate ( Xc_new ( 1 : this % nc ( 1 ) * ( n_new + 1 ) * this % nc ( 3 ), 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 1 ) * ( n_new + 1 ) * this % nc ( 3 ))) do j = 1 , this % nc ( 1 ) * ( n_new + 1 ) * this % nc ( 3 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 knot3 = this % knot3 call this % set ( knot1 = knot1 , knot2 = knot_new , knot3 = knot3 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 2 ) - 1 , this % degree ( 2 ), Xth ( i ), this % knot2 ) if ( this % knot2 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot2 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) Xc4 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 2 ), this % nc ( 1 ), this % nc ( 3 ), dim ], order = [ 2 , 1 , 3 , 4 ]) Xc = reshape ( Xc4 ,[ this % nc ( 2 ), this % nc ( 1 ) * this % nc ( 3 ) * dim ]) call insert_knot_A_5_1 (& this % degree ( 2 ),& this % knot2 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xc_new ) Xc4 = reshape ( Xc_new , [ n_new + 1 , this % nc ( 1 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), n_new + 1 , this % nc ( 3 ), dim ], order = [ 2 , 1 , 3 , 4 ]) Xc_new = reshape ( Xc4 ,[ this % nc ( 1 ) * ( n_new + 1 ) * this % nc ( 3 ), dim ]) knot1 = this % knot1 knot3 = this % knot3 call this % set ( knot1 = knot1 , knot2 = knot_new , knot3 = knot3 , Xc = Xc_new ) end do end if elseif ( dir == 3 ) then ! direction 3 if ( allocated ( this % Wc )) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 3 ) - 1 , this % degree ( 3 ), Xth ( i ), this % knot3 ) if ( this % knot3 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot3 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc4 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 3 ), this % nc ( 2 ), this % nc ( 1 ), dim + 1 ], order = [ 3 , 2 , 1 , 4 ]) Xcw = reshape ( Xc4 ,[ this % nc ( 3 ), this % nc ( 2 ) * this % nc ( 1 ) * ( dim + 1 )]) call insert_knot_A_5_1 (& this % degree ( 3 ),& this % knot3 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xcw_new ) Xc4 = reshape ( Xcw_new , [ n_new + 1 , this % nc ( 2 ), this % nc ( 1 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), this % nc ( 2 ), n_new + 1 , dim + 1 ], order = [ 3 , 2 , 1 , 4 ]) Xcw_new = reshape ( Xc4 ,[ this % nc ( 1 ) * this % nc ( 2 ) * ( n_new + 1 ), dim + 1 ]) allocate ( Xc_new ( 1 : this % nc ( 1 ) * this % nc ( 2 ) * ( n_new + 1 ), 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 1 ) * this % nc ( 2 ) * ( n_new + 1 ))) do j = 1 , this % nc ( 1 ) * this % nc ( 2 ) * ( n_new + 1 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 knot2 = this % knot2 call this % set ( knot1 = knot1 , knot2 = knot2 , knot3 = knot_new , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 3 ) - 1 , this % degree ( 3 ), Xth ( i ), this % knot3 ) if ( this % knot3 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot3 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) Xc4 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 3 ), this % nc ( 2 ), this % nc ( 1 ), dim ], order = [ 3 , 2 , 1 , 4 ]) Xc = reshape ( Xc4 ,[ this % nc ( 3 ), this % nc ( 2 ) * this % nc ( 1 ) * dim ]) call insert_knot_A_5_1 (& this % degree ( 3 ),& this % knot3 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xc_new ) Xc4 = reshape ( Xc_new , [ n_new + 1 , this % nc ( 2 ), this % nc ( 1 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), this % nc ( 2 ), n_new + 1 , dim ], order = [ 3 , 2 , 1 , 4 ]) Xc_new = reshape ( Xc4 , [ this % nc ( 1 ) * this % nc ( 2 ) * ( n_new + 1 ), dim ]) knot1 = this % knot1 knot2 = this % knot2 call this % set ( knot1 = knot1 , knot2 = knot2 , knot3 = knot_new , Xc = Xc_new ) end do end if else error stop 'Invalid direction.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine elevate_degree ( this , dir , t ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ) :: dir integer , intent ( in ) :: t real ( rk ), allocatable :: Xc (:,:), Xcw (:,:), Xcw_new (:,:), Xc_new (:,:), Wc_new (:), knot_new (:) integer :: nc_new , dim , j real ( rk ), allocatable :: Xc4 (:,:,:,:) real ( rk ), allocatable :: knot1 (:), knot2 (:), knot3 (:) if ( dir == 1 ) then ! direction 1 if ( allocated ( this % Wc )) then ! NURBS dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xcw = reshape ( Xcw ,[ this % nc ( 1 ), this % nc ( 2 ) * this % nc ( 3 ) * ( dim + 1 )], order = [ 1 , 2 ]) call elevate_degree_A_5_9 ( t , this % knot1 , this % degree ( 1 ), Xcw , nc_new , knot_new , Xcw_new ) Xcw_new = reshape ( Xcw_new ,[ nc_new * this % nc ( 2 ) * this % nc ( 3 ), dim + 1 ], order = [ 1 , 2 ]) allocate ( Xc_new ( 1 : nc_new * this % nc ( 2 ) * this % nc ( 3 ), 1 : dim )) allocate ( Wc_new ( 1 : nc_new * this % nc ( 2 ) * this % nc ( 3 ))) do j = 1 , nc_new * this % nc ( 2 ) * this % nc ( 3 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot2 = this % knot2 knot3 = this % knot3 call this % set ( knot1 = knot_new , knot2 = knot2 , knot3 = knot3 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) else ! B-Spline dim = size ( this % Xc , 2 ) Xc = reshape ( this % Xc ,[ this % nc ( 1 ), this % nc ( 2 ) * this % nc ( 3 ) * dim ], order = [ 1 , 2 ]) call elevate_degree_A_5_9 ( t , this % knot1 , this % degree ( 1 ), Xc , nc_new , knot_new , Xc_new ) Xc_new = reshape ( Xc_new ,[ nc_new * this % nc ( 2 ) * this % nc ( 3 ), dim ], order = [ 1 , 2 ]) knot2 = this % knot2 knot3 = this % knot3 call this % set ( knot1 = knot_new , knot2 = knot2 , knot3 = knot3 , Xc = Xc_new ) end if elseif ( dir == 2 ) then ! direction 2 if ( allocated ( this % Wc )) then ! NURBS dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc4 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 2 ), this % nc ( 1 ), this % nc ( 3 ), dim + 1 ], order = [ 2 , 1 , 3 , 4 ]) Xcw = reshape ( Xc4 ,[ this % nc ( 2 ), this % nc ( 1 ) * this % nc ( 3 ) * ( dim + 1 )]) call elevate_degree_A_5_9 ( t , this % knot2 , this % degree ( 2 ), Xcw , nc_new , knot_new , Xcw_new ) Xc4 = reshape ( Xcw_new , [ nc_new , this % nc ( 1 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), nc_new , this % nc ( 3 ), dim + 1 ], order = [ 2 , 1 , 3 , 4 ]) Xcw_new = reshape ( Xc4 ,[ this % nc ( 1 ) * nc_new * this % nc ( 3 ), dim + 1 ]) allocate ( Xc_new ( 1 : this % nc ( 1 ) * nc_new * this % nc ( 3 ), 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 1 ) * nc_new * this % nc ( 3 ))) do j = 1 , this % nc ( 1 ) * nc_new * this % nc ( 3 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 knot3 = this % knot3 call this % set ( knot1 = knot1 , knot2 = knot_new , knot3 = knot3 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) else ! B-Spline dim = size ( this % Xc , 2 ) Xc4 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 2 ), this % nc ( 1 ), this % nc ( 3 ), dim ], order = [ 2 , 1 , 3 , 4 ]) Xc = reshape ( Xc4 ,[ this % nc ( 2 ), this % nc ( 1 ) * this % nc ( 3 ) * dim ]) call elevate_degree_A_5_9 ( t , this % knot2 , this % degree ( 2 ), Xc , nc_new , knot_new , Xc_new ) Xc4 = reshape ( Xc_new , [ nc_new , this % nc ( 1 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), nc_new , this % nc ( 3 ), dim ], order = [ 2 , 1 , 3 , 4 ]) Xc_new = reshape ( Xc4 ,[ this % nc ( 1 ) * nc_new * this % nc ( 3 ), dim ]) knot1 = this % knot1 knot3 = this % knot3 call this % set ( knot1 = knot1 , knot2 = knot_new , knot3 = knot3 , Xc = Xc_new ) end if elseif ( dir == 3 ) then ! direction 3 if ( allocated ( this % Wc )) then ! NURBS dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc4 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 3 ), this % nc ( 2 ), this % nc ( 1 ), dim + 1 ], order = [ 3 , 2 , 1 , 4 ]) Xcw = reshape ( Xc4 ,[ this % nc ( 3 ), this % nc ( 2 ) * this % nc ( 1 ) * ( dim + 1 )]) call elevate_degree_A_5_9 ( t , this % knot3 , this % degree ( 3 ), Xcw , nc_new , knot_new , Xcw_new ) Xc4 = reshape ( Xcw_new , [ nc_new , this % nc ( 2 ), this % nc ( 1 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), this % nc ( 2 ), nc_new , dim + 1 ], order = [ 3 , 2 , 1 , 4 ]) Xcw_new = reshape ( Xc4 ,[ this % nc ( 1 ) * this % nc ( 2 ) * nc_new , dim + 1 ]) allocate ( Xc_new ( 1 : this % nc ( 1 ) * this % nc ( 2 ) * nc_new , 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 1 ) * this % nc ( 2 ) * nc_new )) do j = 1 , this % nc ( 1 ) * this % nc ( 2 ) * nc_new Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 knot2 = this % knot2 call this % set ( knot1 = knot1 , knot2 = knot2 , knot3 = knot_new , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) else ! B-Spline dim = size ( this % Xc , 2 ) Xc4 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 3 ), this % nc ( 2 ), this % nc ( 1 ), dim ], order = [ 3 , 2 , 1 , 4 ]) Xc = reshape ( Xc4 ,[ this % nc ( 3 ), this % nc ( 2 ) * this % nc ( 1 ) * dim ]) call elevate_degree_A_5_9 ( t , this % knot3 , this % degree ( 3 ), Xc , nc_new , knot_new , Xc_new ) Xc4 = reshape ( Xc_new , [ nc_new , this % nc ( 2 ), this % nc ( 1 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), this % nc ( 2 ), nc_new , dim ], order = [ 3 , 2 , 1 , 4 ]) Xc_new = reshape ( Xc4 ,[ this % nc ( 1 ) * this % nc ( 2 ) * nc_new , dim ]) knot1 = this % knot1 knot2 = this % knot2 call this % set ( knot1 = knot1 , knot2 = knot2 , knot3 = knot_new , Xc = Xc_new ) end if else error stop 'Invalid direction.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function is_rational ( this ) result ( r ) class ( nurbs_volume ), intent ( in ) :: this logical :: r r = . false . if ( allocated ( this % Wc )) then if ( any ( this % Wc /= this % Wc ( 1 ))) then r = . true . end if end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem_Xc_vis ( this , elemConn ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn_Xc_vis )) deallocate ( this % elemConn_Xc_vis ) this % elemConn_Xc_vis = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem_Xg_vis ( this , elemConn ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn_Xg_vis )) deallocate ( this % elemConn_Xg_vis ) this % elemConn_Xg_vis = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem ( this , elemConn ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn )) deallocate ( this % elemConn ) this % elemConn = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem_Xc_vis ( this ) result ( elemConn ) class ( nurbs_volume ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn_Xc_vis end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem_Xg_vis ( this ) result ( elemConn ) class ( nurbs_volume ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn_Xg_vis end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem ( this ) result ( elemConn ) class ( nurbs_volume ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_hexahedron ( this , L , nc , Wc ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: L (:) integer , intent ( in ), contiguous :: nc (:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) if ( present ( Wc )) then call this % set ( nc , hexahedron_Xc ( L , nc ), Wc ) else call this % set ( nc , hexahedron_Xc ( L , nc )) end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine put_to_nurbs ( this , X , elemConn ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: X (:,:) integer , intent ( in ), contiguous :: elemConn (:,:) integer :: i , j real ( rk ), allocatable :: Tgc1 (:), Tgc2 (:), Tgc3 (:), Tgc (:) real ( rk ), allocatable :: Xt (:,:) real ( rk ) :: min_X1 , max_X1 , min_X2 , max_X2 , min_X3 , max_X3 ! Assuming knot vectors are in the range [0,1] ! Normalize the X coordinates to the range [0,1] allocate ( Xt ( size ( X , 1 ), size ( X , 2 ))) min_X1 = minval ( X (:, 1 )) max_X1 = maxval ( X (:, 1 )) min_X2 = minval ( X (:, 2 )) max_X2 = maxval ( X (:, 2 )) min_X3 = minval ( X (:, 3 )) max_X3 = maxval ( X (:, 3 )) Xt (:, 1 ) = ( X (:, 1 ) - min_X1 ) / ( max_X1 - min_X1 ) Xt (:, 2 ) = ( X (:, 2 ) - min_X2 ) / ( max_X2 - min_X2 ) Xt (:, 3 ) = ( X (:, 3 ) - min_X3 ) / ( max_X3 - min_X3 ) allocate ( this % Xg ( size ( Xt , 1 ), size ( this % Xc , 2 ))) if ( allocated ( this % Wc )) then ! NURBS volume do i = 1 , size ( Xt , 1 ) Tgc1 = basis_bspline ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgc3 = basis_bspline ( Xt ( i , 3 ), this % knot3 , this % nc ( 3 ), this % degree ( 3 )) Tgc = kron ( Tgc3 , kron ( Tgc2 , Tgc1 )) Tgc = Tgc * ( this % Wc / ( dot_product ( Tgc , this % Wc ))) do j = 1 , size ( this % Xc , 2 ) this % Xg ( i , j ) = dot_product ( Tgc , this % Xc (:, j )) end do end do else ! B-Spline volume do i = 1 , size ( Xt , 1 ) Tgc1 = basis_bspline ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgc3 = basis_bspline ( Xt ( i , 3 ), this % knot3 , this % nc ( 3 ), this % degree ( 3 )) Tgc = kron ( Tgc3 , kron ( Tgc2 , Tgc1 )) do j = 1 , size ( this % Xc , 2 ) this % Xg ( i , j ) = dot_product ( Tgc , this % Xc (:, j )) end do end do end if call this % set_elem_Xg_vis ( elemConn ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine remove_knots ( this , dir , Xth , r ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ) :: dir real ( rk ), intent ( in ), contiguous :: Xth (:) integer , intent ( in ), contiguous :: r (:) integer :: k , i , s , dim , j , nc_new , t real ( rk ), allocatable :: Xc (:,:), Xcw (:,:), Xcw_new (:,:), Xc_new (:,:), Wc_new (:), knot_new (:) real ( rk ), allocatable :: Xc4 (:,:,:,:) real ( rk ), allocatable :: knot1 (:), knot2 (:), knot3 (:) if ( dir == 1 ) then ! direction 1 if ( allocated ( this % Wc )) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 1 ) - 1 , this % degree ( 1 ), Xth ( i ), this % knot1 ) if ( this % knot1 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot1 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xcw = reshape ( Xcw ,[ this % nc ( 1 ), this % nc ( 2 ) * this % nc ( 3 ) * ( dim + 1 )], order = [ 1 , 2 ]) call remove_knots_A_5_8 (& this % degree ( 1 ),& this % knot1 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xcw_new ) if ( allocated ( Xcw )) deallocate ( Xcw ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) Xcw_new = reshape ( Xcw_new ,[( nc_new ) * this % nc ( 2 ) * this % nc ( 3 ), dim + 1 ], order = [ 1 , 2 ]) allocate ( Xc_new ( 1 :( nc_new ) * this % nc ( 2 ) * this % nc ( 3 ), 1 : dim )) allocate ( Wc_new ( 1 :( nc_new ) * this % nc ( 2 ) * this % nc ( 3 ))) do j = 1 , ( nc_new ) * this % nc ( 2 ) * this % nc ( 3 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot2 = this % knot2 knot3 = this % knot3 call this % set ( knot1 = knot_new , knot2 = knot2 , knot3 = knot3 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw_new , Xc_new , Wc_new ) end if end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 1 ) - 1 , this % degree ( 1 ), Xth ( i ), this % knot1 ) if ( this % knot1 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot1 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) Xc = reshape ( this % Xc ,[ this % nc ( 1 ), this % nc ( 2 ) * this % nc ( 3 ) * dim ]) call remove_knots_A_5_8 (& this % degree ( 1 ),& this % knot1 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xc_new ) if ( allocated ( Xc )) deallocate ( Xc ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) Xc_new = reshape ( Xc_new ,[( nc_new ) * this % nc ( 2 ) * this % nc ( 3 ), dim ]) knot2 = this % knot2 knot3 = this % knot3 call this % set ( knot1 = knot_new , knot2 = knot2 , knot3 = knot3 , Xc = Xc_new ) end if end do end if elseif ( dir == 2 ) then ! direction 2 if ( allocated ( this % Wc )) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 2 ) - 1 , this % degree ( 2 ), Xth ( i ), this % knot2 ) if ( this % knot2 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot2 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc4 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 2 ), this % nc ( 1 ), this % nc ( 3 ), dim + 1 ], order = [ 2 , 1 , 3 , 4 ]) Xcw = reshape ( Xc4 ,[ this % nc ( 2 ), this % nc ( 1 ) * this % nc ( 3 ) * ( dim + 1 )]) call remove_knots_A_5_8 (& this % degree ( 2 ),& this % knot2 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xcw_new ) if ( allocated ( Xcw )) deallocate ( Xcw ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) Xc4 = reshape ( Xcw_new , [ nc_new , this % nc ( 1 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), nc_new , this % nc ( 3 ), dim + 1 ], order = [ 2 , 1 , 3 , 4 ]) Xcw_new = reshape ( Xc4 ,[ this % nc ( 1 ) * ( nc_new ) * this % nc ( 3 ), dim + 1 ]) allocate ( Xc_new ( 1 : this % nc ( 1 ) * ( nc_new ) * this % nc ( 3 ), 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 1 ) * ( nc_new ) * this % nc ( 3 ))) do j = 1 , this % nc ( 1 ) * ( nc_new ) * this % nc ( 3 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 knot3 = this % knot3 call this % set ( knot1 = knot1 , knot2 = knot_new , knot3 = knot3 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw_new , Xc_new , Wc_new ) end if end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 2 ) - 1 , this % degree ( 2 ), Xth ( i ), this % knot2 ) if ( this % knot2 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot2 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) Xc4 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 2 ), this % nc ( 1 ), this % nc ( 3 ), dim ], order = [ 2 , 1 , 3 , 4 ]) Xc = reshape ( Xc4 , [ this % nc ( 2 ), this % nc ( 1 ) * this % nc ( 3 ) * dim ]) call remove_knots_A_5_8 (& this % degree ( 2 ),& this % knot2 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xc_new ) if ( allocated ( Xc )) deallocate ( Xc ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) Xc4 = reshape ( Xc_new , [ nc_new , this % nc ( 1 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), nc_new , this % nc ( 3 ), dim ], order = [ 2 , 1 , 3 , 4 ]) Xc_new = reshape ( Xc4 , [ this % nc ( 1 ) * ( nc_new ) * this % nc ( 3 ), dim ]) knot1 = this % knot1 knot3 = this % knot3 call this % set ( knot1 = knot1 , knot2 = knot_new , knot3 = knot3 , Xc = Xc_new ) end if end do end if elseif ( dir == 3 ) then ! direction 3 if ( allocated ( this % Wc )) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 3 ) - 1 , this % degree ( 3 ), Xth ( i ), this % knot3 ) if ( this % knot3 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot3 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc4 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 3 ), this % nc ( 2 ), this % nc ( 1 ), dim + 1 ], order = [ 3 , 2 , 1 , 4 ]) Xcw = reshape ( Xc4 , [ this % nc ( 3 ), this % nc ( 2 ) * this % nc ( 1 ) * ( dim + 1 )]) call remove_knots_A_5_8 (& this % degree ( 3 ),& this % knot3 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xcw_new ) if ( allocated ( Xcw )) deallocate ( Xcw ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) Xc4 = reshape ( Xcw_new , [ nc_new , this % nc ( 2 ), this % nc ( 1 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), this % nc ( 2 ), nc_new , dim + 1 ], order = [ 3 , 2 , 1 , 4 ]) Xcw_new = reshape ( Xc4 , [ this % nc ( 1 ) * this % nc ( 2 ) * ( nc_new ), dim + 1 ]) allocate ( Xc_new ( 1 : this % nc ( 1 ) * this % nc ( 2 ) * ( nc_new ), 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 1 ) * this % nc ( 2 ) * ( nc_new ))) do j = 1 , this % nc ( 1 ) * this % nc ( 2 ) * ( nc_new ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 knot2 = this % knot2 call this % set ( knot1 = knot1 , knot2 = knot2 , knot3 = knot_new , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw_new , Xc_new , Wc_new ) end if end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 3 ) - 1 , this % degree ( 3 ), Xth ( i ), this % knot3 ) if ( this % knot3 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot3 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) Xc4 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 3 ), this % nc ( 2 ), this % nc ( 1 ), dim ], order = [ 3 , 2 , 1 , 4 ]) Xc = reshape ( Xc4 , [ this % nc ( 3 ), this % nc ( 2 ) * this % nc ( 1 ) * dim ]) call remove_knots_A_5_8 (& this % degree ( 3 ),& this % knot3 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xc_new ) if ( allocated ( Xc )) deallocate ( Xc ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) Xc4 = reshape ( Xc_new , [ nc_new , this % nc ( 2 ), this % nc ( 1 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), this % nc ( 2 ), nc_new , dim ], order = [ 3 , 2 , 1 , 4 ]) Xc_new = reshape ( Xc4 , [ this % nc ( 1 ) * this % nc ( 2 ) * ( nc_new ), dim ]) knot1 = this % knot1 knot2 = this % knot2 call this % set ( knot1 = knot1 , knot2 = knot2 , knot3 = knot_new , Xc = Xc_new ) end if end do end if else error stop 'Invalid direction.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem ( this ) result ( elemConn ) class ( nurbs_volume ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) call elemConn_Cn ( this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ),& this % degree ( 1 ), this % degree ( 2 ), this % degree ( 3 ),& unique ( this % knot1 ), unique ( this % knot2 ), unique ( this % knot3 ),& this % get_multiplicity ( 1 ), this % get_multiplicity ( 2 ), this % get_multiplicity ( 3 ),& elemConn ) end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine rotate_Xc ( this , alpha , beta , theta ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ) :: alpha , beta , theta integer :: i do i = 1 , this % nc ( 1 ) * this % nc ( 2 ) * this % nc ( 3 ) this % Xc ( i , :) = matmul ( rotation ( alpha , beta , theta ), this % Xc ( i , :)) end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine rotate_Xg ( this , alpha , beta , theta ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ) :: alpha , beta , theta integer :: i do i = 1 , this % ng ( 1 ) * this % ng ( 2 ) * this % ng ( 3 ) this % Xg ( i , :) = matmul ( rotation ( alpha , beta , theta ), this % Xg ( i , :)) end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine translate_Xc ( this , vec ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ) :: vec (:) integer :: i do i = 1 , this % nc ( 1 ) * this % nc ( 2 ) * this % nc ( 3 ) this % Xc ( i , :) = this % Xc ( i , :) + vec end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine translate_Xg ( this , vec ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ) :: vec (:) integer :: i do i = 1 , this % ng ( 1 ) * this % ng ( 2 ) * this % ng ( 3 ) this % Xg ( i , :) = this % Xg ( i , :) + vec end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine show ( this , vtkfile_Xc , vtkfile_Xg ) class ( nurbs_volume ), intent ( inout ) :: this character ( len =* ), intent ( in ) :: vtkfile_Xc , vtkfile_Xg character ( len = 3000 ) :: pyvista_script pyvista_script = & \"import pyvista as pv\" // achar ( 10 ) // & \"pv.global_theme.color = 'white'\" // achar ( 10 ) // & \"Xc = pv.read('\" // trim ( vtkfile_Xc ) // \"')\" // achar ( 10 ) // & \"Xg = pv.read('\" // trim ( vtkfile_Xg ) // \"')\" // achar ( 10 ) // & \"p = pv.Plotter(lighting='light kit')\" // achar ( 10 ) // & \"actor_Xcp = p.add_mesh(\" // achar ( 10 ) // & \" Xc,\" // achar ( 10 ) // & \" style='points',\" // achar ( 10 ) // & \" point_size=10,\" // achar ( 10 ) // & \" color='red',\" // achar ( 10 ) // & \" render_points_as_spheres=True,\" // achar ( 10 ) // & \" opacity=0.5,\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"actor_Xcw = p.add_mesh(\" // achar ( 10 ) // & \" Xc,\" // achar ( 10 ) // & \" show_edges=True,\" // achar ( 10 ) // & \" color='yellow',\" // achar ( 10 ) // & \" line_width=3,\" // achar ( 10 ) // & \" style='wireframe',\" // achar ( 10 ) // & \" opacity=0.2\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"actor_Xg = p.add_mesh(\" // achar ( 10 ) // & \" Xg,\" // achar ( 10 ) // & \" show_edges=False,\" // achar ( 10 ) // & \" color='cyan',\" // achar ( 10 ) // & \" line_width=7,\" // achar ( 10 ) // & \" metallic=0.6,\" // achar ( 10 ) // & \" pbr=True,\" // achar ( 10 ) // & \" split_sharp_edges=True,\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_axes(interactive=False)\" // achar ( 10 ) // & \"def point_picker_callback(point):\" // achar ( 10 ) // & \" mesh = Xc\" // achar ( 10 ) // & \" point_id = mesh.find_closest_point(point)\" // achar ( 10 ) // & \" point_coords = mesh.points[point_id]\" // achar ( 10 ) // & \" label = f'ID: {point_id + 1}\\n({point_coords[0]:.3f}, {point_coords[1]:.3f}, {point_coords[2]:.3f})'\" // achar ( 10 ) // & \" p.add_point_labels(\" // achar ( 10 ) // & \" [point_coords],\" // achar ( 10 ) // & \" [label],\" // achar ( 10 ) // & \" font_size=14,\" // achar ( 10 ) // & \" text_color='black',\" // achar ( 10 ) // & \" show_points=False,\" // achar ( 10 ) // & \" fill_shape=False,\" // achar ( 10 ) // & \" shape=None,\" // achar ( 10 ) // & \" )\" // achar ( 10 ) // & \"picker = p.enable_point_picking(callback=point_picker_callback, show_message=False)\" // achar ( 10 ) // & \"window_size = p.window_size\" // achar ( 10 ) // & \"y_pos = window_size[1]\" // achar ( 10 ) // & \"def Xcp_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xcp.SetVisibility(flag)\" // achar ( 10 ) // & \"def Xcw_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xcw.SetVisibility(flag)\" // achar ( 10 ) // & \"def Xg_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xg.SetVisibility(flag)\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xcp_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='red',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 1 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xcw_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='yellow',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 2 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xg_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='cyan',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 3 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xc (Points)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 1 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xc (Control geometry)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 2 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xg (Geometry)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 3 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text('ForCAD', position=(0.0, 10.0), font_size=14, color='black', font='times')\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'https://github.com/gha3mi/forcad',\" // achar ( 10 ) // & \" position=(0.0, 0.0),\" // achar ( 10 ) // & \" font_size=7,\" // achar ( 10 ) // & \" color='blue',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.show(title='ForCAD', interactive=True)\" call execute_command_line ( 'python -c \"' // trim ( adjustl ( pyvista_script )) // '\"' ) end subroutine !=============================================================================== end module forcad_nurbs_volume","tags":"","loc":"sourcefile/forcad_nurbs_volume.f90.html"},{"title":"put_to_nurbs.f90 – ForCAD","text":"This file depends on sourcefile~~put_to_nurbs.f90~~EfferentGraph sourcefile~put_to_nurbs.f90 put_to_nurbs.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~put_to_nurbs.f90->sourcefile~forcad.f90 sourcefile~forcad_utils.f90 forcad_utils.f90 sourcefile~put_to_nurbs.f90->sourcefile~forcad_utils.f90 sourcefile~forcad.f90->sourcefile~forcad_utils.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_nurbs_curve.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code program example_morph use forcad use forcad_utils , only : hexahedron_Xc implicit none type ( nurbs_volume ) :: control_shape real ( rk ), allocatable :: X (:,:) integer , allocatable :: elem (:,:) integer :: i , nunit !> You can create your shape or use a predefined one !> Read coordinates from file allocate ( X ( 23200 , 3 )) open ( newunit = nunit , file = 'example/put_to_nurbs_X.txt' ) do i = 1 , 23200 read ( nunit , * ) X ( i , 1 ), X ( i , 2 ), X ( i , 3 ) end do close ( nunit ) !> Read element connectivities from file allocate ( elem ( 20577 , 8 )) open ( newunit = nunit , file = 'example/put_to_nurbs_elem.txt' ) do i = 1 , 20577 read ( nunit , * ) elem ( i , 1 ), elem ( i , 2 ), elem ( i , 4 ), elem ( i , 3 ), elem ( i , 5 ), elem ( i , 6 ), elem ( i , 8 ), elem ( i , 7 ) end do close ( nunit ) !> Set a control shape that will be used to put the shape into !> The contol shape is a hexahedron with 100x40x10 with 10x5x3 number of control points !> By modifying the control shape you can modify the shape call control_shape % set ( nc = [ 10 , 5 , 3 ], Xc = hexahedron_Xc ( L = [ 10 0.0_rk , 4 0.0_rk , 1 0.0_rk ], nc = [ 10 , 5 , 3 ])) !> Map the shape into the shape call control_shape % put_to_nurbs ( X , elem ) !> Export the shape and the control shape to vtk files call control_shape % export_Xc ( 'vtk/control_shape.vtk' ) call control_shape % export_Xg ( 'vtk/shape.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 control_shape % show ( 'vtk/control_shape.vtk' , 'vtk/shape.vtk' ) end program","tags":"","loc":"sourcefile/put_to_nurbs.f90.html"},{"title":"shape_hexahedron.f90 – ForCAD","text":"This file depends on sourcefile~~shape_hexahedron.f90~~EfferentGraph sourcefile~shape_hexahedron.f90 shape_hexahedron.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~shape_hexahedron.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code program shape_hexahedron use forcad , only : rk , nurbs_volume implicit none type ( nurbs_volume ) :: shape !> Set up a hexahedron shape with dimensions L = [2.0, 4.0, 8.0] and a specified number of control points nc = [4, 6, 8]. !> The weights of the control points (Wc) are optional. call shape % set_hexahedron ( L = [ 2.0_rk , 4.0_rk , 8.0_rk ], nc = [ 4 , 6 , 8 ]) ! Additional modifications can be made to control points and weights, or the NURBS can be refined using knot insertion or degree elevation. ! call shape%insert_knots(...) ! call shape%elevate_degree(...) ! ... !> Export the control points to a VTK file for visualization. call shape % export_Xc ( 'vtk/shape_hexahedron_Xc.vtk' ) !> Create the shape using the specified number of elements in each direction. call shape % create ( 8 , 16 , 32 ) !> Export the geometry to a VTK file for visualization. call shape % export_Xg ( 'vtk/shape_hexahedron_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 shape % show ( 'vtk/shape_hexahedron_Xc.vtk' , 'vtk/shape_hexahedron_Xg.vtk' ) !> Finalize and clean up the shape object. call shape % finalize () end program","tags":"","loc":"sourcefile/shape_hexahedron.f90.html"},{"title":"demo_curve.f90 – ForCAD","text":"This file depends on sourcefile~~demo_curve.f90~~EfferentGraph sourcefile~demo_curve.f90 demo_curve.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~demo_curve.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> 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. 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 ) !> 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","tags":"","loc":"sourcefile/demo_curve.f90.html"},{"title":"shape_tetragon.f90 – ForCAD","text":"This file depends on sourcefile~~shape_tetragon.f90~~EfferentGraph sourcefile~shape_tetragon.f90 shape_tetragon.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~shape_tetragon.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code program shape_tetragon use forcad implicit none type ( nurbs_surface ) :: shape !! Declare a NURBS surface object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights real ( rk ), allocatable :: knot1 (:), knot2 (:) !! Arrays for knot vectors in both dimensions !----------------------------------------------------------------------------- ! Setting up the NURBS tetrangon !----------------------------------------------------------------------------- !> Set a tetragon with lengths of 2.0 and 3.0 and 3 and 4 control points in each direction !> The weights of the control points (Wc) are optional. call shape % set_tetragon ( L = [ 2.0_rk , 3.0_rk ], nc = [ 3 , 4 ]) !> Export the control points to a VTK file call shape % export_Xc ( 'vtk/shape_tetragon_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS surface !----------------------------------------------------------------------------- !> Generate the NURBS surface with resolutions of 30 in both dimensions call shape % create ( 30 , 30 ) !> Export the generated surface to a VTK file call shape % export_Xg ( 'vtk/shape_tetragon_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 shape % show ( 'vtk/shape_tetragon_Xc.vtk' , 'vtk/shape_tetragon_Xg.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS surface object call shape % finalize () end program","tags":"","loc":"sourcefile/shape_tetragon.f90.html"},{"title":"forcad_utils.f90 – ForCAD","text":"Files dependent on this one sourcefile~~forcad_utils.f90~~AfferentGraph sourcefile~forcad_utils.f90 forcad_utils.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~forcad.f90->sourcefile~forcad_utils.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_nurbs_curve.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 sourcefile~put_to_nurbs.f90 put_to_nurbs.f90 sourcefile~put_to_nurbs.f90->sourcefile~forcad_utils.f90 sourcefile~put_to_nurbs.f90->sourcefile~forcad.f90 sourcefile~demo_curve.f90 demo_curve.f90 sourcefile~demo_curve.f90->sourcefile~forcad.f90 sourcefile~demo_surface.f90 demo_surface.f90 sourcefile~demo_surface.f90->sourcefile~forcad.f90 sourcefile~demo_volume.f90 demo_volume.f90 sourcefile~demo_volume.f90->sourcefile~forcad.f90 sourcefile~example_curve_1.f90 example_curve_1.f90 sourcefile~example_curve_1.f90->sourcefile~forcad.f90 sourcefile~example_surface_1.f90 example_surface_1.f90 sourcefile~example_surface_1.f90->sourcefile~forcad.f90 sourcefile~example_volume_1.f90 example_volume_1.f90 sourcefile~example_volume_1.f90->sourcefile~forcad.f90 sourcefile~shape_circle.f90 shape_circle.f90 sourcefile~shape_circle.f90->sourcefile~forcad.f90 sourcefile~shape_hexahedron.f90 shape_hexahedron.f90 sourcefile~shape_hexahedron.f90->sourcefile~forcad.f90 sourcefile~shape_tetragon.f90 shape_tetragon.f90 sourcefile~shape_tetragon.f90->sourcefile~forcad.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> This module contains parameters, functions and subroutines that are used in the library. module forcad_utils implicit none private public :: rk , basis_bernstein , basis_bspline , elemConn_C0 , kron , ndgrid , compute_multiplicity , compute_knot_vector , & basis_bspline_der , insert_knot_A_5_1 , findspan , elevate_degree_A_5_9 , hexahedron_Xc , tetragon_Xc , remove_knots_A_5_8 , & elemConn_Cn , unique , rotation integer , parameter :: rk = kind ( 1.0d0 ) !=============================================================================== interface elemConn_C0 module procedure cmp_elemConn_C0_L module procedure cmp_elemConn_C0_S module procedure cmp_elemConn_C0_V end interface !=============================================================================== !=============================================================================== interface elemConn_Cn module procedure cmp_elemConn_Cn_L module procedure cmp_elemConn_Cn_S module procedure cmp_elemConn_Cn_V end interface !=============================================================================== !=============================================================================== interface ndgrid module procedure ndgrid2 module procedure ndgrid3 end interface !=============================================================================== !=============================================================================== interface compute_multiplicity module procedure compute_multiplicity1 module procedure compute_multiplicity2 end interface !=============================================================================== !=============================================================================== interface unique module procedure unique_integer module procedure unique_real end interface !=============================================================================== contains !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function basis_bspline ( Xt , knot , nc , degree ) result ( B ) integer , intent ( in ) :: degree real ( rk ), intent ( in ), contiguous :: knot (:) integer , intent ( in ) :: nc real ( rk ), intent ( in ) :: Xt real ( rk ) :: temp , Xth_i , Xth_i1 , Xth_ip , Xth_ip1 real ( rk ), allocatable :: Nt (:,:) integer :: i , p real ( rk ), allocatable :: B (:) temp = abs ( Xt - knot ( size ( knot ))) allocate ( Nt ( nc , 0 : degree ), source = 0.0_rk ) do p = 0 , degree do i = 1 , nc Xth_i = knot ( i ) Xth_i1 = knot ( i + 1 ) Xth_ip = knot ( i + p ) Xth_ip1 = knot ( i + p + 1 ) if ( temp /= tiny ( 0.0_rk ) . and . Xt >= Xth_i . and . Xt <= Xth_i1 ) Nt ( i , 0 ) = 1.0_rk if ( Xth_ip /= Xth_i ) Nt ( i , p ) = ( Xt - Xth_i ) / ( Xth_ip - Xth_i ) * Nt ( i , p - 1 ) if ( Xth_ip1 /= Xth_i1 ) Nt ( i , p ) = Nt ( i , p ) + ( Xth_ip1 - Xt ) / ( Xth_ip1 - Xth_i1 ) * Nt ( i + 1 , p - 1 ) end do end do B = Nt (:, degree ) end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function basis_bspline_der ( Xt , knot , nc , degree ) result ( dB ) integer , intent ( in ) :: degree real ( rk ), intent ( in ), contiguous :: knot (:) integer , intent ( in ) :: nc real ( rk ), intent ( in ) :: Xt real ( rk ), allocatable :: dB (:) real ( rk ), allocatable :: Nt (:,:), dNt_dXt (:,:) real ( rk ) :: R , L , Rp , Lp , knot_i , knot_ip , knot_jk , knot_jkm , knot_end , a , b , c , d integer :: i , k , n , m , jk k = degree + 1 n = nc - 1 allocate ( Nt ( nc + degree , degree + 1 )) Nt = 0.0_rk do i = 1 , n + k knot_i = knot ( i ) knot_ip = knot ( i + 1 ) knot_end = knot ( size ( knot )) if ( abs ( Xt - knot_end ) > tiny ( 0.0_rk ) ) then if ( Xt >= knot_i . and . Xt < knot_ip ) Nt ( i , 1 ) = 1.0_rk elseif ( abs ( Xt - knot_end ) < tiny ( 0.0_rk ) ) then if ( Xt >= knot_i . and . Xt <= knot_ip ) Nt ( i , 1 ) = 1.0_rk end if end do allocate ( dNt_dXt ( nc + degree , degree + 1 )) dNt_dXt = 0.0_rk m = 0 do jk = 2 , k m = m + 1 do i = 1 , n + k - m knot_i = knot ( i ) knot_ip = knot ( i + 1 ) knot_jk = knot ( i + jk ) knot_jkm = knot ( i + jk - 1 ) a = ( knot_jkm - knot_i ) b = ( knot_jk - Xt ) c = ( knot_jk - knot_ip ) d = ( Xt - knot_i ) R = d / a if ( isnan ( R ) . or . isinf ( R ) . or . abs ( R ) < tiny ( 0.0_rk ) ) R = 0.0_rk L = b / c if ( isnan ( L ) . or . isinf ( L ) . or . abs ( L ) < tiny ( 0.0_rk ) ) L = 0.0_rk Nt ( i , jk ) = R * Nt ( i , jk - 1 ) + L * Nt ( i + 1 , jk - 1 ) Rp = ( Nt ( i , jk - 1 ) + d * dNt_dXt ( i , jk - 1 )) / a if ( isnan ( Rp ) . or . isinf ( Rp ) . or . abs ( Rp ) < tiny ( 0.0_rk ) ) Rp = 0.0_rk Lp = ( b * dNt_dXt ( i + 1 , jk - 1 ) - Nt ( i + 1 , jk - 1 )) / c if ( isnan ( Lp ) . or . isinf ( Lp ) . or . abs ( Lp ) < tiny ( 0.0_rk ) ) Lp = 0.0_rk dNt_dXt ( i , jk ) = Rp + Lp end do end do dB = dNt_dXt ( 1 : nc , k ) end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function basis_bernstein ( Xt , nc ) result ( B ) real ( rk ), intent ( in ) :: Xt integer , intent ( in ) :: nc real ( rk ), allocatable :: B (:) integer :: p , degree degree = nc - 1 allocate ( B ( nc ), source = 0.0_rk ) do concurrent ( p = 0 : degree ) B ( p + 1 ) = gamma ( real ( nc , kind = rk )) / ( gamma ( real ( p + 1 , kind = rk )) * gamma ( real ( nc - p , kind = rk ))) if ( Xt == 0.0_rk . and . p == 0 ) then B ( p + 1 ) = B ( p + 1 ) * ( 1.0_rk - Xt ) ** ( degree - p ) else if ( Xt == 0.0_rk . and . degree - p == 0 ) then B ( p + 1 ) = B ( p + 1 ) * ( Xt ** p ) else B ( p + 1 ) = B ( p + 1 ) * ( Xt ** p ) * ( 1.0_rk - Xt ) ** ( degree - p ) end if end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function kron ( u , v ) result ( w ) real ( rk ), intent ( in ), contiguous :: u (:), v (:) real ( rk ) :: w ( size ( u ) * size ( v )) integer :: i , j , m , n m = size ( u ) n = size ( v ) do i = 1 , m do j = 1 , n w (( i - 1 ) * n + j ) = u ( i ) * v ( j ) end do end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine ndgrid2 ( X_dir1 , X_dir2 , Xt ) real ( rk ), intent ( in ), contiguous :: X_dir1 (:), X_dir2 (:) real ( rk ), allocatable , intent ( out ) :: Xt (:,:) integer :: s1 , s2 , i , j , n s1 = size ( X_dir1 ) s2 = size ( X_dir2 ) allocate ( Xt ( s1 * s2 , 2 )) n = 0 do j = 1 , s2 do i = 1 , s1 n = n + 1 Xt ( n , 1 ) = X_dir1 ( i ) Xt ( n , 2 ) = X_dir2 ( j ) end do end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine ndgrid3 ( X_dir1 , X_dir2 , X_dir3 , Xt ) real ( rk ), intent ( in ), contiguous :: X_dir1 (:), X_dir2 (:), X_dir3 (:) real ( rk ), allocatable , intent ( out ) :: Xt (:,:) integer :: s1 , s2 , s3 , i , j , k , n s1 = size ( X_dir1 ) s2 = size ( X_dir2 ) s3 = size ( X_dir3 ) allocate ( Xt ( s1 * s2 * s3 , 3 )) n = 0 do k = 1 , s3 do j = 1 , s2 do i = 1 , s1 n = n + 1 Xt ( n , 1 ) = X_dir1 ( i ) Xt ( n , 2 ) = X_dir2 ( j ) Xt ( n , 3 ) = X_dir3 ( k ) end do end do end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function repelem ( a , b ) result ( c ) real ( rk ), intent ( in ), contiguous :: a (:) integer , intent ( in ), contiguous :: b (:) real ( rk ) :: c ( sum ( b )) integer :: i , l , n l = 0 do i = 1 , size ( a ) n = b ( i ) c ( l + 1 : l + n ) = a ( i ) l = l + n end do end function repelem !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elemConn_C0_L ( nnode , p ) result ( elemConn ) integer , intent ( in ) :: nnode integer , intent ( in ) :: p integer , allocatable :: elemConn (:,:) integer :: i , l integer , allocatable :: nodes (:) allocate ( elemConn ( (( nnode - p ) / p ) , 2 )) nodes = [( i , i = 1 , nnode )] l = 0 do i = 1 , nnode - p , p l = l + 1 elemConn ( l ,:) = reshape ( nodes ( i : i + p ),[( p + 1 )]) end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elemConn_C0_S ( nnode1 , nnode2 , p1 , p2 ) result ( elemConn ) integer , intent ( in ) :: nnode1 , nnode2 integer , intent ( in ) :: p1 , p2 integer , allocatable :: elemConn (:,:) integer :: i , j , l integer , allocatable :: nodes (:,:) allocate ( elemConn ( (( nnode1 - p1 ) / p1 ) * (( nnode2 - p2 ) / p2 ) , 4 )) nodes = reshape ([( i , i = 1 , nnode1 * nnode2 )], [ nnode1 , nnode2 ]) l = 0 do j = 1 , nnode2 - p2 , p2 do i = 1 , nnode1 - p1 , p1 l = l + 1 elemConn ( l ,:) = reshape ( nodes ( i : i + p1 , j : j + p2 ),[( p1 + 1 ) * ( p2 + 1 )]) end do end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elemConn_C0_V ( nnode1 , nnode2 , nnode3 , p1 , p2 , p3 ) result ( elemConn ) integer , intent ( in ) :: nnode1 , nnode2 , nnode3 integer , intent ( in ) :: p1 , p2 , p3 integer , allocatable :: elemConn (:,:) integer :: i , j , k , l integer , allocatable :: nodes (:,:,:) allocate ( elemConn ( (( nnode1 - p1 ) / p1 ) * (( nnode2 - p2 ) / p2 ) * (( nnode3 - p3 ) / p3 ) , 8 )) nodes = reshape ([( i , i = 1 , nnode1 * nnode2 * nnode3 )], [ nnode1 , nnode2 , nnode3 ]) l = 0 do k = 1 , nnode3 - p3 , p3 do j = 1 , nnode2 - p2 , p2 do i = 1 , nnode1 - p1 , p1 l = l + 1 elemConn ( l ,:) = reshape ( nodes ( i : i + p1 , j : j + p2 , k : k + p3 ),[( p1 + 1 ) * ( p2 + 1 ) * ( p3 + 1 )]) end do end do end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine cmp_elemConn_Cn_L ( nnode , p , Xth , vecKnot_mul , elemConn ) integer , intent ( in ) :: p , nnode integer , intent ( in ), contiguous :: vecKnot_mul (:) real ( rk ), intent ( in ), contiguous :: Xth (:) integer , allocatable , intent ( out ) :: elemConn (:,:) integer , allocatable :: nodes (:) integer :: i , l , nnel , m , nelem nnel = p + 1 nodes = [( i , i = 1 , nnode )] nelem = size ( Xth ) - 1 allocate ( elemConn ( nelem , nnel )) l = 0 m = - p do i = 1 , nelem m = m + vecKnot_mul ( i ) l = l + 1 elemConn ( l ,:) = nodes ( m : m + p ) end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine cmp_elemConn_Cn_S ( nnode1 , nnode2 , p1 , p2 ,& Xth1 , Xth2 , vecKnot_mul1 , vecKnot_mul2 , elemConn ) integer , intent ( in ) :: p1 , p2 , nnode1 , nnode2 integer , intent ( in ), contiguous :: vecKnot_mul1 (:), vecKnot_mul2 (:) real ( rk ), intent ( in ), contiguous :: Xth1 (:), Xth2 (:) integer , allocatable , intent ( out ) :: elemConn (:,:) integer , allocatable :: nodes (:,:), nodes_vec (:) integer :: nnd_total , i , j , l , nnel1 , nnel2 , m , n , nelem1 , nelem2 , nelem nnel1 = p1 + 1 nnel2 = p2 + 1 nnd_total = nnode1 * nnode2 allocate ( nodes_vec ( nnd_total )) Nodes_vec = [( i , i = 1 , nnd_total )] nodes = reshape ( nodes_vec ,[ nnode1 , nnode2 ]) nelem1 = size ( Xth1 ) - 1 nelem2 = size ( Xth2 ) - 1 nelem = nelem1 * nelem2 allocate ( elemConn ( nelem , nnel1 * nnel2 )) l = 0 n = - p2 do j = 1 , nelem2 n = n + vecKnot_mul2 ( j ) m = - p1 do i = 1 , nelem1 m = m + vecKnot_mul1 ( i ) l = l + 1 elemConn ( l ,:) = reshape ( nodes ( m : m + p1 , n : n + p2 ), [ nnel1 * nnel2 ]) end do end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine cmp_elemConn_Cn_V ( nnode1 , nnode2 , nnode3 , p1 , p2 , p3 ,& Xth1 , Xth2 , Xth3 , vecKnot_mul1 , vecKnot_mul2 , vecKnot_mul3 , elemConn ) integer , intent ( in ) :: p1 , p2 , p3 , nnode1 , nnode2 , nnode3 integer , intent ( in ), contiguous :: vecKnot_mul1 (:), vecKnot_mul2 (:), vecKnot_mul3 (:) real ( rk ), intent ( in ), contiguous :: Xth1 (:), Xth2 (:), Xth3 (:) integer , allocatable , intent ( out ) :: elemConn (:,:) integer , allocatable :: nodes (:,:,:), nodes_vec (:) integer :: nnd_total , i , j , k , l , nnel1 , nnel2 , nnel3 , m , n , o , nelem1 , nelem2 , nelem3 , nelem nnel1 = p1 + 1 nnel2 = p2 + 1 nnel3 = p3 + 1 nnd_total = nnode1 * nnode2 * nnode3 allocate ( nodes_vec ( nnd_total )) Nodes_vec = [( i , i = 1 , nnd_total )] nodes = reshape ( nodes_vec ,[ nnode1 , nnode2 , nnode3 ]) nelem1 = size ( Xth1 ) - 1 nelem2 = size ( Xth2 ) - 1 nelem3 = size ( Xth3 ) - 1 nelem = nelem1 * nelem2 * nelem3 allocate ( elemConn ( nelem , nnel1 * nnel2 * nnel3 )) l = 0 o = - p3 do k = 1 , nelem3 o = o + vecKnot_mul3 ( k ) n = - p2 do j = 1 , nelem2 n = n + vecKnot_mul2 ( j ) m = - p1 do i = 1 , nelem1 m = m + vecKnot_mul1 ( i ) l = l + 1 elemConn ( l ,:) = reshape ( nodes ( m : m + p1 , n : n + p2 , o : o + p3 ), [ nnel1 * nnel2 * nnel3 ]) end do end do end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function compute_multiplicity1 ( knot ) result ( multiplicity ) real ( rk ), intent ( in ), contiguous :: knot (:) integer , allocatable :: multiplicity (:) integer :: i , count count = 1 do i = 2 , size ( knot ) if ( knot ( i ) /= knot ( i - 1 )) count = count + 1 end do allocate ( multiplicity ( count )) multiplicity ( 1 ) = 1 count = 1 do i = 2 , size ( knot ) if ( knot ( i ) /= knot ( i - 1 )) then count = count + 1 multiplicity ( count ) = 1 else multiplicity ( count ) = multiplicity ( count ) + 1 end if end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function compute_multiplicity2 ( knot , Xth ) result ( multiplicity ) real ( rk ), intent ( in ), contiguous :: knot (:) real ( rk ), intent ( in ) :: Xth integer :: multiplicity integer :: i , count , size_knot size_knot = size ( knot ) multiplicity = 0 i = 1 do while ( i <= size_knot ) if ( knot ( i ) == Xth ) then count = 1 do while ( i + count <= size_knot . and . knot ( i + count ) == Xth ) count = count + 1 end do if ( count > multiplicity ) then multiplicity = count end if i = i + count else i = i + 1 end if end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function compute_knot_vector ( Xth_dir , degree , continuity ) result ( knot ) real ( rk ), intent ( in ), contiguous :: Xth_dir (:) integer , intent ( in ) :: degree integer , intent ( in ), contiguous :: continuity (:) real ( rk ), allocatable :: knot (:) knot = repelem ( Xth_dir , ( degree - continuity )) end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause elemental pure function isinf ( x ) result ( output ) real ( rk ), intent ( in ) :: x logical :: output output = . false . if ( x > huge ( x )) output = . true . if ( x < - huge ( x )) output = . true . end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause elemental pure function isnan ( x ) result ( output ) real ( rk ), intent ( in ) :: x logical :: output output = . false . if ( x /= x ) output = . true . end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine insert_knot_A_5_1 ( p , UP , Pw , u , k , s , r , nq , UQ , Qw ) integer , intent ( in ) :: p , k , s , r real ( rk ), intent ( in ), contiguous :: UP ( 0 :), Pw ( 0 :,:) real ( rk ), intent ( in ) :: u real ( rk ), allocatable , intent ( out ) :: UQ (:), Qw (:,:) integer , intent ( out ) :: nq integer :: i , j , L , mp , dim , np real ( rk ), allocatable :: Rw (:,:) real ( rk ) :: alpha dim = size ( Pw , 2 ) np = size ( Pw , 1 ) - 1 mp = np + p + 1 nq = np + r allocate ( UQ ( 0 : mp + r )) allocate ( Qw ( 0 : nq , 1 : dim )) allocate ( Rw ( 0 : p , 1 : dim )) UQ ( 0 : k ) = UP ( 0 : k ) UQ ( k + 1 : k + r ) = u UQ ( k + 1 + r : mp + r ) = UP ( k + 1 : mp ) Qw ( 0 : k - p ,:) = Pw ( 0 : k - p ,:) Qw ( k - s + r : np + r ,:) = Pw ( k - s : np ,:) Rw ( 0 : p - s ,:) = Pw ( k - p : k - s ,:) do j = 1 , r L = k - p + j do i = 0 , p - j - s alpha = ( u - UP ( L + i )) / ( UP ( i + k + 1 ) - UP ( L + i )) Rw ( i ,:) = alpha * Rw ( i + 1 ,:) + ( 1.0_rk - alpha ) * Rw ( i ,:) end do Qw ( L ,:) = Rw ( 0 ,:) Qw ( k + r - j - s ,:) = Rw ( p - j - s ,:) end do Qw ( L + 1 : k - s - 1 ,:) = Rw ( 1 : k - s - 1 - L ,:) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function findspan ( n , degree , Xth , knot ) result ( s ) integer , intent ( in ) :: n , degree real ( rk ), intent ( in ) :: Xth real ( rk ), intent ( in ), contiguous :: knot (:) integer :: s integer :: low , high , mid if ( Xth == knot ( n + 2 )) then s = n return end if low = degree high = n + 1 mid = ( low + high ) / 2 do while ( Xth < knot ( mid + 1 ) . or . Xth >= knot ( mid + 2 )) if ( Xth < knot ( mid + 1 )) then high = mid else low = mid end if mid = ( low + high ) / 2 end do s = mid end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine elevate_degree_A_5_9 ( t , knot , degree , Xcw , nc_new , knot_new , Xcw_new ) integer , intent ( in ) :: t real ( rk ), intent ( in ), contiguous :: Xcw (:,:), knot (:) integer , intent ( in ) :: degree integer , intent ( out ) :: nc_new real ( rk ), allocatable , intent ( out ) :: Xcw_new (:,:), knot_new (:) real ( rk ), allocatable :: bezalfs (:,:), bpts (:,:), ebpts (:,:), Nextbpts (:,:), alfs (:) real ( rk ) :: inv , alpha1 , alpha2 , Xth1 , Xth2 , numer , den integer :: n , lbz , rbz , sv , tr , kj , first , knoti , last , alpha3 , dim , nc integer :: i , j , q , s , m , ph , ph2 , mpi , mh , r , a , b , Xcwi , oldr , mul integer , allocatable :: mlp (:) nc = size ( Xcw , 1 ) dim = size ( Xcw , 2 ) mlp = compute_multiplicity ( knot ) mlp = mlp + t nc_new = sum ( mlp ) - ( mlp ( 1 ) - 1 ) - 1 allocate ( Xcw_new ( nc_new , dim ), source = 0.0_rk ) allocate ( bezalfs ( degree + 1 , degree + t + 1 ), source = 0.0_rk ) allocate ( bpts ( degree + 1 , dim ), source = 0.0_rk ) allocate ( ebpts ( degree + t + 1 , dim ), source = 0.0_rk ) allocate ( Nextbpts ( degree + 1 , dim ), source = 0.0_rk ) allocate ( alfs ( degree ), source = 0.0_rk ) n = nc - 1 m = n + degree + 1 ph = degree + t ph2 = ph / 2 bezalfs ( 1 , 1 ) = 1.0_rk bezalfs ( degree + 1 , ph + 1 ) = 1.0_rk do i = 1 , ph2 inv = 1.0_rk / bincoeff ( ph , i ) mpi = min ( degree , i ) do j = max ( 0 , i - t ), mpi bezalfs ( j + 1 , i + 1 ) = inv * bincoeff ( degree , j ) * bincoeff ( t , i - j ) end do end do do i = ph2 + 1 , ph - 1 mpi = min ( degree , i ) do j = max ( 0 , i - t ), mpi bezalfs ( j + 1 , i + 1 ) = bezalfs ( degree - j + 1 , ph - i + 1 ) end do end do mh = ph knoti = ph + 1 r = - 1 a = degree b = degree + 1 Xcwi = 1 Xth1 = knot ( 1 ) Xcw_new ( 1 ,:) = Xcw ( 1 ,:) allocate ( knot_new ( sum ( mlp )), source = 0.0_rk ) knot_new ( 1 : ph + 1 ) = Xth1 do i = 0 , degree bpts ( i + 1 ,:) = Xcw ( i + 1 ,:) end do do while ( b < m ) i = b do while ( b < m . and . knot ( b + 1 ) == knot ( b + 2 )) b = b + 1 if ( b + 2 > size ( knot )) then exit end if end do mul = b - i + 1 mh = mh + mul + t Xth2 = knot ( b + 1 ) oldr = r r = degree - mul if ( oldr > 0 ) then lbz = ( oldr + 2 ) / 2 else lbz = 1 end if if ( r > 0 ) then rbz = ph - ( r + 1 ) / 2 else rbz = ph end if if ( r > 0 ) then numer = Xth2 - Xth1 do q = degree , mul + 1 , - 1 alfs ( q - mul ) = numer / ( knot ( a + q + 1 ) - Xth1 ) end do do j = 1 , r sv = r - j s = mul + j do q = degree , s , - 1 bpts ( q + 1 ,:) = ( 1.0_rk - alfs ( q - s + 1 )) * bpts ( q ,:) + alfs ( q - s + 1 ) * bpts ( q + 1 ,:) end do Nextbpts ( sv + 1 ,:) = bpts ( degree + 1 ,:) end do end if do i = lbz , ph ebpts ( i + 1 ,:) = 0.0_rk mpi = min ( degree , i ) do j = max ( 0 , i - t ), mpi ebpts ( i + 1 ,:) = bezalfs ( j + 1 , i + 1 ) * bpts ( j + 1 ,:) + ebpts ( i + 1 ,:) end do end do if ( oldr > 1 ) then first = knoti - 2 last = knoti den = Xth2 - Xth1 alpha3 = floor (( Xth2 - knot ( knoti )) / den ) do tr = 1 , oldr - 1 i = first j = last kj = j - knoti + 1 do while ( j - i > tr ) if ( i < Xcwi ) then alpha1 = ( Xth2 - knot ( i + 1 )) / ( Xth1 - knot ( i + 1 )) Xcw_new ( i + 1 ,:) = ( 1 - alpha1 ) * Xcw_new ( i ,:) + alpha1 * Xcw_new ( i + 1 ,:) end if if ( j >= lbz ) then if ( j - tr <= knoti - ph + oldr ) then alpha2 = ( Xth2 - knot_new ( j - tr + 1 )) / den ebpts ( kj + 1 ,:) = alpha2 * ebpts ( kj + 1 ,:) + ( 1 - alpha2 ) * ebpts ( kj + 2 ,:) else ebpts ( kj + 1 ,:) = ( 1 - alpha3 ) * ebpts (:, kj + 2 ) + alpha3 * ebpts ( kj + 1 ,:) end if end if i = i + 1 j = j - 1 kj = kj - 1 end do first = first - 1 last = last + 1 end do end if if ( a /= degree ) then do i = 0 , ph - oldr - 1 knot_new ( knoti + 1 ) = Xth1 knoti = knoti + 1 end do end if do j = lbz , rbz Xcw_new ( Xcwi + 1 ,:) = ebpts ( j + 1 ,:) Xcwi = Xcwi + 1 end do if ( b < m ) then do j = 0 , r - 1 bpts ( j + 1 ,:) = Nextbpts ( j + 1 ,:) end do do j = r , degree bpts ( j + 1 ,:) = Xcw ( b - degree + j + 1 ,:) end do a = b b = b + 1 Xth1 = Xth2 else do i = 0 , ph knot_new ( knoti + i + 1 ) = Xth2 end do end if end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function bincoeff ( n , k ) result ( b ) integer , intent ( in ) :: n , k real ( rk ) :: b b = floor ( 0.5_rk + exp ( factln ( n ) - factln ( k ) - factln ( n - k ))) end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function factln ( n ) result ( f ) integer , intent ( in ) :: n real ( rk ) :: f if ( n <= 1 ) then f = 0.0_rk return end if f = log ( gamma ( real ( n + 1 , rk ))) end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function hexahedron_Xc ( L , nc ) result ( Xc ) real ( rk ), intent ( in ) :: L ( 3 ) integer , intent ( in ) :: nc ( 3 ) real ( rk ), allocatable :: Xc (:,:) real ( rk ) :: dx , dy , dz integer :: i , j , k , nci dx = L ( 1 ) / real ( nc ( 1 ) - 1 , rk ) dy = L ( 2 ) / real ( nc ( 2 ) - 1 , rk ) dz = L ( 3 ) / real ( nc ( 3 ) - 1 , rk ) allocate ( Xc ( nc ( 1 ) * nc ( 2 ) * nc ( 3 ), 3 )) nci = 1 do k = 0 , nc ( 3 ) - 1 do j = 0 , nc ( 2 ) - 1 do i = 0 , nc ( 1 ) - 1 Xc ( nci , 1 ) = real ( i , rk ) * dx Xc ( nci , 2 ) = real ( j , rk ) * dy Xc ( nci , 3 ) = real ( k , rk ) * dz nci = nci + 1 end do end do end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function tetragon_Xc ( L , nc ) result ( Xc ) real ( rk ), intent ( in ) :: L ( 2 ) integer , intent ( in ) :: nc ( 2 ) real ( rk ), allocatable :: Xc (:,:) real ( rk ) :: dx , dy integer :: i , j , nci dx = L ( 1 ) / real ( nc ( 1 ) - 1 , rk ) dy = L ( 2 ) / real ( nc ( 2 ) - 1 , rk ) allocate ( Xc ( nc ( 1 ) * nc ( 2 ), 3 )) nci = 1 do j = 0 , nc ( 2 ) - 1 do i = 0 , nc ( 1 ) - 1 Xc ( nci , 1 ) = real ( i , rk ) * dx Xc ( nci , 2 ) = real ( j , rk ) * dy Xc ( nci , 3 ) = 0.0_rk nci = nci + 1 end do end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine remove_knots_A_5_8 ( p , knot , Pw , u , r , s , num , t , knot_new , Pw_new ) real ( rk ), intent ( in ) :: u integer , intent ( in ) :: p , r , s , num real ( rk ), intent ( in ), contiguous :: knot (:) real ( rk ), intent ( in ), contiguous :: Pw (:,:) real ( rk ), allocatable , intent ( out ) :: knot_new (:) real ( rk ), allocatable , intent ( out ) :: Pw_new (:,:) real ( rk ), allocatable :: Pw_copy (:,:), knot_copy (:) integer , intent ( out ) :: t real ( rk ) :: tol , alfi , alfj real ( rk ), allocatable :: temp (:,:) integer :: i , j , ii , jj , remflag , off , first , last , ord , fout , m , k , n , nc , dim , tt dim = size ( Pw , 2 ) nc = size ( Pw , 1 ) n = nc m = n + p + 1 ord = p + 1 fout = ( 2 * r - s - p ) / 2 last = r - s first = r - p Pw_copy = Pw knot_copy = knot ! TODO: tol = 1.0e-6_rk * minval ( Pw (:, dim )) / ( 1.0_rk + maxval ( sqrt ( sum ( Pw ** 2 , 2 )))) allocate ( temp ( 2 * p + 1 , dim ), source = 0.0_rk ) t = 0 do tt = 0 , num - 1 off = first - 1 temp ( 1 ,:) = Pw_copy ( off ,:) temp ( last + 1 - off + 1 ,:) = Pw_copy ( last + 1 ,:) i = first j = last ii = 1 jj = last - off remflag = 0 do while ( j - i > t ) alfi = ( u - knot_copy ( i )) / ( knot_copy ( i + ord + t ) - knot_copy ( i )) alfj = ( u - knot_copy ( j - t )) / ( knot_copy ( j + ord ) - knot_copy ( j - t )) temp ( ii + 1 ,:) = ( Pw_copy ( i ,:) - ( 1.0_rk - alfi ) * temp ( ii - 1 + 1 ,:)) / alfi temp ( jj + 1 ,:) = ( Pw_copy ( j ,:) - alfj * temp ( jj + 1 + 1 ,:)) / ( 1.0_rk - alfj ) i = i + 1 ii = ii + 1 j = j - 1 jj = jj - 1 end do if ( j - i <= t ) then if ( norm2 ( temp ( ii - 1 + 1 ,:) - temp ( jj + 1 + 1 ,:)) <= tol ) then remflag = 1 else alfi = ( u - knot_copy ( i )) / ( knot_copy ( i + ord + t ) - knot_copy ( i )) if ( norm2 ( Pw_copy ( i ,:) - ( alfi * temp ( ii + t + 1 + 1 ,:) + ( 1.0_rk - alfi ) * temp ( ii - 1 + 1 ,:))) <= tol ) then remflag = 1 end if end if end if if ( remflag == 0 ) then exit else i = first j = last do while ( j - i > t ) Pw_copy ( i ,:) = temp ( i - off + 1 ,:) Pw_copy ( j ,:) = temp ( j - off + 1 ,:) i = i + 1 j = j - 1 end do end if first = first - 1 last = last + 1 t = t + 1 end do if ( t == 0 ) then return end if do k = r + 1 , m knot_copy ( k - t ) = knot_copy ( k ) end do j = fout i = j do k = 1 , t - 1 if ( mod ( k , 2 ) == 1 ) then i = i + 1 else j = j - 1 end if end do do k = i + 1 , n Pw_copy ( j ,:) = Pw_copy ( k ,:) j = j + 1 end do knot_new = knot_copy ( 1 : size ( knot_copy ) - t ) Pw_new = Pw_copy ( 1 : size ( Pw_copy , 1 ) - t ,:) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function unique_integer ( vec ) result ( output ) integer , dimension (:), intent ( in ), contiguous :: vec integer , dimension (:), allocatable :: output integer :: i , j , k allocate ( output ( 0 )) do i = 1 , size ( vec ) k = 0 do j = 1 , size ( output ) if ( vec ( i ) == output ( j )) then k = k + 1 exit end if end do if ( k == 0 ) then output = [ output , vec ( i )] end if end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function unique_real ( vec ) result ( output ) real ( rk ), dimension (:), intent ( in ), contiguous :: vec real ( rk ), dimension (:), allocatable :: output integer :: i , j , k allocate ( output ( 0 )) do i = 1 , size ( vec ) k = 0 do j = 1 , size ( output ) if ( vec ( i ) == output ( j )) then k = k + 1 exit end if end do if ( k == 0 ) then output = [ output , vec ( i )] end if end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function rotation ( alpha , beta , theta ) result ( R ) real ( rk ), intent ( in ) :: alpha , beta , theta real ( rk ), dimension ( 3 , 3 ) :: R R ( 1 , 1 ) = cosd ( beta ) * cosd ( theta ) R ( 2 , 1 ) = cosd ( beta ) * sind ( theta ) R ( 3 , 1 ) = - sind ( beta ) R ( 1 , 2 ) = sind ( alpha ) * sind ( beta ) * cosd ( theta ) - cosd ( alpha ) * sind ( theta ) R ( 2 , 2 ) = sind ( alpha ) * sind ( beta ) * sind ( theta ) + cosd ( alpha ) * cosd ( theta ) R ( 3 , 2 ) = sind ( alpha ) * cosd ( beta ) R ( 1 , 3 ) = cosd ( alpha ) * sind ( beta ) * cosd ( theta ) + sind ( alpha ) * sind ( theta ) R ( 2 , 3 ) = cosd ( alpha ) * sind ( beta ) * sind ( theta ) - sind ( alpha ) * cosd ( theta ) R ( 3 , 3 ) = cosd ( alpha ) * cosd ( beta ) end function !=============================================================================== end module forcad_utils","tags":"","loc":"sourcefile/forcad_utils.f90.html"},{"title":"shape_circle.f90 – ForCAD","text":"This file depends on sourcefile~~shape_circle.f90~~EfferentGraph sourcefile~shape_circle.f90 shape_circle.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~shape_circle.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code program shape_circle use forcad , only : rk , nurbs_curve implicit none type ( nurbs_curve ) :: shape !----------------------------------------------------------------------------- ! Setting up NURBS circle !----------------------------------------------------------------------------- !> Set a circle with radius 2.0 and center at [0.0, 0.0, 0.0] call shape % set_circle ( center = [ 0.0_rk , 0.0_rk , 0.0_rk ], radius = 2.0_rk ) !> Export control points to a VTK file call shape % export_Xc ( 'vtk/shape_circle_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating circle !----------------------------------------------------------------------------- !> Generate the NURBS circle with a resolution of 100 call shape % create ( res = 100 ) !> Export the generated cirlce to a VTK file call shape % export_Xg ( 'vtk/shape_circle_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 shape % show ( 'vtk/shape_circle_Xc.vtk' , 'vtk/shape_circle_Xg.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS curve object call shape % finalize () end program","tags":"","loc":"sourcefile/shape_circle.f90.html"},{"title":"example_surface_1.f90 – ForCAD","text":"This file depends on sourcefile~~example_surface_1.f90~~EfferentGraph sourcefile~example_surface_1.f90 example_surface_1.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~example_surface_1.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> This program demonstrates the usage of a NURBS (Non-Uniform Rational B-Spline) surface object to create and finalize a NURBS surface. !> It sets up control points, weights, and knot vectors for all three dimensions, generates the surface, and exports the control points and the surface to VTK files. program example3_surface use forcad implicit none type ( nurbs_surface ) :: nurbs !! Declare a NURBS surface object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights real ( rk ) :: knot1 ( 6 ), knot2 ( 6 ) !! Arrays for knot vectors in both dimensions !----------------------------------------------------------------------------- ! Setting up the NURBS surface !----------------------------------------------------------------------------- !> Define control points for the NURBS surface Xc = generate_Xc ( 3 , 3 , 1.0_rk ) !> Define weights for the control points allocate ( Wc ( size ( Xc , 1 ))) Wc = 1.0_rk Wc ( 2 ) = 2.0_rk !> Define knot vectors for both dimensions knot1 = [ 0.0_rk , 0.0_rk , 0.0_rk , 1.0_rk , 1.0_rk , 1.0_rk ] knot2 = [ 0.0_rk , 0.0_rk , 0.0_rk , 1.0_rk , 1.0_rk , 1.0_rk ] !> Set knot vectors, control points, and weights for the NURBS surface object call nurbs % set ( knot1 , knot2 , Xc , Wc ) !> Export the control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_surface_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS surface !----------------------------------------------------------------------------- !> Generate the NURBS surface with resolutions of 30 in both dimensions call nurbs % create ( 30 , 30 ) !> Export the generated surface to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_surface_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/nurbs_surface_Xc.vtk' , 'vtk/nurbs_surface_Xg.vtk' ) !----------------------------------------------------------------------------- ! Refinements !----------------------------------------------------------------------------- !> Print size of the knot vectors print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) !> Insert knots 0.25, twice and 0.75, once in both directions call nurbs % insert_knots ( 1 , [ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) ! direction 1 call nurbs % insert_knots ( 2 , [ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) ! direction 2 !> Print size of the knot vectors after inserting knots print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) !> Print the degrees print * , nurbs % get_degree () !> Elevate degree by 2 in both directions call nurbs % elevate_degree ( 1 , 2 ) ! direction 1 call nurbs % elevate_degree ( 2 , 2 ) ! direction 2 !> Print the degrees after elevating print * , nurbs % get_degree () !> Print size of the knot vectors print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) !> Remove knots 0.25, twice and 0.75, once in both directions call nurbs % remove_knots ( 1 , [ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) ! direction 1 call nurbs % remove_knots ( 2 , [ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) ! direction 2 !> Print size of the knot vectors after removing knots print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) !> Generate the refined NURBS surface with resolutions of 30 in both dimensions call nurbs % create () !> Export updated control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_surface_Xc2.vtk' ) !> Export the refined generated surface to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_surface_Xg2.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/nurbs_surface_Xc2.vtk' , 'vtk/nurbs_surface_Xg2.vtk' ) !----------------------------------------------------------------------------- ! Transformations !----------------------------------------------------------------------------- !> Rotate the control points call nurbs % rotate_Xc ( alpha = 4 5.0_rk , beta = 0.0_rk , theta = 9 0.0_rk ) !> Rotate the generated curve call nurbs % rotate_Xg ( alpha =- 4 5.0_rk , beta = 0.0_rk , theta =- 9 0.0_rk ) !> Translate the control points call nurbs % translate_Xc ([ 1.0_rk , 2.0_rk , - 3.0_rk ]) !> Translate the generated curve call nurbs % translate_Xg ([ - 1.0_rk , - 2.0_rk , 3.0_rk ]) !> Export the transformed control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_surface_Xc3.vtk' ) !> Export the transformed generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_surface_Xg3.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/nurbs_surface_Xc3.vtk' , 'vtk/nurbs_surface_Xg3.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS surface object call nurbs % finalize () contains !----------------------------------------------------------------------------- function generate_Xc ( num_rows , num_cols , peak_height ) result ( control_points ) integer , intent ( in ) :: num_rows , num_cols real ( rk ), intent ( in ) :: peak_height real ( rk ), allocatable :: control_points (:,:) integer :: i , j real ( rk ) :: x_spacing , y_spacing , x_offset , y_offset x_spacing = 1.0_rk / real ( num_cols - 1 , rk ) y_spacing = 1.0_rk / real ( num_rows - 1 , rk ) x_offset = - 0.5_rk y_offset = - 0.5_rk allocate ( control_points ( num_rows * num_cols , 3 )) do i = 1 , num_rows do j = 1 , num_cols control_points (( i - 1 ) * num_cols + j , 1 ) = x_offset + real ( j - 1 , rk ) * x_spacing control_points (( i - 1 ) * num_cols + j , 2 ) = y_offset + real ( i - 1 , rk ) * y_spacing control_points (( i - 1 ) * num_cols + j , 3 ) = & peak_height * exp ( - (( control_points (( i - 1 ) * num_cols + j , 1 ) ** 2 ) & + ( control_points (( i - 1 ) * num_cols + j , 2 ) ** 2 ))) + 0.5_rk * peak_height * 0.2_rk end do end do end function !----------------------------------------------------------------------------- end program example3_surface","tags":"","loc":"sourcefile/example_surface_1.f90.html"},{"title":"example_volume_1.f90 – ForCAD","text":"This file depends on sourcefile~~example_volume_1.f90~~EfferentGraph sourcefile~example_volume_1.f90 example_volume_1.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~example_volume_1.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> This program demonstrates the usage of a NURBS (Non-Uniform Rational B-Spline) volume object to create and finalize a NURBS volume. !> It sets up control points, weights, and knot vectors for all three dimensions, generates the volume, and exports the control points and the volume to VTK files. program example3_volume use forcad , only : rk , nurbs_volume implicit none type ( nurbs_volume ) :: nurbs !! Declare a NURBS volume object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights real ( rk ) :: knot1 ( 4 ), knot2 ( 4 ), knot3 ( 4 ) !! Arrays for knot vectors in all three dimensions !----------------------------------------------------------------------------- ! Setting up the NURBS volume !----------------------------------------------------------------------------- !> Define the control points for the NURBS volume Xc = generate_Xc ( 5.0_rk ) !> Define weights for the control points (optional) allocate ( Wc ( size ( Xc , 1 )), source = 1.0_rk ) Wc ( 2 ) = 5.0_rk !> Define knot vectors for all three dimensions 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 ] !> Set knot vectors, control points, and weights for the NURBS volume object !> Wc is optional. call nurbs % set ( knot1 , knot2 , knot3 , Xc , Wc ) !> Export the control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_volume_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS volume !----------------------------------------------------------------------------- !> Generate the NURBS volume with resolutions of 20, 20, and 20 in the three dimensions call nurbs % create ( 20 , 20 , 20 ) !> Export the generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_volume_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/nurbs_volume_Xc.vtk' , 'vtk/nurbs_volume_Xg.vtk' ) !----------------------------------------------------------------------------- ! Refinements !----------------------------------------------------------------------------- !> Print size of knot vectors print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) print * , size ( nurbs % get_knot ( 3 )) !> Insert knots 0.25 and 0.75 in all three directions call nurbs % insert_knots ( 1 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 1 call nurbs % insert_knots ( 2 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 2 call nurbs % insert_knots ( 3 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 3 !> Print size of knot vectors after inserting knots print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) print * , size ( nurbs % get_knot ( 3 )) !> Print degrees print * , nurbs % get_degree () !> Elevate degree by 2 in all three directions call nurbs % elevate_degree ( 1 , 2 ) ! direction 1 call nurbs % elevate_degree ( 2 , 2 ) ! direction 2 call nurbs % elevate_degree ( 3 , 2 ) ! direction 3 !> Print degrees after elevating print * , nurbs % get_degree () !> Print size of knot vectors print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) print * , size ( nurbs % get_knot ( 3 )) call nurbs % remove_knots ( 1 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 1 call nurbs % remove_knots ( 2 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 2 call nurbs % remove_knots ( 3 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 3 !> Print size of knot vectors after removing knots print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) print * , size ( nurbs % get_knot ( 3 )) !> Generate the refined NURBS volume with resolutions of 40, 40, and 40 in the three dimensions call nurbs % create () !> Export updated control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_volume_Xc2.vtk' ) !> Export the refined generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_volume_Xg2.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/nurbs_volume_Xc2.vtk' , 'vtk/nurbs_volume_Xg2.vtk' ) !----------------------------------------------------------------------------- ! Transformations !----------------------------------------------------------------------------- !> Rotate the control points call nurbs % rotate_Xc ( alpha =- 4 5.0_rk , beta = 0.0_rk , theta = 9 0.0_rk ) !> Rotate the generated curve call nurbs % rotate_Xg ( alpha =- 4 5.0_rk , beta = 0.0_rk , theta = 9 0.0_rk ) !> Translate the control points call nurbs % translate_Xc ([ 1.0_rk , 2.0_rk , - 3.0_rk ]) !> Translate the generated curve call nurbs % translate_Xg ([ 1.0_rk , 2.0_rk , - 3.0_rk ]) !> Export the transformed control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_volume_Xc3.vtk' ) !> Export the transformed generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_volume_Xg3.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/nurbs_volume_Xc3.vtk' , 'vtk/nurbs_volume_Xg3.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS volume object call nurbs % finalize () contains !----------------------------------------------------------------------------- function generate_Xc ( L ) result ( control_points ) implicit none real ( rk ), intent ( in ) :: L real ( rk ), allocatable :: control_points (:,:) real ( rk ) :: L2 L2 = L / 2.0_rk allocate ( control_points ( 8 , 3 )) control_points ( 1 ,:) = [ L2 , - L2 , L2 ] control_points ( 2 ,:) = [ L2 , - L2 , - L2 ] control_points ( 3 ,:) = [ - L2 , - L2 , L2 ] control_points ( 4 ,:) = [ - L2 , - L2 , - L2 ] control_points ( 5 ,:) = [ L2 , L2 , L2 ] control_points ( 6 ,:) = [ L2 , L2 , - L2 ] control_points ( 7 ,:) = [ - L2 , L2 , L2 ] control_points ( 8 ,:) = [ - L2 , L2 , - L2 ] end function !----------------------------------------------------------------------------- end program example3_volume","tags":"","loc":"sourcefile/example_volume_1.f90.html"},{"title":"demo_volume.f90 – ForCAD","text":"This file depends on sourcefile~~demo_volume.f90~~EfferentGraph sourcefile~demo_volume.f90 demo_volume.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~demo_volume.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> This program demonstrates the usage of a NURBS volume object to create, and finalize a NURBS volume. !> It sets up control points and weights, generates the volume, and exports the control points !> and the volume to VTK files at various stages. program example_nurbs_volume use forcad , only : rk , nurbs_volume implicit none type ( nurbs_volume ) :: nurbs !! Declare a NURBS volume object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights !----------------------------------------------------------------------------- ! Setting up the NURBS volume !----------------------------------------------------------------------------- !> Define control points for the NURBS volume Xc = generate_Xc ( 1.0_rk ) !> Define weights for the control points allocate ( Wc ( size ( Xc , 1 )), source = 1.0_rk ) !> Set control points and weights for the NURBS volume object call nurbs % set ([ 2 , 2 , 2 ], Xc , Wc ) !> Export initial control points to a VTK file call nurbs % export_Xc ( 'vtk/demo_volume_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS volume !----------------------------------------------------------------------------- !> Generate the NURBS volume with a resolution of 15X15X15 call nurbs % create ( 15 , 15 , 15 ) !> Export the generated volume to a VTK file call nurbs % export_Xg ( 'vtk/demo_volume_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_volume_Xc.vtk' , 'vtk/demo_volume_Xg.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS volume object call nurbs % finalize () contains !----------------------------------------------------------------------------- function generate_Xc ( L ) result ( control_points ) implicit none real ( rk ), intent ( in ) :: L real ( rk ), allocatable :: control_points (:,:) real ( rk ) :: L2 L2 = L / 2.0_rk allocate ( control_points ( 8 , 3 )) control_points ( 1 ,:) = [ L2 , - L2 , L2 ] control_points ( 2 ,:) = [ L2 , - L2 , - L2 ] control_points ( 3 ,:) = [ - L2 , - L2 , L2 ] control_points ( 4 ,:) = [ - L2 , - L2 , - L2 ] control_points ( 5 ,:) = [ L2 , L2 , L2 ] control_points ( 6 ,:) = [ L2 , L2 , - L2 ] control_points ( 7 ,:) = [ - L2 , L2 , L2 ] control_points ( 8 ,:) = [ - L2 , L2 , - L2 ] end function !----------------------------------------------------------------------------- end program example_nurbs_volume","tags":"","loc":"sourcefile/demo_volume.f90.html"},{"title":"forcad.f90 – ForCAD","text":"This file depends on sourcefile~~forcad.f90~~EfferentGraph sourcefile~forcad.f90 forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Files dependent on this one sourcefile~~forcad.f90~~AfferentGraph sourcefile~forcad.f90 forcad.f90 sourcefile~demo_curve.f90 demo_curve.f90 sourcefile~demo_curve.f90->sourcefile~forcad.f90 sourcefile~demo_surface.f90 demo_surface.f90 sourcefile~demo_surface.f90->sourcefile~forcad.f90 sourcefile~demo_volume.f90 demo_volume.f90 sourcefile~demo_volume.f90->sourcefile~forcad.f90 sourcefile~example_curve_1.f90 example_curve_1.f90 sourcefile~example_curve_1.f90->sourcefile~forcad.f90 sourcefile~example_surface_1.f90 example_surface_1.f90 sourcefile~example_surface_1.f90->sourcefile~forcad.f90 sourcefile~example_volume_1.f90 example_volume_1.f90 sourcefile~example_volume_1.f90->sourcefile~forcad.f90 sourcefile~put_to_nurbs.f90 put_to_nurbs.f90 sourcefile~put_to_nurbs.f90->sourcefile~forcad.f90 sourcefile~shape_circle.f90 shape_circle.f90 sourcefile~shape_circle.f90->sourcefile~forcad.f90 sourcefile~shape_hexahedron.f90 shape_hexahedron.f90 sourcefile~shape_hexahedron.f90->sourcefile~forcad.f90 sourcefile~shape_tetragon.f90 shape_tetragon.f90 sourcefile~shape_tetragon.f90->sourcefile~forcad.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause module forcad use forcad_utils use forcad_nurbs_curve use forcad_nurbs_surface use forcad_nurbs_volume private public rk , nurbs_curve , nurbs_surface , nurbs_volume end module forcad","tags":"","loc":"sourcefile/forcad.f90.html"},{"title":"forcad_nurbs_surface.f90 – ForCAD","text":"This file depends on sourcefile~~forcad_nurbs_surface.f90~~EfferentGraph sourcefile~forcad_nurbs_surface.f90 forcad_nurbs_surface.f90 sourcefile~forcad_utils.f90 forcad_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Files dependent on this one sourcefile~~forcad_nurbs_surface.f90~~AfferentGraph sourcefile~forcad_nurbs_surface.f90 forcad_nurbs_surface.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~forcad.f90->sourcefile~forcad_nurbs_surface.f90 sourcefile~demo_curve.f90 demo_curve.f90 sourcefile~demo_curve.f90->sourcefile~forcad.f90 sourcefile~demo_surface.f90 demo_surface.f90 sourcefile~demo_surface.f90->sourcefile~forcad.f90 sourcefile~demo_volume.f90 demo_volume.f90 sourcefile~demo_volume.f90->sourcefile~forcad.f90 sourcefile~example_curve_1.f90 example_curve_1.f90 sourcefile~example_curve_1.f90->sourcefile~forcad.f90 sourcefile~example_surface_1.f90 example_surface_1.f90 sourcefile~example_surface_1.f90->sourcefile~forcad.f90 sourcefile~example_volume_1.f90 example_volume_1.f90 sourcefile~example_volume_1.f90->sourcefile~forcad.f90 sourcefile~put_to_nurbs.f90 put_to_nurbs.f90 sourcefile~put_to_nurbs.f90->sourcefile~forcad.f90 sourcefile~shape_circle.f90 shape_circle.f90 sourcefile~shape_circle.f90->sourcefile~forcad.f90 sourcefile~shape_hexahedron.f90 shape_hexahedron.f90 sourcefile~shape_hexahedron.f90->sourcefile~forcad.f90 sourcefile~shape_tetragon.f90 shape_tetragon.f90 sourcefile~shape_tetragon.f90->sourcefile~forcad.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> This module defines the 'nurbs_surface' type for representing a Non-Uniform Rational B-Spline (NURBS) surface. module forcad_nurbs_surface use forcad_utils , only : rk , basis_bspline , elemConn_C0 , kron , ndgrid , compute_multiplicity , compute_knot_vector , & basis_bspline_der , insert_knot_A_5_1 , findspan , elevate_degree_A_5_9 , remove_knots_A_5_8 , tetragon_Xc , & elemConn_Cn , unique , rotation implicit none private public nurbs_surface !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause type nurbs_surface real ( rk ), allocatable , private :: Xc (:,:) !! Control points (2D array: [nc(1)*nc(2), dim]) real ( rk ), allocatable , private :: Xg (:,:) !! Geometry points (2D array: [ng(1)*ng(2), dim]) real ( rk ), allocatable , private :: Wc (:) !! Weights for control points (1D array: [nc(1)*nc(2)]) real ( rk ), allocatable , private :: Xt1 (:) !! Evaluation parameter values in the first direction (1D array: [ng(1)]) real ( rk ), allocatable , private :: Xt2 (:) !! Evaluation parameter values in the second direction (1D array: [ng(2)]) real ( rk ), allocatable , private :: knot1 (:) !! Knot vector in the first direction (1D array) real ( rk ), allocatable , private :: knot2 (:) !! Knot vector in the second direction (1D array) integer , private :: degree ( 2 ) !! Degree (order) of the surface integer , private :: nc ( 2 ) !! Number of control points in each direction integer , private :: ng ( 2 ) !! Number of geometry points in each direction integer , allocatable , private :: elemConn_Xc_vis (:,:) !! Connectivity for visualization of control points integer , allocatable , private :: elemConn_Xg_vis (:,:) !! Connectivity for visualization of geometry points integer , allocatable , private :: elemConn (:,:) !! IGA element connectivity contains procedure :: set1 !!> Set knot vectors, control points and weights for the NURBS surface object procedure :: set2 !!> Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights procedure :: set3 !!> Set Bezier or Rational Bezier surface using control points and weights generic :: set => set1 , set2 , set3 !!> Set NURBS surface procedure :: create !!> Generate geometry points procedure :: get_Xc !!> Get control points procedure :: get_Xg !!> Get geometry points procedure :: get_Wc !!> Get weights procedure :: get_Xt !!> Get parameter values procedure , private :: get_knot_all !!> Get all knot vectors procedure , private :: get_knoti !!> Get i-th knot value generic :: get_knot => get_knoti , get_knot_all !!> Get knot vector procedure :: get_ng !!> Get number of geometry points procedure , private :: get_degree_all !!> Get degree of the NURBS surface in both directions procedure , private :: get_degree_dir !!> Get degree of the NURBS surface in a specific direction generic :: get_degree => get_degree_all , get_degree_dir !!> Get degree of the NURBS surface procedure :: finalize !!> Finalize the NURBS surface object procedure :: cmp_elem_Xc_vis !!> Generate connectivity for control points procedure :: cmp_elem_Xg_vis !!> Generate connectivity for geometry points procedure :: cmp_elem !!> Generate IGA element connectivity procedure :: get_elem_Xc_vis !!> Get connectivity for control points procedure :: get_elem_Xg_vis !!> Get connectivity for geometry points procedure :: get_elem !!> Get IGA element connectivity procedure :: set_elem_Xc_vis !!> Set connectivity for control points procedure :: set_elem_Xg_vis !!> Set connectivity for geometry points procedure :: set_elem !!> Set IGA element connectivity procedure :: export_Xc !!> Export control points to VTK file procedure :: export_Xg !!> Export geometry points to VTK file procedure :: modify_Xc !!> Modify control points procedure :: modify_Wc !!> Modify weights procedure :: get_multiplicity !!> Get multiplicity of the knot vector procedure :: get_continuity !!> Get continuity of the surface procedure :: get_nc !!> Get number of required control points procedure :: derivative !!> Compute the derivative of the NURBS surface procedure :: basis !!> Compute the basis functions of the NURBS surface procedure :: insert_knots !!> Insert knots into the knot vector procedure :: elevate_degree !!> Elevate degree procedure :: is_rational !!> Check if the NURBS surface is rational procedure :: remove_knots !!> Remove knots from the knot vector procedure :: rotate_Xc !!> Rotate control points procedure :: rotate_Xg !!> Rotate geometry points procedure :: translate_Xc !!> Translate control points procedure :: translate_Xg !!> Translate geometry points procedure :: show !!> Show the NURBS object using PyVista ! Shapes procedure :: set_tetragon !!> Set a tetragon end type !=============================================================================== contains !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set knot vectors, control points and weights for the NURBS surface object. pure subroutine set1 ( this , knot1 , knot2 , Xc , Wc ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: knot1 (:) real ( rk ), intent ( in ), contiguous :: knot2 (:) real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) if ( allocated ( this % knot1 )) deallocate ( this % knot1 ) if ( allocated ( this % knot2 )) deallocate ( this % knot2 ) if ( allocated ( this % Xc )) deallocate ( this % Xc ) this % knot1 = knot1 this % knot2 = knot2 this % degree = this % get_degree () this % nc ( 1 ) = this % get_nc ( 1 ) this % nc ( 2 ) = this % get_nc ( 2 ) this % Xc = Xc if ( present ( Wc )) then if ( size ( Wc ) /= this % nc ( 1 ) * this % nc ( 2 )) then error stop 'Number of weights does not match the number of control points.' else if ( allocated ( this % Wc )) deallocate ( this % Wc ) this % Wc = Wc end if end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights pure subroutine set2 ( this , Xth_dir1 , Xth_dir2 , degree , continuity1 , continuity2 , Xc , Wc ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: Xth_dir1 (:), Xth_dir2 (:) integer , intent ( in ), contiguous :: degree (:) integer , intent ( in ), contiguous :: continuity1 (:), continuity2 (:) real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) this % knot1 = compute_knot_vector ( Xth_dir1 , degree ( 1 ), continuity1 ) this % knot2 = compute_knot_vector ( Xth_dir2 , degree ( 2 ), continuity2 ) this % degree ( 1 ) = degree ( 1 ) this % degree ( 2 ) = degree ( 2 ) this % nc ( 1 ) = this % get_nc ( 1 ) this % nc ( 2 ) = this % get_nc ( 2 ) this % Xc = Xc if ( present ( Wc )) this % Wc = Wc end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set Bezier or Rational Bezier surface using control points and weights. pure subroutine set3 ( this , nc , Xc , Wc ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ), contiguous :: nc (:) real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) if ( allocated ( this % Xc )) deallocate ( this % Xc ) this % Xc = Xc this % nc = nc if ( allocated ( this % knot1 )) deallocate ( this % knot1 ) allocate ( this % knot1 ( 2 * this % nc ( 1 ))) this % knot1 ( 1 : this % nc ( 1 )) = 0.0_rk this % knot1 ( this % nc ( 1 ) + 1 : 2 * this % nc ( 1 )) = 1.0_rk if ( allocated ( this % knot2 )) deallocate ( this % knot2 ) allocate ( this % knot2 ( 2 * this % nc ( 2 ))) this % knot2 ( 1 : this % nc ( 2 )) = 0.0_rk this % knot2 ( this % nc ( 2 ) + 1 : 2 * this % nc ( 2 )) = 1.0_rk this % degree = this % get_degree () if ( present ( Wc )) then if ( size ( Wc ) /= this % nc ( 1 ) * this % nc ( 2 )) then error stop 'Number of weights does not match the number of control points.' else if ( allocated ( this % Wc )) deallocate ( this % Wc ) this % Wc = Wc end if end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine create ( this , res1 , res2 , Xt1 , Xt2 , Xt ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ), optional :: res1 , res2 real ( rk ), intent ( in ), contiguous , optional :: Xt1 (:), Xt2 (:) real ( rk ), contiguous , intent ( in ), optional :: Xt (:,:) integer :: i , j real ( rk ), allocatable :: Tgc1 (:), Tgc2 (:), Tgc (:) real ( rk ), allocatable :: Xt_ (:,:) ! check if (. not . allocated ( this % Xc )) then error stop 'Control points are not set.' end if if (. not . allocated ( this % knot1 ) . or . . not . allocated ( this % knot2 )) then error stop 'Knot vector(s) is/are not set.' end if ! Set parameter values if ( present ( Xt1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) this % Xt1 = Xt1 elseif ( present ( res1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) allocate ( this % Xt1 ( res1 )) this % Xt1 = [( real ( i - 1 , rk ) / real ( res1 - 1 , rk ), i = 1 , res1 )] ! else ! this%Xt1 = this%Xt1 end if ! Set parameter values if ( present ( Xt2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) this % Xt2 = Xt2 elseif ( present ( res2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) allocate ( this % Xt2 ( res2 )) this % Xt2 = [( real ( i - 1 , rk ) / real ( res2 - 1 , rk ), i = 1 , res2 )] ! else ! this%Xt2 = this%Xt2 end if if ( present ( Xt )) then Xt_ = Xt else ! Set number of geometry points this % ng ( 1 ) = size ( this % Xt1 , 1 ) this % ng ( 2 ) = size ( this % Xt2 , 1 ) call ndgrid ( this % Xt1 , this % Xt2 , Xt_ ) end if if ( allocated ( this % Xg )) deallocate ( this % Xg ) allocate ( this % Xg ( size ( Xt_ , 1 ), size ( this % Xc , 2 ))) if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xt_ , 1 ) Tgc1 = basis_bspline ( Xt_ ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt_ ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgc = kron ( Tgc2 , Tgc1 ) Tgc = Tgc * ( this % Wc / ( dot_product ( Tgc , this % Wc ))) do j = 1 , size ( this % Xc , 2 ) this % Xg ( i , j ) = dot_product ( Tgc , this % Xc (:, j )) end do end do else ! B-Spline do i = 1 , size ( Xt_ , 1 ) Tgc1 = basis_bspline ( Xt_ ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt_ ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgc = kron ( Tgc2 , Tgc1 ) do j = 1 , size ( this % Xc , 2 ) this % Xg ( i , j ) = dot_product ( Tgc , this % Xc (:, j )) end do end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xc ( this ) result ( Xc ) class ( nurbs_surface ), intent ( in ) :: this real ( rk ), allocatable :: Xc (:,:) if ( allocated ( this % Xc )) then Xc = this % Xc else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xg ( this ) result ( Xg ) class ( nurbs_surface ), intent ( in ) :: this real ( rk ), allocatable :: Xg (:,:) if ( allocated ( this % Xg )) then Xg = this % Xg else error stop 'Geometry points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Wc ( this ) result ( Wc ) class ( nurbs_surface ), intent ( in ) :: this real ( rk ), allocatable :: Wc (:) if ( allocated ( this % Wc )) then Wc = this % Wc else error stop 'The NURBS surface is not rational.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xt ( this , dir ) result ( Xt ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: dir real ( rk ), allocatable :: Xt (:) if ( dir == 1 ) then if ( allocated ( this % Xt1 )) then Xt = this % Xt1 else error stop 'Parameter values are not set.' end if elseif ( dir == 2 ) then if ( allocated ( this % Xt2 )) then Xt = this % Xt2 else error stop 'Parameter values are not set.' end if else error stop 'Invalid direction for parameter values.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_ng ( this ) result ( ng ) class ( nurbs_surface ), intent ( in ) :: this integer :: ng ( 2 ) ng = this % ng end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_degree_all ( this ) result ( degree ) class ( nurbs_surface ), intent ( in ) :: this integer :: degree ( 2 ) integer , allocatable :: m1 (:), m2 (:) m1 = this % get_multiplicity ( 1 ) m2 = this % get_multiplicity ( 2 ) degree ( 1 ) = m1 ( 1 ) - 1 degree ( 2 ) = m2 ( 1 ) - 1 end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_degree_dir ( this , dir ) result ( degree ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: dir integer :: degree integer , allocatable :: m1 (:), m2 (:) if ( dir == 1 ) then m1 = this % get_multiplicity ( 1 ) degree = m1 ( 1 ) - 1 else if ( dir == 2 ) then m2 = this % get_multiplicity ( 2 ) degree = m2 ( 1 ) - 1 else error stop 'Invalid direction for degree.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_knot_all ( this , dir ) result ( knot ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: dir real ( rk ), allocatable :: knot (:) if ( dir == 1 ) then if ( allocated ( this % knot1 )) then knot = this % knot1 else error stop 'Knot vector is not set.' end if elseif ( dir == 2 ) then if ( allocated ( this % knot2 )) then knot = this % knot2 else error stop 'Knot vector is not set.' end if else error stop 'Invalid direction for knot vector.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_knoti ( this , dir , i ) result ( knot ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: dir integer , intent ( in ) :: i real ( rk ) :: knot if ( dir == 1 ) then if ( allocated ( this % knot1 )) then if ( i < 1 . or . i > size ( this % knot1 )) then error stop 'Invalid index for knot vector.' else knot = this % knot1 ( i ) end if else error stop 'Knot vector is not set.' end if elseif ( dir == 2 ) then if ( allocated ( this % knot2 )) then if ( i < 1 . or . i > size ( this % knot2 )) then error stop 'Invalid index for knot vector.' else knot = this % knot2 ( i ) end if else error stop 'Knot vector is not set.' end if else error stop 'Invalid direction for knot vector.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine finalize ( this ) class ( nurbs_surface ), intent ( inout ) :: this if ( allocated ( this % Xc )) deallocate ( this % Xc ) if ( allocated ( this % Xg )) deallocate ( this % Xg ) if ( allocated ( this % Wc )) deallocate ( this % Wc ) if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) if ( allocated ( this % knot1 )) deallocate ( this % knot1 ) if ( allocated ( this % knot2 )) deallocate ( this % knot2 ) if ( allocated ( this % elemConn_Xc_vis )) deallocate ( this % elemConn_Xc_vis ) if ( allocated ( this % elemConn_Xg_vis )) deallocate ( this % elemConn_Xg_vis ) if ( allocated ( this % elemConn )) deallocate ( this % elemConn ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem_Xc_vis ( this , p ) result ( elemConn ) class ( nurbs_surface ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) integer , intent ( in ), contiguous , optional :: p (:) if ( present ( p )) then elemConn = elemConn_C0 ( this % nc ( 1 ), this % nc ( 2 ), p ( 1 ), p ( 2 )) else elemConn = elemConn_C0 ( this % nc ( 1 ), this % nc ( 2 ), 1 , 1 ) end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem_Xg_vis ( this , p ) result ( elemConn ) class ( nurbs_surface ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) integer , intent ( in ), contiguous , optional :: p (:) if ( present ( p )) then elemConn = elemConn_C0 ( this % ng ( 1 ), this % ng ( 2 ), p ( 1 ), p ( 2 )) else elemConn = elemConn_C0 ( this % ng ( 1 ), this % ng ( 2 ), 1 , 1 ) end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine export_Xc ( this , filename ) class ( nurbs_surface ), intent ( in ) :: this character ( len =* ), intent ( in ) :: filename integer :: i , nc , nunit integer , allocatable :: elemConn (:,:) ! check if (. not . allocated ( this % Xc )) then error stop 'Control points are not set.' end if if (. not . allocated ( this % elemConn_Xc_vis )) then elemConn = this % cmp_elem_Xc_vis () else elemConn = this % elemConn_Xc_vis end if nc = size ( this % Xc , 1 ) open ( newunit = nunit , file = filename , action = 'write' ) write ( nunit , '(a)' ) '# vtk DataFile Version 2.0' write ( nunit , '(a)' ) 'Generated by ForCAD' write ( nunit , '(a)' ) 'ASCII' write ( nunit , '(a)' ) 'DATASET UNSTRUCTURED_GRID' write ( nunit , '(a,\" \",g0,\" \",a)' ) 'POINTS' , nc , 'double' if ( size ( this % Xc , 2 ) == 2 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xc ( i , 1 ), this % Xc ( i , 2 ), 0.0_rk , i = 1 , nc ) elseif ( size ( this % Xc , 2 ) == 3 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xc ( i , 1 ), this % Xc ( i , 2 ), this % Xc ( i , 3 ) , i = 1 , nc ) else error stop 'Invalid dimension for control points.' end if write ( nunit , '(a,\" \",g0,\" \",g0)' ) 'CELLS' , size ( elemConn , 1 ), size ( elemConn , 1 ) * ( size ( elemConn , 2 ) + 1 ) write ( nunit , '(g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0)' )& ( 4 , elemConn ( i , 1 ) - 1 , elemConn ( i , 2 ) - 1 , elemConn ( i , 4 ) - 1 , elemConn ( i , 3 ) - 1 , i = 1 , size ( elemConn , 1 )) write ( nunit , '(a,\" \",g0)' ) 'CELL_TYPES' , size ( elemConn , 1 ) write ( nunit , '(g0)' ) ( 9 , i = 1 , size ( elemConn , 1 )) close ( nunit ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine export_Xg ( this , filename ) class ( nurbs_surface ), intent ( in ) :: this character ( len =* ), intent ( in ) :: filename integer :: i , ng , nunit integer , allocatable :: elemConn (:,:) ! check if (. not . allocated ( this % Xg )) then error stop 'Geometry points are not set.' end if if (. not . allocated ( this % elemConn_Xg_vis )) then elemConn = this % cmp_elem_Xg_vis () else elemConn = this % elemConn_Xg_vis end if ng = size ( this % Xg , 1 ) open ( newunit = nunit , file = filename , action = 'write' ) write ( nunit , '(a)' ) '# vtk DataFile Version 2.0' write ( nunit , '(a)' ) 'Generated by ForCAD' write ( nunit , '(a)' ) 'ASCII' write ( nunit , '(a)' ) 'DATASET UNSTRUCTURED_GRID' write ( nunit , '(a,\" \",g0,\" \",a)' ) 'POINTS' , ng , 'double' if ( size ( this % Xg , 2 ) == 2 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xg ( i , 1 ), this % Xg ( i , 2 ), 0.0_rk , i = 1 , ng ) elseif ( size ( this % Xg , 2 ) == 3 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xg ( i , 1 ), this % Xg ( i , 2 ), this % Xg ( i , 3 ) , i = 1 , ng ) else error stop 'Invalid dimension for geometry points.' end if write ( nunit , '(a,\" \",g0,\" \",g0)' ) 'CELLS' , size ( elemConn , 1 ), size ( elemConn , 1 ) * ( size ( elemConn , 2 ) + 1 ) write ( nunit , '(g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0)' )& ( 4 , elemConn ( i , 1 ) - 1 , elemConn ( i , 2 ) - 1 , elemConn ( i , 4 ) - 1 , elemConn ( i , 3 ) - 1 , i = 1 , size ( elemConn , 1 )) write ( nunit , '(a,\" \",g0)' ) 'CELL_TYPES' , size ( elemConn , 1 ) write ( nunit , '(g0)' ) ( 9 , i = 1 , size ( elemConn , 1 )) close ( nunit ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine modify_Xc ( this , X , num , dir ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ) :: X integer , intent ( in ) :: num integer , intent ( in ) :: dir if ( allocated ( this % Xc )) then this % Xc ( num , dir ) = X call this % set ( knot1 = this % knot1 , knot2 = this % knot2 , Xc = this % Xc , Wc = this % Wc ) else error stop 'Control points are not set.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine modify_Wc ( this , W , num ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ) :: W integer , intent ( in ) :: num real ( rk ), allocatable :: knot1 (:), knot2 (:), Xc (:,:), Wc (:) if ( allocated ( this % Wc )) then this % Wc ( num ) = W Xc = this % Xc Wc = this % Wc if ( allocated ( this % knot1 ) . and . allocated ( this % knot2 )) then knot1 = this % knot1 knot2 = this % knot2 call this % set ( knot1 = knot1 , knot2 = knot2 , Xc = Xc , Wc = Wc ) else call this % set ( nc = this % nc , Xc = Xc , Wc = Wc ) end if else error stop 'The NURBS surface is not rational.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_multiplicity ( this , dir ) result ( m ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: dir integer , allocatable :: m (:) if ( dir == 1 ) then ! check if (. not . allocated ( this % knot1 )) then error stop 'Knot vector is not set.' else m = compute_multiplicity ( this % knot1 ) end if elseif ( dir == 2 ) then ! check if (. not . allocated ( this % knot2 )) then error stop 'Knot vector is not set.' else m = compute_multiplicity ( this % knot2 ) end if else error stop 'Invalid direction.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_continuity ( this , dir ) result ( c ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: dir integer , allocatable :: c (:) if ( dir == 1 ) then ! check if (. not . allocated ( this % knot1 )) then error stop 'Knot vector is not set.' else c = this % degree ( 1 ) - compute_multiplicity ( this % knot1 ) end if elseif ( dir == 2 ) then ! check if (. not . allocated ( this % knot2 )) then error stop 'Knot vector is not set.' else c = this % degree ( 2 ) - compute_multiplicity ( this % knot2 ) end if else error stop 'Invalid direction.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_nc ( this , dir ) result ( nc ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: dir integer :: nc if ( dir == 1 ) then ! check if (. not . allocated ( this % knot1 )) then error stop 'Knot vector is not set.' else nc = sum ( compute_multiplicity ( this % knot1 )) - this % degree ( 1 ) - 1 end if elseif ( dir == 2 ) then ! check if (. not . allocated ( this % knot2 )) then error stop 'Knot vector is not set.' else nc = sum ( compute_multiplicity ( this % knot2 )) - this % degree ( 2 ) - 1 end if else error stop 'Invalid direction.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine derivative ( this , res1 , res2 , Xt1 , Xt2 , dTgc ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ), optional :: res1 , res2 real ( rk ), intent ( in ), contiguous , optional :: Xt1 (:), Xt2 (:) real ( rk ), allocatable , intent ( out ) :: dTgc (:,:) real ( rk ), allocatable :: dTgci (:) integer :: i real ( rk ), allocatable :: dTgc1 (:), dTgc2 (:) real ( rk ), allocatable :: Xt (:,:) ! Set parameter values if ( present ( Xt1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) this % Xt1 = Xt1 elseif ( present ( res1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) allocate ( this % Xt1 ( res1 )) this % Xt1 = [( real ( i - 1 , rk ) / real ( res1 - 1 , rk ), i = 1 , res1 )] ! else ! this%Xt1 = this%Xt1 end if ! Set parameter values if ( present ( Xt2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) this % Xt2 = Xt2 elseif ( present ( res2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) allocate ( this % Xt2 ( res2 )) this % Xt2 = [( real ( i - 1 , rk ) / real ( res2 - 1 , rk ), i = 1 , res2 )] ! else ! this%Xt2 = this%Xt2 end if ! Set number of geometry points this % ng ( 1 ) = size ( this % Xt1 , 1 ) this % ng ( 2 ) = size ( this % Xt2 , 1 ) call ndgrid ( this % Xt1 , this % Xt2 , Xt ) allocate ( dTgc ( this % ng ( 1 ) * this % ng ( 2 ), this % nc ( 1 ) * this % nc ( 2 ))) if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xt , 1 ) dTgc1 = basis_bspline_der ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) dTgc2 = basis_bspline_der ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) dTgci = kron ( dTgc2 , dTgc1 ) dTgci = dTgci * ( this % Wc / ( dot_product ( dTgci , this % Wc ))) dTgc ( i ,:) = dTgci end do else ! B-Spline do i = 1 , size ( Xt , 1 ) dTgc1 = basis_bspline_der ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) dTgc2 = basis_bspline_der ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) dTgci = kron ( dTgc2 , dTgc1 ) dTgc ( i ,:) = dTgci end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine basis ( this , res1 , res2 , Xt1 , Xt2 , Tgc ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ), optional :: res1 , res2 real ( rk ), intent ( in ), contiguous , optional :: Xt1 (:), Xt2 (:) real ( rk ), allocatable , intent ( out ) :: Tgc (:,:) real ( rk ), allocatable :: Tgci (:) integer :: i real ( rk ), allocatable :: Tgc1 (:), Tgc2 (:) real ( rk ), allocatable :: Xt (:,:) ! Set parameter values if ( present ( Xt1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) this % Xt1 = Xt1 elseif ( present ( res1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) allocate ( this % Xt1 ( res1 )) this % Xt1 = [( real ( i - 1 , rk ) / real ( res1 - 1 , rk ), i = 1 , res1 )] ! else ! this%Xt1 = this%Xt1 end if ! Set parameter values if ( present ( Xt2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) this % Xt2 = Xt2 elseif ( present ( res2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) allocate ( this % Xt2 ( res2 )) this % Xt2 = [( real ( i - 1 , rk ) / real ( res2 - 1 , rk ), i = 1 , res2 )] ! else ! this%Xt2 = this%Xt2 end if ! Set number of geometry points this % ng ( 1 ) = size ( this % Xt1 , 1 ) this % ng ( 2 ) = size ( this % Xt2 , 1 ) call ndgrid ( this % Xt1 , this % Xt2 , Xt ) allocate ( Tgc ( this % ng ( 1 ) * this % ng ( 2 ), this % nc ( 1 ) * this % nc ( 2 ))) if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xt , 1 ) Tgc1 = basis_bspline ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgci = kron ( Tgc2 , Tgc1 ) Tgci = Tgci * ( this % Wc / ( dot_product ( Tgci , this % Wc ))) Tgc ( i ,:) = Tgci end do else ! B-Spline do i = 1 , size ( Xt , 1 ) Tgc1 = basis_bspline ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgci = kron ( Tgc2 , Tgc1 ) Tgc ( i ,:) = Tgci end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine insert_knots ( this , dir , Xth , r ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ) :: dir real ( rk ), intent ( in ), contiguous :: Xth (:) integer , intent ( in ), contiguous :: r (:) integer :: k , i , s , dim , j , n_new real ( rk ), allocatable :: Xc (:,:), Xcw (:,:), Xcw_new (:,:), Xc_new (:,:), Wc_new (:), knot_new (:) real ( rk ), allocatable :: Xc3 (:,:,:) real ( rk ), allocatable :: knot1 (:), knot2 (:) if ( dir == 1 ) then ! direction 1 if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 1 ) - 1 , this % degree ( 1 ), Xth ( i ), this % knot1 ) if ( this % knot1 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot1 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xcw = reshape ( Xcw ,[ this % nc ( 1 ), this % nc ( 2 ) * ( dim + 1 )]) call insert_knot_A_5_1 (& this % degree ( 1 ),& this % knot1 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xcw_new ) Xcw_new = reshape ( Xcw_new ,[ this % nc ( 2 ) * ( n_new + 1 ), dim + 1 ]) allocate ( Xc_new ( 1 : this % nc ( 2 ) * ( n_new + 1 ), 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 2 ) * ( n_new + 1 ))) do j = 1 , this % nc ( 2 ) * ( n_new + 1 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot2 = this % knot2 call this % set ( knot1 = knot_new , knot2 = knot2 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 1 ) - 1 , this % degree ( 1 ), Xth ( i ), this % knot1 ) if ( this % knot1 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot1 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) Xc = reshape ( this % Xc ,[ this % nc ( 1 ), this % nc ( 2 ) * dim ]) call insert_knot_A_5_1 (& this % degree ( 1 ),& this % knot1 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xc_new ) Xc_new = reshape ( Xc_new ,[( this % nc ( 2 )) * ( n_new + 1 ), dim ]) knot2 = this % knot2 call this % set ( knot1 = knot_new , knot2 = knot2 , Xc = Xc_new ) end do end if elseif ( dir == 2 ) then ! direction 2 if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 2 ) - 1 , this % degree ( 2 ), Xth ( i ), this % knot2 ) if ( this % knot2 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot2 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc3 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), dim + 1 ]) Xc3 = reshape ( Xc3 , [ this % nc ( 2 ), this % nc ( 1 ), dim + 1 ], order = [ 2 , 1 , 3 ]) Xcw = reshape ( Xc3 ,[ this % nc ( 2 ), this % nc ( 1 ) * ( dim + 1 )]) call insert_knot_A_5_1 (& this % degree ( 2 ),& this % knot2 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xcw_new ) Xc3 = reshape ( Xcw_new , [ n_new + 1 , this % nc ( 1 ), dim + 1 ]) Xc3 = reshape ( Xc3 , [ this % nc ( 1 ), n_new + 1 , dim + 1 ], order = [ 2 , 1 , 3 ]) Xcw_new = reshape ( Xc3 ,[( this % nc ( 1 )) * ( n_new + 1 ), dim + 1 ]) allocate ( Xc_new ( 1 :( n_new + 1 ) * this % nc ( 1 ), 1 : dim )) allocate ( Wc_new ( 1 :( n_new + 1 ) * this % nc ( 1 ))) do j = 1 , ( n_new + 1 ) * this % nc ( 1 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 call this % set ( knot2 = knot_new , knot1 = knot1 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 2 ) - 1 , this % degree ( 2 ), Xth ( i ), this % knot2 ) if ( this % knot2 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot2 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) Xc3 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), dim ]) Xc3 = reshape ( Xc3 , [ this % nc ( 2 ), this % nc ( 1 ), dim ], order = [ 2 , 1 , 3 ]) Xc = reshape ( Xc3 ,[ this % nc ( 2 ), this % nc ( 1 ) * dim ]) call insert_knot_A_5_1 (& this % degree ( 2 ),& this % knot2 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xc_new ) Xc3 = reshape ( Xc_new , [ n_new + 1 , this % nc ( 1 ), dim ]) Xc3 = reshape ( Xc3 , [ this % nc ( 1 ), n_new + 1 , dim ], order = [ 2 , 1 , 3 ]) Xc_new = reshape ( Xc3 ,[( this % nc ( 1 )) * ( n_new + 1 ), dim ]) knot1 = this % knot1 call this % set ( knot2 = knot_new , knot1 = knot1 , Xc = Xc_new ) end do end if else error stop 'Invalid direction.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine elevate_degree ( this , dir , t ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ) :: dir integer , intent ( in ) :: t real ( rk ), allocatable :: Xc (:,:), Xcw (:,:), Xcw_new (:,:), knot_new (:), Xc_new (:,:), Wc_new (:) integer :: dim , j , nc_new real ( rk ), allocatable :: Xc3 (:,:,:) real ( rk ), allocatable :: knot1 (:), knot2 (:) if ( dir == 1 ) then ! direction 1 if ( this % is_rational ()) then ! NURBS dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xcw = reshape ( Xcw ,[ this % nc ( 1 ), this % nc ( 2 ) * ( dim + 1 )], order = [ 1 , 2 ]) call elevate_degree_A_5_9 ( t , this % knot1 , this % degree ( 1 ), Xcw , nc_new , knot_new , Xcw_new ) Xcw_new = reshape ( Xcw_new ,[ this % nc ( 2 ) * nc_new , dim + 1 ], order = [ 1 , 2 ]) allocate ( Xc_new ( 1 : this % nc ( 2 ) * nc_new , 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 2 ) * nc_new )) do j = 1 , this % nc ( 2 ) * nc_new Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot2 = this % knot2 call this % set ( knot1 = knot_new , knot2 = knot2 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) else ! B-Spline dim = size ( this % Xc , 2 ) Xc = reshape ( this % Xc ,[ this % nc ( 1 ), this % nc ( 2 ) * ( dim )], order = [ 1 , 2 ]) call elevate_degree_A_5_9 ( t , this % knot1 , this % degree ( 1 ), Xc , nc_new , knot_new , Xc_new ) Xc_new = reshape ( Xc_new ,[ this % nc ( 2 ) * nc_new , dim ], order = [ 1 , 2 ]) knot2 = this % knot2 call this % set ( knot1 = knot_new , knot2 = knot2 , Xc = Xc_new ) deallocate ( Xc , Xc_new ) end if elseif ( dir == 2 ) then ! direction 2 if ( this % is_rational ()) then ! NURBS dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc3 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), dim + 1 ]) Xc3 = reshape ( Xc3 , [ this % nc ( 2 ), this % nc ( 1 ), dim + 1 ], order = [ 2 , 1 , 3 ]) Xcw = reshape ( Xc3 ,[ this % nc ( 2 ), this % nc ( 1 ) * ( dim + 1 )]) call elevate_degree_A_5_9 ( t , this % knot2 , this % degree ( 2 ), Xcw , nc_new , knot_new , Xcw_new ) Xc3 = reshape ( Xcw_new , [ nc_new , this % nc ( 1 ), dim + 1 ]) Xc3 = reshape ( Xc3 , [ this % nc ( 1 ), nc_new , dim + 1 ], order = [ 2 , 1 , 3 ]) Xcw_new = reshape ( Xc3 ,[( this % nc ( 1 )) * nc_new , dim + 1 ]) allocate ( Xc_new ( 1 : nc_new * this % nc ( 1 ), 1 : dim )) allocate ( Wc_new ( 1 : nc_new * this % nc ( 1 ))) do j = 1 , nc_new * this % nc ( 1 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 call this % set ( knot2 = knot_new , knot1 = knot1 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) else ! B-Spline dim = size ( this % Xc , 2 ) Xc3 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), dim ]) Xc3 = reshape ( Xc3 , [ this % nc ( 2 ), this % nc ( 1 ), dim ], order = [ 2 , 1 , 3 ]) Xc = reshape ( Xc3 ,[ this % nc ( 2 ), this % nc ( 1 ) * dim ]) call elevate_degree_A_5_9 ( t , this % knot2 , this % degree ( 2 ), Xc , nc_new , knot_new , Xc_new ) Xc3 = reshape ( Xc_new , [ nc_new , this % nc ( 1 ), dim ]) Xc3 = reshape ( Xc3 , [ this % nc ( 1 ), nc_new , dim ], order = [ 2 , 1 , 3 ]) Xc_new = reshape ( Xc3 ,[( this % nc ( 1 )) * nc_new , dim ]) knot1 = this % knot1 call this % set ( knot2 = knot_new , knot1 = knot1 , Xc = Xc_new ) end if else error stop 'Invalid direction.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function is_rational ( this ) result ( r ) class ( nurbs_surface ), intent ( in ) :: this logical :: r r = . false . if ( allocated ( this % Wc )) then if ( any ( this % Wc /= this % Wc ( 1 ))) then r = . true . end if end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem_Xc_vis ( this , elemConn ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn_Xc_vis )) deallocate ( this % elemConn_Xc_vis ) this % elemConn_Xc_vis = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem_Xg_vis ( this , elemConn ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn_Xg_vis )) deallocate ( this % elemConn_Xg_vis ) this % elemConn_Xg_vis = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem ( this , elemConn ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn )) deallocate ( this % elemConn ) this % elemConn = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem_Xc_vis ( this ) result ( elemConn ) class ( nurbs_surface ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn_Xc_vis end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem_Xg_vis ( this ) result ( elemConn ) class ( nurbs_surface ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn_Xg_vis end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem ( this ) result ( elemConn ) class ( nurbs_surface ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine remove_knots ( this , dir , Xth , r ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ) :: dir real ( rk ), intent ( in ), contiguous :: Xth (:) integer , intent ( in ), contiguous :: r (:) integer :: k , i , s , dim , j , nc_new , t real ( rk ), allocatable :: Xc (:,:), Xcw (:,:), Xcw_new (:,:), Xc_new (:,:), Wc_new (:), knot_new (:) real ( rk ), allocatable :: Xc3 (:,:,:) real ( rk ), allocatable :: knot1 (:), knot2 (:) if ( dir == 1 ) then ! direction 1 if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 1 ) - 1 , this % degree ( 1 ), Xth ( i ), this % knot1 ) if ( this % knot1 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot1 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xcw = reshape ( Xcw ,[ this % nc ( 1 ), this % nc ( 2 ) * ( dim + 1 )], order = [ 1 , 2 ]) call remove_knots_A_5_8 (& this % degree ( 1 ),& this % knot1 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xcw_new ) if ( allocated ( Xcw )) deallocate ( Xcw ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) Xcw_new = reshape ( Xcw_new ,[ this % nc ( 2 ) * ( nc_new ), dim + 1 ], order = [ 1 , 2 ]) allocate ( Xc_new ( 1 : this % nc ( 2 ) * ( nc_new ), 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 2 ) * ( nc_new ))) do j = 1 , this % nc ( 2 ) * ( nc_new ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot2 = this % knot2 call this % set ( knot1 = knot_new , knot2 = knot2 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw_new , Xc_new , Wc_new ) end if end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 1 ) - 1 , this % degree ( 1 ), Xth ( i ), this % knot1 ) if ( this % knot1 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot1 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) Xc = reshape ( this % Xc ,[ this % nc ( 1 ), this % nc ( 2 ) * dim ], order = [ 1 , 2 ]) call remove_knots_A_5_8 (& this % degree ( 1 ),& this % knot1 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xc_new ) if ( allocated ( Xc )) deallocate ( Xc ) if ( t == 0 ) then ! no change else nc_new = size ( Xc_new , 1 ) Xc_new = reshape ( Xc_new ,[( this % nc ( 2 )) * ( nc_new ), dim ], order = [ 1 , 2 ]) knot2 = this % knot2 call this % set ( knot1 = knot_new , knot2 = knot2 , Xc = Xc_new ) end if end do end if elseif ( dir == 2 ) then ! direction 2 if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 2 ) - 1 , this % degree ( 2 ), Xth ( i ), this % knot2 ) if ( this % knot2 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot2 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc3 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), dim + 1 ]) Xc3 = reshape ( Xc3 , [ this % nc ( 2 ), this % nc ( 1 ), dim + 1 ], order = [ 2 , 1 , 3 ]) Xcw = reshape ( Xc3 , [ this % nc ( 2 ), this % nc ( 1 ) * ( dim + 1 )]) call remove_knots_A_5_8 (& this % degree ( 2 ),& this % knot2 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xcw_new ) if ( allocated ( Xcw )) deallocate ( Xcw ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) Xc3 = reshape ( Xcw_new , [ nc_new , this % nc ( 1 ), dim + 1 ]) Xc3 = reshape ( Xc3 , [ this % nc ( 1 ), nc_new , dim + 1 ], order = [ 2 , 1 , 3 ]) Xcw_new = reshape ( Xc3 ,[( this % nc ( 1 )) * ( nc_new ), dim + 1 ]) allocate ( Xc_new ( 1 :( nc_new ) * this % nc ( 1 ), 1 : dim )) allocate ( Wc_new ( 1 :( nc_new ) * this % nc ( 1 ))) do j = 1 , ( nc_new ) * this % nc ( 1 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 call this % set ( knot2 = knot_new , knot1 = knot1 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw_new , Xc_new , Wc_new ) end if end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 2 ) - 1 , this % degree ( 2 ), Xth ( i ), this % knot2 ) if ( this % knot2 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot2 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) Xc3 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), dim ]) Xc3 = reshape ( Xc3 , [ this % nc ( 2 ), this % nc ( 1 ), dim ], order = [ 2 , 1 , 3 ]) Xc = reshape ( Xc3 ,[ this % nc ( 2 ), this % nc ( 1 ) * dim ]) call remove_knots_A_5_8 (& this % degree ( 2 ),& this % knot2 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xc_new ) if ( allocated ( Xc )) deallocate ( Xc ) if ( t == 0 ) then ! no change else nc_new = size ( Xc_new , 1 ) Xc3 = reshape ( Xc_new , [ nc_new , this % nc ( 1 ), dim ]) Xc3 = reshape ( Xc3 , [ this % nc ( 1 ), nc_new , dim ], order = [ 2 , 1 , 3 ]) Xc_new = reshape ( Xc3 ,[( this % nc ( 1 )) * ( nc_new ), dim ]) knot1 = this % knot1 call this % set ( knot2 = knot_new , knot1 = knot1 , Xc = Xc_new ) end if end do end if else error stop 'Invalid direction.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_tetragon ( this , L , nc , Wc ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ) :: L ( 2 ) integer , intent ( in ) :: nc ( 2 ) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) call this % set ( nc = nc , Xc = tetragon_Xc ( L , nc ), Wc = Wc ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem ( this ) result ( elemConn ) class ( nurbs_surface ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) call elemConn_Cn ( this % nc ( 1 ), this % nc ( 2 ),& this % degree ( 1 ), this % degree ( 2 ),& unique ( this % knot1 ), unique ( this % knot2 ),& this % get_multiplicity ( 1 ), this % get_multiplicity ( 2 ),& elemConn ) end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine rotate_Xc ( this , alpha , beta , theta ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ) :: alpha , beta , theta integer :: i do i = 1 , this % nc ( 1 ) * this % nc ( 2 ) this % Xc ( i , :) = matmul ( rotation ( alpha , beta , theta ), this % Xc ( i , :)) end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine rotate_Xg ( this , alpha , beta , theta ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ) :: alpha , beta , theta integer :: i do i = 1 , this % ng ( 1 ) * this % ng ( 2 ) this % Xg ( i , :) = matmul ( rotation ( alpha , beta , theta ), this % Xg ( i , :)) end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine translate_Xc ( this , vec ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ) :: vec (:) integer :: i do i = 1 , this % nc ( 1 ) * this % nc ( 2 ) this % Xc ( i , :) = this % Xc ( i , :) + vec end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine translate_Xg ( this , vec ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ) :: vec (:) integer :: i do i = 1 , this % ng ( 1 ) * this % ng ( 2 ) this % Xg ( i , :) = this % Xg ( i , :) + vec end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine show ( this , vtkfile_Xc , vtkfile_Xg ) class ( nurbs_surface ), intent ( inout ) :: this character ( len =* ), intent ( in ) :: vtkfile_Xc , vtkfile_Xg character ( len = 3000 ) :: pyvista_script pyvista_script = & \"import pyvista as pv\" // achar ( 10 ) // & \"pv.global_theme.color = 'white'\" // achar ( 10 ) // & \"Xc = pv.read('\" // trim ( vtkfile_Xc ) // \"')\" // achar ( 10 ) // & \"Xg = pv.read('\" // trim ( vtkfile_Xg ) // \"')\" // achar ( 10 ) // & \"p = pv.Plotter(lighting='light kit')\" // achar ( 10 ) // & \"actor_Xcp = p.add_mesh(\" // achar ( 10 ) // & \" Xc,\" // achar ( 10 ) // & \" style='points',\" // achar ( 10 ) // & \" point_size=10,\" // achar ( 10 ) // & \" color='red',\" // achar ( 10 ) // & \" render_points_as_spheres=True,\" // achar ( 10 ) // & \" opacity=0.5,\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"actor_Xcw = p.add_mesh(\" // achar ( 10 ) // & \" Xc,\" // achar ( 10 ) // & \" show_edges=True,\" // achar ( 10 ) // & \" color='yellow',\" // achar ( 10 ) // & \" line_width=3,\" // achar ( 10 ) // & \" style='wireframe',\" // achar ( 10 ) // & \" opacity=0.2\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"actor_Xg = p.add_mesh(\" // achar ( 10 ) // & \" Xg,\" // achar ( 10 ) // & \" show_edges=False,\" // achar ( 10 ) // & \" color='cyan',\" // achar ( 10 ) // & \" line_width=7,\" // achar ( 10 ) // & \" metallic=0.6,\" // achar ( 10 ) // & \" pbr=True,\" // achar ( 10 ) // & \" split_sharp_edges=True,\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_axes(interactive=False)\" // achar ( 10 ) // & \"def point_picker_callback(point):\" // achar ( 10 ) // & \" mesh = Xc\" // achar ( 10 ) // & \" point_id = mesh.find_closest_point(point)\" // achar ( 10 ) // & \" point_coords = mesh.points[point_id]\" // achar ( 10 ) // & \" label = f'ID: {point_id + 1}\\n({point_coords[0]:.3f}, {point_coords[1]:.3f}, {point_coords[2]:.3f})'\" // achar ( 10 ) // & \" p.add_point_labels(\" // achar ( 10 ) // & \" [point_coords],\" // achar ( 10 ) // & \" [label],\" // achar ( 10 ) // & \" font_size=14,\" // achar ( 10 ) // & \" text_color='black',\" // achar ( 10 ) // & \" show_points=False,\" // achar ( 10 ) // & \" fill_shape=False,\" // achar ( 10 ) // & \" shape=None,\" // achar ( 10 ) // & \" )\" // achar ( 10 ) // & \"picker = p.enable_point_picking(callback=point_picker_callback, show_message=False)\" // achar ( 10 ) // & \"window_size = p.window_size\" // achar ( 10 ) // & \"y_pos = window_size[1]\" // achar ( 10 ) // & \"def Xcp_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xcp.SetVisibility(flag)\" // achar ( 10 ) // & \"def Xcw_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xcw.SetVisibility(flag)\" // achar ( 10 ) // & \"def Xg_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xg.SetVisibility(flag)\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xcp_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='red',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 1 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xcw_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='yellow',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 2 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xg_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='cyan',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 3 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xc (Points)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 1 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xc (Control geometry)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 2 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xg (Geometry)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 3 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text('ForCAD', position=(0.0, 10.0), font_size=14, color='black', font='times')\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'https://github.com/gha3mi/forcad',\" // achar ( 10 ) // & \" position=(0.0, 0.0),\" // achar ( 10 ) // & \" font_size=7,\" // achar ( 10 ) // & \" color='blue',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.show(title='ForCAD', interactive=True)\" call execute_command_line ( 'python -c \"' // trim ( adjustl ( pyvista_script )) // '\"' ) end subroutine !=============================================================================== end module forcad_nurbs_surface","tags":"","loc":"sourcefile/forcad_nurbs_surface.f90.html"},{"title":"forcad_nurbs_curve.f90 – ForCAD","text":"This file depends on sourcefile~~forcad_nurbs_curve.f90~~EfferentGraph sourcefile~forcad_nurbs_curve.f90 forcad_nurbs_curve.f90 sourcefile~forcad_utils.f90 forcad_utils.f90 sourcefile~forcad_nurbs_curve.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Files dependent on this one sourcefile~~forcad_nurbs_curve.f90~~AfferentGraph sourcefile~forcad_nurbs_curve.f90 forcad_nurbs_curve.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~forcad.f90->sourcefile~forcad_nurbs_curve.f90 sourcefile~demo_curve.f90 demo_curve.f90 sourcefile~demo_curve.f90->sourcefile~forcad.f90 sourcefile~demo_surface.f90 demo_surface.f90 sourcefile~demo_surface.f90->sourcefile~forcad.f90 sourcefile~demo_volume.f90 demo_volume.f90 sourcefile~demo_volume.f90->sourcefile~forcad.f90 sourcefile~example_curve_1.f90 example_curve_1.f90 sourcefile~example_curve_1.f90->sourcefile~forcad.f90 sourcefile~example_surface_1.f90 example_surface_1.f90 sourcefile~example_surface_1.f90->sourcefile~forcad.f90 sourcefile~example_volume_1.f90 example_volume_1.f90 sourcefile~example_volume_1.f90->sourcefile~forcad.f90 sourcefile~put_to_nurbs.f90 put_to_nurbs.f90 sourcefile~put_to_nurbs.f90->sourcefile~forcad.f90 sourcefile~shape_circle.f90 shape_circle.f90 sourcefile~shape_circle.f90->sourcefile~forcad.f90 sourcefile~shape_hexahedron.f90 shape_hexahedron.f90 sourcefile~shape_hexahedron.f90->sourcefile~forcad.f90 sourcefile~shape_tetragon.f90 shape_tetragon.f90 sourcefile~shape_tetragon.f90->sourcefile~forcad.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> This module defines the 'nurbs_curve' type for representing a Non-Uniform Rational B-Spline (NURBS) curve. module forcad_nurbs_curve use forcad_utils , only : rk , basis_bspline , elemConn_C0 , compute_multiplicity , compute_knot_vector , basis_bspline_der ,& insert_knot_A_5_1 , findspan , elevate_degree_A_5_9 , remove_knots_A_5_8 , & elemConn_Cn , unique , rotation implicit none private public nurbs_curve !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause type nurbs_curve real ( rk ), allocatable , private :: Xc (:,:) !! Control points (2D array: [nc, dim]) real ( rk ), allocatable , private :: Xg (:,:) !! Geometry points (2D array: [ng, dim]) real ( rk ), allocatable , private :: Wc (:) !! Weights for control points (1D array: [nc]) real ( rk ), allocatable , private :: Xt (:) !! Evaluation points (1D array: [ng]) real ( rk ), allocatable , private :: knot (:) !! Knot vector (1D array) integer , private :: degree !! Degree (order) of the curve integer , private :: nc !! Number of control points integer , private :: ng !! Number of geometry points integer , allocatable , private :: elemConn_Xc_vis (:,:) !! Connectivity for visualization of control points integer , allocatable , private :: elemConn_Xg_vis (:,:) !! Connectivity for visualization of geometry points integer , allocatable , private :: elemConn (:,:) !! IGA element connectivity contains procedure :: set1 !!> Set knot vector, control points and weights for the NURBS curve object procedure :: set2 !!> Set NURBS curve using nodes of parameter space, degree, continuity, control points and weights procedure :: set3 !!> Set Bezier or Rational Bezier curve using control points and weights generic :: set => set1 , set2 , set3 !!> Set NURBS curve procedure :: create !!> Generate geometry points procedure :: get_Xc !!> Get control points procedure :: get_Xg !!> Get geometry points procedure :: get_Wc !!> Get weights procedure :: get_Xt !!> Get parameter values procedure , private :: get_knot_all !!> Get all knot vectors procedure , private :: get_knoti !!> Get i-th knot value generic :: get_knot => get_knoti , get_knot_all !!> Get knot vector procedure :: get_ng !!> Get number of geometry points procedure :: get_degree !!> Get degree of the NURBS curve procedure :: finalize !!> Finalize the NURBS curve object procedure :: cmp_elem_Xc_vis !!> Generate connectivity for control points procedure :: cmp_elem_Xg_vis !!> Generate connectivity for geometry points procedure :: cmp_elem !!> Generate IGA element connectivity procedure :: get_elem_Xc_vis !!> Get connectivity for control points procedure :: get_elem_Xg_vis !!> Get connectivity for geometry points procedure :: get_elem !!> Get IGA element connectivity procedure :: set_elem_Xc_vis !!> Set connectivity for control points procedure :: set_elem_Xg_vis !!> Set connectivity for geometry points procedure :: set_elem !!> Set IGA element connectivity procedure :: export_Xc !!> Export control points to VTK file procedure :: export_Xg !!> Export geometry points to VTK file procedure :: modify_Xc !!> Modify control points procedure :: modify_Wc !!> Modify weights procedure :: get_multiplicity !!> Get multiplicity of the knot vector procedure :: get_continuity !!> Get continuity of the curve procedure :: get_nc !!> Get number of required control points procedure :: insert_knots !!> Insert knots into the knot vector procedure :: elevate_degree !!> Elevate the degree of the curve procedure :: derivative !!> Compute the derivative of the NURBS curve procedure :: basis !!> Compute the basis functions of the NURBS curve procedure :: is_rational !!> Check if the NURBS curve is rational procedure :: remove_knots !!> Remove knots from the knot vector procedure :: rotate_Xc !!> Rotate control points procedure :: rotate_Xg !!> Rotate geometry points procedure :: translate_Xc !!> Translate control points procedure :: translate_Xg !!> Translate geometry points procedure :: show !!> Show the NURBS object using PyVista ! Shapes procedure :: set_circle !!> Set a circle end type !=============================================================================== contains !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set knot vector, control points and weights for the NURBS curve object. pure subroutine set1 ( this , knot , Xc , Wc ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: knot (:) real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) if ( allocated ( this % knot )) deallocate ( this % knot ) if ( allocated ( this % Xc )) deallocate ( this % Xc ) this % knot = knot this % degree = this % get_degree () this % Xc = Xc this % nc = size ( this % Xc , 1 ) if ( present ( Wc )) then if ( size ( Wc ) /= this % nc ) then error stop 'Number of weights does not match the number of control points.' else if ( allocated ( this % Wc )) deallocate ( this % Wc ) this % Wc = Wc end if end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights. pure subroutine set2 ( this , Xth_dir , degree , continuity , Xc , Wc ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: Xth_dir (:) integer , intent ( in ) :: degree integer , intent ( in ), contiguous :: continuity (:) real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) if ( allocated ( this % knot )) deallocate ( this % knot ) if ( allocated ( this % Xc )) deallocate ( this % Xc ) this % knot = compute_knot_vector ( Xth_dir , degree , continuity ) this % degree = degree this % Xc = Xc this % nc = size ( this % Xc , 1 ) if ( present ( Wc )) then if ( size ( Wc ) /= this % nc ) then error stop 'Number of weights does not match the number of control points.' else if ( allocated ( this % Wc )) deallocate ( this % Wc ) this % Wc = Wc end if end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set Bezier or Rational Bezier curve using control points and weights. pure subroutine set3 ( this , Xc , Wc ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) if ( allocated ( this % knot )) deallocate ( this % knot ) if ( allocated ( this % Xc )) deallocate ( this % Xc ) this % Xc = Xc this % nc = size ( this % Xc , 1 ) if ( allocated ( this % knot )) deallocate ( this % knot ) allocate ( this % knot ( 2 * this % nc )) this % knot ( 1 : this % nc ) = 0.0_rk this % knot ( this % nc + 1 : 2 * this % nc ) = 1.0_rk this % degree = this % get_degree () if ( present ( Wc )) then if ( size ( Wc ) /= this % nc ) then error stop 'Number of weights does not match the number of control points.' else if ( allocated ( this % Wc )) deallocate ( this % Wc ) this % Wc = Wc end if end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine create ( this , res , Xt ) class ( nurbs_curve ), intent ( inout ) :: this integer , intent ( in ), optional :: res real ( rk ), intent ( in ), contiguous , optional :: Xt (:) real ( rk ), allocatable :: Tgc (:) integer :: i , j ! check if (. not . allocated ( this % Xc )) then error stop 'Control points are not set.' end if if (. not . allocated ( this % knot )) then error stop 'Knot vector is not set.' end if ! Set parameter values if ( present ( Xt )) then if ( allocated ( this % Xt )) deallocate ( this % Xt ) this % Xt = Xt elseif ( present ( res )) then if ( allocated ( this % Xt )) deallocate ( this % Xt ) allocate ( this % Xt ( res )) this % Xt = [( real ( i - 1 , rk ) / real ( res - 1 , rk ), i = 1 , res )] ! else ! this%Xt = this%Xt end if ! Set number of geometry points this % ng = size ( this % Xt ) ! Allocate memory for geometry points if ( allocated ( this % Xg )) deallocate ( this % Xg ) allocate ( this % Xg ( this % ng , size ( this % Xc , 2 ))) if ( this % is_rational ()) then ! NURBS do i = 1 , size ( this % Xt , 1 ) Tgc = basis_bspline ( this % Xt ( i ), this % knot , this % nc , this % degree ) Tgc = Tgc * ( this % Wc / ( dot_product ( Tgc , this % Wc ))) do j = 1 , size ( this % Xc , 2 ) this % Xg ( i , j ) = dot_product ( Tgc , this % Xc (:, j )) end do end do else ! B-Spline do i = 1 , size ( this % Xt , 1 ) Tgc = basis_bspline ( this % Xt ( i ), this % knot , this % nc , this % degree ) do j = 1 , size ( this % Xc , 2 ) this % Xg ( i , j ) = dot_product ( Tgc , this % Xc (:, j )) end do end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xc ( this ) result ( Xc ) class ( nurbs_curve ), intent ( in ) :: this real ( rk ), allocatable :: Xc (:,:) if ( allocated ( this % Xc )) then Xc = this % Xc else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xg ( this ) result ( Xg ) class ( nurbs_curve ), intent ( in ) :: this real ( rk ), allocatable :: Xg (:,:) if ( allocated ( this % Xg )) then Xg = this % Xg else error stop 'Geometry points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Wc ( this ) result ( Wc ) class ( nurbs_curve ), intent ( in ) :: this real ( rk ), allocatable :: Wc (:) if ( allocated ( this % Wc )) then Wc = this % Wc else error stop 'The NURBS curve is not rational.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xt ( this ) result ( Xt ) class ( nurbs_curve ), intent ( in ) :: this real ( rk ), allocatable :: Xt (:) if ( allocated ( this % Xt )) then Xt = this % Xt else error stop 'Parameter values are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_ng ( this ) result ( ng ) class ( nurbs_curve ), intent ( in ) :: this integer :: ng ng = this % ng end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_degree ( this ) result ( degree ) class ( nurbs_curve ), intent ( in ) :: this integer :: degree integer , allocatable :: m (:) m = this % get_multiplicity () degree = m ( 1 ) - 1 end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_knot_all ( this ) result ( knot ) class ( nurbs_curve ), intent ( in ) :: this real ( rk ), allocatable :: knot (:) if ( allocated ( this % knot )) then knot = this % knot else error stop 'Knot vector is not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_knoti ( this , i ) result ( knot ) class ( nurbs_curve ), intent ( in ) :: this integer , intent ( in ) :: i real ( rk ) :: knot if ( allocated ( this % knot )) then if ( i < 1 . or . i > size ( this % knot )) then error stop 'Invalid index for knot vector.' else knot = this % knot ( i ) end if else error stop 'Knot vector is not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine finalize ( this ) class ( nurbs_curve ), intent ( inout ) :: this if ( allocated ( this % Xc )) deallocate ( this % Xc ) if ( allocated ( this % Xg )) deallocate ( this % Xg ) if ( allocated ( this % Wc )) deallocate ( this % Wc ) if ( allocated ( this % Xt )) deallocate ( this % Xt ) if ( allocated ( this % knot )) deallocate ( this % knot ) if ( allocated ( this % elemConn_Xc_vis )) deallocate ( this % elemConn_Xc_vis ) if ( allocated ( this % elemConn_Xg_vis )) deallocate ( this % elemConn_Xg_vis ) if ( allocated ( this % elemConn )) deallocate ( this % elemConn ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem_Xc_vis ( this , p ) result ( elemConn ) class ( nurbs_curve ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) integer , intent ( in ), optional :: p if ( present ( p )) then elemConn = elemConn_C0 ( this % nc , p ) else elemConn = elemConn_C0 ( this % nc , 1 ) end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem_Xg_vis ( this , p ) result ( elemConn ) class ( nurbs_curve ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) integer , intent ( in ), optional :: p if ( present ( p )) then elemConn = elemConn_C0 ( this % ng , p ) else elemConn = elemConn_C0 ( this % ng , 1 ) end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine export_Xc ( this , filename ) class ( nurbs_curve ), intent ( in ) :: this character ( len =* ), intent ( in ) :: filename integer :: i , nc , nunit integer , allocatable :: elemConn (:,:) ! check if (. not . allocated ( this % Xc )) then error stop 'Control points are not set.' end if if (. not . allocated ( this % elemConn_Xc_vis )) then elemConn = this % cmp_elem_Xc_vis () else elemConn = this % elemConn_Xc_vis end if nc = size ( this % Xc , 1 ) open ( newunit = nunit , file = filename , action = 'write' ) write ( nunit , '(a)' ) '# vtk DataFile Version 2.0' write ( nunit , '(a)' ) 'Generated by ForCAD' write ( nunit , '(a)' ) 'ASCII' write ( nunit , '(a)' ) 'DATASET UNSTRUCTURED_GRID' write ( nunit , '(a,\" \",g0,\" \",a)' ) 'POINTS' , nc , 'double' if ( size ( this % Xc , 2 ) == 2 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xc ( i , 1 ), this % Xc ( i , 2 ), 0.0_rk , i = 1 , nc ) elseif ( size ( this % Xc , 2 ) == 3 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xc ( i , 1 ), this % Xc ( i , 2 ), this % Xc ( i , 3 ) , i = 1 , nc ) else error stop 'Invalid dimension of the control points.' end if write ( nunit , '(a,\" \",g0,\" \",g0)' ) 'CELLS' , size ( elemConn , 1 ), size ( elemConn , 1 ) * ( size ( elemConn , 2 ) + 1 ) write ( nunit , '(g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0)' )& ( 2 , elemConn ( i , 1 ) - 1 , elemConn ( i , 2 ) - 1 , i = 1 , size ( elemConn , 1 )) write ( nunit , '(a,\" \",g0)' ) 'CELL_TYPES' , size ( elemConn , 1 ) write ( nunit , '(g0)' ) ( 3 , i = 1 , size ( elemConn , 1 )) close ( nunit ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine export_Xg ( this , filename ) class ( nurbs_curve ), intent ( in ) :: this character ( len =* ), intent ( in ) :: filename integer :: i , ng , nunit integer , allocatable :: elemConn (:,:) ! check if (. not . allocated ( this % Xg )) then error stop 'Geometry points are not set.' end if if (. not . allocated ( this % elemConn_Xg_vis )) then elemConn = this % cmp_elem_Xg_vis () else elemConn = this % elemConn_Xg_vis end if ng = size ( this % Xg , 1 ) open ( newunit = nunit , file = filename , action = 'write' ) write ( nunit , '(a)' ) '# vtk DataFile Version 2.0' write ( nunit , '(a)' ) 'Generated by ForCAD' write ( nunit , '(a)' ) 'ASCII' write ( nunit , '(a)' ) 'DATASET UNSTRUCTURED_GRID' write ( nunit , '(a,\" \",g0,\" \",a)' ) 'POINTS' , ng , 'double' if ( size ( this % Xg , 2 ) == 2 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xg ( i , 1 ), this % Xg ( i , 2 ), 0.0_rk , i = 1 , ng ) elseif ( size ( this % Xg , 2 ) == 3 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xg ( i , 1 ), this % Xg ( i , 2 ), this % Xg ( i , 3 ) , i = 1 , ng ) else error stop 'Invalid dimension of the geometry points.' end if write ( nunit , '(a,\" \",g0,\" \",g0)' ) 'CELLS' , size ( elemConn , 1 ), size ( elemConn , 1 ) * ( size ( elemConn , 2 ) + 1 ) write ( nunit , '(g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0)' )& ( 2 , elemConn ( i , 1 ) - 1 , elemConn ( i , 2 ) - 1 , i = 1 , size ( elemConn , 1 )) write ( nunit , '(a,\" \",g0)' ) 'CELL_TYPES' , size ( elemConn , 1 ) write ( nunit , '(g0)' ) ( 3 , i = 1 , size ( elemConn , 1 )) close ( nunit ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine modify_Xc ( this , X , num , dir ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ) :: X integer , intent ( in ) :: num integer , intent ( in ) :: dir if ( allocated ( this % Xc )) then this % Xc ( num , dir ) = X call this % set ( knot = this % knot , Xc = this % Xc , Wc = this % Wc ) else error stop 'Control points are not set.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine modify_Wc ( this , W , num ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ) :: W integer , intent ( in ) :: num real ( rk ), allocatable :: knot (:), Xc (:,:), Wc (:) if ( allocated ( this % Wc )) then this % Wc ( num ) = W Xc = this % Xc Wc = this % Wc if ( allocated ( this % knot )) then knot = this % knot call this % set ( knot = knot , Xc = Xc , Wc = Wc ) else call this % set ( Xc = Xc , Wc = Wc ) end if else error stop 'The NURBS curve is not rational.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_multiplicity ( this ) result ( m ) class ( nurbs_curve ), intent ( in ) :: this integer , allocatable :: m (:) ! check if (. not . allocated ( this % knot )) then error stop 'Knot vector is not set.' else m = compute_multiplicity ( this % knot ) end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_continuity ( this ) result ( c ) class ( nurbs_curve ), intent ( in ) :: this integer , allocatable :: c (:) ! check if (. not . allocated ( this % knot )) then error stop 'Knot vector is not set.' else c = this % degree - compute_multiplicity ( this % knot ) end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_nc ( this ) result ( nc ) class ( nurbs_curve ), intent ( in ) :: this integer :: nc nc = sum ( compute_multiplicity ( this % knot )) - this % degree - 1 end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine insert_knots ( this , Xth , r ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: Xth (:) integer , intent ( in ), contiguous :: r (:) integer :: k , i , s , dim , j , n_new real ( rk ), allocatable :: Xcw (:,:), Xcw_new (:,:), Xc_new (:,:), Wc_new (:), knot_new (:) if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc - 1 , this % degree , Xth ( i ), this % knot ) if ( this % knot ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) call insert_knot_A_5_1 (& this % degree ,& this % knot ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xcw_new ) allocate ( Xc_new ( 1 : n_new + 1 , 1 : dim )) allocate ( Wc_new ( 1 : n_new + 1 )) do j = 1 , n_new + 1 Xc_new ( j , 1 : dim ) = Xcw_new ( j - 1 , 1 : dim ) / Xcw_new ( j - 1 , dim + 1 ) Wc_new ( j ) = Xcw_new ( j - 1 , dim + 1 ) end do call this % set ( knot = knot_new , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc - 1 , this % degree , Xth ( i ), this % knot ) if ( this % knot ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot , Xth ( i )) else s = 0 end if call insert_knot_A_5_1 (& this % degree ,& this % knot ,& this % Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xc_new ) call this % set ( knot = knot_new , Xc = Xc_new ) end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine elevate_degree ( this , t ) class ( nurbs_curve ), intent ( inout ) :: this integer , intent ( in ) :: t real ( rk ), allocatable :: Xcw (:,:), Xcw_new (:,:), knot_new (:), Xc_new (:,:), Wc_new (:) integer :: dim , j , nc_new if ( this % is_rational ()) then ! NURBS dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) Xcw ( j , dim + 1 ) = this % Wc ( j ) end do call elevate_degree_A_5_9 ( t , this % knot , this % degree , Xcw , nc_new , knot_new , Xcw_new ) allocate ( Xc_new ( 1 : nc_new , 1 : dim )) allocate ( Wc_new ( 1 : nc_new )) do j = 1 , nc_new Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) call this % set ( knot = knot_new , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) else ! B-Spline dim = size ( this % Xc , 2 ) call elevate_degree_A_5_9 ( t , this % knot , this % degree , this % Xc , nc_new , knot_new , Xc_new ) call this % set ( knot = knot_new , Xc = Xc_new ) deallocate ( Xc_new ) end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine derivative ( this , res , Xt , dTgc ) class ( nurbs_curve ), intent ( inout ) :: this integer , intent ( in ), optional :: res real ( rk ), intent ( in ), contiguous , optional :: Xt (:) real ( rk ), allocatable , intent ( out ) :: dTgc (:,:) real ( rk ), allocatable :: dTgci (:) integer :: i ! Set parameter values if ( present ( Xt )) then if ( allocated ( this % Xt )) deallocate ( this % Xt ) this % Xt = Xt elseif ( present ( res )) then if ( allocated ( this % Xt )) deallocate ( this % Xt ) allocate ( this % Xt ( res )) this % Xt = [( real ( i - 1 , rk ) / real ( res - 1 , rk ), i = 1 , res )] ! else ! this%Xt = this%Xt end if allocate ( dTgc ( size ( this % Xt , 1 ), this % nc )) if ( this % is_rational ()) then ! NURBS do i = 1 , size ( this % Xt , 1 ) dTgci = basis_bspline_der ( this % Xt ( i ), this % knot , this % nc , this % degree ) dTgci = dTgci * ( this % Wc / ( dot_product ( dTgci , this % Wc ))) dTgc ( i ,:) = dTgci end do else ! B-Spline do i = 1 , size ( this % Xt , 1 ) dTgci = basis_bspline_der ( this % Xt ( i ), this % knot , this % nc , this % degree ) dTgc ( i ,:) = dTgci end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine basis ( this , res , Xt , Tgc ) class ( nurbs_curve ), intent ( inout ) :: this integer , intent ( in ), optional :: res real ( rk ), intent ( in ), contiguous , optional :: Xt (:) real ( rk ), allocatable , intent ( out ) :: Tgc (:,:) real ( rk ), allocatable :: Tgci (:) integer :: i ! Set parameter values if ( present ( Xt )) then if ( allocated ( this % Xt )) deallocate ( this % Xt ) this % Xt = Xt elseif ( present ( res )) then if ( allocated ( this % Xt )) deallocate ( this % Xt ) allocate ( this % Xt ( res )) this % Xt = [( real ( i - 1 , rk ) / real ( res - 1 , rk ), i = 1 , res )] ! else ! this%Xt = this%Xt end if allocate ( Tgc ( size ( this % Xt , 1 ), this % nc )) if ( this % is_rational ()) then ! NURBS do i = 1 , size ( this % Xt , 1 ) Tgci = basis_bspline ( this % Xt ( i ), this % knot , this % nc , this % degree ) Tgci = Tgci * ( this % Wc / ( dot_product ( Tgci , this % Wc ))) Tgc ( i ,:) = Tgci end do else ! B-Spline do i = 1 , size ( this % Xt , 1 ) Tgci = basis_bspline ( this % Xt ( i ), this % knot , this % nc , this % degree ) Tgc ( i ,:) = Tgci end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function is_rational ( this ) result ( r ) class ( nurbs_curve ), intent ( in ) :: this logical :: r r = . false . if ( allocated ( this % Wc )) then if ( any ( this % Wc /= this % Wc ( 1 ))) then r = . true . end if end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem_Xc_vis ( this , elemConn ) class ( nurbs_curve ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn_Xc_vis )) deallocate ( this % elemConn_Xc_vis ) this % elemConn_Xc_vis = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem_Xg_vis ( this , elemConn ) class ( nurbs_curve ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn_Xg_vis )) deallocate ( this % elemConn_Xg_vis ) this % elemConn_Xg_vis = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem ( this , elemConn ) class ( nurbs_curve ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn )) deallocate ( this % elemConn ) this % elemConn = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem_Xc_vis ( this ) result ( elemConn ) class ( nurbs_curve ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn_Xc_vis end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem_Xg_vis ( this ) result ( elemConn ) class ( nurbs_curve ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn_Xg_vis end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem ( this ) result ( elemConn ) class ( nurbs_curve ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine remove_knots ( this , Xth , r ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: Xth (:) integer , intent ( in ), contiguous :: r (:) integer :: k , i , s , dim , j , nc_new , t real ( rk ), allocatable :: Xcw (:,:), Xcw_new (:,:), Xc_new (:,:), Wc_new (:), knot_new (:) if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc - 1 , this % degree , Xth ( i ), this % knot ) if ( this % knot ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) call remove_knots_A_5_8 (& this % degree ,& this % knot ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xcw_new ) if ( allocated ( Xcw )) deallocate ( Xcw ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) allocate ( Xc_new ( nc_new , dim )) allocate ( Wc_new ( nc_new )) do j = 1 , nc_new Xc_new ( j ,:) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) call this % set ( knot = knot_new , Xc = Xc_new , Wc = Wc_new ) if ( allocated ( Xcw_new )) deallocate ( Xcw_new ) if ( allocated ( Xc_new )) deallocate ( Xc_new ) if ( allocated ( Wc_new )) deallocate ( Wc_new ) end if end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc - 1 , this % degree , Xth ( i ), this % knot ) if ( this % knot ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot , Xth ( i )) else s = 0 end if k = k + 1 call remove_knots_A_5_8 (& this % degree ,& this % knot ,& this % Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xc_new ) if ( t == 0 ) then ! no change else call this % set ( knot = knot_new , Xc = Xc_new ) end if end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_circle ( this , center , radius ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: center (:) real ( rk ), intent ( in ) :: radius real ( rk ), allocatable :: Xc (:,:), Wc (:), knot (:) integer :: i ! Define control points for circle allocate ( Xc ( 7 , 3 )) Xc ( 1 ,:) = [ 1.0_rk , 0.0_rk , 0.0_rk ] Xc ( 2 ,:) = [ 1.0_rk , sqrt ( 3.0_rk ), 0.0_rk ] Xc ( 3 ,:) = [ - 0.5_rk , sqrt ( 3.0_rk ) / 2.0_rk , 0.0_rk ] Xc ( 4 ,:) = [ - 2.0_rk , 0.0_rk , 0.0_rk ] Xc ( 5 ,:) = [ - 0.5_rk , - sqrt ( 3.0_rk ) / 2.0_rk , 0.0_rk ] Xc ( 6 ,:) = [ 1.0_rk , - sqrt ( 3.0_rk ), 0.0_rk ] Xc ( 7 ,:) = [ 1.0_rk , 0.0_rk , 0.0_rk ] ! Scale and translate the control points do i = 1 , size ( Xc , 1 ) Xc ( i ,:) = center + Xc ( i ,:) * radius end do ! Define weights for the control points Wc = [ 1.0_rk , 0.5_rk , 1.0_rk , 0.5_rk , 1.0_rk , 0.5_rk , 1.0_rk ] ! Define knot vector knot = [ 0.0_rk , 0.0_rk , 0.0_rk , 1.0_rk / 3.0_rk , 1.0_rk / 3.0_rk , 2.0_rk / 3.0_rk , 2.0_rk / 3.0_rk , 1.0_rk , 1.0_rk , 1.0_rk ] ! Set knot vector, control points, and weights call this % set ( knot , Xc , Wc ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem ( this ) result ( elemConn ) class ( nurbs_curve ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) call elemConn_Cn ( this % nc , this % degree , unique ( this % knot ), this % get_multiplicity (),& elemConn ) end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine rotate_Xc ( this , alpha , beta , theta ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ) :: alpha , beta , theta integer :: i do i = 1 , this % nc this % Xc ( i , :) = matmul ( rotation ( alpha , beta , theta ), this % Xc ( i , :)) end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine rotate_Xg ( this , alpha , beta , theta ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ) :: alpha , beta , theta integer :: i do i = 1 , this % ng this % Xg ( i , :) = matmul ( rotation ( alpha , beta , theta ), this % Xg ( i , :)) end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine translate_Xc ( this , vec ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ) :: vec (:) integer :: i do i = 1 , this % nc this % Xc ( i , :) = this % Xc ( i , :) + vec end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine translate_Xg ( this , vec ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ) :: vec (:) integer :: i do i = 1 , this % nc this % Xg ( i , :) = this % Xg ( i , :) + vec end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine show ( this , vtkfile_Xc , vtkfile_Xg ) class ( nurbs_curve ), intent ( inout ) :: this character ( len =* ), intent ( in ) :: vtkfile_Xc , vtkfile_Xg character ( len = 3000 ) :: pyvista_script pyvista_script = & \"import pyvista as pv\" // achar ( 10 ) // & \"pv.global_theme.color = 'white'\" // achar ( 10 ) // & \"Xc = pv.read('\" // trim ( vtkfile_Xc ) // \"')\" // achar ( 10 ) // & \"Xg = pv.read('\" // trim ( vtkfile_Xg ) // \"')\" // achar ( 10 ) // & \"p = pv.Plotter(lighting='light kit')\" // achar ( 10 ) // & \"actor_Xcp = p.add_mesh(\" // achar ( 10 ) // & \" Xc,\" // achar ( 10 ) // & \" style='points',\" // achar ( 10 ) // & \" point_size=10,\" // achar ( 10 ) // & \" color='red',\" // achar ( 10 ) // & \" render_points_as_spheres=True,\" // achar ( 10 ) // & \" opacity=0.5,\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"actor_Xcw = p.add_mesh(\" // achar ( 10 ) // & \" Xc,\" // achar ( 10 ) // & \" show_edges=True,\" // achar ( 10 ) // & \" color='yellow',\" // achar ( 10 ) // & \" line_width=3,\" // achar ( 10 ) // & \" style='wireframe',\" // achar ( 10 ) // & \" opacity=0.2\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"actor_Xg = p.add_mesh(\" // achar ( 10 ) // & \" Xg,\" // achar ( 10 ) // & \" show_edges=False,\" // achar ( 10 ) // & \" color='cyan',\" // achar ( 10 ) // & \" line_width=7,\" // achar ( 10 ) // & \" metallic=0.6,\" // achar ( 10 ) // & \" pbr=True,\" // achar ( 10 ) // & \" split_sharp_edges=True,\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_axes(interactive=False)\" // achar ( 10 ) // & \"def point_picker_callback(point):\" // achar ( 10 ) // & \" mesh = Xc\" // achar ( 10 ) // & \" point_id = mesh.find_closest_point(point)\" // achar ( 10 ) // & \" point_coords = mesh.points[point_id]\" // achar ( 10 ) // & \" label = f'ID: {point_id + 1}\\n({point_coords[0]:.3f}, {point_coords[1]:.3f}, {point_coords[2]:.3f})'\" // achar ( 10 ) // & \" p.add_point_labels(\" // achar ( 10 ) // & \" [point_coords],\" // achar ( 10 ) // & \" [label],\" // achar ( 10 ) // & \" font_size=14,\" // achar ( 10 ) // & \" text_color='black',\" // achar ( 10 ) // & \" show_points=False,\" // achar ( 10 ) // & \" fill_shape=False,\" // achar ( 10 ) // & \" shape=None,\" // achar ( 10 ) // & \" )\" // achar ( 10 ) // & \"picker = p.enable_point_picking(callback=point_picker_callback, show_message=False)\" // achar ( 10 ) // & \"window_size = p.window_size\" // achar ( 10 ) // & \"y_pos = window_size[1]\" // achar ( 10 ) // & \"def Xcp_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xcp.SetVisibility(flag)\" // achar ( 10 ) // & \"def Xcw_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xcw.SetVisibility(flag)\" // achar ( 10 ) // & \"def Xg_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xg.SetVisibility(flag)\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xcp_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='red',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 1 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xcw_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='yellow',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 2 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xg_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='cyan',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 3 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xc (Points)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 1 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xc (Control geometry)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 2 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xg (Geometry)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 3 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text('ForCAD', position=(0.0, 10.0), font_size=14, color='black', font='times')\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'https://github.com/gha3mi/forcad',\" // achar ( 10 ) // & \" position=(0.0, 0.0),\" // achar ( 10 ) // & \" font_size=7,\" // achar ( 10 ) // & \" color='blue',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.show(title='ForCAD', interactive=True)\" call execute_command_line ( 'python -c \"' // trim ( adjustl ( pyvista_script )) // '\"' ) end subroutine !=============================================================================== end module forcad_nurbs_curve","tags":"","loc":"sourcefile/forcad_nurbs_curve.f90.html"},{"title":"demo_surface.f90 – ForCAD","text":"This file depends on sourcefile~~demo_surface.f90~~EfferentGraph sourcefile~demo_surface.f90 demo_surface.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~demo_surface.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> This program demonstrates the usage of a NURBS surface object to create, and finalize a NURBS surface. !> It sets up control points and weights, generates the surface, and exports the control points !> and the surface to VTK files at various stages. program example_nurbs_surface use forcad , only : rk , nurbs_surface implicit none type ( nurbs_surface ) :: nurbs !! Declare a NURBS surface object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights !----------------------------------------------------------------------------- ! Setting up the NURBS surface !----------------------------------------------------------------------------- !> Define control points for the NURBS surface Xc = generate_Xc ( 10 , 10 , 1.5_rk ) !> Define weights for the control points allocate ( Wc ( size ( Xc , 1 )), source = 1.0_rk ) !> Set control points and weights for the NURBS surface object call nurbs % set ([ 10 , 10 ], Xc , Wc ) !> Export initial control points to a VTK file call nurbs % export_Xc ( 'vtk/demo_surface_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS surface !----------------------------------------------------------------------------- !> Generate the NURBS surface with a resolution of 30x30 call nurbs % create ( res1 = 30 , res2 = 30 ) !> Export the generated surface to a VTK file call nurbs % export_Xg ( 'vtk/demo_surface_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_surface_Xc.vtk' , 'vtk/demo_surface_Xg.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS surface object call nurbs % finalize () contains !----------------------------------------------------------------------------- function generate_Xc ( num_rows , num_cols , peak_height ) result ( control_points ) integer , intent ( in ) :: num_rows , num_cols real ( rk ), intent ( in ) :: peak_height real ( rk ), allocatable :: control_points (:,:) integer :: i , j real ( rk ) :: x_spacing , y_spacing , x_offset , y_offset x_spacing = 1.0_rk / real ( num_cols - 1 , rk ) y_spacing = 1.0_rk / real ( num_rows - 1 , rk ) x_offset = - 0.5_rk y_offset = - 0.5_rk allocate ( control_points ( num_rows * num_cols , 3 )) do i = 1 , num_rows do j = 1 , num_cols control_points (( i - 1 ) * num_cols + j , 1 ) = x_offset + real ( j - 1 , rk ) * x_spacing control_points (( i - 1 ) * num_cols + j , 2 ) = y_offset + real ( i - 1 , rk ) * y_spacing control_points (( i - 1 ) * num_cols + j , 3 ) = & peak_height * exp ( - (( control_points (( i - 1 ) * num_cols + j , 1 ) ** 2 ) & + ( control_points (( i - 1 ) * num_cols + j , 2 ) ** 2 ))) + 0.5_rk * peak_height * 0.2_rk end do end do end function !----------------------------------------------------------------------------- end program example_nurbs_surface","tags":"","loc":"sourcefile/demo_surface.f90.html"},{"title":"example_curve_1.f90 – ForCAD","text":"This file depends on sourcefile~~example_curve_1.f90~~EfferentGraph sourcefile~example_curve_1.f90 example_curve_1.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~example_curve_1.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> This program demonstrates the usage of a NURBS (Non-Uniform Rational B-Spline) curve object to create and finalize a NURBS curve. !> It sets up control points, weights, and knot vectors for all three dimensions, generates the curve, and exports the control points and the curve to VTK files. program example1_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 real ( rk ) :: knot ( 6 ) !! Array for knot vector !----------------------------------------------------------------------------- ! Setting up the NURBS curve !----------------------------------------------------------------------------- !> Define control points for the NURBS curve allocate ( Xc ( 3 , 3 )) Xc ( 1 ,:) = [ 0.0_rk , 0.0_rk , 0.0_rk ] Xc ( 2 ,:) = [ 0.0_rk , 5.0_rk , 0.0_rk ] Xc ( 3 ,:) = [ 5.0_rk , 5.0_rk , 0.0_rk ] !> Define weights for the control points (optional) allocate ( Wc ( 3 )) Wc = [ 1.0_rk , 2.0_rk , 0.3_rk ] !> Define knot vector knot = [ 0.0_rk , 0.0_rk , 0.0_rk , 1.0_rk , 1.0_rk , 1.0_rk ] !> Set knot vector, control points, and weights for the NURBS curve object. !> Wc is optional call nurbs % set ( knot , Xc , Wc ) !> Export control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_curve_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS curve !----------------------------------------------------------------------------- !> Generate the NURBS curve with a resolution of 20 call nurbs % create ( res = 20 ) !> Export the generated curve to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_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/nurbs_curve_Xc.vtk' , 'vtk/nurbs_curve_Xg.vtk' ) !----------------------------------------------------------------------------- ! Refinements !----------------------------------------------------------------------------- !> Print size of the knot vector print * , size ( nurbs % get_knot ()) !> Insert knots 0.25, twice and 0.75, once call nurbs % insert_knots ([ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) !> Print size of the updated knot vector print * , size ( nurbs % get_knot ()) !> Print the degree of the curve print * , nurbs % get_degree () !> Elevate the degree of the curve (2 times) call nurbs % elevate_degree ( 2 ) !> Print the updated degree of the curve print * , nurbs % get_degree () !> Print size of the knot vector print * , size ( nurbs % get_knot ()) !> Remove knots 0.25, twice and 0.75, once call nurbs % remove_knots ([ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) !> Print size of the updated knot vector print * , size ( nurbs % get_knot ()) !> Generate the refined curve with a resolution of 20 call nurbs % create () !> Export updated control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_curve_Xc2.vtk' ) !> Export the refined generated curve to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_curve_Xg2.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/nurbs_curve_Xc2.vtk' , 'vtk/nurbs_curve_Xg2.vtk' ) !----------------------------------------------------------------------------- ! Transformations !----------------------------------------------------------------------------- !> Rotate the control points call nurbs % rotate_Xc ( alpha = 4 5.0_rk , beta = 0.0_rk , theta = 9 0.0_rk ) !> Rotate the generated curve call nurbs % rotate_Xg ( alpha =- 4 5.0_rk , beta = 0.0_rk , theta =- 9 0.0_rk ) !> Translate the control points call nurbs % translate_Xc ([ 1.0_rk , 2.0_rk , - 3.0_rk ]) !> Translate the generated curve call nurbs % translate_Xg ([ - 1.0_rk , - 2.0_rk , 3.0_rk ]) !> Export the transformed control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_curve_Xc3.vtk' ) !> Export the transformed generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_curve_Xg3.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/nurbs_curve_Xc3.vtk' , 'vtk/nurbs_curve_Xg3.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS curve object call nurbs % finalize () end program example1_curve","tags":"","loc":"sourcefile/example_curve_1.f90.html"}]} \ No newline at end of file +var tipuesearch = {"pages":[{"title":" ForCAD ","text":"ForCAD ForCAD : A Fortran library for Geometric Modeling using NURBS (Non-Uniform Rational B-Splines). ForCAD supports B-Spline , NURBS , Bezier , and Rational Bezier curves, surfaces, and volumes. Main Features Create NURBS objects by specifying control points, weights and knots. Refine NURBS objects by inserting or removing knots and elevating degree. Compute basis functions and derivatives of NURBS objects. Obtain IGA elements connectivity. Obtain visualized elements connectivity and coordinates for geometry and control geometry. Mesh insertion into a NURBS object. Export NURBS objects to VTK files for visualization. Includes predefined NURBS shapes: Circle, Tetragon, Hexahedron. Rotate and translate NURBS objects. Visualization using provided python PyVista scripts. Installation Requirements A Fortran compiler, such as GNU Fortran ( gfortran ), Intel Fortran Compiler ( ifx/ifort ) or NVIDIA HPC SDK Fortran compiler ( nvfortran ). The Fortran Package Manager fpm . PyVista (Recommended) or ParaView for visualization. (Optional) Clone the repository Clone the ForCAD repository from GitHub: git clone https://github.com/gha3mi/forcad.git cd forcad Install PyVista (Optional) To install PyVista, run the following command: pip install pyvista Running Examples with fpm fpm run --example After executing the examples, .vtk files will be generated in the vtk directory. To visualize these files, a show() method is provided which utilizes PyVista. Alternatively, other visualization tools like ParaView can also be used. Using ForCAD as a fpm Dependency If you want to use ForCAD as a dependency in your own fpm project,\nyou can easily include it by adding the following line to your fpm.toml file: [dependencies] forcad = { git = \"https://github.com/gha3mi/forcad.git\" } API documentation The most up-to-date API documentation for the master branch is available here .\nTo generate the API documentation for ForCAD using ford run the following\ncommand: ford ford.yml Roadmap For a detailed roadmap outlining upcoming features and enhancements, please refer to ROADMAP.md . Contributing Contributions to ForCAD are welcome! If you find any issues or would like to suggest improvements, please open an issue. If you've implemented new features, fixed bugs, or enhanced existing functionality, please consider submitting a pull request (PR). Please share your examples by submitting a pull request (PR). Citation If you use ForCAD in your research, please cite it as follows: @software { seyed_ali_ghasemi_2024_10904447 , author = {Ghasemi, S. A.} , title = {gha3mi/ForCAD} , year = 2024 , publisher = {Zenodo} , doi = {10.5281/zenodo.10904447} , url = {https://doi.org/10.5281/zenodo.10904447} } References Piegl, L., & Tiller, W. (1995). The NURBS Book. In Monographs in Visual Communications. Springer Berlin Heidelberg. https://doi.org/10.1007/978-3-642-97385-7 An Introduction to NURBS. (2001). Elsevier. https://doi.org/10.1016/b978-1-55860-669-2.x5000-3 Sullivan et al., (2019). PyVista: 3D plotting and mesh analysis through a streamlined interface for the Visualization Toolkit (VTK). Journal of Open Source Software, 4(37), 1450, https://doi.org/10.21105/joss.01450 Developer Info Seyed Ali Ghasemi","tags":"home","loc":"index.html"},{"title":"nurbs_surface – ForCAD ","text":"type, public :: nurbs_surface Components Type Visibility Attributes Name Initial real(kind=rk), private, allocatable :: Wc (:) Weights for control points (1D array: [nc(1)*nc(2)]) real(kind=rk), private, allocatable :: Xc (:,:) Control points (2D array: [nc(1)*nc(2), dim]) real(kind=rk), private, allocatable :: Xg (:,:) Geometry points (2D array: [ng(1)*ng(2), dim]) real(kind=rk), private, allocatable :: Xt1 (:) Evaluation parameter values in the first direction (1D array: [ng(1)]) real(kind=rk), private, allocatable :: Xt2 (:) Evaluation parameter values in the second direction (1D array: [ng(2)]) integer, private :: degree (2) Degree (order) of the surface integer, private, allocatable :: elemConn (:,:) IGA element connectivity integer, private, allocatable :: elemConn_Xc_vis (:,:) Connectivity for visualization of control points integer, private, allocatable :: elemConn_Xg_vis (:,:) Connectivity for visualization of geometry points real(kind=rk), private, allocatable :: knot1 (:) Knot vector in the first direction (1D array) real(kind=rk), private, allocatable :: knot2 (:) Knot vector in the second direction (1D array) integer, private :: nc (2) Number of control points in each direction integer, private :: ng (2) Number of geometry points in each direction Type-Bound Procedures procedure, public :: basis Compute the basis functions of the NURBS surface private pure subroutine basis (this, res1, res2, Xt1, Xt2, Tgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) procedure, public :: cmp_elem Generate IGA element connectivity private pure function cmp_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: cmp_elem_Xc_vis Generate connectivity for control points private pure function cmp_elem_Xc_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) procedure, public :: cmp_elem_Xg_vis Generate connectivity for geometry points private pure function cmp_elem_Xg_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) procedure, public :: create Generate geometry points private pure subroutine create (this, res1, res2, Xt1, Xt2, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt (:,:) procedure, public :: derivative Compute the derivative of the NURBS surface private pure subroutine derivative (this, res1, res2, Xt1, Xt2, dTgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) procedure, public :: elevate_degree Elevate degree private pure subroutine elevate_degree (this, dir, t) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir integer, intent(in) :: t procedure, public :: export_Xc Export control points to VTK file private impure subroutine export_Xc (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this character(len=*), intent(in) :: filename procedure, public :: export_Xg Export geometry points to VTK file private impure subroutine export_Xg (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this character(len=*), intent(in) :: filename procedure, public :: finalize Finalize the NURBS surface object private pure subroutine finalize (this) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this generic, public :: get_Wc => get_Wc_all , get_Wci Get weights private pure function get_Wc_all (this) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) private pure function get_Wci (this, n) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk) generic, public :: get_Xc => get_Xc_all , get_Xci , get_Xcid Get control points private pure function get_Xc_all (this) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xci (this, n) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) private pure function get_Xcid (this, n, dir) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) generic, public :: get_Xg => get_Xg_all , get_Xgi , get_Xgid Get geometry points private pure function get_Xg_all (this) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xgi (this, n) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) private pure function get_Xgid (this, n, dir) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) procedure, public :: get_Xt Get parameter values private pure function get_Xt (this, dir) result(Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) procedure, public :: get_continuity Get continuity of the surface private pure function get_continuity (this, dir) result(c) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) generic, public :: get_degree => get_degree_all , get_degree_dir Get degree of the NURBS surface private pure function get_degree_all (this) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, (2) private pure function get_degree_dir (this, dir) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer procedure, public :: get_elem Get IGA element connectivity private pure function get_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: get_elem_Xc_vis Get connectivity for control points private pure function get_elem_Xc_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: get_elem_Xg_vis Get connectivity for geometry points private pure function get_elem_Xg_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) generic, public :: get_knot => get_knoti , get_knot_all Get knot vector private pure function get_knoti (this, dir, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir integer, intent(in) :: i Return Value real(kind=rk) private pure function get_knot_all (this, dir) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) procedure, public :: get_multiplicity Get multiplicity of the knot vector private pure function get_multiplicity (this, dir) result(m) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) procedure, public :: get_nc Get number of required control points private pure function get_nc (this, dir) result(nc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer procedure, public :: get_ng Get number of geometry points private pure function get_ng (this) result(ng) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, (2) procedure, public :: insert_knots Insert knots into the knot vector private pure subroutine insert_knots (this, dir, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) procedure, public :: is_rational Check if the NURBS surface is rational private pure function is_rational (this) result(r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value logical procedure, public :: modify_Wc Modify weights private pure subroutine modify_Wc (this, W, num) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num procedure, public :: modify_Xc Modify control points private pure subroutine modify_Xc (this, X, num, dir) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir procedure, public :: remove_knots Remove knots from the knot vector private pure subroutine remove_knots (this, dir, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) procedure, public :: rotate_Xc Rotate control points private pure subroutine rotate_Xc (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta procedure, public :: rotate_Xg Rotate geometry points private pure subroutine rotate_Xg (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta generic, public :: set => set1 , set2 , set3 Set NURBS surface private pure subroutine set1 (this, knot1, knot2, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set knot vectors, control points and weights for the NURBS surface object. Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot1 (:) real(kind=rk), intent(in), contiguous :: knot2 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set2 (this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir1 (:) real(kind=rk), intent(in), contiguous :: Xth_dir2 (:) integer, intent(in), contiguous :: degree (:) integer, intent(in), contiguous :: continuity1 (:) integer, intent(in), contiguous :: continuity2 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set3 (this, nc, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier surface using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set1 Set knot vectors, control points and weights for the NURBS surface object private pure subroutine set1 (this, knot1, knot2, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set knot vectors, control points and weights for the NURBS surface object. Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot1 (:) real(kind=rk), intent(in), contiguous :: knot2 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set2 Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights private pure subroutine set2 (this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir1 (:) real(kind=rk), intent(in), contiguous :: Xth_dir2 (:) integer, intent(in), contiguous :: degree (:) integer, intent(in), contiguous :: continuity1 (:) integer, intent(in), contiguous :: continuity2 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set3 Set Bezier or Rational Bezier surface using control points and weights private pure subroutine set3 (this, nc, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier surface using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set_elem Set IGA element connectivity private pure subroutine set_elem (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: set_elem_Xc_vis Set connectivity for control points private pure subroutine set_elem_Xc_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: set_elem_Xg_vis Set connectivity for geometry points private pure subroutine set_elem_Xg_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: set_tetragon Set a tetragon private pure subroutine set_tetragon (this, L, nc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: L (2) integer, intent(in) :: nc (2) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: show Show the NURBS object using PyVista private impure subroutine show (this, vtkfile_Xc, vtkfile_Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg procedure, public :: translate_Xc Translate control points private pure subroutine translate_Xc (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) procedure, public :: translate_Xg Translate geometry points private pure subroutine translate_Xg (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) procedure, private :: get_Wc_all Get all weights private pure function get_Wc_all (this) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) procedure, private :: get_Wci Get i-th weight private pure function get_Wci (this, n) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk) procedure, private :: get_Xc_all Get all control points private pure function get_Xc_all (this) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) procedure, private :: get_Xci Get i-th control point private pure function get_Xci (this, n) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) procedure, private :: get_Xcid Get i-th control point in a specific direction private pure function get_Xcid (this, n, dir) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) procedure, private :: get_Xg_all Get all geometry points private pure function get_Xg_all (this) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) procedure, private :: get_Xgi Get i-th geometry point private pure function get_Xgi (this, n) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) procedure, private :: get_Xgid Get i-th geometry point in a specific direction private pure function get_Xgid (this, n, dir) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) procedure, private :: get_degree_all Get degree of the NURBS surface in both directions private pure function get_degree_all (this) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, (2) procedure, private :: get_degree_dir Get degree of the NURBS surface in a specific direction private pure function get_degree_dir (this, dir) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer procedure, private :: get_knot_all Get all knot vectors private pure function get_knot_all (this, dir) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) procedure, private :: get_knoti Get i-th knot value private pure function get_knoti (this, dir, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir integer, intent(in) :: i Return Value real(kind=rk)","tags":"","loc":"type/nurbs_surface.html"},{"title":"nurbs_curve – ForCAD ","text":"type, public :: nurbs_curve Components Type Visibility Attributes Name Initial real(kind=rk), private, allocatable :: Wc (:) Weights for control points (1D array: [nc]) real(kind=rk), private, allocatable :: Xc (:,:) Control points (2D array: [nc, dim]) real(kind=rk), private, allocatable :: Xg (:,:) Geometry points (2D array: [ng, dim]) real(kind=rk), private, allocatable :: Xt (:) Evaluation points (1D array: [ng]) integer, private :: degree Degree (order) of the curve integer, private, allocatable :: elemConn (:,:) IGA element connectivity integer, private, allocatable :: elemConn_Xc_vis (:,:) Connectivity for visualization of control points integer, private, allocatable :: elemConn_Xg_vis (:,:) Connectivity for visualization of geometry points real(kind=rk), private, allocatable :: knot (:) Knot vector (1D array) integer, private :: nc Number of control points integer, private :: ng Number of geometry points Type-Bound Procedures procedure, public :: basis Compute the basis functions of the NURBS curve private pure subroutine basis (this, res, Xt, Tgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) procedure, public :: cmp_elem Generate IGA element connectivity private pure function cmp_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: cmp_elem_Xc_vis Generate connectivity for control points private pure function cmp_elem_Xc_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in), optional :: p Return Value integer, allocatable, (:,:) procedure, public :: cmp_elem_Xg_vis Generate connectivity for geometry points private pure function cmp_elem_Xg_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in), optional :: p Return Value integer, allocatable, (:,:) procedure, public :: create Generate geometry points private pure subroutine create (this, res, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) procedure, public :: derivative Compute the derivative of the NURBS curve private pure subroutine derivative (this, res, Xt, dTgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) procedure, public :: elevate_degree Elevate the degree of the curve private pure subroutine elevate_degree (this, t) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in) :: t procedure, public :: export_Xc Export control points to VTK file private impure subroutine export_Xc (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this character(len=*), intent(in) :: filename procedure, public :: export_Xg Export geometry points to VTK file private impure subroutine export_Xg (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this character(len=*), intent(in) :: filename procedure, public :: finalize Finalize the NURBS curve object private pure subroutine finalize (this) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this generic, public :: get_Wc => get_Wc_all , get_Wci Get weights private pure function get_Wc_all (this) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) private pure function get_Wci (this, n) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk) generic, public :: get_Xc => get_Xc_all , get_Xci , get_Xcid Get control points private pure function get_Xc_all (this) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xci (this, n) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) private pure function get_Xcid (this, n, dir) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) generic, public :: get_Xg => get_Xg_all , get_Xgi , get_Xgid Get geometry points private pure function get_Xg_all (this) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xgi (this, n) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) private pure function get_Xgid (this, n, dir) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) procedure, public :: get_Xt Get parameter values private pure function get_Xt (this) result(Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) procedure, public :: get_continuity Get continuity of the curve private pure function get_continuity (this) result(c) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:) procedure, public :: get_degree Get degree of the NURBS curve private pure function get_degree (this) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer procedure, public :: get_elem Get IGA element connectivity private pure function get_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: get_elem_Xc_vis Get connectivity for control points private pure function get_elem_Xc_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: get_elem_Xg_vis Get connectivity for geometry points private pure function get_elem_Xg_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) generic, public :: get_knot => get_knoti , get_knot_all Get knot vector private pure function get_knoti (this, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: i Return Value real(kind=rk) private pure function get_knot_all (this) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) procedure, public :: get_multiplicity Get multiplicity of the knot vector private pure function get_multiplicity (this) result(m) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:) procedure, public :: get_nc Get number of required control points private pure function get_nc (this) result(nc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer procedure, public :: get_ng Get number of geometry points private pure function get_ng (this) result(ng) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer procedure, public :: insert_knots Insert knots into the knot vector private pure subroutine insert_knots (this, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) procedure, public :: is_rational Check if the NURBS curve is rational private pure function is_rational (this) result(r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value logical procedure, public :: modify_Wc Modify weights private pure subroutine modify_Wc (this, W, num) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num procedure, public :: modify_Xc Modify control points private pure subroutine modify_Xc (this, X, num, dir) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir procedure, public :: remove_knots Remove knots from the knot vector private pure subroutine remove_knots (this, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) procedure, public :: rotate_Xc Rotate control points private pure subroutine rotate_Xc (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta procedure, public :: rotate_Xg Rotate geometry points private pure subroutine rotate_Xg (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta generic, public :: set => set1 , set2 , set3 Set NURBS curve private pure subroutine set1 (this, knot, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set knot vector, control points and weights for the NURBS curve object. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set2 (this, Xth_dir, degree, continuity, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir (:) integer, intent(in) :: degree integer, intent(in), contiguous :: continuity (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set3 (this, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier curve using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set1 Set knot vector, control points and weights for the NURBS curve object private pure subroutine set1 (this, knot, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set knot vector, control points and weights for the NURBS curve object. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set2 Set NURBS curve using nodes of parameter space, degree, continuity, control points and weights private pure subroutine set2 (this, Xth_dir, degree, continuity, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir (:) integer, intent(in) :: degree integer, intent(in), contiguous :: continuity (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set3 Set Bezier or Rational Bezier curve using control points and weights private pure subroutine set3 (this, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier curve using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set_circle Set a circle private pure subroutine set_circle (this, center, radius) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: center (:) real(kind=rk), intent(in) :: radius procedure, public :: set_elem Set IGA element connectivity private pure subroutine set_elem (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: set_elem_Xc_vis Set connectivity for control points private pure subroutine set_elem_Xc_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: set_elem_Xg_vis Set connectivity for geometry points private pure subroutine set_elem_Xg_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: show Show the NURBS object using PyVista private impure subroutine show (this, vtkfile_Xc, vtkfile_Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg procedure, public :: translate_Xc Translate control points private pure subroutine translate_Xc (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) procedure, public :: translate_Xg Translate geometry points private pure subroutine translate_Xg (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) procedure, private :: get_Wc_all Get all weights private pure function get_Wc_all (this) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) procedure, private :: get_Wci Get i-th weight private pure function get_Wci (this, n) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk) procedure, private :: get_Xc_all Get all control points private pure function get_Xc_all (this) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) procedure, private :: get_Xci Get i-th control point private pure function get_Xci (this, n) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) procedure, private :: get_Xcid Get i-th control point in a specific direction private pure function get_Xcid (this, n, dir) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) procedure, private :: get_Xg_all Get all geometry points private pure function get_Xg_all (this) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) procedure, private :: get_Xgi Get i-th geometry point private pure function get_Xgi (this, n) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) procedure, private :: get_Xgid Get i-th geometry point in a specific direction private pure function get_Xgid (this, n, dir) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) procedure, private :: get_knot_all Get all knot vectors private pure function get_knot_all (this) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) procedure, private :: get_knoti Get i-th knot value private pure function get_knoti (this, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: i Return Value real(kind=rk)","tags":"","loc":"type/nurbs_curve.html"},{"title":"nurbs_volume – ForCAD ","text":"type, public :: nurbs_volume Components Type Visibility Attributes Name Initial real(kind=rk), private, allocatable :: Wc (:) Weights for the control points (1D array: [nc(1) nc(2) nc(3)]) real(kind=rk), private, allocatable :: Xc (:,:) Control points (2D array: [nc(1) nc(2) nc(3), dim]) real(kind=rk), private, allocatable :: Xg (:,:) Geometry points (2D array: [ng(1) ng(2) ng(3), dim]) real(kind=rk), private, allocatable :: Xt1 (:) Evaluation parameter values in the first direction (1D array: [ng(1)]) real(kind=rk), private, allocatable :: Xt2 (:) Evaluation parameter values in the second direction (1D array: [ng(2)]) real(kind=rk), private, allocatable :: Xt3 (:) Evaluation parameter values in the third direction (1D array: [ng(3)]) integer, private :: degree (3) Degree (order) of the volume integer, private, allocatable :: elemConn (:,:) IGA element connectivity integer, private, allocatable :: elemConn_Xc_vis (:,:) Connectivity for visualization of control points integer, private, allocatable :: elemConn_Xg_vis (:,:) Connectivity for visualization of geometry points real(kind=rk), private, allocatable :: knot1 (:) Knot vector in the first direction (1D array) real(kind=rk), private, allocatable :: knot2 (:) Knot vector in the second direction (1D array) real(kind=rk), private, allocatable :: knot3 (:) Knot vector in the third direction (1D array) integer, private :: nc (3) Number of control points in each direction integer, private :: ng (3) Number of geometry points in each direction Type-Bound Procedures procedure, public :: basis Compute the basis functions of the NURBS volume private pure subroutine basis (this, res1, res2, res3, Xt1, Xt2, Xt3, Tgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) procedure, public :: cmp_elem Generate IGA element connectivity private pure function cmp_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: cmp_elem_Xc_vis Generate connectivity for control points private pure function cmp_elem_Xc_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) procedure, public :: cmp_elem_Xg_vis Generate connectivity for geometry points private pure function cmp_elem_Xg_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) procedure, public :: create Generate geometry points private pure subroutine create (this, res1, res2, res3, Xt1, Xt2, Xt3, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(in), optional, contiguous :: Xt (:,:) procedure, public :: derivative Compute the derivative of the NURBS volume private pure subroutine derivative (this, res1, res2, res3, Xt1, Xt2, Xt3, dTgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) procedure, public :: elevate_degree Elevate the degree of the NURBS volume private pure subroutine elevate_degree (this, dir, t) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir integer, intent(in) :: t procedure, public :: export_Xc Export control points to VTK file private impure subroutine export_Xc (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this character(len=*), intent(in) :: filename procedure, public :: export_Xg Export geometry points to VTK file private impure subroutine export_Xg (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this character(len=*), intent(in) :: filename procedure, public :: finalize Finalize the NURBS volume object private pure subroutine finalize (this) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this generic, public :: get_Wc => get_Wc_all , get_Wci Get weights private pure function get_Wc_all (this) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) private pure function get_Wci (this, n) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk) generic, public :: get_Xc => get_Xc_all , get_Xci , get_Xcid Get control points private pure function get_Xc_all (this) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xci (this, n) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) private pure function get_Xcid (this, n, dir) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) generic, public :: get_Xg => get_Xg_all , get_Xgi , get_Xgid Get geometry points private pure function get_Xg_all (this) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xgi (this, n) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) private pure function get_Xgid (this, n, dir) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) procedure, public :: get_Xt Get parameter values private pure function get_Xt (this, dir) result(Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) procedure, public :: get_continuity Get continuity of the volume private pure function get_continuity (this, dir) result(c) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) generic, public :: get_degree => get_degree_all , get_degree_dir Get degree of the NURBS volume private pure function get_degree_all (this) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, (3) private pure function get_degree_dir (this, dir) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer procedure, public :: get_elem Get IGA element connectivity private pure function get_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: get_elem_Xc_vis Get connectivity for control points private pure function get_elem_Xc_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) procedure, public :: get_elem_Xg_vis Get connectivity for geometry points private pure function get_elem_Xg_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) generic, public :: get_knot => get_knoti , get_knot_all Get knot vector private pure function get_knoti (this, dir, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir integer, intent(in) :: i Return Value real(kind=rk) private pure function get_knot_all (this, dir) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) procedure, public :: get_multiplicity Get multiplicity of the knot vector private pure function get_multiplicity (this, dir) result(m) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) procedure, public :: get_nc Get number of required control points private pure function get_nc (this, dir) result(nc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer procedure, public :: get_ng Get number of geometry points private pure function get_ng (this) result(ng) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, (3) procedure, public :: insert_knots Insert knots into the knot vector private pure subroutine insert_knots (this, dir, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) procedure, public :: is_rational Check if the NURBS volume is rational private pure function is_rational (this) result(r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value logical procedure, public :: modify_Wc Modify weights private pure subroutine modify_Wc (this, W, num) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num procedure, public :: modify_Xc Modify control points private pure subroutine modify_Xc (this, X, num, dir) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir procedure, public :: put_to_nurbs Put a shape to a NURBS volume private pure subroutine put_to_nurbs (this, X, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: X (:,:) integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: remove_knots Remove knots from the knot vector private pure subroutine remove_knots (this, dir, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) procedure, public :: rotate_Xc Rotate control points private pure subroutine rotate_Xc (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta procedure, public :: rotate_Xg Rotate geometry points private pure subroutine rotate_Xg (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta generic, public :: set => set1 , set2 , set3 Set NURBS volume private pure subroutine set1 (this, knot1, knot2, knot3, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set control points and weights for the NURBS volume object. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot1 (:) real(kind=rk), intent(in), contiguous :: knot2 (:) real(kind=rk), intent(in), contiguous :: knot3 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set2 (this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set control points and weights for the NURBS volume object. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir1 (:) real(kind=rk), intent(in), contiguous :: Xth_dir2 (:) real(kind=rk), intent(in), contiguous :: Xth_dir3 (:) integer, intent(in), contiguous :: degree (:) integer, intent(in), contiguous :: continuity1 (:) integer, intent(in), contiguous :: continuity2 (:) integer, intent(in), contiguous :: continuity3 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set3 (this, nc, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier volume using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set1 Set knot vectors, control points and weights for the NURBS volume object private pure subroutine set1 (this, knot1, knot2, knot3, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set control points and weights for the NURBS volume object. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot1 (:) real(kind=rk), intent(in), contiguous :: knot2 (:) real(kind=rk), intent(in), contiguous :: knot3 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set2 Set NURBS volume using nodes of parameter space, degree, continuity, control points and weights private pure subroutine set2 (this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set control points and weights for the NURBS volume object. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir1 (:) real(kind=rk), intent(in), contiguous :: Xth_dir2 (:) real(kind=rk), intent(in), contiguous :: Xth_dir3 (:) integer, intent(in), contiguous :: degree (:) integer, intent(in), contiguous :: continuity1 (:) integer, intent(in), contiguous :: continuity2 (:) integer, intent(in), contiguous :: continuity3 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set3 Set Bezier or Rational Bezier volume using control points and weights private pure subroutine set3 (this, nc, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier volume using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: set_elem Set IGA element connectivity private pure subroutine set_elem (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: set_elem_Xc_vis Set connectivity for control points private pure subroutine set_elem_Xc_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: set_elem_Xg_vis Set connectivity for geometry points private pure subroutine set_elem_Xg_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) procedure, public :: set_hexahedron Set a hexahedron private pure subroutine set_hexahedron (this, L, nc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: L (:) integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) procedure, public :: show Show the NURBS object using PyVista private impure subroutine show (this, vtkfile_Xc, vtkfile_Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg procedure, public :: translate_Xc Translate control points private pure subroutine translate_Xc (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) procedure, public :: translate_Xg Translate geometry points private pure subroutine translate_Xg (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) procedure, private :: get_Wc_all Get all weights private pure function get_Wc_all (this) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) procedure, private :: get_Wci Get i-th weight private pure function get_Wci (this, n) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk) procedure, private :: get_Xc_all Get all control points private pure function get_Xc_all (this) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) procedure, private :: get_Xci Get i-th control point private pure function get_Xci (this, n) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) procedure, private :: get_Xcid Get i-th control point in a specific direction private pure function get_Xcid (this, n, dir) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) procedure, private :: get_Xg_all Get all geometry points private pure function get_Xg_all (this) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) procedure, private :: get_Xgi Get i-th geometry point private pure function get_Xgi (this, n) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) procedure, private :: get_Xgid Get i-th geometry point in a specific direction private pure function get_Xgid (this, n, dir) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) procedure, private :: get_degree_all Get degree of the NURBS volume in all directions private pure function get_degree_all (this) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, (3) procedure, private :: get_degree_dir Get degree of the NURBS volume in a specific direction private pure function get_degree_dir (this, dir) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer procedure, private :: get_knot_all Get all knot vectors private pure function get_knot_all (this, dir) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) procedure, private :: get_knoti Get i-th knot value private pure function get_knoti (this, dir, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir integer, intent(in) :: i Return Value real(kind=rk)","tags":"","loc":"type/nurbs_volume.html"},{"title":"generate_Xc – ForCAD","text":"function generate_Xc(num_rows, num_cols, peak_height) result(control_points) Arguments Type Intent Optional Attributes Name integer, intent(in) :: num_rows integer, intent(in) :: num_cols real(kind=rk), intent(in) :: peak_height Return Value real(kind=rk), allocatable, (:,:) Called by proc~~generate_xc~~CalledByGraph proc~generate_xc generate_Xc program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~generate_xc Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/generate_xc.html"},{"title":"basis_bernstein – ForCAD","text":"public pure function basis_bernstein(Xt, nc) result(B) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: Xt integer, intent(in) :: nc Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/basis_bernstein.html"},{"title":"basis_bspline – ForCAD","text":"public pure function basis_bspline(Xt, knot, nc, degree) result(B) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: Xt real(kind=rk), intent(in), contiguous :: knot (:) integer, intent(in) :: nc integer, intent(in) :: degree Return Value real(kind=rk), allocatable, (:) Called by proc~~basis_bspline~~CalledByGraph proc~basis_bspline basis_bspline proc~basis nurbs_surface%basis proc~basis->proc~basis_bspline proc~basis~2 nurbs_curve%basis proc~basis~2->proc~basis_bspline proc~basis~3 nurbs_volume%basis proc~basis~3->proc~basis_bspline proc~create nurbs_surface%create proc~create->proc~basis_bspline proc~create~2 nurbs_curve%create proc~create~2->proc~basis_bspline proc~create~3 nurbs_volume%create proc~create~3->proc~basis_bspline proc~put_to_nurbs nurbs_volume%put_to_nurbs proc~put_to_nurbs->proc~basis_bspline program~example1_curve example1_curve program~example1_curve->proc~create~2 program~example3_surface example3_surface program~example3_surface->proc~create program~example3_volume example3_volume program~example3_volume->proc~create~3 program~example_morph example_morph program~example_morph->proc~put_to_nurbs program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~create~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~create program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~create~3 program~shape_circle shape_circle program~shape_circle->proc~create~2 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~create~3 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~create Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/basis_bspline.html"},{"title":"basis_bspline_der – ForCAD","text":"public pure function basis_bspline_der(Xt, knot, nc, degree) result(dB) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: Xt real(kind=rk), intent(in), contiguous :: knot (:) integer, intent(in) :: nc integer, intent(in) :: degree Return Value real(kind=rk), allocatable, (:) Calls proc~~basis_bspline_der~~CallsGraph proc~basis_bspline_der basis_bspline_der proc~isinf isinf proc~basis_bspline_der->proc~isinf Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~basis_bspline_der~~CalledByGraph proc~basis_bspline_der basis_bspline_der proc~derivative nurbs_surface%derivative proc~derivative->proc~basis_bspline_der proc~derivative~2 nurbs_curve%derivative proc~derivative~2->proc~basis_bspline_der proc~derivative~3 nurbs_volume%derivative proc~derivative~3->proc~basis_bspline_der Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/basis_bspline_der.html"},{"title":"compute_knot_vector – ForCAD","text":"public pure function compute_knot_vector(Xth_dir, degree, continuity) result(knot) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: Xth_dir (:) integer, intent(in) :: degree integer, intent(in), contiguous :: continuity (:) Return Value real(kind=rk), allocatable, (:) Calls proc~~compute_knot_vector~~CallsGraph proc~compute_knot_vector compute_knot_vector proc~repelem repelem proc~compute_knot_vector->proc~repelem Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~compute_knot_vector~~CalledByGraph proc~compute_knot_vector compute_knot_vector proc~set2 nurbs_surface%set2 proc~set2->proc~compute_knot_vector proc~set2~2 nurbs_curve%set2 proc~set2~2->proc~compute_knot_vector proc~set2~3 nurbs_volume%set2 proc~set2~3->proc~compute_knot_vector none~set nurbs_surface%set none~set->proc~set2 none~set~2 nurbs_curve%set none~set~2->proc~set2~2 none~set~3 nurbs_volume%set none~set~3->proc~set2~3 proc~elevate_degree nurbs_surface%elevate_degree proc~elevate_degree->none~set proc~elevate_degree~2 nurbs_curve%elevate_degree proc~elevate_degree~2->none~set~2 proc~elevate_degree~3 nurbs_volume%elevate_degree proc~elevate_degree~3->none~set~3 proc~insert_knots nurbs_surface%insert_knots proc~insert_knots->none~set proc~insert_knots~2 nurbs_curve%insert_knots proc~insert_knots~2->none~set~2 proc~insert_knots~3 nurbs_volume%insert_knots proc~insert_knots~3->none~set~3 proc~modify_wc nurbs_surface%modify_Wc proc~modify_wc->none~set proc~modify_wc~2 nurbs_curve%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_wc~3 nurbs_volume%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc nurbs_surface%modify_Xc proc~modify_xc->none~set proc~modify_xc~2 nurbs_curve%modify_Xc proc~modify_xc~2->none~set~2 proc~modify_xc~3 nurbs_volume%modify_Xc proc~modify_xc~3->none~set~3 proc~remove_knots nurbs_surface%remove_knots proc~remove_knots->none~set proc~remove_knots~2 nurbs_curve%remove_knots proc~remove_knots~2->none~set~2 proc~remove_knots~3 nurbs_volume%remove_knots proc~remove_knots~3->none~set~3 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~2 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set~3 proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set program~example1_curve example1_curve program~example1_curve->none~set~2 program~example1_curve->proc~elevate_degree~2 program~example1_curve->proc~insert_knots~2 program~example1_curve->proc~remove_knots~2 program~example3_surface example3_surface program~example3_surface->none~set program~example3_surface->proc~elevate_degree program~example3_surface->proc~insert_knots program~example3_surface->proc~remove_knots program~example3_volume example3_volume program~example3_volume->none~set~3 program~example3_volume->proc~elevate_degree~3 program~example3_volume->proc~insert_knots~3 program~example3_volume->proc~remove_knots~3 program~example_morph example_morph program~example_morph->none~set~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set~3 program~shape_circle shape_circle program~shape_circle->proc~set_circle program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/compute_knot_vector.html"},{"title":"findspan – ForCAD","text":"public pure function findspan(n, degree, Xth, knot) result(s) Arguments Type Intent Optional Attributes Name integer, intent(in) :: n integer, intent(in) :: degree real(kind=rk), intent(in) :: Xth real(kind=rk), intent(in), contiguous :: knot (:) Return Value integer Called by proc~~findspan~~CalledByGraph proc~findspan findspan proc~insert_knots nurbs_surface%insert_knots proc~insert_knots->proc~findspan proc~insert_knots~2 nurbs_curve%insert_knots proc~insert_knots~2->proc~findspan proc~insert_knots~3 nurbs_volume%insert_knots proc~insert_knots~3->proc~findspan proc~remove_knots nurbs_surface%remove_knots proc~remove_knots->proc~findspan proc~remove_knots~2 nurbs_curve%remove_knots proc~remove_knots~2->proc~findspan proc~remove_knots~3 nurbs_volume%remove_knots proc~remove_knots~3->proc~findspan program~example1_curve example1_curve program~example1_curve->proc~insert_knots~2 program~example1_curve->proc~remove_knots~2 program~example3_surface example3_surface program~example3_surface->proc~insert_knots program~example3_surface->proc~remove_knots program~example3_volume example3_volume program~example3_volume->proc~insert_knots~3 program~example3_volume->proc~remove_knots~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/findspan.html"},{"title":"hexahedron_Xc – ForCAD","text":"public pure function hexahedron_Xc(L, nc) result(Xc) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: L (3) integer, intent(in) :: nc (3) Return Value real(kind=rk), allocatable, (:,:) Called by proc~~hexahedron_xc~~CalledByGraph proc~hexahedron_xc hexahedron_Xc proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->proc~hexahedron_xc program~example_morph example_morph program~example_morph->proc~hexahedron_xc program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/hexahedron_xc.html"},{"title":"kron – ForCAD","text":"public pure function kron(u, v) result(w) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: u (:) real(kind=rk), intent(in), contiguous :: v (:) Return Value real(kind=rk), (size(u)*size(v)) Called by proc~~kron~~CalledByGraph proc~kron kron proc~basis nurbs_surface%basis proc~basis->proc~kron proc~basis~3 nurbs_volume%basis proc~basis~3->proc~kron proc~create nurbs_surface%create proc~create->proc~kron proc~create~3 nurbs_volume%create proc~create~3->proc~kron proc~derivative nurbs_surface%derivative proc~derivative->proc~kron proc~derivative~3 nurbs_volume%derivative proc~derivative~3->proc~kron proc~put_to_nurbs nurbs_volume%put_to_nurbs proc~put_to_nurbs->proc~kron program~example3_surface example3_surface program~example3_surface->proc~create program~example3_volume example3_volume program~example3_volume->proc~create~3 program~example_morph example_morph program~example_morph->proc~put_to_nurbs program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~create program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~create~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~create~3 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~create Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/kron.html"},{"title":"rotation – ForCAD","text":"public pure function rotation(alpha, beta, theta) result(R) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta Return Value real(kind=rk), dimension(3,3) Calls proc~~rotation~~CallsGraph proc~rotation rotation cosd cosd proc~rotation->cosd sind sind proc~rotation->sind Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~rotation~~CalledByGraph proc~rotation rotation proc~rotate_xc nurbs_surface%rotate_Xc proc~rotate_xc->proc~rotation proc~rotate_xc~2 nurbs_curve%rotate_Xc proc~rotate_xc~2->proc~rotation proc~rotate_xc~3 nurbs_volume%rotate_Xc proc~rotate_xc~3->proc~rotation proc~rotate_xg nurbs_surface%rotate_Xg proc~rotate_xg->proc~rotation proc~rotate_xg~2 nurbs_curve%rotate_Xg proc~rotate_xg~2->proc~rotation proc~rotate_xg~3 nurbs_volume%rotate_Xg proc~rotate_xg~3->proc~rotation program~example1_curve example1_curve program~example1_curve->proc~rotate_xc~2 program~example1_curve->proc~rotate_xg~2 program~example3_surface example3_surface program~example3_surface->proc~rotate_xc program~example3_surface->proc~rotate_xg program~example3_volume example3_volume program~example3_volume->proc~rotate_xc~3 program~example3_volume->proc~rotate_xg~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/rotation.html"},{"title":"tetragon_Xc – ForCAD","text":"public pure function tetragon_Xc(L, nc) result(Xc) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: L (2) integer, intent(in) :: nc (2) Return Value real(kind=rk), allocatable, (:,:) Called by proc~~tetragon_xc~~CalledByGraph proc~tetragon_xc tetragon_Xc proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->proc~tetragon_xc program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/tetragon_xc.html"},{"title":"bincoeff – ForCAD","text":"private pure function bincoeff(n, k) result(b) Arguments Type Intent Optional Attributes Name integer, intent(in) :: n integer, intent(in) :: k Return Value real(kind=rk) Calls proc~~bincoeff~~CallsGraph proc~bincoeff bincoeff proc~factln factln proc~bincoeff->proc~factln Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~bincoeff~~CalledByGraph proc~bincoeff bincoeff proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree_a_5_9->proc~bincoeff proc~elevate_degree nurbs_surface%elevate_degree proc~elevate_degree->proc~elevate_degree_a_5_9 proc~elevate_degree~2 nurbs_curve%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 proc~elevate_degree~3 nurbs_volume%elevate_degree proc~elevate_degree~3->proc~elevate_degree_a_5_9 program~example1_curve example1_curve program~example1_curve->proc~elevate_degree~2 program~example3_surface example3_surface program~example3_surface->proc~elevate_degree program~example3_volume example3_volume program~example3_volume->proc~elevate_degree~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/bincoeff.html"},{"title":"cmp_elemConn_C0_L – ForCAD","text":"private pure function cmp_elemConn_C0_L(nnode, p) result(elemConn) Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode integer, intent(in) :: p Return Value integer, allocatable, (:,:) Called by proc~~cmp_elemconn_c0_l~~CalledByGraph proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0 elemConn_C0 interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elem_xc_vis nurbs_surface%cmp_elem_Xc_vis proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elem_xc_vis~2 nurbs_curve%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elem_xc_vis~3 nurbs_volume%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elem_xg_vis nurbs_surface%cmp_elem_Xg_vis proc~cmp_elem_xg_vis->interface~elemconn_c0 proc~cmp_elem_xg_vis~2 nurbs_curve%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~cmp_elem_xg_vis~3 nurbs_volume%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~export_xc nurbs_surface%export_Xc proc~export_xc->proc~cmp_elem_xc_vis proc~export_xc~2 nurbs_curve%export_Xc proc~export_xc~2->proc~cmp_elem_xc_vis~2 proc~export_xc~3 nurbs_volume%export_Xc proc~export_xc~3->proc~cmp_elem_xc_vis~3 proc~export_xg nurbs_surface%export_Xg proc~export_xg->proc~cmp_elem_xg_vis proc~export_xg~2 nurbs_curve%export_Xg proc~export_xg~2->proc~cmp_elem_xg_vis~2 proc~export_xg~3 nurbs_volume%export_Xg proc~export_xg~3->proc~cmp_elem_xg_vis~3 program~example1_curve example1_curve program~example1_curve->proc~export_xc~2 program~example1_curve->proc~export_xg~2 program~example3_surface example3_surface program~example3_surface->proc~export_xc program~example3_surface->proc~export_xg program~example3_volume example3_volume program~example3_volume->proc~export_xc~3 program~example3_volume->proc~export_xg~3 program~example_morph example_morph program~example_morph->proc~export_xc~3 program~example_morph->proc~export_xg~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~export_xc~2 program~example_nurbs_curve->proc~export_xg~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~export_xc program~example_nurbs_surface->proc~export_xg program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~export_xc~3 program~example_nurbs_volume->proc~export_xg~3 program~shape_circle shape_circle program~shape_circle->proc~export_xc~2 program~shape_circle->proc~export_xg~2 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~export_xc~3 program~shape_hexahedron->proc~export_xg~3 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~export_xc program~shape_tetragon->proc~export_xg Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elemconn_c0_l.html"},{"title":"cmp_elemConn_C0_S – ForCAD","text":"private pure function cmp_elemConn_C0_S(nnode1, nnode2, p1, p2) result(elemConn) Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: p1 integer, intent(in) :: p2 Return Value integer, allocatable, (:,:) Called by proc~~cmp_elemconn_c0_s~~CalledByGraph proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0 elemConn_C0 interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elem_xc_vis nurbs_surface%cmp_elem_Xc_vis proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elem_xc_vis~2 nurbs_curve%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elem_xc_vis~3 nurbs_volume%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elem_xg_vis nurbs_surface%cmp_elem_Xg_vis proc~cmp_elem_xg_vis->interface~elemconn_c0 proc~cmp_elem_xg_vis~2 nurbs_curve%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~cmp_elem_xg_vis~3 nurbs_volume%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~export_xc nurbs_surface%export_Xc proc~export_xc->proc~cmp_elem_xc_vis proc~export_xc~2 nurbs_curve%export_Xc proc~export_xc~2->proc~cmp_elem_xc_vis~2 proc~export_xc~3 nurbs_volume%export_Xc proc~export_xc~3->proc~cmp_elem_xc_vis~3 proc~export_xg nurbs_surface%export_Xg proc~export_xg->proc~cmp_elem_xg_vis proc~export_xg~2 nurbs_curve%export_Xg proc~export_xg~2->proc~cmp_elem_xg_vis~2 proc~export_xg~3 nurbs_volume%export_Xg proc~export_xg~3->proc~cmp_elem_xg_vis~3 program~example1_curve example1_curve program~example1_curve->proc~export_xc~2 program~example1_curve->proc~export_xg~2 program~example3_surface example3_surface program~example3_surface->proc~export_xc program~example3_surface->proc~export_xg program~example3_volume example3_volume program~example3_volume->proc~export_xc~3 program~example3_volume->proc~export_xg~3 program~example_morph example_morph program~example_morph->proc~export_xc~3 program~example_morph->proc~export_xg~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~export_xc~2 program~example_nurbs_curve->proc~export_xg~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~export_xc program~example_nurbs_surface->proc~export_xg program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~export_xc~3 program~example_nurbs_volume->proc~export_xg~3 program~shape_circle shape_circle program~shape_circle->proc~export_xc~2 program~shape_circle->proc~export_xg~2 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~export_xc~3 program~shape_hexahedron->proc~export_xg~3 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~export_xc program~shape_tetragon->proc~export_xg Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elemconn_c0_s.html"},{"title":"cmp_elemConn_C0_V – ForCAD","text":"private pure function cmp_elemConn_C0_V(nnode1, nnode2, nnode3, p1, p2, p3) result(elemConn) Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: nnode3 integer, intent(in) :: p1 integer, intent(in) :: p2 integer, intent(in) :: p3 Return Value integer, allocatable, (:,:) Called by proc~~cmp_elemconn_c0_v~~CalledByGraph proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0 elemConn_C0 interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~cmp_elem_xc_vis nurbs_surface%cmp_elem_Xc_vis proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elem_xc_vis~2 nurbs_curve%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elem_xc_vis~3 nurbs_volume%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elem_xg_vis nurbs_surface%cmp_elem_Xg_vis proc~cmp_elem_xg_vis->interface~elemconn_c0 proc~cmp_elem_xg_vis~2 nurbs_curve%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~cmp_elem_xg_vis~3 nurbs_volume%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~export_xc nurbs_surface%export_Xc proc~export_xc->proc~cmp_elem_xc_vis proc~export_xc~2 nurbs_curve%export_Xc proc~export_xc~2->proc~cmp_elem_xc_vis~2 proc~export_xc~3 nurbs_volume%export_Xc proc~export_xc~3->proc~cmp_elem_xc_vis~3 proc~export_xg nurbs_surface%export_Xg proc~export_xg->proc~cmp_elem_xg_vis proc~export_xg~2 nurbs_curve%export_Xg proc~export_xg~2->proc~cmp_elem_xg_vis~2 proc~export_xg~3 nurbs_volume%export_Xg proc~export_xg~3->proc~cmp_elem_xg_vis~3 program~example1_curve example1_curve program~example1_curve->proc~export_xc~2 program~example1_curve->proc~export_xg~2 program~example3_surface example3_surface program~example3_surface->proc~export_xc program~example3_surface->proc~export_xg program~example3_volume example3_volume program~example3_volume->proc~export_xc~3 program~example3_volume->proc~export_xg~3 program~example_morph example_morph program~example_morph->proc~export_xc~3 program~example_morph->proc~export_xg~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~export_xc~2 program~example_nurbs_curve->proc~export_xg~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~export_xc program~example_nurbs_surface->proc~export_xg program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~export_xc~3 program~example_nurbs_volume->proc~export_xg~3 program~shape_circle shape_circle program~shape_circle->proc~export_xc~2 program~shape_circle->proc~export_xg~2 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~export_xc~3 program~shape_hexahedron->proc~export_xg~3 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~export_xc program~shape_tetragon->proc~export_xg Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elemconn_c0_v.html"},{"title":"compute_multiplicity1 – ForCAD","text":"private pure function compute_multiplicity1(knot) result(multiplicity) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: knot (:) Return Value integer, allocatable, (:) Called by proc~~compute_multiplicity1~~CalledByGraph proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity compute_multiplicity interface~compute_multiplicity->proc~compute_multiplicity1 proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~get_continuity nurbs_surface%get_continuity proc~get_continuity->interface~compute_multiplicity proc~get_continuity~2 nurbs_curve%get_continuity proc~get_continuity~2->interface~compute_multiplicity proc~get_continuity~3 nurbs_volume%get_continuity proc~get_continuity~3->interface~compute_multiplicity proc~get_multiplicity nurbs_surface%get_multiplicity proc~get_multiplicity->interface~compute_multiplicity proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~get_nc nurbs_surface%get_nc proc~get_nc->interface~compute_multiplicity proc~get_nc~2 nurbs_curve%get_nc proc~get_nc~2->interface~compute_multiplicity proc~get_nc~3 nurbs_volume%get_nc proc~get_nc~3->interface~compute_multiplicity proc~insert_knots nurbs_surface%insert_knots proc~insert_knots->interface~compute_multiplicity none~set nurbs_surface%set proc~insert_knots->none~set proc~insert_knots~2 nurbs_curve%insert_knots proc~insert_knots~2->interface~compute_multiplicity none~set~2 nurbs_curve%set proc~insert_knots~2->none~set~2 proc~insert_knots~3 nurbs_volume%insert_knots proc~insert_knots~3->interface~compute_multiplicity none~set~3 nurbs_volume%set proc~insert_knots~3->none~set~3 proc~remove_knots nurbs_surface%remove_knots proc~remove_knots->interface~compute_multiplicity proc~remove_knots->none~set proc~remove_knots~2 nurbs_curve%remove_knots proc~remove_knots~2->interface~compute_multiplicity proc~remove_knots~2->none~set~2 proc~remove_knots~3 nurbs_volume%remove_knots proc~remove_knots~3->interface~compute_multiplicity proc~remove_knots~3->none~set~3 proc~cmp_elem nurbs_surface%cmp_elem proc~cmp_elem->proc~get_multiplicity proc~cmp_elem~2 nurbs_curve%cmp_elem proc~cmp_elem~2->proc~get_multiplicity~2 proc~cmp_elem~3 nurbs_volume%cmp_elem proc~cmp_elem~3->proc~get_multiplicity~3 proc~elevate_degree nurbs_surface%elevate_degree proc~elevate_degree->proc~elevate_degree_a_5_9 proc~elevate_degree->none~set proc~elevate_degree~2 nurbs_curve%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 proc~elevate_degree~2->none~set~2 proc~elevate_degree~3 nurbs_volume%elevate_degree proc~elevate_degree~3->proc~elevate_degree_a_5_9 proc~elevate_degree~3->none~set~3 proc~get_degree nurbs_curve%get_degree proc~get_degree->proc~get_multiplicity~2 proc~get_degree_all nurbs_surface%get_degree_all proc~get_degree_all->proc~get_multiplicity proc~get_degree_all~2 nurbs_volume%get_degree_all proc~get_degree_all~2->proc~get_multiplicity~3 proc~get_degree_dir nurbs_surface%get_degree_dir proc~get_degree_dir->proc~get_multiplicity proc~get_degree_dir~2 nurbs_volume%get_degree_dir proc~get_degree_dir~2->proc~get_multiplicity~3 proc~set1 nurbs_surface%set1 proc~set1->proc~get_nc none~get_degree nurbs_surface%get_degree proc~set1->none~get_degree proc~set1~3 nurbs_volume%set1 proc~set1~3->proc~get_nc~3 none~get_degree~3 nurbs_volume%get_degree proc~set1~3->none~get_degree~3 proc~set2 nurbs_surface%set2 proc~set2->proc~get_nc proc~set2~3 nurbs_volume%set2 proc~set2~3->proc~get_nc~3 program~example1_curve example1_curve program~example1_curve->proc~insert_knots~2 program~example1_curve->proc~remove_knots~2 program~example1_curve->proc~elevate_degree~2 program~example1_curve->proc~get_degree program~example1_curve->none~set~2 program~example3_surface example3_surface program~example3_surface->proc~insert_knots program~example3_surface->proc~remove_knots program~example3_surface->proc~elevate_degree program~example3_surface->none~get_degree program~example3_surface->none~set program~example3_volume example3_volume program~example3_volume->proc~insert_knots~3 program~example3_volume->proc~remove_knots~3 program~example3_volume->proc~elevate_degree~3 program~example3_volume->none~get_degree~3 program~example3_volume->none~set~3 none~get_degree->proc~get_degree_all none~get_degree->proc~get_degree_dir none~get_degree~3->proc~get_degree_all~2 none~get_degree~3->proc~get_degree_dir~2 none~set->proc~set1 none~set->proc~set2 proc~set3 nurbs_surface%set3 none~set->proc~set3 none~set~3->proc~set1~3 none~set~3->proc~set2~3 proc~set3~3 nurbs_volume%set3 none~set~3->proc~set3~3 proc~set1~2 nurbs_curve%set1 proc~set1~2->proc~get_degree proc~set3~2 nurbs_curve%set3 proc~set3~2->proc~get_degree none~set~2->proc~set1~2 none~set~2->proc~set3~2 proc~modify_wc nurbs_surface%modify_Wc proc~modify_wc->none~set proc~modify_wc~3 nurbs_volume%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc nurbs_surface%modify_Xc proc~modify_xc->none~set proc~modify_xc~3 nurbs_volume%modify_Xc proc~modify_xc~3->none~set~3 proc~set3->none~get_degree proc~set3~3->none~get_degree~3 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set~3 proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set program~example_morph example_morph program~example_morph->none~set~3 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set~3 proc~modify_wc~2 nurbs_curve%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc~2 nurbs_curve%modify_Xc proc~modify_xc~2->none~set~2 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~2 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~2 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/compute_multiplicity1.html"},{"title":"compute_multiplicity2 – ForCAD","text":"private pure function compute_multiplicity2(knot, Xth) result(multiplicity) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in) :: Xth Return Value integer Called by proc~~compute_multiplicity2~~CalledByGraph proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity compute_multiplicity interface~compute_multiplicity->proc~compute_multiplicity2 proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~get_continuity nurbs_surface%get_continuity proc~get_continuity->interface~compute_multiplicity proc~get_continuity~2 nurbs_curve%get_continuity proc~get_continuity~2->interface~compute_multiplicity proc~get_continuity~3 nurbs_volume%get_continuity proc~get_continuity~3->interface~compute_multiplicity proc~get_multiplicity nurbs_surface%get_multiplicity proc~get_multiplicity->interface~compute_multiplicity proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~get_nc nurbs_surface%get_nc proc~get_nc->interface~compute_multiplicity proc~get_nc~2 nurbs_curve%get_nc proc~get_nc~2->interface~compute_multiplicity proc~get_nc~3 nurbs_volume%get_nc proc~get_nc~3->interface~compute_multiplicity proc~insert_knots nurbs_surface%insert_knots proc~insert_knots->interface~compute_multiplicity none~set nurbs_surface%set proc~insert_knots->none~set proc~insert_knots~2 nurbs_curve%insert_knots proc~insert_knots~2->interface~compute_multiplicity none~set~2 nurbs_curve%set proc~insert_knots~2->none~set~2 proc~insert_knots~3 nurbs_volume%insert_knots proc~insert_knots~3->interface~compute_multiplicity none~set~3 nurbs_volume%set proc~insert_knots~3->none~set~3 proc~remove_knots nurbs_surface%remove_knots proc~remove_knots->interface~compute_multiplicity proc~remove_knots->none~set proc~remove_knots~2 nurbs_curve%remove_knots proc~remove_knots~2->interface~compute_multiplicity proc~remove_knots~2->none~set~2 proc~remove_knots~3 nurbs_volume%remove_knots proc~remove_knots~3->interface~compute_multiplicity proc~remove_knots~3->none~set~3 proc~cmp_elem nurbs_surface%cmp_elem proc~cmp_elem->proc~get_multiplicity proc~cmp_elem~2 nurbs_curve%cmp_elem proc~cmp_elem~2->proc~get_multiplicity~2 proc~cmp_elem~3 nurbs_volume%cmp_elem proc~cmp_elem~3->proc~get_multiplicity~3 proc~elevate_degree nurbs_surface%elevate_degree proc~elevate_degree->proc~elevate_degree_a_5_9 proc~elevate_degree->none~set proc~elevate_degree~2 nurbs_curve%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 proc~elevate_degree~2->none~set~2 proc~elevate_degree~3 nurbs_volume%elevate_degree proc~elevate_degree~3->proc~elevate_degree_a_5_9 proc~elevate_degree~3->none~set~3 proc~get_degree nurbs_curve%get_degree proc~get_degree->proc~get_multiplicity~2 proc~get_degree_all nurbs_surface%get_degree_all proc~get_degree_all->proc~get_multiplicity proc~get_degree_all~2 nurbs_volume%get_degree_all proc~get_degree_all~2->proc~get_multiplicity~3 proc~get_degree_dir nurbs_surface%get_degree_dir proc~get_degree_dir->proc~get_multiplicity proc~get_degree_dir~2 nurbs_volume%get_degree_dir proc~get_degree_dir~2->proc~get_multiplicity~3 proc~set1 nurbs_surface%set1 proc~set1->proc~get_nc none~get_degree nurbs_surface%get_degree proc~set1->none~get_degree proc~set1~3 nurbs_volume%set1 proc~set1~3->proc~get_nc~3 none~get_degree~3 nurbs_volume%get_degree proc~set1~3->none~get_degree~3 proc~set2 nurbs_surface%set2 proc~set2->proc~get_nc proc~set2~3 nurbs_volume%set2 proc~set2~3->proc~get_nc~3 program~example1_curve example1_curve program~example1_curve->proc~insert_knots~2 program~example1_curve->proc~remove_knots~2 program~example1_curve->proc~elevate_degree~2 program~example1_curve->proc~get_degree program~example1_curve->none~set~2 program~example3_surface example3_surface program~example3_surface->proc~insert_knots program~example3_surface->proc~remove_knots program~example3_surface->proc~elevate_degree program~example3_surface->none~get_degree program~example3_surface->none~set program~example3_volume example3_volume program~example3_volume->proc~insert_knots~3 program~example3_volume->proc~remove_knots~3 program~example3_volume->proc~elevate_degree~3 program~example3_volume->none~get_degree~3 program~example3_volume->none~set~3 none~get_degree->proc~get_degree_all none~get_degree->proc~get_degree_dir none~get_degree~3->proc~get_degree_all~2 none~get_degree~3->proc~get_degree_dir~2 none~set->proc~set1 none~set->proc~set2 proc~set3 nurbs_surface%set3 none~set->proc~set3 none~set~3->proc~set1~3 none~set~3->proc~set2~3 proc~set3~3 nurbs_volume%set3 none~set~3->proc~set3~3 proc~set1~2 nurbs_curve%set1 proc~set1~2->proc~get_degree proc~set3~2 nurbs_curve%set3 proc~set3~2->proc~get_degree none~set~2->proc~set1~2 none~set~2->proc~set3~2 proc~modify_wc nurbs_surface%modify_Wc proc~modify_wc->none~set proc~modify_wc~3 nurbs_volume%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc nurbs_surface%modify_Xc proc~modify_xc->none~set proc~modify_xc~3 nurbs_volume%modify_Xc proc~modify_xc~3->none~set~3 proc~set3->none~get_degree proc~set3~3->none~get_degree~3 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set~3 proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set program~example_morph example_morph program~example_morph->none~set~3 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set~3 proc~modify_wc~2 nurbs_curve%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc~2 nurbs_curve%modify_Xc proc~modify_xc~2->none~set~2 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~2 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~2 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/compute_multiplicity2.html"},{"title":"factln – ForCAD","text":"private pure function factln(n) result(f) Arguments Type Intent Optional Attributes Name integer, intent(in) :: n Return Value real(kind=rk) Called by proc~~factln~~CalledByGraph proc~factln factln proc~bincoeff bincoeff proc~bincoeff->proc~factln proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree_a_5_9->proc~bincoeff proc~elevate_degree nurbs_surface%elevate_degree proc~elevate_degree->proc~elevate_degree_a_5_9 proc~elevate_degree~2 nurbs_curve%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 proc~elevate_degree~3 nurbs_volume%elevate_degree proc~elevate_degree~3->proc~elevate_degree_a_5_9 program~example1_curve example1_curve program~example1_curve->proc~elevate_degree~2 program~example3_surface example3_surface program~example3_surface->proc~elevate_degree program~example3_volume example3_volume program~example3_volume->proc~elevate_degree~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/factln.html"},{"title":"isinf – ForCAD","text":"private pure elemental function isinf(x) result(output) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: x Return Value logical Called by proc~~isinf~~CalledByGraph proc~isinf isinf proc~basis_bspline_der basis_bspline_der proc~basis_bspline_der->proc~isinf proc~derivative nurbs_surface%derivative proc~derivative->proc~basis_bspline_der proc~derivative~2 nurbs_curve%derivative proc~derivative~2->proc~basis_bspline_der proc~derivative~3 nurbs_volume%derivative proc~derivative~3->proc~basis_bspline_der Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/isinf.html"},{"title":"isnan – ForCAD","text":"private pure elemental function isnan(x) result(output) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: x Return Value logical","tags":"","loc":"proc/isnan.html"},{"title":"repelem – ForCAD","text":"private pure function repelem(a, b) result(c) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: a (:) integer, intent(in), contiguous :: b (:) Return Value real(kind=rk), (sum(b)) Called by proc~~repelem~~CalledByGraph proc~repelem repelem proc~compute_knot_vector compute_knot_vector proc~compute_knot_vector->proc~repelem proc~set2 nurbs_surface%set2 proc~set2->proc~compute_knot_vector proc~set2~2 nurbs_curve%set2 proc~set2~2->proc~compute_knot_vector proc~set2~3 nurbs_volume%set2 proc~set2~3->proc~compute_knot_vector none~set nurbs_surface%set none~set->proc~set2 none~set~2 nurbs_curve%set none~set~2->proc~set2~2 none~set~3 nurbs_volume%set none~set~3->proc~set2~3 proc~elevate_degree nurbs_surface%elevate_degree proc~elevate_degree->none~set proc~elevate_degree~2 nurbs_curve%elevate_degree proc~elevate_degree~2->none~set~2 proc~elevate_degree~3 nurbs_volume%elevate_degree proc~elevate_degree~3->none~set~3 proc~insert_knots nurbs_surface%insert_knots proc~insert_knots->none~set proc~insert_knots~2 nurbs_curve%insert_knots proc~insert_knots~2->none~set~2 proc~insert_knots~3 nurbs_volume%insert_knots proc~insert_knots~3->none~set~3 proc~modify_wc nurbs_surface%modify_Wc proc~modify_wc->none~set proc~modify_wc~2 nurbs_curve%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_wc~3 nurbs_volume%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc nurbs_surface%modify_Xc proc~modify_xc->none~set proc~modify_xc~2 nurbs_curve%modify_Xc proc~modify_xc~2->none~set~2 proc~modify_xc~3 nurbs_volume%modify_Xc proc~modify_xc~3->none~set~3 proc~remove_knots nurbs_surface%remove_knots proc~remove_knots->none~set proc~remove_knots~2 nurbs_curve%remove_knots proc~remove_knots~2->none~set~2 proc~remove_knots~3 nurbs_volume%remove_knots proc~remove_knots~3->none~set~3 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~2 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set~3 proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set program~example1_curve example1_curve program~example1_curve->none~set~2 program~example1_curve->proc~elevate_degree~2 program~example1_curve->proc~insert_knots~2 program~example1_curve->proc~remove_knots~2 program~example3_surface example3_surface program~example3_surface->none~set program~example3_surface->proc~elevate_degree program~example3_surface->proc~insert_knots program~example3_surface->proc~remove_knots program~example3_volume example3_volume program~example3_volume->none~set~3 program~example3_volume->proc~elevate_degree~3 program~example3_volume->proc~insert_knots~3 program~example3_volume->proc~remove_knots~3 program~example_morph example_morph program~example_morph->none~set~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set~3 program~shape_circle shape_circle program~shape_circle->proc~set_circle program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code pure function repelem ( a , b ) result ( c ) real ( rk ), intent ( in ), contiguous :: a (:) integer , intent ( in ), contiguous :: b (:) real ( rk ) :: c ( sum ( b )) integer :: i , l , n l = 0 do i = 1 , size ( a ) n = b ( i ) c ( l + 1 : l + n ) = a ( i ) l = l + n end do end function repelem","tags":"","loc":"proc/repelem.html"},{"title":"unique_integer – ForCAD","text":"private pure function unique_integer(vec) result(output) Arguments Type Intent Optional Attributes Name integer, intent(in), dimension(:), contiguous :: vec Return Value integer, dimension(:), allocatable Called by proc~~unique_integer~~CalledByGraph proc~unique_integer unique_integer interface~unique unique interface~unique->proc~unique_integer proc~cmp_elem nurbs_surface%cmp_elem proc~cmp_elem->interface~unique proc~cmp_elem~2 nurbs_curve%cmp_elem proc~cmp_elem~2->interface~unique proc~cmp_elem~3 nurbs_volume%cmp_elem proc~cmp_elem~3->interface~unique Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/unique_integer.html"},{"title":"unique_real – ForCAD","text":"private pure function unique_real(vec) result(output) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), dimension(:), contiguous :: vec Return Value real(kind=rk), dimension(:), allocatable Called by proc~~unique_real~~CalledByGraph proc~unique_real unique_real interface~unique unique interface~unique->proc~unique_real proc~cmp_elem nurbs_surface%cmp_elem proc~cmp_elem->interface~unique proc~cmp_elem~2 nurbs_curve%cmp_elem proc~cmp_elem~2->interface~unique proc~cmp_elem~3 nurbs_volume%cmp_elem proc~cmp_elem~3->interface~unique Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/unique_real.html"},{"title":"elevate_degree_A_5_9 – ForCAD","text":"public pure subroutine elevate_degree_A_5_9(t, knot, degree, Xcw, nc_new, knot_new, Xcw_new) Arguments Type Intent Optional Attributes Name integer, intent(in) :: t real(kind=rk), intent(in), contiguous :: knot (:) integer, intent(in) :: degree real(kind=rk), intent(in), contiguous :: Xcw (:,:) integer, intent(out) :: nc_new real(kind=rk), intent(out), allocatable :: knot_new (:) real(kind=rk), intent(out), allocatable :: Xcw_new (:,:) Calls proc~~elevate_degree_a_5_9~~CallsGraph proc~elevate_degree_a_5_9 elevate_degree_A_5_9 interface~compute_multiplicity compute_multiplicity proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~bincoeff bincoeff proc~elevate_degree_a_5_9->proc~bincoeff proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~factln factln proc~bincoeff->proc~factln Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~elevate_degree_a_5_9~~CalledByGraph proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree nurbs_surface%elevate_degree proc~elevate_degree->proc~elevate_degree_a_5_9 proc~elevate_degree~2 nurbs_curve%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 proc~elevate_degree~3 nurbs_volume%elevate_degree proc~elevate_degree~3->proc~elevate_degree_a_5_9 program~example1_curve example1_curve program~example1_curve->proc~elevate_degree~2 program~example3_surface example3_surface program~example3_surface->proc~elevate_degree program~example3_volume example3_volume program~example3_volume->proc~elevate_degree~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/elevate_degree_a_5_9.html"},{"title":"insert_knot_A_5_1 – ForCAD","text":"public pure subroutine insert_knot_A_5_1(p, UP, Pw, u, k, s, r, nq, UQ, Qw) Arguments Type Intent Optional Attributes Name integer, intent(in) :: p real(kind=rk), intent(in), contiguous :: UP (0:) real(kind=rk), intent(in), contiguous :: Pw (0:,:) real(kind=rk), intent(in) :: u integer, intent(in) :: k integer, intent(in) :: s integer, intent(in) :: r integer, intent(out) :: nq real(kind=rk), intent(out), allocatable :: UQ (:) real(kind=rk), intent(out), allocatable :: Qw (:,:) Called by proc~~insert_knot_a_5_1~~CalledByGraph proc~insert_knot_a_5_1 insert_knot_A_5_1 proc~insert_knots nurbs_surface%insert_knots proc~insert_knots->proc~insert_knot_a_5_1 proc~insert_knots~2 nurbs_curve%insert_knots proc~insert_knots~2->proc~insert_knot_a_5_1 proc~insert_knots~3 nurbs_volume%insert_knots proc~insert_knots~3->proc~insert_knot_a_5_1 program~example1_curve example1_curve program~example1_curve->proc~insert_knots~2 program~example3_surface example3_surface program~example3_surface->proc~insert_knots program~example3_volume example3_volume program~example3_volume->proc~insert_knots~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/insert_knot_a_5_1.html"},{"title":"remove_knots_A_5_8 – ForCAD","text":"public pure subroutine remove_knots_A_5_8(p, knot, Pw, u, r, s, num, t, knot_new, Pw_new) Arguments Type Intent Optional Attributes Name integer, intent(in) :: p real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in), contiguous :: Pw (:,:) real(kind=rk), intent(in) :: u integer, intent(in) :: r integer, intent(in) :: s integer, intent(in) :: num integer, intent(out) :: t real(kind=rk), intent(out), allocatable :: knot_new (:) real(kind=rk), intent(out), allocatable :: Pw_new (:,:) Called by proc~~remove_knots_a_5_8~~CalledByGraph proc~remove_knots_a_5_8 remove_knots_A_5_8 proc~remove_knots nurbs_surface%remove_knots proc~remove_knots->proc~remove_knots_a_5_8 proc~remove_knots~2 nurbs_curve%remove_knots proc~remove_knots~2->proc~remove_knots_a_5_8 proc~remove_knots~3 nurbs_volume%remove_knots proc~remove_knots~3->proc~remove_knots_a_5_8 program~example1_curve example1_curve program~example1_curve->proc~remove_knots~2 program~example3_surface example3_surface program~example3_surface->proc~remove_knots program~example3_volume example3_volume program~example3_volume->proc~remove_knots~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/remove_knots_a_5_8.html"},{"title":"cmp_elemConn_Cn_L – ForCAD","text":"private pure subroutine cmp_elemConn_Cn_L(nnode, p, Xth, vecKnot_mul, elemConn) Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode integer, intent(in) :: p real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: vecKnot_mul (:) integer, intent(out), allocatable :: elemConn (:,:) Called by proc~~cmp_elemconn_cn_l~~CalledByGraph proc~cmp_elemconn_cn_l cmp_elemConn_Cn_L interface~elemconn_cn elemConn_Cn interface~elemconn_cn->proc~cmp_elemconn_cn_l proc~cmp_elem nurbs_surface%cmp_elem proc~cmp_elem->interface~elemconn_cn proc~cmp_elem~2 nurbs_curve%cmp_elem proc~cmp_elem~2->interface~elemconn_cn proc~cmp_elem~3 nurbs_volume%cmp_elem proc~cmp_elem~3->interface~elemconn_cn Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elemconn_cn_l.html"},{"title":"cmp_elemConn_Cn_S – ForCAD","text":"private pure subroutine cmp_elemConn_Cn_S(nnode1, nnode2, p1, p2, Xth1, Xth2, vecKnot_mul1, vecKnot_mul2, elemConn) Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: p1 integer, intent(in) :: p2 real(kind=rk), intent(in), contiguous :: Xth1 (:) real(kind=rk), intent(in), contiguous :: Xth2 (:) integer, intent(in), contiguous :: vecKnot_mul1 (:) integer, intent(in), contiguous :: vecKnot_mul2 (:) integer, intent(out), allocatable :: elemConn (:,:) Called by proc~~cmp_elemconn_cn_s~~CalledByGraph proc~cmp_elemconn_cn_s cmp_elemConn_Cn_S interface~elemconn_cn elemConn_Cn interface~elemconn_cn->proc~cmp_elemconn_cn_s proc~cmp_elem nurbs_surface%cmp_elem proc~cmp_elem->interface~elemconn_cn proc~cmp_elem~2 nurbs_curve%cmp_elem proc~cmp_elem~2->interface~elemconn_cn proc~cmp_elem~3 nurbs_volume%cmp_elem proc~cmp_elem~3->interface~elemconn_cn Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elemconn_cn_s.html"},{"title":"cmp_elemConn_Cn_V – ForCAD","text":"private pure subroutine cmp_elemConn_Cn_V(nnode1, nnode2, nnode3, p1, p2, p3, Xth1, Xth2, Xth3, vecKnot_mul1, vecKnot_mul2, vecKnot_mul3, elemConn) Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: nnode3 integer, intent(in) :: p1 integer, intent(in) :: p2 integer, intent(in) :: p3 real(kind=rk), intent(in), contiguous :: Xth1 (:) real(kind=rk), intent(in), contiguous :: Xth2 (:) real(kind=rk), intent(in), contiguous :: Xth3 (:) integer, intent(in), contiguous :: vecKnot_mul1 (:) integer, intent(in), contiguous :: vecKnot_mul2 (:) integer, intent(in), contiguous :: vecKnot_mul3 (:) integer, intent(out), allocatable :: elemConn (:,:) Called by proc~~cmp_elemconn_cn_v~~CalledByGraph proc~cmp_elemconn_cn_v cmp_elemConn_Cn_V interface~elemconn_cn elemConn_Cn interface~elemconn_cn->proc~cmp_elemconn_cn_v proc~cmp_elem nurbs_surface%cmp_elem proc~cmp_elem->interface~elemconn_cn proc~cmp_elem~2 nurbs_curve%cmp_elem proc~cmp_elem~2->interface~elemconn_cn proc~cmp_elem~3 nurbs_volume%cmp_elem proc~cmp_elem~3->interface~elemconn_cn Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elemconn_cn_v.html"},{"title":"ndgrid2 – ForCAD","text":"private pure subroutine ndgrid2(X_dir1, X_dir2, Xt) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: X_dir1 (:) real(kind=rk), intent(in), contiguous :: X_dir2 (:) real(kind=rk), intent(out), allocatable :: Xt (:,:) Called by proc~~ndgrid2~~CalledByGraph proc~ndgrid2 ndgrid2 interface~ndgrid ndgrid interface~ndgrid->proc~ndgrid2 proc~basis nurbs_surface%basis proc~basis->interface~ndgrid proc~basis~3 nurbs_volume%basis proc~basis~3->interface~ndgrid proc~create nurbs_surface%create proc~create->interface~ndgrid proc~create~3 nurbs_volume%create proc~create~3->interface~ndgrid proc~derivative nurbs_surface%derivative proc~derivative->interface~ndgrid proc~derivative~3 nurbs_volume%derivative proc~derivative~3->interface~ndgrid program~example3_surface example3_surface program~example3_surface->proc~create program~example3_volume example3_volume program~example3_volume->proc~create~3 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~create program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~create~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~create~3 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~create Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/ndgrid2.html"},{"title":"ndgrid3 – ForCAD","text":"private pure subroutine ndgrid3(X_dir1, X_dir2, X_dir3, Xt) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: X_dir1 (:) real(kind=rk), intent(in), contiguous :: X_dir2 (:) real(kind=rk), intent(in), contiguous :: X_dir3 (:) real(kind=rk), intent(out), allocatable :: Xt (:,:) Called by proc~~ndgrid3~~CalledByGraph proc~ndgrid3 ndgrid3 interface~ndgrid ndgrid interface~ndgrid->proc~ndgrid3 proc~basis nurbs_surface%basis proc~basis->interface~ndgrid proc~basis~3 nurbs_volume%basis proc~basis~3->interface~ndgrid proc~create nurbs_surface%create proc~create->interface~ndgrid proc~create~3 nurbs_volume%create proc~create~3->interface~ndgrid proc~derivative nurbs_surface%derivative proc~derivative->interface~ndgrid proc~derivative~3 nurbs_volume%derivative proc~derivative~3->interface~ndgrid program~example3_surface example3_surface program~example3_surface->proc~create program~example3_volume example3_volume program~example3_volume->proc~create~3 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~create program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~create~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~create~3 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~create Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/ndgrid3.html"},{"title":"compute_multiplicity – ForCAD","text":"public interface compute_multiplicity Calls interface~~compute_multiplicity~~CallsGraph interface~compute_multiplicity compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by interface~~compute_multiplicity~~CalledByGraph interface~compute_multiplicity compute_multiplicity proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~get_continuity nurbs_surface%get_continuity proc~get_continuity->interface~compute_multiplicity proc~get_continuity~2 nurbs_curve%get_continuity proc~get_continuity~2->interface~compute_multiplicity proc~get_continuity~3 nurbs_volume%get_continuity proc~get_continuity~3->interface~compute_multiplicity proc~get_multiplicity nurbs_surface%get_multiplicity proc~get_multiplicity->interface~compute_multiplicity proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~get_nc nurbs_surface%get_nc proc~get_nc->interface~compute_multiplicity proc~get_nc~2 nurbs_curve%get_nc proc~get_nc~2->interface~compute_multiplicity proc~get_nc~3 nurbs_volume%get_nc proc~get_nc~3->interface~compute_multiplicity proc~insert_knots nurbs_surface%insert_knots proc~insert_knots->interface~compute_multiplicity none~set nurbs_surface%set proc~insert_knots->none~set proc~insert_knots~2 nurbs_curve%insert_knots proc~insert_knots~2->interface~compute_multiplicity none~set~2 nurbs_curve%set proc~insert_knots~2->none~set~2 proc~insert_knots~3 nurbs_volume%insert_knots proc~insert_knots~3->interface~compute_multiplicity none~set~3 nurbs_volume%set proc~insert_knots~3->none~set~3 proc~remove_knots nurbs_surface%remove_knots proc~remove_knots->interface~compute_multiplicity proc~remove_knots->none~set proc~remove_knots~2 nurbs_curve%remove_knots proc~remove_knots~2->interface~compute_multiplicity proc~remove_knots~2->none~set~2 proc~remove_knots~3 nurbs_volume%remove_knots proc~remove_knots~3->interface~compute_multiplicity proc~remove_knots~3->none~set~3 proc~cmp_elem nurbs_surface%cmp_elem proc~cmp_elem->proc~get_multiplicity proc~cmp_elem~2 nurbs_curve%cmp_elem proc~cmp_elem~2->proc~get_multiplicity~2 proc~cmp_elem~3 nurbs_volume%cmp_elem proc~cmp_elem~3->proc~get_multiplicity~3 proc~elevate_degree nurbs_surface%elevate_degree proc~elevate_degree->proc~elevate_degree_a_5_9 proc~elevate_degree->none~set proc~elevate_degree~2 nurbs_curve%elevate_degree proc~elevate_degree~2->proc~elevate_degree_a_5_9 proc~elevate_degree~2->none~set~2 proc~elevate_degree~3 nurbs_volume%elevate_degree proc~elevate_degree~3->proc~elevate_degree_a_5_9 proc~elevate_degree~3->none~set~3 proc~get_degree nurbs_curve%get_degree proc~get_degree->proc~get_multiplicity~2 proc~get_degree_all nurbs_surface%get_degree_all proc~get_degree_all->proc~get_multiplicity proc~get_degree_all~2 nurbs_volume%get_degree_all proc~get_degree_all~2->proc~get_multiplicity~3 proc~get_degree_dir nurbs_surface%get_degree_dir proc~get_degree_dir->proc~get_multiplicity proc~get_degree_dir~2 nurbs_volume%get_degree_dir proc~get_degree_dir~2->proc~get_multiplicity~3 proc~set1 nurbs_surface%set1 proc~set1->proc~get_nc none~get_degree nurbs_surface%get_degree proc~set1->none~get_degree proc~set1~3 nurbs_volume%set1 proc~set1~3->proc~get_nc~3 none~get_degree~3 nurbs_volume%get_degree proc~set1~3->none~get_degree~3 proc~set2 nurbs_surface%set2 proc~set2->proc~get_nc proc~set2~3 nurbs_volume%set2 proc~set2~3->proc~get_nc~3 program~example1_curve example1_curve program~example1_curve->proc~insert_knots~2 program~example1_curve->proc~remove_knots~2 program~example1_curve->proc~elevate_degree~2 program~example1_curve->proc~get_degree program~example1_curve->none~set~2 program~example3_surface example3_surface program~example3_surface->proc~insert_knots program~example3_surface->proc~remove_knots program~example3_surface->proc~elevate_degree program~example3_surface->none~get_degree program~example3_surface->none~set program~example3_volume example3_volume program~example3_volume->proc~insert_knots~3 program~example3_volume->proc~remove_knots~3 program~example3_volume->proc~elevate_degree~3 program~example3_volume->none~get_degree~3 program~example3_volume->none~set~3 none~get_degree->proc~get_degree_all none~get_degree->proc~get_degree_dir none~get_degree~3->proc~get_degree_all~2 none~get_degree~3->proc~get_degree_dir~2 none~set->proc~set1 none~set->proc~set2 proc~set3 nurbs_surface%set3 none~set->proc~set3 none~set~3->proc~set1~3 none~set~3->proc~set2~3 proc~set3~3 nurbs_volume%set3 none~set~3->proc~set3~3 proc~set1~2 nurbs_curve%set1 proc~set1~2->proc~get_degree proc~set3~2 nurbs_curve%set3 proc~set3~2->proc~get_degree none~set~2->proc~set1~2 none~set~2->proc~set3~2 proc~modify_wc nurbs_surface%modify_Wc proc~modify_wc->none~set proc~modify_wc~3 nurbs_volume%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc nurbs_surface%modify_Xc proc~modify_xc->none~set proc~modify_xc~3 nurbs_volume%modify_Xc proc~modify_xc~3->none~set~3 proc~set3->none~get_degree proc~set3~3->none~get_degree~3 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set~3 proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set program~example_morph example_morph program~example_morph->none~set~3 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set~3 proc~modify_wc~2 nurbs_curve%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc~2 nurbs_curve%modify_Xc proc~modify_xc~2->none~set~2 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~2 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~2 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Module Procedures private pure function compute_multiplicity1 (knot) result(multiplicity) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: knot (:) Return Value integer, allocatable, (:) private pure function compute_multiplicity2 (knot, Xth) result(multiplicity) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in) :: Xth Return Value integer","tags":"","loc":"interface/compute_multiplicity.html"},{"title":"elemConn_C0 – ForCAD","text":"public interface elemConn_C0 Calls interface~~elemconn_c0~~CallsGraph interface~elemconn_c0 elemConn_C0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by interface~~elemconn_c0~~CalledByGraph interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis nurbs_surface%cmp_elem_Xc_vis proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elem_xc_vis~2 nurbs_curve%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elem_xc_vis~3 nurbs_volume%cmp_elem_Xc_vis proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elem_xg_vis nurbs_surface%cmp_elem_Xg_vis proc~cmp_elem_xg_vis->interface~elemconn_c0 proc~cmp_elem_xg_vis~2 nurbs_curve%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~cmp_elem_xg_vis~3 nurbs_volume%cmp_elem_Xg_vis proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~export_xc nurbs_surface%export_Xc proc~export_xc->proc~cmp_elem_xc_vis proc~export_xc~2 nurbs_curve%export_Xc proc~export_xc~2->proc~cmp_elem_xc_vis~2 proc~export_xc~3 nurbs_volume%export_Xc proc~export_xc~3->proc~cmp_elem_xc_vis~3 proc~export_xg nurbs_surface%export_Xg proc~export_xg->proc~cmp_elem_xg_vis proc~export_xg~2 nurbs_curve%export_Xg proc~export_xg~2->proc~cmp_elem_xg_vis~2 proc~export_xg~3 nurbs_volume%export_Xg proc~export_xg~3->proc~cmp_elem_xg_vis~3 program~example1_curve example1_curve program~example1_curve->proc~export_xc~2 program~example1_curve->proc~export_xg~2 program~example3_surface example3_surface program~example3_surface->proc~export_xc program~example3_surface->proc~export_xg program~example3_volume example3_volume program~example3_volume->proc~export_xc~3 program~example3_volume->proc~export_xg~3 program~example_morph example_morph program~example_morph->proc~export_xc~3 program~example_morph->proc~export_xg~3 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~export_xc~2 program~example_nurbs_curve->proc~export_xg~2 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~export_xc program~example_nurbs_surface->proc~export_xg program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~export_xc~3 program~example_nurbs_volume->proc~export_xg~3 program~shape_circle shape_circle program~shape_circle->proc~export_xc~2 program~shape_circle->proc~export_xg~2 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~export_xc~3 program~shape_hexahedron->proc~export_xg~3 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~export_xc program~shape_tetragon->proc~export_xg Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Module Procedures private pure function cmp_elemConn_C0_L (nnode, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode integer, intent(in) :: p Return Value integer, allocatable, (:,:) private pure function cmp_elemConn_C0_S (nnode1, nnode2, p1, p2) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: p1 integer, intent(in) :: p2 Return Value integer, allocatable, (:,:) private pure function cmp_elemConn_C0_V (nnode1, nnode2, nnode3, p1, p2, p3) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: nnode3 integer, intent(in) :: p1 integer, intent(in) :: p2 integer, intent(in) :: p3 Return Value integer, allocatable, (:,:)","tags":"","loc":"interface/elemconn_c0.html"},{"title":"elemConn_Cn – ForCAD","text":"public interface elemConn_Cn Calls interface~~elemconn_cn~~CallsGraph interface~elemconn_cn elemConn_Cn proc~cmp_elemconn_cn_l cmp_elemConn_Cn_L interface~elemconn_cn->proc~cmp_elemconn_cn_l proc~cmp_elemconn_cn_s cmp_elemConn_Cn_S interface~elemconn_cn->proc~cmp_elemconn_cn_s proc~cmp_elemconn_cn_v cmp_elemConn_Cn_V interface~elemconn_cn->proc~cmp_elemconn_cn_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by interface~~elemconn_cn~~CalledByGraph interface~elemconn_cn elemConn_Cn proc~cmp_elem nurbs_surface%cmp_elem proc~cmp_elem->interface~elemconn_cn proc~cmp_elem~2 nurbs_curve%cmp_elem proc~cmp_elem~2->interface~elemconn_cn proc~cmp_elem~3 nurbs_volume%cmp_elem proc~cmp_elem~3->interface~elemconn_cn Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Module Procedures private pure subroutine cmp_elemConn_Cn_L (nnode, p, Xth, vecKnot_mul, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode integer, intent(in) :: p real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: vecKnot_mul (:) integer, intent(out), allocatable :: elemConn (:,:) private pure subroutine cmp_elemConn_Cn_S (nnode1, nnode2, p1, p2, Xth1, Xth2, vecKnot_mul1, vecKnot_mul2, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: p1 integer, intent(in) :: p2 real(kind=rk), intent(in), contiguous :: Xth1 (:) real(kind=rk), intent(in), contiguous :: Xth2 (:) integer, intent(in), contiguous :: vecKnot_mul1 (:) integer, intent(in), contiguous :: vecKnot_mul2 (:) integer, intent(out), allocatable :: elemConn (:,:) private pure subroutine cmp_elemConn_Cn_V (nnode1, nnode2, nnode3, p1, p2, p3, Xth1, Xth2, Xth3, vecKnot_mul1, vecKnot_mul2, vecKnot_mul3, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: nnode3 integer, intent(in) :: p1 integer, intent(in) :: p2 integer, intent(in) :: p3 real(kind=rk), intent(in), contiguous :: Xth1 (:) real(kind=rk), intent(in), contiguous :: Xth2 (:) real(kind=rk), intent(in), contiguous :: Xth3 (:) integer, intent(in), contiguous :: vecKnot_mul1 (:) integer, intent(in), contiguous :: vecKnot_mul2 (:) integer, intent(in), contiguous :: vecKnot_mul3 (:) integer, intent(out), allocatable :: elemConn (:,:)","tags":"","loc":"interface/elemconn_cn.html"},{"title":"ndgrid – ForCAD","text":"public interface ndgrid Calls interface~~ndgrid~~CallsGraph interface~ndgrid ndgrid proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by interface~~ndgrid~~CalledByGraph interface~ndgrid ndgrid proc~basis nurbs_surface%basis proc~basis->interface~ndgrid proc~basis~3 nurbs_volume%basis proc~basis~3->interface~ndgrid proc~create nurbs_surface%create proc~create->interface~ndgrid proc~create~3 nurbs_volume%create proc~create~3->interface~ndgrid proc~derivative nurbs_surface%derivative proc~derivative->interface~ndgrid proc~derivative~3 nurbs_volume%derivative proc~derivative~3->interface~ndgrid program~example3_surface example3_surface program~example3_surface->proc~create program~example3_volume example3_volume program~example3_volume->proc~create~3 program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~create program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~create~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~create~3 program~shape_tetragon shape_tetragon program~shape_tetragon->proc~create Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Module Procedures private pure subroutine ndgrid2 (X_dir1, X_dir2, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: X_dir1 (:) real(kind=rk), intent(in), contiguous :: X_dir2 (:) real(kind=rk), intent(out), allocatable :: Xt (:,:) private pure subroutine ndgrid3 (X_dir1, X_dir2, X_dir3, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: X_dir1 (:) real(kind=rk), intent(in), contiguous :: X_dir2 (:) real(kind=rk), intent(in), contiguous :: X_dir3 (:) real(kind=rk), intent(out), allocatable :: Xt (:,:)","tags":"","loc":"interface/ndgrid.html"},{"title":"unique – ForCAD","text":"public interface unique Calls interface~~unique~~CallsGraph interface~unique unique proc~unique_integer unique_integer interface~unique->proc~unique_integer proc~unique_real unique_real interface~unique->proc~unique_real Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by interface~~unique~~CalledByGraph interface~unique unique proc~cmp_elem nurbs_surface%cmp_elem proc~cmp_elem->interface~unique proc~cmp_elem~2 nurbs_curve%cmp_elem proc~cmp_elem~2->interface~unique proc~cmp_elem~3 nurbs_volume%cmp_elem proc~cmp_elem~3->interface~unique Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Module Procedures private pure function unique_integer (vec) result(output) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in), dimension(:), contiguous :: vec Return Value integer, dimension(:), allocatable private pure function unique_real (vec) result(output) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), dimension(:), contiguous :: vec Return Value real(kind=rk), dimension(:), allocatable","tags":"","loc":"interface/unique.html"},{"title":"generate_Xc – ForCAD","text":"function generate_Xc(L) result(control_points) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: L Return Value real(kind=rk), allocatable, (:,:) Called by proc~~generate_xc~2~~CalledByGraph proc~generate_xc~2 generate_Xc program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~generate_xc~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/generate_xc~2.html"},{"title":"generate_Xc – ForCAD","text":"function generate_Xc(num_rows, num_cols, peak_height) result(control_points) Arguments Type Intent Optional Attributes Name integer, intent(in) :: num_rows integer, intent(in) :: num_cols real(kind=rk), intent(in) :: peak_height Return Value real(kind=rk), allocatable, (:,:) Called by proc~~generate_xc~3~~CalledByGraph proc~generate_xc~3 generate_Xc program~example3_surface example3_surface program~example3_surface->proc~generate_xc~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/generate_xc~3.html"},{"title":"generate_Xc – ForCAD","text":"function generate_Xc(L) result(control_points) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: L Return Value real(kind=rk), allocatable, (:,:) Called by proc~~generate_xc~4~~CalledByGraph proc~generate_xc~4 generate_Xc program~example3_volume example3_volume program~example3_volume->proc~generate_xc~4 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/generate_xc~4.html"},{"title":"generate_Xc – ForCAD","text":"function generate_Xc(num_coils, radius, height, num_points_per_coil) result(control_points) Arguments 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 Return Value real(kind=rk), allocatable, (:,:) Called by proc~~generate_xc~5~~CalledByGraph proc~generate_xc~5 generate_Xc program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~generate_xc~5 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/generate_xc~5.html"},{"title":"cmp_elem – ForCAD","text":"private pure function cmp_elem(this) result(elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem~~CallsGraph proc~cmp_elem nurbs_surface%cmp_elem interface~elemconn_cn elemConn_Cn proc~cmp_elem->interface~elemconn_cn interface~unique unique proc~cmp_elem->interface~unique proc~get_multiplicity nurbs_surface%get_multiplicity proc~cmp_elem->proc~get_multiplicity proc~cmp_elemconn_cn_l cmp_elemConn_Cn_L interface~elemconn_cn->proc~cmp_elemconn_cn_l proc~cmp_elemconn_cn_s cmp_elemConn_Cn_S interface~elemconn_cn->proc~cmp_elemconn_cn_s proc~cmp_elemconn_cn_v cmp_elemConn_Cn_V interface~elemconn_cn->proc~cmp_elemconn_cn_v proc~unique_integer unique_integer interface~unique->proc~unique_integer proc~unique_real unique_real interface~unique->proc~unique_real interface~compute_multiplicity compute_multiplicity proc~get_multiplicity->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem.html"},{"title":"cmp_elem_Xc_vis – ForCAD","text":"private pure function cmp_elem_Xc_vis(this, p) result(elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem_xc_vis~~CallsGraph proc~cmp_elem_xc_vis nurbs_surface%cmp_elem_Xc_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~cmp_elem_xc_vis~~CalledByGraph proc~cmp_elem_xc_vis nurbs_surface%cmp_elem_Xc_vis proc~export_xc nurbs_surface%export_Xc proc~export_xc->proc~cmp_elem_xc_vis program~example3_surface example3_surface program~example3_surface->proc~export_xc program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~export_xc program~shape_tetragon shape_tetragon program~shape_tetragon->proc~export_xc Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem_xc_vis.html"},{"title":"cmp_elem_Xg_vis – ForCAD","text":"private pure function cmp_elem_Xg_vis(this, p) result(elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem_xg_vis~~CallsGraph proc~cmp_elem_xg_vis nurbs_surface%cmp_elem_Xg_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xg_vis->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~cmp_elem_xg_vis~~CalledByGraph proc~cmp_elem_xg_vis nurbs_surface%cmp_elem_Xg_vis proc~export_xg nurbs_surface%export_Xg proc~export_xg->proc~cmp_elem_xg_vis program~example3_surface example3_surface program~example3_surface->proc~export_xg program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~export_xg program~shape_tetragon shape_tetragon program~shape_tetragon->proc~export_xg Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem_xg_vis.html"},{"title":"get_Wc_all – ForCAD","text":"private pure function get_Wc_all(this) result(Wc) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_wc_all.html"},{"title":"get_Wci – ForCAD","text":"private pure function get_Wci(this, n) result(Wc) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk)","tags":"","loc":"proc/get_wci.html"},{"title":"get_Xc_all – ForCAD","text":"private pure function get_Xc_all(this) result(Xc) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:)","tags":"","loc":"proc/get_xc_all.html"},{"title":"get_Xci – ForCAD","text":"private pure function get_Xci(this, n) result(Xc) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_xci.html"},{"title":"get_Xcid – ForCAD","text":"private pure function get_Xcid(this, n, dir) result(Xc) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk)","tags":"","loc":"proc/get_xcid.html"},{"title":"get_Xg_all – ForCAD","text":"private pure function get_Xg_all(this) result(Xg) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:)","tags":"","loc":"proc/get_xg_all.html"},{"title":"get_Xgi – ForCAD","text":"private pure function get_Xgi(this, n) result(Xg) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_xgi.html"},{"title":"get_Xgid – ForCAD","text":"private pure function get_Xgid(this, n, dir) result(Xg) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk)","tags":"","loc":"proc/get_xgid.html"},{"title":"get_Xt – ForCAD","text":"private pure function get_Xt(this, dir) result(Xt) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_xt.html"},{"title":"get_continuity – ForCAD","text":"private pure function get_continuity(this, dir) result(c) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) Calls proc~~get_continuity~~CallsGraph proc~get_continuity nurbs_surface%get_continuity interface~compute_multiplicity compute_multiplicity proc~get_continuity->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_continuity.html"},{"title":"get_degree_all – ForCAD","text":"private pure function get_degree_all(this) result(degree) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, (2) Calls proc~~get_degree_all~~CallsGraph proc~get_degree_all nurbs_surface%get_degree_all proc~get_multiplicity nurbs_surface%get_multiplicity proc~get_degree_all->proc~get_multiplicity interface~compute_multiplicity compute_multiplicity proc~get_multiplicity->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_degree_all~~CalledByGraph proc~get_degree_all nurbs_surface%get_degree_all none~get_degree nurbs_surface%get_degree none~get_degree->proc~get_degree_all proc~set1 nurbs_surface%set1 proc~set1->none~get_degree proc~set3 nurbs_surface%set3 proc~set3->none~get_degree program~example3_surface example3_surface program~example3_surface->none~get_degree none~set nurbs_surface%set program~example3_surface->none~set proc~elevate_degree nurbs_surface%elevate_degree program~example3_surface->proc~elevate_degree proc~insert_knots nurbs_surface%insert_knots program~example3_surface->proc~insert_knots proc~remove_knots nurbs_surface%remove_knots program~example3_surface->proc~remove_knots none~set->proc~set1 none~set->proc~set3 proc~elevate_degree->none~set proc~insert_knots->none~set proc~modify_wc nurbs_surface%modify_Wc proc~modify_wc->none~set proc~modify_xc nurbs_surface%modify_Xc proc~modify_xc->none~set proc~remove_knots->none~set proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_degree_all.html"},{"title":"get_degree_dir – ForCAD","text":"private pure function get_degree_dir(this, dir) result(degree) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer Calls proc~~get_degree_dir~~CallsGraph proc~get_degree_dir nurbs_surface%get_degree_dir proc~get_multiplicity nurbs_surface%get_multiplicity proc~get_degree_dir->proc~get_multiplicity interface~compute_multiplicity compute_multiplicity proc~get_multiplicity->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_degree_dir~~CalledByGraph proc~get_degree_dir nurbs_surface%get_degree_dir none~get_degree nurbs_surface%get_degree none~get_degree->proc~get_degree_dir proc~set1 nurbs_surface%set1 proc~set1->none~get_degree proc~set3 nurbs_surface%set3 proc~set3->none~get_degree program~example3_surface example3_surface program~example3_surface->none~get_degree none~set nurbs_surface%set program~example3_surface->none~set proc~elevate_degree nurbs_surface%elevate_degree program~example3_surface->proc~elevate_degree proc~insert_knots nurbs_surface%insert_knots program~example3_surface->proc~insert_knots proc~remove_knots nurbs_surface%remove_knots program~example3_surface->proc~remove_knots none~set->proc~set1 none~set->proc~set3 proc~elevate_degree->none~set proc~insert_knots->none~set proc~modify_wc nurbs_surface%modify_Wc proc~modify_wc->none~set proc~modify_xc nurbs_surface%modify_Xc proc~modify_xc->none~set proc~remove_knots->none~set proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_degree_dir.html"},{"title":"get_elem – ForCAD","text":"private pure function get_elem(this) result(elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem.html"},{"title":"get_elem_Xc_vis – ForCAD","text":"private pure function get_elem_Xc_vis(this) result(elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem_xc_vis.html"},{"title":"get_elem_Xg_vis – ForCAD","text":"private pure function get_elem_Xg_vis(this) result(elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem_xg_vis.html"},{"title":"get_knot_all – ForCAD","text":"private pure function get_knot_all(this, dir) result(knot) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) Called by proc~~get_knot_all~~CalledByGraph proc~get_knot_all nurbs_surface%get_knot_all none~get_knot nurbs_surface%get_knot none~get_knot->proc~get_knot_all program~example3_surface example3_surface program~example3_surface->none~get_knot Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_knot_all.html"},{"title":"get_knoti – ForCAD","text":"private pure function get_knoti(this, dir, i) result(knot) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir integer, intent(in) :: i Return Value real(kind=rk) Called by proc~~get_knoti~~CalledByGraph proc~get_knoti nurbs_surface%get_knoti none~get_knot nurbs_surface%get_knot none~get_knot->proc~get_knoti program~example3_surface example3_surface program~example3_surface->none~get_knot Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_knoti.html"},{"title":"get_multiplicity – ForCAD","text":"private pure function get_multiplicity(this, dir) result(m) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) Calls proc~~get_multiplicity~~CallsGraph proc~get_multiplicity nurbs_surface%get_multiplicity interface~compute_multiplicity compute_multiplicity proc~get_multiplicity->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_multiplicity~~CalledByGraph proc~get_multiplicity nurbs_surface%get_multiplicity proc~cmp_elem nurbs_surface%cmp_elem proc~cmp_elem->proc~get_multiplicity proc~get_degree_all nurbs_surface%get_degree_all proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir nurbs_surface%get_degree_dir proc~get_degree_dir->proc~get_multiplicity none~get_degree nurbs_surface%get_degree none~get_degree->proc~get_degree_all none~get_degree->proc~get_degree_dir proc~set1 nurbs_surface%set1 proc~set1->none~get_degree proc~set3 nurbs_surface%set3 proc~set3->none~get_degree program~example3_surface example3_surface program~example3_surface->none~get_degree none~set nurbs_surface%set program~example3_surface->none~set proc~elevate_degree nurbs_surface%elevate_degree program~example3_surface->proc~elevate_degree proc~insert_knots nurbs_surface%insert_knots program~example3_surface->proc~insert_knots proc~remove_knots nurbs_surface%remove_knots program~example3_surface->proc~remove_knots none~set->proc~set1 none~set->proc~set3 proc~elevate_degree->none~set proc~insert_knots->none~set proc~modify_wc nurbs_surface%modify_Wc proc~modify_wc->none~set proc~modify_xc nurbs_surface%modify_Xc proc~modify_xc->none~set proc~remove_knots->none~set proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_multiplicity.html"},{"title":"get_nc – ForCAD","text":"private pure function get_nc(this, dir) result(nc) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer Calls proc~~get_nc~~CallsGraph proc~get_nc nurbs_surface%get_nc interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_nc~~CalledByGraph proc~get_nc nurbs_surface%get_nc proc~set1 nurbs_surface%set1 proc~set1->proc~get_nc proc~set2 nurbs_surface%set2 proc~set2->proc~get_nc none~set nurbs_surface%set none~set->proc~set1 none~set->proc~set2 proc~elevate_degree nurbs_surface%elevate_degree proc~elevate_degree->none~set proc~insert_knots nurbs_surface%insert_knots proc~insert_knots->none~set proc~modify_wc nurbs_surface%modify_Wc proc~modify_wc->none~set proc~modify_xc nurbs_surface%modify_Xc proc~modify_xc->none~set proc~remove_knots nurbs_surface%remove_knots proc~remove_knots->none~set proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set program~example3_surface example3_surface program~example3_surface->none~set program~example3_surface->proc~elevate_degree program~example3_surface->proc~insert_knots program~example3_surface->proc~remove_knots program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_nc.html"},{"title":"get_ng – ForCAD","text":"private pure function get_ng(this) result(ng) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, (2)","tags":"","loc":"proc/get_ng.html"},{"title":"is_rational – ForCAD","text":"private pure function is_rational(this) result(r) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value logical Called by proc~~is_rational~~CalledByGraph proc~is_rational nurbs_surface%is_rational proc~basis nurbs_surface%basis proc~basis->proc~is_rational proc~create nurbs_surface%create proc~create->proc~is_rational proc~derivative nurbs_surface%derivative proc~derivative->proc~is_rational proc~elevate_degree nurbs_surface%elevate_degree proc~elevate_degree->proc~is_rational proc~insert_knots nurbs_surface%insert_knots proc~insert_knots->proc~is_rational proc~remove_knots nurbs_surface%remove_knots proc~remove_knots->proc~is_rational program~example3_surface example3_surface program~example3_surface->proc~create program~example3_surface->proc~elevate_degree program~example3_surface->proc~insert_knots program~example3_surface->proc~remove_knots program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~create program~shape_tetragon shape_tetragon program~shape_tetragon->proc~create Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/is_rational.html"},{"title":"basis – ForCAD","text":"private pure subroutine basis(this, res1, res2, Xt1, Xt2, Tgc) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) Calls proc~~basis~~CallsGraph proc~basis nurbs_surface%basis interface~ndgrid ndgrid proc~basis->interface~ndgrid proc~basis_bspline basis_bspline proc~basis->proc~basis_bspline proc~is_rational nurbs_surface%is_rational proc~basis->proc~is_rational proc~kron kron proc~basis->proc~kron proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/basis.html"},{"title":"create – ForCAD","text":"private pure subroutine create(this, res1, res2, Xt1, Xt2, Xt) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt (:,:) Calls proc~~create~~CallsGraph proc~create nurbs_surface%create interface~ndgrid ndgrid proc~create->interface~ndgrid proc~basis_bspline basis_bspline proc~create->proc~basis_bspline proc~is_rational nurbs_surface%is_rational proc~create->proc~is_rational proc~kron kron proc~create->proc~kron proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~create~~CalledByGraph proc~create nurbs_surface%create program~example3_surface example3_surface program~example3_surface->proc~create program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~create program~shape_tetragon shape_tetragon program~shape_tetragon->proc~create Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/create.html"},{"title":"derivative – ForCAD","text":"private pure subroutine derivative(this, res1, res2, Xt1, Xt2, dTgc) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) Calls proc~~derivative~~CallsGraph proc~derivative nurbs_surface%derivative interface~ndgrid ndgrid proc~derivative->interface~ndgrid proc~basis_bspline_der basis_bspline_der proc~derivative->proc~basis_bspline_der proc~is_rational nurbs_surface%is_rational proc~derivative->proc~is_rational proc~kron kron proc~derivative->proc~kron proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 proc~isinf isinf proc~basis_bspline_der->proc~isinf Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/derivative.html"},{"title":"elevate_degree – ForCAD","text":"private pure subroutine elevate_degree(this, dir, t) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir integer, intent(in) :: t Calls proc~~elevate_degree~~CallsGraph proc~elevate_degree nurbs_surface%elevate_degree none~set nurbs_surface%set proc~elevate_degree->none~set proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree->proc~elevate_degree_a_5_9 proc~is_rational nurbs_surface%is_rational proc~elevate_degree->proc~is_rational proc~set1 nurbs_surface%set1 none~set->proc~set1 proc~set2 nurbs_surface%set2 none~set->proc~set2 proc~set3 nurbs_surface%set3 none~set->proc~set3 interface~compute_multiplicity compute_multiplicity proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~bincoeff bincoeff proc~elevate_degree_a_5_9->proc~bincoeff proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~factln factln proc~bincoeff->proc~factln none~get_degree nurbs_surface%get_degree proc~set1->none~get_degree proc~get_nc nurbs_surface%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~get_degree_all nurbs_surface%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_surface%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_nc->interface~compute_multiplicity proc~get_multiplicity nurbs_surface%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~elevate_degree~~CalledByGraph proc~elevate_degree nurbs_surface%elevate_degree program~example3_surface example3_surface program~example3_surface->proc~elevate_degree Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/elevate_degree.html"},{"title":"export_Xc – ForCAD","text":"private impure subroutine export_Xc(this, filename) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this character(len=*), intent(in) :: filename Calls proc~~export_xc~~CallsGraph proc~export_xc nurbs_surface%export_Xc proc~cmp_elem_xc_vis nurbs_surface%cmp_elem_Xc_vis proc~export_xc->proc~cmp_elem_xc_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~export_xc~~CalledByGraph proc~export_xc nurbs_surface%export_Xc program~example3_surface example3_surface program~example3_surface->proc~export_xc program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~export_xc program~shape_tetragon shape_tetragon program~shape_tetragon->proc~export_xc Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/export_xc.html"},{"title":"export_Xg – ForCAD","text":"private impure subroutine export_Xg(this, filename) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this character(len=*), intent(in) :: filename Calls proc~~export_xg~~CallsGraph proc~export_xg nurbs_surface%export_Xg proc~cmp_elem_xg_vis nurbs_surface%cmp_elem_Xg_vis proc~export_xg->proc~cmp_elem_xg_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xg_vis->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~export_xg~~CalledByGraph proc~export_xg nurbs_surface%export_Xg program~example3_surface example3_surface program~example3_surface->proc~export_xg program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~export_xg program~shape_tetragon shape_tetragon program~shape_tetragon->proc~export_xg Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/export_xg.html"},{"title":"finalize – ForCAD","text":"private pure subroutine finalize(this) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this Called by proc~~finalize~~CalledByGraph proc~finalize nurbs_surface%finalize program~example3_surface example3_surface program~example3_surface->proc~finalize program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~finalize program~shape_tetragon shape_tetragon program~shape_tetragon->proc~finalize Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/finalize.html"},{"title":"insert_knots – ForCAD","text":"private pure subroutine insert_knots(this, dir, Xth, r) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) Calls proc~~insert_knots~~CallsGraph proc~insert_knots nurbs_surface%insert_knots interface~compute_multiplicity compute_multiplicity proc~insert_knots->interface~compute_multiplicity none~set nurbs_surface%set proc~insert_knots->none~set proc~findspan findspan proc~insert_knots->proc~findspan proc~insert_knot_a_5_1 insert_knot_A_5_1 proc~insert_knots->proc~insert_knot_a_5_1 proc~is_rational nurbs_surface%is_rational proc~insert_knots->proc~is_rational proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~set1 nurbs_surface%set1 none~set->proc~set1 proc~set2 nurbs_surface%set2 none~set->proc~set2 proc~set3 nurbs_surface%set3 none~set->proc~set3 none~get_degree nurbs_surface%get_degree proc~set1->none~get_degree proc~get_nc nurbs_surface%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~get_degree_all nurbs_surface%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_surface%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_nc->interface~compute_multiplicity proc~get_multiplicity nurbs_surface%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~insert_knots~~CalledByGraph proc~insert_knots nurbs_surface%insert_knots program~example3_surface example3_surface program~example3_surface->proc~insert_knots Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/insert_knots.html"},{"title":"modify_Wc – ForCAD","text":"private pure subroutine modify_Wc(this, W, num) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num Calls proc~~modify_wc~~CallsGraph proc~modify_wc nurbs_surface%modify_Wc none~set nurbs_surface%set proc~modify_wc->none~set proc~set1 nurbs_surface%set1 none~set->proc~set1 proc~set2 nurbs_surface%set2 none~set->proc~set2 proc~set3 nurbs_surface%set3 none~set->proc~set3 none~get_degree nurbs_surface%get_degree proc~set1->none~get_degree proc~get_nc nurbs_surface%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~get_degree_all nurbs_surface%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_surface%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity nurbs_surface%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/modify_wc.html"},{"title":"modify_Xc – ForCAD","text":"private pure subroutine modify_Xc(this, X, num, dir) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir Calls proc~~modify_xc~~CallsGraph proc~modify_xc nurbs_surface%modify_Xc none~set nurbs_surface%set proc~modify_xc->none~set proc~set1 nurbs_surface%set1 none~set->proc~set1 proc~set2 nurbs_surface%set2 none~set->proc~set2 proc~set3 nurbs_surface%set3 none~set->proc~set3 none~get_degree nurbs_surface%get_degree proc~set1->none~get_degree proc~get_nc nurbs_surface%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~get_degree_all nurbs_surface%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_surface%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity nurbs_surface%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/modify_xc.html"},{"title":"remove_knots – ForCAD","text":"private pure subroutine remove_knots(this, dir, Xth, r) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) Calls proc~~remove_knots~~CallsGraph proc~remove_knots nurbs_surface%remove_knots interface~compute_multiplicity compute_multiplicity proc~remove_knots->interface~compute_multiplicity none~set nurbs_surface%set proc~remove_knots->none~set proc~findspan findspan proc~remove_knots->proc~findspan proc~is_rational nurbs_surface%is_rational proc~remove_knots->proc~is_rational proc~remove_knots_a_5_8 remove_knots_A_5_8 proc~remove_knots->proc~remove_knots_a_5_8 proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~set1 nurbs_surface%set1 none~set->proc~set1 proc~set2 nurbs_surface%set2 none~set->proc~set2 proc~set3 nurbs_surface%set3 none~set->proc~set3 none~get_degree nurbs_surface%get_degree proc~set1->none~get_degree proc~get_nc nurbs_surface%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~get_degree_all nurbs_surface%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_surface%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_nc->interface~compute_multiplicity proc~get_multiplicity nurbs_surface%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~remove_knots~~CalledByGraph proc~remove_knots nurbs_surface%remove_knots program~example3_surface example3_surface program~example3_surface->proc~remove_knots Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/remove_knots.html"},{"title":"rotate_Xc – ForCAD","text":"private pure subroutine rotate_Xc(this, alpha, beta, theta) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta Calls proc~~rotate_xc~~CallsGraph proc~rotate_xc nurbs_surface%rotate_Xc proc~rotation rotation proc~rotate_xc->proc~rotation cosd cosd proc~rotation->cosd sind sind proc~rotation->sind Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~rotate_xc~~CalledByGraph proc~rotate_xc nurbs_surface%rotate_Xc program~example3_surface example3_surface program~example3_surface->proc~rotate_xc Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/rotate_xc.html"},{"title":"rotate_Xg – ForCAD","text":"private pure subroutine rotate_Xg(this, alpha, beta, theta) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta Calls proc~~rotate_xg~~CallsGraph proc~rotate_xg nurbs_surface%rotate_Xg proc~rotation rotation proc~rotate_xg->proc~rotation cosd cosd proc~rotation->cosd sind sind proc~rotation->sind Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~rotate_xg~~CalledByGraph proc~rotate_xg nurbs_surface%rotate_Xg program~example3_surface example3_surface program~example3_surface->proc~rotate_xg Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/rotate_xg.html"},{"title":"set1 – ForCAD","text":"private pure subroutine set1(this, knot1, knot2, Xc, Wc) Set knot vectors, control points and weights for the NURBS surface object. Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot1 (:) real(kind=rk), intent(in), contiguous :: knot2 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set1~~CallsGraph proc~set1 nurbs_surface%set1 none~get_degree nurbs_surface%get_degree proc~set1->none~get_degree proc~get_nc nurbs_surface%get_nc proc~set1->proc~get_nc proc~get_degree_all nurbs_surface%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_surface%get_degree_dir none~get_degree->proc~get_degree_dir interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity nurbs_surface%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set1~~CalledByGraph proc~set1 nurbs_surface%set1 none~set nurbs_surface%set none~set->proc~set1 proc~elevate_degree nurbs_surface%elevate_degree proc~elevate_degree->none~set proc~insert_knots nurbs_surface%insert_knots proc~insert_knots->none~set proc~modify_wc nurbs_surface%modify_Wc proc~modify_wc->none~set proc~modify_xc nurbs_surface%modify_Xc proc~modify_xc->none~set proc~remove_knots nurbs_surface%remove_knots proc~remove_knots->none~set proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set program~example3_surface example3_surface program~example3_surface->none~set program~example3_surface->proc~elevate_degree program~example3_surface->proc~insert_knots program~example3_surface->proc~remove_knots program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set1.html"},{"title":"set2 – ForCAD","text":"private pure subroutine set2(this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc) Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir1 (:) real(kind=rk), intent(in), contiguous :: Xth_dir2 (:) integer, intent(in), contiguous :: degree (:) integer, intent(in), contiguous :: continuity1 (:) integer, intent(in), contiguous :: continuity2 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set2~~CallsGraph proc~set2 nurbs_surface%set2 proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~get_nc nurbs_surface%get_nc proc~set2->proc~get_nc proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set2~~CalledByGraph proc~set2 nurbs_surface%set2 none~set nurbs_surface%set none~set->proc~set2 proc~elevate_degree nurbs_surface%elevate_degree proc~elevate_degree->none~set proc~insert_knots nurbs_surface%insert_knots proc~insert_knots->none~set proc~modify_wc nurbs_surface%modify_Wc proc~modify_wc->none~set proc~modify_xc nurbs_surface%modify_Xc proc~modify_xc->none~set proc~remove_knots nurbs_surface%remove_knots proc~remove_knots->none~set proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set program~example3_surface example3_surface program~example3_surface->none~set program~example3_surface->proc~elevate_degree program~example3_surface->proc~insert_knots program~example3_surface->proc~remove_knots program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set2.html"},{"title":"set3 – ForCAD","text":"private pure subroutine set3(this, nc, Xc, Wc) Set Bezier or Rational Bezier surface using control points and weights. Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set3~~CallsGraph proc~set3 nurbs_surface%set3 none~get_degree nurbs_surface%get_degree proc~set3->none~get_degree proc~get_degree_all nurbs_surface%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_surface%get_degree_dir none~get_degree->proc~get_degree_dir proc~get_multiplicity nurbs_surface%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity interface~compute_multiplicity compute_multiplicity proc~get_multiplicity->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set3~~CalledByGraph proc~set3 nurbs_surface%set3 none~set nurbs_surface%set none~set->proc~set3 proc~elevate_degree nurbs_surface%elevate_degree proc~elevate_degree->none~set proc~insert_knots nurbs_surface%insert_knots proc~insert_knots->none~set proc~modify_wc nurbs_surface%modify_Wc proc~modify_wc->none~set proc~modify_xc nurbs_surface%modify_Xc proc~modify_xc->none~set proc~remove_knots nurbs_surface%remove_knots proc~remove_knots->none~set proc~set_tetragon nurbs_surface%set_tetragon proc~set_tetragon->none~set program~example3_surface example3_surface program~example3_surface->none~set program~example3_surface->proc~elevate_degree program~example3_surface->proc~insert_knots program~example3_surface->proc~remove_knots program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->none~set program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set3.html"},{"title":"set_elem – ForCAD","text":"private pure subroutine set_elem(this, elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:)","tags":"","loc":"proc/set_elem.html"},{"title":"set_elem_Xc_vis – ForCAD","text":"private pure subroutine set_elem_Xc_vis(this, elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:)","tags":"","loc":"proc/set_elem_xc_vis.html"},{"title":"set_elem_Xg_vis – ForCAD","text":"private pure subroutine set_elem_Xg_vis(this, elemConn) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:)","tags":"","loc":"proc/set_elem_xg_vis.html"},{"title":"set_tetragon – ForCAD","text":"private pure subroutine set_tetragon(this, L, nc, Wc) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: L (2) integer, intent(in) :: nc (2) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set_tetragon~~CallsGraph proc~set_tetragon nurbs_surface%set_tetragon none~set nurbs_surface%set proc~set_tetragon->none~set proc~tetragon_xc tetragon_Xc proc~set_tetragon->proc~tetragon_xc proc~set1 nurbs_surface%set1 none~set->proc~set1 proc~set2 nurbs_surface%set2 none~set->proc~set2 proc~set3 nurbs_surface%set3 none~set->proc~set3 none~get_degree nurbs_surface%get_degree proc~set1->none~get_degree proc~get_nc nurbs_surface%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~get_degree_all nurbs_surface%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_surface%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity nurbs_surface%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set_tetragon~~CalledByGraph proc~set_tetragon nurbs_surface%set_tetragon program~shape_tetragon shape_tetragon program~shape_tetragon->proc~set_tetragon Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set_tetragon.html"},{"title":"show – ForCAD","text":"private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg Called by proc~~show~~CalledByGraph proc~show nurbs_surface%show program~example3_surface example3_surface program~example3_surface->proc~show program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->proc~show program~shape_tetragon shape_tetragon program~shape_tetragon->proc~show Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/show.html"},{"title":"translate_Xc – ForCAD","text":"private pure subroutine translate_Xc(this, vec) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) Called by proc~~translate_xc~~CalledByGraph proc~translate_xc nurbs_surface%translate_Xc program~example3_surface example3_surface program~example3_surface->proc~translate_xc Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/translate_xc.html"},{"title":"translate_Xg – ForCAD","text":"private pure subroutine translate_Xg(this, vec) Type Bound nurbs_surface Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) Called by proc~~translate_xg~~CalledByGraph proc~translate_xg nurbs_surface%translate_Xg program~example3_surface example3_surface program~example3_surface->proc~translate_xg Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/translate_xg.html"},{"title":"cmp_elem – ForCAD","text":"private pure function cmp_elem(this) result(elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem~2~~CallsGraph proc~cmp_elem~2 nurbs_curve%cmp_elem interface~elemconn_cn elemConn_Cn proc~cmp_elem~2->interface~elemconn_cn interface~unique unique proc~cmp_elem~2->interface~unique proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~cmp_elem~2->proc~get_multiplicity~2 proc~cmp_elemconn_cn_l cmp_elemConn_Cn_L interface~elemconn_cn->proc~cmp_elemconn_cn_l proc~cmp_elemconn_cn_s cmp_elemConn_Cn_S interface~elemconn_cn->proc~cmp_elemconn_cn_s proc~cmp_elemconn_cn_v cmp_elemConn_Cn_V interface~elemconn_cn->proc~cmp_elemconn_cn_v proc~unique_integer unique_integer interface~unique->proc~unique_integer proc~unique_real unique_real interface~unique->proc~unique_real interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem~2.html"},{"title":"cmp_elem_Xc_vis – ForCAD","text":"private pure function cmp_elem_Xc_vis(this, p) result(elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in), optional :: p Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem_xc_vis~2~~CallsGraph proc~cmp_elem_xc_vis~2 nurbs_curve%cmp_elem_Xc_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~cmp_elem_xc_vis~2~~CalledByGraph proc~cmp_elem_xc_vis~2 nurbs_curve%cmp_elem_Xc_vis proc~export_xc~2 nurbs_curve%export_Xc proc~export_xc~2->proc~cmp_elem_xc_vis~2 program~example1_curve example1_curve program~example1_curve->proc~export_xc~2 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~export_xc~2 program~shape_circle shape_circle program~shape_circle->proc~export_xc~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem_xc_vis~2.html"},{"title":"cmp_elem_Xg_vis – ForCAD","text":"private pure function cmp_elem_Xg_vis(this, p) result(elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in), optional :: p Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem_xg_vis~2~~CallsGraph proc~cmp_elem_xg_vis~2 nurbs_curve%cmp_elem_Xg_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~cmp_elem_xg_vis~2~~CalledByGraph proc~cmp_elem_xg_vis~2 nurbs_curve%cmp_elem_Xg_vis proc~export_xg~2 nurbs_curve%export_Xg proc~export_xg~2->proc~cmp_elem_xg_vis~2 program~example1_curve example1_curve program~example1_curve->proc~export_xg~2 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~export_xg~2 program~shape_circle shape_circle program~shape_circle->proc~export_xg~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem_xg_vis~2.html"},{"title":"get_Wc_all – ForCAD","text":"private pure function get_Wc_all(this) result(Wc) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_wc_all~2.html"},{"title":"get_Wci – ForCAD","text":"private pure function get_Wci(this, n) result(Wc) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk)","tags":"","loc":"proc/get_wci~2.html"},{"title":"get_Xc_all – ForCAD","text":"private pure function get_Xc_all(this) result(Xc) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:)","tags":"","loc":"proc/get_xc_all~2.html"},{"title":"get_Xci – ForCAD","text":"private pure function get_Xci(this, n) result(Xc) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_xci~2.html"},{"title":"get_Xcid – ForCAD","text":"private pure function get_Xcid(this, n, dir) result(Xc) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk)","tags":"","loc":"proc/get_xcid~2.html"},{"title":"get_Xg_all – ForCAD","text":"private pure function get_Xg_all(this) result(Xg) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:)","tags":"","loc":"proc/get_xg_all~2.html"},{"title":"get_Xgi – ForCAD","text":"private pure function get_Xgi(this, n) result(Xg) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_xgi~2.html"},{"title":"get_Xgid – ForCAD","text":"private pure function get_Xgid(this, n, dir) result(Xg) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk)","tags":"","loc":"proc/get_xgid~2.html"},{"title":"get_Xt – ForCAD","text":"private pure function get_Xt(this) result(Xt) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_xt~2.html"},{"title":"get_continuity – ForCAD","text":"private pure function get_continuity(this) result(c) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:) Calls proc~~get_continuity~2~~CallsGraph proc~get_continuity~2 nurbs_curve%get_continuity interface~compute_multiplicity compute_multiplicity proc~get_continuity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_continuity~2.html"},{"title":"get_degree – ForCAD","text":"private pure function get_degree(this) result(degree) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer Calls proc~~get_degree~~CallsGraph proc~get_degree nurbs_curve%get_degree proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~2 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_degree~~CalledByGraph proc~get_degree nurbs_curve%get_degree proc~set1~2 nurbs_curve%set1 proc~set1~2->proc~get_degree proc~set3~2 nurbs_curve%set3 proc~set3~2->proc~get_degree program~example1_curve example1_curve program~example1_curve->proc~get_degree none~set~2 nurbs_curve%set program~example1_curve->none~set~2 proc~elevate_degree~2 nurbs_curve%elevate_degree program~example1_curve->proc~elevate_degree~2 proc~insert_knots~2 nurbs_curve%insert_knots program~example1_curve->proc~insert_knots~2 proc~remove_knots~2 nurbs_curve%remove_knots program~example1_curve->proc~remove_knots~2 none~set~2->proc~set1~2 none~set~2->proc~set3~2 proc~elevate_degree~2->none~set~2 proc~insert_knots~2->none~set~2 proc~modify_wc~2 nurbs_curve%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc~2 nurbs_curve%modify_Xc proc~modify_xc~2->none~set~2 proc~remove_knots~2->none~set~2 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~2 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~2 program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_degree.html"},{"title":"get_elem – ForCAD","text":"private pure function get_elem(this) result(elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem~2.html"},{"title":"get_elem_Xc_vis – ForCAD","text":"private pure function get_elem_Xc_vis(this) result(elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem_xc_vis~2.html"},{"title":"get_elem_Xg_vis – ForCAD","text":"private pure function get_elem_Xg_vis(this) result(elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem_xg_vis~2.html"},{"title":"get_knot_all – ForCAD","text":"private pure function get_knot_all(this) result(knot) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) Called by proc~~get_knot_all~2~~CalledByGraph proc~get_knot_all~2 nurbs_curve%get_knot_all none~get_knot~2 nurbs_curve%get_knot none~get_knot~2->proc~get_knot_all~2 program~example1_curve example1_curve program~example1_curve->none~get_knot~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_knot_all~2.html"},{"title":"get_knoti – ForCAD","text":"private pure function get_knoti(this, i) result(knot) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: i Return Value real(kind=rk) Called by proc~~get_knoti~2~~CalledByGraph proc~get_knoti~2 nurbs_curve%get_knoti none~get_knot~2 nurbs_curve%get_knot none~get_knot~2->proc~get_knoti~2 program~example1_curve example1_curve program~example1_curve->none~get_knot~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_knoti~2.html"},{"title":"get_multiplicity – ForCAD","text":"private pure function get_multiplicity(this) result(m) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:) Calls proc~~get_multiplicity~2~~CallsGraph proc~get_multiplicity~2 nurbs_curve%get_multiplicity interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_multiplicity~2~~CalledByGraph proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~cmp_elem~2 nurbs_curve%cmp_elem proc~cmp_elem~2->proc~get_multiplicity~2 proc~get_degree nurbs_curve%get_degree proc~get_degree->proc~get_multiplicity~2 proc~set1~2 nurbs_curve%set1 proc~set1~2->proc~get_degree proc~set3~2 nurbs_curve%set3 proc~set3~2->proc~get_degree program~example1_curve example1_curve program~example1_curve->proc~get_degree none~set~2 nurbs_curve%set program~example1_curve->none~set~2 proc~elevate_degree~2 nurbs_curve%elevate_degree program~example1_curve->proc~elevate_degree~2 proc~insert_knots~2 nurbs_curve%insert_knots program~example1_curve->proc~insert_knots~2 proc~remove_knots~2 nurbs_curve%remove_knots program~example1_curve->proc~remove_knots~2 none~set~2->proc~set1~2 none~set~2->proc~set3~2 proc~elevate_degree~2->none~set~2 proc~insert_knots~2->none~set~2 proc~modify_wc~2 nurbs_curve%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc~2 nurbs_curve%modify_Xc proc~modify_xc~2->none~set~2 proc~remove_knots~2->none~set~2 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~2 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~2 program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_multiplicity~2.html"},{"title":"get_nc – ForCAD","text":"private pure function get_nc(this) result(nc) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer Calls proc~~get_nc~2~~CallsGraph proc~get_nc~2 nurbs_curve%get_nc interface~compute_multiplicity compute_multiplicity proc~get_nc~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_nc~2.html"},{"title":"get_ng – ForCAD","text":"private pure function get_ng(this) result(ng) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer","tags":"","loc":"proc/get_ng~2.html"},{"title":"is_rational – ForCAD","text":"private pure function is_rational(this) result(r) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value logical Called by proc~~is_rational~2~~CalledByGraph proc~is_rational~2 nurbs_curve%is_rational proc~basis~2 nurbs_curve%basis proc~basis~2->proc~is_rational~2 proc~create~2 nurbs_curve%create proc~create~2->proc~is_rational~2 proc~derivative~2 nurbs_curve%derivative proc~derivative~2->proc~is_rational~2 proc~elevate_degree~2 nurbs_curve%elevate_degree proc~elevate_degree~2->proc~is_rational~2 proc~insert_knots~2 nurbs_curve%insert_knots proc~insert_knots~2->proc~is_rational~2 proc~remove_knots~2 nurbs_curve%remove_knots proc~remove_knots~2->proc~is_rational~2 program~example1_curve example1_curve program~example1_curve->proc~create~2 program~example1_curve->proc~elevate_degree~2 program~example1_curve->proc~insert_knots~2 program~example1_curve->proc~remove_knots~2 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~create~2 program~shape_circle shape_circle program~shape_circle->proc~create~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/is_rational~2.html"},{"title":"basis – ForCAD","text":"private pure subroutine basis(this, res, Xt, Tgc) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) Calls proc~~basis~2~~CallsGraph proc~basis~2 nurbs_curve%basis proc~basis_bspline basis_bspline proc~basis~2->proc~basis_bspline proc~is_rational~2 nurbs_curve%is_rational proc~basis~2->proc~is_rational~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/basis~2.html"},{"title":"create – ForCAD","text":"private pure subroutine create(this, res, Xt) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) Calls proc~~create~2~~CallsGraph proc~create~2 nurbs_curve%create proc~basis_bspline basis_bspline proc~create~2->proc~basis_bspline proc~is_rational~2 nurbs_curve%is_rational proc~create~2->proc~is_rational~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~create~2~~CalledByGraph proc~create~2 nurbs_curve%create program~example1_curve example1_curve program~example1_curve->proc~create~2 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~create~2 program~shape_circle shape_circle program~shape_circle->proc~create~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/create~2.html"},{"title":"derivative – ForCAD","text":"private pure subroutine derivative(this, res, Xt, dTgc) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) Calls proc~~derivative~2~~CallsGraph proc~derivative~2 nurbs_curve%derivative proc~basis_bspline_der basis_bspline_der proc~derivative~2->proc~basis_bspline_der proc~is_rational~2 nurbs_curve%is_rational proc~derivative~2->proc~is_rational~2 proc~isinf isinf proc~basis_bspline_der->proc~isinf Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/derivative~2.html"},{"title":"elevate_degree – ForCAD","text":"private pure subroutine elevate_degree(this, t) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in) :: t Calls proc~~elevate_degree~2~~CallsGraph proc~elevate_degree~2 nurbs_curve%elevate_degree none~set~2 nurbs_curve%set proc~elevate_degree~2->none~set~2 proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree~2->proc~elevate_degree_a_5_9 proc~is_rational~2 nurbs_curve%is_rational proc~elevate_degree~2->proc~is_rational~2 proc~set1~2 nurbs_curve%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_curve%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_curve%set3 none~set~2->proc~set3~2 interface~compute_multiplicity compute_multiplicity proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~bincoeff bincoeff proc~elevate_degree_a_5_9->proc~bincoeff proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~factln factln proc~bincoeff->proc~factln proc~get_degree nurbs_curve%get_degree proc~set1~2->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set3~2->proc~get_degree proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~2 proc~get_multiplicity~2->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~elevate_degree~2~~CalledByGraph proc~elevate_degree~2 nurbs_curve%elevate_degree program~example1_curve example1_curve program~example1_curve->proc~elevate_degree~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/elevate_degree~2.html"},{"title":"export_Xc – ForCAD","text":"private impure subroutine export_Xc(this, filename) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this character(len=*), intent(in) :: filename Calls proc~~export_xc~2~~CallsGraph proc~export_xc~2 nurbs_curve%export_Xc proc~cmp_elem_xc_vis~2 nurbs_curve%cmp_elem_Xc_vis proc~export_xc~2->proc~cmp_elem_xc_vis~2 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~export_xc~2~~CalledByGraph proc~export_xc~2 nurbs_curve%export_Xc program~example1_curve example1_curve program~example1_curve->proc~export_xc~2 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~export_xc~2 program~shape_circle shape_circle program~shape_circle->proc~export_xc~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/export_xc~2.html"},{"title":"export_Xg – ForCAD","text":"private impure subroutine export_Xg(this, filename) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this character(len=*), intent(in) :: filename Calls proc~~export_xg~2~~CallsGraph proc~export_xg~2 nurbs_curve%export_Xg proc~cmp_elem_xg_vis~2 nurbs_curve%cmp_elem_Xg_vis proc~export_xg~2->proc~cmp_elem_xg_vis~2 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~export_xg~2~~CalledByGraph proc~export_xg~2 nurbs_curve%export_Xg program~example1_curve example1_curve program~example1_curve->proc~export_xg~2 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~export_xg~2 program~shape_circle shape_circle program~shape_circle->proc~export_xg~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/export_xg~2.html"},{"title":"finalize – ForCAD","text":"private pure subroutine finalize(this) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this Called by proc~~finalize~2~~CalledByGraph proc~finalize~2 nurbs_curve%finalize program~example1_curve example1_curve program~example1_curve->proc~finalize~2 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~finalize~2 program~shape_circle shape_circle program~shape_circle->proc~finalize~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/finalize~2.html"},{"title":"insert_knots – ForCAD","text":"private pure subroutine insert_knots(this, Xth, r) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) Calls proc~~insert_knots~2~~CallsGraph proc~insert_knots~2 nurbs_curve%insert_knots interface~compute_multiplicity compute_multiplicity proc~insert_knots~2->interface~compute_multiplicity none~set~2 nurbs_curve%set proc~insert_knots~2->none~set~2 proc~findspan findspan proc~insert_knots~2->proc~findspan proc~insert_knot_a_5_1 insert_knot_A_5_1 proc~insert_knots~2->proc~insert_knot_a_5_1 proc~is_rational~2 nurbs_curve%is_rational proc~insert_knots~2->proc~is_rational~2 proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~set1~2 nurbs_curve%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_curve%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_curve%set3 none~set~2->proc~set3~2 proc~get_degree nurbs_curve%get_degree proc~set1~2->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set3~2->proc~get_degree proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~2 proc~get_multiplicity~2->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~insert_knots~2~~CalledByGraph proc~insert_knots~2 nurbs_curve%insert_knots program~example1_curve example1_curve program~example1_curve->proc~insert_knots~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/insert_knots~2.html"},{"title":"modify_Wc – ForCAD","text":"private pure subroutine modify_Wc(this, W, num) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num Calls proc~~modify_wc~2~~CallsGraph proc~modify_wc~2 nurbs_curve%modify_Wc none~set~2 nurbs_curve%set proc~modify_wc~2->none~set~2 proc~set1~2 nurbs_curve%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_curve%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_curve%set3 none~set~2->proc~set3~2 proc~get_degree nurbs_curve%get_degree proc~set1~2->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set3~2->proc~get_degree proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~2 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/modify_wc~2.html"},{"title":"modify_Xc – ForCAD","text":"private pure subroutine modify_Xc(this, X, num, dir) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir Calls proc~~modify_xc~2~~CallsGraph proc~modify_xc~2 nurbs_curve%modify_Xc none~set~2 nurbs_curve%set proc~modify_xc~2->none~set~2 proc~set1~2 nurbs_curve%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_curve%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_curve%set3 none~set~2->proc~set3~2 proc~get_degree nurbs_curve%get_degree proc~set1~2->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set3~2->proc~get_degree proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~2 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/modify_xc~2.html"},{"title":"remove_knots – ForCAD","text":"private pure subroutine remove_knots(this, Xth, r) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) Calls proc~~remove_knots~2~~CallsGraph proc~remove_knots~2 nurbs_curve%remove_knots interface~compute_multiplicity compute_multiplicity proc~remove_knots~2->interface~compute_multiplicity none~set~2 nurbs_curve%set proc~remove_knots~2->none~set~2 proc~findspan findspan proc~remove_knots~2->proc~findspan proc~is_rational~2 nurbs_curve%is_rational proc~remove_knots~2->proc~is_rational~2 proc~remove_knots_a_5_8 remove_knots_A_5_8 proc~remove_knots~2->proc~remove_knots_a_5_8 proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~set1~2 nurbs_curve%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_curve%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_curve%set3 none~set~2->proc~set3~2 proc~get_degree nurbs_curve%get_degree proc~set1~2->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set3~2->proc~get_degree proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~2 proc~get_multiplicity~2->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~remove_knots~2~~CalledByGraph proc~remove_knots~2 nurbs_curve%remove_knots program~example1_curve example1_curve program~example1_curve->proc~remove_knots~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/remove_knots~2.html"},{"title":"rotate_Xc – ForCAD","text":"private pure subroutine rotate_Xc(this, alpha, beta, theta) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta Calls proc~~rotate_xc~2~~CallsGraph proc~rotate_xc~2 nurbs_curve%rotate_Xc proc~rotation rotation proc~rotate_xc~2->proc~rotation cosd cosd proc~rotation->cosd sind sind proc~rotation->sind Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~rotate_xc~2~~CalledByGraph proc~rotate_xc~2 nurbs_curve%rotate_Xc program~example1_curve example1_curve program~example1_curve->proc~rotate_xc~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/rotate_xc~2.html"},{"title":"rotate_Xg – ForCAD","text":"private pure subroutine rotate_Xg(this, alpha, beta, theta) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta Calls proc~~rotate_xg~2~~CallsGraph proc~rotate_xg~2 nurbs_curve%rotate_Xg proc~rotation rotation proc~rotate_xg~2->proc~rotation cosd cosd proc~rotation->cosd sind sind proc~rotation->sind Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~rotate_xg~2~~CalledByGraph proc~rotate_xg~2 nurbs_curve%rotate_Xg program~example1_curve example1_curve program~example1_curve->proc~rotate_xg~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/rotate_xg~2.html"},{"title":"set1 – ForCAD","text":"private pure subroutine set1(this, knot, Xc, Wc) Set knot vector, control points and weights for the NURBS curve object. Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set1~2~~CallsGraph proc~set1~2 nurbs_curve%set1 proc~get_degree nurbs_curve%get_degree proc~set1~2->proc~get_degree proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~2 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set1~2~~CalledByGraph proc~set1~2 nurbs_curve%set1 none~set~2 nurbs_curve%set none~set~2->proc~set1~2 proc~elevate_degree~2 nurbs_curve%elevate_degree proc~elevate_degree~2->none~set~2 proc~insert_knots~2 nurbs_curve%insert_knots proc~insert_knots~2->none~set~2 proc~modify_wc~2 nurbs_curve%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc~2 nurbs_curve%modify_Xc proc~modify_xc~2->none~set~2 proc~remove_knots~2 nurbs_curve%remove_knots proc~remove_knots~2->none~set~2 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~2 program~example1_curve example1_curve program~example1_curve->none~set~2 program~example1_curve->proc~elevate_degree~2 program~example1_curve->proc~insert_knots~2 program~example1_curve->proc~remove_knots~2 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~2 program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set1~2.html"},{"title":"set2 – ForCAD","text":"private pure subroutine set2(this, Xth_dir, degree, continuity, Xc, Wc) Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights. Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir (:) integer, intent(in) :: degree integer, intent(in), contiguous :: continuity (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set2~2~~CallsGraph proc~set2~2 nurbs_curve%set2 proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~repelem repelem proc~compute_knot_vector->proc~repelem Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set2~2~~CalledByGraph proc~set2~2 nurbs_curve%set2 none~set~2 nurbs_curve%set none~set~2->proc~set2~2 proc~elevate_degree~2 nurbs_curve%elevate_degree proc~elevate_degree~2->none~set~2 proc~insert_knots~2 nurbs_curve%insert_knots proc~insert_knots~2->none~set~2 proc~modify_wc~2 nurbs_curve%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc~2 nurbs_curve%modify_Xc proc~modify_xc~2->none~set~2 proc~remove_knots~2 nurbs_curve%remove_knots proc~remove_knots~2->none~set~2 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~2 program~example1_curve example1_curve program~example1_curve->none~set~2 program~example1_curve->proc~elevate_degree~2 program~example1_curve->proc~insert_knots~2 program~example1_curve->proc~remove_knots~2 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~2 program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set2~2.html"},{"title":"set3 – ForCAD","text":"private pure subroutine set3(this, Xc, Wc) Set Bezier or Rational Bezier curve using control points and weights. Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set3~2~~CallsGraph proc~set3~2 nurbs_curve%set3 proc~get_degree nurbs_curve%get_degree proc~set3~2->proc~get_degree proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~2 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set3~2~~CalledByGraph proc~set3~2 nurbs_curve%set3 none~set~2 nurbs_curve%set none~set~2->proc~set3~2 proc~elevate_degree~2 nurbs_curve%elevate_degree proc~elevate_degree~2->none~set~2 proc~insert_knots~2 nurbs_curve%insert_knots proc~insert_knots~2->none~set~2 proc~modify_wc~2 nurbs_curve%modify_Wc proc~modify_wc~2->none~set~2 proc~modify_xc~2 nurbs_curve%modify_Xc proc~modify_xc~2->none~set~2 proc~remove_knots~2 nurbs_curve%remove_knots proc~remove_knots~2->none~set~2 proc~set_circle nurbs_curve%set_circle proc~set_circle->none~set~2 program~example1_curve example1_curve program~example1_curve->none~set~2 program~example1_curve->proc~elevate_degree~2 program~example1_curve->proc~insert_knots~2 program~example1_curve->proc~remove_knots~2 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->none~set~2 program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set3~2.html"},{"title":"set_circle – ForCAD","text":"private pure subroutine set_circle(this, center, radius) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: center (:) real(kind=rk), intent(in) :: radius Calls proc~~set_circle~~CallsGraph proc~set_circle nurbs_curve%set_circle none~set~2 nurbs_curve%set proc~set_circle->none~set~2 proc~set1~2 nurbs_curve%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_curve%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_curve%set3 none~set~2->proc~set3~2 proc~get_degree nurbs_curve%get_degree proc~set1~2->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set3~2->proc~get_degree proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~2 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set_circle~~CalledByGraph proc~set_circle nurbs_curve%set_circle program~shape_circle shape_circle program~shape_circle->proc~set_circle Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set_circle.html"},{"title":"set_elem – ForCAD","text":"private pure subroutine set_elem(this, elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:)","tags":"","loc":"proc/set_elem~2.html"},{"title":"set_elem_Xc_vis – ForCAD","text":"private pure subroutine set_elem_Xc_vis(this, elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:)","tags":"","loc":"proc/set_elem_xc_vis~2.html"},{"title":"set_elem_Xg_vis – ForCAD","text":"private pure subroutine set_elem_Xg_vis(this, elemConn) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:)","tags":"","loc":"proc/set_elem_xg_vis~2.html"},{"title":"show – ForCAD","text":"private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg Called by proc~~show~2~~CalledByGraph proc~show~2 nurbs_curve%show program~example1_curve example1_curve program~example1_curve->proc~show~2 program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->proc~show~2 program~shape_circle shape_circle program~shape_circle->proc~show~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/show~2.html"},{"title":"translate_Xc – ForCAD","text":"private pure subroutine translate_Xc(this, vec) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) Called by proc~~translate_xc~2~~CalledByGraph proc~translate_xc~2 nurbs_curve%translate_Xc program~example1_curve example1_curve program~example1_curve->proc~translate_xc~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/translate_xc~2.html"},{"title":"translate_Xg – ForCAD","text":"private pure subroutine translate_Xg(this, vec) Type Bound nurbs_curve Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) Called by proc~~translate_xg~2~~CalledByGraph proc~translate_xg~2 nurbs_curve%translate_Xg program~example1_curve example1_curve program~example1_curve->proc~translate_xg~2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/translate_xg~2.html"},{"title":"cmp_elem – ForCAD","text":"private pure function cmp_elem(this) result(elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem~3~~CallsGraph proc~cmp_elem~3 nurbs_volume%cmp_elem interface~elemconn_cn elemConn_Cn proc~cmp_elem~3->interface~elemconn_cn interface~unique unique proc~cmp_elem~3->interface~unique proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~cmp_elem~3->proc~get_multiplicity~3 proc~cmp_elemconn_cn_l cmp_elemConn_Cn_L interface~elemconn_cn->proc~cmp_elemconn_cn_l proc~cmp_elemconn_cn_s cmp_elemConn_Cn_S interface~elemconn_cn->proc~cmp_elemconn_cn_s proc~cmp_elemconn_cn_v cmp_elemConn_Cn_V interface~elemconn_cn->proc~cmp_elemconn_cn_v proc~unique_integer unique_integer interface~unique->proc~unique_integer proc~unique_real unique_real interface~unique->proc~unique_real interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem~3.html"},{"title":"cmp_elem_Xc_vis – ForCAD","text":"private pure function cmp_elem_Xc_vis(this, p) result(elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem_xc_vis~3~~CallsGraph proc~cmp_elem_xc_vis~3 nurbs_volume%cmp_elem_Xc_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~cmp_elem_xc_vis~3~~CalledByGraph proc~cmp_elem_xc_vis~3 nurbs_volume%cmp_elem_Xc_vis proc~export_xc~3 nurbs_volume%export_Xc proc~export_xc~3->proc~cmp_elem_xc_vis~3 program~example3_volume example3_volume program~example3_volume->proc~export_xc~3 program~example_morph example_morph program~example_morph->proc~export_xc~3 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~export_xc~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~export_xc~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem_xc_vis~3.html"},{"title":"cmp_elem_Xg_vis – ForCAD","text":"private pure function cmp_elem_Xg_vis(this, p) result(elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) Calls proc~~cmp_elem_xg_vis~3~~CallsGraph proc~cmp_elem_xg_vis~3 nurbs_volume%cmp_elem_Xg_vis interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~cmp_elem_xg_vis~3~~CalledByGraph proc~cmp_elem_xg_vis~3 nurbs_volume%cmp_elem_Xg_vis proc~export_xg~3 nurbs_volume%export_Xg proc~export_xg~3->proc~cmp_elem_xg_vis~3 program~example3_volume example3_volume program~example3_volume->proc~export_xg~3 program~example_morph example_morph program~example_morph->proc~export_xg~3 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~export_xg~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~export_xg~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/cmp_elem_xg_vis~3.html"},{"title":"get_Wc_all – ForCAD","text":"private pure function get_Wc_all(this) result(Wc) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_wc_all~3.html"},{"title":"get_Wci – ForCAD","text":"private pure function get_Wci(this, n) result(Wc) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk)","tags":"","loc":"proc/get_wci~3.html"},{"title":"get_Xc_all – ForCAD","text":"private pure function get_Xc_all(this) result(Xc) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:)","tags":"","loc":"proc/get_xc_all~3.html"},{"title":"get_Xci – ForCAD","text":"private pure function get_Xci(this, n) result(Xc) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_xci~3.html"},{"title":"get_Xcid – ForCAD","text":"private pure function get_Xcid(this, n, dir) result(Xc) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk)","tags":"","loc":"proc/get_xcid~3.html"},{"title":"get_Xg_all – ForCAD","text":"private pure function get_Xg_all(this) result(Xg) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:)","tags":"","loc":"proc/get_xg_all~3.html"},{"title":"get_Xgi – ForCAD","text":"private pure function get_Xgi(this, n) result(Xg) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_xgi~3.html"},{"title":"get_Xgid – ForCAD","text":"private pure function get_Xgid(this, n, dir) result(Xg) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk)","tags":"","loc":"proc/get_xgid~3.html"},{"title":"get_Xt – ForCAD","text":"private pure function get_Xt(this, dir) result(Xt) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:)","tags":"","loc":"proc/get_xt~3.html"},{"title":"get_continuity – ForCAD","text":"private pure function get_continuity(this, dir) result(c) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) Calls proc~~get_continuity~3~~CallsGraph proc~get_continuity~3 nurbs_volume%get_continuity interface~compute_multiplicity compute_multiplicity proc~get_continuity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_continuity~3.html"},{"title":"get_degree_all – ForCAD","text":"private pure function get_degree_all(this) result(degree) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, (3) Calls proc~~get_degree_all~2~~CallsGraph proc~get_degree_all~2 nurbs_volume%get_degree_all proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~3 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_degree_all~2~~CalledByGraph proc~get_degree_all~2 nurbs_volume%get_degree_all none~get_degree~3 nurbs_volume%get_degree none~get_degree~3->proc~get_degree_all~2 proc~set1~3 nurbs_volume%set1 proc~set1~3->none~get_degree~3 proc~set3~3 nurbs_volume%set3 proc~set3~3->none~get_degree~3 program~example3_volume example3_volume program~example3_volume->none~get_degree~3 none~set~3 nurbs_volume%set program~example3_volume->none~set~3 proc~elevate_degree~3 nurbs_volume%elevate_degree program~example3_volume->proc~elevate_degree~3 proc~insert_knots~3 nurbs_volume%insert_knots program~example3_volume->proc~insert_knots~3 proc~remove_knots~3 nurbs_volume%remove_knots program~example3_volume->proc~remove_knots~3 none~set~3->proc~set1~3 none~set~3->proc~set3~3 proc~elevate_degree~3->none~set~3 proc~insert_knots~3->none~set~3 proc~modify_wc~3 nurbs_volume%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc~3 nurbs_volume%modify_Xc proc~modify_xc~3->none~set~3 proc~remove_knots~3->none~set~3 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set~3 program~example_morph example_morph program~example_morph->none~set~3 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_degree_all~2.html"},{"title":"get_degree_dir – ForCAD","text":"private pure function get_degree_dir(this, dir) result(degree) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer Calls proc~~get_degree_dir~2~~CallsGraph proc~get_degree_dir~2 nurbs_volume%get_degree_dir proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_degree_dir~2->proc~get_multiplicity~3 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_degree_dir~2~~CalledByGraph proc~get_degree_dir~2 nurbs_volume%get_degree_dir none~get_degree~3 nurbs_volume%get_degree none~get_degree~3->proc~get_degree_dir~2 proc~set1~3 nurbs_volume%set1 proc~set1~3->none~get_degree~3 proc~set3~3 nurbs_volume%set3 proc~set3~3->none~get_degree~3 program~example3_volume example3_volume program~example3_volume->none~get_degree~3 none~set~3 nurbs_volume%set program~example3_volume->none~set~3 proc~elevate_degree~3 nurbs_volume%elevate_degree program~example3_volume->proc~elevate_degree~3 proc~insert_knots~3 nurbs_volume%insert_knots program~example3_volume->proc~insert_knots~3 proc~remove_knots~3 nurbs_volume%remove_knots program~example3_volume->proc~remove_knots~3 none~set~3->proc~set1~3 none~set~3->proc~set3~3 proc~elevate_degree~3->none~set~3 proc~insert_knots~3->none~set~3 proc~modify_wc~3 nurbs_volume%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc~3 nurbs_volume%modify_Xc proc~modify_xc~3->none~set~3 proc~remove_knots~3->none~set~3 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set~3 program~example_morph example_morph program~example_morph->none~set~3 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_degree_dir~2.html"},{"title":"get_elem – ForCAD","text":"private pure function get_elem(this) result(elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem~3.html"},{"title":"get_elem_Xc_vis – ForCAD","text":"private pure function get_elem_Xc_vis(this) result(elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem_xc_vis~3.html"},{"title":"get_elem_Xg_vis – ForCAD","text":"private pure function get_elem_Xg_vis(this) result(elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:)","tags":"","loc":"proc/get_elem_xg_vis~3.html"},{"title":"get_knot_all – ForCAD","text":"private pure function get_knot_all(this, dir) result(knot) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) Called by proc~~get_knot_all~3~~CalledByGraph proc~get_knot_all~3 nurbs_volume%get_knot_all none~get_knot~3 nurbs_volume%get_knot none~get_knot~3->proc~get_knot_all~3 program~example3_volume example3_volume program~example3_volume->none~get_knot~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_knot_all~3.html"},{"title":"get_knoti – ForCAD","text":"private pure function get_knoti(this, dir, i) result(knot) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir integer, intent(in) :: i Return Value real(kind=rk) Called by proc~~get_knoti~3~~CalledByGraph proc~get_knoti~3 nurbs_volume%get_knoti none~get_knot~3 nurbs_volume%get_knot none~get_knot~3->proc~get_knoti~3 program~example3_volume example3_volume program~example3_volume->none~get_knot~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_knoti~3.html"},{"title":"get_multiplicity – ForCAD","text":"private pure function get_multiplicity(this, dir) result(m) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) Calls proc~~get_multiplicity~3~~CallsGraph proc~get_multiplicity~3 nurbs_volume%get_multiplicity interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_multiplicity~3~~CalledByGraph proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~cmp_elem~3 nurbs_volume%cmp_elem proc~cmp_elem~3->proc~get_multiplicity~3 proc~get_degree_all~2 nurbs_volume%get_degree_all proc~get_degree_all~2->proc~get_multiplicity~3 proc~get_degree_dir~2 nurbs_volume%get_degree_dir proc~get_degree_dir~2->proc~get_multiplicity~3 none~get_degree~3 nurbs_volume%get_degree none~get_degree~3->proc~get_degree_all~2 none~get_degree~3->proc~get_degree_dir~2 proc~set1~3 nurbs_volume%set1 proc~set1~3->none~get_degree~3 proc~set3~3 nurbs_volume%set3 proc~set3~3->none~get_degree~3 program~example3_volume example3_volume program~example3_volume->none~get_degree~3 none~set~3 nurbs_volume%set program~example3_volume->none~set~3 proc~elevate_degree~3 nurbs_volume%elevate_degree program~example3_volume->proc~elevate_degree~3 proc~insert_knots~3 nurbs_volume%insert_knots program~example3_volume->proc~insert_knots~3 proc~remove_knots~3 nurbs_volume%remove_knots program~example3_volume->proc~remove_knots~3 none~set~3->proc~set1~3 none~set~3->proc~set3~3 proc~elevate_degree~3->none~set~3 proc~insert_knots~3->none~set~3 proc~modify_wc~3 nurbs_volume%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc~3 nurbs_volume%modify_Xc proc~modify_xc~3->none~set~3 proc~remove_knots~3->none~set~3 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set~3 program~example_morph example_morph program~example_morph->none~set~3 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_multiplicity~3.html"},{"title":"get_nc – ForCAD","text":"private pure function get_nc(this, dir) result(nc) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer Calls proc~~get_nc~3~~CallsGraph proc~get_nc~3 nurbs_volume%get_nc interface~compute_multiplicity compute_multiplicity proc~get_nc~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~get_nc~3~~CalledByGraph proc~get_nc~3 nurbs_volume%get_nc proc~set1~3 nurbs_volume%set1 proc~set1~3->proc~get_nc~3 proc~set2~3 nurbs_volume%set2 proc~set2~3->proc~get_nc~3 none~set~3 nurbs_volume%set none~set~3->proc~set1~3 none~set~3->proc~set2~3 proc~elevate_degree~3 nurbs_volume%elevate_degree proc~elevate_degree~3->none~set~3 proc~insert_knots~3 nurbs_volume%insert_knots proc~insert_knots~3->none~set~3 proc~modify_wc~3 nurbs_volume%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc~3 nurbs_volume%modify_Xc proc~modify_xc~3->none~set~3 proc~remove_knots~3 nurbs_volume%remove_knots proc~remove_knots~3->none~set~3 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set~3 program~example3_volume example3_volume program~example3_volume->none~set~3 program~example3_volume->proc~elevate_degree~3 program~example3_volume->proc~insert_knots~3 program~example3_volume->proc~remove_knots~3 program~example_morph example_morph program~example_morph->none~set~3 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/get_nc~3.html"},{"title":"get_ng – ForCAD","text":"private pure function get_ng(this) result(ng) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, (3)","tags":"","loc":"proc/get_ng~3.html"},{"title":"is_rational – ForCAD","text":"private pure function is_rational(this) result(r) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value logical","tags":"","loc":"proc/is_rational~3.html"},{"title":"basis – ForCAD","text":"private pure subroutine basis(this, res1, res2, res3, Xt1, Xt2, Xt3, Tgc) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) Calls proc~~basis~3~~CallsGraph proc~basis~3 nurbs_volume%basis interface~ndgrid ndgrid proc~basis~3->interface~ndgrid proc~basis_bspline basis_bspline proc~basis~3->proc~basis_bspline proc~kron kron proc~basis~3->proc~kron proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/basis~3.html"},{"title":"create – ForCAD","text":"private pure subroutine create(this, res1, res2, res3, Xt1, Xt2, Xt3, Xt) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(in), optional, contiguous :: Xt (:,:) Calls proc~~create~3~~CallsGraph proc~create~3 nurbs_volume%create interface~ndgrid ndgrid proc~create~3->interface~ndgrid proc~basis_bspline basis_bspline proc~create~3->proc~basis_bspline proc~kron kron proc~create~3->proc~kron proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~create~3~~CalledByGraph proc~create~3 nurbs_volume%create program~example3_volume example3_volume program~example3_volume->proc~create~3 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~create~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~create~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/create~3.html"},{"title":"derivative – ForCAD","text":"private pure subroutine derivative(this, res1, res2, res3, Xt1, Xt2, Xt3, dTgc) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) Calls proc~~derivative~3~~CallsGraph proc~derivative~3 nurbs_volume%derivative interface~ndgrid ndgrid proc~derivative~3->interface~ndgrid proc~basis_bspline_der basis_bspline_der proc~derivative~3->proc~basis_bspline_der proc~kron kron proc~derivative~3->proc~kron proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 proc~isinf isinf proc~basis_bspline_der->proc~isinf Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/derivative~3.html"},{"title":"elevate_degree – ForCAD","text":"private pure subroutine elevate_degree(this, dir, t) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir integer, intent(in) :: t Calls proc~~elevate_degree~3~~CallsGraph proc~elevate_degree~3 nurbs_volume%elevate_degree none~set~3 nurbs_volume%set proc~elevate_degree~3->none~set~3 proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree~3->proc~elevate_degree_a_5_9 proc~set1~3 nurbs_volume%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_volume%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_volume%set3 none~set~3->proc~set3~3 interface~compute_multiplicity compute_multiplicity proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~bincoeff bincoeff proc~elevate_degree_a_5_9->proc~bincoeff proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~factln factln proc~bincoeff->proc~factln none~get_degree~3 nurbs_volume%get_degree proc~set1~3->none~get_degree~3 proc~get_nc~3 nurbs_volume%get_nc proc~set1~3->proc~get_nc~3 proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set2~3->proc~get_nc~3 proc~set3~3->none~get_degree~3 proc~get_degree_all~2 nurbs_volume%get_degree_all none~get_degree~3->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_volume%get_degree_dir none~get_degree~3->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_nc~3->interface~compute_multiplicity proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~3 proc~get_degree_dir~2->proc~get_multiplicity~3 proc~get_multiplicity~3->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~elevate_degree~3~~CalledByGraph proc~elevate_degree~3 nurbs_volume%elevate_degree program~example3_volume example3_volume program~example3_volume->proc~elevate_degree~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/elevate_degree~3.html"},{"title":"export_Xc – ForCAD","text":"private impure subroutine export_Xc(this, filename) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this character(len=*), intent(in) :: filename Calls proc~~export_xc~3~~CallsGraph proc~export_xc~3 nurbs_volume%export_Xc proc~cmp_elem_xc_vis~3 nurbs_volume%cmp_elem_Xc_vis proc~export_xc~3->proc~cmp_elem_xc_vis~3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~export_xc~3~~CalledByGraph proc~export_xc~3 nurbs_volume%export_Xc program~example3_volume example3_volume program~example3_volume->proc~export_xc~3 program~example_morph example_morph program~example_morph->proc~export_xc~3 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~export_xc~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~export_xc~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/export_xc~3.html"},{"title":"export_Xg – ForCAD","text":"private impure subroutine export_Xg(this, filename) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this character(len=*), intent(in) :: filename Calls proc~~export_xg~3~~CallsGraph proc~export_xg~3 nurbs_volume%export_Xg proc~cmp_elem_xg_vis~3 nurbs_volume%cmp_elem_Xg_vis proc~export_xg~3->proc~cmp_elem_xg_vis~3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~export_xg~3~~CalledByGraph proc~export_xg~3 nurbs_volume%export_Xg program~example3_volume example3_volume program~example3_volume->proc~export_xg~3 program~example_morph example_morph program~example_morph->proc~export_xg~3 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~export_xg~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~export_xg~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/export_xg~3.html"},{"title":"finalize – ForCAD","text":"private pure subroutine finalize(this) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this Called by proc~~finalize~3~~CalledByGraph proc~finalize~3 nurbs_volume%finalize program~example3_volume example3_volume program~example3_volume->proc~finalize~3 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~finalize~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~finalize~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/finalize~3.html"},{"title":"insert_knots – ForCAD","text":"private pure subroutine insert_knots(this, dir, Xth, r) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) Calls proc~~insert_knots~3~~CallsGraph proc~insert_knots~3 nurbs_volume%insert_knots interface~compute_multiplicity compute_multiplicity proc~insert_knots~3->interface~compute_multiplicity none~set~3 nurbs_volume%set proc~insert_knots~3->none~set~3 proc~findspan findspan proc~insert_knots~3->proc~findspan proc~insert_knot_a_5_1 insert_knot_A_5_1 proc~insert_knots~3->proc~insert_knot_a_5_1 proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~set1~3 nurbs_volume%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_volume%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_volume%set3 none~set~3->proc~set3~3 none~get_degree~3 nurbs_volume%get_degree proc~set1~3->none~get_degree~3 proc~get_nc~3 nurbs_volume%get_nc proc~set1~3->proc~get_nc~3 proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set2~3->proc~get_nc~3 proc~set3~3->none~get_degree~3 proc~get_degree_all~2 nurbs_volume%get_degree_all none~get_degree~3->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_volume%get_degree_dir none~get_degree~3->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_nc~3->interface~compute_multiplicity proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~3 proc~get_degree_dir~2->proc~get_multiplicity~3 proc~get_multiplicity~3->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~insert_knots~3~~CalledByGraph proc~insert_knots~3 nurbs_volume%insert_knots program~example3_volume example3_volume program~example3_volume->proc~insert_knots~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/insert_knots~3.html"},{"title":"modify_Wc – ForCAD","text":"private pure subroutine modify_Wc(this, W, num) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num Calls proc~~modify_wc~3~~CallsGraph proc~modify_wc~3 nurbs_volume%modify_Wc none~set~3 nurbs_volume%set proc~modify_wc~3->none~set~3 proc~set1~3 nurbs_volume%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_volume%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_volume%set3 none~set~3->proc~set3~3 none~get_degree~3 nurbs_volume%get_degree proc~set1~3->none~get_degree~3 proc~get_nc~3 nurbs_volume%get_nc proc~set1~3->proc~get_nc~3 proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set2~3->proc~get_nc~3 proc~set3~3->none~get_degree~3 proc~get_degree_all~2 nurbs_volume%get_degree_all none~get_degree~3->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_volume%get_degree_dir none~get_degree~3->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~3 proc~get_degree_dir~2->proc~get_multiplicity~3 proc~get_multiplicity~3->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/modify_wc~3.html"},{"title":"modify_Xc – ForCAD","text":"private pure subroutine modify_Xc(this, X, num, dir) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir Calls proc~~modify_xc~3~~CallsGraph proc~modify_xc~3 nurbs_volume%modify_Xc none~set~3 nurbs_volume%set proc~modify_xc~3->none~set~3 proc~set1~3 nurbs_volume%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_volume%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_volume%set3 none~set~3->proc~set3~3 none~get_degree~3 nurbs_volume%get_degree proc~set1~3->none~get_degree~3 proc~get_nc~3 nurbs_volume%get_nc proc~set1~3->proc~get_nc~3 proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set2~3->proc~get_nc~3 proc~set3~3->none~get_degree~3 proc~get_degree_all~2 nurbs_volume%get_degree_all none~get_degree~3->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_volume%get_degree_dir none~get_degree~3->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~3 proc~get_degree_dir~2->proc~get_multiplicity~3 proc~get_multiplicity~3->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/modify_xc~3.html"},{"title":"put_to_nurbs – ForCAD","text":"private pure subroutine put_to_nurbs(this, X, elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: X (:,:) integer, intent(in), contiguous :: elemConn (:,:) Calls proc~~put_to_nurbs~~CallsGraph proc~put_to_nurbs nurbs_volume%put_to_nurbs proc~basis_bspline basis_bspline proc~put_to_nurbs->proc~basis_bspline proc~kron kron proc~put_to_nurbs->proc~kron proc~set_elem_xg_vis~3 nurbs_volume%set_elem_Xg_vis proc~put_to_nurbs->proc~set_elem_xg_vis~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~put_to_nurbs~~CalledByGraph proc~put_to_nurbs nurbs_volume%put_to_nurbs program~example_morph example_morph program~example_morph->proc~put_to_nurbs Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/put_to_nurbs.html"},{"title":"remove_knots – ForCAD","text":"private pure subroutine remove_knots(this, dir, Xth, r) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) Calls proc~~remove_knots~3~~CallsGraph proc~remove_knots~3 nurbs_volume%remove_knots interface~compute_multiplicity compute_multiplicity proc~remove_knots~3->interface~compute_multiplicity none~set~3 nurbs_volume%set proc~remove_knots~3->none~set~3 proc~findspan findspan proc~remove_knots~3->proc~findspan proc~remove_knots_a_5_8 remove_knots_A_5_8 proc~remove_knots~3->proc~remove_knots_a_5_8 proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~set1~3 nurbs_volume%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_volume%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_volume%set3 none~set~3->proc~set3~3 none~get_degree~3 nurbs_volume%get_degree proc~set1~3->none~get_degree~3 proc~get_nc~3 nurbs_volume%get_nc proc~set1~3->proc~get_nc~3 proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set2~3->proc~get_nc~3 proc~set3~3->none~get_degree~3 proc~get_degree_all~2 nurbs_volume%get_degree_all none~get_degree~3->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_volume%get_degree_dir none~get_degree~3->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_nc~3->interface~compute_multiplicity proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~3 proc~get_degree_dir~2->proc~get_multiplicity~3 proc~get_multiplicity~3->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~remove_knots~3~~CalledByGraph proc~remove_knots~3 nurbs_volume%remove_knots program~example3_volume example3_volume program~example3_volume->proc~remove_knots~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/remove_knots~3.html"},{"title":"rotate_Xc – ForCAD","text":"private pure subroutine rotate_Xc(this, alpha, beta, theta) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta Calls proc~~rotate_xc~3~~CallsGraph proc~rotate_xc~3 nurbs_volume%rotate_Xc proc~rotation rotation proc~rotate_xc~3->proc~rotation cosd cosd proc~rotation->cosd sind sind proc~rotation->sind Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~rotate_xc~3~~CalledByGraph proc~rotate_xc~3 nurbs_volume%rotate_Xc program~example3_volume example3_volume program~example3_volume->proc~rotate_xc~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/rotate_xc~3.html"},{"title":"rotate_Xg – ForCAD","text":"private pure subroutine rotate_Xg(this, alpha, beta, theta) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta Calls proc~~rotate_xg~3~~CallsGraph proc~rotate_xg~3 nurbs_volume%rotate_Xg proc~rotation rotation proc~rotate_xg~3->proc~rotation cosd cosd proc~rotation->cosd sind sind proc~rotation->sind Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~rotate_xg~3~~CalledByGraph proc~rotate_xg~3 nurbs_volume%rotate_Xg program~example3_volume example3_volume program~example3_volume->proc~rotate_xg~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/rotate_xg~3.html"},{"title":"set1 – ForCAD","text":"private pure subroutine set1(this, knot1, knot2, knot3, Xc, Wc) Set control points and weights for the NURBS volume object. Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot1 (:) real(kind=rk), intent(in), contiguous :: knot2 (:) real(kind=rk), intent(in), contiguous :: knot3 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set1~3~~CallsGraph proc~set1~3 nurbs_volume%set1 none~get_degree~3 nurbs_volume%get_degree proc~set1~3->none~get_degree~3 proc~get_nc~3 nurbs_volume%get_nc proc~set1~3->proc~get_nc~3 proc~get_degree_all~2 nurbs_volume%get_degree_all none~get_degree~3->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_volume%get_degree_dir none~get_degree~3->proc~get_degree_dir~2 interface~compute_multiplicity compute_multiplicity proc~get_nc~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~3 proc~get_degree_dir~2->proc~get_multiplicity~3 proc~get_multiplicity~3->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set1~3~~CalledByGraph proc~set1~3 nurbs_volume%set1 none~set~3 nurbs_volume%set none~set~3->proc~set1~3 proc~elevate_degree~3 nurbs_volume%elevate_degree proc~elevate_degree~3->none~set~3 proc~insert_knots~3 nurbs_volume%insert_knots proc~insert_knots~3->none~set~3 proc~modify_wc~3 nurbs_volume%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc~3 nurbs_volume%modify_Xc proc~modify_xc~3->none~set~3 proc~remove_knots~3 nurbs_volume%remove_knots proc~remove_knots~3->none~set~3 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set~3 program~example3_volume example3_volume program~example3_volume->none~set~3 program~example3_volume->proc~elevate_degree~3 program~example3_volume->proc~insert_knots~3 program~example3_volume->proc~remove_knots~3 program~example_morph example_morph program~example_morph->none~set~3 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set1~3.html"},{"title":"set2 – ForCAD","text":"private pure subroutine set2(this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc) Set control points and weights for the NURBS volume object. Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir1 (:) real(kind=rk), intent(in), contiguous :: Xth_dir2 (:) real(kind=rk), intent(in), contiguous :: Xth_dir3 (:) integer, intent(in), contiguous :: degree (:) integer, intent(in), contiguous :: continuity1 (:) integer, intent(in), contiguous :: continuity2 (:) integer, intent(in), contiguous :: continuity3 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set2~3~~CallsGraph proc~set2~3 nurbs_volume%set2 proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~get_nc~3 nurbs_volume%get_nc proc~set2~3->proc~get_nc~3 proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set2~3~~CalledByGraph proc~set2~3 nurbs_volume%set2 none~set~3 nurbs_volume%set none~set~3->proc~set2~3 proc~elevate_degree~3 nurbs_volume%elevate_degree proc~elevate_degree~3->none~set~3 proc~insert_knots~3 nurbs_volume%insert_knots proc~insert_knots~3->none~set~3 proc~modify_wc~3 nurbs_volume%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc~3 nurbs_volume%modify_Xc proc~modify_xc~3->none~set~3 proc~remove_knots~3 nurbs_volume%remove_knots proc~remove_knots~3->none~set~3 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set~3 program~example3_volume example3_volume program~example3_volume->none~set~3 program~example3_volume->proc~elevate_degree~3 program~example3_volume->proc~insert_knots~3 program~example3_volume->proc~remove_knots~3 program~example_morph example_morph program~example_morph->none~set~3 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set2~3.html"},{"title":"set3 – ForCAD","text":"private pure subroutine set3(this, nc, Xc, Wc) Set Bezier or Rational Bezier volume using control points and weights. Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set3~3~~CallsGraph proc~set3~3 nurbs_volume%set3 none~get_degree~3 nurbs_volume%get_degree proc~set3~3->none~get_degree~3 proc~get_degree_all~2 nurbs_volume%get_degree_all none~get_degree~3->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_volume%get_degree_dir none~get_degree~3->proc~get_degree_dir~2 proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~3 proc~get_degree_dir~2->proc~get_multiplicity~3 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set3~3~~CalledByGraph proc~set3~3 nurbs_volume%set3 none~set~3 nurbs_volume%set none~set~3->proc~set3~3 proc~elevate_degree~3 nurbs_volume%elevate_degree proc~elevate_degree~3->none~set~3 proc~insert_knots~3 nurbs_volume%insert_knots proc~insert_knots~3->none~set~3 proc~modify_wc~3 nurbs_volume%modify_Wc proc~modify_wc~3->none~set~3 proc~modify_xc~3 nurbs_volume%modify_Xc proc~modify_xc~3->none~set~3 proc~remove_knots~3 nurbs_volume%remove_knots proc~remove_knots~3->none~set~3 proc~set_hexahedron nurbs_volume%set_hexahedron proc~set_hexahedron->none~set~3 program~example3_volume example3_volume program~example3_volume->none~set~3 program~example3_volume->proc~elevate_degree~3 program~example3_volume->proc~insert_knots~3 program~example3_volume->proc~remove_knots~3 program~example_morph example_morph program~example_morph->none~set~3 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->none~set~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set3~3.html"},{"title":"set_elem – ForCAD","text":"private pure subroutine set_elem(this, elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:)","tags":"","loc":"proc/set_elem~3.html"},{"title":"set_elem_Xc_vis – ForCAD","text":"private pure subroutine set_elem_Xc_vis(this, elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:)","tags":"","loc":"proc/set_elem_xc_vis~3.html"},{"title":"set_elem_Xg_vis – ForCAD","text":"private pure subroutine set_elem_Xg_vis(this, elemConn) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) Called by proc~~set_elem_xg_vis~3~~CalledByGraph proc~set_elem_xg_vis~3 nurbs_volume%set_elem_Xg_vis proc~put_to_nurbs nurbs_volume%put_to_nurbs proc~put_to_nurbs->proc~set_elem_xg_vis~3 program~example_morph example_morph program~example_morph->proc~put_to_nurbs Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set_elem_xg_vis~3.html"},{"title":"set_hexahedron – ForCAD","text":"private pure subroutine set_hexahedron(this, L, nc, Wc) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: L (:) integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) Calls proc~~set_hexahedron~~CallsGraph proc~set_hexahedron nurbs_volume%set_hexahedron none~set~3 nurbs_volume%set proc~set_hexahedron->none~set~3 proc~hexahedron_xc hexahedron_Xc proc~set_hexahedron->proc~hexahedron_xc proc~set1~3 nurbs_volume%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_volume%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_volume%set3 none~set~3->proc~set3~3 none~get_degree~3 nurbs_volume%get_degree proc~set1~3->none~get_degree~3 proc~get_nc~3 nurbs_volume%get_nc proc~set1~3->proc~get_nc~3 proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set2~3->proc~get_nc~3 proc~set3~3->none~get_degree~3 proc~get_degree_all~2 nurbs_volume%get_degree_all none~get_degree~3->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_volume%get_degree_dir none~get_degree~3->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~3 proc~get_degree_dir~2->proc~get_multiplicity~3 proc~get_multiplicity~3->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Called by proc~~set_hexahedron~~CalledByGraph proc~set_hexahedron nurbs_volume%set_hexahedron program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~set_hexahedron Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/set_hexahedron.html"},{"title":"show – ForCAD","text":"private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg Called by proc~~show~3~~CalledByGraph proc~show~3 nurbs_volume%show program~example3_volume example3_volume program~example3_volume->proc~show~3 program~example_morph example_morph program~example_morph->proc~show~3 program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->proc~show~3 program~shape_hexahedron shape_hexahedron program~shape_hexahedron->proc~show~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/show~3.html"},{"title":"translate_Xc – ForCAD","text":"private pure subroutine translate_Xc(this, vec) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) Called by proc~~translate_xc~3~~CalledByGraph proc~translate_xc~3 nurbs_volume%translate_Xc program~example3_volume example3_volume program~example3_volume->proc~translate_xc~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/translate_xc~3.html"},{"title":"translate_Xg – ForCAD","text":"private pure subroutine translate_Xg(this, vec) Type Bound nurbs_volume Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) Called by proc~~translate_xg~3~~CalledByGraph proc~translate_xg~3 nurbs_volume%translate_Xg program~example3_volume example3_volume program~example3_volume->proc~translate_xg~3 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"proc/translate_xg~3.html"},{"title":"forcad_utils – ForCAD","text":"This module contains parameters, functions and subroutines that are used in the library. Used by module~~forcad_utils~~UsedByGraph module~forcad_utils forcad_utils module~forcad forcad module~forcad->module~forcad_utils module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils program~example_morph example_morph program~example_morph->module~forcad_utils program~example_morph->module~forcad program~example1_curve example1_curve program~example1_curve->module~forcad program~example3_surface example3_surface program~example3_surface->module~forcad program~example3_volume example3_volume program~example3_volume->module~forcad program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->module~forcad program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->module~forcad program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->module~forcad program~shape_circle shape_circle program~shape_circle->module~forcad program~shape_hexahedron shape_hexahedron program~shape_hexahedron->module~forcad program~shape_tetragon shape_tetragon program~shape_tetragon->module~forcad Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables Type Visibility Attributes Name Initial integer, public, parameter :: rk = kind(1.0d0) Interfaces public interface compute_multiplicity private pure function compute_multiplicity1 (knot) result(multiplicity) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: knot (:) Return Value integer, allocatable, (:) private pure function compute_multiplicity2 (knot, Xth) result(multiplicity) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in) :: Xth Return Value integer public interface elemConn_C0 private pure function cmp_elemConn_C0_L (nnode, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode integer, intent(in) :: p Return Value integer, allocatable, (:,:) private pure function cmp_elemConn_C0_S (nnode1, nnode2, p1, p2) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: p1 integer, intent(in) :: p2 Return Value integer, allocatable, (:,:) private pure function cmp_elemConn_C0_V (nnode1, nnode2, nnode3, p1, p2, p3) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: nnode3 integer, intent(in) :: p1 integer, intent(in) :: p2 integer, intent(in) :: p3 Return Value integer, allocatable, (:,:) public interface elemConn_Cn private pure subroutine cmp_elemConn_Cn_L (nnode, p, Xth, vecKnot_mul, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode integer, intent(in) :: p real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: vecKnot_mul (:) integer, intent(out), allocatable :: elemConn (:,:) private pure subroutine cmp_elemConn_Cn_S (nnode1, nnode2, p1, p2, Xth1, Xth2, vecKnot_mul1, vecKnot_mul2, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: p1 integer, intent(in) :: p2 real(kind=rk), intent(in), contiguous :: Xth1 (:) real(kind=rk), intent(in), contiguous :: Xth2 (:) integer, intent(in), contiguous :: vecKnot_mul1 (:) integer, intent(in), contiguous :: vecKnot_mul2 (:) integer, intent(out), allocatable :: elemConn (:,:) private pure subroutine cmp_elemConn_Cn_V (nnode1, nnode2, nnode3, p1, p2, p3, Xth1, Xth2, Xth3, vecKnot_mul1, vecKnot_mul2, vecKnot_mul3, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: nnode3 integer, intent(in) :: p1 integer, intent(in) :: p2 integer, intent(in) :: p3 real(kind=rk), intent(in), contiguous :: Xth1 (:) real(kind=rk), intent(in), contiguous :: Xth2 (:) real(kind=rk), intent(in), contiguous :: Xth3 (:) integer, intent(in), contiguous :: vecKnot_mul1 (:) integer, intent(in), contiguous :: vecKnot_mul2 (:) integer, intent(in), contiguous :: vecKnot_mul3 (:) integer, intent(out), allocatable :: elemConn (:,:) public interface ndgrid private pure subroutine ndgrid2 (X_dir1, X_dir2, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: X_dir1 (:) real(kind=rk), intent(in), contiguous :: X_dir2 (:) real(kind=rk), intent(out), allocatable :: Xt (:,:) private pure subroutine ndgrid3 (X_dir1, X_dir2, X_dir3, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: X_dir1 (:) real(kind=rk), intent(in), contiguous :: X_dir2 (:) real(kind=rk), intent(in), contiguous :: X_dir3 (:) real(kind=rk), intent(out), allocatable :: Xt (:,:) public interface unique private pure function unique_integer (vec) result(output) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in), dimension(:), contiguous :: vec Return Value integer, dimension(:), allocatable private pure function unique_real (vec) result(output) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), dimension(:), contiguous :: vec Return Value real(kind=rk), dimension(:), allocatable Functions public pure function basis_bernstein (Xt, nc) result(B) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: Xt integer, intent(in) :: nc Return Value real(kind=rk), allocatable, (:) public pure function basis_bspline (Xt, knot, nc, degree) result(B) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: Xt real(kind=rk), intent(in), contiguous :: knot (:) integer, intent(in) :: nc integer, intent(in) :: degree Return Value real(kind=rk), allocatable, (:) public pure function basis_bspline_der (Xt, knot, nc, degree) result(dB) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: Xt real(kind=rk), intent(in), contiguous :: knot (:) integer, intent(in) :: nc integer, intent(in) :: degree Return Value real(kind=rk), allocatable, (:) public pure function compute_knot_vector (Xth_dir, degree, continuity) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: Xth_dir (:) integer, intent(in) :: degree integer, intent(in), contiguous :: continuity (:) Return Value real(kind=rk), allocatable, (:) public pure function findspan (n, degree, Xth, knot) result(s) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: n integer, intent(in) :: degree real(kind=rk), intent(in) :: Xth real(kind=rk), intent(in), contiguous :: knot (:) Return Value integer public pure function hexahedron_Xc (L, nc) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: L (3) integer, intent(in) :: nc (3) Return Value real(kind=rk), allocatable, (:,:) public pure function kron (u, v) result(w) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: u (:) real(kind=rk), intent(in), contiguous :: v (:) Return Value real(kind=rk), (size(u)*size(v)) public pure function rotation (alpha, beta, theta) result(R) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta Return Value real(kind=rk), dimension(3,3) public pure function tetragon_Xc (L, nc) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: L (2) integer, intent(in) :: nc (2) Return Value real(kind=rk), allocatable, (:,:) private pure function bincoeff (n, k) result(b) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: n integer, intent(in) :: k Return Value real(kind=rk) private pure function cmp_elemConn_C0_L (nnode, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode integer, intent(in) :: p Return Value integer, allocatable, (:,:) private pure function cmp_elemConn_C0_S (nnode1, nnode2, p1, p2) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: p1 integer, intent(in) :: p2 Return Value integer, allocatable, (:,:) private pure function cmp_elemConn_C0_V (nnode1, nnode2, nnode3, p1, p2, p3) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: nnode3 integer, intent(in) :: p1 integer, intent(in) :: p2 integer, intent(in) :: p3 Return Value integer, allocatable, (:,:) private pure function compute_multiplicity1 (knot) result(multiplicity) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: knot (:) Return Value integer, allocatable, (:) private pure function compute_multiplicity2 (knot, Xth) result(multiplicity) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in) :: Xth Return Value integer private pure function factln (n) result(f) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: n Return Value real(kind=rk) private pure elemental function isinf (x) result(output) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: x Return Value logical private pure elemental function isnan (x) result(output) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: x Return Value logical private pure function repelem (a, b) result(c) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: a (:) integer, intent(in), contiguous :: b (:) Return Value real(kind=rk), (sum(b)) private pure function unique_integer (vec) result(output) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in), dimension(:), contiguous :: vec Return Value integer, dimension(:), allocatable private pure function unique_real (vec) result(output) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), dimension(:), contiguous :: vec Return Value real(kind=rk), dimension(:), allocatable Subroutines public pure subroutine elevate_degree_A_5_9 (t, knot, degree, Xcw, nc_new, knot_new, Xcw_new) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: t real(kind=rk), intent(in), contiguous :: knot (:) integer, intent(in) :: degree real(kind=rk), intent(in), contiguous :: Xcw (:,:) integer, intent(out) :: nc_new real(kind=rk), intent(out), allocatable :: knot_new (:) real(kind=rk), intent(out), allocatable :: Xcw_new (:,:) public pure subroutine insert_knot_A_5_1 (p, UP, Pw, u, k, s, r, nq, UQ, Qw) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: p real(kind=rk), intent(in), contiguous :: UP (0:) real(kind=rk), intent(in), contiguous :: Pw (0:,:) real(kind=rk), intent(in) :: u integer, intent(in) :: k integer, intent(in) :: s integer, intent(in) :: r integer, intent(out) :: nq real(kind=rk), intent(out), allocatable :: UQ (:) real(kind=rk), intent(out), allocatable :: Qw (:,:) public pure subroutine remove_knots_A_5_8 (p, knot, Pw, u, r, s, num, t, knot_new, Pw_new) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: p real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in), contiguous :: Pw (:,:) real(kind=rk), intent(in) :: u integer, intent(in) :: r integer, intent(in) :: s integer, intent(in) :: num integer, intent(out) :: t real(kind=rk), intent(out), allocatable :: knot_new (:) real(kind=rk), intent(out), allocatable :: Pw_new (:,:) private pure subroutine cmp_elemConn_Cn_L (nnode, p, Xth, vecKnot_mul, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode integer, intent(in) :: p real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: vecKnot_mul (:) integer, intent(out), allocatable :: elemConn (:,:) private pure subroutine cmp_elemConn_Cn_S (nnode1, nnode2, p1, p2, Xth1, Xth2, vecKnot_mul1, vecKnot_mul2, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: p1 integer, intent(in) :: p2 real(kind=rk), intent(in), contiguous :: Xth1 (:) real(kind=rk), intent(in), contiguous :: Xth2 (:) integer, intent(in), contiguous :: vecKnot_mul1 (:) integer, intent(in), contiguous :: vecKnot_mul2 (:) integer, intent(out), allocatable :: elemConn (:,:) private pure subroutine cmp_elemConn_Cn_V (nnode1, nnode2, nnode3, p1, p2, p3, Xth1, Xth2, Xth3, vecKnot_mul1, vecKnot_mul2, vecKnot_mul3, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name integer, intent(in) :: nnode1 integer, intent(in) :: nnode2 integer, intent(in) :: nnode3 integer, intent(in) :: p1 integer, intent(in) :: p2 integer, intent(in) :: p3 real(kind=rk), intent(in), contiguous :: Xth1 (:) real(kind=rk), intent(in), contiguous :: Xth2 (:) real(kind=rk), intent(in), contiguous :: Xth3 (:) integer, intent(in), contiguous :: vecKnot_mul1 (:) integer, intent(in), contiguous :: vecKnot_mul2 (:) integer, intent(in), contiguous :: vecKnot_mul3 (:) integer, intent(out), allocatable :: elemConn (:,:) private pure subroutine ndgrid2 (X_dir1, X_dir2, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: X_dir1 (:) real(kind=rk), intent(in), contiguous :: X_dir2 (:) real(kind=rk), intent(out), allocatable :: Xt (:,:) private pure subroutine ndgrid3 (X_dir1, X_dir2, X_dir3, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in), contiguous :: X_dir1 (:) real(kind=rk), intent(in), contiguous :: X_dir2 (:) real(kind=rk), intent(in), contiguous :: X_dir3 (:) real(kind=rk), intent(out), allocatable :: Xt (:,:)","tags":"","loc":"module/forcad_utils.html"},{"title":"forcad – ForCAD","text":"Uses forcad_nurbs_surface forcad_nurbs_curve forcad_utils forcad_nurbs_volume module~~forcad~~UsesGraph module~forcad forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Used by module~~forcad~~UsedByGraph module~forcad forcad program~example1_curve example1_curve program~example1_curve->module~forcad program~example3_surface example3_surface program~example3_surface->module~forcad program~example3_volume example3_volume program~example3_volume->module~forcad program~example_morph example_morph program~example_morph->module~forcad program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->module~forcad program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->module~forcad program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->module~forcad program~shape_circle shape_circle program~shape_circle->module~forcad program~shape_hexahedron shape_hexahedron program~shape_hexahedron->module~forcad program~shape_tetragon shape_tetragon program~shape_tetragon->module~forcad Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs.","tags":"","loc":"module/forcad.html"},{"title":"forcad_nurbs_surface – ForCAD","text":"This module defines the 'nurbs_surface' type for representing a Non-Uniform Rational B-Spline (NURBS) surface. Uses forcad_utils module~~forcad_nurbs_surface~~UsesGraph module~forcad_nurbs_surface forcad_nurbs_surface module~forcad_utils forcad_utils module~forcad_nurbs_surface->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Used by module~~forcad_nurbs_surface~~UsedByGraph module~forcad_nurbs_surface forcad_nurbs_surface module~forcad forcad module~forcad->module~forcad_nurbs_surface program~example1_curve example1_curve program~example1_curve->module~forcad program~example3_surface example3_surface program~example3_surface->module~forcad program~example3_volume example3_volume program~example3_volume->module~forcad program~example_morph example_morph program~example_morph->module~forcad program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->module~forcad program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->module~forcad program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->module~forcad program~shape_circle shape_circle program~shape_circle->module~forcad program~shape_hexahedron shape_hexahedron program~shape_hexahedron->module~forcad program~shape_tetragon shape_tetragon program~shape_tetragon->module~forcad Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Derived Types type, public :: nurbs_surface Components Type Visibility Attributes Name Initial real(kind=rk), private, allocatable :: Wc (:) Weights for control points (1D array: [nc(1)*nc(2)]) real(kind=rk), private, allocatable :: Xc (:,:) Control points (2D array: [nc(1)*nc(2), dim]) real(kind=rk), private, allocatable :: Xg (:,:) Geometry points (2D array: [ng(1)*ng(2), dim]) real(kind=rk), private, allocatable :: Xt1 (:) Evaluation parameter values in the first direction (1D array: [ng(1)]) real(kind=rk), private, allocatable :: Xt2 (:) Evaluation parameter values in the second direction (1D array: [ng(2)]) integer, private :: degree (2) Degree (order) of the surface integer, private, allocatable :: elemConn (:,:) IGA element connectivity integer, private, allocatable :: elemConn_Xc_vis (:,:) Connectivity for visualization of control points integer, private, allocatable :: elemConn_Xg_vis (:,:) Connectivity for visualization of geometry points real(kind=rk), private, allocatable :: knot1 (:) Knot vector in the first direction (1D array) real(kind=rk), private, allocatable :: knot2 (:) Knot vector in the second direction (1D array) integer, private :: nc (2) Number of control points in each direction integer, private :: ng (2) Number of geometry points in each direction Type-Bound Procedures procedure, public :: basis Compute the basis functions of the NURBS surface Read more… procedure, public :: cmp_elem Generate IGA element connectivity Read more… procedure, public :: cmp_elem_Xc_vis Generate connectivity for control points Read more… procedure, public :: cmp_elem_Xg_vis Generate connectivity for geometry points Read more… procedure, public :: create Generate geometry points Read more… procedure, public :: derivative Compute the derivative of the NURBS surface Read more… procedure, public :: elevate_degree Elevate degree Read more… procedure, public :: export_Xc Export control points to VTK file Read more… procedure, public :: export_Xg Export geometry points to VTK file Read more… procedure, public :: finalize Finalize the NURBS surface object Read more… generic, public :: get_Wc => get_Wc_all , get_Wci Get weights Read more… generic, public :: get_Xc => get_Xc_all , get_Xci , get_Xcid Get control points Read more… generic, public :: get_Xg => get_Xg_all , get_Xgi , get_Xgid Get geometry points Read more… procedure, public :: get_Xt Get parameter values Read more… procedure, public :: get_continuity Get continuity of the surface Read more… generic, public :: get_degree => get_degree_all , get_degree_dir Get degree of the NURBS surface Read more… procedure, public :: get_elem Get IGA element connectivity Read more… procedure, public :: get_elem_Xc_vis Get connectivity for control points Read more… procedure, public :: get_elem_Xg_vis Get connectivity for geometry points Read more… generic, public :: get_knot => get_knoti , get_knot_all Get knot vector Read more… procedure, public :: get_multiplicity Get multiplicity of the knot vector Read more… procedure, public :: get_nc Get number of required control points Read more… procedure, public :: get_ng Get number of geometry points Read more… procedure, public :: insert_knots Insert knots into the knot vector Read more… procedure, public :: is_rational Check if the NURBS surface is rational Read more… procedure, public :: modify_Wc Modify weights Read more… procedure, public :: modify_Xc Modify control points Read more… procedure, public :: remove_knots Remove knots from the knot vector Read more… procedure, public :: rotate_Xc Rotate control points Read more… procedure, public :: rotate_Xg Rotate geometry points Read more… generic, public :: set => set1 , set2 , set3 Set NURBS surface Read more… procedure, public :: set1 Set knot vectors, control points and weights for the NURBS surface object Read more… procedure, public :: set2 Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights Read more… procedure, public :: set3 Set Bezier or Rational Bezier surface using control points and weights Read more… procedure, public :: set_elem Set IGA element connectivity Read more… procedure, public :: set_elem_Xc_vis Set connectivity for control points Read more… procedure, public :: set_elem_Xg_vis Set connectivity for geometry points Read more… procedure, public :: set_tetragon Set a tetragon Read more… procedure, public :: show Show the NURBS object using PyVista Read more… procedure, public :: translate_Xc Translate control points Read more… procedure, public :: translate_Xg Translate geometry points Read more… procedure, private :: get_Wc_all Get all weights Read more… procedure, private :: get_Wci Get i-th weight Read more… procedure, private :: get_Xc_all Get all control points Read more… procedure, private :: get_Xci Get i-th control point Read more… procedure, private :: get_Xcid Get i-th control point in a specific direction Read more… procedure, private :: get_Xg_all Get all geometry points Read more… procedure, private :: get_Xgi Get i-th geometry point Read more… procedure, private :: get_Xgid Get i-th geometry point in a specific direction Read more… procedure, private :: get_degree_all Get degree of the NURBS surface in both directions Read more… procedure, private :: get_degree_dir Get degree of the NURBS surface in a specific direction Read more… procedure, private :: get_knot_all Get all knot vectors Read more… procedure, private :: get_knoti Get i-th knot value Read more… Functions private pure function cmp_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function cmp_elem_Xc_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) private pure function cmp_elem_Xg_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) private pure function get_Wc_all (this) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) private pure function get_Wci (this, n) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk) private pure function get_Xc_all (this) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xci (this, n) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) private pure function get_Xcid (this, n, dir) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) private pure function get_Xg_all (this) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xgi (this, n) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) private pure function get_Xgid (this, n, dir) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) private pure function get_Xt (this, dir) result(Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) private pure function get_continuity (this, dir) result(c) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) private pure function get_degree_all (this) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, (2) private pure function get_degree_dir (this, dir) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer private pure function get_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_elem_Xc_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_elem_Xg_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_knot_all (this, dir) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) private pure function get_knoti (this, dir, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir integer, intent(in) :: i Return Value real(kind=rk) private pure function get_multiplicity (this, dir) result(m) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) private pure function get_nc (this, dir) result(nc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this integer, intent(in) :: dir Return Value integer private pure function get_ng (this) result(ng) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value integer, (2) private pure function is_rational (this) result(r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this Return Value logical Subroutines private pure subroutine basis (this, res1, res2, Xt1, Xt2, Tgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) private pure subroutine create (this, res1, res2, Xt1, Xt2, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt (:,:) private pure subroutine derivative (this, res1, res2, Xt1, Xt2, dTgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) private pure subroutine elevate_degree (this, dir, t) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir integer, intent(in) :: t private impure subroutine export_Xc (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this character(len=*), intent(in) :: filename private impure subroutine export_Xg (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(in) :: this character(len=*), intent(in) :: filename private pure subroutine finalize (this) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this private pure subroutine insert_knots (this, dir, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) private pure subroutine modify_Wc (this, W, num) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num private pure subroutine modify_Xc (this, X, num, dir) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir private pure subroutine remove_knots (this, dir, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) private pure subroutine rotate_Xc (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta private pure subroutine rotate_Xg (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta private pure subroutine set1 (this, knot1, knot2, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set knot vectors, control points and weights for the NURBS surface object. Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot1 (:) real(kind=rk), intent(in), contiguous :: knot2 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set2 (this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir1 (:) real(kind=rk), intent(in), contiguous :: Xth_dir2 (:) integer, intent(in), contiguous :: degree (:) integer, intent(in), contiguous :: continuity1 (:) integer, intent(in), contiguous :: continuity2 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set3 (this, nc, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier surface using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set_elem (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine set_elem_Xc_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine set_elem_Xg_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine set_tetragon (this, L, nc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: L (2) integer, intent(in) :: nc (2) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private impure subroutine show (this, vtkfile_Xc, vtkfile_Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg private pure subroutine translate_Xc (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) private pure subroutine translate_Xg (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_surface ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:)","tags":"","loc":"module/forcad_nurbs_surface.html"},{"title":"forcad_nurbs_curve – ForCAD","text":"This module defines the 'nurbs_curve' type for representing a Non-Uniform Rational B-Spline (NURBS) curve. Uses forcad_utils module~~forcad_nurbs_curve~~UsesGraph module~forcad_nurbs_curve forcad_nurbs_curve module~forcad_utils forcad_utils module~forcad_nurbs_curve->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Used by module~~forcad_nurbs_curve~~UsedByGraph module~forcad_nurbs_curve forcad_nurbs_curve module~forcad forcad module~forcad->module~forcad_nurbs_curve program~example1_curve example1_curve program~example1_curve->module~forcad program~example3_surface example3_surface program~example3_surface->module~forcad program~example3_volume example3_volume program~example3_volume->module~forcad program~example_morph example_morph program~example_morph->module~forcad program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->module~forcad program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->module~forcad program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->module~forcad program~shape_circle shape_circle program~shape_circle->module~forcad program~shape_hexahedron shape_hexahedron program~shape_hexahedron->module~forcad program~shape_tetragon shape_tetragon program~shape_tetragon->module~forcad Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Derived Types type, public :: nurbs_curve Components Type Visibility Attributes Name Initial real(kind=rk), private, allocatable :: Wc (:) Weights for control points (1D array: [nc]) real(kind=rk), private, allocatable :: Xc (:,:) Control points (2D array: [nc, dim]) real(kind=rk), private, allocatable :: Xg (:,:) Geometry points (2D array: [ng, dim]) real(kind=rk), private, allocatable :: Xt (:) Evaluation points (1D array: [ng]) integer, private :: degree Degree (order) of the curve integer, private, allocatable :: elemConn (:,:) IGA element connectivity integer, private, allocatable :: elemConn_Xc_vis (:,:) Connectivity for visualization of control points integer, private, allocatable :: elemConn_Xg_vis (:,:) Connectivity for visualization of geometry points real(kind=rk), private, allocatable :: knot (:) Knot vector (1D array) integer, private :: nc Number of control points integer, private :: ng Number of geometry points Type-Bound Procedures procedure, public :: basis Compute the basis functions of the NURBS curve Read more… procedure, public :: cmp_elem Generate IGA element connectivity Read more… procedure, public :: cmp_elem_Xc_vis Generate connectivity for control points Read more… procedure, public :: cmp_elem_Xg_vis Generate connectivity for geometry points Read more… procedure, public :: create Generate geometry points Read more… procedure, public :: derivative Compute the derivative of the NURBS curve Read more… procedure, public :: elevate_degree Elevate the degree of the curve Read more… procedure, public :: export_Xc Export control points to VTK file Read more… procedure, public :: export_Xg Export geometry points to VTK file Read more… procedure, public :: finalize Finalize the NURBS curve object Read more… generic, public :: get_Wc => get_Wc_all , get_Wci Get weights Read more… generic, public :: get_Xc => get_Xc_all , get_Xci , get_Xcid Get control points Read more… generic, public :: get_Xg => get_Xg_all , get_Xgi , get_Xgid Get geometry points Read more… procedure, public :: get_Xt Get parameter values Read more… procedure, public :: get_continuity Get continuity of the curve Read more… procedure, public :: get_degree Get degree of the NURBS curve Read more… procedure, public :: get_elem Get IGA element connectivity Read more… procedure, public :: get_elem_Xc_vis Get connectivity for control points Read more… procedure, public :: get_elem_Xg_vis Get connectivity for geometry points Read more… generic, public :: get_knot => get_knoti , get_knot_all Get knot vector Read more… procedure, public :: get_multiplicity Get multiplicity of the knot vector Read more… procedure, public :: get_nc Get number of required control points Read more… procedure, public :: get_ng Get number of geometry points Read more… procedure, public :: insert_knots Insert knots into the knot vector Read more… procedure, public :: is_rational Check if the NURBS curve is rational Read more… procedure, public :: modify_Wc Modify weights Read more… procedure, public :: modify_Xc Modify control points Read more… procedure, public :: remove_knots Remove knots from the knot vector Read more… procedure, public :: rotate_Xc Rotate control points Read more… procedure, public :: rotate_Xg Rotate geometry points Read more… generic, public :: set => set1 , set2 , set3 Set NURBS curve Read more… procedure, public :: set1 Set knot vector, control points and weights for the NURBS curve object Read more… procedure, public :: set2 Set NURBS curve using nodes of parameter space, degree, continuity, control points and weights Read more… procedure, public :: set3 Set Bezier or Rational Bezier curve using control points and weights Read more… procedure, public :: set_circle Set a circle Read more… procedure, public :: set_elem Set IGA element connectivity Read more… procedure, public :: set_elem_Xc_vis Set connectivity for control points Read more… procedure, public :: set_elem_Xg_vis Set connectivity for geometry points Read more… procedure, public :: show Show the NURBS object using PyVista Read more… procedure, public :: translate_Xc Translate control points Read more… procedure, public :: translate_Xg Translate geometry points Read more… procedure, private :: get_Wc_all Get all weights Read more… procedure, private :: get_Wci Get i-th weight Read more… procedure, private :: get_Xc_all Get all control points Read more… procedure, private :: get_Xci Get i-th control point Read more… procedure, private :: get_Xcid Get i-th control point in a specific direction Read more… procedure, private :: get_Xg_all Get all geometry points Read more… procedure, private :: get_Xgi Get i-th geometry point Read more… procedure, private :: get_Xgid Get i-th geometry point in a specific direction Read more… procedure, private :: get_knot_all Get all knot vectors Read more… procedure, private :: get_knoti Get i-th knot value Read more… Functions private pure function cmp_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function cmp_elem_Xc_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in), optional :: p Return Value integer, allocatable, (:,:) private pure function cmp_elem_Xg_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in), optional :: p Return Value integer, allocatable, (:,:) private pure function get_Wc_all (this) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) private pure function get_Wci (this, n) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk) private pure function get_Xc_all (this) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xci (this, n) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) private pure function get_Xcid (this, n, dir) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) private pure function get_Xg_all (this) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xgi (this, n) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) private pure function get_Xgid (this, n, dir) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) private pure function get_Xt (this) result(Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) private pure function get_continuity (this) result(c) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:) private pure function get_degree (this) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer private pure function get_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_elem_Xc_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_elem_Xg_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_knot_all (this) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) private pure function get_knoti (this, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this integer, intent(in) :: i Return Value real(kind=rk) private pure function get_multiplicity (this) result(m) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer, allocatable, (:) private pure function get_nc (this) result(nc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer private pure function get_ng (this) result(ng) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value integer private pure function is_rational (this) result(r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this Return Value logical Subroutines private pure subroutine basis (this, res, Xt, Tgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) private pure subroutine create (this, res, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) private pure subroutine derivative (this, res, Xt, dTgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), optional :: res real(kind=rk), intent(in), optional, contiguous :: Xt (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) private pure subroutine elevate_degree (this, t) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in) :: t private impure subroutine export_Xc (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this character(len=*), intent(in) :: filename private impure subroutine export_Xg (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(in) :: this character(len=*), intent(in) :: filename private pure subroutine finalize (this) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this private pure subroutine insert_knots (this, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) private pure subroutine modify_Wc (this, W, num) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num private pure subroutine modify_Xc (this, X, num, dir) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir private pure subroutine remove_knots (this, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) private pure subroutine rotate_Xc (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta private pure subroutine rotate_Xg (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta private pure subroutine set1 (this, knot, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set knot vector, control points and weights for the NURBS curve object. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set2 (this, Xth_dir, degree, continuity, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir (:) integer, intent(in) :: degree integer, intent(in), contiguous :: continuity (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set3 (this, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier curve using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set_circle (this, center, radius) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: center (:) real(kind=rk), intent(in) :: radius private pure subroutine set_elem (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine set_elem_Xc_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine set_elem_Xg_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private impure subroutine show (this, vtkfile_Xc, vtkfile_Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg private pure subroutine translate_Xc (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) private pure subroutine translate_Xg (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_curve ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:)","tags":"","loc":"module/forcad_nurbs_curve.html"},{"title":"forcad_nurbs_volume – ForCAD","text":"This module defines the 'nurbs_volume' type for representing a Non-Uniform Rational B-Spline (NURBS) volume. Uses forcad_utils module~~forcad_nurbs_volume~~UsesGraph module~forcad_nurbs_volume forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Used by module~~forcad_nurbs_volume~~UsedByGraph module~forcad_nurbs_volume forcad_nurbs_volume module~forcad forcad module~forcad->module~forcad_nurbs_volume program~example1_curve example1_curve program~example1_curve->module~forcad program~example3_surface example3_surface program~example3_surface->module~forcad program~example3_volume example3_volume program~example3_volume->module~forcad program~example_morph example_morph program~example_morph->module~forcad program~example_nurbs_curve example_nurbs_curve program~example_nurbs_curve->module~forcad program~example_nurbs_surface example_nurbs_surface program~example_nurbs_surface->module~forcad program~example_nurbs_volume example_nurbs_volume program~example_nurbs_volume->module~forcad program~shape_circle shape_circle program~shape_circle->module~forcad program~shape_hexahedron shape_hexahedron program~shape_hexahedron->module~forcad program~shape_tetragon shape_tetragon program~shape_tetragon->module~forcad Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Derived Types type, public :: nurbs_volume Components Type Visibility Attributes Name Initial real(kind=rk), private, allocatable :: Wc (:) Weights for the control points (1D array: [nc(1) nc(2) nc(3)]) real(kind=rk), private, allocatable :: Xc (:,:) Control points (2D array: [nc(1) nc(2) nc(3), dim]) real(kind=rk), private, allocatable :: Xg (:,:) Geometry points (2D array: [ng(1) ng(2) ng(3), dim]) real(kind=rk), private, allocatable :: Xt1 (:) Evaluation parameter values in the first direction (1D array: [ng(1)]) real(kind=rk), private, allocatable :: Xt2 (:) Evaluation parameter values in the second direction (1D array: [ng(2)]) real(kind=rk), private, allocatable :: Xt3 (:) Evaluation parameter values in the third direction (1D array: [ng(3)]) integer, private :: degree (3) Degree (order) of the volume integer, private, allocatable :: elemConn (:,:) IGA element connectivity integer, private, allocatable :: elemConn_Xc_vis (:,:) Connectivity for visualization of control points integer, private, allocatable :: elemConn_Xg_vis (:,:) Connectivity for visualization of geometry points real(kind=rk), private, allocatable :: knot1 (:) Knot vector in the first direction (1D array) real(kind=rk), private, allocatable :: knot2 (:) Knot vector in the second direction (1D array) real(kind=rk), private, allocatable :: knot3 (:) Knot vector in the third direction (1D array) integer, private :: nc (3) Number of control points in each direction integer, private :: ng (3) Number of geometry points in each direction Type-Bound Procedures procedure, public :: basis Compute the basis functions of the NURBS volume Read more… procedure, public :: cmp_elem Generate IGA element connectivity Read more… procedure, public :: cmp_elem_Xc_vis Generate connectivity for control points Read more… procedure, public :: cmp_elem_Xg_vis Generate connectivity for geometry points Read more… procedure, public :: create Generate geometry points Read more… procedure, public :: derivative Compute the derivative of the NURBS volume Read more… procedure, public :: elevate_degree Elevate the degree of the NURBS volume Read more… procedure, public :: export_Xc Export control points to VTK file Read more… procedure, public :: export_Xg Export geometry points to VTK file Read more… procedure, public :: finalize Finalize the NURBS volume object Read more… generic, public :: get_Wc => get_Wc_all , get_Wci Get weights Read more… generic, public :: get_Xc => get_Xc_all , get_Xci , get_Xcid Get control points Read more… generic, public :: get_Xg => get_Xg_all , get_Xgi , get_Xgid Get geometry points Read more… procedure, public :: get_Xt Get parameter values Read more… procedure, public :: get_continuity Get continuity of the volume Read more… generic, public :: get_degree => get_degree_all , get_degree_dir Get degree of the NURBS volume Read more… procedure, public :: get_elem Get IGA element connectivity Read more… procedure, public :: get_elem_Xc_vis Get connectivity for control points Read more… procedure, public :: get_elem_Xg_vis Get connectivity for geometry points Read more… generic, public :: get_knot => get_knoti , get_knot_all Get knot vector Read more… procedure, public :: get_multiplicity Get multiplicity of the knot vector Read more… procedure, public :: get_nc Get number of required control points Read more… procedure, public :: get_ng Get number of geometry points Read more… procedure, public :: insert_knots Insert knots into the knot vector Read more… procedure, public :: is_rational Check if the NURBS volume is rational Read more… procedure, public :: modify_Wc Modify weights Read more… procedure, public :: modify_Xc Modify control points Read more… procedure, public :: put_to_nurbs Put a shape to a NURBS volume Read more… procedure, public :: remove_knots Remove knots from the knot vector Read more… procedure, public :: rotate_Xc Rotate control points Read more… procedure, public :: rotate_Xg Rotate geometry points Read more… generic, public :: set => set1 , set2 , set3 Set NURBS volume Read more… procedure, public :: set1 Set knot vectors, control points and weights for the NURBS volume object Read more… procedure, public :: set2 Set NURBS volume using nodes of parameter space, degree, continuity, control points and weights Read more… procedure, public :: set3 Set Bezier or Rational Bezier volume using control points and weights Read more… procedure, public :: set_elem Set IGA element connectivity Read more… procedure, public :: set_elem_Xc_vis Set connectivity for control points Read more… procedure, public :: set_elem_Xg_vis Set connectivity for geometry points Read more… procedure, public :: set_hexahedron Set a hexahedron Read more… procedure, public :: show Show the NURBS object using PyVista Read more… procedure, public :: translate_Xc Translate control points Read more… procedure, public :: translate_Xg Translate geometry points Read more… procedure, private :: get_Wc_all Get all weights Read more… procedure, private :: get_Wci Get i-th weight Read more… procedure, private :: get_Xc_all Get all control points Read more… procedure, private :: get_Xci Get i-th control point Read more… procedure, private :: get_Xcid Get i-th control point in a specific direction Read more… procedure, private :: get_Xg_all Get all geometry points Read more… procedure, private :: get_Xgi Get i-th geometry point Read more… procedure, private :: get_Xgid Get i-th geometry point in a specific direction Read more… procedure, private :: get_degree_all Get degree of the NURBS volume in all directions Read more… procedure, private :: get_degree_dir Get degree of the NURBS volume in a specific direction Read more… procedure, private :: get_knot_all Get all knot vectors Read more… procedure, private :: get_knoti Get i-th knot value Read more… Functions private pure function cmp_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function cmp_elem_Xc_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) private pure function cmp_elem_Xg_vis (this, p) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in), optional, contiguous :: p (:) Return Value integer, allocatable, (:,:) private pure function get_Wc_all (this) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:) private pure function get_Wci (this, n) result(Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk) private pure function get_Xc_all (this) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xci (this, n) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) private pure function get_Xcid (this, n, dir) result(Xc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) private pure function get_Xg_all (this) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value real(kind=rk), allocatable, (:,:) private pure function get_Xgi (this, n) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n Return Value real(kind=rk), allocatable, (:) private pure function get_Xgid (this, n, dir) result(Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: n integer, intent(in) :: dir Return Value real(kind=rk) private pure function get_Xt (this, dir) result(Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) private pure function get_continuity (this, dir) result(c) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) private pure function get_degree_all (this) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, (3) private pure function get_degree_dir (this, dir) result(degree) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer private pure function get_elem (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_elem_Xc_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_elem_Xg_vis (this) result(elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, allocatable, (:,:) private pure function get_knot_all (this, dir) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value real(kind=rk), allocatable, (:) private pure function get_knoti (this, dir, i) result(knot) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir integer, intent(in) :: i Return Value real(kind=rk) private pure function get_multiplicity (this, dir) result(m) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer, allocatable, (:) private pure function get_nc (this, dir) result(nc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this integer, intent(in) :: dir Return Value integer private pure function get_ng (this) result(ng) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value integer, (3) private pure function is_rational (this) result(r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this Return Value logical Subroutines private pure subroutine basis (this, res1, res2, res3, Xt1, Xt2, Xt3, Tgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(out), allocatable :: Tgc (:,:) private pure subroutine create (this, res1, res2, res3, Xt1, Xt2, Xt3, Xt) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(in), optional, contiguous :: Xt (:,:) private pure subroutine derivative (this, res1, res2, res3, Xt1, Xt2, Xt3, dTgc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), optional :: res1 integer, intent(in), optional :: res2 integer, intent(in), optional :: res3 real(kind=rk), intent(in), optional, contiguous :: Xt1 (:) real(kind=rk), intent(in), optional, contiguous :: Xt2 (:) real(kind=rk), intent(in), optional, contiguous :: Xt3 (:) real(kind=rk), intent(out), allocatable :: dTgc (:,:) private pure subroutine elevate_degree (this, dir, t) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir integer, intent(in) :: t private impure subroutine export_Xc (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this character(len=*), intent(in) :: filename private impure subroutine export_Xg (this, filename) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(in) :: this character(len=*), intent(in) :: filename private pure subroutine finalize (this) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this private pure subroutine insert_knots (this, dir, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) private pure subroutine modify_Wc (this, W, num) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: W integer, intent(in) :: num private pure subroutine modify_Xc (this, X, num, dir) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: X integer, intent(in) :: num integer, intent(in) :: dir private pure subroutine put_to_nurbs (this, X, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: X (:,:) integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine remove_knots (this, dir, Xth, r) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in) :: dir real(kind=rk), intent(in), contiguous :: Xth (:) integer, intent(in), contiguous :: r (:) private pure subroutine rotate_Xc (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta private pure subroutine rotate_Xg (this, alpha, beta, theta) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: alpha real(kind=rk), intent(in) :: beta real(kind=rk), intent(in) :: theta private pure subroutine set1 (this, knot1, knot2, knot3, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set control points and weights for the NURBS volume object. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: knot1 (:) real(kind=rk), intent(in), contiguous :: knot2 (:) real(kind=rk), intent(in), contiguous :: knot3 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set2 (this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set control points and weights for the NURBS volume object. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: Xth_dir1 (:) real(kind=rk), intent(in), contiguous :: Xth_dir2 (:) real(kind=rk), intent(in), contiguous :: Xth_dir3 (:) integer, intent(in), contiguous :: degree (:) integer, intent(in), contiguous :: continuity1 (:) integer, intent(in), contiguous :: continuity2 (:) integer, intent(in), contiguous :: continuity3 (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set3 (this, nc, Xc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Set Bezier or Rational Bezier volume using control points and weights. Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), contiguous :: Xc (:,:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private pure subroutine set_elem (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine set_elem_Xc_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine set_elem_Xg_vis (this, elemConn) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this integer, intent(in), contiguous :: elemConn (:,:) private pure subroutine set_hexahedron (this, L, nc, Wc) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in), contiguous :: L (:) integer, intent(in), contiguous :: nc (:) real(kind=rk), intent(in), optional, contiguous :: Wc (:) private impure subroutine show (this, vtkfile_Xc, vtkfile_Xg) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this character(len=*), intent(in) :: vtkfile_Xc character(len=*), intent(in) :: vtkfile_Xg private pure subroutine translate_Xc (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:) private pure subroutine translate_Xg (this, vec) Author Seyed Ali Ghasemi License BSD 3-Clause Arguments Type Intent Optional Attributes Name class( nurbs_volume ), intent(inout) :: this real(kind=rk), intent(in) :: vec (:)","tags":"","loc":"module/forcad_nurbs_volume.html"},{"title":"example_nurbs_surface – ForCAD","text":"Uses forcad program~~example_nurbs_surface~~UsesGraph program~example_nurbs_surface example_nurbs_surface module~forcad forcad program~example_nurbs_surface->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. This program demonstrates the usage of a NURBS surface object to create, and finalize a NURBS surface.\nIt sets up control points and weights, generates the surface, and exports the control points\nand the surface to VTK files at various stages. Define control points for the NURBS surface Define weights for the control points Set control points and weights for the NURBS surface object Export initial control points to a VTK file Generate the NURBS surface with a resolution of 30x30 Export the generated surface to a VTK file Show the control geometry and geometry using PyVista Finalize the NURBS surface object Calls program~~example_nurbs_surface~~CallsGraph program~example_nurbs_surface example_nurbs_surface none~set nurbs_surface%set program~example_nurbs_surface->none~set proc~create nurbs_surface%create program~example_nurbs_surface->proc~create proc~export_xc nurbs_surface%export_Xc program~example_nurbs_surface->proc~export_xc proc~export_xg nurbs_surface%export_Xg program~example_nurbs_surface->proc~export_xg proc~finalize nurbs_surface%finalize program~example_nurbs_surface->proc~finalize proc~generate_xc generate_Xc program~example_nurbs_surface->proc~generate_xc proc~show nurbs_surface%show program~example_nurbs_surface->proc~show proc~set1 nurbs_surface%set1 none~set->proc~set1 proc~set2 nurbs_surface%set2 none~set->proc~set2 proc~set3 nurbs_surface%set3 none~set->proc~set3 interface~ndgrid ndgrid proc~create->interface~ndgrid proc~basis_bspline basis_bspline proc~create->proc~basis_bspline proc~is_rational nurbs_surface%is_rational proc~create->proc~is_rational proc~kron kron proc~create->proc~kron proc~cmp_elem_xc_vis nurbs_surface%cmp_elem_Xc_vis proc~export_xc->proc~cmp_elem_xc_vis proc~cmp_elem_xg_vis nurbs_surface%cmp_elem_Xg_vis proc~export_xg->proc~cmp_elem_xg_vis proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elem_xg_vis->interface~elemconn_c0 none~get_degree nurbs_surface%get_degree proc~set1->none~get_degree proc~get_nc nurbs_surface%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~get_degree_all nurbs_surface%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_surface%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity nurbs_surface%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables 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_surface ) :: nurbs Declare a NURBS surface object Functions function generate_Xc (num_rows, num_cols, peak_height) result(control_points) Arguments Type Intent Optional Attributes Name integer, intent(in) :: num_rows integer, intent(in) :: num_cols real(kind=rk), intent(in) :: peak_height Return Value real(kind=rk), allocatable, (:,:) Source Code program example_nurbs_surface use forcad , only : rk , nurbs_surface implicit none type ( nurbs_surface ) :: nurbs !! Declare a NURBS surface object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights !----------------------------------------------------------------------------- ! Setting up the NURBS surface !----------------------------------------------------------------------------- !> Define control points for the NURBS surface Xc = generate_Xc ( 10 , 10 , 1.5_rk ) !> Define weights for the control points allocate ( Wc ( size ( Xc , 1 )), source = 1.0_rk ) !> Set control points and weights for the NURBS surface object call nurbs % set ([ 10 , 10 ], Xc , Wc ) !> Export initial control points to a VTK file call nurbs % export_Xc ( 'vtk/demo_surface_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS surface !----------------------------------------------------------------------------- !> Generate the NURBS surface with a resolution of 30x30 call nurbs % create ( res1 = 30 , res2 = 30 ) !> Export the generated surface to a VTK file call nurbs % export_Xg ( 'vtk/demo_surface_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_surface_Xc.vtk' , 'vtk/demo_surface_Xg.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS surface object call nurbs % finalize () contains !----------------------------------------------------------------------------- function generate_Xc ( num_rows , num_cols , peak_height ) result ( control_points ) integer , intent ( in ) :: num_rows , num_cols real ( rk ), intent ( in ) :: peak_height real ( rk ), allocatable :: control_points (:,:) integer :: i , j real ( rk ) :: x_spacing , y_spacing , x_offset , y_offset x_spacing = 1.0_rk / real ( num_cols - 1 , rk ) y_spacing = 1.0_rk / real ( num_rows - 1 , rk ) x_offset = - 0.5_rk y_offset = - 0.5_rk allocate ( control_points ( num_rows * num_cols , 3 )) do i = 1 , num_rows do j = 1 , num_cols control_points (( i - 1 ) * num_cols + j , 1 ) = x_offset + real ( j - 1 , rk ) * x_spacing control_points (( i - 1 ) * num_cols + j , 2 ) = y_offset + real ( i - 1 , rk ) * y_spacing control_points (( i - 1 ) * num_cols + j , 3 ) = & peak_height * exp ( - (( control_points (( i - 1 ) * num_cols + j , 1 ) ** 2 ) & + ( control_points (( i - 1 ) * num_cols + j , 2 ) ** 2 ))) + 0.5_rk * peak_height * 0.2_rk end do end do end function !----------------------------------------------------------------------------- end program example_nurbs_surface","tags":"","loc":"program/example_nurbs_surface.html"},{"title":"example_nurbs_volume – ForCAD","text":"Uses forcad program~~example_nurbs_volume~~UsesGraph program~example_nurbs_volume example_nurbs_volume module~forcad forcad program~example_nurbs_volume->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. This program demonstrates the usage of a NURBS volume object to create, and finalize a NURBS volume.\nIt sets up control points and weights, generates the volume, and exports the control points\nand the volume to VTK files at various stages. Define control points for the NURBS volume Define weights for the control points Set control points and weights for the NURBS volume object Export initial control points to a VTK file Generate the NURBS volume with a resolution of 15X15X15 Export the generated volume to a VTK file Show the control geometry and geometry using PyVista Finalize the NURBS volume object Calls program~~example_nurbs_volume~~CallsGraph program~example_nurbs_volume example_nurbs_volume none~set~3 nurbs_volume%set program~example_nurbs_volume->none~set~3 proc~create~3 nurbs_volume%create program~example_nurbs_volume->proc~create~3 proc~export_xc~3 nurbs_volume%export_Xc program~example_nurbs_volume->proc~export_xc~3 proc~export_xg~3 nurbs_volume%export_Xg program~example_nurbs_volume->proc~export_xg~3 proc~finalize~3 nurbs_volume%finalize program~example_nurbs_volume->proc~finalize~3 proc~generate_xc~2 generate_Xc program~example_nurbs_volume->proc~generate_xc~2 proc~show~3 nurbs_volume%show program~example_nurbs_volume->proc~show~3 proc~set1~3 nurbs_volume%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_volume%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_volume%set3 none~set~3->proc~set3~3 interface~ndgrid ndgrid proc~create~3->interface~ndgrid proc~basis_bspline basis_bspline proc~create~3->proc~basis_bspline proc~kron kron proc~create~3->proc~kron proc~cmp_elem_xc_vis~3 nurbs_volume%cmp_elem_Xc_vis proc~export_xc~3->proc~cmp_elem_xc_vis~3 proc~cmp_elem_xg_vis~3 nurbs_volume%cmp_elem_Xg_vis proc~export_xg~3->proc~cmp_elem_xg_vis~3 proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elem_xg_vis~3->interface~elemconn_c0 none~get_degree~3 nurbs_volume%get_degree proc~set1~3->none~get_degree~3 proc~get_nc~3 nurbs_volume%get_nc proc~set1~3->proc~get_nc~3 proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set2~3->proc~get_nc~3 proc~set3~3->none~get_degree~3 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~get_degree_all~2 nurbs_volume%get_degree_all none~get_degree~3->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_volume%get_degree_dir none~get_degree~3->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~3 proc~get_degree_dir~2->proc~get_multiplicity~3 proc~get_multiplicity~3->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables 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_volume ) :: nurbs Declare a NURBS volume object Functions function generate_Xc (L) result(control_points) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: L Return Value real(kind=rk), allocatable, (:,:) Source Code program example_nurbs_volume use forcad , only : rk , nurbs_volume implicit none type ( nurbs_volume ) :: nurbs !! Declare a NURBS volume object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights !----------------------------------------------------------------------------- ! Setting up the NURBS volume !----------------------------------------------------------------------------- !> Define control points for the NURBS volume Xc = generate_Xc ( 1.0_rk ) !> Define weights for the control points allocate ( Wc ( size ( Xc , 1 )), source = 1.0_rk ) !> Set control points and weights for the NURBS volume object call nurbs % set ([ 2 , 2 , 2 ], Xc , Wc ) !> Export initial control points to a VTK file call nurbs % export_Xc ( 'vtk/demo_volume_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS volume !----------------------------------------------------------------------------- !> Generate the NURBS volume with a resolution of 15X15X15 call nurbs % create ( 15 , 15 , 15 ) !> Export the generated volume to a VTK file call nurbs % export_Xg ( 'vtk/demo_volume_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_volume_Xc.vtk' , 'vtk/demo_volume_Xg.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS volume object call nurbs % finalize () contains !----------------------------------------------------------------------------- function generate_Xc ( L ) result ( control_points ) implicit none real ( rk ), intent ( in ) :: L real ( rk ), allocatable :: control_points (:,:) real ( rk ) :: L2 L2 = L / 2.0_rk allocate ( control_points ( 8 , 3 )) control_points ( 1 ,:) = [ L2 , - L2 , L2 ] control_points ( 2 ,:) = [ L2 , - L2 , - L2 ] control_points ( 3 ,:) = [ - L2 , - L2 , L2 ] control_points ( 4 ,:) = [ - L2 , - L2 , - L2 ] control_points ( 5 ,:) = [ L2 , L2 , L2 ] control_points ( 6 ,:) = [ L2 , L2 , - L2 ] control_points ( 7 ,:) = [ - L2 , L2 , L2 ] control_points ( 8 ,:) = [ - L2 , L2 , - L2 ] end function !----------------------------------------------------------------------------- end program example_nurbs_volume","tags":"","loc":"program/example_nurbs_volume.html"},{"title":"example3_surface – ForCAD","text":"Uses forcad program~~example3_surface~~UsesGraph program~example3_surface example3_surface module~forcad forcad program~example3_surface->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. This program demonstrates the usage of a NURBS (Non-Uniform Rational B-Spline) surface object to create and finalize a NURBS surface.\nIt sets up control points, weights, and knot vectors for all three dimensions, generates the surface, and exports the control points and the surface to VTK files. Define control points for the NURBS surface Define weights for the control points\nDefine knot vectors for both dimensions\nSet knot vectors, control points, and weights for the NURBS surface object Export the control points to a VTK file Generate the NURBS surface with resolutions of 30 in both dimensions Export the generated surface to a VTK file Show the control geometry and geometry using PyVista Print size of the knot vectors\nInsert knots 0.25, twice and 0.75, once in both directions\nPrint size of the knot vectors after inserting knots\nPrint the degrees Elevate degree by 2 in both directions\nPrint the degrees after elevating Print size of the knot vectors\nRemove knots 0.25, twice and 0.75, once in both directions\nPrint size of the knot vectors after removing knots\nGenerate the refined NURBS surface with resolutions of 30 in both dimensions Export updated control points to a VTK file Export the refined generated surface to a VTK file Show the control geometry and geometry using PyVista Rotate the control points Rotate the generated curve Translate the control points Translate the generated curve Export the transformed control points to a VTK file Export the transformed generated volume to a VTK file Show the control geometry and geometry using PyVista Finalize the NURBS surface object Calls program~~example3_surface~~CallsGraph program~example3_surface example3_surface none~get_degree nurbs_surface%get_degree program~example3_surface->none~get_degree none~get_knot nurbs_surface%get_knot program~example3_surface->none~get_knot none~set nurbs_surface%set program~example3_surface->none~set proc~create nurbs_surface%create program~example3_surface->proc~create proc~elevate_degree nurbs_surface%elevate_degree program~example3_surface->proc~elevate_degree proc~export_xc nurbs_surface%export_Xc program~example3_surface->proc~export_xc proc~export_xg nurbs_surface%export_Xg program~example3_surface->proc~export_xg proc~finalize nurbs_surface%finalize program~example3_surface->proc~finalize proc~generate_xc~3 generate_Xc program~example3_surface->proc~generate_xc~3 proc~insert_knots nurbs_surface%insert_knots program~example3_surface->proc~insert_knots proc~remove_knots nurbs_surface%remove_knots program~example3_surface->proc~remove_knots proc~rotate_xc nurbs_surface%rotate_Xc program~example3_surface->proc~rotate_xc proc~rotate_xg nurbs_surface%rotate_Xg program~example3_surface->proc~rotate_xg proc~show nurbs_surface%show program~example3_surface->proc~show proc~translate_xc nurbs_surface%translate_Xc program~example3_surface->proc~translate_xc proc~translate_xg nurbs_surface%translate_Xg program~example3_surface->proc~translate_xg proc~get_degree_all nurbs_surface%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_surface%get_degree_dir none~get_degree->proc~get_degree_dir proc~get_knot_all nurbs_surface%get_knot_all none~get_knot->proc~get_knot_all proc~get_knoti nurbs_surface%get_knoti none~get_knot->proc~get_knoti proc~set1 nurbs_surface%set1 none~set->proc~set1 proc~set2 nurbs_surface%set2 none~set->proc~set2 proc~set3 nurbs_surface%set3 none~set->proc~set3 interface~ndgrid ndgrid proc~create->interface~ndgrid proc~basis_bspline basis_bspline proc~create->proc~basis_bspline proc~is_rational nurbs_surface%is_rational proc~create->proc~is_rational proc~kron kron proc~create->proc~kron proc~elevate_degree->none~set proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree->proc~elevate_degree_a_5_9 proc~elevate_degree->proc~is_rational proc~cmp_elem_xc_vis nurbs_surface%cmp_elem_Xc_vis proc~export_xc->proc~cmp_elem_xc_vis proc~cmp_elem_xg_vis nurbs_surface%cmp_elem_Xg_vis proc~export_xg->proc~cmp_elem_xg_vis proc~insert_knots->none~set interface~compute_multiplicity compute_multiplicity proc~insert_knots->interface~compute_multiplicity proc~findspan findspan proc~insert_knots->proc~findspan proc~insert_knot_a_5_1 insert_knot_A_5_1 proc~insert_knots->proc~insert_knot_a_5_1 proc~insert_knots->proc~is_rational proc~remove_knots->none~set proc~remove_knots->interface~compute_multiplicity proc~remove_knots->proc~findspan proc~remove_knots->proc~is_rational proc~remove_knots_a_5_8 remove_knots_A_5_8 proc~remove_knots->proc~remove_knots_a_5_8 proc~rotation rotation proc~rotate_xc->proc~rotation proc~rotate_xg->proc~rotation proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elem_xg_vis->interface~elemconn_c0 proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~bincoeff bincoeff proc~elevate_degree_a_5_9->proc~bincoeff proc~get_multiplicity nurbs_surface%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity cosd cosd proc~rotation->cosd sind sind proc~rotation->sind proc~set1->none~get_degree proc~get_nc nurbs_surface%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~factln factln proc~bincoeff->proc~factln proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity->interface~compute_multiplicity proc~get_nc->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables 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 real(kind=rk) :: knot1 (6) Arrays for knot vectors in both dimensions real(kind=rk) :: knot2 (6) Arrays for knot vectors in both dimensions type( nurbs_surface ) :: nurbs Declare a NURBS surface object Functions function generate_Xc (num_rows, num_cols, peak_height) result(control_points) Arguments Type Intent Optional Attributes Name integer, intent(in) :: num_rows integer, intent(in) :: num_cols real(kind=rk), intent(in) :: peak_height Return Value real(kind=rk), allocatable, (:,:) Source Code program example3_surface use forcad implicit none type ( nurbs_surface ) :: nurbs !! Declare a NURBS surface object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights real ( rk ) :: knot1 ( 6 ), knot2 ( 6 ) !! Arrays for knot vectors in both dimensions !----------------------------------------------------------------------------- ! Setting up the NURBS surface !----------------------------------------------------------------------------- !> Define control points for the NURBS surface Xc = generate_Xc ( 3 , 3 , 1.0_rk ) !> Define weights for the control points allocate ( Wc ( size ( Xc , 1 ))) Wc = 1.0_rk Wc ( 2 ) = 2.0_rk !> Define knot vectors for both dimensions knot1 = [ 0.0_rk , 0.0_rk , 0.0_rk , 1.0_rk , 1.0_rk , 1.0_rk ] knot2 = [ 0.0_rk , 0.0_rk , 0.0_rk , 1.0_rk , 1.0_rk , 1.0_rk ] !> Set knot vectors, control points, and weights for the NURBS surface object call nurbs % set ( knot1 , knot2 , Xc , Wc ) !> Export the control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_surface_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS surface !----------------------------------------------------------------------------- !> Generate the NURBS surface with resolutions of 30 in both dimensions call nurbs % create ( 30 , 30 ) !> Export the generated surface to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_surface_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/nurbs_surface_Xc.vtk' , 'vtk/nurbs_surface_Xg.vtk' ) !----------------------------------------------------------------------------- ! Refinements !----------------------------------------------------------------------------- !> Print size of the knot vectors print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) !> Insert knots 0.25, twice and 0.75, once in both directions call nurbs % insert_knots ( 1 , [ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) ! direction 1 call nurbs % insert_knots ( 2 , [ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) ! direction 2 !> Print size of the knot vectors after inserting knots print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) !> Print the degrees print * , nurbs % get_degree () !> Elevate degree by 2 in both directions call nurbs % elevate_degree ( 1 , 2 ) ! direction 1 call nurbs % elevate_degree ( 2 , 2 ) ! direction 2 !> Print the degrees after elevating print * , nurbs % get_degree () !> Print size of the knot vectors print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) !> Remove knots 0.25, twice and 0.75, once in both directions call nurbs % remove_knots ( 1 , [ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) ! direction 1 call nurbs % remove_knots ( 2 , [ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) ! direction 2 !> Print size of the knot vectors after removing knots print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) !> Generate the refined NURBS surface with resolutions of 30 in both dimensions call nurbs % create () !> Export updated control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_surface_Xc2.vtk' ) !> Export the refined generated surface to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_surface_Xg2.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/nurbs_surface_Xc2.vtk' , 'vtk/nurbs_surface_Xg2.vtk' ) !----------------------------------------------------------------------------- ! Transformations !----------------------------------------------------------------------------- !> Rotate the control points call nurbs % rotate_Xc ( alpha = 4 5.0_rk , beta = 0.0_rk , theta = 9 0.0_rk ) !> Rotate the generated curve call nurbs % rotate_Xg ( alpha =- 4 5.0_rk , beta = 0.0_rk , theta =- 9 0.0_rk ) !> Translate the control points call nurbs % translate_Xc ([ 1.0_rk , 2.0_rk , - 3.0_rk ]) !> Translate the generated curve call nurbs % translate_Xg ([ - 1.0_rk , - 2.0_rk , 3.0_rk ]) !> Export the transformed control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_surface_Xc3.vtk' ) !> Export the transformed generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_surface_Xg3.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/nurbs_surface_Xc3.vtk' , 'vtk/nurbs_surface_Xg3.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS surface object call nurbs % finalize () contains !----------------------------------------------------------------------------- function generate_Xc ( num_rows , num_cols , peak_height ) result ( control_points ) integer , intent ( in ) :: num_rows , num_cols real ( rk ), intent ( in ) :: peak_height real ( rk ), allocatable :: control_points (:,:) integer :: i , j real ( rk ) :: x_spacing , y_spacing , x_offset , y_offset x_spacing = 1.0_rk / real ( num_cols - 1 , rk ) y_spacing = 1.0_rk / real ( num_rows - 1 , rk ) x_offset = - 0.5_rk y_offset = - 0.5_rk allocate ( control_points ( num_rows * num_cols , 3 )) do i = 1 , num_rows do j = 1 , num_cols control_points (( i - 1 ) * num_cols + j , 1 ) = x_offset + real ( j - 1 , rk ) * x_spacing control_points (( i - 1 ) * num_cols + j , 2 ) = y_offset + real ( i - 1 , rk ) * y_spacing control_points (( i - 1 ) * num_cols + j , 3 ) = & peak_height * exp ( - (( control_points (( i - 1 ) * num_cols + j , 1 ) ** 2 ) & + ( control_points (( i - 1 ) * num_cols + j , 2 ) ** 2 ))) + 0.5_rk * peak_height * 0.2_rk end do end do end function !----------------------------------------------------------------------------- end program example3_surface","tags":"","loc":"program/example3_surface.html"},{"title":"shape_tetragon – ForCAD","text":"Uses forcad program~~shape_tetragon~~UsesGraph program~shape_tetragon shape_tetragon module~forcad forcad program~shape_tetragon->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Set a tetragon with lengths of 2.0 and 3.0 and 3 and 4 control points in each direction\nThe weights of the control points (Wc) are optional. Export the control points to a VTK file Generate the NURBS surface with resolutions of 30 in both dimensions Export the generated surface to a VTK file Show the control geometry and geometry using PyVista Finalize the NURBS surface object Calls program~~shape_tetragon~~CallsGraph program~shape_tetragon shape_tetragon proc~create nurbs_surface%create program~shape_tetragon->proc~create proc~export_xc nurbs_surface%export_Xc program~shape_tetragon->proc~export_xc proc~export_xg nurbs_surface%export_Xg program~shape_tetragon->proc~export_xg proc~finalize nurbs_surface%finalize program~shape_tetragon->proc~finalize proc~set_tetragon nurbs_surface%set_tetragon program~shape_tetragon->proc~set_tetragon proc~show nurbs_surface%show program~shape_tetragon->proc~show interface~ndgrid ndgrid proc~create->interface~ndgrid proc~basis_bspline basis_bspline proc~create->proc~basis_bspline proc~is_rational nurbs_surface%is_rational proc~create->proc~is_rational proc~kron kron proc~create->proc~kron proc~cmp_elem_xc_vis nurbs_surface%cmp_elem_Xc_vis proc~export_xc->proc~cmp_elem_xc_vis proc~cmp_elem_xg_vis nurbs_surface%cmp_elem_Xg_vis proc~export_xg->proc~cmp_elem_xg_vis none~set nurbs_surface%set proc~set_tetragon->none~set proc~tetragon_xc tetragon_Xc proc~set_tetragon->proc~tetragon_xc proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 proc~set1 nurbs_surface%set1 none~set->proc~set1 proc~set2 nurbs_surface%set2 none~set->proc~set2 proc~set3 nurbs_surface%set3 none~set->proc~set3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis->interface~elemconn_c0 proc~cmp_elem_xg_vis->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v none~get_degree nurbs_surface%get_degree proc~set1->none~get_degree proc~get_nc nurbs_surface%get_nc proc~set1->proc~get_nc proc~compute_knot_vector compute_knot_vector proc~set2->proc~compute_knot_vector proc~set2->proc~get_nc proc~set3->none~get_degree proc~get_degree_all nurbs_surface%get_degree_all none~get_degree->proc~get_degree_all proc~get_degree_dir nurbs_surface%get_degree_dir none~get_degree->proc~get_degree_dir proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity nurbs_surface%get_multiplicity proc~get_degree_all->proc~get_multiplicity proc~get_degree_dir->proc~get_multiplicity proc~get_multiplicity->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables 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 real(kind=rk), allocatable :: knot1 (:) Arrays for knot vectors in both dimensions real(kind=rk), allocatable :: knot2 (:) Arrays for knot vectors in both dimensions type( nurbs_surface ) :: shape Declare a NURBS surface object","tags":"","loc":"program/shape_tetragon.html"},{"title":"example3_volume – ForCAD","text":"Uses forcad program~~example3_volume~~UsesGraph program~example3_volume example3_volume module~forcad forcad program~example3_volume->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. This program demonstrates the usage of a NURBS (Non-Uniform Rational B-Spline) volume object to create and finalize a NURBS volume.\nIt sets up control points, weights, and knot vectors for all three dimensions, generates the volume, and exports the control points and the volume to VTK files. Define the control points for the NURBS volume Define weights for the control points (optional)\nDefine knot vectors for all three dimensions\nSet knot vectors, control points, and weights for the NURBS volume object\nWc is optional. Export the control points to a VTK file Generate the NURBS volume with resolutions of 20, 20, and 20 in the three dimensions Export the generated volume to a VTK file Show the control geometry and geometry using PyVista Print size of knot vectors\nInsert knots 0.25 and 0.75 in all three directions\nPrint size of knot vectors after inserting knots\nPrint degrees Elevate degree by 2 in all three directions\nPrint degrees after elevating Print size of knot vectors\nPrint size of knot vectors after removing knots\nGenerate the refined NURBS volume with resolutions of 40, 40, and 40 in the three dimensions Export updated control points to a VTK file Export the refined generated volume to a VTK file Show the control geometry and geometry using PyVista Rotate the control points Rotate the generated curve Translate the control points Translate the generated curve Export the transformed control points to a VTK file Export the transformed generated volume to a VTK file Show the control geometry and geometry using PyVista Finalize the NURBS volume object Calls program~~example3_volume~~CallsGraph program~example3_volume example3_volume none~get_degree~3 nurbs_volume%get_degree program~example3_volume->none~get_degree~3 none~get_knot~3 nurbs_volume%get_knot program~example3_volume->none~get_knot~3 none~set~3 nurbs_volume%set program~example3_volume->none~set~3 proc~create~3 nurbs_volume%create program~example3_volume->proc~create~3 proc~elevate_degree~3 nurbs_volume%elevate_degree program~example3_volume->proc~elevate_degree~3 proc~export_xc~3 nurbs_volume%export_Xc program~example3_volume->proc~export_xc~3 proc~export_xg~3 nurbs_volume%export_Xg program~example3_volume->proc~export_xg~3 proc~finalize~3 nurbs_volume%finalize program~example3_volume->proc~finalize~3 proc~generate_xc~4 generate_Xc program~example3_volume->proc~generate_xc~4 proc~insert_knots~3 nurbs_volume%insert_knots program~example3_volume->proc~insert_knots~3 proc~remove_knots~3 nurbs_volume%remove_knots program~example3_volume->proc~remove_knots~3 proc~rotate_xc~3 nurbs_volume%rotate_Xc program~example3_volume->proc~rotate_xc~3 proc~rotate_xg~3 nurbs_volume%rotate_Xg program~example3_volume->proc~rotate_xg~3 proc~show~3 nurbs_volume%show program~example3_volume->proc~show~3 proc~translate_xc~3 nurbs_volume%translate_Xc program~example3_volume->proc~translate_xc~3 proc~translate_xg~3 nurbs_volume%translate_Xg program~example3_volume->proc~translate_xg~3 proc~get_degree_all~2 nurbs_volume%get_degree_all none~get_degree~3->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_volume%get_degree_dir none~get_degree~3->proc~get_degree_dir~2 proc~get_knot_all~3 nurbs_volume%get_knot_all none~get_knot~3->proc~get_knot_all~3 proc~get_knoti~3 nurbs_volume%get_knoti none~get_knot~3->proc~get_knoti~3 proc~set1~3 nurbs_volume%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_volume%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_volume%set3 none~set~3->proc~set3~3 interface~ndgrid ndgrid proc~create~3->interface~ndgrid proc~basis_bspline basis_bspline proc~create~3->proc~basis_bspline proc~kron kron proc~create~3->proc~kron proc~elevate_degree~3->none~set~3 proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree~3->proc~elevate_degree_a_5_9 proc~cmp_elem_xc_vis~3 nurbs_volume%cmp_elem_Xc_vis proc~export_xc~3->proc~cmp_elem_xc_vis~3 proc~cmp_elem_xg_vis~3 nurbs_volume%cmp_elem_Xg_vis proc~export_xg~3->proc~cmp_elem_xg_vis~3 proc~insert_knots~3->none~set~3 interface~compute_multiplicity compute_multiplicity proc~insert_knots~3->interface~compute_multiplicity proc~findspan findspan proc~insert_knots~3->proc~findspan proc~insert_knot_a_5_1 insert_knot_A_5_1 proc~insert_knots~3->proc~insert_knot_a_5_1 proc~remove_knots~3->none~set~3 proc~remove_knots~3->interface~compute_multiplicity proc~remove_knots~3->proc~findspan proc~remove_knots_a_5_8 remove_knots_A_5_8 proc~remove_knots~3->proc~remove_knots_a_5_8 proc~rotation rotation proc~rotate_xc~3->proc~rotation proc~rotate_xg~3->proc~rotation proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~bincoeff bincoeff proc~elevate_degree_a_5_9->proc~bincoeff proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~3 proc~get_degree_dir~2->proc~get_multiplicity~3 cosd cosd proc~rotation->cosd sind sind proc~rotation->sind proc~set1~3->none~get_degree~3 proc~get_nc~3 nurbs_volume%get_nc proc~set1~3->proc~get_nc~3 proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set2~3->proc~get_nc~3 proc~set3~3->none~get_degree~3 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~factln factln proc~bincoeff->proc~factln proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~3->interface~compute_multiplicity proc~get_nc~3->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables 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 real(kind=rk) :: knot1 (4) Arrays for knot vectors in all three dimensions real(kind=rk) :: knot2 (4) Arrays for knot vectors in all three dimensions real(kind=rk) :: knot3 (4) Arrays for knot vectors in all three dimensions type( nurbs_volume ) :: nurbs Declare a NURBS volume object Functions function generate_Xc (L) result(control_points) Arguments Type Intent Optional Attributes Name real(kind=rk), intent(in) :: L Return Value real(kind=rk), allocatable, (:,:) Source Code program example3_volume use forcad , only : rk , nurbs_volume implicit none type ( nurbs_volume ) :: nurbs !! Declare a NURBS volume object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights real ( rk ) :: knot1 ( 4 ), knot2 ( 4 ), knot3 ( 4 ) !! Arrays for knot vectors in all three dimensions !----------------------------------------------------------------------------- ! Setting up the NURBS volume !----------------------------------------------------------------------------- !> Define the control points for the NURBS volume Xc = generate_Xc ( 5.0_rk ) !> Define weights for the control points (optional) allocate ( Wc ( size ( Xc , 1 )), source = 1.0_rk ) Wc ( 2 ) = 5.0_rk !> Define knot vectors for all three dimensions 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 ] !> Set knot vectors, control points, and weights for the NURBS volume object !> Wc is optional. call nurbs % set ( knot1 , knot2 , knot3 , Xc , Wc ) !> Export the control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_volume_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS volume !----------------------------------------------------------------------------- !> Generate the NURBS volume with resolutions of 20, 20, and 20 in the three dimensions call nurbs % create ( 20 , 20 , 20 ) !> Export the generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_volume_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/nurbs_volume_Xc.vtk' , 'vtk/nurbs_volume_Xg.vtk' ) !----------------------------------------------------------------------------- ! Refinements !----------------------------------------------------------------------------- !> Print size of knot vectors print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) print * , size ( nurbs % get_knot ( 3 )) !> Insert knots 0.25 and 0.75 in all three directions call nurbs % insert_knots ( 1 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 1 call nurbs % insert_knots ( 2 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 2 call nurbs % insert_knots ( 3 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 3 !> Print size of knot vectors after inserting knots print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) print * , size ( nurbs % get_knot ( 3 )) !> Print degrees print * , nurbs % get_degree () !> Elevate degree by 2 in all three directions call nurbs % elevate_degree ( 1 , 2 ) ! direction 1 call nurbs % elevate_degree ( 2 , 2 ) ! direction 2 call nurbs % elevate_degree ( 3 , 2 ) ! direction 3 !> Print degrees after elevating print * , nurbs % get_degree () !> Print size of knot vectors print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) print * , size ( nurbs % get_knot ( 3 )) call nurbs % remove_knots ( 1 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 1 call nurbs % remove_knots ( 2 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 2 call nurbs % remove_knots ( 3 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 3 !> Print size of knot vectors after removing knots print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) print * , size ( nurbs % get_knot ( 3 )) !> Generate the refined NURBS volume with resolutions of 40, 40, and 40 in the three dimensions call nurbs % create () !> Export updated control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_volume_Xc2.vtk' ) !> Export the refined generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_volume_Xg2.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/nurbs_volume_Xc2.vtk' , 'vtk/nurbs_volume_Xg2.vtk' ) !----------------------------------------------------------------------------- ! Transformations !----------------------------------------------------------------------------- !> Rotate the control points call nurbs % rotate_Xc ( alpha =- 4 5.0_rk , beta = 0.0_rk , theta = 9 0.0_rk ) !> Rotate the generated curve call nurbs % rotate_Xg ( alpha =- 4 5.0_rk , beta = 0.0_rk , theta = 9 0.0_rk ) !> Translate the control points call nurbs % translate_Xc ([ 1.0_rk , 2.0_rk , - 3.0_rk ]) !> Translate the generated curve call nurbs % translate_Xg ([ 1.0_rk , 2.0_rk , - 3.0_rk ]) !> Export the transformed control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_volume_Xc3.vtk' ) !> Export the transformed generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_volume_Xg3.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/nurbs_volume_Xc3.vtk' , 'vtk/nurbs_volume_Xg3.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS volume object call nurbs % finalize () contains !----------------------------------------------------------------------------- function generate_Xc ( L ) result ( control_points ) implicit none real ( rk ), intent ( in ) :: L real ( rk ), allocatable :: control_points (:,:) real ( rk ) :: L2 L2 = L / 2.0_rk allocate ( control_points ( 8 , 3 )) control_points ( 1 ,:) = [ L2 , - L2 , L2 ] control_points ( 2 ,:) = [ L2 , - L2 , - L2 ] control_points ( 3 ,:) = [ - L2 , - L2 , L2 ] control_points ( 4 ,:) = [ - L2 , - L2 , - L2 ] control_points ( 5 ,:) = [ L2 , L2 , L2 ] control_points ( 6 ,:) = [ L2 , L2 , - L2 ] control_points ( 7 ,:) = [ - L2 , L2 , L2 ] control_points ( 8 ,:) = [ - L2 , L2 , - L2 ] end function !----------------------------------------------------------------------------- end program example3_volume","tags":"","loc":"program/example3_volume.html"},{"title":"shape_hexahedron – ForCAD","text":"Uses forcad program~~shape_hexahedron~~UsesGraph program~shape_hexahedron shape_hexahedron module~forcad forcad program~shape_hexahedron->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Set up a hexahedron shape with dimensions L = [2.0, 4.0, 8.0] and a specified number of control points nc = [4, 6, 8].\nThe weights of the control points (Wc) are optional. Export the control points to a VTK file for visualization. Create the shape using the specified number of elements in each direction. Export the geometry to a VTK file for visualization. Show the control geometry and geometry using PyVista Finalize and clean up the shape object. Calls program~~shape_hexahedron~~CallsGraph program~shape_hexahedron shape_hexahedron proc~create~3 nurbs_volume%create program~shape_hexahedron->proc~create~3 proc~export_xc~3 nurbs_volume%export_Xc program~shape_hexahedron->proc~export_xc~3 proc~export_xg~3 nurbs_volume%export_Xg program~shape_hexahedron->proc~export_xg~3 proc~finalize~3 nurbs_volume%finalize program~shape_hexahedron->proc~finalize~3 proc~set_hexahedron nurbs_volume%set_hexahedron program~shape_hexahedron->proc~set_hexahedron proc~show~3 nurbs_volume%show program~shape_hexahedron->proc~show~3 interface~ndgrid ndgrid proc~create~3->interface~ndgrid proc~basis_bspline basis_bspline proc~create~3->proc~basis_bspline proc~kron kron proc~create~3->proc~kron proc~cmp_elem_xc_vis~3 nurbs_volume%cmp_elem_Xc_vis proc~export_xc~3->proc~cmp_elem_xc_vis~3 proc~cmp_elem_xg_vis~3 nurbs_volume%cmp_elem_Xg_vis proc~export_xg~3->proc~cmp_elem_xg_vis~3 none~set~3 nurbs_volume%set proc~set_hexahedron->none~set~3 proc~hexahedron_xc hexahedron_Xc proc~set_hexahedron->proc~hexahedron_xc proc~ndgrid2 ndgrid2 interface~ndgrid->proc~ndgrid2 proc~ndgrid3 ndgrid3 interface~ndgrid->proc~ndgrid3 proc~set1~3 nurbs_volume%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_volume%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_volume%set3 none~set~3->proc~set3~3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elem_xg_vis~3->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v none~get_degree~3 nurbs_volume%get_degree proc~set1~3->none~get_degree~3 proc~get_nc~3 nurbs_volume%get_nc proc~set1~3->proc~get_nc~3 proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set2~3->proc~get_nc~3 proc~set3~3->none~get_degree~3 proc~get_degree_all~2 nurbs_volume%get_degree_all none~get_degree~3->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_volume%get_degree_dir none~get_degree~3->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~3 proc~get_degree_dir~2->proc~get_multiplicity~3 proc~get_multiplicity~3->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables Type Attributes Name Initial type( nurbs_volume ) :: shape","tags":"","loc":"program/shape_hexahedron.html"},{"title":"shape_circle – ForCAD","text":"Uses forcad program~~shape_circle~~UsesGraph program~shape_circle shape_circle module~forcad forcad program~shape_circle->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Set a circle with radius 2.0 and center at [0.0, 0.0, 0.0] Export control points to a VTK file Generate the NURBS circle with a resolution of 100 Export the generated cirlce to a VTK file Show the control geometry and geometry using PyVista Finalize the NURBS curve object Calls program~~shape_circle~~CallsGraph program~shape_circle shape_circle proc~create~2 nurbs_curve%create program~shape_circle->proc~create~2 proc~export_xc~2 nurbs_curve%export_Xc program~shape_circle->proc~export_xc~2 proc~export_xg~2 nurbs_curve%export_Xg program~shape_circle->proc~export_xg~2 proc~finalize~2 nurbs_curve%finalize program~shape_circle->proc~finalize~2 proc~set_circle nurbs_curve%set_circle program~shape_circle->proc~set_circle proc~show~2 nurbs_curve%show program~shape_circle->proc~show~2 proc~basis_bspline basis_bspline proc~create~2->proc~basis_bspline proc~is_rational~2 nurbs_curve%is_rational proc~create~2->proc~is_rational~2 proc~cmp_elem_xc_vis~2 nurbs_curve%cmp_elem_Xc_vis proc~export_xc~2->proc~cmp_elem_xc_vis~2 proc~cmp_elem_xg_vis~2 nurbs_curve%cmp_elem_Xg_vis proc~export_xg~2->proc~cmp_elem_xg_vis~2 none~set~2 nurbs_curve%set proc~set_circle->none~set~2 proc~set1~2 nurbs_curve%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_curve%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_curve%set3 none~set~2->proc~set3~2 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~get_degree nurbs_curve%get_degree proc~set1~2->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set3~2->proc~get_degree proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~2 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables Type Attributes Name Initial type( nurbs_curve ) :: shape","tags":"","loc":"program/shape_circle.html"},{"title":"example_nurbs_curve – ForCAD","text":"Uses forcad program~~example_nurbs_curve~~UsesGraph program~example_nurbs_curve example_nurbs_curve module~forcad forcad program~example_nurbs_curve->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. This program demonstrates the usage of a NURBS curve object to create, and finalize a NURBS curve.\nIt sets up control points and weights, generates the curve, and exports the control points\nand 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 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 Calls program~~example_nurbs_curve~~CallsGraph program~example_nurbs_curve example_nurbs_curve none~set~2 nurbs_curve%set program~example_nurbs_curve->none~set~2 proc~create~2 nurbs_curve%create program~example_nurbs_curve->proc~create~2 proc~export_xc~2 nurbs_curve%export_Xc program~example_nurbs_curve->proc~export_xc~2 proc~export_xg~2 nurbs_curve%export_Xg program~example_nurbs_curve->proc~export_xg~2 proc~finalize~2 nurbs_curve%finalize program~example_nurbs_curve->proc~finalize~2 proc~generate_xc~5 generate_Xc program~example_nurbs_curve->proc~generate_xc~5 proc~show~2 nurbs_curve%show program~example_nurbs_curve->proc~show~2 proc~set1~2 nurbs_curve%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_curve%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_curve%set3 none~set~2->proc~set3~2 proc~basis_bspline basis_bspline proc~create~2->proc~basis_bspline proc~is_rational~2 nurbs_curve%is_rational proc~create~2->proc~is_rational~2 proc~cmp_elem_xc_vis~2 nurbs_curve%cmp_elem_Xc_vis proc~export_xc~2->proc~cmp_elem_xc_vis~2 proc~cmp_elem_xg_vis~2 nurbs_curve%cmp_elem_Xg_vis proc~export_xg~2->proc~cmp_elem_xg_vis~2 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~get_degree nurbs_curve%get_degree proc~set1~2->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set3~2->proc~get_degree proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~repelem repelem proc~compute_knot_vector->proc~repelem proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~2 interface~compute_multiplicity compute_multiplicity proc~get_multiplicity~2->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables 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 Functions function generate_Xc (num_coils, radius, height, num_points_per_coil) result(control_points) Arguments 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 Return Value real(kind=rk), allocatable, (:,:) Source Code 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 ) !> 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","tags":"","loc":"program/example_nurbs_curve.html"},{"title":"example1_curve – ForCAD","text":"Uses forcad program~~example1_curve~~UsesGraph program~example1_curve example1_curve module~forcad forcad program~example1_curve->module~forcad module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_utils forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. This program demonstrates the usage of a NURBS (Non-Uniform Rational B-Spline) curve object to create and finalize a NURBS curve.\nIt sets up control points, weights, and knot vectors for all three dimensions, generates the curve, and exports the control points and the curve to VTK files. Define control points for the NURBS curve\nDefine weights for the control points (optional)\nDefine knot vector Set knot vector, control points, and weights for the NURBS curve object.\nWc is optional Export control points to a VTK file Generate the NURBS curve with a resolution of 20 Export the generated curve to a VTK file Show the control geometry and geometry using PyVista Print size of the knot vector Insert knots 0.25, twice and 0.75, once Print size of the updated knot vector Print the degree of the curve Elevate the degree of the curve (2 times) Print the updated degree of the curve Print size of the knot vector Remove knots 0.25, twice and 0.75, once Print size of the updated knot vector Generate the refined curve with a resolution of 20 Export updated control points to a VTK file Export the refined generated curve to a VTK file Show the control geometry and geometry using PyVista Rotate the control points Rotate the generated curve Translate the control points Translate the generated curve Export the transformed control points to a VTK file Export the transformed generated volume to a VTK file Show the control geometry and geometry using PyVista Finalize the NURBS curve object Calls program~~example1_curve~~CallsGraph program~example1_curve example1_curve none~get_knot~2 nurbs_curve%get_knot program~example1_curve->none~get_knot~2 none~set~2 nurbs_curve%set program~example1_curve->none~set~2 proc~create~2 nurbs_curve%create program~example1_curve->proc~create~2 proc~elevate_degree~2 nurbs_curve%elevate_degree program~example1_curve->proc~elevate_degree~2 proc~export_xc~2 nurbs_curve%export_Xc program~example1_curve->proc~export_xc~2 proc~export_xg~2 nurbs_curve%export_Xg program~example1_curve->proc~export_xg~2 proc~finalize~2 nurbs_curve%finalize program~example1_curve->proc~finalize~2 proc~get_degree nurbs_curve%get_degree program~example1_curve->proc~get_degree proc~insert_knots~2 nurbs_curve%insert_knots program~example1_curve->proc~insert_knots~2 proc~remove_knots~2 nurbs_curve%remove_knots program~example1_curve->proc~remove_knots~2 proc~rotate_xc~2 nurbs_curve%rotate_Xc program~example1_curve->proc~rotate_xc~2 proc~rotate_xg~2 nurbs_curve%rotate_Xg program~example1_curve->proc~rotate_xg~2 proc~show~2 nurbs_curve%show program~example1_curve->proc~show~2 proc~translate_xc~2 nurbs_curve%translate_Xc program~example1_curve->proc~translate_xc~2 proc~translate_xg~2 nurbs_curve%translate_Xg program~example1_curve->proc~translate_xg~2 proc~get_knot_all~2 nurbs_curve%get_knot_all none~get_knot~2->proc~get_knot_all~2 proc~get_knoti~2 nurbs_curve%get_knoti none~get_knot~2->proc~get_knoti~2 proc~set1~2 nurbs_curve%set1 none~set~2->proc~set1~2 proc~set2~2 nurbs_curve%set2 none~set~2->proc~set2~2 proc~set3~2 nurbs_curve%set3 none~set~2->proc~set3~2 proc~basis_bspline basis_bspline proc~create~2->proc~basis_bspline proc~is_rational~2 nurbs_curve%is_rational proc~create~2->proc~is_rational~2 proc~elevate_degree~2->none~set~2 proc~elevate_degree_a_5_9 elevate_degree_A_5_9 proc~elevate_degree~2->proc~elevate_degree_a_5_9 proc~elevate_degree~2->proc~is_rational~2 proc~cmp_elem_xc_vis~2 nurbs_curve%cmp_elem_Xc_vis proc~export_xc~2->proc~cmp_elem_xc_vis~2 proc~cmp_elem_xg_vis~2 nurbs_curve%cmp_elem_Xg_vis proc~export_xg~2->proc~cmp_elem_xg_vis~2 proc~get_multiplicity~2 nurbs_curve%get_multiplicity proc~get_degree->proc~get_multiplicity~2 proc~insert_knots~2->none~set~2 interface~compute_multiplicity compute_multiplicity proc~insert_knots~2->interface~compute_multiplicity proc~findspan findspan proc~insert_knots~2->proc~findspan proc~insert_knot_a_5_1 insert_knot_A_5_1 proc~insert_knots~2->proc~insert_knot_a_5_1 proc~insert_knots~2->proc~is_rational~2 proc~remove_knots~2->none~set~2 proc~remove_knots~2->interface~compute_multiplicity proc~remove_knots~2->proc~findspan proc~remove_knots~2->proc~is_rational~2 proc~remove_knots_a_5_8 remove_knots_A_5_8 proc~remove_knots~2->proc~remove_knots_a_5_8 proc~rotation rotation proc~rotate_xc~2->proc~rotation proc~rotate_xg~2->proc~rotation proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~2->interface~elemconn_c0 proc~cmp_elem_xg_vis~2->interface~elemconn_c0 proc~elevate_degree_a_5_9->interface~compute_multiplicity proc~bincoeff bincoeff proc~elevate_degree_a_5_9->proc~bincoeff proc~get_multiplicity~2->interface~compute_multiplicity cosd cosd proc~rotation->cosd sind sind proc~rotation->sind proc~set1~2->proc~get_degree proc~compute_knot_vector compute_knot_vector proc~set2~2->proc~compute_knot_vector proc~set3~2->proc~get_degree proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~factln factln proc~bincoeff->proc~factln proc~repelem repelem proc~compute_knot_vector->proc~repelem Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables 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 real(kind=rk) :: knot (6) Array for knot vector type( nurbs_curve ) :: nurbs Declare a NURBS curve object Source Code program example1_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 real ( rk ) :: knot ( 6 ) !! Array for knot vector !----------------------------------------------------------------------------- ! Setting up the NURBS curve !----------------------------------------------------------------------------- !> Define control points for the NURBS curve allocate ( Xc ( 3 , 3 )) Xc ( 1 ,:) = [ 0.0_rk , 0.0_rk , 0.0_rk ] Xc ( 2 ,:) = [ 0.0_rk , 5.0_rk , 0.0_rk ] Xc ( 3 ,:) = [ 5.0_rk , 5.0_rk , 0.0_rk ] !> Define weights for the control points (optional) allocate ( Wc ( 3 )) Wc = [ 1.0_rk , 2.0_rk , 0.3_rk ] !> Define knot vector knot = [ 0.0_rk , 0.0_rk , 0.0_rk , 1.0_rk , 1.0_rk , 1.0_rk ] !> Set knot vector, control points, and weights for the NURBS curve object. !> Wc is optional call nurbs % set ( knot , Xc , Wc ) !> Export control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_curve_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS curve !----------------------------------------------------------------------------- !> Generate the NURBS curve with a resolution of 20 call nurbs % create ( res = 20 ) !> Export the generated curve to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_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/nurbs_curve_Xc.vtk' , 'vtk/nurbs_curve_Xg.vtk' ) !----------------------------------------------------------------------------- ! Refinements !----------------------------------------------------------------------------- !> Print size of the knot vector print * , size ( nurbs % get_knot ()) !> Insert knots 0.25, twice and 0.75, once call nurbs % insert_knots ([ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) !> Print size of the updated knot vector print * , size ( nurbs % get_knot ()) !> Print the degree of the curve print * , nurbs % get_degree () !> Elevate the degree of the curve (2 times) call nurbs % elevate_degree ( 2 ) !> Print the updated degree of the curve print * , nurbs % get_degree () !> Print size of the knot vector print * , size ( nurbs % get_knot ()) !> Remove knots 0.25, twice and 0.75, once call nurbs % remove_knots ([ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) !> Print size of the updated knot vector print * , size ( nurbs % get_knot ()) !> Generate the refined curve with a resolution of 20 call nurbs % create () !> Export updated control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_curve_Xc2.vtk' ) !> Export the refined generated curve to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_curve_Xg2.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/nurbs_curve_Xc2.vtk' , 'vtk/nurbs_curve_Xg2.vtk' ) !----------------------------------------------------------------------------- ! Transformations !----------------------------------------------------------------------------- !> Rotate the control points call nurbs % rotate_Xc ( alpha = 4 5.0_rk , beta = 0.0_rk , theta = 9 0.0_rk ) !> Rotate the generated curve call nurbs % rotate_Xg ( alpha =- 4 5.0_rk , beta = 0.0_rk , theta =- 9 0.0_rk ) !> Translate the control points call nurbs % translate_Xc ([ 1.0_rk , 2.0_rk , - 3.0_rk ]) !> Translate the generated curve call nurbs % translate_Xg ([ - 1.0_rk , - 2.0_rk , 3.0_rk ]) !> Export the transformed control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_curve_Xc3.vtk' ) !> Export the transformed generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_curve_Xg3.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/nurbs_curve_Xc3.vtk' , 'vtk/nurbs_curve_Xg3.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS curve object call nurbs % finalize () end program example1_curve","tags":"","loc":"program/example1_curve.html"},{"title":"example_morph – ForCAD","text":"Uses forcad forcad_utils program~~example_morph~~UsesGraph program~example_morph example_morph module~forcad forcad program~example_morph->module~forcad module~forcad_utils forcad_utils program~example_morph->module~forcad_utils module~forcad->module~forcad_utils module~forcad_nurbs_curve forcad_nurbs_curve module~forcad->module~forcad_nurbs_curve module~forcad_nurbs_surface forcad_nurbs_surface module~forcad->module~forcad_nurbs_surface module~forcad_nurbs_volume forcad_nurbs_volume module~forcad->module~forcad_nurbs_volume module~forcad_nurbs_curve->module~forcad_utils module~forcad_nurbs_surface->module~forcad_utils module~forcad_nurbs_volume->module~forcad_utils Help Graph Key Nodes of different colours represent the following: Graph Key Module Module Submodule Submodule Subroutine Subroutine Function Function Program Program This Page's Entity This Page's Entity Solid arrows point from a submodule to the (sub)module which it is\ndescended from. Dashed arrows point from a module or program unit to \nmodules which it uses. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. You can create your shape or use a predefined one\nRead coordinates from file\nRead element connectivities from file\nSet a control shape that will be used to put the shape into\nThe contol shape is a hexahedron with 100x40x10 with 10x5x3 number of control points\nBy modifying the control shape you can modify the shape Map the shape into the shape Export the shape and the control shape to vtk files\nShow the control geometry and geometry using PyVista Calls program~~example_morph~~CallsGraph program~example_morph example_morph none~set~3 nurbs_volume%set program~example_morph->none~set~3 proc~export_xc~3 nurbs_volume%export_Xc program~example_morph->proc~export_xc~3 proc~export_xg~3 nurbs_volume%export_Xg program~example_morph->proc~export_xg~3 proc~hexahedron_xc hexahedron_Xc program~example_morph->proc~hexahedron_xc proc~put_to_nurbs nurbs_volume%put_to_nurbs program~example_morph->proc~put_to_nurbs proc~show~3 nurbs_volume%show program~example_morph->proc~show~3 proc~set1~3 nurbs_volume%set1 none~set~3->proc~set1~3 proc~set2~3 nurbs_volume%set2 none~set~3->proc~set2~3 proc~set3~3 nurbs_volume%set3 none~set~3->proc~set3~3 proc~cmp_elem_xc_vis~3 nurbs_volume%cmp_elem_Xc_vis proc~export_xc~3->proc~cmp_elem_xc_vis~3 proc~cmp_elem_xg_vis~3 nurbs_volume%cmp_elem_Xg_vis proc~export_xg~3->proc~cmp_elem_xg_vis~3 proc~basis_bspline basis_bspline proc~put_to_nurbs->proc~basis_bspline proc~kron kron proc~put_to_nurbs->proc~kron proc~set_elem_xg_vis~3 nurbs_volume%set_elem_Xg_vis proc~put_to_nurbs->proc~set_elem_xg_vis~3 interface~elemconn_c0 elemConn_C0 proc~cmp_elem_xc_vis~3->interface~elemconn_c0 proc~cmp_elem_xg_vis~3->interface~elemconn_c0 none~get_degree~3 nurbs_volume%get_degree proc~set1~3->none~get_degree~3 proc~get_nc~3 nurbs_volume%get_nc proc~set1~3->proc~get_nc~3 proc~compute_knot_vector compute_knot_vector proc~set2~3->proc~compute_knot_vector proc~set2~3->proc~get_nc~3 proc~set3~3->none~get_degree~3 proc~cmp_elemconn_c0_l cmp_elemConn_C0_L interface~elemconn_c0->proc~cmp_elemconn_c0_l proc~cmp_elemconn_c0_s cmp_elemConn_C0_S interface~elemconn_c0->proc~cmp_elemconn_c0_s proc~cmp_elemconn_c0_v cmp_elemConn_C0_V interface~elemconn_c0->proc~cmp_elemconn_c0_v proc~get_degree_all~2 nurbs_volume%get_degree_all none~get_degree~3->proc~get_degree_all~2 proc~get_degree_dir~2 nurbs_volume%get_degree_dir none~get_degree~3->proc~get_degree_dir~2 proc~repelem repelem proc~compute_knot_vector->proc~repelem interface~compute_multiplicity compute_multiplicity proc~get_nc~3->interface~compute_multiplicity proc~compute_multiplicity1 compute_multiplicity1 interface~compute_multiplicity->proc~compute_multiplicity1 proc~compute_multiplicity2 compute_multiplicity2 interface~compute_multiplicity->proc~compute_multiplicity2 proc~get_multiplicity~3 nurbs_volume%get_multiplicity proc~get_degree_all~2->proc~get_multiplicity~3 proc~get_degree_dir~2->proc~get_multiplicity~3 proc~get_multiplicity~3->interface~compute_multiplicity Help Graph Key Nodes of different colours represent the following: Graph Key Subroutine Subroutine Function Function Interface Interface Type Bound Procedure Type Bound Procedure Unknown Procedure Type Unknown Procedure Type Program Program This Page's Entity This Page's Entity Solid arrows point from a procedure to one which it calls. Dashed \narrows point from an interface to procedures which implement that interface.\nThis could include the module procedures in a generic interface or the\nimplementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Variables Type Attributes Name Initial real(kind=rk), allocatable :: X (:,:) type( nurbs_volume ) :: control_shape integer, allocatable :: elem (:,:) integer :: i integer :: nunit","tags":"","loc":"program/example_morph.html"},{"title":"demo_surface.f90 – ForCAD","text":"This file depends on sourcefile~~demo_surface.f90~~EfferentGraph sourcefile~demo_surface.f90 demo_surface.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~demo_surface.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> This program demonstrates the usage of a NURBS surface object to create, and finalize a NURBS surface. !> It sets up control points and weights, generates the surface, and exports the control points !> and the surface to VTK files at various stages. program example_nurbs_surface use forcad , only : rk , nurbs_surface implicit none type ( nurbs_surface ) :: nurbs !! Declare a NURBS surface object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights !----------------------------------------------------------------------------- ! Setting up the NURBS surface !----------------------------------------------------------------------------- !> Define control points for the NURBS surface Xc = generate_Xc ( 10 , 10 , 1.5_rk ) !> Define weights for the control points allocate ( Wc ( size ( Xc , 1 )), source = 1.0_rk ) !> Set control points and weights for the NURBS surface object call nurbs % set ([ 10 , 10 ], Xc , Wc ) !> Export initial control points to a VTK file call nurbs % export_Xc ( 'vtk/demo_surface_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS surface !----------------------------------------------------------------------------- !> Generate the NURBS surface with a resolution of 30x30 call nurbs % create ( res1 = 30 , res2 = 30 ) !> Export the generated surface to a VTK file call nurbs % export_Xg ( 'vtk/demo_surface_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_surface_Xc.vtk' , 'vtk/demo_surface_Xg.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS surface object call nurbs % finalize () contains !----------------------------------------------------------------------------- function generate_Xc ( num_rows , num_cols , peak_height ) result ( control_points ) integer , intent ( in ) :: num_rows , num_cols real ( rk ), intent ( in ) :: peak_height real ( rk ), allocatable :: control_points (:,:) integer :: i , j real ( rk ) :: x_spacing , y_spacing , x_offset , y_offset x_spacing = 1.0_rk / real ( num_cols - 1 , rk ) y_spacing = 1.0_rk / real ( num_rows - 1 , rk ) x_offset = - 0.5_rk y_offset = - 0.5_rk allocate ( control_points ( num_rows * num_cols , 3 )) do i = 1 , num_rows do j = 1 , num_cols control_points (( i - 1 ) * num_cols + j , 1 ) = x_offset + real ( j - 1 , rk ) * x_spacing control_points (( i - 1 ) * num_cols + j , 2 ) = y_offset + real ( i - 1 , rk ) * y_spacing control_points (( i - 1 ) * num_cols + j , 3 ) = & peak_height * exp ( - (( control_points (( i - 1 ) * num_cols + j , 1 ) ** 2 ) & + ( control_points (( i - 1 ) * num_cols + j , 2 ) ** 2 ))) + 0.5_rk * peak_height * 0.2_rk end do end do end function !----------------------------------------------------------------------------- end program example_nurbs_surface","tags":"","loc":"sourcefile/demo_surface.f90.html"},{"title":"forcad_utils.f90 – ForCAD","text":"Files dependent on this one sourcefile~~forcad_utils.f90~~AfferentGraph sourcefile~forcad_utils.f90 forcad_utils.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~forcad.f90->sourcefile~forcad_utils.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_nurbs_curve.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 sourcefile~put_to_nurbs.f90 put_to_nurbs.f90 sourcefile~put_to_nurbs.f90->sourcefile~forcad_utils.f90 sourcefile~put_to_nurbs.f90->sourcefile~forcad.f90 sourcefile~demo_curve.f90 demo_curve.f90 sourcefile~demo_curve.f90->sourcefile~forcad.f90 sourcefile~demo_surface.f90 demo_surface.f90 sourcefile~demo_surface.f90->sourcefile~forcad.f90 sourcefile~demo_volume.f90 demo_volume.f90 sourcefile~demo_volume.f90->sourcefile~forcad.f90 sourcefile~example_curve_1.f90 example_curve_1.f90 sourcefile~example_curve_1.f90->sourcefile~forcad.f90 sourcefile~example_surface_1.f90 example_surface_1.f90 sourcefile~example_surface_1.f90->sourcefile~forcad.f90 sourcefile~example_volume_1.f90 example_volume_1.f90 sourcefile~example_volume_1.f90->sourcefile~forcad.f90 sourcefile~shape_circle.f90 shape_circle.f90 sourcefile~shape_circle.f90->sourcefile~forcad.f90 sourcefile~shape_hexahedron.f90 shape_hexahedron.f90 sourcefile~shape_hexahedron.f90->sourcefile~forcad.f90 sourcefile~shape_tetragon.f90 shape_tetragon.f90 sourcefile~shape_tetragon.f90->sourcefile~forcad.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> This module contains parameters, functions and subroutines that are used in the library. module forcad_utils implicit none private public :: rk , basis_bernstein , basis_bspline , elemConn_C0 , kron , ndgrid , compute_multiplicity , compute_knot_vector , & basis_bspline_der , insert_knot_A_5_1 , findspan , elevate_degree_A_5_9 , hexahedron_Xc , tetragon_Xc , remove_knots_A_5_8 , & elemConn_Cn , unique , rotation integer , parameter :: rk = kind ( 1.0d0 ) !=============================================================================== interface elemConn_C0 module procedure cmp_elemConn_C0_L module procedure cmp_elemConn_C0_S module procedure cmp_elemConn_C0_V end interface !=============================================================================== !=============================================================================== interface elemConn_Cn module procedure cmp_elemConn_Cn_L module procedure cmp_elemConn_Cn_S module procedure cmp_elemConn_Cn_V end interface !=============================================================================== !=============================================================================== interface ndgrid module procedure ndgrid2 module procedure ndgrid3 end interface !=============================================================================== !=============================================================================== interface compute_multiplicity module procedure compute_multiplicity1 module procedure compute_multiplicity2 end interface !=============================================================================== !=============================================================================== interface unique module procedure unique_integer module procedure unique_real end interface !=============================================================================== contains !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function basis_bspline ( Xt , knot , nc , degree ) result ( B ) integer , intent ( in ) :: degree real ( rk ), intent ( in ), contiguous :: knot (:) integer , intent ( in ) :: nc real ( rk ), intent ( in ) :: Xt real ( rk ) :: temp , Xth_i , Xth_i1 , Xth_ip , Xth_ip1 real ( rk ), allocatable :: Nt (:,:) integer :: i , p real ( rk ), allocatable :: B (:) temp = abs ( Xt - knot ( size ( knot ))) allocate ( Nt ( nc , 0 : degree ), source = 0.0_rk ) do p = 0 , degree do i = 1 , nc Xth_i = knot ( i ) Xth_i1 = knot ( i + 1 ) Xth_ip = knot ( i + p ) Xth_ip1 = knot ( i + p + 1 ) if ( temp /= tiny ( 0.0_rk ) . and . Xt >= Xth_i . and . Xt <= Xth_i1 ) Nt ( i , 0 ) = 1.0_rk if ( Xth_ip /= Xth_i ) Nt ( i , p ) = ( Xt - Xth_i ) / ( Xth_ip - Xth_i ) * Nt ( i , p - 1 ) if ( Xth_ip1 /= Xth_i1 ) Nt ( i , p ) = Nt ( i , p ) + ( Xth_ip1 - Xt ) / ( Xth_ip1 - Xth_i1 ) * Nt ( i + 1 , p - 1 ) end do end do B = Nt (:, degree ) end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function basis_bspline_der ( Xt , knot , nc , degree ) result ( dB ) integer , intent ( in ) :: degree real ( rk ), intent ( in ), contiguous :: knot (:) integer , intent ( in ) :: nc real ( rk ), intent ( in ) :: Xt real ( rk ), allocatable :: dB (:) real ( rk ), allocatable :: Nt (:,:), dNt_dXt (:,:) real ( rk ) :: R , L , Rp , Lp , knot_i , knot_ip , knot_jk , knot_jkm , knot_end , a , b , c , d integer :: i , k , n , m , jk k = degree + 1 n = nc - 1 allocate ( Nt ( nc + degree , degree + 1 )) Nt = 0.0_rk do i = 1 , n + k knot_i = knot ( i ) knot_ip = knot ( i + 1 ) knot_end = knot ( size ( knot )) if ( abs ( Xt - knot_end ) > tiny ( 0.0_rk ) ) then if ( Xt >= knot_i . and . Xt < knot_ip ) Nt ( i , 1 ) = 1.0_rk elseif ( abs ( Xt - knot_end ) < tiny ( 0.0_rk ) ) then if ( Xt >= knot_i . and . Xt <= knot_ip ) Nt ( i , 1 ) = 1.0_rk end if end do allocate ( dNt_dXt ( nc + degree , degree + 1 )) dNt_dXt = 0.0_rk m = 0 do jk = 2 , k m = m + 1 do i = 1 , n + k - m knot_i = knot ( i ) knot_ip = knot ( i + 1 ) knot_jk = knot ( i + jk ) knot_jkm = knot ( i + jk - 1 ) a = ( knot_jkm - knot_i ) b = ( knot_jk - Xt ) c = ( knot_jk - knot_ip ) d = ( Xt - knot_i ) R = d / a if ( isnan ( R ) . or . isinf ( R ) . or . abs ( R ) < tiny ( 0.0_rk ) ) R = 0.0_rk L = b / c if ( isnan ( L ) . or . isinf ( L ) . or . abs ( L ) < tiny ( 0.0_rk ) ) L = 0.0_rk Nt ( i , jk ) = R * Nt ( i , jk - 1 ) + L * Nt ( i + 1 , jk - 1 ) Rp = ( Nt ( i , jk - 1 ) + d * dNt_dXt ( i , jk - 1 )) / a if ( isnan ( Rp ) . or . isinf ( Rp ) . or . abs ( Rp ) < tiny ( 0.0_rk ) ) Rp = 0.0_rk Lp = ( b * dNt_dXt ( i + 1 , jk - 1 ) - Nt ( i + 1 , jk - 1 )) / c if ( isnan ( Lp ) . or . isinf ( Lp ) . or . abs ( Lp ) < tiny ( 0.0_rk ) ) Lp = 0.0_rk dNt_dXt ( i , jk ) = Rp + Lp end do end do dB = dNt_dXt ( 1 : nc , k ) end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function basis_bernstein ( Xt , nc ) result ( B ) real ( rk ), intent ( in ) :: Xt integer , intent ( in ) :: nc real ( rk ), allocatable :: B (:) integer :: p , degree degree = nc - 1 allocate ( B ( nc ), source = 0.0_rk ) do concurrent ( p = 0 : degree ) B ( p + 1 ) = gamma ( real ( nc , kind = rk )) / ( gamma ( real ( p + 1 , kind = rk )) * gamma ( real ( nc - p , kind = rk ))) if ( Xt == 0.0_rk . and . p == 0 ) then B ( p + 1 ) = B ( p + 1 ) * ( 1.0_rk - Xt ) ** ( degree - p ) else if ( Xt == 0.0_rk . and . degree - p == 0 ) then B ( p + 1 ) = B ( p + 1 ) * ( Xt ** p ) else B ( p + 1 ) = B ( p + 1 ) * ( Xt ** p ) * ( 1.0_rk - Xt ) ** ( degree - p ) end if end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function kron ( u , v ) result ( w ) real ( rk ), intent ( in ), contiguous :: u (:), v (:) real ( rk ) :: w ( size ( u ) * size ( v )) integer :: i , j , m , n m = size ( u ) n = size ( v ) do i = 1 , m do j = 1 , n w (( i - 1 ) * n + j ) = u ( i ) * v ( j ) end do end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine ndgrid2 ( X_dir1 , X_dir2 , Xt ) real ( rk ), intent ( in ), contiguous :: X_dir1 (:), X_dir2 (:) real ( rk ), allocatable , intent ( out ) :: Xt (:,:) integer :: s1 , s2 , i , j , n s1 = size ( X_dir1 ) s2 = size ( X_dir2 ) allocate ( Xt ( s1 * s2 , 2 )) n = 0 do j = 1 , s2 do i = 1 , s1 n = n + 1 Xt ( n , 1 ) = X_dir1 ( i ) Xt ( n , 2 ) = X_dir2 ( j ) end do end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine ndgrid3 ( X_dir1 , X_dir2 , X_dir3 , Xt ) real ( rk ), intent ( in ), contiguous :: X_dir1 (:), X_dir2 (:), X_dir3 (:) real ( rk ), allocatable , intent ( out ) :: Xt (:,:) integer :: s1 , s2 , s3 , i , j , k , n s1 = size ( X_dir1 ) s2 = size ( X_dir2 ) s3 = size ( X_dir3 ) allocate ( Xt ( s1 * s2 * s3 , 3 )) n = 0 do k = 1 , s3 do j = 1 , s2 do i = 1 , s1 n = n + 1 Xt ( n , 1 ) = X_dir1 ( i ) Xt ( n , 2 ) = X_dir2 ( j ) Xt ( n , 3 ) = X_dir3 ( k ) end do end do end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function repelem ( a , b ) result ( c ) real ( rk ), intent ( in ), contiguous :: a (:) integer , intent ( in ), contiguous :: b (:) real ( rk ) :: c ( sum ( b )) integer :: i , l , n l = 0 do i = 1 , size ( a ) n = b ( i ) c ( l + 1 : l + n ) = a ( i ) l = l + n end do end function repelem !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elemConn_C0_L ( nnode , p ) result ( elemConn ) integer , intent ( in ) :: nnode integer , intent ( in ) :: p integer , allocatable :: elemConn (:,:) integer :: i , l integer , allocatable :: nodes (:) allocate ( elemConn ( (( nnode - p ) / p ) , 2 )) nodes = [( i , i = 1 , nnode )] l = 0 do i = 1 , nnode - p , p l = l + 1 elemConn ( l ,:) = reshape ( nodes ( i : i + p ),[( p + 1 )]) end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elemConn_C0_S ( nnode1 , nnode2 , p1 , p2 ) result ( elemConn ) integer , intent ( in ) :: nnode1 , nnode2 integer , intent ( in ) :: p1 , p2 integer , allocatable :: elemConn (:,:) integer :: i , j , l integer , allocatable :: nodes (:,:) allocate ( elemConn ( (( nnode1 - p1 ) / p1 ) * (( nnode2 - p2 ) / p2 ) , 4 )) nodes = reshape ([( i , i = 1 , nnode1 * nnode2 )], [ nnode1 , nnode2 ]) l = 0 do j = 1 , nnode2 - p2 , p2 do i = 1 , nnode1 - p1 , p1 l = l + 1 elemConn ( l ,:) = reshape ( nodes ( i : i + p1 , j : j + p2 ),[( p1 + 1 ) * ( p2 + 1 )]) end do end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elemConn_C0_V ( nnode1 , nnode2 , nnode3 , p1 , p2 , p3 ) result ( elemConn ) integer , intent ( in ) :: nnode1 , nnode2 , nnode3 integer , intent ( in ) :: p1 , p2 , p3 integer , allocatable :: elemConn (:,:) integer :: i , j , k , l integer , allocatable :: nodes (:,:,:) allocate ( elemConn ( (( nnode1 - p1 ) / p1 ) * (( nnode2 - p2 ) / p2 ) * (( nnode3 - p3 ) / p3 ) , 8 )) nodes = reshape ([( i , i = 1 , nnode1 * nnode2 * nnode3 )], [ nnode1 , nnode2 , nnode3 ]) l = 0 do k = 1 , nnode3 - p3 , p3 do j = 1 , nnode2 - p2 , p2 do i = 1 , nnode1 - p1 , p1 l = l + 1 elemConn ( l ,:) = reshape ( nodes ( i : i + p1 , j : j + p2 , k : k + p3 ),[( p1 + 1 ) * ( p2 + 1 ) * ( p3 + 1 )]) end do end do end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine cmp_elemConn_Cn_L ( nnode , p , Xth , vecKnot_mul , elemConn ) integer , intent ( in ) :: p , nnode integer , intent ( in ), contiguous :: vecKnot_mul (:) real ( rk ), intent ( in ), contiguous :: Xth (:) integer , allocatable , intent ( out ) :: elemConn (:,:) integer , allocatable :: nodes (:) integer :: i , l , nnel , m , nelem nnel = p + 1 nodes = [( i , i = 1 , nnode )] nelem = size ( Xth ) - 1 allocate ( elemConn ( nelem , nnel )) l = 0 m = - p do i = 1 , nelem m = m + vecKnot_mul ( i ) l = l + 1 elemConn ( l ,:) = nodes ( m : m + p ) end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine cmp_elemConn_Cn_S ( nnode1 , nnode2 , p1 , p2 ,& Xth1 , Xth2 , vecKnot_mul1 , vecKnot_mul2 , elemConn ) integer , intent ( in ) :: p1 , p2 , nnode1 , nnode2 integer , intent ( in ), contiguous :: vecKnot_mul1 (:), vecKnot_mul2 (:) real ( rk ), intent ( in ), contiguous :: Xth1 (:), Xth2 (:) integer , allocatable , intent ( out ) :: elemConn (:,:) integer , allocatable :: nodes (:,:), nodes_vec (:) integer :: nnd_total , i , j , l , nnel1 , nnel2 , m , n , nelem1 , nelem2 , nelem nnel1 = p1 + 1 nnel2 = p2 + 1 nnd_total = nnode1 * nnode2 allocate ( nodes_vec ( nnd_total )) Nodes_vec = [( i , i = 1 , nnd_total )] nodes = reshape ( nodes_vec ,[ nnode1 , nnode2 ]) nelem1 = size ( Xth1 ) - 1 nelem2 = size ( Xth2 ) - 1 nelem = nelem1 * nelem2 allocate ( elemConn ( nelem , nnel1 * nnel2 )) l = 0 n = - p2 do j = 1 , nelem2 n = n + vecKnot_mul2 ( j ) m = - p1 do i = 1 , nelem1 m = m + vecKnot_mul1 ( i ) l = l + 1 elemConn ( l ,:) = reshape ( nodes ( m : m + p1 , n : n + p2 ), [ nnel1 * nnel2 ]) end do end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine cmp_elemConn_Cn_V ( nnode1 , nnode2 , nnode3 , p1 , p2 , p3 ,& Xth1 , Xth2 , Xth3 , vecKnot_mul1 , vecKnot_mul2 , vecKnot_mul3 , elemConn ) integer , intent ( in ) :: p1 , p2 , p3 , nnode1 , nnode2 , nnode3 integer , intent ( in ), contiguous :: vecKnot_mul1 (:), vecKnot_mul2 (:), vecKnot_mul3 (:) real ( rk ), intent ( in ), contiguous :: Xth1 (:), Xth2 (:), Xth3 (:) integer , allocatable , intent ( out ) :: elemConn (:,:) integer , allocatable :: nodes (:,:,:), nodes_vec (:) integer :: nnd_total , i , j , k , l , nnel1 , nnel2 , nnel3 , m , n , o , nelem1 , nelem2 , nelem3 , nelem nnel1 = p1 + 1 nnel2 = p2 + 1 nnel3 = p3 + 1 nnd_total = nnode1 * nnode2 * nnode3 allocate ( nodes_vec ( nnd_total )) Nodes_vec = [( i , i = 1 , nnd_total )] nodes = reshape ( nodes_vec ,[ nnode1 , nnode2 , nnode3 ]) nelem1 = size ( Xth1 ) - 1 nelem2 = size ( Xth2 ) - 1 nelem3 = size ( Xth3 ) - 1 nelem = nelem1 * nelem2 * nelem3 allocate ( elemConn ( nelem , nnel1 * nnel2 * nnel3 )) l = 0 o = - p3 do k = 1 , nelem3 o = o + vecKnot_mul3 ( k ) n = - p2 do j = 1 , nelem2 n = n + vecKnot_mul2 ( j ) m = - p1 do i = 1 , nelem1 m = m + vecKnot_mul1 ( i ) l = l + 1 elemConn ( l ,:) = reshape ( nodes ( m : m + p1 , n : n + p2 , o : o + p3 ), [ nnel1 * nnel2 * nnel3 ]) end do end do end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function compute_multiplicity1 ( knot ) result ( multiplicity ) real ( rk ), intent ( in ), contiguous :: knot (:) integer , allocatable :: multiplicity (:) integer :: i , count count = 1 do i = 2 , size ( knot ) if ( knot ( i ) /= knot ( i - 1 )) count = count + 1 end do allocate ( multiplicity ( count )) multiplicity ( 1 ) = 1 count = 1 do i = 2 , size ( knot ) if ( knot ( i ) /= knot ( i - 1 )) then count = count + 1 multiplicity ( count ) = 1 else multiplicity ( count ) = multiplicity ( count ) + 1 end if end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function compute_multiplicity2 ( knot , Xth ) result ( multiplicity ) real ( rk ), intent ( in ), contiguous :: knot (:) real ( rk ), intent ( in ) :: Xth integer :: multiplicity integer :: i , count , size_knot size_knot = size ( knot ) multiplicity = 0 i = 1 do while ( i <= size_knot ) if ( knot ( i ) == Xth ) then count = 1 do while ( i + count <= size_knot . and . knot ( i + count ) == Xth ) count = count + 1 end do if ( count > multiplicity ) then multiplicity = count end if i = i + count else i = i + 1 end if end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function compute_knot_vector ( Xth_dir , degree , continuity ) result ( knot ) real ( rk ), intent ( in ), contiguous :: Xth_dir (:) integer , intent ( in ) :: degree integer , intent ( in ), contiguous :: continuity (:) real ( rk ), allocatable :: knot (:) knot = repelem ( Xth_dir , ( degree - continuity )) end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause elemental pure function isinf ( x ) result ( output ) real ( rk ), intent ( in ) :: x logical :: output output = . false . if ( x > huge ( x )) output = . true . if ( x < - huge ( x )) output = . true . end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause elemental pure function isnan ( x ) result ( output ) real ( rk ), intent ( in ) :: x logical :: output output = . false . if ( x /= x ) output = . true . end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine insert_knot_A_5_1 ( p , UP , Pw , u , k , s , r , nq , UQ , Qw ) integer , intent ( in ) :: p , k , s , r real ( rk ), intent ( in ), contiguous :: UP ( 0 :), Pw ( 0 :,:) real ( rk ), intent ( in ) :: u real ( rk ), allocatable , intent ( out ) :: UQ (:), Qw (:,:) integer , intent ( out ) :: nq integer :: i , j , L , mp , dim , np real ( rk ), allocatable :: Rw (:,:) real ( rk ) :: alpha dim = size ( Pw , 2 ) np = size ( Pw , 1 ) - 1 mp = np + p + 1 nq = np + r allocate ( UQ ( 0 : mp + r )) allocate ( Qw ( 0 : nq , 1 : dim )) allocate ( Rw ( 0 : p , 1 : dim )) UQ ( 0 : k ) = UP ( 0 : k ) UQ ( k + 1 : k + r ) = u UQ ( k + 1 + r : mp + r ) = UP ( k + 1 : mp ) Qw ( 0 : k - p ,:) = Pw ( 0 : k - p ,:) Qw ( k - s + r : np + r ,:) = Pw ( k - s : np ,:) Rw ( 0 : p - s ,:) = Pw ( k - p : k - s ,:) do j = 1 , r L = k - p + j do i = 0 , p - j - s alpha = ( u - UP ( L + i )) / ( UP ( i + k + 1 ) - UP ( L + i )) Rw ( i ,:) = alpha * Rw ( i + 1 ,:) + ( 1.0_rk - alpha ) * Rw ( i ,:) end do Qw ( L ,:) = Rw ( 0 ,:) Qw ( k + r - j - s ,:) = Rw ( p - j - s ,:) end do Qw ( L + 1 : k - s - 1 ,:) = Rw ( 1 : k - s - 1 - L ,:) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function findspan ( n , degree , Xth , knot ) result ( s ) integer , intent ( in ) :: n , degree real ( rk ), intent ( in ) :: Xth real ( rk ), intent ( in ), contiguous :: knot (:) integer :: s integer :: low , high , mid if ( Xth == knot ( n + 2 )) then s = n return end if low = degree high = n + 1 mid = ( low + high ) / 2 do while ( Xth < knot ( mid + 1 ) . or . Xth >= knot ( mid + 2 )) if ( Xth < knot ( mid + 1 )) then high = mid else low = mid end if mid = ( low + high ) / 2 end do s = mid end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine elevate_degree_A_5_9 ( t , knot , degree , Xcw , nc_new , knot_new , Xcw_new ) integer , intent ( in ) :: t real ( rk ), intent ( in ), contiguous :: Xcw (:,:), knot (:) integer , intent ( in ) :: degree integer , intent ( out ) :: nc_new real ( rk ), allocatable , intent ( out ) :: Xcw_new (:,:), knot_new (:) real ( rk ), allocatable :: bezalfs (:,:), bpts (:,:), ebpts (:,:), Nextbpts (:,:), alfs (:) real ( rk ) :: inv , alpha1 , alpha2 , Xth1 , Xth2 , numer , den integer :: n , lbz , rbz , sv , tr , kj , first , knoti , last , alpha3 , dim , nc integer :: i , j , q , s , m , ph , ph2 , mpi , mh , r , a , b , Xcwi , oldr , mul integer , allocatable :: mlp (:) nc = size ( Xcw , 1 ) dim = size ( Xcw , 2 ) mlp = compute_multiplicity ( knot ) mlp = mlp + t nc_new = sum ( mlp ) - ( mlp ( 1 ) - 1 ) - 1 allocate ( Xcw_new ( nc_new , dim ), source = 0.0_rk ) allocate ( bezalfs ( degree + 1 , degree + t + 1 ), source = 0.0_rk ) allocate ( bpts ( degree + 1 , dim ), source = 0.0_rk ) allocate ( ebpts ( degree + t + 1 , dim ), source = 0.0_rk ) allocate ( Nextbpts ( degree + 1 , dim ), source = 0.0_rk ) allocate ( alfs ( degree ), source = 0.0_rk ) n = nc - 1 m = n + degree + 1 ph = degree + t ph2 = ph / 2 bezalfs ( 1 , 1 ) = 1.0_rk bezalfs ( degree + 1 , ph + 1 ) = 1.0_rk do i = 1 , ph2 inv = 1.0_rk / bincoeff ( ph , i ) mpi = min ( degree , i ) do j = max ( 0 , i - t ), mpi bezalfs ( j + 1 , i + 1 ) = inv * bincoeff ( degree , j ) * bincoeff ( t , i - j ) end do end do do i = ph2 + 1 , ph - 1 mpi = min ( degree , i ) do j = max ( 0 , i - t ), mpi bezalfs ( j + 1 , i + 1 ) = bezalfs ( degree - j + 1 , ph - i + 1 ) end do end do mh = ph knoti = ph + 1 r = - 1 a = degree b = degree + 1 Xcwi = 1 Xth1 = knot ( 1 ) Xcw_new ( 1 ,:) = Xcw ( 1 ,:) allocate ( knot_new ( sum ( mlp )), source = 0.0_rk ) knot_new ( 1 : ph + 1 ) = Xth1 do i = 0 , degree bpts ( i + 1 ,:) = Xcw ( i + 1 ,:) end do do while ( b < m ) i = b do while ( b < m . and . knot ( b + 1 ) == knot ( b + 2 )) b = b + 1 if ( b + 2 > size ( knot )) then exit end if end do mul = b - i + 1 mh = mh + mul + t Xth2 = knot ( b + 1 ) oldr = r r = degree - mul if ( oldr > 0 ) then lbz = ( oldr + 2 ) / 2 else lbz = 1 end if if ( r > 0 ) then rbz = ph - ( r + 1 ) / 2 else rbz = ph end if if ( r > 0 ) then numer = Xth2 - Xth1 do q = degree , mul + 1 , - 1 alfs ( q - mul ) = numer / ( knot ( a + q + 1 ) - Xth1 ) end do do j = 1 , r sv = r - j s = mul + j do q = degree , s , - 1 bpts ( q + 1 ,:) = ( 1.0_rk - alfs ( q - s + 1 )) * bpts ( q ,:) + alfs ( q - s + 1 ) * bpts ( q + 1 ,:) end do Nextbpts ( sv + 1 ,:) = bpts ( degree + 1 ,:) end do end if do i = lbz , ph ebpts ( i + 1 ,:) = 0.0_rk mpi = min ( degree , i ) do j = max ( 0 , i - t ), mpi ebpts ( i + 1 ,:) = bezalfs ( j + 1 , i + 1 ) * bpts ( j + 1 ,:) + ebpts ( i + 1 ,:) end do end do if ( oldr > 1 ) then first = knoti - 2 last = knoti den = Xth2 - Xth1 alpha3 = floor (( Xth2 - knot ( knoti )) / den ) do tr = 1 , oldr - 1 i = first j = last kj = j - knoti + 1 do while ( j - i > tr ) if ( i < Xcwi ) then alpha1 = ( Xth2 - knot ( i + 1 )) / ( Xth1 - knot ( i + 1 )) Xcw_new ( i + 1 ,:) = ( 1 - alpha1 ) * Xcw_new ( i ,:) + alpha1 * Xcw_new ( i + 1 ,:) end if if ( j >= lbz ) then if ( j - tr <= knoti - ph + oldr ) then alpha2 = ( Xth2 - knot_new ( j - tr + 1 )) / den ebpts ( kj + 1 ,:) = alpha2 * ebpts ( kj + 1 ,:) + ( 1 - alpha2 ) * ebpts ( kj + 2 ,:) else ebpts ( kj + 1 ,:) = ( 1 - alpha3 ) * ebpts (:, kj + 2 ) + alpha3 * ebpts ( kj + 1 ,:) end if end if i = i + 1 j = j - 1 kj = kj - 1 end do first = first - 1 last = last + 1 end do end if if ( a /= degree ) then do i = 0 , ph - oldr - 1 knot_new ( knoti + 1 ) = Xth1 knoti = knoti + 1 end do end if do j = lbz , rbz Xcw_new ( Xcwi + 1 ,:) = ebpts ( j + 1 ,:) Xcwi = Xcwi + 1 end do if ( b < m ) then do j = 0 , r - 1 bpts ( j + 1 ,:) = Nextbpts ( j + 1 ,:) end do do j = r , degree bpts ( j + 1 ,:) = Xcw ( b - degree + j + 1 ,:) end do a = b b = b + 1 Xth1 = Xth2 else do i = 0 , ph knot_new ( knoti + i + 1 ) = Xth2 end do end if end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function bincoeff ( n , k ) result ( b ) integer , intent ( in ) :: n , k real ( rk ) :: b b = floor ( 0.5_rk + exp ( factln ( n ) - factln ( k ) - factln ( n - k ))) end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function factln ( n ) result ( f ) integer , intent ( in ) :: n real ( rk ) :: f if ( n <= 1 ) then f = 0.0_rk return end if f = log ( gamma ( real ( n + 1 , rk ))) end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function hexahedron_Xc ( L , nc ) result ( Xc ) real ( rk ), intent ( in ) :: L ( 3 ) integer , intent ( in ) :: nc ( 3 ) real ( rk ), allocatable :: Xc (:,:) real ( rk ) :: dx , dy , dz integer :: i , j , k , nci dx = L ( 1 ) / real ( nc ( 1 ) - 1 , rk ) dy = L ( 2 ) / real ( nc ( 2 ) - 1 , rk ) dz = L ( 3 ) / real ( nc ( 3 ) - 1 , rk ) allocate ( Xc ( nc ( 1 ) * nc ( 2 ) * nc ( 3 ), 3 )) nci = 1 do k = 0 , nc ( 3 ) - 1 do j = 0 , nc ( 2 ) - 1 do i = 0 , nc ( 1 ) - 1 Xc ( nci , 1 ) = real ( i , rk ) * dx Xc ( nci , 2 ) = real ( j , rk ) * dy Xc ( nci , 3 ) = real ( k , rk ) * dz nci = nci + 1 end do end do end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function tetragon_Xc ( L , nc ) result ( Xc ) real ( rk ), intent ( in ) :: L ( 2 ) integer , intent ( in ) :: nc ( 2 ) real ( rk ), allocatable :: Xc (:,:) real ( rk ) :: dx , dy integer :: i , j , nci dx = L ( 1 ) / real ( nc ( 1 ) - 1 , rk ) dy = L ( 2 ) / real ( nc ( 2 ) - 1 , rk ) allocate ( Xc ( nc ( 1 ) * nc ( 2 ), 3 )) nci = 1 do j = 0 , nc ( 2 ) - 1 do i = 0 , nc ( 1 ) - 1 Xc ( nci , 1 ) = real ( i , rk ) * dx Xc ( nci , 2 ) = real ( j , rk ) * dy Xc ( nci , 3 ) = 0.0_rk nci = nci + 1 end do end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine remove_knots_A_5_8 ( p , knot , Pw , u , r , s , num , t , knot_new , Pw_new ) real ( rk ), intent ( in ) :: u integer , intent ( in ) :: p , r , s , num real ( rk ), intent ( in ), contiguous :: knot (:) real ( rk ), intent ( in ), contiguous :: Pw (:,:) real ( rk ), allocatable , intent ( out ) :: knot_new (:) real ( rk ), allocatable , intent ( out ) :: Pw_new (:,:) real ( rk ), allocatable :: Pw_copy (:,:), knot_copy (:) integer , intent ( out ) :: t real ( rk ) :: tol , alfi , alfj real ( rk ), allocatable :: temp (:,:) integer :: i , j , ii , jj , remflag , off , first , last , ord , fout , m , k , n , nc , dim , tt dim = size ( Pw , 2 ) nc = size ( Pw , 1 ) n = nc m = n + p + 1 ord = p + 1 fout = ( 2 * r - s - p ) / 2 last = r - s first = r - p Pw_copy = Pw knot_copy = knot ! TODO: tol = 1.0e-6_rk * minval ( Pw (:, dim )) / ( 1.0_rk + maxval ( sqrt ( sum ( Pw ** 2 , 2 )))) allocate ( temp ( 2 * p + 1 , dim ), source = 0.0_rk ) t = 0 do tt = 0 , num - 1 off = first - 1 temp ( 1 ,:) = Pw_copy ( off ,:) temp ( last + 1 - off + 1 ,:) = Pw_copy ( last + 1 ,:) i = first j = last ii = 1 jj = last - off remflag = 0 do while ( j - i > t ) alfi = ( u - knot_copy ( i )) / ( knot_copy ( i + ord + t ) - knot_copy ( i )) alfj = ( u - knot_copy ( j - t )) / ( knot_copy ( j + ord ) - knot_copy ( j - t )) temp ( ii + 1 ,:) = ( Pw_copy ( i ,:) - ( 1.0_rk - alfi ) * temp ( ii - 1 + 1 ,:)) / alfi temp ( jj + 1 ,:) = ( Pw_copy ( j ,:) - alfj * temp ( jj + 1 + 1 ,:)) / ( 1.0_rk - alfj ) i = i + 1 ii = ii + 1 j = j - 1 jj = jj - 1 end do if ( j - i <= t ) then if ( norm2 ( temp ( ii - 1 + 1 ,:) - temp ( jj + 1 + 1 ,:)) <= tol ) then remflag = 1 else alfi = ( u - knot_copy ( i )) / ( knot_copy ( i + ord + t ) - knot_copy ( i )) if ( norm2 ( Pw_copy ( i ,:) - ( alfi * temp ( ii + t + 1 + 1 ,:) + ( 1.0_rk - alfi ) * temp ( ii - 1 + 1 ,:))) <= tol ) then remflag = 1 end if end if end if if ( remflag == 0 ) then exit else i = first j = last do while ( j - i > t ) Pw_copy ( i ,:) = temp ( i - off + 1 ,:) Pw_copy ( j ,:) = temp ( j - off + 1 ,:) i = i + 1 j = j - 1 end do end if first = first - 1 last = last + 1 t = t + 1 end do if ( t == 0 ) then return end if do k = r + 1 , m knot_copy ( k - t ) = knot_copy ( k ) end do j = fout i = j do k = 1 , t - 1 if ( mod ( k , 2 ) == 1 ) then i = i + 1 else j = j - 1 end if end do do k = i + 1 , n Pw_copy ( j ,:) = Pw_copy ( k ,:) j = j + 1 end do knot_new = knot_copy ( 1 : size ( knot_copy ) - t ) Pw_new = Pw_copy ( 1 : size ( Pw_copy , 1 ) - t ,:) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function unique_integer ( vec ) result ( output ) integer , dimension (:), intent ( in ), contiguous :: vec integer , dimension (:), allocatable :: output integer :: i , j , k allocate ( output ( 0 )) do i = 1 , size ( vec ) k = 0 do j = 1 , size ( output ) if ( vec ( i ) == output ( j )) then k = k + 1 exit end if end do if ( k == 0 ) then output = [ output , vec ( i )] end if end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function unique_real ( vec ) result ( output ) real ( rk ), dimension (:), intent ( in ), contiguous :: vec real ( rk ), dimension (:), allocatable :: output integer :: i , j , k allocate ( output ( 0 )) do i = 1 , size ( vec ) k = 0 do j = 1 , size ( output ) if ( vec ( i ) == output ( j )) then k = k + 1 exit end if end do if ( k == 0 ) then output = [ output , vec ( i )] end if end do end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function rotation ( alpha , beta , theta ) result ( R ) real ( rk ), intent ( in ) :: alpha , beta , theta real ( rk ), dimension ( 3 , 3 ) :: R R ( 1 , 1 ) = cosd ( beta ) * cosd ( theta ) R ( 2 , 1 ) = cosd ( beta ) * sind ( theta ) R ( 3 , 1 ) = - sind ( beta ) R ( 1 , 2 ) = sind ( alpha ) * sind ( beta ) * cosd ( theta ) - cosd ( alpha ) * sind ( theta ) R ( 2 , 2 ) = sind ( alpha ) * sind ( beta ) * sind ( theta ) + cosd ( alpha ) * cosd ( theta ) R ( 3 , 2 ) = sind ( alpha ) * cosd ( beta ) R ( 1 , 3 ) = cosd ( alpha ) * sind ( beta ) * cosd ( theta ) + sind ( alpha ) * sind ( theta ) R ( 2 , 3 ) = cosd ( alpha ) * sind ( beta ) * sind ( theta ) - sind ( alpha ) * cosd ( theta ) R ( 3 , 3 ) = cosd ( alpha ) * cosd ( beta ) end function !=============================================================================== end module forcad_utils","tags":"","loc":"sourcefile/forcad_utils.f90.html"},{"title":"forcad.f90 – ForCAD","text":"This file depends on sourcefile~~forcad.f90~~EfferentGraph sourcefile~forcad.f90 forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Files dependent on this one sourcefile~~forcad.f90~~AfferentGraph sourcefile~forcad.f90 forcad.f90 sourcefile~demo_curve.f90 demo_curve.f90 sourcefile~demo_curve.f90->sourcefile~forcad.f90 sourcefile~demo_surface.f90 demo_surface.f90 sourcefile~demo_surface.f90->sourcefile~forcad.f90 sourcefile~demo_volume.f90 demo_volume.f90 sourcefile~demo_volume.f90->sourcefile~forcad.f90 sourcefile~example_curve_1.f90 example_curve_1.f90 sourcefile~example_curve_1.f90->sourcefile~forcad.f90 sourcefile~example_surface_1.f90 example_surface_1.f90 sourcefile~example_surface_1.f90->sourcefile~forcad.f90 sourcefile~example_volume_1.f90 example_volume_1.f90 sourcefile~example_volume_1.f90->sourcefile~forcad.f90 sourcefile~put_to_nurbs.f90 put_to_nurbs.f90 sourcefile~put_to_nurbs.f90->sourcefile~forcad.f90 sourcefile~shape_circle.f90 shape_circle.f90 sourcefile~shape_circle.f90->sourcefile~forcad.f90 sourcefile~shape_hexahedron.f90 shape_hexahedron.f90 sourcefile~shape_hexahedron.f90->sourcefile~forcad.f90 sourcefile~shape_tetragon.f90 shape_tetragon.f90 sourcefile~shape_tetragon.f90->sourcefile~forcad.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause module forcad use forcad_utils use forcad_nurbs_curve use forcad_nurbs_surface use forcad_nurbs_volume private public rk , nurbs_curve , nurbs_surface , nurbs_volume end module forcad","tags":"","loc":"sourcefile/forcad.f90.html"},{"title":"demo_volume.f90 – ForCAD","text":"This file depends on sourcefile~~demo_volume.f90~~EfferentGraph sourcefile~demo_volume.f90 demo_volume.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~demo_volume.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> This program demonstrates the usage of a NURBS volume object to create, and finalize a NURBS volume. !> It sets up control points and weights, generates the volume, and exports the control points !> and the volume to VTK files at various stages. program example_nurbs_volume use forcad , only : rk , nurbs_volume implicit none type ( nurbs_volume ) :: nurbs !! Declare a NURBS volume object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights !----------------------------------------------------------------------------- ! Setting up the NURBS volume !----------------------------------------------------------------------------- !> Define control points for the NURBS volume Xc = generate_Xc ( 1.0_rk ) !> Define weights for the control points allocate ( Wc ( size ( Xc , 1 )), source = 1.0_rk ) !> Set control points and weights for the NURBS volume object call nurbs % set ([ 2 , 2 , 2 ], Xc , Wc ) !> Export initial control points to a VTK file call nurbs % export_Xc ( 'vtk/demo_volume_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS volume !----------------------------------------------------------------------------- !> Generate the NURBS volume with a resolution of 15X15X15 call nurbs % create ( 15 , 15 , 15 ) !> Export the generated volume to a VTK file call nurbs % export_Xg ( 'vtk/demo_volume_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_volume_Xc.vtk' , 'vtk/demo_volume_Xg.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS volume object call nurbs % finalize () contains !----------------------------------------------------------------------------- function generate_Xc ( L ) result ( control_points ) implicit none real ( rk ), intent ( in ) :: L real ( rk ), allocatable :: control_points (:,:) real ( rk ) :: L2 L2 = L / 2.0_rk allocate ( control_points ( 8 , 3 )) control_points ( 1 ,:) = [ L2 , - L2 , L2 ] control_points ( 2 ,:) = [ L2 , - L2 , - L2 ] control_points ( 3 ,:) = [ - L2 , - L2 , L2 ] control_points ( 4 ,:) = [ - L2 , - L2 , - L2 ] control_points ( 5 ,:) = [ L2 , L2 , L2 ] control_points ( 6 ,:) = [ L2 , L2 , - L2 ] control_points ( 7 ,:) = [ - L2 , L2 , L2 ] control_points ( 8 ,:) = [ - L2 , L2 , - L2 ] end function !----------------------------------------------------------------------------- end program example_nurbs_volume","tags":"","loc":"sourcefile/demo_volume.f90.html"},{"title":"example_surface_1.f90 – ForCAD","text":"This file depends on sourcefile~~example_surface_1.f90~~EfferentGraph sourcefile~example_surface_1.f90 example_surface_1.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~example_surface_1.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> This program demonstrates the usage of a NURBS (Non-Uniform Rational B-Spline) surface object to create and finalize a NURBS surface. !> It sets up control points, weights, and knot vectors for all three dimensions, generates the surface, and exports the control points and the surface to VTK files. program example3_surface use forcad implicit none type ( nurbs_surface ) :: nurbs !! Declare a NURBS surface object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights real ( rk ) :: knot1 ( 6 ), knot2 ( 6 ) !! Arrays for knot vectors in both dimensions !----------------------------------------------------------------------------- ! Setting up the NURBS surface !----------------------------------------------------------------------------- !> Define control points for the NURBS surface Xc = generate_Xc ( 3 , 3 , 1.0_rk ) !> Define weights for the control points allocate ( Wc ( size ( Xc , 1 ))) Wc = 1.0_rk Wc ( 2 ) = 2.0_rk !> Define knot vectors for both dimensions knot1 = [ 0.0_rk , 0.0_rk , 0.0_rk , 1.0_rk , 1.0_rk , 1.0_rk ] knot2 = [ 0.0_rk , 0.0_rk , 0.0_rk , 1.0_rk , 1.0_rk , 1.0_rk ] !> Set knot vectors, control points, and weights for the NURBS surface object call nurbs % set ( knot1 , knot2 , Xc , Wc ) !> Export the control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_surface_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS surface !----------------------------------------------------------------------------- !> Generate the NURBS surface with resolutions of 30 in both dimensions call nurbs % create ( 30 , 30 ) !> Export the generated surface to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_surface_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/nurbs_surface_Xc.vtk' , 'vtk/nurbs_surface_Xg.vtk' ) !----------------------------------------------------------------------------- ! Refinements !----------------------------------------------------------------------------- !> Print size of the knot vectors print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) !> Insert knots 0.25, twice and 0.75, once in both directions call nurbs % insert_knots ( 1 , [ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) ! direction 1 call nurbs % insert_knots ( 2 , [ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) ! direction 2 !> Print size of the knot vectors after inserting knots print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) !> Print the degrees print * , nurbs % get_degree () !> Elevate degree by 2 in both directions call nurbs % elevate_degree ( 1 , 2 ) ! direction 1 call nurbs % elevate_degree ( 2 , 2 ) ! direction 2 !> Print the degrees after elevating print * , nurbs % get_degree () !> Print size of the knot vectors print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) !> Remove knots 0.25, twice and 0.75, once in both directions call nurbs % remove_knots ( 1 , [ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) ! direction 1 call nurbs % remove_knots ( 2 , [ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) ! direction 2 !> Print size of the knot vectors after removing knots print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) !> Generate the refined NURBS surface with resolutions of 30 in both dimensions call nurbs % create () !> Export updated control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_surface_Xc2.vtk' ) !> Export the refined generated surface to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_surface_Xg2.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/nurbs_surface_Xc2.vtk' , 'vtk/nurbs_surface_Xg2.vtk' ) !----------------------------------------------------------------------------- ! Transformations !----------------------------------------------------------------------------- !> Rotate the control points call nurbs % rotate_Xc ( alpha = 4 5.0_rk , beta = 0.0_rk , theta = 9 0.0_rk ) !> Rotate the generated curve call nurbs % rotate_Xg ( alpha =- 4 5.0_rk , beta = 0.0_rk , theta =- 9 0.0_rk ) !> Translate the control points call nurbs % translate_Xc ([ 1.0_rk , 2.0_rk , - 3.0_rk ]) !> Translate the generated curve call nurbs % translate_Xg ([ - 1.0_rk , - 2.0_rk , 3.0_rk ]) !> Export the transformed control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_surface_Xc3.vtk' ) !> Export the transformed generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_surface_Xg3.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/nurbs_surface_Xc3.vtk' , 'vtk/nurbs_surface_Xg3.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS surface object call nurbs % finalize () contains !----------------------------------------------------------------------------- function generate_Xc ( num_rows , num_cols , peak_height ) result ( control_points ) integer , intent ( in ) :: num_rows , num_cols real ( rk ), intent ( in ) :: peak_height real ( rk ), allocatable :: control_points (:,:) integer :: i , j real ( rk ) :: x_spacing , y_spacing , x_offset , y_offset x_spacing = 1.0_rk / real ( num_cols - 1 , rk ) y_spacing = 1.0_rk / real ( num_rows - 1 , rk ) x_offset = - 0.5_rk y_offset = - 0.5_rk allocate ( control_points ( num_rows * num_cols , 3 )) do i = 1 , num_rows do j = 1 , num_cols control_points (( i - 1 ) * num_cols + j , 1 ) = x_offset + real ( j - 1 , rk ) * x_spacing control_points (( i - 1 ) * num_cols + j , 2 ) = y_offset + real ( i - 1 , rk ) * y_spacing control_points (( i - 1 ) * num_cols + j , 3 ) = & peak_height * exp ( - (( control_points (( i - 1 ) * num_cols + j , 1 ) ** 2 ) & + ( control_points (( i - 1 ) * num_cols + j , 2 ) ** 2 ))) + 0.5_rk * peak_height * 0.2_rk end do end do end function !----------------------------------------------------------------------------- end program example3_surface","tags":"","loc":"sourcefile/example_surface_1.f90.html"},{"title":"shape_tetragon.f90 – ForCAD","text":"This file depends on sourcefile~~shape_tetragon.f90~~EfferentGraph sourcefile~shape_tetragon.f90 shape_tetragon.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~shape_tetragon.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code program shape_tetragon use forcad implicit none type ( nurbs_surface ) :: shape !! Declare a NURBS surface object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights real ( rk ), allocatable :: knot1 (:), knot2 (:) !! Arrays for knot vectors in both dimensions !----------------------------------------------------------------------------- ! Setting up the NURBS tetrangon !----------------------------------------------------------------------------- !> Set a tetragon with lengths of 2.0 and 3.0 and 3 and 4 control points in each direction !> The weights of the control points (Wc) are optional. call shape % set_tetragon ( L = [ 2.0_rk , 3.0_rk ], nc = [ 3 , 4 ]) !> Export the control points to a VTK file call shape % export_Xc ( 'vtk/shape_tetragon_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS surface !----------------------------------------------------------------------------- !> Generate the NURBS surface with resolutions of 30 in both dimensions call shape % create ( 30 , 30 ) !> Export the generated surface to a VTK file call shape % export_Xg ( 'vtk/shape_tetragon_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 shape % show ( 'vtk/shape_tetragon_Xc.vtk' , 'vtk/shape_tetragon_Xg.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS surface object call shape % finalize () end program","tags":"","loc":"sourcefile/shape_tetragon.f90.html"},{"title":"example_volume_1.f90 – ForCAD","text":"This file depends on sourcefile~~example_volume_1.f90~~EfferentGraph sourcefile~example_volume_1.f90 example_volume_1.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~example_volume_1.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> This program demonstrates the usage of a NURBS (Non-Uniform Rational B-Spline) volume object to create and finalize a NURBS volume. !> It sets up control points, weights, and knot vectors for all three dimensions, generates the volume, and exports the control points and the volume to VTK files. program example3_volume use forcad , only : rk , nurbs_volume implicit none type ( nurbs_volume ) :: nurbs !! Declare a NURBS volume object real ( rk ), allocatable :: Xc (:,:), Wc (:) !! Arrays for control points and weights real ( rk ) :: knot1 ( 4 ), knot2 ( 4 ), knot3 ( 4 ) !! Arrays for knot vectors in all three dimensions !----------------------------------------------------------------------------- ! Setting up the NURBS volume !----------------------------------------------------------------------------- !> Define the control points for the NURBS volume Xc = generate_Xc ( 5.0_rk ) !> Define weights for the control points (optional) allocate ( Wc ( size ( Xc , 1 )), source = 1.0_rk ) Wc ( 2 ) = 5.0_rk !> Define knot vectors for all three dimensions 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 ] !> Set knot vectors, control points, and weights for the NURBS volume object !> Wc is optional. call nurbs % set ( knot1 , knot2 , knot3 , Xc , Wc ) !> Export the control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_volume_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS volume !----------------------------------------------------------------------------- !> Generate the NURBS volume with resolutions of 20, 20, and 20 in the three dimensions call nurbs % create ( 20 , 20 , 20 ) !> Export the generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_volume_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/nurbs_volume_Xc.vtk' , 'vtk/nurbs_volume_Xg.vtk' ) !----------------------------------------------------------------------------- ! Refinements !----------------------------------------------------------------------------- !> Print size of knot vectors print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) print * , size ( nurbs % get_knot ( 3 )) !> Insert knots 0.25 and 0.75 in all three directions call nurbs % insert_knots ( 1 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 1 call nurbs % insert_knots ( 2 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 2 call nurbs % insert_knots ( 3 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 3 !> Print size of knot vectors after inserting knots print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) print * , size ( nurbs % get_knot ( 3 )) !> Print degrees print * , nurbs % get_degree () !> Elevate degree by 2 in all three directions call nurbs % elevate_degree ( 1 , 2 ) ! direction 1 call nurbs % elevate_degree ( 2 , 2 ) ! direction 2 call nurbs % elevate_degree ( 3 , 2 ) ! direction 3 !> Print degrees after elevating print * , nurbs % get_degree () !> Print size of knot vectors print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) print * , size ( nurbs % get_knot ( 3 )) call nurbs % remove_knots ( 1 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 1 call nurbs % remove_knots ( 2 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 2 call nurbs % remove_knots ( 3 , [ 0.25_rk , 0.75_rk ], [ 1 , 1 ]) ! direction 3 !> Print size of knot vectors after removing knots print * , size ( nurbs % get_knot ( 1 )) print * , size ( nurbs % get_knot ( 2 )) print * , size ( nurbs % get_knot ( 3 )) !> Generate the refined NURBS volume with resolutions of 40, 40, and 40 in the three dimensions call nurbs % create () !> Export updated control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_volume_Xc2.vtk' ) !> Export the refined generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_volume_Xg2.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/nurbs_volume_Xc2.vtk' , 'vtk/nurbs_volume_Xg2.vtk' ) !----------------------------------------------------------------------------- ! Transformations !----------------------------------------------------------------------------- !> Rotate the control points call nurbs % rotate_Xc ( alpha =- 4 5.0_rk , beta = 0.0_rk , theta = 9 0.0_rk ) !> Rotate the generated curve call nurbs % rotate_Xg ( alpha =- 4 5.0_rk , beta = 0.0_rk , theta = 9 0.0_rk ) !> Translate the control points call nurbs % translate_Xc ([ 1.0_rk , 2.0_rk , - 3.0_rk ]) !> Translate the generated curve call nurbs % translate_Xg ([ 1.0_rk , 2.0_rk , - 3.0_rk ]) !> Export the transformed control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_volume_Xc3.vtk' ) !> Export the transformed generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_volume_Xg3.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/nurbs_volume_Xc3.vtk' , 'vtk/nurbs_volume_Xg3.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS volume object call nurbs % finalize () contains !----------------------------------------------------------------------------- function generate_Xc ( L ) result ( control_points ) implicit none real ( rk ), intent ( in ) :: L real ( rk ), allocatable :: control_points (:,:) real ( rk ) :: L2 L2 = L / 2.0_rk allocate ( control_points ( 8 , 3 )) control_points ( 1 ,:) = [ L2 , - L2 , L2 ] control_points ( 2 ,:) = [ L2 , - L2 , - L2 ] control_points ( 3 ,:) = [ - L2 , - L2 , L2 ] control_points ( 4 ,:) = [ - L2 , - L2 , - L2 ] control_points ( 5 ,:) = [ L2 , L2 , L2 ] control_points ( 6 ,:) = [ L2 , L2 , - L2 ] control_points ( 7 ,:) = [ - L2 , L2 , L2 ] control_points ( 8 ,:) = [ - L2 , L2 , - L2 ] end function !----------------------------------------------------------------------------- end program example3_volume","tags":"","loc":"sourcefile/example_volume_1.f90.html"},{"title":"shape_hexahedron.f90 – ForCAD","text":"This file depends on sourcefile~~shape_hexahedron.f90~~EfferentGraph sourcefile~shape_hexahedron.f90 shape_hexahedron.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~shape_hexahedron.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code program shape_hexahedron use forcad , only : rk , nurbs_volume implicit none type ( nurbs_volume ) :: shape !> Set up a hexahedron shape with dimensions L = [2.0, 4.0, 8.0] and a specified number of control points nc = [4, 6, 8]. !> The weights of the control points (Wc) are optional. call shape % set_hexahedron ( L = [ 2.0_rk , 4.0_rk , 8.0_rk ], nc = [ 4 , 6 , 8 ]) ! Additional modifications can be made to control points and weights, or the NURBS can be refined using knot insertion or degree elevation. ! call shape%insert_knots(...) ! call shape%elevate_degree(...) ! ... !> Export the control points to a VTK file for visualization. call shape % export_Xc ( 'vtk/shape_hexahedron_Xc.vtk' ) !> Create the shape using the specified number of elements in each direction. call shape % create ( 8 , 16 , 32 ) !> Export the geometry to a VTK file for visualization. call shape % export_Xg ( 'vtk/shape_hexahedron_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 shape % show ( 'vtk/shape_hexahedron_Xc.vtk' , 'vtk/shape_hexahedron_Xg.vtk' ) !> Finalize and clean up the shape object. call shape % finalize () end program","tags":"","loc":"sourcefile/shape_hexahedron.f90.html"},{"title":"shape_circle.f90 – ForCAD","text":"This file depends on sourcefile~~shape_circle.f90~~EfferentGraph sourcefile~shape_circle.f90 shape_circle.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~shape_circle.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code program shape_circle use forcad , only : rk , nurbs_curve implicit none type ( nurbs_curve ) :: shape !----------------------------------------------------------------------------- ! Setting up NURBS circle !----------------------------------------------------------------------------- !> Set a circle with radius 2.0 and center at [0.0, 0.0, 0.0] call shape % set_circle ( center = [ 0.0_rk , 0.0_rk , 0.0_rk ], radius = 2.0_rk ) !> Export control points to a VTK file call shape % export_Xc ( 'vtk/shape_circle_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating circle !----------------------------------------------------------------------------- !> Generate the NURBS circle with a resolution of 100 call shape % create ( res = 100 ) !> Export the generated cirlce to a VTK file call shape % export_Xg ( 'vtk/shape_circle_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 shape % show ( 'vtk/shape_circle_Xc.vtk' , 'vtk/shape_circle_Xg.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS curve object call shape % finalize () end program","tags":"","loc":"sourcefile/shape_circle.f90.html"},{"title":"demo_curve.f90 – ForCAD","text":"This file depends on sourcefile~~demo_curve.f90~~EfferentGraph sourcefile~demo_curve.f90 demo_curve.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~demo_curve.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> 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. 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 ) !> 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","tags":"","loc":"sourcefile/demo_curve.f90.html"},{"title":"example_curve_1.f90 – ForCAD","text":"This file depends on sourcefile~~example_curve_1.f90~~EfferentGraph sourcefile~example_curve_1.f90 example_curve_1.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~example_curve_1.f90->sourcefile~forcad.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_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> This program demonstrates the usage of a NURBS (Non-Uniform Rational B-Spline) curve object to create and finalize a NURBS curve. !> It sets up control points, weights, and knot vectors for all three dimensions, generates the curve, and exports the control points and the curve to VTK files. program example1_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 real ( rk ) :: knot ( 6 ) !! Array for knot vector !----------------------------------------------------------------------------- ! Setting up the NURBS curve !----------------------------------------------------------------------------- !> Define control points for the NURBS curve allocate ( Xc ( 3 , 3 )) Xc ( 1 ,:) = [ 0.0_rk , 0.0_rk , 0.0_rk ] Xc ( 2 ,:) = [ 0.0_rk , 5.0_rk , 0.0_rk ] Xc ( 3 ,:) = [ 5.0_rk , 5.0_rk , 0.0_rk ] !> Define weights for the control points (optional) allocate ( Wc ( 3 )) Wc = [ 1.0_rk , 2.0_rk , 0.3_rk ] !> Define knot vector knot = [ 0.0_rk , 0.0_rk , 0.0_rk , 1.0_rk , 1.0_rk , 1.0_rk ] !> Set knot vector, control points, and weights for the NURBS curve object. !> Wc is optional call nurbs % set ( knot , Xc , Wc ) !> Export control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_curve_Xc.vtk' ) !----------------------------------------------------------------------------- ! Creating the NURBS curve !----------------------------------------------------------------------------- !> Generate the NURBS curve with a resolution of 20 call nurbs % create ( res = 20 ) !> Export the generated curve to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_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/nurbs_curve_Xc.vtk' , 'vtk/nurbs_curve_Xg.vtk' ) !----------------------------------------------------------------------------- ! Refinements !----------------------------------------------------------------------------- !> Print size of the knot vector print * , size ( nurbs % get_knot ()) !> Insert knots 0.25, twice and 0.75, once call nurbs % insert_knots ([ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) !> Print size of the updated knot vector print * , size ( nurbs % get_knot ()) !> Print the degree of the curve print * , nurbs % get_degree () !> Elevate the degree of the curve (2 times) call nurbs % elevate_degree ( 2 ) !> Print the updated degree of the curve print * , nurbs % get_degree () !> Print size of the knot vector print * , size ( nurbs % get_knot ()) !> Remove knots 0.25, twice and 0.75, once call nurbs % remove_knots ([ 0.25_rk , 0.75_rk ], [ 2 , 1 ]) !> Print size of the updated knot vector print * , size ( nurbs % get_knot ()) !> Generate the refined curve with a resolution of 20 call nurbs % create () !> Export updated control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_curve_Xc2.vtk' ) !> Export the refined generated curve to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_curve_Xg2.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/nurbs_curve_Xc2.vtk' , 'vtk/nurbs_curve_Xg2.vtk' ) !----------------------------------------------------------------------------- ! Transformations !----------------------------------------------------------------------------- !> Rotate the control points call nurbs % rotate_Xc ( alpha = 4 5.0_rk , beta = 0.0_rk , theta = 9 0.0_rk ) !> Rotate the generated curve call nurbs % rotate_Xg ( alpha =- 4 5.0_rk , beta = 0.0_rk , theta =- 9 0.0_rk ) !> Translate the control points call nurbs % translate_Xc ([ 1.0_rk , 2.0_rk , - 3.0_rk ]) !> Translate the generated curve call nurbs % translate_Xg ([ - 1.0_rk , - 2.0_rk , 3.0_rk ]) !> Export the transformed control points to a VTK file call nurbs % export_Xc ( 'vtk/nurbs_curve_Xc3.vtk' ) !> Export the transformed generated volume to a VTK file call nurbs % export_Xg ( 'vtk/nurbs_curve_Xg3.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/nurbs_curve_Xc3.vtk' , 'vtk/nurbs_curve_Xg3.vtk' ) !----------------------------------------------------------------------------- ! Finalizing !----------------------------------------------------------------------------- !> Finalize the NURBS curve object call nurbs % finalize () end program example1_curve","tags":"","loc":"sourcefile/example_curve_1.f90.html"},{"title":"forcad_nurbs_surface.f90 – ForCAD","text":"This file depends on sourcefile~~forcad_nurbs_surface.f90~~EfferentGraph sourcefile~forcad_nurbs_surface.f90 forcad_nurbs_surface.f90 sourcefile~forcad_utils.f90 forcad_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Files dependent on this one sourcefile~~forcad_nurbs_surface.f90~~AfferentGraph sourcefile~forcad_nurbs_surface.f90 forcad_nurbs_surface.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~forcad.f90->sourcefile~forcad_nurbs_surface.f90 sourcefile~demo_curve.f90 demo_curve.f90 sourcefile~demo_curve.f90->sourcefile~forcad.f90 sourcefile~demo_surface.f90 demo_surface.f90 sourcefile~demo_surface.f90->sourcefile~forcad.f90 sourcefile~demo_volume.f90 demo_volume.f90 sourcefile~demo_volume.f90->sourcefile~forcad.f90 sourcefile~example_curve_1.f90 example_curve_1.f90 sourcefile~example_curve_1.f90->sourcefile~forcad.f90 sourcefile~example_surface_1.f90 example_surface_1.f90 sourcefile~example_surface_1.f90->sourcefile~forcad.f90 sourcefile~example_volume_1.f90 example_volume_1.f90 sourcefile~example_volume_1.f90->sourcefile~forcad.f90 sourcefile~put_to_nurbs.f90 put_to_nurbs.f90 sourcefile~put_to_nurbs.f90->sourcefile~forcad.f90 sourcefile~shape_circle.f90 shape_circle.f90 sourcefile~shape_circle.f90->sourcefile~forcad.f90 sourcefile~shape_hexahedron.f90 shape_hexahedron.f90 sourcefile~shape_hexahedron.f90->sourcefile~forcad.f90 sourcefile~shape_tetragon.f90 shape_tetragon.f90 sourcefile~shape_tetragon.f90->sourcefile~forcad.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> This module defines the 'nurbs_surface' type for representing a Non-Uniform Rational B-Spline (NURBS) surface. module forcad_nurbs_surface use forcad_utils , only : rk , basis_bspline , elemConn_C0 , kron , ndgrid , compute_multiplicity , compute_knot_vector , & basis_bspline_der , insert_knot_A_5_1 , findspan , elevate_degree_A_5_9 , remove_knots_A_5_8 , tetragon_Xc , & elemConn_Cn , unique , rotation implicit none private public nurbs_surface !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause type nurbs_surface real ( rk ), allocatable , private :: Xc (:,:) !! Control points (2D array: [nc(1)*nc(2), dim]) real ( rk ), allocatable , private :: Xg (:,:) !! Geometry points (2D array: [ng(1)*ng(2), dim]) real ( rk ), allocatable , private :: Wc (:) !! Weights for control points (1D array: [nc(1)*nc(2)]) real ( rk ), allocatable , private :: Xt1 (:) !! Evaluation parameter values in the first direction (1D array: [ng(1)]) real ( rk ), allocatable , private :: Xt2 (:) !! Evaluation parameter values in the second direction (1D array: [ng(2)]) real ( rk ), allocatable , private :: knot1 (:) !! Knot vector in the first direction (1D array) real ( rk ), allocatable , private :: knot2 (:) !! Knot vector in the second direction (1D array) integer , private :: degree ( 2 ) !! Degree (order) of the surface integer , private :: nc ( 2 ) !! Number of control points in each direction integer , private :: ng ( 2 ) !! Number of geometry points in each direction integer , allocatable , private :: elemConn_Xc_vis (:,:) !! Connectivity for visualization of control points integer , allocatable , private :: elemConn_Xg_vis (:,:) !! Connectivity for visualization of geometry points integer , allocatable , private :: elemConn (:,:) !! IGA element connectivity contains procedure :: set1 !!> Set knot vectors, control points and weights for the NURBS surface object procedure :: set2 !!> Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights procedure :: set3 !!> Set Bezier or Rational Bezier surface using control points and weights generic :: set => set1 , set2 , set3 !!> Set NURBS surface procedure :: create !!> Generate geometry points procedure , private :: get_Xc_all !!> Get all control points procedure , private :: get_Xci !!> Get i-th control point procedure , private :: get_Xcid !!> Get i-th control point in a specific direction generic :: get_Xc => get_Xc_all , get_Xci , get_Xcid !!> Get control points procedure , private :: get_Xg_all !!> Get all geometry points procedure , private :: get_Xgi !!> Get i-th geometry point procedure , private :: get_Xgid !!> Get i-th geometry point in a specific direction generic :: get_Xg => get_Xg_all , get_Xgi , get_Xgid !!> Get geometry points procedure , private :: get_Wc_all !!> Get all weights procedure , private :: get_Wci !!> Get i-th weight generic :: get_Wc => get_Wc_all , get_Wci !!> Get weights procedure :: get_Xt !!> Get parameter values procedure , private :: get_knot_all !!> Get all knot vectors procedure , private :: get_knoti !!> Get i-th knot value generic :: get_knot => get_knoti , get_knot_all !!> Get knot vector procedure :: get_ng !!> Get number of geometry points procedure , private :: get_degree_all !!> Get degree of the NURBS surface in both directions procedure , private :: get_degree_dir !!> Get degree of the NURBS surface in a specific direction generic :: get_degree => get_degree_all , get_degree_dir !!> Get degree of the NURBS surface procedure :: finalize !!> Finalize the NURBS surface object procedure :: cmp_elem_Xc_vis !!> Generate connectivity for control points procedure :: cmp_elem_Xg_vis !!> Generate connectivity for geometry points procedure :: cmp_elem !!> Generate IGA element connectivity procedure :: get_elem_Xc_vis !!> Get connectivity for control points procedure :: get_elem_Xg_vis !!> Get connectivity for geometry points procedure :: get_elem !!> Get IGA element connectivity procedure :: set_elem_Xc_vis !!> Set connectivity for control points procedure :: set_elem_Xg_vis !!> Set connectivity for geometry points procedure :: set_elem !!> Set IGA element connectivity procedure :: export_Xc !!> Export control points to VTK file procedure :: export_Xg !!> Export geometry points to VTK file procedure :: modify_Xc !!> Modify control points procedure :: modify_Wc !!> Modify weights procedure :: get_multiplicity !!> Get multiplicity of the knot vector procedure :: get_continuity !!> Get continuity of the surface procedure :: get_nc !!> Get number of required control points procedure :: derivative !!> Compute the derivative of the NURBS surface procedure :: basis !!> Compute the basis functions of the NURBS surface procedure :: insert_knots !!> Insert knots into the knot vector procedure :: elevate_degree !!> Elevate degree procedure :: is_rational !!> Check if the NURBS surface is rational procedure :: remove_knots !!> Remove knots from the knot vector procedure :: rotate_Xc !!> Rotate control points procedure :: rotate_Xg !!> Rotate geometry points procedure :: translate_Xc !!> Translate control points procedure :: translate_Xg !!> Translate geometry points procedure :: show !!> Show the NURBS object using PyVista ! Shapes procedure :: set_tetragon !!> Set a tetragon end type !=============================================================================== contains !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set knot vectors, control points and weights for the NURBS surface object. pure subroutine set1 ( this , knot1 , knot2 , Xc , Wc ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: knot1 (:) real ( rk ), intent ( in ), contiguous :: knot2 (:) real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) if ( allocated ( this % knot1 )) deallocate ( this % knot1 ) if ( allocated ( this % knot2 )) deallocate ( this % knot2 ) if ( allocated ( this % Xc )) deallocate ( this % Xc ) this % knot1 = knot1 this % knot2 = knot2 this % degree = this % get_degree () this % nc ( 1 ) = this % get_nc ( 1 ) this % nc ( 2 ) = this % get_nc ( 2 ) this % Xc = Xc if ( present ( Wc )) then if ( size ( Wc ) /= this % nc ( 1 ) * this % nc ( 2 )) then error stop 'Number of weights does not match the number of control points.' else if ( allocated ( this % Wc )) deallocate ( this % Wc ) this % Wc = Wc end if end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights pure subroutine set2 ( this , Xth_dir1 , Xth_dir2 , degree , continuity1 , continuity2 , Xc , Wc ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: Xth_dir1 (:), Xth_dir2 (:) integer , intent ( in ), contiguous :: degree (:) integer , intent ( in ), contiguous :: continuity1 (:), continuity2 (:) real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) this % knot1 = compute_knot_vector ( Xth_dir1 , degree ( 1 ), continuity1 ) this % knot2 = compute_knot_vector ( Xth_dir2 , degree ( 2 ), continuity2 ) this % degree ( 1 ) = degree ( 1 ) this % degree ( 2 ) = degree ( 2 ) this % nc ( 1 ) = this % get_nc ( 1 ) this % nc ( 2 ) = this % get_nc ( 2 ) this % Xc = Xc if ( present ( Wc )) this % Wc = Wc end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set Bezier or Rational Bezier surface using control points and weights. pure subroutine set3 ( this , nc , Xc , Wc ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ), contiguous :: nc (:) real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) if ( allocated ( this % Xc )) deallocate ( this % Xc ) this % Xc = Xc this % nc = nc if ( allocated ( this % knot1 )) deallocate ( this % knot1 ) allocate ( this % knot1 ( 2 * this % nc ( 1 ))) this % knot1 ( 1 : this % nc ( 1 )) = 0.0_rk this % knot1 ( this % nc ( 1 ) + 1 : 2 * this % nc ( 1 )) = 1.0_rk if ( allocated ( this % knot2 )) deallocate ( this % knot2 ) allocate ( this % knot2 ( 2 * this % nc ( 2 ))) this % knot2 ( 1 : this % nc ( 2 )) = 0.0_rk this % knot2 ( this % nc ( 2 ) + 1 : 2 * this % nc ( 2 )) = 1.0_rk this % degree = this % get_degree () if ( present ( Wc )) then if ( size ( Wc ) /= this % nc ( 1 ) * this % nc ( 2 )) then error stop 'Number of weights does not match the number of control points.' else if ( allocated ( this % Wc )) deallocate ( this % Wc ) this % Wc = Wc end if end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine create ( this , res1 , res2 , Xt1 , Xt2 , Xt ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ), optional :: res1 , res2 real ( rk ), intent ( in ), contiguous , optional :: Xt1 (:), Xt2 (:) real ( rk ), contiguous , intent ( in ), optional :: Xt (:,:) integer :: i , j real ( rk ), allocatable :: Tgc1 (:), Tgc2 (:), Tgc (:) real ( rk ), allocatable :: Xt_ (:,:) ! check if (. not . allocated ( this % Xc )) then error stop 'Control points are not set.' end if if (. not . allocated ( this % knot1 ) . or . . not . allocated ( this % knot2 )) then error stop 'Knot vector(s) is/are not set.' end if ! Set parameter values if ( present ( Xt1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) this % Xt1 = Xt1 elseif ( present ( res1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) allocate ( this % Xt1 ( res1 )) this % Xt1 = [( real ( i - 1 , rk ) / real ( res1 - 1 , rk ), i = 1 , res1 )] ! else ! this%Xt1 = this%Xt1 end if ! Set parameter values if ( present ( Xt2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) this % Xt2 = Xt2 elseif ( present ( res2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) allocate ( this % Xt2 ( res2 )) this % Xt2 = [( real ( i - 1 , rk ) / real ( res2 - 1 , rk ), i = 1 , res2 )] ! else ! this%Xt2 = this%Xt2 end if if ( present ( Xt )) then Xt_ = Xt else ! Set number of geometry points this % ng ( 1 ) = size ( this % Xt1 , 1 ) this % ng ( 2 ) = size ( this % Xt2 , 1 ) call ndgrid ( this % Xt1 , this % Xt2 , Xt_ ) end if if ( allocated ( this % Xg )) deallocate ( this % Xg ) allocate ( this % Xg ( size ( Xt_ , 1 ), size ( this % Xc , 2 ))) if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xt_ , 1 ) Tgc1 = basis_bspline ( Xt_ ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt_ ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgc = kron ( Tgc2 , Tgc1 ) Tgc = Tgc * ( this % Wc / ( dot_product ( Tgc , this % Wc ))) do j = 1 , size ( this % Xc , 2 ) this % Xg ( i , j ) = dot_product ( Tgc , this % Xc (:, j )) end do end do else ! B-Spline do i = 1 , size ( Xt_ , 1 ) Tgc1 = basis_bspline ( Xt_ ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt_ ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgc = kron ( Tgc2 , Tgc1 ) do j = 1 , size ( this % Xc , 2 ) this % Xg ( i , j ) = dot_product ( Tgc , this % Xc (:, j )) end do end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xc_all ( this ) result ( Xc ) class ( nurbs_surface ), intent ( in ) :: this real ( rk ), allocatable :: Xc (:,:) if ( allocated ( this % Xc )) then Xc = this % Xc else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xci ( this , n ) result ( Xc ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: n real ( rk ), allocatable :: Xc (:) if ( allocated ( this % Xc )) then Xc (:) = this % Xc ( n ,:) else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xcid ( this , n , dir ) result ( Xc ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: n integer , intent ( in ) :: dir real ( rk ) :: Xc if ( allocated ( this % Xc )) then Xc = this % Xc ( n , dir ) else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xg_all ( this ) result ( Xg ) class ( nurbs_surface ), intent ( in ) :: this real ( rk ), allocatable :: Xg (:,:) if ( allocated ( this % Xg )) then Xg = this % Xg else error stop 'Geometry points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xgi ( this , n ) result ( Xg ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: n real ( rk ), allocatable :: Xg (:) if ( allocated ( this % Xg )) then Xg (:) = this % Xg ( n ,:) else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xgid ( this , n , dir ) result ( Xg ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: n integer , intent ( in ) :: dir real ( rk ) :: Xg if ( allocated ( this % Xg )) then Xg = this % Xg ( n , dir ) else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Wc_all ( this ) result ( Wc ) class ( nurbs_surface ), intent ( in ) :: this real ( rk ), allocatable :: Wc (:) if ( allocated ( this % Wc )) then Wc = this % Wc else error stop 'The NURBS surface is not rational or weights are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Wci ( this , n ) result ( Wc ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: n real ( rk ) :: Wc if ( allocated ( this % Wc )) then Wc = this % Wc ( n ) else error stop 'The NURBS surface is not rational or weights are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xt ( this , dir ) result ( Xt ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: dir real ( rk ), allocatable :: Xt (:) if ( dir == 1 ) then if ( allocated ( this % Xt1 )) then Xt = this % Xt1 else error stop 'Parameter values are not set.' end if elseif ( dir == 2 ) then if ( allocated ( this % Xt2 )) then Xt = this % Xt2 else error stop 'Parameter values are not set.' end if else error stop 'Invalid direction for parameter values.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_ng ( this ) result ( ng ) class ( nurbs_surface ), intent ( in ) :: this integer :: ng ( 2 ) ng = this % ng end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_degree_all ( this ) result ( degree ) class ( nurbs_surface ), intent ( in ) :: this integer :: degree ( 2 ) integer , allocatable :: m1 (:), m2 (:) m1 = this % get_multiplicity ( 1 ) m2 = this % get_multiplicity ( 2 ) degree ( 1 ) = m1 ( 1 ) - 1 degree ( 2 ) = m2 ( 1 ) - 1 end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_degree_dir ( this , dir ) result ( degree ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: dir integer :: degree integer , allocatable :: m1 (:), m2 (:) if ( dir == 1 ) then m1 = this % get_multiplicity ( 1 ) degree = m1 ( 1 ) - 1 else if ( dir == 2 ) then m2 = this % get_multiplicity ( 2 ) degree = m2 ( 1 ) - 1 else error stop 'Invalid direction for degree.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_knot_all ( this , dir ) result ( knot ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: dir real ( rk ), allocatable :: knot (:) if ( dir == 1 ) then if ( allocated ( this % knot1 )) then knot = this % knot1 else error stop 'Knot vector is not set.' end if elseif ( dir == 2 ) then if ( allocated ( this % knot2 )) then knot = this % knot2 else error stop 'Knot vector is not set.' end if else error stop 'Invalid direction for knot vector.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_knoti ( this , dir , i ) result ( knot ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: dir integer , intent ( in ) :: i real ( rk ) :: knot if ( dir == 1 ) then if ( allocated ( this % knot1 )) then if ( i < 1 . or . i > size ( this % knot1 )) then error stop 'Invalid index for knot vector.' else knot = this % knot1 ( i ) end if else error stop 'Knot vector is not set.' end if elseif ( dir == 2 ) then if ( allocated ( this % knot2 )) then if ( i < 1 . or . i > size ( this % knot2 )) then error stop 'Invalid index for knot vector.' else knot = this % knot2 ( i ) end if else error stop 'Knot vector is not set.' end if else error stop 'Invalid direction for knot vector.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine finalize ( this ) class ( nurbs_surface ), intent ( inout ) :: this if ( allocated ( this % Xc )) deallocate ( this % Xc ) if ( allocated ( this % Xg )) deallocate ( this % Xg ) if ( allocated ( this % Wc )) deallocate ( this % Wc ) if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) if ( allocated ( this % knot1 )) deallocate ( this % knot1 ) if ( allocated ( this % knot2 )) deallocate ( this % knot2 ) if ( allocated ( this % elemConn_Xc_vis )) deallocate ( this % elemConn_Xc_vis ) if ( allocated ( this % elemConn_Xg_vis )) deallocate ( this % elemConn_Xg_vis ) if ( allocated ( this % elemConn )) deallocate ( this % elemConn ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem_Xc_vis ( this , p ) result ( elemConn ) class ( nurbs_surface ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) integer , intent ( in ), contiguous , optional :: p (:) if ( present ( p )) then elemConn = elemConn_C0 ( this % nc ( 1 ), this % nc ( 2 ), p ( 1 ), p ( 2 )) else elemConn = elemConn_C0 ( this % nc ( 1 ), this % nc ( 2 ), 1 , 1 ) end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem_Xg_vis ( this , p ) result ( elemConn ) class ( nurbs_surface ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) integer , intent ( in ), contiguous , optional :: p (:) if ( present ( p )) then elemConn = elemConn_C0 ( this % ng ( 1 ), this % ng ( 2 ), p ( 1 ), p ( 2 )) else elemConn = elemConn_C0 ( this % ng ( 1 ), this % ng ( 2 ), 1 , 1 ) end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine export_Xc ( this , filename ) class ( nurbs_surface ), intent ( in ) :: this character ( len =* ), intent ( in ) :: filename integer :: i , nc , nunit integer , allocatable :: elemConn (:,:) ! check if (. not . allocated ( this % Xc )) then error stop 'Control points are not set.' end if if (. not . allocated ( this % elemConn_Xc_vis )) then elemConn = this % cmp_elem_Xc_vis () else elemConn = this % elemConn_Xc_vis end if nc = size ( this % Xc , 1 ) open ( newunit = nunit , file = filename , action = 'write' ) write ( nunit , '(a)' ) '# vtk DataFile Version 2.0' write ( nunit , '(a)' ) 'Generated by ForCAD' write ( nunit , '(a)' ) 'ASCII' write ( nunit , '(a)' ) 'DATASET UNSTRUCTURED_GRID' write ( nunit , '(a,\" \",g0,\" \",a)' ) 'POINTS' , nc , 'double' if ( size ( this % Xc , 2 ) == 2 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xc ( i , 1 ), this % Xc ( i , 2 ), 0.0_rk , i = 1 , nc ) elseif ( size ( this % Xc , 2 ) == 3 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xc ( i , 1 ), this % Xc ( i , 2 ), this % Xc ( i , 3 ) , i = 1 , nc ) else error stop 'Invalid dimension for control points.' end if write ( nunit , '(a,\" \",g0,\" \",g0)' ) 'CELLS' , size ( elemConn , 1 ), size ( elemConn , 1 ) * ( size ( elemConn , 2 ) + 1 ) write ( nunit , '(g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0)' )& ( 4 , elemConn ( i , 1 ) - 1 , elemConn ( i , 2 ) - 1 , elemConn ( i , 4 ) - 1 , elemConn ( i , 3 ) - 1 , i = 1 , size ( elemConn , 1 )) write ( nunit , '(a,\" \",g0)' ) 'CELL_TYPES' , size ( elemConn , 1 ) write ( nunit , '(g0)' ) ( 9 , i = 1 , size ( elemConn , 1 )) close ( nunit ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine export_Xg ( this , filename ) class ( nurbs_surface ), intent ( in ) :: this character ( len =* ), intent ( in ) :: filename integer :: i , ng , nunit integer , allocatable :: elemConn (:,:) ! check if (. not . allocated ( this % Xg )) then error stop 'Geometry points are not set.' end if if (. not . allocated ( this % elemConn_Xg_vis )) then elemConn = this % cmp_elem_Xg_vis () else elemConn = this % elemConn_Xg_vis end if ng = size ( this % Xg , 1 ) open ( newunit = nunit , file = filename , action = 'write' ) write ( nunit , '(a)' ) '# vtk DataFile Version 2.0' write ( nunit , '(a)' ) 'Generated by ForCAD' write ( nunit , '(a)' ) 'ASCII' write ( nunit , '(a)' ) 'DATASET UNSTRUCTURED_GRID' write ( nunit , '(a,\" \",g0,\" \",a)' ) 'POINTS' , ng , 'double' if ( size ( this % Xg , 2 ) == 2 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xg ( i , 1 ), this % Xg ( i , 2 ), 0.0_rk , i = 1 , ng ) elseif ( size ( this % Xg , 2 ) == 3 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xg ( i , 1 ), this % Xg ( i , 2 ), this % Xg ( i , 3 ) , i = 1 , ng ) else error stop 'Invalid dimension for geometry points.' end if write ( nunit , '(a,\" \",g0,\" \",g0)' ) 'CELLS' , size ( elemConn , 1 ), size ( elemConn , 1 ) * ( size ( elemConn , 2 ) + 1 ) write ( nunit , '(g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0)' )& ( 4 , elemConn ( i , 1 ) - 1 , elemConn ( i , 2 ) - 1 , elemConn ( i , 4 ) - 1 , elemConn ( i , 3 ) - 1 , i = 1 , size ( elemConn , 1 )) write ( nunit , '(a,\" \",g0)' ) 'CELL_TYPES' , size ( elemConn , 1 ) write ( nunit , '(g0)' ) ( 9 , i = 1 , size ( elemConn , 1 )) close ( nunit ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine modify_Xc ( this , X , num , dir ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ) :: X integer , intent ( in ) :: num integer , intent ( in ) :: dir if ( allocated ( this % Xc )) then this % Xc ( num , dir ) = X call this % set ( knot1 = this % knot1 , knot2 = this % knot2 , Xc = this % Xc , Wc = this % Wc ) else error stop 'Control points are not set.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine modify_Wc ( this , W , num ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ) :: W integer , intent ( in ) :: num real ( rk ), allocatable :: knot1 (:), knot2 (:), Xc (:,:), Wc (:) if ( allocated ( this % Wc )) then this % Wc ( num ) = W Xc = this % Xc Wc = this % Wc if ( allocated ( this % knot1 ) . and . allocated ( this % knot2 )) then knot1 = this % knot1 knot2 = this % knot2 call this % set ( knot1 = knot1 , knot2 = knot2 , Xc = Xc , Wc = Wc ) else call this % set ( nc = this % nc , Xc = Xc , Wc = Wc ) end if else error stop 'The NURBS surface is not rational.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_multiplicity ( this , dir ) result ( m ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: dir integer , allocatable :: m (:) if ( dir == 1 ) then ! check if (. not . allocated ( this % knot1 )) then error stop 'Knot vector is not set.' else m = compute_multiplicity ( this % knot1 ) end if elseif ( dir == 2 ) then ! check if (. not . allocated ( this % knot2 )) then error stop 'Knot vector is not set.' else m = compute_multiplicity ( this % knot2 ) end if else error stop 'Invalid direction.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_continuity ( this , dir ) result ( c ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: dir integer , allocatable :: c (:) if ( dir == 1 ) then ! check if (. not . allocated ( this % knot1 )) then error stop 'Knot vector is not set.' else c = this % degree ( 1 ) - compute_multiplicity ( this % knot1 ) end if elseif ( dir == 2 ) then ! check if (. not . allocated ( this % knot2 )) then error stop 'Knot vector is not set.' else c = this % degree ( 2 ) - compute_multiplicity ( this % knot2 ) end if else error stop 'Invalid direction.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_nc ( this , dir ) result ( nc ) class ( nurbs_surface ), intent ( in ) :: this integer , intent ( in ) :: dir integer :: nc if ( dir == 1 ) then ! check if (. not . allocated ( this % knot1 )) then error stop 'Knot vector is not set.' else nc = sum ( compute_multiplicity ( this % knot1 )) - this % degree ( 1 ) - 1 end if elseif ( dir == 2 ) then ! check if (. not . allocated ( this % knot2 )) then error stop 'Knot vector is not set.' else nc = sum ( compute_multiplicity ( this % knot2 )) - this % degree ( 2 ) - 1 end if else error stop 'Invalid direction.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine derivative ( this , res1 , res2 , Xt1 , Xt2 , dTgc ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ), optional :: res1 , res2 real ( rk ), intent ( in ), contiguous , optional :: Xt1 (:), Xt2 (:) real ( rk ), allocatable , intent ( out ) :: dTgc (:,:) real ( rk ), allocatable :: dTgci (:) integer :: i real ( rk ), allocatable :: dTgc1 (:), dTgc2 (:) real ( rk ), allocatable :: Xt (:,:) ! Set parameter values if ( present ( Xt1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) this % Xt1 = Xt1 elseif ( present ( res1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) allocate ( this % Xt1 ( res1 )) this % Xt1 = [( real ( i - 1 , rk ) / real ( res1 - 1 , rk ), i = 1 , res1 )] ! else ! this%Xt1 = this%Xt1 end if ! Set parameter values if ( present ( Xt2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) this % Xt2 = Xt2 elseif ( present ( res2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) allocate ( this % Xt2 ( res2 )) this % Xt2 = [( real ( i - 1 , rk ) / real ( res2 - 1 , rk ), i = 1 , res2 )] ! else ! this%Xt2 = this%Xt2 end if ! Set number of geometry points this % ng ( 1 ) = size ( this % Xt1 , 1 ) this % ng ( 2 ) = size ( this % Xt2 , 1 ) call ndgrid ( this % Xt1 , this % Xt2 , Xt ) allocate ( dTgc ( this % ng ( 1 ) * this % ng ( 2 ), this % nc ( 1 ) * this % nc ( 2 ))) if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xt , 1 ) dTgc1 = basis_bspline_der ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) dTgc2 = basis_bspline_der ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) dTgci = kron ( dTgc2 , dTgc1 ) dTgci = dTgci * ( this % Wc / ( dot_product ( dTgci , this % Wc ))) dTgc ( i ,:) = dTgci end do else ! B-Spline do i = 1 , size ( Xt , 1 ) dTgc1 = basis_bspline_der ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) dTgc2 = basis_bspline_der ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) dTgci = kron ( dTgc2 , dTgc1 ) dTgc ( i ,:) = dTgci end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine basis ( this , res1 , res2 , Xt1 , Xt2 , Tgc ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ), optional :: res1 , res2 real ( rk ), intent ( in ), contiguous , optional :: Xt1 (:), Xt2 (:) real ( rk ), allocatable , intent ( out ) :: Tgc (:,:) real ( rk ), allocatable :: Tgci (:) integer :: i real ( rk ), allocatable :: Tgc1 (:), Tgc2 (:) real ( rk ), allocatable :: Xt (:,:) ! Set parameter values if ( present ( Xt1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) this % Xt1 = Xt1 elseif ( present ( res1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) allocate ( this % Xt1 ( res1 )) this % Xt1 = [( real ( i - 1 , rk ) / real ( res1 - 1 , rk ), i = 1 , res1 )] ! else ! this%Xt1 = this%Xt1 end if ! Set parameter values if ( present ( Xt2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) this % Xt2 = Xt2 elseif ( present ( res2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) allocate ( this % Xt2 ( res2 )) this % Xt2 = [( real ( i - 1 , rk ) / real ( res2 - 1 , rk ), i = 1 , res2 )] ! else ! this%Xt2 = this%Xt2 end if ! Set number of geometry points this % ng ( 1 ) = size ( this % Xt1 , 1 ) this % ng ( 2 ) = size ( this % Xt2 , 1 ) call ndgrid ( this % Xt1 , this % Xt2 , Xt ) allocate ( Tgc ( this % ng ( 1 ) * this % ng ( 2 ), this % nc ( 1 ) * this % nc ( 2 ))) if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xt , 1 ) Tgc1 = basis_bspline ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgci = kron ( Tgc2 , Tgc1 ) Tgci = Tgci * ( this % Wc / ( dot_product ( Tgci , this % Wc ))) Tgc ( i ,:) = Tgci end do else ! B-Spline do i = 1 , size ( Xt , 1 ) Tgc1 = basis_bspline ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgci = kron ( Tgc2 , Tgc1 ) Tgc ( i ,:) = Tgci end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine insert_knots ( this , dir , Xth , r ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ) :: dir real ( rk ), intent ( in ), contiguous :: Xth (:) integer , intent ( in ), contiguous :: r (:) integer :: k , i , s , dim , j , n_new real ( rk ), allocatable :: Xc (:,:), Xcw (:,:), Xcw_new (:,:), Xc_new (:,:), Wc_new (:), knot_new (:) real ( rk ), allocatable :: Xc3 (:,:,:) real ( rk ), allocatable :: knot1 (:), knot2 (:) if ( dir == 1 ) then ! direction 1 if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 1 ) - 1 , this % degree ( 1 ), Xth ( i ), this % knot1 ) if ( this % knot1 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot1 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xcw = reshape ( Xcw ,[ this % nc ( 1 ), this % nc ( 2 ) * ( dim + 1 )]) call insert_knot_A_5_1 (& this % degree ( 1 ),& this % knot1 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xcw_new ) Xcw_new = reshape ( Xcw_new ,[ this % nc ( 2 ) * ( n_new + 1 ), dim + 1 ]) allocate ( Xc_new ( 1 : this % nc ( 2 ) * ( n_new + 1 ), 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 2 ) * ( n_new + 1 ))) do j = 1 , this % nc ( 2 ) * ( n_new + 1 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot2 = this % knot2 call this % set ( knot1 = knot_new , knot2 = knot2 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 1 ) - 1 , this % degree ( 1 ), Xth ( i ), this % knot1 ) if ( this % knot1 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot1 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) Xc = reshape ( this % Xc ,[ this % nc ( 1 ), this % nc ( 2 ) * dim ]) call insert_knot_A_5_1 (& this % degree ( 1 ),& this % knot1 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xc_new ) Xc_new = reshape ( Xc_new ,[( this % nc ( 2 )) * ( n_new + 1 ), dim ]) knot2 = this % knot2 call this % set ( knot1 = knot_new , knot2 = knot2 , Xc = Xc_new ) end do end if elseif ( dir == 2 ) then ! direction 2 if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 2 ) - 1 , this % degree ( 2 ), Xth ( i ), this % knot2 ) if ( this % knot2 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot2 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc3 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), dim + 1 ]) Xc3 = reshape ( Xc3 , [ this % nc ( 2 ), this % nc ( 1 ), dim + 1 ], order = [ 2 , 1 , 3 ]) Xcw = reshape ( Xc3 ,[ this % nc ( 2 ), this % nc ( 1 ) * ( dim + 1 )]) call insert_knot_A_5_1 (& this % degree ( 2 ),& this % knot2 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xcw_new ) Xc3 = reshape ( Xcw_new , [ n_new + 1 , this % nc ( 1 ), dim + 1 ]) Xc3 = reshape ( Xc3 , [ this % nc ( 1 ), n_new + 1 , dim + 1 ], order = [ 2 , 1 , 3 ]) Xcw_new = reshape ( Xc3 ,[( this % nc ( 1 )) * ( n_new + 1 ), dim + 1 ]) allocate ( Xc_new ( 1 :( n_new + 1 ) * this % nc ( 1 ), 1 : dim )) allocate ( Wc_new ( 1 :( n_new + 1 ) * this % nc ( 1 ))) do j = 1 , ( n_new + 1 ) * this % nc ( 1 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 call this % set ( knot2 = knot_new , knot1 = knot1 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 2 ) - 1 , this % degree ( 2 ), Xth ( i ), this % knot2 ) if ( this % knot2 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot2 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) Xc3 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), dim ]) Xc3 = reshape ( Xc3 , [ this % nc ( 2 ), this % nc ( 1 ), dim ], order = [ 2 , 1 , 3 ]) Xc = reshape ( Xc3 ,[ this % nc ( 2 ), this % nc ( 1 ) * dim ]) call insert_knot_A_5_1 (& this % degree ( 2 ),& this % knot2 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xc_new ) Xc3 = reshape ( Xc_new , [ n_new + 1 , this % nc ( 1 ), dim ]) Xc3 = reshape ( Xc3 , [ this % nc ( 1 ), n_new + 1 , dim ], order = [ 2 , 1 , 3 ]) Xc_new = reshape ( Xc3 ,[( this % nc ( 1 )) * ( n_new + 1 ), dim ]) knot1 = this % knot1 call this % set ( knot2 = knot_new , knot1 = knot1 , Xc = Xc_new ) end do end if else error stop 'Invalid direction.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine elevate_degree ( this , dir , t ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ) :: dir integer , intent ( in ) :: t real ( rk ), allocatable :: Xc (:,:), Xcw (:,:), Xcw_new (:,:), knot_new (:), Xc_new (:,:), Wc_new (:) integer :: dim , j , nc_new real ( rk ), allocatable :: Xc3 (:,:,:) real ( rk ), allocatable :: knot1 (:), knot2 (:) if ( dir == 1 ) then ! direction 1 if ( this % is_rational ()) then ! NURBS dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xcw = reshape ( Xcw ,[ this % nc ( 1 ), this % nc ( 2 ) * ( dim + 1 )], order = [ 1 , 2 ]) call elevate_degree_A_5_9 ( t , this % knot1 , this % degree ( 1 ), Xcw , nc_new , knot_new , Xcw_new ) Xcw_new = reshape ( Xcw_new ,[ this % nc ( 2 ) * nc_new , dim + 1 ], order = [ 1 , 2 ]) allocate ( Xc_new ( 1 : this % nc ( 2 ) * nc_new , 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 2 ) * nc_new )) do j = 1 , this % nc ( 2 ) * nc_new Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot2 = this % knot2 call this % set ( knot1 = knot_new , knot2 = knot2 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) else ! B-Spline dim = size ( this % Xc , 2 ) Xc = reshape ( this % Xc ,[ this % nc ( 1 ), this % nc ( 2 ) * ( dim )], order = [ 1 , 2 ]) call elevate_degree_A_5_9 ( t , this % knot1 , this % degree ( 1 ), Xc , nc_new , knot_new , Xc_new ) Xc_new = reshape ( Xc_new ,[ this % nc ( 2 ) * nc_new , dim ], order = [ 1 , 2 ]) knot2 = this % knot2 call this % set ( knot1 = knot_new , knot2 = knot2 , Xc = Xc_new ) deallocate ( Xc , Xc_new ) end if elseif ( dir == 2 ) then ! direction 2 if ( this % is_rational ()) then ! NURBS dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc3 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), dim + 1 ]) Xc3 = reshape ( Xc3 , [ this % nc ( 2 ), this % nc ( 1 ), dim + 1 ], order = [ 2 , 1 , 3 ]) Xcw = reshape ( Xc3 ,[ this % nc ( 2 ), this % nc ( 1 ) * ( dim + 1 )]) call elevate_degree_A_5_9 ( t , this % knot2 , this % degree ( 2 ), Xcw , nc_new , knot_new , Xcw_new ) Xc3 = reshape ( Xcw_new , [ nc_new , this % nc ( 1 ), dim + 1 ]) Xc3 = reshape ( Xc3 , [ this % nc ( 1 ), nc_new , dim + 1 ], order = [ 2 , 1 , 3 ]) Xcw_new = reshape ( Xc3 ,[( this % nc ( 1 )) * nc_new , dim + 1 ]) allocate ( Xc_new ( 1 : nc_new * this % nc ( 1 ), 1 : dim )) allocate ( Wc_new ( 1 : nc_new * this % nc ( 1 ))) do j = 1 , nc_new * this % nc ( 1 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 call this % set ( knot2 = knot_new , knot1 = knot1 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) else ! B-Spline dim = size ( this % Xc , 2 ) Xc3 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), dim ]) Xc3 = reshape ( Xc3 , [ this % nc ( 2 ), this % nc ( 1 ), dim ], order = [ 2 , 1 , 3 ]) Xc = reshape ( Xc3 ,[ this % nc ( 2 ), this % nc ( 1 ) * dim ]) call elevate_degree_A_5_9 ( t , this % knot2 , this % degree ( 2 ), Xc , nc_new , knot_new , Xc_new ) Xc3 = reshape ( Xc_new , [ nc_new , this % nc ( 1 ), dim ]) Xc3 = reshape ( Xc3 , [ this % nc ( 1 ), nc_new , dim ], order = [ 2 , 1 , 3 ]) Xc_new = reshape ( Xc3 ,[( this % nc ( 1 )) * nc_new , dim ]) knot1 = this % knot1 call this % set ( knot2 = knot_new , knot1 = knot1 , Xc = Xc_new ) end if else error stop 'Invalid direction.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function is_rational ( this ) result ( r ) class ( nurbs_surface ), intent ( in ) :: this logical :: r r = . false . if ( allocated ( this % Wc )) then if ( any ( this % Wc /= this % Wc ( 1 ))) then r = . true . end if end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem_Xc_vis ( this , elemConn ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn_Xc_vis )) deallocate ( this % elemConn_Xc_vis ) this % elemConn_Xc_vis = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem_Xg_vis ( this , elemConn ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn_Xg_vis )) deallocate ( this % elemConn_Xg_vis ) this % elemConn_Xg_vis = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem ( this , elemConn ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn )) deallocate ( this % elemConn ) this % elemConn = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem_Xc_vis ( this ) result ( elemConn ) class ( nurbs_surface ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn_Xc_vis end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem_Xg_vis ( this ) result ( elemConn ) class ( nurbs_surface ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn_Xg_vis end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem ( this ) result ( elemConn ) class ( nurbs_surface ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine remove_knots ( this , dir , Xth , r ) class ( nurbs_surface ), intent ( inout ) :: this integer , intent ( in ) :: dir real ( rk ), intent ( in ), contiguous :: Xth (:) integer , intent ( in ), contiguous :: r (:) integer :: k , i , s , dim , j , nc_new , t real ( rk ), allocatable :: Xc (:,:), Xcw (:,:), Xcw_new (:,:), Xc_new (:,:), Wc_new (:), knot_new (:) real ( rk ), allocatable :: Xc3 (:,:,:) real ( rk ), allocatable :: knot1 (:), knot2 (:) if ( dir == 1 ) then ! direction 1 if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 1 ) - 1 , this % degree ( 1 ), Xth ( i ), this % knot1 ) if ( this % knot1 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot1 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xcw = reshape ( Xcw ,[ this % nc ( 1 ), this % nc ( 2 ) * ( dim + 1 )], order = [ 1 , 2 ]) call remove_knots_A_5_8 (& this % degree ( 1 ),& this % knot1 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xcw_new ) if ( allocated ( Xcw )) deallocate ( Xcw ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) Xcw_new = reshape ( Xcw_new ,[ this % nc ( 2 ) * ( nc_new ), dim + 1 ], order = [ 1 , 2 ]) allocate ( Xc_new ( 1 : this % nc ( 2 ) * ( nc_new ), 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 2 ) * ( nc_new ))) do j = 1 , this % nc ( 2 ) * ( nc_new ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot2 = this % knot2 call this % set ( knot1 = knot_new , knot2 = knot2 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw_new , Xc_new , Wc_new ) end if end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 1 ) - 1 , this % degree ( 1 ), Xth ( i ), this % knot1 ) if ( this % knot1 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot1 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) Xc = reshape ( this % Xc ,[ this % nc ( 1 ), this % nc ( 2 ) * dim ], order = [ 1 , 2 ]) call remove_knots_A_5_8 (& this % degree ( 1 ),& this % knot1 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xc_new ) if ( allocated ( Xc )) deallocate ( Xc ) if ( t == 0 ) then ! no change else nc_new = size ( Xc_new , 1 ) Xc_new = reshape ( Xc_new ,[( this % nc ( 2 )) * ( nc_new ), dim ], order = [ 1 , 2 ]) knot2 = this % knot2 call this % set ( knot1 = knot_new , knot2 = knot2 , Xc = Xc_new ) end if end do end if elseif ( dir == 2 ) then ! direction 2 if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 2 ) - 1 , this % degree ( 2 ), Xth ( i ), this % knot2 ) if ( this % knot2 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot2 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc3 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), dim + 1 ]) Xc3 = reshape ( Xc3 , [ this % nc ( 2 ), this % nc ( 1 ), dim + 1 ], order = [ 2 , 1 , 3 ]) Xcw = reshape ( Xc3 , [ this % nc ( 2 ), this % nc ( 1 ) * ( dim + 1 )]) call remove_knots_A_5_8 (& this % degree ( 2 ),& this % knot2 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xcw_new ) if ( allocated ( Xcw )) deallocate ( Xcw ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) Xc3 = reshape ( Xcw_new , [ nc_new , this % nc ( 1 ), dim + 1 ]) Xc3 = reshape ( Xc3 , [ this % nc ( 1 ), nc_new , dim + 1 ], order = [ 2 , 1 , 3 ]) Xcw_new = reshape ( Xc3 ,[( this % nc ( 1 )) * ( nc_new ), dim + 1 ]) allocate ( Xc_new ( 1 :( nc_new ) * this % nc ( 1 ), 1 : dim )) allocate ( Wc_new ( 1 :( nc_new ) * this % nc ( 1 ))) do j = 1 , ( nc_new ) * this % nc ( 1 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 call this % set ( knot2 = knot_new , knot1 = knot1 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw_new , Xc_new , Wc_new ) end if end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 2 ) - 1 , this % degree ( 2 ), Xth ( i ), this % knot2 ) if ( this % knot2 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot2 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) Xc3 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), dim ]) Xc3 = reshape ( Xc3 , [ this % nc ( 2 ), this % nc ( 1 ), dim ], order = [ 2 , 1 , 3 ]) Xc = reshape ( Xc3 ,[ this % nc ( 2 ), this % nc ( 1 ) * dim ]) call remove_knots_A_5_8 (& this % degree ( 2 ),& this % knot2 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xc_new ) if ( allocated ( Xc )) deallocate ( Xc ) if ( t == 0 ) then ! no change else nc_new = size ( Xc_new , 1 ) Xc3 = reshape ( Xc_new , [ nc_new , this % nc ( 1 ), dim ]) Xc3 = reshape ( Xc3 , [ this % nc ( 1 ), nc_new , dim ], order = [ 2 , 1 , 3 ]) Xc_new = reshape ( Xc3 ,[( this % nc ( 1 )) * ( nc_new ), dim ]) knot1 = this % knot1 call this % set ( knot2 = knot_new , knot1 = knot1 , Xc = Xc_new ) end if end do end if else error stop 'Invalid direction.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_tetragon ( this , L , nc , Wc ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ) :: L ( 2 ) integer , intent ( in ) :: nc ( 2 ) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) call this % set ( nc = nc , Xc = tetragon_Xc ( L , nc ), Wc = Wc ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem ( this ) result ( elemConn ) class ( nurbs_surface ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) call elemConn_Cn ( this % nc ( 1 ), this % nc ( 2 ),& this % degree ( 1 ), this % degree ( 2 ),& unique ( this % knot1 ), unique ( this % knot2 ),& this % get_multiplicity ( 1 ), this % get_multiplicity ( 2 ),& elemConn ) end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine rotate_Xc ( this , alpha , beta , theta ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ) :: alpha , beta , theta integer :: i do i = 1 , this % nc ( 1 ) * this % nc ( 2 ) this % Xc ( i , :) = matmul ( rotation ( alpha , beta , theta ), this % Xc ( i , :)) end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine rotate_Xg ( this , alpha , beta , theta ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ) :: alpha , beta , theta integer :: i do i = 1 , this % ng ( 1 ) * this % ng ( 2 ) this % Xg ( i , :) = matmul ( rotation ( alpha , beta , theta ), this % Xg ( i , :)) end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine translate_Xc ( this , vec ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ) :: vec (:) integer :: i do i = 1 , this % nc ( 1 ) * this % nc ( 2 ) this % Xc ( i , :) = this % Xc ( i , :) + vec end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine translate_Xg ( this , vec ) class ( nurbs_surface ), intent ( inout ) :: this real ( rk ), intent ( in ) :: vec (:) integer :: i do i = 1 , this % ng ( 1 ) * this % ng ( 2 ) this % Xg ( i , :) = this % Xg ( i , :) + vec end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine show ( this , vtkfile_Xc , vtkfile_Xg ) class ( nurbs_surface ), intent ( inout ) :: this character ( len =* ), intent ( in ) :: vtkfile_Xc , vtkfile_Xg character ( len = 3000 ) :: pyvista_script pyvista_script = & \"import pyvista as pv\" // achar ( 10 ) // & \"pv.global_theme.color = 'white'\" // achar ( 10 ) // & \"Xc = pv.read('\" // trim ( vtkfile_Xc ) // \"')\" // achar ( 10 ) // & \"Xg = pv.read('\" // trim ( vtkfile_Xg ) // \"')\" // achar ( 10 ) // & \"p = pv.Plotter(lighting='light kit')\" // achar ( 10 ) // & \"actor_Xcp = p.add_mesh(\" // achar ( 10 ) // & \" Xc,\" // achar ( 10 ) // & \" style='points',\" // achar ( 10 ) // & \" point_size=10,\" // achar ( 10 ) // & \" color='red',\" // achar ( 10 ) // & \" render_points_as_spheres=True,\" // achar ( 10 ) // & \" opacity=0.5,\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"actor_Xcw = p.add_mesh(\" // achar ( 10 ) // & \" Xc,\" // achar ( 10 ) // & \" show_edges=True,\" // achar ( 10 ) // & \" color='yellow',\" // achar ( 10 ) // & \" line_width=3,\" // achar ( 10 ) // & \" style='wireframe',\" // achar ( 10 ) // & \" opacity=0.2\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"actor_Xg = p.add_mesh(\" // achar ( 10 ) // & \" Xg,\" // achar ( 10 ) // & \" show_edges=False,\" // achar ( 10 ) // & \" color='cyan',\" // achar ( 10 ) // & \" line_width=7,\" // achar ( 10 ) // & \" metallic=0.6,\" // achar ( 10 ) // & \" pbr=True,\" // achar ( 10 ) // & \" split_sharp_edges=True,\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_axes(interactive=False)\" // achar ( 10 ) // & \"def point_picker_callback(point):\" // achar ( 10 ) // & \" mesh = Xc\" // achar ( 10 ) // & \" point_id = mesh.find_closest_point(point)\" // achar ( 10 ) // & \" point_coords = mesh.points[point_id]\" // achar ( 10 ) // & \" label = f'ID: {point_id + 1}\\n({point_coords[0]:.3f}, {point_coords[1]:.3f}, {point_coords[2]:.3f})'\" // achar ( 10 ) // & \" p.add_point_labels(\" // achar ( 10 ) // & \" [point_coords],\" // achar ( 10 ) // & \" [label],\" // achar ( 10 ) // & \" font_size=14,\" // achar ( 10 ) // & \" text_color='black',\" // achar ( 10 ) // & \" show_points=False,\" // achar ( 10 ) // & \" fill_shape=False,\" // achar ( 10 ) // & \" shape=None,\" // achar ( 10 ) // & \" )\" // achar ( 10 ) // & \"picker = p.enable_point_picking(callback=point_picker_callback, show_message=False)\" // achar ( 10 ) // & \"window_size = p.window_size\" // achar ( 10 ) // & \"y_pos = window_size[1]\" // achar ( 10 ) // & \"def Xcp_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xcp.SetVisibility(flag)\" // achar ( 10 ) // & \"def Xcw_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xcw.SetVisibility(flag)\" // achar ( 10 ) // & \"def Xg_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xg.SetVisibility(flag)\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xcp_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='red',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 1 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xcw_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='yellow',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 2 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xg_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='cyan',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 3 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xc (Points)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 1 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xc (Control geometry)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 2 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xg (Geometry)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 3 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text('ForCAD', position=(0.0, 10.0), font_size=14, color='black', font='times')\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'https://github.com/gha3mi/forcad',\" // achar ( 10 ) // & \" position=(0.0, 0.0),\" // achar ( 10 ) // & \" font_size=7,\" // achar ( 10 ) // & \" color='blue',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.show(title='ForCAD', interactive=True)\" call execute_command_line ( 'python -c \"' // trim ( adjustl ( pyvista_script )) // '\"' ) end subroutine !=============================================================================== end module forcad_nurbs_surface","tags":"","loc":"sourcefile/forcad_nurbs_surface.f90.html"},{"title":"forcad_nurbs_curve.f90 – ForCAD","text":"This file depends on sourcefile~~forcad_nurbs_curve.f90~~EfferentGraph sourcefile~forcad_nurbs_curve.f90 forcad_nurbs_curve.f90 sourcefile~forcad_utils.f90 forcad_utils.f90 sourcefile~forcad_nurbs_curve.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Files dependent on this one sourcefile~~forcad_nurbs_curve.f90~~AfferentGraph sourcefile~forcad_nurbs_curve.f90 forcad_nurbs_curve.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~forcad.f90->sourcefile~forcad_nurbs_curve.f90 sourcefile~demo_curve.f90 demo_curve.f90 sourcefile~demo_curve.f90->sourcefile~forcad.f90 sourcefile~demo_surface.f90 demo_surface.f90 sourcefile~demo_surface.f90->sourcefile~forcad.f90 sourcefile~demo_volume.f90 demo_volume.f90 sourcefile~demo_volume.f90->sourcefile~forcad.f90 sourcefile~example_curve_1.f90 example_curve_1.f90 sourcefile~example_curve_1.f90->sourcefile~forcad.f90 sourcefile~example_surface_1.f90 example_surface_1.f90 sourcefile~example_surface_1.f90->sourcefile~forcad.f90 sourcefile~example_volume_1.f90 example_volume_1.f90 sourcefile~example_volume_1.f90->sourcefile~forcad.f90 sourcefile~put_to_nurbs.f90 put_to_nurbs.f90 sourcefile~put_to_nurbs.f90->sourcefile~forcad.f90 sourcefile~shape_circle.f90 shape_circle.f90 sourcefile~shape_circle.f90->sourcefile~forcad.f90 sourcefile~shape_hexahedron.f90 shape_hexahedron.f90 sourcefile~shape_hexahedron.f90->sourcefile~forcad.f90 sourcefile~shape_tetragon.f90 shape_tetragon.f90 sourcefile~shape_tetragon.f90->sourcefile~forcad.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> This module defines the 'nurbs_curve' type for representing a Non-Uniform Rational B-Spline (NURBS) curve. module forcad_nurbs_curve use forcad_utils , only : rk , basis_bspline , elemConn_C0 , compute_multiplicity , compute_knot_vector , basis_bspline_der ,& insert_knot_A_5_1 , findspan , elevate_degree_A_5_9 , remove_knots_A_5_8 , & elemConn_Cn , unique , rotation implicit none private public nurbs_curve !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause type nurbs_curve real ( rk ), allocatable , private :: Xc (:,:) !! Control points (2D array: [nc, dim]) real ( rk ), allocatable , private :: Xg (:,:) !! Geometry points (2D array: [ng, dim]) real ( rk ), allocatable , private :: Wc (:) !! Weights for control points (1D array: [nc]) real ( rk ), allocatable , private :: Xt (:) !! Evaluation points (1D array: [ng]) real ( rk ), allocatable , private :: knot (:) !! Knot vector (1D array) integer , private :: degree !! Degree (order) of the curve integer , private :: nc !! Number of control points integer , private :: ng !! Number of geometry points integer , allocatable , private :: elemConn_Xc_vis (:,:) !! Connectivity for visualization of control points integer , allocatable , private :: elemConn_Xg_vis (:,:) !! Connectivity for visualization of geometry points integer , allocatable , private :: elemConn (:,:) !! IGA element connectivity contains procedure :: set1 !!> Set knot vector, control points and weights for the NURBS curve object procedure :: set2 !!> Set NURBS curve using nodes of parameter space, degree, continuity, control points and weights procedure :: set3 !!> Set Bezier or Rational Bezier curve using control points and weights generic :: set => set1 , set2 , set3 !!> Set NURBS curve procedure :: create !!> Generate geometry points procedure , private :: get_Xc_all !!> Get all control points procedure , private :: get_Xci !!> Get i-th control point procedure , private :: get_Xcid !!> Get i-th control point in a specific direction generic :: get_Xc => get_Xc_all , get_Xci , get_Xcid !!> Get control points procedure , private :: get_Xg_all !!> Get all geometry points procedure , private :: get_Xgi !!> Get i-th geometry point procedure , private :: get_Xgid !!> Get i-th geometry point in a specific direction generic :: get_Xg => get_Xg_all , get_Xgi , get_Xgid !!> Get geometry points procedure , private :: get_Wc_all !!> Get all weights procedure , private :: get_Wci !!> Get i-th weight generic :: get_Wc => get_Wc_all , get_Wci !!> Get weights procedure :: get_Xt !!> Get parameter values procedure , private :: get_knot_all !!> Get all knot vectors procedure , private :: get_knoti !!> Get i-th knot value generic :: get_knot => get_knoti , get_knot_all !!> Get knot vector procedure :: get_ng !!> Get number of geometry points procedure :: get_degree !!> Get degree of the NURBS curve procedure :: finalize !!> Finalize the NURBS curve object procedure :: cmp_elem_Xc_vis !!> Generate connectivity for control points procedure :: cmp_elem_Xg_vis !!> Generate connectivity for geometry points procedure :: cmp_elem !!> Generate IGA element connectivity procedure :: get_elem_Xc_vis !!> Get connectivity for control points procedure :: get_elem_Xg_vis !!> Get connectivity for geometry points procedure :: get_elem !!> Get IGA element connectivity procedure :: set_elem_Xc_vis !!> Set connectivity for control points procedure :: set_elem_Xg_vis !!> Set connectivity for geometry points procedure :: set_elem !!> Set IGA element connectivity procedure :: export_Xc !!> Export control points to VTK file procedure :: export_Xg !!> Export geometry points to VTK file procedure :: modify_Xc !!> Modify control points procedure :: modify_Wc !!> Modify weights procedure :: get_multiplicity !!> Get multiplicity of the knot vector procedure :: get_continuity !!> Get continuity of the curve procedure :: get_nc !!> Get number of required control points procedure :: insert_knots !!> Insert knots into the knot vector procedure :: elevate_degree !!> Elevate the degree of the curve procedure :: derivative !!> Compute the derivative of the NURBS curve procedure :: basis !!> Compute the basis functions of the NURBS curve procedure :: is_rational !!> Check if the NURBS curve is rational procedure :: remove_knots !!> Remove knots from the knot vector procedure :: rotate_Xc !!> Rotate control points procedure :: rotate_Xg !!> Rotate geometry points procedure :: translate_Xc !!> Translate control points procedure :: translate_Xg !!> Translate geometry points procedure :: show !!> Show the NURBS object using PyVista ! Shapes procedure :: set_circle !!> Set a circle end type !=============================================================================== contains !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set knot vector, control points and weights for the NURBS curve object. pure subroutine set1 ( this , knot , Xc , Wc ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: knot (:) real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) if ( allocated ( this % knot )) deallocate ( this % knot ) if ( allocated ( this % Xc )) deallocate ( this % Xc ) this % knot = knot this % degree = this % get_degree () this % Xc = Xc this % nc = size ( this % Xc , 1 ) if ( present ( Wc )) then if ( size ( Wc ) /= this % nc ) then error stop 'Number of weights does not match the number of control points.' else if ( allocated ( this % Wc )) deallocate ( this % Wc ) this % Wc = Wc end if end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights. pure subroutine set2 ( this , Xth_dir , degree , continuity , Xc , Wc ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: Xth_dir (:) integer , intent ( in ) :: degree integer , intent ( in ), contiguous :: continuity (:) real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) if ( allocated ( this % knot )) deallocate ( this % knot ) if ( allocated ( this % Xc )) deallocate ( this % Xc ) this % knot = compute_knot_vector ( Xth_dir , degree , continuity ) this % degree = degree this % Xc = Xc this % nc = size ( this % Xc , 1 ) if ( present ( Wc )) then if ( size ( Wc ) /= this % nc ) then error stop 'Number of weights does not match the number of control points.' else if ( allocated ( this % Wc )) deallocate ( this % Wc ) this % Wc = Wc end if end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set Bezier or Rational Bezier curve using control points and weights. pure subroutine set3 ( this , Xc , Wc ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) if ( allocated ( this % knot )) deallocate ( this % knot ) if ( allocated ( this % Xc )) deallocate ( this % Xc ) this % Xc = Xc this % nc = size ( this % Xc , 1 ) if ( allocated ( this % knot )) deallocate ( this % knot ) allocate ( this % knot ( 2 * this % nc )) this % knot ( 1 : this % nc ) = 0.0_rk this % knot ( this % nc + 1 : 2 * this % nc ) = 1.0_rk this % degree = this % get_degree () if ( present ( Wc )) then if ( size ( Wc ) /= this % nc ) then error stop 'Number of weights does not match the number of control points.' else if ( allocated ( this % Wc )) deallocate ( this % Wc ) this % Wc = Wc end if end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine create ( this , res , Xt ) class ( nurbs_curve ), intent ( inout ) :: this integer , intent ( in ), optional :: res real ( rk ), intent ( in ), contiguous , optional :: Xt (:) real ( rk ), allocatable :: Tgc (:) integer :: i , j ! check if (. not . allocated ( this % Xc )) then error stop 'Control points are not set.' end if if (. not . allocated ( this % knot )) then error stop 'Knot vector is not set.' end if ! Set parameter values if ( present ( Xt )) then if ( allocated ( this % Xt )) deallocate ( this % Xt ) this % Xt = Xt elseif ( present ( res )) then if ( allocated ( this % Xt )) deallocate ( this % Xt ) allocate ( this % Xt ( res )) this % Xt = [( real ( i - 1 , rk ) / real ( res - 1 , rk ), i = 1 , res )] ! else ! this%Xt = this%Xt end if ! Set number of geometry points this % ng = size ( this % Xt ) ! Allocate memory for geometry points if ( allocated ( this % Xg )) deallocate ( this % Xg ) allocate ( this % Xg ( this % ng , size ( this % Xc , 2 ))) if ( this % is_rational ()) then ! NURBS do i = 1 , size ( this % Xt , 1 ) Tgc = basis_bspline ( this % Xt ( i ), this % knot , this % nc , this % degree ) Tgc = Tgc * ( this % Wc / ( dot_product ( Tgc , this % Wc ))) do j = 1 , size ( this % Xc , 2 ) this % Xg ( i , j ) = dot_product ( Tgc , this % Xc (:, j )) end do end do else ! B-Spline do i = 1 , size ( this % Xt , 1 ) Tgc = basis_bspline ( this % Xt ( i ), this % knot , this % nc , this % degree ) do j = 1 , size ( this % Xc , 2 ) this % Xg ( i , j ) = dot_product ( Tgc , this % Xc (:, j )) end do end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xc_all ( this ) result ( Xc ) class ( nurbs_curve ), intent ( in ) :: this real ( rk ), allocatable :: Xc (:,:) if ( allocated ( this % Xc )) then Xc = this % Xc else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xci ( this , n ) result ( Xc ) class ( nurbs_curve ), intent ( in ) :: this integer , intent ( in ) :: n real ( rk ), allocatable :: Xc (:) if ( allocated ( this % Xc )) then Xc (:) = this % Xc ( n ,:) else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xcid ( this , n , dir ) result ( Xc ) class ( nurbs_curve ), intent ( in ) :: this integer , intent ( in ) :: n integer , intent ( in ) :: dir real ( rk ) :: Xc if ( allocated ( this % Xc )) then Xc = this % Xc ( n , dir ) else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xg_all ( this ) result ( Xg ) class ( nurbs_curve ), intent ( in ) :: this real ( rk ), allocatable :: Xg (:,:) if ( allocated ( this % Xg )) then Xg = this % Xg else error stop 'Geometry points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xgi ( this , n ) result ( Xg ) class ( nurbs_curve ), intent ( in ) :: this integer , intent ( in ) :: n real ( rk ), allocatable :: Xg (:) if ( allocated ( this % Xg )) then Xg (:) = this % Xg ( n ,:) else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xgid ( this , n , dir ) result ( Xg ) class ( nurbs_curve ), intent ( in ) :: this integer , intent ( in ) :: n integer , intent ( in ) :: dir real ( rk ) :: Xg if ( allocated ( this % Xg )) then Xg = this % Xg ( n , dir ) else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Wc_all ( this ) result ( Wc ) class ( nurbs_curve ), intent ( in ) :: this real ( rk ), allocatable :: Wc (:) if ( allocated ( this % Wc )) then Wc = this % Wc else error stop 'The NURBS curve is not rational or weights are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Wci ( this , n ) result ( Wc ) class ( nurbs_curve ), intent ( in ) :: this integer , intent ( in ) :: n real ( rk ) :: Wc if ( allocated ( this % Wc )) then Wc = this % Wc ( n ) else error stop 'The NURBS curve is not rational or weights are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xt ( this ) result ( Xt ) class ( nurbs_curve ), intent ( in ) :: this real ( rk ), allocatable :: Xt (:) if ( allocated ( this % Xt )) then Xt = this % Xt else error stop 'Parameter values are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_ng ( this ) result ( ng ) class ( nurbs_curve ), intent ( in ) :: this integer :: ng ng = this % ng end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_degree ( this ) result ( degree ) class ( nurbs_curve ), intent ( in ) :: this integer :: degree integer , allocatable :: m (:) m = this % get_multiplicity () degree = m ( 1 ) - 1 end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_knot_all ( this ) result ( knot ) class ( nurbs_curve ), intent ( in ) :: this real ( rk ), allocatable :: knot (:) if ( allocated ( this % knot )) then knot = this % knot else error stop 'Knot vector is not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_knoti ( this , i ) result ( knot ) class ( nurbs_curve ), intent ( in ) :: this integer , intent ( in ) :: i real ( rk ) :: knot if ( allocated ( this % knot )) then if ( i < 1 . or . i > size ( this % knot )) then error stop 'Invalid index for knot vector.' else knot = this % knot ( i ) end if else error stop 'Knot vector is not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine finalize ( this ) class ( nurbs_curve ), intent ( inout ) :: this if ( allocated ( this % Xc )) deallocate ( this % Xc ) if ( allocated ( this % Xg )) deallocate ( this % Xg ) if ( allocated ( this % Wc )) deallocate ( this % Wc ) if ( allocated ( this % Xt )) deallocate ( this % Xt ) if ( allocated ( this % knot )) deallocate ( this % knot ) if ( allocated ( this % elemConn_Xc_vis )) deallocate ( this % elemConn_Xc_vis ) if ( allocated ( this % elemConn_Xg_vis )) deallocate ( this % elemConn_Xg_vis ) if ( allocated ( this % elemConn )) deallocate ( this % elemConn ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem_Xc_vis ( this , p ) result ( elemConn ) class ( nurbs_curve ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) integer , intent ( in ), optional :: p if ( present ( p )) then elemConn = elemConn_C0 ( this % nc , p ) else elemConn = elemConn_C0 ( this % nc , 1 ) end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem_Xg_vis ( this , p ) result ( elemConn ) class ( nurbs_curve ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) integer , intent ( in ), optional :: p if ( present ( p )) then elemConn = elemConn_C0 ( this % ng , p ) else elemConn = elemConn_C0 ( this % ng , 1 ) end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine export_Xc ( this , filename ) class ( nurbs_curve ), intent ( in ) :: this character ( len =* ), intent ( in ) :: filename integer :: i , nc , nunit integer , allocatable :: elemConn (:,:) ! check if (. not . allocated ( this % Xc )) then error stop 'Control points are not set.' end if if (. not . allocated ( this % elemConn_Xc_vis )) then elemConn = this % cmp_elem_Xc_vis () else elemConn = this % elemConn_Xc_vis end if nc = size ( this % Xc , 1 ) open ( newunit = nunit , file = filename , action = 'write' ) write ( nunit , '(a)' ) '# vtk DataFile Version 2.0' write ( nunit , '(a)' ) 'Generated by ForCAD' write ( nunit , '(a)' ) 'ASCII' write ( nunit , '(a)' ) 'DATASET UNSTRUCTURED_GRID' write ( nunit , '(a,\" \",g0,\" \",a)' ) 'POINTS' , nc , 'double' if ( size ( this % Xc , 2 ) == 2 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xc ( i , 1 ), this % Xc ( i , 2 ), 0.0_rk , i = 1 , nc ) elseif ( size ( this % Xc , 2 ) == 3 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xc ( i , 1 ), this % Xc ( i , 2 ), this % Xc ( i , 3 ) , i = 1 , nc ) else error stop 'Invalid dimension of the control points.' end if write ( nunit , '(a,\" \",g0,\" \",g0)' ) 'CELLS' , size ( elemConn , 1 ), size ( elemConn , 1 ) * ( size ( elemConn , 2 ) + 1 ) write ( nunit , '(g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0)' )& ( 2 , elemConn ( i , 1 ) - 1 , elemConn ( i , 2 ) - 1 , i = 1 , size ( elemConn , 1 )) write ( nunit , '(a,\" \",g0)' ) 'CELL_TYPES' , size ( elemConn , 1 ) write ( nunit , '(g0)' ) ( 3 , i = 1 , size ( elemConn , 1 )) close ( nunit ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine export_Xg ( this , filename ) class ( nurbs_curve ), intent ( in ) :: this character ( len =* ), intent ( in ) :: filename integer :: i , ng , nunit integer , allocatable :: elemConn (:,:) ! check if (. not . allocated ( this % Xg )) then error stop 'Geometry points are not set.' end if if (. not . allocated ( this % elemConn_Xg_vis )) then elemConn = this % cmp_elem_Xg_vis () else elemConn = this % elemConn_Xg_vis end if ng = size ( this % Xg , 1 ) open ( newunit = nunit , file = filename , action = 'write' ) write ( nunit , '(a)' ) '# vtk DataFile Version 2.0' write ( nunit , '(a)' ) 'Generated by ForCAD' write ( nunit , '(a)' ) 'ASCII' write ( nunit , '(a)' ) 'DATASET UNSTRUCTURED_GRID' write ( nunit , '(a,\" \",g0,\" \",a)' ) 'POINTS' , ng , 'double' if ( size ( this % Xg , 2 ) == 2 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xg ( i , 1 ), this % Xg ( i , 2 ), 0.0_rk , i = 1 , ng ) elseif ( size ( this % Xg , 2 ) == 3 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xg ( i , 1 ), this % Xg ( i , 2 ), this % Xg ( i , 3 ) , i = 1 , ng ) else error stop 'Invalid dimension of the geometry points.' end if write ( nunit , '(a,\" \",g0,\" \",g0)' ) 'CELLS' , size ( elemConn , 1 ), size ( elemConn , 1 ) * ( size ( elemConn , 2 ) + 1 ) write ( nunit , '(g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0)' )& ( 2 , elemConn ( i , 1 ) - 1 , elemConn ( i , 2 ) - 1 , i = 1 , size ( elemConn , 1 )) write ( nunit , '(a,\" \",g0)' ) 'CELL_TYPES' , size ( elemConn , 1 ) write ( nunit , '(g0)' ) ( 3 , i = 1 , size ( elemConn , 1 )) close ( nunit ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine modify_Xc ( this , X , num , dir ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ) :: X integer , intent ( in ) :: num integer , intent ( in ) :: dir if ( allocated ( this % Xc )) then this % Xc ( num , dir ) = X call this % set ( knot = this % knot , Xc = this % Xc , Wc = this % Wc ) else error stop 'Control points are not set.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine modify_Wc ( this , W , num ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ) :: W integer , intent ( in ) :: num real ( rk ), allocatable :: knot (:), Xc (:,:), Wc (:) if ( allocated ( this % Wc )) then this % Wc ( num ) = W Xc = this % Xc Wc = this % Wc if ( allocated ( this % knot )) then knot = this % knot call this % set ( knot = knot , Xc = Xc , Wc = Wc ) else call this % set ( Xc = Xc , Wc = Wc ) end if else error stop 'The NURBS curve is not rational.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_multiplicity ( this ) result ( m ) class ( nurbs_curve ), intent ( in ) :: this integer , allocatable :: m (:) ! check if (. not . allocated ( this % knot )) then error stop 'Knot vector is not set.' else m = compute_multiplicity ( this % knot ) end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_continuity ( this ) result ( c ) class ( nurbs_curve ), intent ( in ) :: this integer , allocatable :: c (:) ! check if (. not . allocated ( this % knot )) then error stop 'Knot vector is not set.' else c = this % degree - compute_multiplicity ( this % knot ) end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_nc ( this ) result ( nc ) class ( nurbs_curve ), intent ( in ) :: this integer :: nc nc = sum ( compute_multiplicity ( this % knot )) - this % degree - 1 end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine insert_knots ( this , Xth , r ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: Xth (:) integer , intent ( in ), contiguous :: r (:) integer :: k , i , s , dim , j , n_new real ( rk ), allocatable :: Xcw (:,:), Xcw_new (:,:), Xc_new (:,:), Wc_new (:), knot_new (:) if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc - 1 , this % degree , Xth ( i ), this % knot ) if ( this % knot ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) call insert_knot_A_5_1 (& this % degree ,& this % knot ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xcw_new ) allocate ( Xc_new ( 1 : n_new + 1 , 1 : dim )) allocate ( Wc_new ( 1 : n_new + 1 )) do j = 1 , n_new + 1 Xc_new ( j , 1 : dim ) = Xcw_new ( j - 1 , 1 : dim ) / Xcw_new ( j - 1 , dim + 1 ) Wc_new ( j ) = Xcw_new ( j - 1 , dim + 1 ) end do call this % set ( knot = knot_new , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc - 1 , this % degree , Xth ( i ), this % knot ) if ( this % knot ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot , Xth ( i )) else s = 0 end if call insert_knot_A_5_1 (& this % degree ,& this % knot ,& this % Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xc_new ) call this % set ( knot = knot_new , Xc = Xc_new ) end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine elevate_degree ( this , t ) class ( nurbs_curve ), intent ( inout ) :: this integer , intent ( in ) :: t real ( rk ), allocatable :: Xcw (:,:), Xcw_new (:,:), knot_new (:), Xc_new (:,:), Wc_new (:) integer :: dim , j , nc_new if ( this % is_rational ()) then ! NURBS dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) Xcw ( j , dim + 1 ) = this % Wc ( j ) end do call elevate_degree_A_5_9 ( t , this % knot , this % degree , Xcw , nc_new , knot_new , Xcw_new ) allocate ( Xc_new ( 1 : nc_new , 1 : dim )) allocate ( Wc_new ( 1 : nc_new )) do j = 1 , nc_new Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) call this % set ( knot = knot_new , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) else ! B-Spline dim = size ( this % Xc , 2 ) call elevate_degree_A_5_9 ( t , this % knot , this % degree , this % Xc , nc_new , knot_new , Xc_new ) call this % set ( knot = knot_new , Xc = Xc_new ) deallocate ( Xc_new ) end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine derivative ( this , res , Xt , dTgc ) class ( nurbs_curve ), intent ( inout ) :: this integer , intent ( in ), optional :: res real ( rk ), intent ( in ), contiguous , optional :: Xt (:) real ( rk ), allocatable , intent ( out ) :: dTgc (:,:) real ( rk ), allocatable :: dTgci (:) integer :: i ! Set parameter values if ( present ( Xt )) then if ( allocated ( this % Xt )) deallocate ( this % Xt ) this % Xt = Xt elseif ( present ( res )) then if ( allocated ( this % Xt )) deallocate ( this % Xt ) allocate ( this % Xt ( res )) this % Xt = [( real ( i - 1 , rk ) / real ( res - 1 , rk ), i = 1 , res )] ! else ! this%Xt = this%Xt end if allocate ( dTgc ( size ( this % Xt , 1 ), this % nc )) if ( this % is_rational ()) then ! NURBS do i = 1 , size ( this % Xt , 1 ) dTgci = basis_bspline_der ( this % Xt ( i ), this % knot , this % nc , this % degree ) dTgci = dTgci * ( this % Wc / ( dot_product ( dTgci , this % Wc ))) dTgc ( i ,:) = dTgci end do else ! B-Spline do i = 1 , size ( this % Xt , 1 ) dTgci = basis_bspline_der ( this % Xt ( i ), this % knot , this % nc , this % degree ) dTgc ( i ,:) = dTgci end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine basis ( this , res , Xt , Tgc ) class ( nurbs_curve ), intent ( inout ) :: this integer , intent ( in ), optional :: res real ( rk ), intent ( in ), contiguous , optional :: Xt (:) real ( rk ), allocatable , intent ( out ) :: Tgc (:,:) real ( rk ), allocatable :: Tgci (:) integer :: i ! Set parameter values if ( present ( Xt )) then if ( allocated ( this % Xt )) deallocate ( this % Xt ) this % Xt = Xt elseif ( present ( res )) then if ( allocated ( this % Xt )) deallocate ( this % Xt ) allocate ( this % Xt ( res )) this % Xt = [( real ( i - 1 , rk ) / real ( res - 1 , rk ), i = 1 , res )] ! else ! this%Xt = this%Xt end if allocate ( Tgc ( size ( this % Xt , 1 ), this % nc )) if ( this % is_rational ()) then ! NURBS do i = 1 , size ( this % Xt , 1 ) Tgci = basis_bspline ( this % Xt ( i ), this % knot , this % nc , this % degree ) Tgci = Tgci * ( this % Wc / ( dot_product ( Tgci , this % Wc ))) Tgc ( i ,:) = Tgci end do else ! B-Spline do i = 1 , size ( this % Xt , 1 ) Tgci = basis_bspline ( this % Xt ( i ), this % knot , this % nc , this % degree ) Tgc ( i ,:) = Tgci end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function is_rational ( this ) result ( r ) class ( nurbs_curve ), intent ( in ) :: this logical :: r r = . false . if ( allocated ( this % Wc )) then if ( any ( this % Wc /= this % Wc ( 1 ))) then r = . true . end if end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem_Xc_vis ( this , elemConn ) class ( nurbs_curve ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn_Xc_vis )) deallocate ( this % elemConn_Xc_vis ) this % elemConn_Xc_vis = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem_Xg_vis ( this , elemConn ) class ( nurbs_curve ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn_Xg_vis )) deallocate ( this % elemConn_Xg_vis ) this % elemConn_Xg_vis = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem ( this , elemConn ) class ( nurbs_curve ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn )) deallocate ( this % elemConn ) this % elemConn = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem_Xc_vis ( this ) result ( elemConn ) class ( nurbs_curve ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn_Xc_vis end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem_Xg_vis ( this ) result ( elemConn ) class ( nurbs_curve ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn_Xg_vis end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem ( this ) result ( elemConn ) class ( nurbs_curve ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine remove_knots ( this , Xth , r ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: Xth (:) integer , intent ( in ), contiguous :: r (:) integer :: k , i , s , dim , j , nc_new , t real ( rk ), allocatable :: Xcw (:,:), Xcw_new (:,:), Xc_new (:,:), Wc_new (:), knot_new (:) if ( this % is_rational ()) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc - 1 , this % degree , Xth ( i ), this % knot ) if ( this % knot ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) call remove_knots_A_5_8 (& this % degree ,& this % knot ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xcw_new ) if ( allocated ( Xcw )) deallocate ( Xcw ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) allocate ( Xc_new ( nc_new , dim )) allocate ( Wc_new ( nc_new )) do j = 1 , nc_new Xc_new ( j ,:) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) call this % set ( knot = knot_new , Xc = Xc_new , Wc = Wc_new ) if ( allocated ( Xcw_new )) deallocate ( Xcw_new ) if ( allocated ( Xc_new )) deallocate ( Xc_new ) if ( allocated ( Wc_new )) deallocate ( Wc_new ) end if end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc - 1 , this % degree , Xth ( i ), this % knot ) if ( this % knot ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot , Xth ( i )) else s = 0 end if k = k + 1 call remove_knots_A_5_8 (& this % degree ,& this % knot ,& this % Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xc_new ) if ( t == 0 ) then ! no change else call this % set ( knot = knot_new , Xc = Xc_new ) end if end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_circle ( this , center , radius ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: center (:) real ( rk ), intent ( in ) :: radius real ( rk ), allocatable :: Xc (:,:), Wc (:), knot (:) integer :: i ! Define control points for circle allocate ( Xc ( 7 , 3 )) Xc ( 1 ,:) = [ 1.0_rk , 0.0_rk , 0.0_rk ] Xc ( 2 ,:) = [ 1.0_rk , sqrt ( 3.0_rk ), 0.0_rk ] Xc ( 3 ,:) = [ - 0.5_rk , sqrt ( 3.0_rk ) / 2.0_rk , 0.0_rk ] Xc ( 4 ,:) = [ - 2.0_rk , 0.0_rk , 0.0_rk ] Xc ( 5 ,:) = [ - 0.5_rk , - sqrt ( 3.0_rk ) / 2.0_rk , 0.0_rk ] Xc ( 6 ,:) = [ 1.0_rk , - sqrt ( 3.0_rk ), 0.0_rk ] Xc ( 7 ,:) = [ 1.0_rk , 0.0_rk , 0.0_rk ] ! Scale and translate the control points do i = 1 , size ( Xc , 1 ) Xc ( i ,:) = center + Xc ( i ,:) * radius end do ! Define weights for the control points Wc = [ 1.0_rk , 0.5_rk , 1.0_rk , 0.5_rk , 1.0_rk , 0.5_rk , 1.0_rk ] ! Define knot vector knot = [ 0.0_rk , 0.0_rk , 0.0_rk , 1.0_rk / 3.0_rk , 1.0_rk / 3.0_rk , 2.0_rk / 3.0_rk , 2.0_rk / 3.0_rk , 1.0_rk , 1.0_rk , 1.0_rk ] ! Set knot vector, control points, and weights call this % set ( knot , Xc , Wc ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem ( this ) result ( elemConn ) class ( nurbs_curve ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) call elemConn_Cn ( this % nc , this % degree , unique ( this % knot ), this % get_multiplicity (),& elemConn ) end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine rotate_Xc ( this , alpha , beta , theta ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ) :: alpha , beta , theta integer :: i do i = 1 , this % nc this % Xc ( i , :) = matmul ( rotation ( alpha , beta , theta ), this % Xc ( i , :)) end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine rotate_Xg ( this , alpha , beta , theta ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ) :: alpha , beta , theta integer :: i do i = 1 , this % ng this % Xg ( i , :) = matmul ( rotation ( alpha , beta , theta ), this % Xg ( i , :)) end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine translate_Xc ( this , vec ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ) :: vec (:) integer :: i do i = 1 , this % nc this % Xc ( i , :) = this % Xc ( i , :) + vec end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine translate_Xg ( this , vec ) class ( nurbs_curve ), intent ( inout ) :: this real ( rk ), intent ( in ) :: vec (:) integer :: i do i = 1 , this % nc this % Xg ( i , :) = this % Xg ( i , :) + vec end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine show ( this , vtkfile_Xc , vtkfile_Xg ) class ( nurbs_curve ), intent ( inout ) :: this character ( len =* ), intent ( in ) :: vtkfile_Xc , vtkfile_Xg character ( len = 3000 ) :: pyvista_script pyvista_script = & \"import pyvista as pv\" // achar ( 10 ) // & \"pv.global_theme.color = 'white'\" // achar ( 10 ) // & \"Xc = pv.read('\" // trim ( vtkfile_Xc ) // \"')\" // achar ( 10 ) // & \"Xg = pv.read('\" // trim ( vtkfile_Xg ) // \"')\" // achar ( 10 ) // & \"p = pv.Plotter(lighting='light kit')\" // achar ( 10 ) // & \"actor_Xcp = p.add_mesh(\" // achar ( 10 ) // & \" Xc,\" // achar ( 10 ) // & \" style='points',\" // achar ( 10 ) // & \" point_size=10,\" // achar ( 10 ) // & \" color='red',\" // achar ( 10 ) // & \" render_points_as_spheres=True,\" // achar ( 10 ) // & \" opacity=0.5,\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"actor_Xcw = p.add_mesh(\" // achar ( 10 ) // & \" Xc,\" // achar ( 10 ) // & \" show_edges=True,\" // achar ( 10 ) // & \" color='yellow',\" // achar ( 10 ) // & \" line_width=3,\" // achar ( 10 ) // & \" style='wireframe',\" // achar ( 10 ) // & \" opacity=0.2\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"actor_Xg = p.add_mesh(\" // achar ( 10 ) // & \" Xg,\" // achar ( 10 ) // & \" show_edges=False,\" // achar ( 10 ) // & \" color='cyan',\" // achar ( 10 ) // & \" line_width=7,\" // achar ( 10 ) // & \" metallic=0.6,\" // achar ( 10 ) // & \" pbr=True,\" // achar ( 10 ) // & \" split_sharp_edges=True,\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_axes(interactive=False)\" // achar ( 10 ) // & \"def point_picker_callback(point):\" // achar ( 10 ) // & \" mesh = Xc\" // achar ( 10 ) // & \" point_id = mesh.find_closest_point(point)\" // achar ( 10 ) // & \" point_coords = mesh.points[point_id]\" // achar ( 10 ) // & \" label = f'ID: {point_id + 1}\\n({point_coords[0]:.3f}, {point_coords[1]:.3f}, {point_coords[2]:.3f})'\" // achar ( 10 ) // & \" p.add_point_labels(\" // achar ( 10 ) // & \" [point_coords],\" // achar ( 10 ) // & \" [label],\" // achar ( 10 ) // & \" font_size=14,\" // achar ( 10 ) // & \" text_color='black',\" // achar ( 10 ) // & \" show_points=False,\" // achar ( 10 ) // & \" fill_shape=False,\" // achar ( 10 ) // & \" shape=None,\" // achar ( 10 ) // & \" )\" // achar ( 10 ) // & \"picker = p.enable_point_picking(callback=point_picker_callback, show_message=False)\" // achar ( 10 ) // & \"window_size = p.window_size\" // achar ( 10 ) // & \"y_pos = window_size[1]\" // achar ( 10 ) // & \"def Xcp_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xcp.SetVisibility(flag)\" // achar ( 10 ) // & \"def Xcw_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xcw.SetVisibility(flag)\" // achar ( 10 ) // & \"def Xg_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xg.SetVisibility(flag)\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xcp_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='red',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 1 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xcw_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='yellow',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 2 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xg_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='cyan',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 3 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xc (Points)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 1 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xc (Control geometry)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 2 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xg (Geometry)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 3 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text('ForCAD', position=(0.0, 10.0), font_size=14, color='black', font='times')\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'https://github.com/gha3mi/forcad',\" // achar ( 10 ) // & \" position=(0.0, 0.0),\" // achar ( 10 ) // & \" font_size=7,\" // achar ( 10 ) // & \" color='blue',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.show(title='ForCAD', interactive=True)\" call execute_command_line ( 'python -c \"' // trim ( adjustl ( pyvista_script )) // '\"' ) end subroutine !=============================================================================== end module forcad_nurbs_curve","tags":"","loc":"sourcefile/forcad_nurbs_curve.f90.html"},{"title":"forcad_nurbs_volume.f90 – ForCAD","text":"This file depends on sourcefile~~forcad_nurbs_volume.f90~~EfferentGraph sourcefile~forcad_nurbs_volume.f90 forcad_nurbs_volume.f90 sourcefile~forcad_utils.f90 forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Files dependent on this one sourcefile~~forcad_nurbs_volume.f90~~AfferentGraph sourcefile~forcad_nurbs_volume.f90 forcad_nurbs_volume.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~forcad.f90->sourcefile~forcad_nurbs_volume.f90 sourcefile~demo_curve.f90 demo_curve.f90 sourcefile~demo_curve.f90->sourcefile~forcad.f90 sourcefile~demo_surface.f90 demo_surface.f90 sourcefile~demo_surface.f90->sourcefile~forcad.f90 sourcefile~demo_volume.f90 demo_volume.f90 sourcefile~demo_volume.f90->sourcefile~forcad.f90 sourcefile~example_curve_1.f90 example_curve_1.f90 sourcefile~example_curve_1.f90->sourcefile~forcad.f90 sourcefile~example_surface_1.f90 example_surface_1.f90 sourcefile~example_surface_1.f90->sourcefile~forcad.f90 sourcefile~example_volume_1.f90 example_volume_1.f90 sourcefile~example_volume_1.f90->sourcefile~forcad.f90 sourcefile~put_to_nurbs.f90 put_to_nurbs.f90 sourcefile~put_to_nurbs.f90->sourcefile~forcad.f90 sourcefile~shape_circle.f90 shape_circle.f90 sourcefile~shape_circle.f90->sourcefile~forcad.f90 sourcefile~shape_hexahedron.f90 shape_hexahedron.f90 sourcefile~shape_hexahedron.f90->sourcefile~forcad.f90 sourcefile~shape_tetragon.f90 shape_tetragon.f90 sourcefile~shape_tetragon.f90->sourcefile~forcad.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> This module defines the 'nurbs_volume' type for representing a Non-Uniform Rational B-Spline (NURBS) volume. module forcad_nurbs_volume use forcad_utils , only : rk , basis_bspline , elemConn_C0 , kron , ndgrid , compute_multiplicity , compute_knot_vector , & basis_bspline_der , insert_knot_A_5_1 , findspan , elevate_degree_A_5_9 , hexahedron_Xc , remove_knots_A_5_8 , & elemConn_Cn , unique , rotation implicit none private public nurbs_volume !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause type nurbs_volume real ( rk ), allocatable , private :: Xc (:,:) !! Control points (2D array: [nc(1)*nc(2)*nc(3), dim]) real ( rk ), allocatable , private :: Xg (:,:) !! Geometry points (2D array: [ng(1)*ng(2)*ng(3), dim]) real ( rk ), allocatable , private :: Wc (:) !! Weights for the control points (1D array: [nc(1)*nc(2)*nc(3)]) real ( rk ), allocatable , private :: Xt1 (:) !! Evaluation parameter values in the first direction (1D array: [ng(1)]) real ( rk ), allocatable , private :: Xt2 (:) !! Evaluation parameter values in the second direction (1D array: [ng(2)]) real ( rk ), allocatable , private :: Xt3 (:) !! Evaluation parameter values in the third direction (1D array: [ng(3)]) real ( rk ), allocatable , private :: knot1 (:) !! Knot vector in the first direction (1D array) real ( rk ), allocatable , private :: knot2 (:) !! Knot vector in the second direction (1D array) real ( rk ), allocatable , private :: knot3 (:) !! Knot vector in the third direction (1D array) integer , private :: degree ( 3 ) !! Degree (order) of the volume integer , private :: nc ( 3 ) !! Number of control points in each direction integer , private :: ng ( 3 ) !! Number of geometry points in each direction integer , allocatable , private :: elemConn_Xc_vis (:,:) !! Connectivity for visualization of control points integer , allocatable , private :: elemConn_Xg_vis (:,:) !! Connectivity for visualization of geometry points integer , allocatable , private :: elemConn (:,:) !! IGA element connectivity contains procedure :: set1 !!> Set knot vectors, control points and weights for the NURBS volume object procedure :: set2 !!> Set NURBS volume using nodes of parameter space, degree, continuity, control points and weights procedure :: set3 !!> Set Bezier or Rational Bezier volume using control points and weights generic :: set => set1 , set2 , set3 !!> Set NURBS volume procedure :: create !!> Generate geometry points procedure , private :: get_Xc_all !!> Get all control points procedure , private :: get_Xci !!> Get i-th control point procedure , private :: get_Xcid !!> Get i-th control point in a specific direction generic :: get_Xc => get_Xc_all , get_Xci , get_Xcid !!> Get control points procedure , private :: get_Xg_all !!> Get all geometry points procedure , private :: get_Xgi !!> Get i-th geometry point procedure , private :: get_Xgid !!> Get i-th geometry point in a specific direction generic :: get_Xg => get_Xg_all , get_Xgi , get_Xgid !!> Get geometry points procedure , private :: get_Wc_all !!> Get all weights procedure , private :: get_Wci !!> Get i-th weight generic :: get_Wc => get_Wc_all , get_Wci !!> Get weights procedure :: get_Xt !!> Get parameter values procedure , private :: get_knot_all !!> Get all knot vectors procedure , private :: get_knoti !!> Get i-th knot value generic :: get_knot => get_knoti , get_knot_all !!> Get knot vector procedure :: get_ng !!> Get number of geometry points procedure , private :: get_degree_all !!> Get degree of the NURBS volume in all directions procedure , private :: get_degree_dir !!> Get degree of the NURBS volume in a specific direction generic :: get_degree => get_degree_all , get_degree_dir !!> Get degree of the NURBS volume procedure :: finalize !!> Finalize the NURBS volume object procedure :: cmp_elem_Xc_vis !!> Generate connectivity for control points procedure :: cmp_elem_Xg_vis !!> Generate connectivity for geometry points procedure :: cmp_elem !!> Generate IGA element connectivity procedure :: get_elem_Xc_vis !!> Get connectivity for control points procedure :: get_elem_Xg_vis !!> Get connectivity for geometry points procedure :: get_elem !!> Get IGA element connectivity procedure :: set_elem_Xc_vis !!> Set connectivity for control points procedure :: set_elem_Xg_vis !!> Set connectivity for geometry points procedure :: set_elem !!> Set IGA element connectivity procedure :: export_Xc !!> Export control points to VTK file procedure :: export_Xg !!> Export geometry points to VTK file procedure :: modify_Xc !!> Modify control points procedure :: modify_Wc !!> Modify weights procedure :: get_multiplicity !!> Get multiplicity of the knot vector procedure :: get_continuity !!> Get continuity of the volume procedure :: get_nc !!> Get number of required control points procedure :: derivative !!> Compute the derivative of the NURBS volume procedure :: basis !!> Compute the basis functions of the NURBS volume procedure :: insert_knots !!> Insert knots into the knot vector procedure :: elevate_degree !!> Elevate the degree of the NURBS volume procedure :: is_rational !!> Check if the NURBS volume is rational procedure :: put_to_nurbs !!> Put a shape to a NURBS volume procedure :: remove_knots !!> Remove knots from the knot vector procedure :: rotate_Xc !!> Rotate control points procedure :: rotate_Xg !!> Rotate geometry points procedure :: translate_Xc !!> Translate control points procedure :: translate_Xg !!> Translate geometry points procedure :: show !!> Show the NURBS object using PyVista ! Shapes procedure :: set_hexahedron !!> Set a hexahedron end type !=============================================================================== contains !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set control points and weights for the NURBS volume object. pure subroutine set1 ( this , knot1 , knot2 , knot3 , Xc , Wc ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: knot1 (:), knot2 (:), knot3 (:) real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) if ( allocated ( this % knot1 )) deallocate ( this % knot1 ) if ( allocated ( this % knot2 )) deallocate ( this % knot2 ) if ( allocated ( this % knot3 )) deallocate ( this % knot3 ) if ( allocated ( this % Xc )) deallocate ( this % Xc ) this % knot1 = knot1 this % knot2 = knot2 this % knot3 = knot3 this % degree = this % get_degree () this % nc ( 1 ) = this % get_nc ( 1 ) this % nc ( 2 ) = this % get_nc ( 2 ) this % nc ( 3 ) = this % get_nc ( 3 ) this % Xc = Xc if ( present ( Wc )) then if ( size ( Wc ) /= this % nc ( 1 ) * this % nc ( 2 ) * this % nc ( 3 )) then error stop 'Number of weights does not match the number of control points.' else if ( allocated ( this % Wc )) deallocate ( this % Wc ) this % Wc = Wc end if end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set control points and weights for the NURBS volume object. pure subroutine set2 ( this , Xth_dir1 , Xth_dir2 , Xth_dir3 , degree , continuity1 , continuity2 , continuity3 , Xc , Wc ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: Xth_dir1 (:), Xth_dir2 (:), Xth_dir3 (:) integer , intent ( in ), contiguous :: degree (:) integer , intent ( in ), contiguous :: continuity1 (:), continuity2 (:), continuity3 (:) real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) this % knot1 = compute_knot_vector ( Xth_dir1 , degree ( 1 ), continuity1 ) this % knot2 = compute_knot_vector ( Xth_dir2 , degree ( 2 ), continuity2 ) this % knot3 = compute_knot_vector ( Xth_dir3 , degree ( 3 ), continuity3 ) this % degree ( 1 ) = degree ( 1 ) this % degree ( 2 ) = degree ( 2 ) this % degree ( 3 ) = degree ( 3 ) this % nc ( 1 ) = this % get_nc ( 1 ) this % nc ( 2 ) = this % get_nc ( 2 ) this % nc ( 3 ) = this % get_nc ( 3 ) this % Xc = Xc if ( present ( Wc )) this % Wc = Wc end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause !> Set Bezier or Rational Bezier volume using control points and weights. pure subroutine set3 ( this , nc , Xc , Wc ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ), contiguous :: nc (:) real ( rk ), intent ( in ), contiguous :: Xc (:,:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) if ( allocated ( this % Xc )) deallocate ( this % Xc ) this % Xc = Xc this % nc = nc if ( allocated ( this % knot1 )) deallocate ( this % knot1 ) allocate ( this % knot1 ( 2 * this % nc ( 1 ))) this % knot1 ( 1 : this % nc ( 1 )) = 0.0_rk this % knot1 ( this % nc ( 1 ) + 1 : 2 * this % nc ( 1 )) = 1.0_rk if ( allocated ( this % knot2 )) deallocate ( this % knot2 ) allocate ( this % knot2 ( 2 * this % nc ( 2 ))) this % knot2 ( 1 : this % nc ( 2 )) = 0.0_rk this % knot2 ( this % nc ( 2 ) + 1 : 2 * this % nc ( 2 )) = 1.0_rk if ( allocated ( this % knot3 )) deallocate ( this % knot3 ) allocate ( this % knot3 ( 2 * this % nc ( 3 ))) this % knot3 ( 1 : this % nc ( 3 )) = 0.0_rk this % knot3 ( this % nc ( 3 ) + 1 : 2 * this % nc ( 3 )) = 1.0_rk this % degree = this % get_degree () if ( present ( Wc )) then if ( size ( Wc ) /= this % nc ( 1 ) * this % nc ( 2 ) * this % nc ( 3 )) then error stop 'Number of weights does not match the number of control points.' else if ( allocated ( this % Wc )) deallocate ( this % Wc ) this % Wc = Wc end if end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine create ( this , res1 , res2 , res3 , Xt1 , Xt2 , Xt3 , Xt ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ), optional :: res1 , res2 , res3 real ( rk ), intent ( in ), contiguous , optional :: Xt1 (:), Xt2 (:), Xt3 (:) real ( rk ), intent ( in ), contiguous , optional :: Xt (:,:) integer :: i , j real ( rk ), allocatable :: Tgc1 (:), Tgc2 (:), Tgc3 (:), Tgc (:) real ( rk ), allocatable :: Xt_ (:,:) ! check if (. not . allocated ( this % Xc )) then error stop 'Control points are not set.' end if if (. not . allocated ( this % knot1 ) . or . . not . allocated ( this % knot2 ) . or . . not . allocated ( this % knot3 )) then error stop 'Knot vector(s) is/are not set.' end if ! Set parameter values if ( present ( Xt1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) this % Xt1 = Xt1 elseif ( present ( res1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) allocate ( this % Xt1 ( res1 )) this % Xt1 = [( real ( i - 1 , rk ) / real ( res1 - 1 , rk ), i = 1 , res1 )] ! else ! this%Xt1 = this%Xt1 end if ! Set parameter values if ( present ( Xt2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) this % Xt2 = Xt2 elseif ( present ( res2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) allocate ( this % Xt2 ( res2 )) this % Xt2 = [( real ( i - 1 , rk ) / real ( res2 - 1 , rk ), i = 1 , res2 )] ! else ! this%Xt2 = this%Xt2 end if ! Set parameter values if ( present ( Xt3 )) then if ( allocated ( this % Xt3 )) deallocate ( this % Xt3 ) this % Xt3 = Xt3 elseif ( present ( res3 )) then if ( allocated ( this % Xt3 )) deallocate ( this % Xt3 ) allocate ( this % Xt3 ( res3 )) this % Xt3 = [( real ( i - 1 , rk ) / real ( res3 - 1 , rk ), i = 1 , res3 )] ! else ! this%Xt3 = this%Xt3 end if if ( present ( Xt )) then Xt_ = Xt else ! Set number of geometry points this % ng ( 1 ) = size ( this % Xt1 , 1 ) this % ng ( 2 ) = size ( this % Xt2 , 1 ) this % ng ( 3 ) = size ( this % Xt3 , 1 ) call ndgrid ( this % Xt1 , this % Xt2 , this % Xt3 , Xt_ ) end if if ( allocated ( this % Xg )) deallocate ( this % Xg ) allocate ( this % Xg ( size ( Xt_ , 1 ), size ( this % Xc , 2 ))) if ( allocated ( this % Wc )) then ! NURBS volume do i = 1 , size ( Xt_ , 1 ) Tgc1 = basis_bspline ( Xt_ ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt_ ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgc3 = basis_bspline ( Xt_ ( i , 3 ), this % knot3 , this % nc ( 3 ), this % degree ( 3 )) Tgc = kron ( Tgc3 , kron ( Tgc2 , Tgc1 )) Tgc = Tgc * ( this % Wc / ( dot_product ( Tgc , this % Wc ))) do j = 1 , size ( this % Xc , 2 ) this % Xg ( i , j ) = dot_product ( Tgc , this % Xc (:, j )) end do end do else do i = 1 , size ( Xt_ , 1 ) Tgc1 = basis_bspline ( Xt_ ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt_ ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgc3 = basis_bspline ( Xt_ ( i , 3 ), this % knot3 , this % nc ( 3 ), this % degree ( 3 )) Tgc = kron ( Tgc3 , kron ( Tgc2 , Tgc1 )) do j = 1 , size ( this % Xc , 2 ) this % Xg ( i , j ) = dot_product ( Tgc , this % Xc (:, j )) end do end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xc_all ( this ) result ( Xc ) class ( nurbs_volume ), intent ( in ) :: this real ( rk ), allocatable :: Xc (:,:) if ( allocated ( this % Xc )) then Xc = this % Xc else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xci ( this , n ) result ( Xc ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: n real ( rk ), allocatable :: Xc (:) if ( allocated ( this % Xc )) then Xc (:) = this % Xc ( n ,:) else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xcid ( this , n , dir ) result ( Xc ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: n integer , intent ( in ) :: dir real ( rk ) :: Xc if ( allocated ( this % Xc )) then Xc = this % Xc ( n , dir ) else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xg_all ( this ) result ( Xg ) class ( nurbs_volume ), intent ( in ) :: this real ( rk ), allocatable :: Xg (:,:) if ( allocated ( this % Xg )) then Xg = this % Xg else error stop 'Geometry points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xgi ( this , n ) result ( Xg ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: n real ( rk ), allocatable :: Xg (:) if ( allocated ( this % Xg )) then Xg (:) = this % Xg ( n ,:) else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xgid ( this , n , dir ) result ( Xg ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: n integer , intent ( in ) :: dir real ( rk ) :: Xg if ( allocated ( this % Xg )) then Xg = this % Xg ( n , dir ) else error stop 'Control points are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Wc_all ( this ) result ( Wc ) class ( nurbs_volume ), intent ( in ) :: this real ( rk ), allocatable :: Wc (:) if ( allocated ( this % Wc )) then Wc = this % Wc else error stop 'The NURBS volume is not rational or weights are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Wci ( this , n ) result ( Wc ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: n real ( rk ) :: Wc if ( allocated ( this % Wc )) then Wc = this % Wc ( n ) else error stop 'The NURBS volume is not rational or weights are not set.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_Xt ( this , dir ) result ( Xt ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: dir real ( rk ), allocatable :: Xt (:) if ( dir == 1 ) then if ( allocated ( this % Xt1 )) then Xt = this % Xt1 else error stop 'Parameter values are not set.' end if elseif ( dir == 2 ) then if ( allocated ( this % Xt2 )) then Xt = this % Xt2 else error stop 'Parameter values are not set.' end if elseif ( dir == 3 ) then if ( allocated ( this % Xt3 )) then Xt = this % Xt3 else error stop 'Parameter values are not set.' end if else error stop 'Invalid direction for parameter values.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_ng ( this ) result ( ng ) class ( nurbs_volume ), intent ( in ) :: this integer :: ng ( 3 ) ng = this % ng end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_degree_all ( this ) result ( degree ) class ( nurbs_volume ), intent ( in ) :: this integer :: degree ( 3 ) integer , allocatable :: m1 (:), m2 (:), m3 (:) m1 = this % get_multiplicity ( 1 ) m2 = this % get_multiplicity ( 2 ) m3 = this % get_multiplicity ( 3 ) degree ( 1 ) = m1 ( 1 ) - 1 degree ( 2 ) = m2 ( 1 ) - 1 degree ( 3 ) = m3 ( 1 ) - 1 end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_degree_dir ( this , dir ) result ( degree ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: dir integer :: degree integer , allocatable :: m1 (:), m2 (:), m3 (:) if ( dir == 1 ) then m1 = this % get_multiplicity ( 1 ) degree = m1 ( 1 ) - 1 else if ( dir == 2 ) then m2 = this % get_multiplicity ( 2 ) degree = m2 ( 1 ) - 1 else if ( dir == 3 ) then m3 = this % get_multiplicity ( 3 ) degree = m3 ( 1 ) - 1 else error stop 'Invalid direction for degree.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_knot_all ( this , dir ) result ( knot ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: dir real ( rk ), allocatable :: knot (:) if ( dir == 1 ) then if ( allocated ( this % knot1 )) then knot = this % knot1 else error stop 'Knot vector is not set.' end if elseif ( dir == 2 ) then if ( allocated ( this % knot2 )) then knot = this % knot2 else error stop 'Knot vector is not set.' end if elseif ( dir == 3 ) then if ( allocated ( this % knot3 )) then knot = this % knot3 else error stop 'Knot vector is not set.' end if else error stop 'Invalid direction for knot vector.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_knoti ( this , dir , i ) result ( knot ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: dir integer , intent ( in ) :: i real ( rk ) :: knot if ( dir == 1 ) then if ( allocated ( this % knot1 )) then if ( i < 1 . or . i > size ( this % knot1 )) then error stop 'Invalid index for knot vector.' else knot = this % knot1 ( i ) end if else error stop 'Knot vector is not set.' end if elseif ( dir == 2 ) then if ( allocated ( this % knot2 )) then if ( i < 1 . or . i > size ( this % knot2 )) then error stop 'Invalid index for knot vector.' else knot = this % knot2 ( i ) end if else error stop 'Knot vector is not set.' end if elseif ( dir == 3 ) then if ( allocated ( this % knot3 )) then if ( i < 1 . or . i > size ( this % knot3 )) then error stop 'Invalid index for knot vector.' else knot = this % knot3 ( i ) end if else error stop 'Knot vector is not set.' end if else error stop 'Invalid direction for knot vector.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine finalize ( this ) class ( nurbs_volume ), intent ( inout ) :: this if ( allocated ( this % Xc )) deallocate ( this % Xc ) if ( allocated ( this % Xg )) deallocate ( this % Xg ) if ( allocated ( this % Wc )) deallocate ( this % Wc ) if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) if ( allocated ( this % Xt3 )) deallocate ( this % Xt3 ) if ( allocated ( this % knot1 )) deallocate ( this % knot1 ) if ( allocated ( this % knot2 )) deallocate ( this % knot2 ) if ( allocated ( this % knot3 )) deallocate ( this % knot3 ) if ( allocated ( this % elemConn_Xc_vis )) deallocate ( this % elemConn_Xc_vis ) if ( allocated ( this % elemConn_Xg_vis )) deallocate ( this % elemConn_Xg_vis ) if ( allocated ( this % elemConn )) deallocate ( this % elemConn ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem_Xc_vis ( this , p ) result ( elemConn ) class ( nurbs_volume ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) integer , intent ( in ), contiguous , optional :: p (:) if ( present ( p )) then elemConn = elemConn_C0 ( this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), p ( 1 ), p ( 2 ), p ( 3 )) else elemConn = elemConn_C0 ( this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), 1 , 1 , 1 ) end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem_Xg_vis ( this , p ) result ( elemConn ) class ( nurbs_volume ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) integer , intent ( in ), contiguous , optional :: p (:) if ( present ( p )) then elemConn = elemConn_C0 ( this % ng ( 1 ), this % ng ( 2 ), this % ng ( 3 ), p ( 1 ), p ( 2 ), p ( 3 )) else elemConn = elemConn_C0 ( this % ng ( 1 ), this % ng ( 2 ), this % ng ( 3 ), 1 , 1 , 1 ) end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine export_Xc ( this , filename ) class ( nurbs_volume ), intent ( in ) :: this character ( len =* ), intent ( in ) :: filename integer :: i , nc , nunit integer , allocatable :: elemConn (:,:) ! check if (. not . allocated ( this % Xc )) then error stop 'Control points are not set.' end if if (. not . allocated ( this % elemConn_Xc_vis )) then elemConn = this % cmp_elem_Xc_vis () else elemConn = this % elemConn_Xc_vis end if nc = size ( this % Xc , 1 ) open ( newunit = nunit , file = filename , action = 'write' ) write ( nunit , '(a)' ) '# vtk DataFile Version 2.0' write ( nunit , '(a)' ) 'Generated by ForCAD' write ( nunit , '(a)' ) 'ASCII' write ( nunit , '(a)' ) 'DATASET UNSTRUCTURED_GRID' write ( nunit , '(a,\" \",g0,\" \",a)' ) 'POINTS' , nc , 'double' if ( size ( this % Xc , 2 ) == 2 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xc ( i , 1 ), this % Xc ( i , 2 ), 0.0_rk , i = 1 , nc ) elseif ( size ( this % Xc , 2 ) == 3 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xc ( i , 1 ), this % Xc ( i , 2 ), this % Xc ( i , 3 ) , i = 1 , nc ) else error stop 'Invalid dimension for control points.' end if write ( nunit , '(a,\" \",g0,\" \",g0)' ) 'CELLS' , size ( elemConn , 1 ), size ( elemConn , 1 ) * ( size ( elemConn , 2 ) + 1 ) write ( nunit , '(g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0)' )& ( 8 , elemConn ( i , 1 ) - 1 , elemConn ( i , 2 ) - 1 , elemConn ( i , 4 ) - 1 , elemConn ( i , 3 ) - 1 ,& elemConn ( i , 5 ) - 1 , elemConn ( i , 6 ) - 1 , elemConn ( i , 8 ) - 1 , elemConn ( i , 7 ) - 1 , i = 1 , size ( elemConn , 1 )) write ( nunit , '(a,\" \",g0)' ) 'CELL_TYPES' , size ( elemConn , 1 ) write ( nunit , '(g0)' ) ( 12 , i = 1 , size ( elemConn , 1 )) close ( nunit ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine export_Xg ( this , filename ) class ( nurbs_volume ), intent ( in ) :: this character ( len =* ), intent ( in ) :: filename integer :: i , ng , nunit integer , allocatable :: elemConn (:,:) ! check if (. not . allocated ( this % Xg )) then error stop 'Geometry points are not set.' end if if (. not . allocated ( this % elemConn_Xg_vis )) then elemConn = this % cmp_elem_Xg_vis () else elemConn = this % elemConn_Xg_vis end if ng = size ( this % Xg , 1 ) open ( newunit = nunit , file = filename , action = 'write' ) write ( nunit , '(a)' ) '# vtk DataFile Version 2.0' write ( nunit , '(a)' ) 'Generated by ForCAD' write ( nunit , '(a)' ) 'ASCII' write ( nunit , '(a)' ) 'DATASET UNSTRUCTURED_GRID' write ( nunit , '(a,\" \",g0,\" \",a)' ) 'POINTS' , ng , 'double' if ( size ( this % Xg , 2 ) == 2 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xg ( i , 1 ), this % Xg ( i , 2 ), 0.0_rk , i = 1 , ng ) elseif ( size ( this % Xg , 2 ) == 3 ) then write ( nunit , '(g0,\" \",g0,\" \",g0)' ) ( this % Xg ( i , 1 ), this % Xg ( i , 2 ), this % Xg ( i , 3 ) , i = 1 , ng ) else error stop 'Invalid dimension for geometry points.' end if write ( nunit , '(a,\" \",g0,\" \",g0)' ) 'CELLS' , size ( elemConn , 1 ), size ( elemConn , 1 ) * ( size ( elemConn , 2 ) + 1 ) write ( nunit , '(g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0,\" \",g0)' )& ( 8 , elemConn ( i , 1 ) - 1 , elemConn ( i , 2 ) - 1 , elemConn ( i , 4 ) - 1 , elemConn ( i , 3 ) - 1 ,& elemConn ( i , 5 ) - 1 , elemConn ( i , 6 ) - 1 , elemConn ( i , 8 ) - 1 , elemConn ( i , 7 ) - 1 , i = 1 , size ( elemConn , 1 )) write ( nunit , '(a,\" \",g0)' ) 'CELL_TYPES' , size ( elemConn , 1 ) write ( nunit , '(g0)' ) ( 12 , i = 1 , size ( elemConn , 1 )) close ( nunit ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine modify_Xc ( this , X , num , dir ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ) :: X integer , intent ( in ) :: num integer , intent ( in ) :: dir if ( allocated ( this % Xc )) then this % Xc ( num , dir ) = X call this % set ( knot1 = this % knot1 , knot2 = this % knot2 , knot3 = this % knot3 , Xc = this % Xc , Wc = this % Wc ) else error stop 'Control points are not set.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine modify_Wc ( this , W , num ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ) :: W integer , intent ( in ) :: num real ( rk ), allocatable :: knot1 (:), knot2 (:), knot3 (:), Xc (:,:), Wc (:) if ( allocated ( this % Wc )) then this % Wc ( num ) = W Xc = this % Xc Wc = this % Wc if ( allocated ( this % knot1 ) . and . allocated ( this % knot2 ) . and . allocated ( this % knot3 )) then knot1 = this % knot1 knot2 = this % knot2 knot3 = this % knot3 call this % set ( knot1 = knot1 , knot2 = knot2 , knot3 = knot3 , Xc = Xc , Wc = Wc ) else call this % set ( nc = this % nc , Xc = Xc , Wc = Wc ) end if else error stop 'The NURBS volume is not rational.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_multiplicity ( this , dir ) result ( m ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: dir integer , allocatable :: m (:) if ( dir == 1 ) then ! check if (. not . allocated ( this % knot1 )) then error stop 'Knot vector is not set.' else m = compute_multiplicity ( this % knot1 ) end if elseif ( dir == 2 ) then ! check if (. not . allocated ( this % knot2 )) then error stop 'Knot vector is not set.' else m = compute_multiplicity ( this % knot2 ) end if elseif ( dir == 3 ) then ! check if (. not . allocated ( this % knot3 )) then error stop 'Knot vector is not set.' else m = compute_multiplicity ( this % knot3 ) end if else error stop 'Invalid direction.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_continuity ( this , dir ) result ( c ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: dir integer , allocatable :: c (:) if ( dir == 1 ) then ! check if (. not . allocated ( this % knot1 )) then error stop 'Knot vector is not set.' else c = this % degree ( 1 ) - compute_multiplicity ( this % knot1 ) end if elseif ( dir == 2 ) then ! check if (. not . allocated ( this % knot2 )) then error stop 'Knot vector is not set.' else c = this % degree ( 2 ) - compute_multiplicity ( this % knot2 ) end if elseif ( dir == 3 ) then ! check if (. not . allocated ( this % knot3 )) then error stop 'Knot vector is not set.' else c = this % degree ( 3 ) - compute_multiplicity ( this % knot3 ) end if else error stop 'Invalid direction.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_nc ( this , dir ) result ( nc ) class ( nurbs_volume ), intent ( in ) :: this integer , intent ( in ) :: dir integer :: nc if ( dir == 1 ) then ! check if (. not . allocated ( this % knot1 )) then error stop 'Knot vector is not set.' else nc = sum ( compute_multiplicity ( this % knot1 )) - this % degree ( 1 ) - 1 end if elseif ( dir == 2 ) then ! check if (. not . allocated ( this % knot2 )) then error stop 'Knot vector is not set.' else nc = sum ( compute_multiplicity ( this % knot2 )) - this % degree ( 2 ) - 1 end if elseif ( dir == 3 ) then ! check if (. not . allocated ( this % knot3 )) then error stop 'Knot vector is not set.' else nc = sum ( compute_multiplicity ( this % knot3 )) - this % degree ( 3 ) - 1 end if else error stop 'Invalid direction.' end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine derivative ( this , res1 , res2 , res3 , Xt1 , Xt2 , Xt3 , dTgc ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ), optional :: res1 , res2 , res3 real ( rk ), intent ( in ), contiguous , optional :: Xt1 (:), Xt2 (:), Xt3 (:) real ( rk ), allocatable , intent ( out ) :: dTgc (:,:) real ( rk ), allocatable :: dTgci (:) integer :: i real ( rk ), allocatable :: dTgc1 (:), dTgc2 (:), dTgc3 (:) real ( rk ), allocatable :: Xt (:,:) ! Set parameter values if ( present ( Xt1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) this % Xt1 = Xt1 elseif ( present ( res1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) allocate ( this % Xt1 ( res1 )) this % Xt1 = [( real ( i - 1 , rk ) / real ( res1 - 1 , rk ), i = 1 , res1 )] ! else ! this%Xt1 = this%Xt1 end if ! Set parameter values if ( present ( Xt2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) this % Xt2 = Xt2 elseif ( present ( res2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) allocate ( this % Xt2 ( res2 )) this % Xt2 = [( real ( i - 1 , rk ) / real ( res2 - 1 , rk ), i = 1 , res2 )] ! else ! this%Xt2 = this%Xt2 end if ! Set parameter values if ( present ( Xt3 )) then if ( allocated ( this % Xt3 )) deallocate ( this % Xt3 ) this % Xt3 = Xt3 elseif ( present ( res3 )) then if ( allocated ( this % Xt3 )) deallocate ( this % Xt3 ) allocate ( this % Xt3 ( res3 )) this % Xt3 = [( real ( i - 1 , rk ) / real ( res3 - 1 , rk ), i = 1 , res3 )] ! else ! this%Xt3 = this%Xt3 end if ! Set number of geometry points this % ng ( 1 ) = size ( this % Xt1 , 1 ) this % ng ( 2 ) = size ( this % Xt2 , 1 ) this % ng ( 3 ) = size ( this % Xt3 , 1 ) call ndgrid ( this % Xt1 , this % Xt2 , this % Xt3 , Xt ) allocate ( dTgc ( this % ng ( 1 ) * this % ng ( 2 ) * this % ng ( 3 ), this % nc ( 1 ) * this % nc ( 2 ) * this % nc ( 3 ))) if ( allocated ( this % Wc )) then ! NURBS volume do i = 1 , size ( Xt , 1 ) dTgc1 = basis_bspline_der ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) dTgc2 = basis_bspline_der ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) dTgc3 = basis_bspline_der ( Xt ( i , 3 ), this % knot3 , this % nc ( 3 ), this % degree ( 3 )) dTgci = kron ( dTgc3 , kron ( dTgc2 , dTgc1 )) dTgci = dTgci * ( this % Wc / ( dot_product ( dTgci , this % Wc ))) dTgc ( i ,:) = dTgci end do else do i = 1 , size ( Xt , 1 ) dTgc1 = basis_bspline_der ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) dTgc2 = basis_bspline_der ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) dTgc3 = basis_bspline_der ( Xt ( i , 3 ), this % knot3 , this % nc ( 3 ), this % degree ( 3 )) dTgci = kron ( dTgc3 , kron ( dTgc2 , dTgc1 )) dTgc ( i ,:) = dTgci end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine basis ( this , res1 , res2 , res3 , Xt1 , Xt2 , Xt3 , Tgc ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ), optional :: res1 , res2 , res3 real ( rk ), intent ( in ), contiguous , optional :: Xt1 (:), Xt2 (:), Xt3 (:) real ( rk ), allocatable , intent ( out ) :: Tgc (:,:) real ( rk ), allocatable :: Tgci (:) integer :: i real ( rk ), allocatable :: Tgc1 (:), Tgc2 (:), Tgc3 (:) real ( rk ), allocatable :: Xt (:,:) ! Set parameter values if ( present ( Xt1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) this % Xt1 = Xt1 elseif ( present ( res1 )) then if ( allocated ( this % Xt1 )) deallocate ( this % Xt1 ) allocate ( this % Xt1 ( res1 )) this % Xt1 = [( real ( i - 1 , rk ) / real ( res1 - 1 , rk ), i = 1 , res1 )] ! else ! this%Xt1 = this%Xt1 end if ! Set parameter values if ( present ( Xt2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) this % Xt2 = Xt2 elseif ( present ( res2 )) then if ( allocated ( this % Xt2 )) deallocate ( this % Xt2 ) allocate ( this % Xt2 ( res2 )) this % Xt2 = [( real ( i - 1 , rk ) / real ( res2 - 1 , rk ), i = 1 , res2 )] ! else ! this%Xt2 = this%Xt2 end if ! Set parameter values if ( present ( Xt3 )) then if ( allocated ( this % Xt3 )) deallocate ( this % Xt3 ) this % Xt3 = Xt3 elseif ( present ( res3 )) then if ( allocated ( this % Xt3 )) deallocate ( this % Xt3 ) allocate ( this % Xt3 ( res3 )) this % Xt3 = [( real ( i - 1 , rk ) / real ( res3 - 1 , rk ), i = 1 , res3 )] ! else ! this%Xt3 = this%Xt3 end if ! Set number of geometry points this % ng ( 1 ) = size ( this % Xt1 , 1 ) this % ng ( 2 ) = size ( this % Xt2 , 1 ) this % ng ( 3 ) = size ( this % Xt3 , 1 ) call ndgrid ( this % Xt1 , this % Xt2 , this % Xt3 , Xt ) allocate ( Tgc ( this % ng ( 1 ) * this % ng ( 2 ) * this % ng ( 3 ), this % nc ( 1 ) * this % nc ( 2 ) * this % nc ( 3 ))) if ( allocated ( this % Wc )) then ! NURBS volume do i = 1 , size ( Xt , 1 ) Tgc1 = basis_bspline ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgc3 = basis_bspline ( Xt ( i , 3 ), this % knot3 , this % nc ( 3 ), this % degree ( 3 )) Tgci = kron ( Tgc3 , kron ( Tgc2 , Tgc1 )) Tgci = Tgci * ( this % Wc / ( dot_product ( Tgci , this % Wc ))) Tgc ( i ,:) = Tgci end do else do i = 1 , size ( Xt , 1 ) Tgc1 = basis_bspline ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgc3 = basis_bspline ( Xt ( i , 3 ), this % knot3 , this % nc ( 3 ), this % degree ( 3 )) Tgci = kron ( Tgc3 , kron ( Tgc2 , Tgc1 )) Tgc ( i ,:) = Tgci end do end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine insert_knots ( this , dir , Xth , r ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ) :: dir real ( rk ), intent ( in ), contiguous :: Xth (:) integer , intent ( in ), contiguous :: r (:) integer :: k , i , s , dim , j , n_new real ( rk ), allocatable :: Xc (:,:), Xcw (:,:), Xcw_new (:,:), Xc_new (:,:), Wc_new (:), knot_new (:) real ( rk ), allocatable :: Xc4 (:,:,:,:) real ( rk ), allocatable :: knot1 (:), knot2 (:), knot3 (:) if ( dir == 1 ) then ! direction 1 if ( allocated ( this % Wc )) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 1 ) - 1 , this % degree ( 1 ), Xth ( i ), this % knot1 ) if ( this % knot1 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot1 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xcw = reshape ( Xcw ,[ this % nc ( 1 ), this % nc ( 2 ) * this % nc ( 3 ) * ( dim + 1 )]) call insert_knot_A_5_1 (& this % degree ( 1 ),& this % knot1 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xcw_new ) Xcw_new = reshape ( Xcw_new ,[( n_new + 1 ) * this % nc ( 2 ) * this % nc ( 3 ), dim + 1 ]) allocate ( Xc_new ( 1 :( n_new + 1 ) * this % nc ( 2 ) * this % nc ( 3 ), 1 : dim )) allocate ( Wc_new ( 1 :( n_new + 1 ) * this % nc ( 2 ) * this % nc ( 3 ))) do j = 1 , ( n_new + 1 ) * this % nc ( 2 ) * this % nc ( 3 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot2 = this % knot2 knot3 = this % knot3 call this % set ( knot1 = knot_new , knot2 = knot2 , knot3 = knot3 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 1 ) - 1 , this % degree ( 1 ), Xth ( i ), this % knot1 ) if ( this % knot1 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot1 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) Xc = reshape ( this % Xc ,[ this % nc ( 1 ), this % nc ( 2 ) * this % nc ( 3 ) * dim ]) call insert_knot_A_5_1 (& this % degree ( 1 ),& this % knot1 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xc_new ) Xc_new = reshape ( Xc_new ,[( n_new + 1 ) * this % nc ( 2 ) * this % nc ( 3 ), dim ]) knot2 = this % knot2 knot3 = this % knot3 call this % set ( knot1 = knot_new , knot2 = knot2 , knot3 = knot3 , Xc = Xc_new ) end do end if elseif ( dir == 2 ) then ! direction 2 if ( allocated ( this % Wc )) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 2 ) - 1 , this % degree ( 2 ), Xth ( i ), this % knot2 ) if ( this % knot2 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot2 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc4 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 2 ), this % nc ( 1 ), this % nc ( 3 ), dim + 1 ], order = [ 2 , 1 , 3 , 4 ]) Xcw = reshape ( Xc4 ,[ this % nc ( 2 ), this % nc ( 1 ) * this % nc ( 3 ) * ( dim + 1 )]) call insert_knot_A_5_1 (& this % degree ( 2 ),& this % knot2 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xcw_new ) Xc4 = reshape ( Xcw_new , [ n_new + 1 , this % nc ( 1 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), n_new + 1 , this % nc ( 3 ), dim + 1 ], order = [ 2 , 1 , 3 , 4 ]) Xcw_new = reshape ( Xc4 ,[ this % nc ( 1 ) * ( n_new + 1 ) * this % nc ( 3 ), dim + 1 ]) allocate ( Xc_new ( 1 : this % nc ( 1 ) * ( n_new + 1 ) * this % nc ( 3 ), 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 1 ) * ( n_new + 1 ) * this % nc ( 3 ))) do j = 1 , this % nc ( 1 ) * ( n_new + 1 ) * this % nc ( 3 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 knot3 = this % knot3 call this % set ( knot1 = knot1 , knot2 = knot_new , knot3 = knot3 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 2 ) - 1 , this % degree ( 2 ), Xth ( i ), this % knot2 ) if ( this % knot2 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot2 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) Xc4 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 2 ), this % nc ( 1 ), this % nc ( 3 ), dim ], order = [ 2 , 1 , 3 , 4 ]) Xc = reshape ( Xc4 ,[ this % nc ( 2 ), this % nc ( 1 ) * this % nc ( 3 ) * dim ]) call insert_knot_A_5_1 (& this % degree ( 2 ),& this % knot2 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xc_new ) Xc4 = reshape ( Xc_new , [ n_new + 1 , this % nc ( 1 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), n_new + 1 , this % nc ( 3 ), dim ], order = [ 2 , 1 , 3 , 4 ]) Xc_new = reshape ( Xc4 ,[ this % nc ( 1 ) * ( n_new + 1 ) * this % nc ( 3 ), dim ]) knot1 = this % knot1 knot3 = this % knot3 call this % set ( knot1 = knot1 , knot2 = knot_new , knot3 = knot3 , Xc = Xc_new ) end do end if elseif ( dir == 3 ) then ! direction 3 if ( allocated ( this % Wc )) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 3 ) - 1 , this % degree ( 3 ), Xth ( i ), this % knot3 ) if ( this % knot3 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot3 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc4 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 3 ), this % nc ( 2 ), this % nc ( 1 ), dim + 1 ], order = [ 3 , 2 , 1 , 4 ]) Xcw = reshape ( Xc4 ,[ this % nc ( 3 ), this % nc ( 2 ) * this % nc ( 1 ) * ( dim + 1 )]) call insert_knot_A_5_1 (& this % degree ( 3 ),& this % knot3 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xcw_new ) Xc4 = reshape ( Xcw_new , [ n_new + 1 , this % nc ( 2 ), this % nc ( 1 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), this % nc ( 2 ), n_new + 1 , dim + 1 ], order = [ 3 , 2 , 1 , 4 ]) Xcw_new = reshape ( Xc4 ,[ this % nc ( 1 ) * this % nc ( 2 ) * ( n_new + 1 ), dim + 1 ]) allocate ( Xc_new ( 1 : this % nc ( 1 ) * this % nc ( 2 ) * ( n_new + 1 ), 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 1 ) * this % nc ( 2 ) * ( n_new + 1 ))) do j = 1 , this % nc ( 1 ) * this % nc ( 2 ) * ( n_new + 1 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 knot2 = this % knot2 call this % set ( knot1 = knot1 , knot2 = knot2 , knot3 = knot_new , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 3 ) - 1 , this % degree ( 3 ), Xth ( i ), this % knot3 ) if ( this % knot3 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot3 , Xth ( i )) else s = 0 end if dim = size ( this % Xc , 2 ) Xc4 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 3 ), this % nc ( 2 ), this % nc ( 1 ), dim ], order = [ 3 , 2 , 1 , 4 ]) Xc = reshape ( Xc4 ,[ this % nc ( 3 ), this % nc ( 2 ) * this % nc ( 1 ) * dim ]) call insert_knot_A_5_1 (& this % degree ( 3 ),& this % knot3 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& n_new ,& knot_new ,& Xc_new ) Xc4 = reshape ( Xc_new , [ n_new + 1 , this % nc ( 2 ), this % nc ( 1 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), this % nc ( 2 ), n_new + 1 , dim ], order = [ 3 , 2 , 1 , 4 ]) Xc_new = reshape ( Xc4 , [ this % nc ( 1 ) * this % nc ( 2 ) * ( n_new + 1 ), dim ]) knot1 = this % knot1 knot2 = this % knot2 call this % set ( knot1 = knot1 , knot2 = knot2 , knot3 = knot_new , Xc = Xc_new ) end do end if else error stop 'Invalid direction.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine elevate_degree ( this , dir , t ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ) :: dir integer , intent ( in ) :: t real ( rk ), allocatable :: Xc (:,:), Xcw (:,:), Xcw_new (:,:), Xc_new (:,:), Wc_new (:), knot_new (:) integer :: nc_new , dim , j real ( rk ), allocatable :: Xc4 (:,:,:,:) real ( rk ), allocatable :: knot1 (:), knot2 (:), knot3 (:) if ( dir == 1 ) then ! direction 1 if ( allocated ( this % Wc )) then ! NURBS dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xcw = reshape ( Xcw ,[ this % nc ( 1 ), this % nc ( 2 ) * this % nc ( 3 ) * ( dim + 1 )], order = [ 1 , 2 ]) call elevate_degree_A_5_9 ( t , this % knot1 , this % degree ( 1 ), Xcw , nc_new , knot_new , Xcw_new ) Xcw_new = reshape ( Xcw_new ,[ nc_new * this % nc ( 2 ) * this % nc ( 3 ), dim + 1 ], order = [ 1 , 2 ]) allocate ( Xc_new ( 1 : nc_new * this % nc ( 2 ) * this % nc ( 3 ), 1 : dim )) allocate ( Wc_new ( 1 : nc_new * this % nc ( 2 ) * this % nc ( 3 ))) do j = 1 , nc_new * this % nc ( 2 ) * this % nc ( 3 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot2 = this % knot2 knot3 = this % knot3 call this % set ( knot1 = knot_new , knot2 = knot2 , knot3 = knot3 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) else ! B-Spline dim = size ( this % Xc , 2 ) Xc = reshape ( this % Xc ,[ this % nc ( 1 ), this % nc ( 2 ) * this % nc ( 3 ) * dim ], order = [ 1 , 2 ]) call elevate_degree_A_5_9 ( t , this % knot1 , this % degree ( 1 ), Xc , nc_new , knot_new , Xc_new ) Xc_new = reshape ( Xc_new ,[ nc_new * this % nc ( 2 ) * this % nc ( 3 ), dim ], order = [ 1 , 2 ]) knot2 = this % knot2 knot3 = this % knot3 call this % set ( knot1 = knot_new , knot2 = knot2 , knot3 = knot3 , Xc = Xc_new ) end if elseif ( dir == 2 ) then ! direction 2 if ( allocated ( this % Wc )) then ! NURBS dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc4 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 2 ), this % nc ( 1 ), this % nc ( 3 ), dim + 1 ], order = [ 2 , 1 , 3 , 4 ]) Xcw = reshape ( Xc4 ,[ this % nc ( 2 ), this % nc ( 1 ) * this % nc ( 3 ) * ( dim + 1 )]) call elevate_degree_A_5_9 ( t , this % knot2 , this % degree ( 2 ), Xcw , nc_new , knot_new , Xcw_new ) Xc4 = reshape ( Xcw_new , [ nc_new , this % nc ( 1 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), nc_new , this % nc ( 3 ), dim + 1 ], order = [ 2 , 1 , 3 , 4 ]) Xcw_new = reshape ( Xc4 ,[ this % nc ( 1 ) * nc_new * this % nc ( 3 ), dim + 1 ]) allocate ( Xc_new ( 1 : this % nc ( 1 ) * nc_new * this % nc ( 3 ), 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 1 ) * nc_new * this % nc ( 3 ))) do j = 1 , this % nc ( 1 ) * nc_new * this % nc ( 3 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 knot3 = this % knot3 call this % set ( knot1 = knot1 , knot2 = knot_new , knot3 = knot3 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) else ! B-Spline dim = size ( this % Xc , 2 ) Xc4 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 2 ), this % nc ( 1 ), this % nc ( 3 ), dim ], order = [ 2 , 1 , 3 , 4 ]) Xc = reshape ( Xc4 ,[ this % nc ( 2 ), this % nc ( 1 ) * this % nc ( 3 ) * dim ]) call elevate_degree_A_5_9 ( t , this % knot2 , this % degree ( 2 ), Xc , nc_new , knot_new , Xc_new ) Xc4 = reshape ( Xc_new , [ nc_new , this % nc ( 1 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), nc_new , this % nc ( 3 ), dim ], order = [ 2 , 1 , 3 , 4 ]) Xc_new = reshape ( Xc4 ,[ this % nc ( 1 ) * nc_new * this % nc ( 3 ), dim ]) knot1 = this % knot1 knot3 = this % knot3 call this % set ( knot1 = knot1 , knot2 = knot_new , knot3 = knot3 , Xc = Xc_new ) end if elseif ( dir == 3 ) then ! direction 3 if ( allocated ( this % Wc )) then ! NURBS dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc4 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 3 ), this % nc ( 2 ), this % nc ( 1 ), dim + 1 ], order = [ 3 , 2 , 1 , 4 ]) Xcw = reshape ( Xc4 ,[ this % nc ( 3 ), this % nc ( 2 ) * this % nc ( 1 ) * ( dim + 1 )]) call elevate_degree_A_5_9 ( t , this % knot3 , this % degree ( 3 ), Xcw , nc_new , knot_new , Xcw_new ) Xc4 = reshape ( Xcw_new , [ nc_new , this % nc ( 2 ), this % nc ( 1 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), this % nc ( 2 ), nc_new , dim + 1 ], order = [ 3 , 2 , 1 , 4 ]) Xcw_new = reshape ( Xc4 ,[ this % nc ( 1 ) * this % nc ( 2 ) * nc_new , dim + 1 ]) allocate ( Xc_new ( 1 : this % nc ( 1 ) * this % nc ( 2 ) * nc_new , 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 1 ) * this % nc ( 2 ) * nc_new )) do j = 1 , this % nc ( 1 ) * this % nc ( 2 ) * nc_new Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 knot2 = this % knot2 call this % set ( knot1 = knot1 , knot2 = knot2 , knot3 = knot_new , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw , Xcw_new , Xc_new , Wc_new ) else ! B-Spline dim = size ( this % Xc , 2 ) Xc4 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 3 ), this % nc ( 2 ), this % nc ( 1 ), dim ], order = [ 3 , 2 , 1 , 4 ]) Xc = reshape ( Xc4 ,[ this % nc ( 3 ), this % nc ( 2 ) * this % nc ( 1 ) * dim ]) call elevate_degree_A_5_9 ( t , this % knot3 , this % degree ( 3 ), Xc , nc_new , knot_new , Xc_new ) Xc4 = reshape ( Xc_new , [ nc_new , this % nc ( 2 ), this % nc ( 1 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), this % nc ( 2 ), nc_new , dim ], order = [ 3 , 2 , 1 , 4 ]) Xc_new = reshape ( Xc4 ,[ this % nc ( 1 ) * this % nc ( 2 ) * nc_new , dim ]) knot1 = this % knot1 knot2 = this % knot2 call this % set ( knot1 = knot1 , knot2 = knot2 , knot3 = knot_new , Xc = Xc_new ) end if else error stop 'Invalid direction.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function is_rational ( this ) result ( r ) class ( nurbs_volume ), intent ( in ) :: this logical :: r r = . false . if ( allocated ( this % Wc )) then if ( any ( this % Wc /= this % Wc ( 1 ))) then r = . true . end if end if end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem_Xc_vis ( this , elemConn ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn_Xc_vis )) deallocate ( this % elemConn_Xc_vis ) this % elemConn_Xc_vis = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem_Xg_vis ( this , elemConn ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn_Xg_vis )) deallocate ( this % elemConn_Xg_vis ) this % elemConn_Xg_vis = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_elem ( this , elemConn ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ), contiguous :: elemConn (:,:) if ( allocated ( this % elemConn )) deallocate ( this % elemConn ) this % elemConn = elemConn end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem_Xc_vis ( this ) result ( elemConn ) class ( nurbs_volume ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn_Xc_vis end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem_Xg_vis ( this ) result ( elemConn ) class ( nurbs_volume ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn_Xg_vis end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function get_elem ( this ) result ( elemConn ) class ( nurbs_volume ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) elemConn = this % elemConn end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine set_hexahedron ( this , L , nc , Wc ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: L (:) integer , intent ( in ), contiguous :: nc (:) real ( rk ), intent ( in ), contiguous , optional :: Wc (:) if ( present ( Wc )) then call this % set ( nc , hexahedron_Xc ( L , nc ), Wc ) else call this % set ( nc , hexahedron_Xc ( L , nc )) end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine put_to_nurbs ( this , X , elemConn ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ), contiguous :: X (:,:) integer , intent ( in ), contiguous :: elemConn (:,:) integer :: i , j real ( rk ), allocatable :: Tgc1 (:), Tgc2 (:), Tgc3 (:), Tgc (:) real ( rk ), allocatable :: Xt (:,:) real ( rk ) :: min_X1 , max_X1 , min_X2 , max_X2 , min_X3 , max_X3 ! Assuming knot vectors are in the range [0,1] ! Normalize the X coordinates to the range [0,1] allocate ( Xt ( size ( X , 1 ), size ( X , 2 ))) min_X1 = minval ( X (:, 1 )) max_X1 = maxval ( X (:, 1 )) min_X2 = minval ( X (:, 2 )) max_X2 = maxval ( X (:, 2 )) min_X3 = minval ( X (:, 3 )) max_X3 = maxval ( X (:, 3 )) Xt (:, 1 ) = ( X (:, 1 ) - min_X1 ) / ( max_X1 - min_X1 ) Xt (:, 2 ) = ( X (:, 2 ) - min_X2 ) / ( max_X2 - min_X2 ) Xt (:, 3 ) = ( X (:, 3 ) - min_X3 ) / ( max_X3 - min_X3 ) allocate ( this % Xg ( size ( Xt , 1 ), size ( this % Xc , 2 ))) if ( allocated ( this % Wc )) then ! NURBS volume do i = 1 , size ( Xt , 1 ) Tgc1 = basis_bspline ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgc3 = basis_bspline ( Xt ( i , 3 ), this % knot3 , this % nc ( 3 ), this % degree ( 3 )) Tgc = kron ( Tgc3 , kron ( Tgc2 , Tgc1 )) Tgc = Tgc * ( this % Wc / ( dot_product ( Tgc , this % Wc ))) do j = 1 , size ( this % Xc , 2 ) this % Xg ( i , j ) = dot_product ( Tgc , this % Xc (:, j )) end do end do else ! B-Spline volume do i = 1 , size ( Xt , 1 ) Tgc1 = basis_bspline ( Xt ( i , 1 ), this % knot1 , this % nc ( 1 ), this % degree ( 1 )) Tgc2 = basis_bspline ( Xt ( i , 2 ), this % knot2 , this % nc ( 2 ), this % degree ( 2 )) Tgc3 = basis_bspline ( Xt ( i , 3 ), this % knot3 , this % nc ( 3 ), this % degree ( 3 )) Tgc = kron ( Tgc3 , kron ( Tgc2 , Tgc1 )) do j = 1 , size ( this % Xc , 2 ) this % Xg ( i , j ) = dot_product ( Tgc , this % Xc (:, j )) end do end do end if call this % set_elem_Xg_vis ( elemConn ) end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine remove_knots ( this , dir , Xth , r ) class ( nurbs_volume ), intent ( inout ) :: this integer , intent ( in ) :: dir real ( rk ), intent ( in ), contiguous :: Xth (:) integer , intent ( in ), contiguous :: r (:) integer :: k , i , s , dim , j , nc_new , t real ( rk ), allocatable :: Xc (:,:), Xcw (:,:), Xcw_new (:,:), Xc_new (:,:), Wc_new (:), knot_new (:) real ( rk ), allocatable :: Xc4 (:,:,:,:) real ( rk ), allocatable :: knot1 (:), knot2 (:), knot3 (:) if ( dir == 1 ) then ! direction 1 if ( allocated ( this % Wc )) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 1 ) - 1 , this % degree ( 1 ), Xth ( i ), this % knot1 ) if ( this % knot1 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot1 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xcw = reshape ( Xcw ,[ this % nc ( 1 ), this % nc ( 2 ) * this % nc ( 3 ) * ( dim + 1 )], order = [ 1 , 2 ]) call remove_knots_A_5_8 (& this % degree ( 1 ),& this % knot1 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xcw_new ) if ( allocated ( Xcw )) deallocate ( Xcw ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) Xcw_new = reshape ( Xcw_new ,[( nc_new ) * this % nc ( 2 ) * this % nc ( 3 ), dim + 1 ], order = [ 1 , 2 ]) allocate ( Xc_new ( 1 :( nc_new ) * this % nc ( 2 ) * this % nc ( 3 ), 1 : dim )) allocate ( Wc_new ( 1 :( nc_new ) * this % nc ( 2 ) * this % nc ( 3 ))) do j = 1 , ( nc_new ) * this % nc ( 2 ) * this % nc ( 3 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot2 = this % knot2 knot3 = this % knot3 call this % set ( knot1 = knot_new , knot2 = knot2 , knot3 = knot3 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw_new , Xc_new , Wc_new ) end if end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 1 ) - 1 , this % degree ( 1 ), Xth ( i ), this % knot1 ) if ( this % knot1 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot1 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) Xc = reshape ( this % Xc ,[ this % nc ( 1 ), this % nc ( 2 ) * this % nc ( 3 ) * dim ]) call remove_knots_A_5_8 (& this % degree ( 1 ),& this % knot1 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xc_new ) if ( allocated ( Xc )) deallocate ( Xc ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) Xc_new = reshape ( Xc_new ,[( nc_new ) * this % nc ( 2 ) * this % nc ( 3 ), dim ]) knot2 = this % knot2 knot3 = this % knot3 call this % set ( knot1 = knot_new , knot2 = knot2 , knot3 = knot3 , Xc = Xc_new ) end if end do end if elseif ( dir == 2 ) then ! direction 2 if ( allocated ( this % Wc )) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 2 ) - 1 , this % degree ( 2 ), Xth ( i ), this % knot2 ) if ( this % knot2 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot2 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc4 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 2 ), this % nc ( 1 ), this % nc ( 3 ), dim + 1 ], order = [ 2 , 1 , 3 , 4 ]) Xcw = reshape ( Xc4 ,[ this % nc ( 2 ), this % nc ( 1 ) * this % nc ( 3 ) * ( dim + 1 )]) call remove_knots_A_5_8 (& this % degree ( 2 ),& this % knot2 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xcw_new ) if ( allocated ( Xcw )) deallocate ( Xcw ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) Xc4 = reshape ( Xcw_new , [ nc_new , this % nc ( 1 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), nc_new , this % nc ( 3 ), dim + 1 ], order = [ 2 , 1 , 3 , 4 ]) Xcw_new = reshape ( Xc4 ,[ this % nc ( 1 ) * ( nc_new ) * this % nc ( 3 ), dim + 1 ]) allocate ( Xc_new ( 1 : this % nc ( 1 ) * ( nc_new ) * this % nc ( 3 ), 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 1 ) * ( nc_new ) * this % nc ( 3 ))) do j = 1 , this % nc ( 1 ) * ( nc_new ) * this % nc ( 3 ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 knot3 = this % knot3 call this % set ( knot1 = knot1 , knot2 = knot_new , knot3 = knot3 , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw_new , Xc_new , Wc_new ) end if end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 2 ) - 1 , this % degree ( 2 ), Xth ( i ), this % knot2 ) if ( this % knot2 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot2 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) Xc4 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 2 ), this % nc ( 1 ), this % nc ( 3 ), dim ], order = [ 2 , 1 , 3 , 4 ]) Xc = reshape ( Xc4 , [ this % nc ( 2 ), this % nc ( 1 ) * this % nc ( 3 ) * dim ]) call remove_knots_A_5_8 (& this % degree ( 2 ),& this % knot2 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xc_new ) if ( allocated ( Xc )) deallocate ( Xc ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) Xc4 = reshape ( Xc_new , [ nc_new , this % nc ( 1 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), nc_new , this % nc ( 3 ), dim ], order = [ 2 , 1 , 3 , 4 ]) Xc_new = reshape ( Xc4 , [ this % nc ( 1 ) * ( nc_new ) * this % nc ( 3 ), dim ]) knot1 = this % knot1 knot3 = this % knot3 call this % set ( knot1 = knot1 , knot2 = knot_new , knot3 = knot3 , Xc = Xc_new ) end if end do end if elseif ( dir == 3 ) then ! direction 3 if ( allocated ( this % Wc )) then ! NURBS do i = 1 , size ( Xth ) k = findspan ( this % nc ( 3 ) - 1 , this % degree ( 3 ), Xth ( i ), this % knot3 ) if ( this % knot3 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot3 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) allocate ( Xcw ( size ( this % Xc , 1 ), dim + 1 )) do j = 1 , size ( this % Xc , 1 ) Xcw ( j , 1 : dim ) = this % Xc ( j , 1 : dim ) * this % Wc ( j ) end do Xcw (:, dim + 1 ) = this % Wc (:) Xc4 = reshape ( Xcw , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 3 ), this % nc ( 2 ), this % nc ( 1 ), dim + 1 ], order = [ 3 , 2 , 1 , 4 ]) Xcw = reshape ( Xc4 , [ this % nc ( 3 ), this % nc ( 2 ) * this % nc ( 1 ) * ( dim + 1 )]) call remove_knots_A_5_8 (& this % degree ( 3 ),& this % knot3 ,& Xcw ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xcw_new ) if ( allocated ( Xcw )) deallocate ( Xcw ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) Xc4 = reshape ( Xcw_new , [ nc_new , this % nc ( 2 ), this % nc ( 1 ), dim + 1 ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), this % nc ( 2 ), nc_new , dim + 1 ], order = [ 3 , 2 , 1 , 4 ]) Xcw_new = reshape ( Xc4 , [ this % nc ( 1 ) * this % nc ( 2 ) * ( nc_new ), dim + 1 ]) allocate ( Xc_new ( 1 : this % nc ( 1 ) * this % nc ( 2 ) * ( nc_new ), 1 : dim )) allocate ( Wc_new ( 1 : this % nc ( 1 ) * this % nc ( 2 ) * ( nc_new ))) do j = 1 , this % nc ( 1 ) * this % nc ( 2 ) * ( nc_new ) Xc_new ( j , 1 : dim ) = Xcw_new ( j , 1 : dim ) / Xcw_new ( j , dim + 1 ) end do Wc_new (:) = Xcw_new (:, dim + 1 ) knot1 = this % knot1 knot2 = this % knot2 call this % set ( knot1 = knot1 , knot2 = knot2 , knot3 = knot_new , Xc = Xc_new , Wc = Wc_new ) deallocate ( Xcw_new , Xc_new , Wc_new ) end if end do else ! B-Spline do i = 1 , size ( Xth ) k = findspan ( this % nc ( 3 ) - 1 , this % degree ( 3 ), Xth ( i ), this % knot3 ) if ( this % knot3 ( k + 1 ) == Xth ( i )) then s = compute_multiplicity ( this % knot3 , Xth ( i )) else s = 0 end if k = k + 1 dim = size ( this % Xc , 2 ) Xc4 = reshape ( this % Xc , [ this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 3 ), this % nc ( 2 ), this % nc ( 1 ), dim ], order = [ 3 , 2 , 1 , 4 ]) Xc = reshape ( Xc4 , [ this % nc ( 3 ), this % nc ( 2 ) * this % nc ( 1 ) * dim ]) call remove_knots_A_5_8 (& this % degree ( 3 ),& this % knot3 ,& Xc ,& Xth ( i ),& k ,& s ,& r ( i ),& t ,& knot_new ,& Xc_new ) if ( allocated ( Xc )) deallocate ( Xc ) if ( t == 0 ) then ! no change else nc_new = size ( Xcw_new , 1 ) Xc4 = reshape ( Xc_new , [ nc_new , this % nc ( 2 ), this % nc ( 1 ), dim ]) Xc4 = reshape ( Xc4 , [ this % nc ( 1 ), this % nc ( 2 ), nc_new , dim ], order = [ 3 , 2 , 1 , 4 ]) Xc_new = reshape ( Xc4 , [ this % nc ( 1 ) * this % nc ( 2 ) * ( nc_new ), dim ]) knot1 = this % knot1 knot2 = this % knot2 call this % set ( knot1 = knot1 , knot2 = knot2 , knot3 = knot_new , Xc = Xc_new ) end if end do end if else error stop 'Invalid direction.' end if end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure function cmp_elem ( this ) result ( elemConn ) class ( nurbs_volume ), intent ( in ) :: this integer , allocatable :: elemConn (:,:) call elemConn_Cn ( this % nc ( 1 ), this % nc ( 2 ), this % nc ( 3 ),& this % degree ( 1 ), this % degree ( 2 ), this % degree ( 3 ),& unique ( this % knot1 ), unique ( this % knot2 ), unique ( this % knot3 ),& this % get_multiplicity ( 1 ), this % get_multiplicity ( 2 ), this % get_multiplicity ( 3 ),& elemConn ) end function !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine rotate_Xc ( this , alpha , beta , theta ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ) :: alpha , beta , theta integer :: i do i = 1 , this % nc ( 1 ) * this % nc ( 2 ) * this % nc ( 3 ) this % Xc ( i , :) = matmul ( rotation ( alpha , beta , theta ), this % Xc ( i , :)) end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine rotate_Xg ( this , alpha , beta , theta ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ) :: alpha , beta , theta integer :: i do i = 1 , this % ng ( 1 ) * this % ng ( 2 ) * this % ng ( 3 ) this % Xg ( i , :) = matmul ( rotation ( alpha , beta , theta ), this % Xg ( i , :)) end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine translate_Xc ( this , vec ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ) :: vec (:) integer :: i do i = 1 , this % nc ( 1 ) * this % nc ( 2 ) * this % nc ( 3 ) this % Xc ( i , :) = this % Xc ( i , :) + vec end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause pure subroutine translate_Xg ( this , vec ) class ( nurbs_volume ), intent ( inout ) :: this real ( rk ), intent ( in ) :: vec (:) integer :: i do i = 1 , this % ng ( 1 ) * this % ng ( 2 ) * this % ng ( 3 ) this % Xg ( i , :) = this % Xg ( i , :) + vec end do end subroutine !=============================================================================== !=============================================================================== !> author: Seyed Ali Ghasemi !> license: BSD 3-Clause impure subroutine show ( this , vtkfile_Xc , vtkfile_Xg ) class ( nurbs_volume ), intent ( inout ) :: this character ( len =* ), intent ( in ) :: vtkfile_Xc , vtkfile_Xg character ( len = 3000 ) :: pyvista_script pyvista_script = & \"import pyvista as pv\" // achar ( 10 ) // & \"pv.global_theme.color = 'white'\" // achar ( 10 ) // & \"Xc = pv.read('\" // trim ( vtkfile_Xc ) // \"')\" // achar ( 10 ) // & \"Xg = pv.read('\" // trim ( vtkfile_Xg ) // \"')\" // achar ( 10 ) // & \"p = pv.Plotter(lighting='light kit')\" // achar ( 10 ) // & \"actor_Xcp = p.add_mesh(\" // achar ( 10 ) // & \" Xc,\" // achar ( 10 ) // & \" style='points',\" // achar ( 10 ) // & \" point_size=10,\" // achar ( 10 ) // & \" color='red',\" // achar ( 10 ) // & \" render_points_as_spheres=True,\" // achar ( 10 ) // & \" opacity=0.5,\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"actor_Xcw = p.add_mesh(\" // achar ( 10 ) // & \" Xc,\" // achar ( 10 ) // & \" show_edges=True,\" // achar ( 10 ) // & \" color='yellow',\" // achar ( 10 ) // & \" line_width=3,\" // achar ( 10 ) // & \" style='wireframe',\" // achar ( 10 ) // & \" opacity=0.2\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"actor_Xg = p.add_mesh(\" // achar ( 10 ) // & \" Xg,\" // achar ( 10 ) // & \" show_edges=False,\" // achar ( 10 ) // & \" color='cyan',\" // achar ( 10 ) // & \" line_width=7,\" // achar ( 10 ) // & \" metallic=0.6,\" // achar ( 10 ) // & \" pbr=True,\" // achar ( 10 ) // & \" split_sharp_edges=True,\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_axes(interactive=False)\" // achar ( 10 ) // & \"def point_picker_callback(point):\" // achar ( 10 ) // & \" mesh = Xc\" // achar ( 10 ) // & \" point_id = mesh.find_closest_point(point)\" // achar ( 10 ) // & \" point_coords = mesh.points[point_id]\" // achar ( 10 ) // & \" label = f'ID: {point_id + 1}\\n({point_coords[0]:.3f}, {point_coords[1]:.3f}, {point_coords[2]:.3f})'\" // achar ( 10 ) // & \" p.add_point_labels(\" // achar ( 10 ) // & \" [point_coords],\" // achar ( 10 ) // & \" [label],\" // achar ( 10 ) // & \" font_size=14,\" // achar ( 10 ) // & \" text_color='black',\" // achar ( 10 ) // & \" show_points=False,\" // achar ( 10 ) // & \" fill_shape=False,\" // achar ( 10 ) // & \" shape=None,\" // achar ( 10 ) // & \" )\" // achar ( 10 ) // & \"picker = p.enable_point_picking(callback=point_picker_callback, show_message=False)\" // achar ( 10 ) // & \"window_size = p.window_size\" // achar ( 10 ) // & \"y_pos = window_size[1]\" // achar ( 10 ) // & \"def Xcp_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xcp.SetVisibility(flag)\" // achar ( 10 ) // & \"def Xcw_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xcw.SetVisibility(flag)\" // achar ( 10 ) // & \"def Xg_toggle_vis(flag):\" // achar ( 10 ) // & \" actor_Xg.SetVisibility(flag)\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xcp_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='red',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 1 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xcw_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='yellow',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 2 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_checkbox_button_widget(\" // achar ( 10 ) // & \" Xg_toggle_vis,\" // achar ( 10 ) // & \" value=True,\" // achar ( 10 ) // & \" color_on='cyan',\" // achar ( 10 ) // & \" size=25,\" // achar ( 10 ) // & \" position=(0, y_pos - 3 * 25),\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xc (Points)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 1 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xc (Control geometry)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 2 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'Xg (Geometry)',\" // achar ( 10 ) // & \" position=(25 + 3, y_pos - 3 * 25),\" // achar ( 10 ) // & \" font_size=8,\" // achar ( 10 ) // & \" color='black',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.add_text('ForCAD', position=(0.0, 10.0), font_size=14, color='black', font='times')\" // achar ( 10 ) // & \"p.add_text(\" // achar ( 10 ) // & \" 'https://github.com/gha3mi/forcad',\" // achar ( 10 ) // & \" position=(0.0, 0.0),\" // achar ( 10 ) // & \" font_size=7,\" // achar ( 10 ) // & \" color='blue',\" // achar ( 10 ) // & \" font='times',\" // achar ( 10 ) // & \")\" // achar ( 10 ) // & \"p.show(title='ForCAD', interactive=True)\" call execute_command_line ( 'python -c \"' // trim ( adjustl ( pyvista_script )) // '\"' ) end subroutine !=============================================================================== end module forcad_nurbs_volume","tags":"","loc":"sourcefile/forcad_nurbs_volume.f90.html"},{"title":"put_to_nurbs.f90 – ForCAD","text":"This file depends on sourcefile~~put_to_nurbs.f90~~EfferentGraph sourcefile~put_to_nurbs.f90 put_to_nurbs.f90 sourcefile~forcad.f90 forcad.f90 sourcefile~put_to_nurbs.f90->sourcefile~forcad.f90 sourcefile~forcad_utils.f90 forcad_utils.f90 sourcefile~put_to_nurbs.f90->sourcefile~forcad_utils.f90 sourcefile~forcad.f90->sourcefile~forcad_utils.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_nurbs_curve.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_surface.f90->sourcefile~forcad_utils.f90 sourcefile~forcad_nurbs_volume.f90->sourcefile~forcad_utils.f90 Help Graph Key Nodes of different colours represent the following: Graph Key Source File Source File This Page's Entity This Page's Entity Solid arrows point from a file to a file which it depends on. A file\nis dependent upon another if the latter must be compiled before the former\ncan be. Where possible, edges connecting nodes are\ngiven different colours to make them easier to distinguish in\nlarge graphs. Source Code program example_morph use forcad use forcad_utils , only : hexahedron_Xc implicit none type ( nurbs_volume ) :: control_shape real ( rk ), allocatable :: X (:,:) integer , allocatable :: elem (:,:) integer :: i , nunit !> You can create your shape or use a predefined one !> Read coordinates from file allocate ( X ( 23200 , 3 )) open ( newunit = nunit , file = 'example/put_to_nurbs_X.txt' ) do i = 1 , 23200 read ( nunit , * ) X ( i , 1 ), X ( i , 2 ), X ( i , 3 ) end do close ( nunit ) !> Read element connectivities from file allocate ( elem ( 20577 , 8 )) open ( newunit = nunit , file = 'example/put_to_nurbs_elem.txt' ) do i = 1 , 20577 read ( nunit , * ) elem ( i , 1 ), elem ( i , 2 ), elem ( i , 4 ), elem ( i , 3 ), elem ( i , 5 ), elem ( i , 6 ), elem ( i , 8 ), elem ( i , 7 ) end do close ( nunit ) !> Set a control shape that will be used to put the shape into !> The contol shape is a hexahedron with 100x40x10 with 10x5x3 number of control points !> By modifying the control shape you can modify the shape call control_shape % set ( nc = [ 10 , 5 , 3 ], Xc = hexahedron_Xc ( L = [ 10 0.0_rk , 4 0.0_rk , 1 0.0_rk ], nc = [ 10 , 5 , 3 ])) !> Map the shape into the shape call control_shape % put_to_nurbs ( X , elem ) !> Export the shape and the control shape to vtk files call control_shape % export_Xc ( 'vtk/control_shape.vtk' ) call control_shape % export_Xg ( 'vtk/shape.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 control_shape % show ( 'vtk/control_shape.vtk' , 'vtk/shape.vtk' ) end program","tags":"","loc":"sourcefile/put_to_nurbs.f90.html"}]} \ No newline at end of file diff --git a/type/nurbs_curve.html b/type/nurbs_curve.html index 284b7b1bb..9c3b16074 100644 --- a/type/nurbs_curve.html +++ b/type/nurbs_curve.html @@ -78,7 +78,7 @@

    nurbs_curve
  • 57 statements + title="

    31.6% of total for derived types.

    Including implementation: 735 statements, 23.1% of total for derived types.">65 statements
  • @@ -118,17 +118,17 @@

    Variables

    @@ -155,49 +155,57 @@

    Type-Bound Procedures

    @@ -230,7 +238,7 @@

    Components

  • - + real(kind=rk), private,
    - + real(kind=rk), private,
    - + real(kind=rk), private,
    - + integer, private
    - + integer, private,
    - + integer, private,
    - + integer, private,
    - + real(kind=rk), private,
    - + integer, private
    - + integer, private this +
    + + integer, + intent(in) + + ::n +
    this +
    + + integer, + intent(in) + + ::n +
    this +
    + + integer, + intent(in) + + ::n + +
    + + integer, + intent(in) + + ::dir +
    this +
    + + integer, + intent(in) + + ::n +
    this +
    + + integer, + intent(in) + + ::n + +
    + + integer, + intent(in) + + ::dir +
    this -
    - - integer, - intent(in) - - ::i -
    intent(inout)intent(in)
    - real(kind=rk), + integer, intent(in),intent(in) - contiguous + ::Xth(:)i
    + +

    + Return Value + real(kind=rk) +

    + + + +
  • +

    + private pure function get_knot_all(this) result(knot) +

    +
    +
    Author
    Seyed Ali Ghasemi
    +
    License
    BSD 3-Clause
    +
    + + + + +

    Arguments

    + + + + + + + + + + - + - + @@ -2323,6 +2370,11 @@

    Arguments

    TypeIntentOptional AttributesName
    - integer, + class(nurbs_curve), intent(in),intent(in) - contiguous + ::r(:)this
    +

    + Return Value + real(kind=rk), allocatable, (:) +

    +
  • @@ -2332,23 +2384,23 @@

    Arguments

    - +

    procedure, public :: - is_rational + get_multiplicity

    -

    Check if the NURBS curve is rational

    +

    Get multiplicity of the knot vector

    • - private pure function is_rational(this) result(r) + private pure function get_multiplicity(this) result(m)

      Author
      Seyed Ali Ghasemi
      @@ -2389,7 +2441,7 @@

      Arguments

      Return Value - logical + integer, allocatable, (:)

      @@ -2401,23 +2453,23 @@

      - +

      procedure, public :: - modify_Wc + get_nc

      -

      Modify weights

      +

      Get number of required control points

      • - private pure subroutine modify_Wc(this, W, num) + private pure function get_nc(this) result(nc)

        Author
        Seyed Ali Ghasemi
        @@ -2443,42 +2495,12 @@

        Arguments

        class(nurbs_curve),

    intent(inout) - - ::this - -
    - - real(kind=rk), - intent(in) - - ::W - -
    - - integer, - intent(in) ::numthis
    +

    + Return Value + integer +

    + @@ -2495,23 +2522,23 @@

    Arguments

    - +

    procedure, public :: - modify_Xc + get_ng

    -

    Modify control points

    +

    Get number of geometry points

    • - private pure subroutine modify_Xc(this, X, num, dir) + private pure function get_ng(this) result(ng)

      Author
      Seyed Ali Ghasemi
      @@ -2537,57 +2564,12 @@

      Arguments

      class(nurbs_curve),

    intent(inout) - - ::this - -
    - - real(kind=rk), - intent(in) - - ::X - -
    - - integer, - intent(in) - - ::num - -
    - - integer, - intent(in) ::dirthis
    +

    + Return Value + integer +

    + @@ -2604,23 +2591,23 @@

    Arguments

    - +

    procedure, public :: - remove_knots + insert_knots

    -

    Remove knots from the knot vector

    +

    Insert knots into the knot vector

    • - private pure subroutine remove_knots(this, Xth, r) + private pure subroutine insert_knots(this, Xth, r)

      Author
      Seyed Ali Ghasemi
      @@ -2698,23 +2685,23 @@

      Arguments

      - +

      procedure, public :: - rotate_Xc + is_rational

      -

      Rotate control points

      +

      Check if the NURBS curve is rational

      • - private pure subroutine rotate_Xc(this, alpha, beta, theta) + private pure function is_rational(this) result(r)

        Author
        Seyed Ali Ghasemi
        @@ -2740,7 +2727,7 @@

        Arguments

        class(nurbs_curve),

    intent(inout)intent(in)
    - - real(kind=rk), - intent(in) - - ::alpha - -
    - - real(kind=rk), - intent(in) - - ::beta - -
    - - real(kind=rk), - intent(in) - - ::theta - -
    +

    +

    + Return Value + logical +

    + @@ -2807,23 +2754,23 @@

    Arguments

    - +

    procedure, public :: - rotate_Xg + modify_Wc

    -

    Rotate geometry points

    +

    Modify weights

    • - private pure subroutine rotate_Xg(this, alpha, beta, theta) + private pure subroutine modify_Wc(this, W, num)

      Author
      Seyed Ali Ghasemi
      @@ -2869,22 +2816,7 @@

      Arguments

    ::alpha - -
    - - real(kind=rk), - intent(in) - - ::betaW
    - real(kind=rk), + integer, intent(in) ::thetanum
    @@ -2973,12 +2905,12 @@

    Arguments

    real(kind=rk), - + - + @@ -2986,14 +2918,14 @@

    Arguments

    - + - + @@ -3001,14 +2933,14 @@

    Arguments

    - - + - + @@ -3018,9 +2950,30 @@

    Arguments

    + + + + +
    +
    +
    + +

    + procedure, public :: + remove_knots + +

    +
    +
    + +
    +

    Remove knots from the knot vector

    +
    +
    +
    • - private pure subroutine set2(this, Xth_dir, degree, continuity, Xc, Wc) + private pure subroutine remove_knots(this, Xth, r)

      Author
      Seyed Ali Ghasemi
      @@ -3028,7 +2981,7 @@

      -

      Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights.

      +

      Arguments

    intent(in),intent(in) - contiguous + ::knot(:)X
    - real(kind=rk), + integer, intent(in),intent(in) - contiguous + ::Xc(:,:)num
    - real(kind=rk), + integer, intent(in),optional, - contiguous +intent(in) + ::Wc(:)dir
    @@ -3066,22 +3019,7 @@

    Arguments

    contiguous - - - - - - - - - + @@ -3096,37 +3034,7 @@

    Arguments

    contiguous - - - - - - - - - - - - - - - - - + @@ -3136,9 +3044,30 @@

    Arguments

    + + + + +
    +
    +
    + +

    + procedure, public :: + rotate_Xc + +

    +
    +
    + +
    +

    Rotate control points

    +
    +
    +
    • - private pure subroutine set3(this, Xc, Wc) + private pure subroutine rotate_Xc(this, alpha, beta, theta)

      Author
      Seyed Ali Ghasemi
      @@ -3146,7 +3075,7 @@

      -

      Set Bezier or Rational Bezier curve using control points and weights.

      +

      Arguments

    ::Xth_dir(:) - -
    - - integer, - intent(in) - - ::degreeXth(:) ::continuity(:) - -
    - - real(kind=rk), - intent(in), - contiguous - ::Xc(:,:) - -
    - - real(kind=rk), - intent(in),optional, - contiguous - ::Wc(:)r(:)
    @@ -3179,12 +3108,12 @@

    Arguments

    real(kind=rk), - + - + @@ -3194,12 +3123,27 @@

    Arguments

    real(kind=rk), - - + - + + + + + + + + + @@ -3216,23 +3160,23 @@

    Arguments

    - +

    procedure, public :: - set1 + rotate_Xg

    -

    Set knot vector, control points and weights for the NURBS curve object

    +

    Rotate geometry points

    • - private pure subroutine set1(this, knot, Xc, Wc) + private pure subroutine rotate_Xg(this, alpha, beta, theta)

      Author
      Seyed Ali Ghasemi
      @@ -3240,7 +3184,7 @@

      -

      Set knot vector, control points and weights for the NURBS curve object.

      +

      Arguments

    intent(in),intent(in) - contiguous + ::Xc(:,:)alpha intent(in),optional, - contiguous +intent(in) + ::Wc(:)beta + +
    + + real(kind=rk), + intent(in) + + ::theta
    @@ -3273,12 +3217,12 @@

    Arguments

    real(kind=rk), - + - + @@ -3288,12 +3232,12 @@

    Arguments

    real(kind=rk), - + - + @@ -3303,12 +3247,12 @@

    Arguments

    real(kind=rk), - - + - + @@ -3325,23 +3269,23 @@

    Arguments

    - +

    - procedure, public :: - set2 + generic, public :: + set => set1, set2, set3

    -

    Set NURBS curve using nodes of parameter space, degree, continuity, control points and weights

    +

    Set NURBS curve

    • - private pure subroutine set2(this, Xth_dir, degree, continuity, Xc, Wc) + private pure subroutine set1(this, knot, Xc, Wc)

      Author
      Seyed Ali Ghasemi
      @@ -3349,7 +3293,7 @@

      -

      Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights.

      +

      Set knot vector, control points and weights for the NURBS curve object.

      Arguments

    intent(in),intent(in) - contiguous + ::knot(:)alpha intent(in),intent(in) - contiguous + ::Xc(:,:)beta intent(in),optional, - contiguous +intent(in) + ::Wc(:)theta
    @@ -3387,22 +3331,7 @@

    Arguments

    contiguous - - - - - - - - - + @@ -3410,14 +3339,14 @@

    Arguments

    - + @@ -3428,16 +3357,192 @@

    Arguments

    real(kind=rk), - - + - + +
    ::Xth_dir(:) - -
    - - integer, - intent(in) - - ::degreeknot(:)
    - integer, + real(kind=rk), intent(in), contiguous ::continuity(:)Xc(:,:) intent(in), + optional, contiguous ::Xc(:,:)Wc(:)
    + + + +
  • +

    + private pure subroutine set2(this, Xth_dir, degree, continuity, Xc, Wc) +

    +
    +
    Author
    Seyed Ali Ghasemi
    +
    License
    BSD 3-Clause
    +
    + + +

    Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights.

    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_curve), + intent(inout) + + ::this + +
    + + real(kind=rk), + intent(in), + contiguous + ::Xth_dir(:) + +
    + + integer, + intent(in) + + ::degree + +
    + + integer, + intent(in), + contiguous + ::continuity(:) + +
    + + real(kind=rk), + intent(in), + contiguous + ::Xc(:,:) + +
    + + real(kind=rk), + intent(in),optional, + contiguous + ::Wc(:) + +
    + + +
  • +
  • +

    + private pure subroutine set3(this, Xc, Wc) +

    +
    +
    Author
    Seyed Ali Ghasemi
    +
    License
    BSD 3-Clause
    +
    + + +

    Set Bezier or Rational Bezier curve using control points and weights.

    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + +
    TypeIntentOptional AttributesName
    + + class(nurbs_curve), + intent(inout) + + ::this + +
    + + real(kind=rk), + intent(in), + contiguous + ::Xc(:,:) + +
    real(kind=rk), @@ -3447,7 +3552,853 @@

    Arguments

    contiguous
    ::Wc(:)Wc(:) + +
    + + +
  • + +
    + + +
    +
    +
    + +

    + procedure, public :: + set1 + +

    +
    +
    + +
    +

    Set knot vector, control points and weights for the NURBS curve object

    +
    +
    +
      +
    • +

      + private pure subroutine set1(this, knot, Xc, Wc) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + +

      Set knot vector, control points and weights for the NURBS curve object.

      + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_curve), + intent(inout) + + ::this + +
      + + real(kind=rk), + intent(in), + contiguous + ::knot(:) + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xc(:,:) + +
      + + real(kind=rk), + intent(in),optional, + contiguous + ::Wc(:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set2 + +

    +
    +
    + +
    +

    Set NURBS curve using nodes of parameter space, degree, continuity, control points and weights

    +
    +
    +
      +
    • +

      + private pure subroutine set2(this, Xth_dir, degree, continuity, Xc, Wc) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + +

      Set NURBS curve using nodes of parameter space (Xth), degree, continuity, control points and weights.

      + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_curve), + intent(inout) + + ::this + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xth_dir(:) + +
      + + integer, + intent(in) + + ::degree + +
      + + integer, + intent(in), + contiguous + ::continuity(:) + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xc(:,:) + +
      + + real(kind=rk), + intent(in),optional, + contiguous + ::Wc(:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set3 + +

    +
    +
    + +
    +

    Set Bezier or Rational Bezier curve using control points and weights

    +
    +
    +
      +
    • +

      + private pure subroutine set3(this, Xc, Wc) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + +

      Set Bezier or Rational Bezier curve using control points and weights.

      + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_curve), + intent(inout) + + ::this + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xc(:,:) + +
      + + real(kind=rk), + intent(in),optional, + contiguous + ::Wc(:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set_circle + +

    +
    +
    + +
    +

    Set a circle

    +
    +
    +
      +
    • +

      + private pure subroutine set_circle(this, center, radius) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_curve), + intent(inout) + + ::this + +
      + + real(kind=rk), + intent(in), + contiguous + ::center(:) + +
      + + real(kind=rk), + intent(in) + + ::radius + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set_elem + +

    +
    +
    + +
    +

    Set IGA element connectivity

    +
    +
    +
      +
    • +

      + private pure subroutine set_elem(this, elemConn) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_curve), + intent(inout) + + ::this + +
      + + integer, + intent(in), + contiguous + ::elemConn(:,:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set_elem_Xc_vis + +

    +
    +
    + +
    +

    Set connectivity for control points

    +
    +
    +
      +
    • +

      + private pure subroutine set_elem_Xc_vis(this, elemConn) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_curve), + intent(inout) + + ::this + +
      + + integer, + intent(in), + contiguous + ::elemConn(:,:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set_elem_Xg_vis + +

    +
    +
    + +
    +

    Set connectivity for geometry points

    +
    +
    +
      +
    • +

      + private pure subroutine set_elem_Xg_vis(this, elemConn) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_curve), + intent(inout) + + ::this + +
      + + integer, + intent(in), + contiguous + ::elemConn(:,:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + show + +

    +
    +
    + +
    +

    Show the NURBS object using PyVista

    +
    +
    +
      +
    • +

      + private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_curve), + intent(inout) + + ::this + +
      + + character(len=*), + intent(in) + + ::vtkfile_Xc + +
      + + character(len=*), + intent(in) + + ::vtkfile_Xg + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + translate_Xc + +

    +
    +
    + +
    +

    Translate control points

    +
    +
    +
      +
    • +

      + private pure subroutine translate_Xc(this, vec) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + @@ -3464,23 +4415,23 @@

      Arguments

      - +

      procedure, public :: - set3 + translate_Xg

      -

      Set Bezier or Rational Bezier curve using control points and weights

      +

      Translate geometry points

      • - private pure subroutine set3(this, Xc, Wc) + private pure subroutine translate_Xg(this, vec)

        Author
        Seyed Ali Ghasemi
        @@ -3488,7 +4439,7 @@

        -

        Set Bezier or Rational Bezier curve using control points and weights.

        +

        Arguments

      TypeIntentOptional AttributesName
      + + class(nurbs_curve), + intent(inout) + + ::this + +
      + + real(kind=rk), + intent(in) + + ::vec(:)
      @@ -3521,27 +4472,12 @@

      Arguments

      real(kind=rk), - + - - - - - - - - - + @@ -3558,23 +4494,23 @@

      Arguments

      - +

      - procedure, public :: - set_circle + procedure, private :: + get_Wc_all

      -

      Set a circle

      +

      Get all weights

      • - private pure subroutine set_circle(this, center, radius) + private pure function get_Wc_all(this) result(Wc)

        Author
        Seyed Ali Ghasemi
        @@ -3600,42 +4536,12 @@

        Arguments

        class(nurbs_curve), -
      - - - - - - - - - - - - - - - - + @@ -3643,6 +4549,11 @@

      Arguments

      intent(in),intent(in) - contiguous - ::Xc(:,:) - -
      - - real(kind=rk), - intent(in),optional, - contiguous + ::Wc(:)vec(:) intent(inout) - - ::this - -
      - - real(kind=rk), - intent(in), - contiguous - ::center(:) - -
      - - real(kind=rk), - intent(in) ::radiusthis
      +

      + Return Value + real(kind=rk), allocatable, (:) +

      +
    @@ -3652,23 +4563,23 @@

    Arguments

    - +

    - procedure, public :: - set_elem + procedure, private :: + get_Wci

    -

    Set IGA element connectivity

    +

    Get i-th weight

    • - private pure subroutine set_elem(this, elemConn) + private pure function get_Wci(this, n) result(Wc)

      Author
      Seyed Ali Ghasemi
      @@ -3694,7 +4605,7 @@

      Arguments

      class(nurbs_curve),

    intent(inout)intent(in) intent(in),intent(in) - contiguous + ::elemConn(:,:)n
    +

    + Return Value + real(kind=rk) +

    + @@ -3731,23 +4647,23 @@

    Arguments

    - +

    - procedure, public :: - set_elem_Xc_vis + procedure, private :: + get_Xc_all

    -

    Set connectivity for control points

    +

    Get all control points

    • - private pure subroutine set_elem_Xc_vis(this, elemConn) + private pure function get_Xc_all(this) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -3773,7 +4689,7 @@

      Arguments

      class(nurbs_curve),

    intent(inout)intent(in) this -
    - - integer, - intent(in), - contiguous - ::elemConn(:,:) -
    +

    + Return Value + real(kind=rk), allocatable, (:,:) +

    + @@ -3810,23 +4716,23 @@

    Arguments

    - +

    - procedure, public :: - set_elem_Xg_vis + procedure, private :: + get_Xci

    -

    Set connectivity for geometry points

    +

    Get i-th control point

    • - private pure subroutine set_elem_Xg_vis(this, elemConn) + private pure function get_Xci(this, n) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -3852,7 +4758,7 @@

      Arguments

      class(nurbs_curve),

    intent(inout)intent(in) intent(in),intent(in) - contiguous + ::elemConn(:,:)n
    +

    + Return Value + real(kind=rk), allocatable, (:) +

    + @@ -3889,23 +4800,23 @@

    Arguments

    - +

    - procedure, public :: - show + procedure, private :: + get_Xcid

    -

    Show the NURBS object using PyVista

    +

    Get i-th control point in a specific direction

    • - private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) + private pure function get_Xcid(this, n, dir) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -3931,7 +4842,7 @@

      Arguments

      class(nurbs_curve),

    intent(inout)intent(in)
    - character(len=*), + integer, intent(in) ::vtkfile_Xcn
    - character(len=*), + integer, intent(in) ::vtkfile_Xgdir
    +

    + Return Value + real(kind=rk) +

    + @@ -3983,23 +4899,23 @@

    Arguments

    - +

    - procedure, public :: - translate_Xc + procedure, private :: + get_Xg_all

    -

    Translate control points

    +

    Get all geometry points

    • - private pure subroutine translate_Xc(this, vec) + private pure function get_Xg_all(this) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -4025,7 +4941,76 @@

      Arguments

      class(nurbs_curve),

    intent(inout)intent(in) + + ::this + +
    + +

    + Return Value + real(kind=rk), allocatable, (:,:) +

    + + + + +
    + + +
    +
    +
    + +

    + procedure, private :: + get_Xgi + +

    +
    +
    + +
    +

    Get i-th geometry point

    +
    +
    +
      +
    • +

      + private pure function get_Xgi(this, n) result(Xg) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + @@ -4038,14 +5023,14 @@

      Arguments

      - + @@ -4053,6 +5038,11 @@

      Arguments

      TypeIntentOptional AttributesName
      + + class(nurbs_curve), + intent(in)
      - real(kind=rk), + integer, intent(in) ::vec(:)n
      +

      + Return Value + real(kind=rk), allocatable, (:) +

      +
    @@ -4062,23 +5052,23 @@

    Arguments

    - +

    - procedure, public :: - translate_Xg + procedure, private :: + get_Xgid

    -

    Translate geometry points

    +

    Get i-th geometry point in a specific direction

    • - private pure subroutine translate_Xg(this, vec) + private pure function get_Xgid(this, n, dir) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -4104,7 +5094,7 @@

      Arguments

      class(nurbs_curve),

    intent(inout)intent(in)
    - real(kind=rk), + integer, intent(in) ::vec(:)n + +
    + + integer, + intent(in) + + ::dir
    +

    + Return Value + real(kind=rk) +

    + @@ -4141,7 +5151,7 @@

    Arguments

    - +

    procedure, private :: get_knot_all @@ -4157,7 +5167,7 @@

    @@ -234,7 +242,7 @@

    Components

    - + real(kind=rk), private,
    - + real(kind=rk), private,
    - + real(kind=rk), private,
    - + real(kind=rk), private,
    - + real(kind=rk), private,
    - + integer, private
    - + integer, private,
    - + integer, private,
    - + integer, private,
    - + real(kind=rk), private,
    - + real(kind=rk), private,
    - + integer, private
    - + integer, private this +
    + + integer, + intent(in) + + ::n +
    ::dirn intent(in) + ::n + +
    + + integer, + intent(in) + :: dir ::dirn this +
    + + integer, + intent(in) + + ::n + +
    + + integer, + intent(in) + + ::dir +
    this +
    + + integer, + intent(in) + + ::dir +
    this +
    + + integer, + intent(in) + + ::dir +
    this -
    - - integer, - intent(in) - - ::dir - -
    - - integer, - intent(in) - - ::i -
    this -
    - - integer, - intent(in) - - ::dir -
    this -
    - - integer, - intent(in) - - ::dir -
    intent(inout)intent(in)
    - - real(kind=rk), - intent(in), - contiguous - ::Xth(:) - -
    integer, intent(in),intent(in) - contiguous + ::r(:)i
    +

    + Return Value + real(kind=rk) +

    + - -
    - - -
    -
    -
    - -

    - procedure, public :: - is_rational - -

    -
    -
    - -
    -

    Check if the NURBS surface is rational

    -
    -
    -
    • - private pure function is_rational(this) result(r) + private pure function get_knot_all(this, dir) result(knot)

      Author
      Seyed Ali Ghasemi
      @@ -2708,6 +2631,21 @@

      Arguments

    this +
    + + integer, + intent(in) + + ::dir +
    intent(inout) - - ::this - -
    - - real(kind=rk), - intent(in) ::Wthis ::numdir
    +

    + Return Value + integer, allocatable, (:) +

    + @@ -2821,23 +2749,23 @@

    Arguments

    - +

    procedure, public :: - modify_Xc + get_nc

    -

    Modify control points

    +

    Get number of required control points

    • - private pure subroutine modify_Xc(this, X, num, dir) + private pure function get_nc(this, dir) result(nc)

      Author
      Seyed Ali Ghasemi
      @@ -2863,42 +2791,12 @@

      Arguments

      class(nurbs_surface),

    intent(inout) - - ::this - -
    - - real(kind=rk), - intent(in) - - ::X - -
    - - integer, - intent(in) ::numthis
    +

    + Return Value + integer +

    + @@ -2930,23 +2833,23 @@

    Arguments

    - +

    procedure, public :: - remove_knots + get_ng

    -

    Remove knots from the knot vector

    +

    Get number of geometry points

    • - private pure subroutine remove_knots(this, dir, Xth, r) + private pure function get_ng(this) result(ng)

      Author
      Seyed Ali Ghasemi
      @@ -2972,57 +2875,12 @@

      Arguments

      class(nurbs_surface),

    intent(inout) - - ::this - -
    - - integer, - intent(in) ::dir - -
    - - real(kind=rk), - intent(in), - contiguous - ::Xth(:) - -
    - - integer, - intent(in), - contiguous - ::r(:)this
    +

    + Return Value + integer, (2) +

    + @@ -3039,23 +2902,23 @@

    Arguments

    - +

    procedure, public :: - rotate_Xc + insert_knots

    -

    Rotate control points

    +

    Insert knots into the knot vector

    • - private pure subroutine rotate_Xc(this, alpha, beta, theta) + private pure subroutine insert_knots(this, dir, Xth, r)

      Author
      Seyed Ali Ghasemi
      @@ -3094,14 +2957,14 @@

      Arguments

    - real(kind=rk), + integer, intent(in) ::alphadir intent(in)intent(in), - + contiguous ::betaXth(:)
    - real(kind=rk), + integer, intent(in)intent(in), - + contiguous ::thetar(:) intent(inout)intent(in) this -
    - - real(kind=rk), - intent(in) - - ::alpha - -
    - - real(kind=rk), - intent(in) - - ::beta - -
    - - real(kind=rk), - intent(in) - - ::theta -
    +

    + Return Value + logical +

    + @@ -3257,23 +3080,23 @@

    Arguments

    - +

    - generic, public :: - set => set1, set2, set3 + procedure, public :: + modify_Wc

    -

    Set NURBS surface

    +

    Modify weights

    • - private pure subroutine set1(this, knot1, knot2, Xc, Wc) + private pure subroutine modify_Wc(this, W, num)

      Author
      Seyed Ali Ghasemi
      @@ -3281,7 +3104,7 @@

      -

      Set knot vectors, control points and weights for the NURBS surface object.

      +

      Arguments

      @@ -3314,27 +3137,12 @@

      Arguments

      real(kind=rk), - - - - - - - - - + - + @@ -3342,29 +3150,14 @@

      Arguments

      - + - - - - - - - - - + @@ -3374,9 +3167,30 @@

      Arguments

      + + + + +
      +
      +
      + +

      + procedure, public :: + modify_Xc + +

      +
      +
      + +
      +

      Modify control points

      +
      +
      +
      • - private pure subroutine set2(this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc) + private pure subroutine modify_Xc(this, X, num, dir)

        Author
        Seyed Ali Ghasemi
        @@ -3384,7 +3198,7 @@

        -

        Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights

        +

        Arguments

      intent(in), - contiguous - ::knot1(:) - -
      - - real(kind=rk), - intent(in),intent(in) - contiguous + ::knot2(:)W
      - real(kind=rk), + integer, intent(in),intent(in) - contiguous - ::Xc(:,:) - -
      - - real(kind=rk), - intent(in),optional, - contiguous + ::Wc(:)num
      @@ -3417,12 +3231,12 @@

      Arguments

      real(kind=rk), - + - + @@ -3430,14 +3244,14 @@

      Arguments

      - + - + @@ -3447,27 +3261,76 @@

      Arguments

      integer, - + - + + +
      intent(in),intent(in) - contiguous + ::Xth_dir1(:)X
      - real(kind=rk), + integer, intent(in),intent(in) - contiguous + ::Xth_dir2(:)num intent(in),intent(in) - contiguous + ::degree(:)dir
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + remove_knots + +

    +
    +
    + +
    +

    Remove knots from the knot vector

    +
    +
    +
      +
    • +

      + private pure subroutine remove_knots(this, dir, Xth, r) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + - + - + @@ -3477,12 +3340,12 @@

      Arguments

      integer, - + - + @@ -3497,7 +3360,7 @@

      Arguments

      contiguous - + @@ -3505,14 +3368,14 @@

      Arguments

      - - + @@ -3522,9 +3385,30 @@

      Arguments

      + + + + +
      +
      +
      + +

      + procedure, public :: + rotate_Xc + +

      +
      +
      + +
      +

      Rotate control points

      +
      +
      +
      • - private pure subroutine set3(this, nc, Xc, Wc) + private pure subroutine rotate_Xc(this, alpha, beta, theta)

        Author
        Seyed Ali Ghasemi
        @@ -3532,7 +3416,7 @@

        -

        Set Bezier or Rational Bezier surface using control points and weights.

        +

        Arguments

      TypeIntentOptional AttributesName
      - integer, + class(nurbs_surface), intent(in),intent(inout) - contiguous + ::continuity1(:)this intent(in),intent(in) - contiguous + ::continuity2(:)dir ::Xc(:,:)Xth(:)
      - real(kind=rk), + integer, intent(in),optional, + contiguous ::Wc(:)r(:)
      @@ -3563,14 +3447,14 @@

      Arguments

      - + - + @@ -3580,12 +3464,12 @@

      Arguments

      real(kind=rk), - + - + @@ -3595,12 +3479,12 @@

      Arguments

      real(kind=rk), - - + - + @@ -3617,23 +3501,23 @@

      Arguments

      - +

      procedure, public :: - set1 + rotate_Xg

      -

      Set knot vectors, control points and weights for the NURBS surface object

      +

      Rotate geometry points

      • - private pure subroutine set1(this, knot1, knot2, Xc, Wc) + private pure subroutine rotate_Xg(this, alpha, beta, theta)

        Author
        Seyed Ali Ghasemi
        @@ -3641,7 +3525,7 @@

        -

        Set knot vectors, control points and weights for the NURBS surface object.

        +

        Arguments

      - integer, + real(kind=rk), intent(in),intent(in) - contiguous + ::nc(:)alpha intent(in),intent(in) - contiguous + ::Xc(:,:)beta intent(in),optional, - contiguous +intent(in) + ::Wc(:)theta
      @@ -3674,7 +3558,116 @@

      Arguments

      real(kind=rk), - + + + + + + + + + + + + + + + + + + + + + + + +
      intent(in),intent(in) + + ::alpha + +
      + + real(kind=rk), + intent(in) + + ::beta + +
      + + real(kind=rk), + intent(in) + + ::theta + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + generic, public :: + set => set1, set2, set3 + +

    +
    +
    + +
    +

    Set NURBS surface

    +
    +
    +
      +
    • +

      + private pure subroutine set1(this, knot1, knot2, Xc, Wc) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + +

      Set knot vectors, control points and weights for the NURBS surface object.

      + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + @@ -3734,30 +3727,9 @@

      Arguments

      - - - - -
      -
      -
      - -

      - procedure, public :: - set2 - -

      -
      -
      - -
      -

      Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights

      -
      -
      -
      • - private pure subroutine set2(this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc) + private pure subroutine set2(this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc)

        Author
        Seyed Ali Ghasemi
        @@ -3871,14 +3843,1102 @@

        Arguments

      + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_surface), + intent(inout) + + ::this + +
      + + real(kind=rk), + intent(in), contiguous
      - real(kind=rk), + real(kind=rk), + intent(in), + contiguous + ::Xc(:,:) + +
      + + real(kind=rk), + intent(in),optional, + contiguous + ::Wc(:) + +
      + + +
    • +
    • +

      + private pure subroutine set3(this, nc, Xc, Wc) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + +

      Set Bezier or Rational Bezier surface using control points and weights.

      + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_surface), + intent(inout) + + ::this + +
      + + integer, + intent(in), + contiguous + ::nc(:) + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xc(:,:) + +
      + + real(kind=rk), + intent(in),optional, + contiguous + ::Wc(:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set1 + +

    +
    +
    + +
    +

    Set knot vectors, control points and weights for the NURBS surface object

    +
    +
    +
      +
    • +

      + private pure subroutine set1(this, knot1, knot2, Xc, Wc) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + +

      Set knot vectors, control points and weights for the NURBS surface object.

      + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_surface), + intent(inout) + + ::this + +
      + + real(kind=rk), + intent(in), + contiguous + ::knot1(:) + +
      + + real(kind=rk), + intent(in), + contiguous + ::knot2(:) + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xc(:,:) + +
      + + real(kind=rk), + intent(in),optional, + contiguous + ::Wc(:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set2 + +

    +
    +
    + +
    +

    Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights

    +
    +
    +
      +
    • +

      + private pure subroutine set2(this, Xth_dir1, Xth_dir2, degree, continuity1, continuity2, Xc, Wc) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + +

      Set NURBS surface using nodes of parameter space, degree, continuity, control points and weights

      + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_surface), + intent(inout) + + ::this + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xth_dir1(:) + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xth_dir2(:) + +
      + + integer, + intent(in), + contiguous + ::degree(:) + +
      + + integer, + intent(in), + contiguous + ::continuity1(:) + +
      + + integer, + intent(in), + contiguous + ::continuity2(:) + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xc(:,:) + +
      + + real(kind=rk), + intent(in),optional, + contiguous + ::Wc(:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set3 + +

    +
    +
    + +
    +

    Set Bezier or Rational Bezier surface using control points and weights

    +
    +
    +
      +
    • +

      + private pure subroutine set3(this, nc, Xc, Wc) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + +

      Set Bezier or Rational Bezier surface using control points and weights.

      + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_surface), + intent(inout) + + ::this + +
      + + integer, + intent(in), + contiguous + ::nc(:) + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xc(:,:) + +
      + + real(kind=rk), + intent(in),optional, + contiguous + ::Wc(:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set_elem + +

    +
    +
    + +
    +

    Set IGA element connectivity

    +
    +
    +
      +
    • +

      + private pure subroutine set_elem(this, elemConn) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_surface), + intent(inout) + + ::this + +
      + + integer, + intent(in), + contiguous + ::elemConn(:,:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set_elem_Xc_vis + +

    +
    +
    + +
    +

    Set connectivity for control points

    +
    +
    +
      +
    • +

      + private pure subroutine set_elem_Xc_vis(this, elemConn) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_surface), + intent(inout) + + ::this + +
      + + integer, + intent(in), + contiguous + ::elemConn(:,:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set_elem_Xg_vis + +

    +
    +
    + +
    +

    Set connectivity for geometry points

    +
    +
    +
      +
    • +

      + private pure subroutine set_elem_Xg_vis(this, elemConn) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_surface), + intent(inout) + + ::this + +
      + + integer, + intent(in), + contiguous + ::elemConn(:,:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set_tetragon + +

    +
    +
    + +
    +

    Set a tetragon

    +
    +
    +
      +
    • +

      + private pure subroutine set_tetragon(this, L, nc, Wc) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_surface), + intent(inout) + + ::this + +
      + + real(kind=rk), + intent(in) + + ::L(2) + +
      + + integer, + intent(in) + + ::nc(2) + +
      + + real(kind=rk), + intent(in),optional, + contiguous + ::Wc(:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + show + +

    +
    +
    + +
    +

    Show the NURBS object using PyVista

    +
    +
    +
      +
    • +

      + private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_surface), + intent(inout) + + ::this + +
      + + character(len=*), + intent(in) + + ::vtkfile_Xc + +
      + + character(len=*), + intent(in) + + ::vtkfile_Xg + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + translate_Xc + +

    +
    +
    + +
    +

    Translate control points

    +
    +
    +
      +
    • +

      + private pure subroutine translate_Xc(this, vec) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_surface), + intent(inout) + + ::this + +
      + + real(kind=rk), + intent(in) + + ::vec(:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + translate_Xg + +

    +
    +
    + +
    +

    Translate geometry points

    +
    +
    +
      +
    • +

      + private pure subroutine translate_Xg(this, vec) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + - + - + @@ -3888,12 +4948,12 @@

      Arguments

      real(kind=rk), - - + - + @@ -3910,23 +4970,23 @@

      Arguments

      - +

      - procedure, public :: - set3 + procedure, private :: + get_Wc_all

      -

      Set Bezier or Rational Bezier surface using control points and weights

      +

      Get all weights

      • - private pure subroutine set3(this, nc, Xc, Wc) + private pure function get_Wc_all(this) result(Wc)

        Author
        Seyed Ali Ghasemi
        @@ -3934,7 +4994,7 @@

        -

        Set Bezier or Rational Bezier surface using control points and weights.

        +

        Arguments

      TypeIntentOptional AttributesName
      + + class(nurbs_surface), intent(in),intent(inout) - contiguous + ::Xc(:,:)this intent(in),optional, - contiguous +intent(in) + ::Wc(:)vec(:)
      @@ -3952,7 +5012,7 @@

      Arguments

      class(nurbs_surface), - + @@ -3960,56 +5020,16 @@

      Arguments

      - - - - - - - - - - - - - - - - - - - - - - - -
      intent(inout)intent(in) this -
      - - integer, - intent(in), - contiguous - ::nc(:) - -
      - - real(kind=rk), - intent(in), - contiguous - ::Xc(:,:) - -
      - - real(kind=rk), - intent(in),optional, - contiguous - ::Wc(:) -
      +

      + Return Value + real(kind=rk), allocatable, (:) +

      +
    @@ -4019,23 +5039,23 @@

    Arguments

    - +

    - procedure, public :: - set_elem + procedure, private :: + get_Wci

    -

    Set IGA element connectivity

    +

    Get i-th weight

    • - private pure subroutine set_elem(this, elemConn) + private pure function get_Wci(this, n) result(Wc)

      Author
      Seyed Ali Ghasemi
      @@ -4061,7 +5081,7 @@

      Arguments

      class(nurbs_surface),

    intent(inout)intent(in) intent(in),intent(in) - contiguous + ::elemConn(:,:)n
    +

    + Return Value + real(kind=rk) +

    + @@ -4098,23 +5123,23 @@

    Arguments

    - +

    - procedure, public :: - set_elem_Xc_vis + procedure, private :: + get_Xc_all

    -

    Set connectivity for control points

    +

    Get all control points

    intent(inout)intent(in) this -
    - - integer, - intent(in), - contiguous - ::elemConn(:,:) -
    +

    + Return Value + real(kind=rk), allocatable, (:,:) +

    + @@ -4177,23 +5192,23 @@

    Arguments

    - +

    - procedure, public :: - set_elem_Xg_vis + procedure, private :: + get_Xci

    -

    Set connectivity for geometry points

    +

    Get i-th control point

    • - private pure subroutine set_elem_Xg_vis(this, elemConn) + private pure function get_Xci(this, n) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -4219,7 +5234,7 @@

      Arguments

      class(nurbs_surface),

    intent(inout)intent(in) intent(in),intent(in) - contiguous + ::elemConn(:,:)n
    +

    + Return Value + real(kind=rk), allocatable, (:) +

    + @@ -4256,23 +5276,23 @@

    Arguments

    - +

    - procedure, public :: - set_tetragon + procedure, private :: + get_Xcid

    -

    Set a tetragon

    +

    Get i-th control point in a specific direction

    • - private pure subroutine set_tetragon(this, L, nc, Wc) + private pure function get_Xcid(this, n, dir) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -4298,7 +5318,7 @@

      Arguments

      class(nurbs_surface),

    intent(inout)intent(in)
    - real(kind=rk), + integer, intent(in) ::L(2)n ::nc(2) - -
    - - real(kind=rk), - intent(in),optional, - contiguous - ::Wc(:)dir
    +

    + Return Value + real(kind=rk) +

    + @@ -4365,23 +5375,23 @@

    Arguments

    - +

    - procedure, public :: - show + procedure, private :: + get_Xg_all

    -

    Show the NURBS object using PyVista

    +

    Get all geometry points

    • - private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) + private pure function get_Xg_all(this) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -4407,42 +5417,12 @@

      Arguments

      class(nurbs_surface),

    intent(inout) - - ::this - -
    - - character(len=*), - intent(in) - - ::vtkfile_Xc - -
    - - character(len=*), - intent(in) ::vtkfile_Xgthis
    +

    + Return Value + real(kind=rk), allocatable, (:,:) +

    + @@ -4459,23 +5444,23 @@

    Arguments

    - +

    - procedure, public :: - translate_Xc + procedure, private :: + get_Xgi

    -

    Translate control points

    +

    Get i-th geometry point

    • - private pure subroutine translate_Xc(this, vec) + private pure function get_Xgi(this, n) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -4501,7 +5486,7 @@

      Arguments

      class(nurbs_surface),

    intent(inout)intent(in)
    - real(kind=rk), + integer, intent(in) ::vec(:)n
    +

    + Return Value + real(kind=rk), allocatable, (:) +

    + @@ -4538,23 +5528,23 @@

    Arguments

    - +

    - procedure, public :: - translate_Xg + procedure, private :: + get_Xgid

    -

    Translate geometry points

    +

    Get i-th geometry point in a specific direction

    • - private pure subroutine translate_Xg(this, vec) + private pure function get_Xgid(this, n, dir) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -4580,7 +5570,7 @@

      Arguments

      class(nurbs_surface),

    intent(inout)intent(in)
    - real(kind=rk), + integer, intent(in) ::vec(:)n + +
    + + integer, + intent(in) + + ::dir
    +

    + Return Value + real(kind=rk) +

    + @@ -4617,7 +5627,7 @@

    Arguments

    - +

    procedure, private :: get_degree_all @@ -4633,7 +5643,7 @@

    - + real(kind=rk), private,
    - + real(kind=rk), private,
    - + real(kind=rk), private,
    - + real(kind=rk), private,
    - + real(kind=rk), private,
    - + integer, private
    - + integer, private,
    - + integer, private,
    - + integer, private,
    - + real(kind=rk), private,
    - + real(kind=rk), private,
    - + real(kind=rk), private,
    - + integer, private
    - + integer, private this +
    + + integer, + intent(in) + + ::n +
    ::dirn intent(in) + ::n + +
    + + integer, + intent(in) + :: dir ::dirn this +
    + + integer, + intent(in) + + ::n + +
    + + integer, + intent(in) + + ::dir +
    this +
    + + integer, + intent(in) + + ::dir +
    this +
    + + integer, + intent(in) + + ::dir +
    this -
    - - integer, - intent(in) - - ::dir - -
    - - integer, - intent(in) - - ::i -
    this -
    - - integer, - intent(in) - - ::dir -
    this -
    - - integer, - intent(in) - - ::dir -
    intent(inout)intent(in)
    - - real(kind=rk), - intent(in), - contiguous - ::Xth(:) - -
    integer, intent(in),intent(in) - contiguous + ::r(:)i
    +

    + Return Value + real(kind=rk) +

    + - -
    - - -
    -
    -
    - -

    - procedure, public :: - is_rational - -

    -
    -
    - -
    -

    Check if the NURBS volume is rational

    -
    -
    -
    • - private pure function is_rational(this) result(r) + private pure function get_knot_all(this, dir) result(knot)

      Author
      Seyed Ali Ghasemi
      @@ -2835,6 +2758,21 @@

      Arguments

    this +
    + + integer, + intent(in) + + ::dir +
    intent(inout) - - ::this - -
    - - real(kind=rk), - intent(in) ::Wthis ::numdir
    +

    + Return Value + integer, allocatable, (:) +

    + @@ -2948,23 +2876,23 @@

    Arguments

    - +

    procedure, public :: - modify_Xc + get_nc

    -

    Modify control points

    +

    Get number of required control points

    • - private pure subroutine modify_Xc(this, X, num, dir) + private pure function get_nc(this, dir) result(nc)

      Author
      Seyed Ali Ghasemi
      @@ -2990,42 +2918,12 @@

      Arguments

      class(nurbs_volume),

    intent(inout) - - ::this - -
    - - real(kind=rk), - intent(in) - - ::X - -
    - - integer, - intent(in) ::numthis
    +

    + Return Value + integer +

    + @@ -3057,23 +2960,23 @@

    Arguments

    - +

    procedure, public :: - put_to_nurbs + get_ng

    -

    Put a shape to a NURBS volume

    +

    Get number of geometry points

    • - private pure subroutine put_to_nurbs(this, X, elemConn) + private pure function get_ng(this) result(ng)

      Author
      Seyed Ali Ghasemi
      @@ -3099,7 +3002,7 @@

      Arguments

      class(nurbs_volume),

    intent(inout)intent(in) this -
    - - real(kind=rk), - intent(in), - contiguous - ::X(:,:) - -
    - - integer, - intent(in), - contiguous - ::elemConn(:,:) -
    +

    + Return Value + integer, (3) +

    + @@ -3151,23 +3029,23 @@

    Arguments

    - +

    procedure, public :: - remove_knots + insert_knots

    -

    Remove knots from the knot vector

    +

    Insert knots into the knot vector

    • - private pure subroutine remove_knots(this, dir, Xth, r) + private pure subroutine insert_knots(this, dir, Xth, r)

      Author
      Seyed Ali Ghasemi
      @@ -3260,23 +3138,23 @@

      Arguments

      - +

      procedure, public :: - rotate_Xc + is_rational

      -

      Rotate control points

      +

      Check if the NURBS volume is rational

      • - private pure subroutine rotate_Xc(this, alpha, beta, theta) + private pure function is_rational(this) result(r)

        Author
        Seyed Ali Ghasemi
        @@ -3302,7 +3180,7 @@

        Arguments

        class(nurbs_volume),

    intent(inout)intent(in)
    - - real(kind=rk), - intent(in) - - ::alpha - -
    - - real(kind=rk), - intent(in) - - ::beta - -
    - - real(kind=rk), - intent(in) - - ::theta - -
    +

    +

    + Return Value + logical +

    + @@ -3369,23 +3207,23 @@

    Arguments

    - +

    procedure, public :: - rotate_Xg + modify_Wc

    -

    Rotate geometry points

    +

    Modify weights

    • - private pure subroutine rotate_Xg(this, alpha, beta, theta) + private pure subroutine modify_Wc(this, W, num)

      Author
      Seyed Ali Ghasemi
      @@ -3431,22 +3269,7 @@

      Arguments

    ::alpha - -
    - - real(kind=rk), - intent(in) - - ::betaW
    - real(kind=rk), + integer, intent(in) ::thetanum
    @@ -3535,12 +3358,12 @@

    Arguments

    real(kind=rk), - + - + @@ -3548,14 +3371,14 @@

    Arguments

    - + - + @@ -3563,14 +3386,78 @@

    Arguments

    - + - + + + + +
    intent(in),intent(in) - contiguous + ::knot1(:)X
    - real(kind=rk), + integer, intent(in),intent(in) - contiguous + ::knot2(:)num
    - real(kind=rk), + integer, intent(in),intent(in) - contiguous + ::knot3(:)dir + +
    + + + + +
    + + +
    +
    +
    + +

    + procedure, public :: + put_to_nurbs + +

    +
    +
    + +
    +

    Put a shape to a NURBS volume

    +
    +
    +
      +
    • +

      + private pure subroutine put_to_nurbs(this, X, elemConn) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + @@ -3585,7 +3472,7 @@

      Arguments

      contiguous - + @@ -3593,14 +3480,14 @@

      Arguments

      - - + @@ -3610,9 +3497,30 @@

      Arguments

      + + + + +
      +
      +
      + +

      + procedure, public :: + remove_knots + +

      +
      +
      + +
      +

      Remove knots from the knot vector

      +
      +
      +
      • - private pure subroutine set2(this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc) + private pure subroutine remove_knots(this, dir, Xth, r)

        Author
        Seyed Ali Ghasemi
        @@ -3620,7 +3528,7 @@

        -

        Set control points and weights for the NURBS volume object.

        +

        Arguments

      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(inout) + + ::this ::Xc(:,:)X(:,:)
      - real(kind=rk), + integer, intent(in),optional, + contiguous ::Wc(:)elemConn(:,:)
      @@ -3651,14 +3559,14 @@

      Arguments

      - + - + @@ -3673,7 +3581,7 @@

      Arguments

      contiguous - + @@ -3681,29 +3589,78 @@

      Arguments

      - + + +
      - real(kind=rk), + integer, intent(in),intent(in) - contiguous + ::Xth_dir1(:)dir ::Xth_dir2(:)Xth(:)
      - real(kind=rk), + integer, intent(in), contiguous ::Xth_dir3(:)r(:)
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + rotate_Xc + +

    +
    +
    + +
    +

    Rotate control points

    +
    +
    +
      +
    • +

      + private pure subroutine rotate_Xc(this, alpha, beta, theta) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + - + - + @@ -3711,14 +3668,14 @@

      Arguments

      - + - + @@ -3726,14 +3683,14 @@

      Arguments

      - + - + @@ -3741,44 +3698,14 @@

      Arguments

      - + - - - - - - - - - - - - - - - - - + @@ -3788,9 +3715,30 @@

      Arguments

      + + + + +
      +
      +
      + +

      + procedure, public :: + rotate_Xg + +

      +
      +
      + +
      +

      Rotate geometry points

      +
      +
      +
      • - private pure subroutine set3(this, nc, Xc, Wc) + private pure subroutine rotate_Xg(this, alpha, beta, theta)

        Author
        Seyed Ali Ghasemi
        @@ -3798,7 +3746,7 @@

        -

        Set Bezier or Rational Bezier volume using control points and weights.

        +

        Arguments

      TypeIntentOptional AttributesName
      - integer, + class(nurbs_volume), intent(in),intent(inout) - contiguous + ::degree(:)this
      - integer, + real(kind=rk), intent(in),intent(in) - contiguous + ::continuity1(:)alpha
      - integer, + real(kind=rk), intent(in),intent(in) - contiguous + ::continuity2(:)beta
      - integer, + real(kind=rk), intent(in),intent(in) - contiguous + ::continuity3(:) - -
      - - real(kind=rk), - intent(in), - contiguous - ::Xc(:,:) - -
      - - real(kind=rk), - intent(in),optional, - contiguous - ::Wc(:)theta
      @@ -3829,14 +3777,14 @@

      Arguments

      - + - + @@ -3846,12 +3794,12 @@

      Arguments

      real(kind=rk), - + - + @@ -3861,12 +3809,12 @@

      Arguments

      real(kind=rk), - - + - + @@ -3883,23 +3831,23 @@

      Arguments

      - +

      - procedure, public :: - set1 + generic, public :: + set => set1, set2, set3

      -

      Set knot vectors, control points and weights for the NURBS volume object

      +

      Set NURBS volume

      • - private pure subroutine set1(this, knot1, knot2, knot3, Xc, Wc) + private pure subroutine set1(this, knot1, knot2, knot3, Xc, Wc)

        Author
        Seyed Ali Ghasemi
        @@ -4015,30 +3963,9 @@

        Arguments

      • -
      -
      - -
      -
      -
      -
      - -

      - procedure, public :: - set2 - -

      -
      -
      - -
      -

      Set NURBS volume using nodes of parameter space, degree, continuity, control points and weights

      -
      -
      -
      • - private pure subroutine set2(this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc) + private pure subroutine set2(this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc)

        Author
        Seyed Ali Ghasemi
        @@ -4184,12 +4111,1145 @@

        Arguments

        real(kind=rk), -
      + + + + + + + + + + + + + + + +
      - integer, + real(kind=rk), intent(in),intent(in) - contiguous + ::nc(:)alpha intent(in),intent(in) - contiguous + ::Xc(:,:)beta intent(in),optional, - contiguous +intent(in) + ::Wc(:)theta intent(in),intent(in), + contiguous + ::Xc(:,:) + +
      + + real(kind=rk), + intent(in),optional, + contiguous + ::Wc(:) + +
      + + +
    • +
    • +

      + private pure subroutine set3(this, nc, Xc, Wc) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + +

      Set Bezier or Rational Bezier volume using control points and weights.

      + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(inout) + + ::this + +
      + + integer, + intent(in), + contiguous + ::nc(:) + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xc(:,:) + +
      + + real(kind=rk), + intent(in),optional, + contiguous + ::Wc(:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set1 + +

    +
    +
    + +
    +

    Set knot vectors, control points and weights for the NURBS volume object

    +
    +
    +
      +
    • +

      + private pure subroutine set1(this, knot1, knot2, knot3, Xc, Wc) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + +

      Set control points and weights for the NURBS volume object.

      + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(inout) + + ::this + +
      + + real(kind=rk), + intent(in), + contiguous + ::knot1(:) + +
      + + real(kind=rk), + intent(in), + contiguous + ::knot2(:) + +
      + + real(kind=rk), + intent(in), + contiguous + ::knot3(:) + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xc(:,:) + +
      + + real(kind=rk), + intent(in),optional, + contiguous + ::Wc(:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set2 + +

    +
    +
    + +
    +

    Set NURBS volume using nodes of parameter space, degree, continuity, control points and weights

    +
    +
    +
      +
    • +

      + private pure subroutine set2(this, Xth_dir1, Xth_dir2, Xth_dir3, degree, continuity1, continuity2, continuity3, Xc, Wc) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + +

      Set control points and weights for the NURBS volume object.

      + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(inout) + + ::this + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xth_dir1(:) + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xth_dir2(:) + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xth_dir3(:) + +
      + + integer, + intent(in), + contiguous + ::degree(:) + +
      + + integer, + intent(in), + contiguous + ::continuity1(:) + +
      + + integer, + intent(in), + contiguous + ::continuity2(:) + +
      + + integer, + intent(in), + contiguous + ::continuity3(:) + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xc(:,:) + +
      + + real(kind=rk), + intent(in),optional, + contiguous + ::Wc(:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set3 + +

    +
    +
    + +
    +

    Set Bezier or Rational Bezier volume using control points and weights

    +
    +
    +
      +
    • +

      + private pure subroutine set3(this, nc, Xc, Wc) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + +

      Set Bezier or Rational Bezier volume using control points and weights.

      + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(inout) + + ::this + +
      + + integer, + intent(in), + contiguous + ::nc(:) + +
      + + real(kind=rk), + intent(in), + contiguous + ::Xc(:,:) + +
      + + real(kind=rk), + intent(in),optional, + contiguous + ::Wc(:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set_elem + +

    +
    +
    + +
    +

    Set IGA element connectivity

    +
    +
    +
      +
    • +

      + private pure subroutine set_elem(this, elemConn) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(inout) + + ::this + +
      + + integer, + intent(in), + contiguous + ::elemConn(:,:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set_elem_Xc_vis + +

    +
    +
    + +
    +

    Set connectivity for control points

    +
    +
    +
      +
    • +

      + private pure subroutine set_elem_Xc_vis(this, elemConn) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(inout) + + ::this + +
      + + integer, + intent(in), + contiguous + ::elemConn(:,:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set_elem_Xg_vis + +

    +
    +
    + +
    +

    Set connectivity for geometry points

    +
    +
    +
      +
    • +

      + private pure subroutine set_elem_Xg_vis(this, elemConn) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(inout) + + ::this + +
      + + integer, + intent(in), + contiguous + ::elemConn(:,:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + set_hexahedron + +

    +
    +
    + +
    +

    Set a hexahedron

    +
    +
    +
      +
    • +

      + private pure subroutine set_hexahedron(this, L, nc, Wc) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(inout) + + ::this + +
      + + real(kind=rk), + intent(in), + contiguous + ::L(:) + +
      + + integer, + intent(in), + contiguous + ::nc(:) + +
      + + real(kind=rk), + intent(in),optional, + contiguous + ::Wc(:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + show + +

    +
    +
    + +
    +

    Show the NURBS object using PyVista

    +
    +
    +
      +
    • +

      + private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(inout) + + ::this + +
      + + character(len=*), + intent(in) + + ::vtkfile_Xc + +
      + + character(len=*), + intent(in) + + ::vtkfile_Xg + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + translate_Xc + +

    +
    +
    + +
    +

    Translate control points

    +
    +
    +
      +
    • +

      + private pure subroutine translate_Xc(this, vec) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(inout) + + ::this + +
      + + real(kind=rk), + intent(in) + + ::vec(:) + +
      + + +
    • +
    +
    + +
    +
    +
    +
    + +

    + procedure, public :: + translate_Xg + +

    +
    +
    + +
    +

    Translate geometry points

    +
    +
    +
      +
    • +

      + private pure subroutine translate_Xg(this, vec) +

      +
      +
      Author
      Seyed Ali Ghasemi
      +
      License
      BSD 3-Clause
      +
      + + + + +

      Arguments

      + + + + + + + + + + + + + - + @@ -4199,12 +5259,12 @@

      Arguments

      real(kind=rk), - - + - + @@ -4221,23 +5281,23 @@

      Arguments

      - +

      - procedure, public :: - set3 + procedure, private :: + get_Wc_all

      -

      Set Bezier or Rational Bezier volume using control points and weights

      +

      Get all weights

      • - private pure subroutine set3(this, nc, Xc, Wc) + private pure function get_Wc_all(this) result(Wc)

        Author
        Seyed Ali Ghasemi
        @@ -4245,7 +5305,7 @@

        -

        Set Bezier or Rational Bezier volume using control points and weights.

        +

        Arguments

      TypeIntentOptional AttributesName
      + + class(nurbs_volume), + intent(inout) - contiguous + ::Xc(:,:)this intent(in),optional, - contiguous +intent(in) + ::Wc(:)vec(:)
      @@ -4263,7 +5323,7 @@

      Arguments

      class(nurbs_volume), - + @@ -4271,56 +5331,16 @@

      Arguments

      - - - - - - - - - - - - - - - - - - - - - - - -
      intent(inout)intent(in) this -
      - - integer, - intent(in), - contiguous - ::nc(:) - -
      - - real(kind=rk), - intent(in), - contiguous - ::Xc(:,:) - -
      - - real(kind=rk), - intent(in),optional, - contiguous - ::Wc(:) -
      +

      + Return Value + real(kind=rk), allocatable, (:) +

      +
    @@ -4330,23 +5350,23 @@

    Arguments

    - +

    - procedure, public :: - set_elem + procedure, private :: + get_Wci

    -

    Set IGA element connectivity

    +

    Get i-th weight

    • - private pure subroutine set_elem(this, elemConn) + private pure function get_Wci(this, n) result(Wc)

      Author
      Seyed Ali Ghasemi
      @@ -4372,7 +5392,7 @@

      Arguments

      class(nurbs_volume),

    intent(inout)intent(in) intent(in),intent(in) - contiguous + ::elemConn(:,:)n
    +

    + Return Value + real(kind=rk) +

    + @@ -4409,23 +5434,23 @@

    Arguments

    - +

    - procedure, public :: - set_elem_Xc_vis + procedure, private :: + get_Xc_all

    -

    Set connectivity for control points

    +

    Get all control points

    • - private pure subroutine set_elem_Xc_vis(this, elemConn) + private pure function get_Xc_all(this) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -4451,7 +5476,7 @@

      Arguments

      class(nurbs_volume),

    intent(inout)intent(in) this -
    - - integer, - intent(in), - contiguous - ::elemConn(:,:) -
    +

    + Return Value + real(kind=rk), allocatable, (:,:) +

    + @@ -4488,23 +5503,23 @@

    Arguments

    - +

    - procedure, public :: - set_elem_Xg_vis + procedure, private :: + get_Xci

    -

    Set connectivity for geometry points

    +

    Get i-th control point

    • - private pure subroutine set_elem_Xg_vis(this, elemConn) + private pure function get_Xci(this, n) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -4530,7 +5545,7 @@

      Arguments

      class(nurbs_volume),

    intent(inout)intent(in) intent(in),intent(in) - contiguous + ::elemConn(:,:)n
    +

    + Return Value + real(kind=rk), allocatable, (:) +

    + @@ -4567,23 +5587,23 @@

    Arguments

    - +

    - procedure, public :: - set_hexahedron + procedure, private :: + get_Xcid

    -

    Set a hexahedron

    +

    Get i-th control point in a specific direction

    • - private pure subroutine set_hexahedron(this, L, nc, Wc) + private pure function get_Xcid(this, n, dir) result(Xc)

      Author
      Seyed Ali Ghasemi
      @@ -4609,7 +5629,7 @@

      Arguments

      class(nurbs_volume),

    intent(inout)intent(in)
    - real(kind=rk), + integer, intent(in),intent(in) - contiguous + ::L(:)n intent(in),intent(in) - contiguous - ::nc(:) - -
    - - real(kind=rk), - intent(in),optional, - contiguous + ::Wc(:)dir
    +

    + Return Value + real(kind=rk) +

    + @@ -4676,23 +5686,23 @@

    Arguments

    - +

    - procedure, public :: - show + procedure, private :: + get_Xg_all

    -

    Show the NURBS object using PyVista

    +

    Get all geometry points

    • - private impure subroutine show(this, vtkfile_Xc, vtkfile_Xg) + private pure function get_Xg_all(this) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -4718,42 +5728,12 @@

      Arguments

      class(nurbs_volume),

    intent(inout) - - ::this - -
    - - character(len=*), - intent(in) - - ::vtkfile_Xc - -
    - - character(len=*), - intent(in) ::vtkfile_Xgthis
    +

    + Return Value + real(kind=rk), allocatable, (:,:) +

    + @@ -4770,23 +5755,23 @@

    Arguments

    - +

    - procedure, public :: - translate_Xc + procedure, private :: + get_Xgi

    -

    Translate control points

    +

    Get i-th geometry point

    • - private pure subroutine translate_Xc(this, vec) + private pure function get_Xgi(this, n) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -4812,7 +5797,7 @@

      Arguments

      class(nurbs_volume),

    intent(inout)intent(in)
    - real(kind=rk), + integer, intent(in) ::vec(:)n
    +

    + Return Value + real(kind=rk), allocatable, (:) +

    + @@ -4849,23 +5839,23 @@

    Arguments

    - +

    - procedure, public :: - translate_Xg + procedure, private :: + get_Xgid

    -

    Translate geometry points

    +

    Get i-th geometry point in a specific direction

    • - private pure subroutine translate_Xg(this, vec) + private pure function get_Xgid(this, n, dir) result(Xg)

      Author
      Seyed Ali Ghasemi
      @@ -4891,7 +5881,7 @@

      Arguments

      class(nurbs_volume),

    intent(inout)intent(in)
    - real(kind=rk), + integer, intent(in) ::vec(:)n + +
    + + integer, + intent(in) + + ::dir
    +

    + Return Value + real(kind=rk) +

    + @@ -4928,7 +5938,7 @@

    Arguments

    - +

    procedure, private :: get_degree_all @@ -4944,7 +5954,7 @@

    • - private pure function get_degree_all(this) result(degree) + private pure function get_degree_all(this) result(degree)

      Author
      Seyed Ali Ghasemi
      @@ -4997,7 +6007,7 @@

      - +

      procedure, private :: get_degree_dir @@ -5013,7 +6023,7 @@

      • - private pure function get_degree_dir(this, dir) result(degree) + private pure function get_degree_dir(this, dir) result(degree)

        Author
        Seyed Ali Ghasemi
        @@ -5081,7 +6091,7 @@

        - +

        procedure, private :: get_knot_all @@ -5097,7 +6107,7 @@

        • - private pure function get_knot_all(this, dir) result(knot) + private pure function get_knot_all(this, dir) result(knot)

          Author
          Seyed Ali Ghasemi
          @@ -5165,7 +6175,7 @@

          - +

          procedure, private :: get_knoti @@ -5181,7 +6191,7 @@

          • - private pure function get_knoti(this, dir, i) result(knot) + private pure function get_knoti(this, dir, i) result(knot)

            Author
            Seyed Ali Ghasemi
            @@ -5282,7 +6292,7 @@

            Documentation generated by FORD - on 2024-04-16T12:26:30.084942

            + on 2024-04-16T18:31:38.142193