Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer(kind=int32), | intent(in) | :: | num_elems | |||
integer(kind=int32), | intent(in) | :: | elem_ptr(:) | |||
integer(kind=int32), | intent(in) | :: | elem_data(:) | |||
integer(kind=int32), | intent(out), | allocatable | :: | edge_i(:) | ||
integer(kind=int32), | intent(out), | allocatable | :: | edge_j(:) | ||
integer(kind=int32), | intent(out) | :: | edge_count | |||
integer(kind=int32), | intent(out) | :: | istat |
subroutine generate_all_edges(num_elems, elem_ptr, elem_data, & edge_i, edge_j, edge_count, istat) integer(int32), intent(in) :: num_elems, elem_ptr(:), elem_data(:) integer(int32), allocatable, intent(out) :: edge_i(:), edge_j(:) integer(int32), intent(out) :: edge_count, istat integer(int32) :: i, j, k, n1, n2, start_idx, end_idx, est_edges istat = 0 est_edges = size(elem_data) * 4 ! 推定サイズ call allocate_array(edge_i, est_edges) call allocate_array(edge_j, est_edges) edge_count = 0 do i = 1, num_elems start_idx = elem_ptr(i) end_idx = elem_ptr(i + 1) - 1 do j = start_idx, end_idx do k = j + 1, end_idx edge_count = edge_count + 1 if (edge_count > est_edges) then istat = -1; return ! メモリ見積もりエラー end if n1 = elem_data(j) n2 = elem_data(k) if (n1 < n2) then edge_i(edge_count) = n1 edge_j(edge_count) = n2 else edge_i(edge_count) = n2 edge_j(edge_count) = n1 end if end do end do end do end subroutine generate_all_edges