inout_read_geometry Module Subroutine

module subroutine inout_read_geometry(self)

Load the geometry and any required initial condition fields from the VTK/VTU file

Arguments

Type IntentOptional Attributes Name
class(type_input), intent(inout) :: self

Calls

proc~~inout_read_geometry~~CallsGraph proc~inout_read_geometry inout_read_geometry ends_with ends_with proc~inout_read_geometry->ends_with proc~error_message error_message proc~inout_read_geometry->proc~error_message proc~type_vtk_vtk_initialize type_vtk%type_vtk_vtk_initialize proc~inout_read_geometry->proc~type_vtk_vtk_initialize proc~type_vtk_vtu_initialize type_vtk%type_vtk_vtu_initialize proc~inout_read_geometry->proc~type_vtk_vtu_initialize log_error log_error proc~error_message->log_error interface~allocate_array allocate_array proc~type_vtk_vtk_initialize->interface~allocate_array interface~deallocate_array deallocate_array proc~type_vtk_vtk_initialize->interface~deallocate_array interface~vtk_finalize vtk_finalize proc~type_vtk_vtk_initialize->interface~vtk_finalize interface~vtk_get_cell_ids vtk_get_cell_ids proc~type_vtk_vtk_initialize->interface~vtk_get_cell_ids interface~vtk_get_cell_info vtk_get_cell_info proc~type_vtk_vtk_initialize->interface~vtk_get_cell_info interface~vtk_get_num_cells vtk_get_num_cells proc~type_vtk_vtk_initialize->interface~vtk_get_num_cells interface~vtk_get_num_points vtk_get_num_points proc~type_vtk_vtk_initialize->interface~vtk_get_num_points interface~vtk_get_point_data vtk_get_point_data proc~type_vtk_vtk_initialize->interface~vtk_get_point_data interface~vtk_get_points vtk_get_points proc~type_vtk_vtk_initialize->interface~vtk_get_points interface~vtk_get_total_connectivity_size vtk_get_total_connectivity_size proc~type_vtk_vtk_initialize->interface~vtk_get_total_connectivity_size interface~vtk_initialize vtk_initialize proc~type_vtk_vtk_initialize->interface~vtk_initialize interface~vtk_read_header vtk_read_header proc~type_vtk_vtk_initialize->interface~vtk_read_header proc~type_dp_3d_initialize type_dp_3d%type_dp_3d_initialize proc~type_vtk_vtk_initialize->proc~type_dp_3d_initialize proc~type_vtk_cell_set type_vtk_cell%type_vtk_cell_set proc~type_vtk_vtk_initialize->proc~type_vtk_cell_set proc~type_vtk_vtu_initialize->interface~allocate_array proc~type_vtk_vtu_initialize->interface~deallocate_array interface~vtu_finalize vtu_finalize proc~type_vtk_vtu_initialize->interface~vtu_finalize interface~vtu_get_cell_ids vtu_get_cell_ids proc~type_vtk_vtu_initialize->interface~vtu_get_cell_ids interface~vtu_get_cell_info vtu_get_cell_info proc~type_vtk_vtu_initialize->interface~vtu_get_cell_info interface~vtu_get_num_cells vtu_get_num_cells proc~type_vtk_vtu_initialize->interface~vtu_get_num_cells interface~vtu_get_num_points vtu_get_num_points proc~type_vtk_vtu_initialize->interface~vtu_get_num_points interface~vtu_get_point_data vtu_get_point_data proc~type_vtk_vtu_initialize->interface~vtu_get_point_data interface~vtu_get_points vtu_get_points proc~type_vtk_vtu_initialize->interface~vtu_get_points interface~vtu_get_total_connectivity_size vtu_get_total_connectivity_size proc~type_vtk_vtu_initialize->interface~vtu_get_total_connectivity_size interface~vtu_initialize vtu_initialize proc~type_vtk_vtu_initialize->interface~vtu_initialize interface~vtu_read_header vtu_read_header proc~type_vtk_vtu_initialize->interface~vtu_read_header proc~type_vtk_vtu_initialize->proc~type_dp_3d_initialize proc~type_vtk_vtu_initialize->proc~type_vtk_cell_set 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~type_dp_3d_initialize->interface~allocate_array 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

Called by

proc~~inout_read_geometry~~CalledByGraph proc~inout_read_geometry inout_read_geometry interface~inout_read_geometry type_input%inout_read_geometry interface~inout_read_geometry->proc~inout_read_geometry proc~initialize_type_input type_input%initialize_type_input proc~initialize_type_input->interface~inout_read_geometry

