initialize Subroutine

private subroutine initialize(self, refinement_levels, facet, bmin, bmax)

Initialize AABB tree.

Arguments

Type IntentOptional AttributesName
class(aabb_tree_object), intent(inout) :: self

AABB tree.

integer(kind=I4P), intent(in) :: refinement_levels

Total number of refinement levels used.

type(facet_object), intent(in), optional :: facet(:)

Facets list.

type(vector_R8P), intent(in), optional :: bmin

Minimum point of AABB.

type(vector_R8P), intent(in), optional :: bmax

Maximum point of AABB.

Calls

proc~~initialize~5~~CallsGraph proc~initialize~5 initialize proc~nodes_number_at_level nodes_number_at_level proc~initialize~5->proc~nodes_number_at_level proc~nodes_number nodes_number proc~initialize~5->proc~nodes_number node node proc~initialize~5->node proc~parent_node parent_node proc~initialize~5->proc~parent_node proc~first_node first_node proc~initialize~5->proc~first_node proc~nodes_number->proc~nodes_number_at_level proc~first_node->proc~nodes_number
Help

Source Code


Source Code

   subroutine initialize(self, refinement_levels, facet, bmin, bmax)
   !< Initialize AABB tree.
   class(aabb_tree_object), intent(inout)        :: self              !< AABB tree.
   integer(I4P),            intent(in)           :: refinement_levels !< Total number of refinement levels used.
   type(facet_object),      intent(in), optional :: facet(:)          !< Facets list.
   type(vector_R8P),        intent(in), optional :: bmin              !< Minimum point of AABB.
   type(vector_R8P),        intent(in), optional :: bmax              !< Maximum point of AABB.
   integer(I4P)                                  :: level             !< Counter.
   integer(I4P)                                  :: b, bb, bbb, bbbb  !< Counter.
   integer(I4P)                                  :: parent            !< Parent node index.
   type(aabb_object)                             :: octant(8)         !< AABB octants.
   type(facet_object), allocatable               :: facet_(:)         !< Facets list, local variable.

   call self%destroy
   self%refinement_levels = refinement_levels
   self%nodes_number = nodes_number(refinement_levels=self%refinement_levels)
   allocate(self%node(0:self%nodes_number-1))
   associate(node=>self%node)
      ! inizialize all tree nodes with only the bounding box
      call node(0)%initialize(facet=facet, bmin=bmin, bmax=bmax)
      do level=1, self%refinement_levels                                                             ! loop over refinement levels
         b = first_node(level=level)                                                                 ! first node at level
         do bb=1, nodes_number_at_level(level=level), TREE_RATIO                                     ! loop over nodes at level
            bbb = b + bb - 1                                                                         ! node numeration in tree
            parent = parent_node(node=bbb)                                                           ! parent of the current node
            if (node(parent)%is_allocated()) then                                                    ! create children nodes
               call node(parent)%compute_octants(octant=octant)                                      ! compute parent AABB octants
               do bbbb=0, TREE_RATIO-1                                                               ! loop over children
                  call node(bbb+bbbb)%initialize(bmin=octant(bbbb+1)%bmin, bmax=octant(bbbb+1)%bmax) ! initialize node
               enddo
            endif
         enddo
      enddo

      ! fill all tree nodes with facets
      if (present(facet)) then
         allocate(facet_, source=facet)

         ! add facets to nodes
         do level=self%refinement_levels, 0, -1           ! loop over refinement levels
            b = first_node(level=level)                   ! first node at level
            do bb=1, nodes_number_at_level(level=level)   ! loop over nodes at level
               bbb = b + bb - 1                           ! node numeration in tree
               if (allocated(facet_)) then                ! check if facets list still has facets
                  call node(bbb)%add_facets(facet=facet_) ! add facets to node and prune added facets from list
               endif
            enddo
         enddo

         ! destroy void nodes (except root node)
         do level=self%refinement_levels, 1, -1                        ! loop over refinement levels
            b = first_node(level=level)                                ! first node at level
            do bb=1, nodes_number_at_level(level=level)                ! loop over nodes at level
               bbb = b + bb - 1                                        ! node numeration in tree
               if (.not.node(bbb)%has_facets()) call node(bbb)%destroy ! destroy void node
            enddo
         enddo

         ! update AABB extents
         do level=self%refinement_levels, 1, -1         ! loop over refinement levels
            b = first_node(level=level)                 ! first node at level
            do bb=1, nodes_number_at_level(level=level) ! loop over nodes at level
               bbb = b + bb - 1                         ! node numeration in tree
               call node(bbb)%update_extents            ! update extents
            enddo
         enddo
      endif
   endassociate
   self%is_initialized = .true.
   endsubroutine initialize


aabb_assign_aabb aabb_node_assign_aabb_node aabb_tree_assign_aabb_tree add_facets add_facets add_vertex_occurrence allocate_facets analize bmax bmin build_connectivity check_normal check_vertices_occurrencies cli_parse cli_parse cli_parse cli_parse cli_parse cli_parse close_file closest_point closest_point compute_bb_from_facets compute_metrix compute_metrix compute_normal compute_normals compute_octants compute_octants compute_volume create_aabb_tree destroy destroy destroy destroy destroy distance distance distance distance distance distance_from_facets distance_from_facets do_ray_intersect do_ray_intersect do_ray_intersect edge_connection_in_other_ref facet_assign_facet file_stl_assign_file_stl first_child_node first_node flip_edge has_facets has_facets initialize initialize initialize initialize initialize is_allocated is_inside is_point_inside_polyhedron_ri is_point_inside_polyhedron_sa load_facets_number_from_file load_from_file load_from_file_ascii load_from_file_binary load_header_from_file make_normal_consistent mirror_by_matrix mirror_by_matrix mirror_by_normal mirror_by_normal nodes_number nodes_number_at_level open_file parent_node ray_intersections_number ray_intersections_number ray_intersections_number resize resize reverse_normal reverse_normals rotate_by_axis_angle rotate_by_axis_angle rotate_by_matrix rotate_by_matrix sanitize_normals save_facets_into_file_stl save_facets_into_file_stl save_geometry_tecplot_ascii save_geometry_tecplot_ascii save_geometry_tecplot_ascii save_header_into_file save_into_file save_into_file_ascii save_into_file_binary save_into_file_stl save_trailer_into_file solid_angle statistics tetrahedron_volume translate translate update_connectivity update_extents update_extents vertex vertex_global_id