| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(type_node_adjacency), | intent(inout) | :: | self | |||
| integer(kind=int32), | intent(in) | :: | temp_row(:) | |||
| integer(kind=int32), | intent(in) | :: | temp_col(:) |
subroutine create_unique_coo(self, temp_row, temp_col) implicit none class(type_node_adjacency), intent(inout) :: self integer(int32), intent(in) :: temp_row(:), temp_col(:) integer(int64), allocatable :: packed_edges(:), unique_packed_edges(:) integer(int32) :: i, n1, n2, edge_count if (size(temp_row) == 0) return ! (i,j) と (j,i) の両方を持つ対称COOリストを作成するため、2倍のサイズを確保 allocate (packed_edges(size(temp_row) * 2)) edge_count = 0 do i = 1, size(temp_row) n1 = temp_row(i) n2 = temp_col(i) if (n1 == n2) then edge_count = edge_count + 1 packed_edges(edge_count) = ishft(int(n1, int64), 32) + int(n2, int64) else edge_count = edge_count + 1 packed_edges(edge_count) = ishft(int(n1, int64), 32) + int(n2, int64) edge_count = edge_count + 1 packed_edges(edge_count) = ishft(int(n2, int64), 32) + int(n1, int64) end if end do ! ソートしてユニークなエッジのみを抽出し、ソート済みCOOを生成 call unique(packed_edges(1:edge_count), unique_packed_edges) deallocate (packed_edges) self%nnz = size(unique_packed_edges) call allocate_array(self%row, self%nnz) call allocate_array(self%col, self%nnz) ! 結果を自身のCOOメンバに格納 do i = 1, self%nnz self%row(i) = int(ishft(unique_packed_edges(i), -32), kind=int32) self%col(i) = int(iand(unique_packed_edges(i), int(z'FFFFFFFF', int64)), kind=int32) end do deallocate (unique_packed_edges) end subroutine create_unique_coo