Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(holder_elements), | intent(in) | :: | elements(:) | |||
type(type_node_adjacency), | intent(inout) | :: | node_adj |
subroutine build_node_adjacency_from_elements(elements, node_adj) implicit none type(holder_elements), intent(in) :: elements(:) type(type_node_adjacency), intent(inout) :: node_adj integer(int32) :: num_elements, num_nodes, total_conn_size integer(int32), allocatable :: elements_conn_data(:), elements_ptr(:) integer(int32) :: i, k, current_pos num_elements = size(elements) if (num_elements == 0) then call node_adj%initialize(0, 0, [integer(int32) ::], [integer(int32) :: 1]) return end if num_nodes = 0 total_conn_size = 0 do i = 1, num_elements if (size(elements(i)%e%connectivity) > 0) then num_nodes = max(num_nodes, maxval(elements(i)%e%connectivity)) end if total_conn_size = total_conn_size + size(elements(i)%e%connectivity) end do call allocate_array(elements_ptr, length=num_elements + 1_int32) call allocate_array(elements_conn_data, length=total_conn_size) current_pos = 1 elements_ptr(1) = 1 do i = 1, num_elements k = size(elements(i)%e%connectivity) if (k > 0) then elements_conn_data(current_pos:current_pos + k - 1) = elements(i)%e%connectivity end if current_pos = current_pos + k elements_ptr(i + 1) = current_pos end do call node_adj%initialize(num_nodes, num_elements, elements_conn_data, elements_ptr) call deallocate_array(elements_ptr) call deallocate_array(elements_conn_data) end subroutine build_node_adjacency_from_elements