initialize_type_coo Subroutine

private subroutine initialize_type_coo(self, domain)

Type Bound

type_coo

Arguments

Type IntentOptional Attributes Name
class(type_coo), intent(inout) :: self
type(type_domain), intent(inout) :: domain

Calls

proc~~initialize_type_coo~~CallsGraph proc~initialize_type_coo type_coo%initialize_type_coo interface~allocate_array allocate_array proc~initialize_type_coo->interface~allocate_array interface~deallocate_array deallocate_array proc~initialize_type_coo->interface~deallocate_array interface~unique unique proc~initialize_type_coo->interface~unique proc~get_computation_dimension type_domain%get_computation_dimension proc~initialize_type_coo->proc~get_computation_dimension proc~get_num_elements type_domain%get_num_elements proc~initialize_type_coo->proc~get_num_elements proc~get_num_nodes type_domain%get_num_nodes proc~initialize_type_coo->proc~get_num_nodes proc~get_num_sides type_domain%get_num_sides proc~initialize_type_coo->proc~get_num_sides proc~allocate_rank1_int16 allocate_rank1_int16 interface~allocate_array->proc~allocate_rank1_int16 proc~allocate_rank1_int32 allocate_rank1_int32 interface~allocate_array->proc~allocate_rank1_int32 proc~allocate_rank1_int64 allocate_rank1_int64 interface~allocate_array->proc~allocate_rank1_int64 proc~allocate_rank1_int8 allocate_rank1_int8 interface~allocate_array->proc~allocate_rank1_int8 proc~allocate_rank1_logical1 allocate_rank1_logical1 interface~allocate_array->proc~allocate_rank1_logical1 proc~allocate_rank1_logical4 allocate_rank1_logical4 interface~allocate_array->proc~allocate_rank1_logical4 proc~allocate_rank1_logical8 allocate_rank1_logical8 interface~allocate_array->proc~allocate_rank1_logical8 proc~allocate_rank1_real128 allocate_rank1_real128 interface~allocate_array->proc~allocate_rank1_real128 proc~allocate_rank1_real32 allocate_rank1_real32 interface~allocate_array->proc~allocate_rank1_real32 proc~allocate_rank1_real64 allocate_rank1_real64 interface~allocate_array->proc~allocate_rank1_real64 proc~allocate_rank2_int16 allocate_rank2_int16 interface~allocate_array->proc~allocate_rank2_int16 proc~allocate_rank2_int32 allocate_rank2_int32 interface~allocate_array->proc~allocate_rank2_int32 proc~allocate_rank2_int64 allocate_rank2_int64 interface~allocate_array->proc~allocate_rank2_int64 proc~allocate_rank2_int8 allocate_rank2_int8 interface~allocate_array->proc~allocate_rank2_int8 proc~allocate_rank2_logical1 allocate_rank2_logical1 interface~allocate_array->proc~allocate_rank2_logical1 proc~allocate_rank2_logical4 allocate_rank2_logical4 interface~allocate_array->proc~allocate_rank2_logical4 proc~allocate_rank2_logical8 allocate_rank2_logical8 interface~allocate_array->proc~allocate_rank2_logical8 proc~allocate_rank2_real128 allocate_rank2_real128 interface~allocate_array->proc~allocate_rank2_real128 proc~allocate_rank2_real32 allocate_rank2_real32 interface~allocate_array->proc~allocate_rank2_real32 proc~allocate_rank2_real64 allocate_rank2_real64 interface~allocate_array->proc~allocate_rank2_real64 proc~deallocate_rank1_int32 deallocate_rank1_int32 interface~deallocate_array->proc~deallocate_rank1_int32 proc~deallocate_rank1_int64 deallocate_rank1_int64 interface~deallocate_array->proc~deallocate_rank1_int64 proc~deallocate_rank1_int8 deallocate_rank1_int8 interface~deallocate_array->proc~deallocate_rank1_int8 proc~deallocate_rank1_logical1 deallocate_rank1_logical1 interface~deallocate_array->proc~deallocate_rank1_logical1 proc~deallocate_rank1_logical4 deallocate_rank1_logical4 interface~deallocate_array->proc~deallocate_rank1_logical4 proc~deallocate_rank1_logical8 deallocate_rank1_logical8 interface~deallocate_array->proc~deallocate_rank1_logical8 proc~deallocate_rank1_real128 deallocate_rank1_real128 interface~deallocate_array->proc~deallocate_rank1_real128 proc~deallocate_rank1_real32 deallocate_rank1_real32 interface~deallocate_array->proc~deallocate_rank1_real32 proc~deallocate_rank1_real64 deallocate_rank1_real64 interface~deallocate_array->proc~deallocate_rank1_real64 proc~deallocate_rank2_int32 deallocate_rank2_int32 interface~deallocate_array->proc~deallocate_rank2_int32 proc~deallocate_rank2_int64 deallocate_rank2_int64 interface~deallocate_array->proc~deallocate_rank2_int64 proc~deallocate_rank2_int8 deallocate_rank2_int8 interface~deallocate_array->proc~deallocate_rank2_int8 proc~deallocate_rank2_logical1 deallocate_rank2_logical1 interface~deallocate_array->proc~deallocate_rank2_logical1 proc~deallocate_rank2_logical4 deallocate_rank2_logical4 interface~deallocate_array->proc~deallocate_rank2_logical4 proc~deallocate_rank2_logical8 deallocate_rank2_logical8 interface~deallocate_array->proc~deallocate_rank2_logical8 proc~deallocate_rank2_real128 deallocate_rank2_real128 interface~deallocate_array->proc~deallocate_rank2_real128 proc~deallocate_rank2_real32 deallocate_rank2_real32 interface~deallocate_array->proc~deallocate_rank2_real32 proc~deallocate_rank2_real64 deallocate_rank2_real64 interface~deallocate_array->proc~deallocate_rank2_real64 proc~unique_int16 unique_int16 interface~unique->proc~unique_int16 proc~unique_int32 unique_int32 interface~unique->proc~unique_int32 proc~unique_int64 unique_int64 interface~unique->proc~unique_int64 proc~unique_int8 unique_int8 interface~unique->proc~unique_int8 proc~error_message error_message proc~allocate_rank1_int16->proc~error_message proc~allocate_rank1_int32->proc~error_message proc~allocate_rank1_int64->proc~error_message proc~allocate_rank1_int8->proc~error_message proc~allocate_rank1_logical1->proc~error_message proc~allocate_rank1_logical4->proc~error_message proc~allocate_rank1_logical8->proc~error_message proc~allocate_rank1_real128->proc~error_message proc~allocate_rank1_real32->proc~error_message proc~allocate_rank1_real64->proc~error_message proc~allocate_rank2_int16->proc~error_message proc~allocate_rank2_int32->proc~error_message proc~allocate_rank2_int64->proc~error_message proc~allocate_rank2_int8->proc~error_message proc~allocate_rank2_logical1->proc~error_message proc~allocate_rank2_logical4->proc~error_message proc~allocate_rank2_logical8->proc~error_message proc~allocate_rank2_real128->proc~error_message proc~allocate_rank2_real32->proc~error_message proc~allocate_rank2_real64->proc~error_message proc~deallocate_rank1_int32->proc~error_message proc~deallocate_rank1_int64->proc~error_message proc~deallocate_rank1_int8->proc~error_message proc~deallocate_rank1_logical1->proc~error_message proc~deallocate_rank1_logical4->proc~error_message proc~deallocate_rank1_logical8->proc~error_message proc~deallocate_rank1_real128->proc~error_message proc~deallocate_rank1_real32->proc~error_message proc~deallocate_rank1_real64->proc~error_message proc~deallocate_rank2_int32->proc~error_message proc~deallocate_rank2_int64->proc~error_message proc~deallocate_rank2_int8->proc~error_message proc~deallocate_rank2_logical1->proc~error_message proc~deallocate_rank2_logical4->proc~error_message proc~deallocate_rank2_logical8->proc~error_message proc~deallocate_rank2_real128->proc~error_message proc~deallocate_rank2_real32->proc~error_message proc~deallocate_rank2_real64->proc~error_message proc~unique_int16->interface~allocate_array sort sort proc~unique_int16->sort proc~unique_int32->interface~allocate_array proc~unique_int32->sort proc~unique_int64->interface~allocate_array proc~unique_int64->sort proc~unique_int8->interface~allocate_array proc~unique_int8->sort log_error log_error proc~error_message->log_error

