Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(type_crs), | intent(inout) | :: | self | |||
type(type_domain), | intent(inout) | :: | domain |
subroutine initialize_type_crs(self, domain) implicit none class(type_crs), intent(inout) :: self type(type_domain), intent(inout) :: domain ! --- ローカル変数 --- type(type_coo) :: coo integer(int32) :: i, r, pos integer(int32), allocatable :: rcm_row(:), rcm_col(:) integer(int32), allocatable :: write_pos(:) ! ================================================================= ! Step 1: coo%initializeを呼び出し、COO行列を作成する ! ================================================================= call coo%initialize(domain) self%nnz = coo%nnz self%num_row = domain%get_num_nodes() self%num_ptr = self%num_row + 1 if (self%nnz == 0) then call allocate_array(self%ptr, self%num_ptr) self%ptr = 1 return end if ! ================================================================= ! Step 2: COOの行・列インデックスをRCM番号に変換 ! ================================================================= call allocate_array(rcm_row, self%nnz) call allocate_array(rcm_col, self%nnz) call domain%reordering%to_reordered(coo%row, rcm_row) call domain%reordering%to_reordered(coo%col, rcm_col) ! ================================================================= ! Step 3: RCM適用後のデータから直接CRS行列を構築 ! ================================================================= call allocate_array(self%ptr, self%num_ptr) call allocate_array(self%ind, self%nnz) call allocate_array(self%val, self%nnz) self%ptr = 0 ! -- Pass 1: 各行の非ゼロ要素数をカウント do i = 1, self%nnz self%ptr(rcm_row(i) + 1) = self%ptr(rcm_row(i) + 1) + 1 end do ! -- Pass 2: 累積和を計算して、各行の開始ポインタを決定 self%ptr(1) = 1 do i = 2, self%num_ptr self%ptr(i) = self%ptr(i) + self%ptr(i - 1) end do ! -- Pass 3: indとvalを正しい位置に配置 call allocate_array(write_pos, self%num_row) write_pos(:) = self%ptr(1:self%num_row) do i = 1, self%nnz r = rcm_row(i) pos = write_pos(r) self%ind(pos) = rcm_col(i) self%val(pos) = 0.0d0 write_pos(r) = pos + 1 end do call deallocate_array(write_pos) call deallocate_array(rcm_row) call deallocate_array(rcm_col) call coo%destory() end subroutine initialize_type_crs