Source Code

    module subroutine inout_read_geometry(self)
        !> Load the geometry and any required initial condition fields from the VTK/VTU file
        implicit none
        class(type_input), intent(inout) :: self

        ! --- ローカル変数 ---
        ! 読み込むべきフィールド名を一時的に格納するリスト
        character(:), allocatable, dimension(:) :: fields_to_read
        ! 読み込むフィールドの数をカウント
        integer :: num_fields_to_read
        ! 重複を避けつつフィールド名を集めるための一時的な固定長配列
        character(len=256), dimension(3) :: tmp_field_list
        integer :: i

        !----------------------------------------------------------------!
        ! 1. 初期条件の設定をチェックし、ファイルから読み込むべきフィールド名を集める
        !----------------------------------------------------------------!
        num_fields_to_read = 0

        ! 熱の初期条件をチェック
        if (allocated(self%conditions%initial_conditions%thermal%type)) then
            if (self%conditions%initial_conditions%thermal%type == "file") then
                if (allocated(self%conditions%initial_conditions%thermal%field_name)) then
                    num_fields_to_read = num_fields_to_read + 1
                    tmp_field_list(num_fields_to_read) = self%conditions%initial_conditions%thermal%field_name
                end if
            end if
        end if

        ! 水理の初期条件をチェック
        if (allocated(self%conditions%initial_conditions%hydraulic%type)) then
            if (self%conditions%initial_conditions%hydraulic%type == "file") then
                if (allocated(self%conditions%initial_conditions%hydraulic%field_name)) then
                    ! 重複を避ける
                    if (num_fields_to_read > 0) then
                        if (trim(tmp_field_list(1)) /= trim(self%conditions%initial_conditions%hydraulic%field_name)) then
                            num_fields_to_read = num_fields_to_read + 1
                            tmp_field_list(num_fields_to_read) = self%conditions%initial_conditions%hydraulic%field_name
                        end if
                    else
                        num_fields_to_read = num_fields_to_read + 1
                        tmp_field_list(num_fields_to_read) = self%conditions%initial_conditions%hydraulic%field_name
                    end if
                end if
            end if
        end if

        !----------------------------------------------------------------!
        ! 2. 読み込むべきフィールドがあれば、それを渡してジオメトリリーダーを呼び出す
        !----------------------------------------------------------------!
        if (num_fields_to_read > 0) then
            ! 渡すための可変長配列を確保
            allocate (character(len=256) :: fields_to_read(num_fields_to_read))
            do i = 1, num_fields_to_read
                fields_to_read(i) = trim(tmp_field_list(i))
            end do

            ! ファイルの拡張子に応じて適切なリーダーを呼び出す
            if (ends_with(self%geometry_file_name, '.vtk')) then
                ! field_names と field_values を渡して初期化
                call self%geometry%vtk%initialize_vtk(self%geometry_file_name, &
                                                      self%basic%geometry_settings%cell_id_array_name, &
                                                      field_names=fields_to_read, &
                                                      field_values=self%geometry%initial_values)
            else if (ends_with(self%geometry_file_name, '.vtu')) then
                call self%geometry%vtk%initialize_vtu(self%geometry_file_name, &
                                                      self%basic%geometry_settings%cell_id_array_name, &
                                                      field_names=fields_to_read, &
                                                      field_values=self%geometry%initial_values)
            else
                call error_message(906, c_opt=self%geometry_file_name)
            end if

            ! 読み込んだフィールド名を後で参照できるように保存
            allocate (self%geometry%point_data_names, source=fields_to_read)
            deallocate (fields_to_read)

        else
            ! 読み込むべきフィールドがない場合は、通常通りジオメトリだけを読み込む
            if (ends_with(self%geometry_file_name, '.vtk')) then
                call self%geometry%vtk%initialize_vtk(self%geometry_file_name, self%basic%geometry_settings%cell_id_array_name)
            else if (ends_with(self%geometry_file_name, '.vtu')) then
                call self%geometry%vtk%initialize_vtu(self%geometry_file_name, self%basic%geometry_settings%cell_id_array_name)
            else
                call error_message(906, c_opt=self%geometry_file_name)
            end if
        end if

        ! debug
        ! print *, "Geometry file read successfully:", self%geometry_file_name
        ! print *, "Number of initial condition fields read:", size(self%geometry%point_data_names)
        ! if (allocated(self%geometry%point_data_names)) then
        !     print *, "Fields:", self%geometry%point_data_names
        ! else
        !     print *, "No initial condition fields read."
        ! end if
        ! print *, "Total number of cells in geometry:", self%geometry%vtk%num_total_cells
        ! print *, "Total number of points in geometry:", self%geometry%vtk%num_points
        ! print *, "Geometry initialization complete."
        ! if (allocated(self%geometry%initial_values)) then
        !     print *, "Initial values array size:", size(self%geometry%initial_values)
        ! else
        !     print *, "No initial values array allocated."
        ! end if
        ! stop

    end subroutine inout_read_geometry