Called by

proc~~initialize_type_coo~~CalledByGraph proc~initialize_type_coo type_coo%initialize_type_coo proc~initialize_type_crs type_crs%initialize_type_crs proc~initialize_type_crs->proc~initialize_type_coo proc~construct_type_thermal_3phase_2d construct_type_thermal_3phase_2d proc~construct_type_thermal_3phase_2d->proc~initialize_type_crs interface~construct_type_thermal_3phase_2d construct_type_thermal_3phase_2d interface~construct_type_thermal_3phase_2d->proc~construct_type_thermal_3phase_2d interface~type_thermal_3phase_2d type_thermal_3phase_2d interface~type_thermal_3phase_2d->interface~construct_type_thermal_3phase_2d

Source Code

    subroutine initialize_type_coo(self, domain)
        implicit none
        class(type_coo), intent(inout) :: self
        type(type_domain), intent(inout) :: domain

        ! --- ローカル変数宣言 ---
        integer(int32) :: num_nodes, num_elements, num_sides, computation_dimension
        integer(int32) :: local_nodes
        integer(int32) :: num_total_cell_nodes
        integer(int32) :: i, j, k
        integer(int32) :: counter
        integer(int32), allocatable :: row_indices(:), col_indices(:)
        ! --- Variables for sorting and finding uniques ---
        integer(int64), allocatable :: packed_indices(:), unique_packed_indices(:)
        integer(int32) :: unique_idx
        integer(int64) :: last_key

        ! --- 初期設定 ---
        num_nodes = domain%get_num_nodes()
        num_sides = domain%get_num_sides()
        num_elements = domain%get_num_elements()

        self%nnz = 0

        ! --- 計算対象となる最大次元より低い次元のセルノード数を計算 ---
        ! これが最大のセルノード数となる
        num_total_cell_nodes = 0
        computation_dimension = domain%get_computation_dimension()
        if (computation_dimension == 3) then
            ! (3D implementation would go here)
        end if
        if (computation_dimension == 2) then
            do i = 1, num_elements
                num_total_cell_nodes = num_total_cell_nodes + domain%elements(i)%e%get_num_nodes()**2
            end do
            do i = 1, num_sides
                num_total_cell_nodes = num_total_cell_nodes + domain%sides(i)%s%get_num_nodes()**2
            end do
        end if

        if (num_total_cell_nodes <= 0) then
            print *, "Error: No valid nodes found in the domain."
            return
        else
            call allocate_array(row_indices, num_total_cell_nodes)
            call allocate_array(col_indices, num_total_cell_nodes)
        end if

        ! 重複ありですべての配置場所を割り当てる
        counter = 0
        if (computation_dimension == 3) then
            ! (3D implementation would go here)
        end if
        if (computation_dimension == 2) then
            do i = 1, num_elements
                local_nodes = domain%elements(i)%e%get_num_nodes()
                do j = 1, local_nodes
                    do k = 1, local_nodes
                        counter = counter + 1
                        row_indices(counter) = domain%elements(i)%e%connectivity(j)
                        col_indices(counter) = domain%elements(i)%e%connectivity(k)
                    end do
                end do
            end do
            do i = 1, num_sides
                local_nodes = domain%sides(i)%s%get_num_nodes()
                do j = 1, local_nodes
                    do k = 1, local_nodes
                        counter = counter + 1
                        row_indices(counter) = domain%sides(i)%s%connectivity(j)
                        col_indices(counter) = domain%sides(i)%s%connectivity(k)
                    end do
                end do
            end do
        end if

        ! --- 重複を削除し、最終的なCOO構造を構築 ---
        if (counter > 0) then
            ! Pack (row, col) into a single 64-bit integer for sorting
            call allocate_array(packed_indices, int(counter, kind=int64))
            do i = 1, counter
                packed_indices(i) = ishft(int(row_indices(i), int64), 32) + int(col_indices(i), int64)
            end do

            ! Sort the packed indices
            call unique(packed_indices, unique_packed_indices)

            ! --- COO配列を確保し、アンパックして格納 ---
            self%nnz = int(size(unique_packed_indices), kind=int32)
            call allocate_array(self%row, self%nnz)
            call allocate_array(self%col, self%nnz)
            call allocate_array(self%val, self%nnz)
            self%val(:) = 0.0d0

            do i = 1, self%nnz
                self%row(i) = int(ishft(unique_packed_indices(i), -32), kind=int32)
                self%col(i) = int(iand(unique_packed_indices(i), int(z'FFFFFFFF', int64)), kind=int32)
            end do

            ! --- 一時配列の解放 ---
            call deallocate_array(packed_indices)
            call deallocate_array(unique_packed_indices)
        end if

        ! Deallocate temporary arrays
        call deallocate_array(row_indices)
        call deallocate_array(col_indices)

    end subroutine initialize_type_coo