join Function

public function join(strings, delimiter) result(key)

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: strings(:)
character(len=*), intent(in), optional :: delimiter

Return Value character(len=:), allocatable


Called by

proc~~join~~CalledByGraph proc~join join proc~read_conditions_boundary_conditions read_conditions_boundary_conditions proc~read_conditions_boundary_conditions->proc~join proc~read_conditions_boundary_conditions_hydraulic read_conditions_boundary_conditions_hydraulic proc~read_conditions_boundary_conditions->proc~read_conditions_boundary_conditions_hydraulic proc~read_conditions_boundary_conditions_thermal read_conditions_boundary_conditions_thermal proc~read_conditions_boundary_conditions->proc~read_conditions_boundary_conditions_thermal proc~read_conditions_boundary_conditions_hydraulic->proc~join proc~read_conditions_boundary_conditions_thermal->proc~join proc~read_conditions_initial_conditions read_conditions_initial_conditions proc~read_conditions_initial_conditions->proc~join proc~read_conditions_initial_conditions_hydraulic read_conditions_initial_conditions_hydraulic proc~read_conditions_initial_conditions->proc~read_conditions_initial_conditions_hydraulic proc~read_conditions_initial_conditions_porosity read_conditions_initial_conditions_porosity proc~read_conditions_initial_conditions->proc~read_conditions_initial_conditions_porosity proc~read_conditions_initial_conditions_thermal read_conditions_initial_conditions_thermal proc~read_conditions_initial_conditions->proc~read_conditions_initial_conditions_thermal proc~read_conditions_initial_conditions_hydraulic->proc~join proc~read_conditions_initial_conditions_hydraulic->proc~read_conditions_boundary_conditions_hydraulic proc~read_conditions_initial_conditions_porosity->proc~join proc~read_conditions_initial_conditions_thermal->proc~join proc~read_conditions_initial_conditions_thermal->proc~read_conditions_boundary_conditions_thermal proc~read_conditions_time_control_boundary_time_points read_conditions_time_control_boundary_time_points proc~read_conditions_time_control_boundary_time_points->proc~join proc~read_conditions_time_control_simulation_period read_conditions_time_control_simulation_period proc~read_conditions_time_control_simulation_period->proc~join proc~read_conditions_time_control_time_stepping read_conditions_time_control_time_stepping proc~read_conditions_time_control_time_stepping->proc~join proc~read_output_settings_fields read_output_settings_fields proc~read_output_settings_fields->proc~join proc~read_output_settings_history read_output_settings_history proc~read_output_settings_history->proc~join proc~read_output_settings_standard read_output_settings_standard proc~read_output_settings_standard->proc~join proc~read_parameters_analysis_controls read_parameters_analysis_controls proc~read_parameters_analysis_controls->proc~join proc~read_parameters_geometry_settings read_parameters_geometry_settings proc~read_parameters_geometry_settings->proc~join proc~read_parameters_materials_basic read_parameters_materials_basic proc~read_parameters_materials_basic->proc~join proc~read_parameters_materials_hydrauilic read_parameters_materials_hydrauilic proc~read_parameters_materials_hydrauilic->proc~join proc~read_parameters_materials_wrf read_parameters_materials_wrf proc~read_parameters_materials_hydrauilic->proc~read_parameters_materials_wrf proc~read_parameters_materials_thermal read_parameters_materials_thermal proc~read_parameters_materials_thermal->proc~join proc~read_parameters_materials_thermal->proc~read_parameters_materials_wrf proc~read_parameters_materials_wrf->proc~join proc~read_parameters_simulation_settings read_parameters_simulation_settings proc~read_parameters_simulation_settings->proc~join proc~read_parameters_solver_parallel_settings read_parameters_solver_parallel_settings proc~read_parameters_solver_parallel_settings->proc~join proc~read_parameters_solver_settings read_parameters_solver_settings proc~read_parameters_solver_settings->proc~join proc~read_parameters_solver_settings->proc~read_parameters_solver_parallel_settings proc~read_parameters_solver_settings_linear read_parameters_solver_settings_linear proc~read_parameters_solver_settings->proc~read_parameters_solver_settings_linear proc~read_parameters_solver_settings_nonlinear read_parameters_solver_settings_nonlinear proc~read_parameters_solver_settings->proc~read_parameters_solver_settings_nonlinear proc~read_parameters_solver_settings_linear->proc~join proc~read_parameters_solver_settings_linear_local read_parameters_solver_settings_linear_local proc~read_parameters_solver_settings_linear->proc~read_parameters_solver_settings_linear_local proc~read_parameters_solver_settings_linear_local->proc~join proc~read_parameters_solver_settings_nonlinear->proc~join proc~read_parameters_solver_settings_nonlinear_convergence read_parameters_solver_settings_nonlinear_convergence proc~read_parameters_solver_settings_nonlinear->proc~read_parameters_solver_settings_nonlinear_convergence proc~read_parameters_solver_settings_nonlinear_convergence->proc~join proc~inout_read_basic_parameters inout_read_basic_parameters proc~inout_read_basic_parameters->proc~read_parameters_analysis_controls proc~inout_read_basic_parameters->proc~read_parameters_geometry_settings proc~inout_read_basic_parameters->proc~read_parameters_simulation_settings proc~inout_read_basic_parameters->proc~read_parameters_solver_settings proc~read_parameters_materials read_parameters_materials proc~inout_read_basic_parameters->proc~read_parameters_materials proc~inout_read_conditions inout_read_conditions proc~inout_read_conditions->proc~read_conditions_boundary_conditions proc~inout_read_conditions->proc~read_conditions_initial_conditions proc~read_conditions_time_control read_conditions_time_control proc~inout_read_conditions->proc~read_conditions_time_control proc~inout_read_output_settings inout_read_output_settings proc~inout_read_output_settings->proc~read_output_settings_fields proc~inout_read_output_settings->proc~read_output_settings_history proc~inout_read_output_settings->proc~read_output_settings_standard proc~read_conditions_time_control->proc~read_conditions_time_control_boundary_time_points proc~read_conditions_time_control->proc~read_conditions_time_control_simulation_period proc~read_conditions_time_control->proc~read_conditions_time_control_time_stepping proc~read_parameters_materials->proc~read_parameters_materials_basic proc~read_parameters_materials->proc~read_parameters_materials_hydrauilic proc~read_parameters_materials->proc~read_parameters_materials_thermal interface~inout_read_basic_parameters type_input%inout_read_basic_parameters interface~inout_read_basic_parameters->proc~inout_read_basic_parameters interface~inout_read_conditions type_input%inout_read_conditions interface~inout_read_conditions->proc~inout_read_conditions interface~inout_read_output_settings type_input%inout_read_output_settings interface~inout_read_output_settings->proc~inout_read_output_settings proc~initialize_type_input type_input%initialize_type_input proc~initialize_type_input->interface~inout_read_basic_parameters proc~initialize_type_input->interface~inout_read_conditions proc~initialize_type_input->interface~inout_read_output_settings

Source Code

    function join(strings, delimiter) result(key)
        character(*), intent(in) :: strings(:)
        character(*), intent(in), optional :: delimiter
        character(:), allocatable :: key

        integer(int32) :: i, n, total_len, current_pos
        integer(int32) :: length_delimiter, length_strings
        character(len=1) :: write_delimiter

        if (present(delimiter)) then
            length_delimiter = 0
            length_delimiter = len_trim(delimiter)
            write_delimiter = trim(adjustl(delimiter))
        else
            length_delimiter = 1
            write_delimiter = "."
        end if

        n = size(strings)
        if (n == 0) then
            key = ""
            return
        end if

        ! 1. 連結後の全体の長さを計算する
        total_len = len_trim(strings(1))
        do i = 2, n
            total_len = total_len + length_delimiter + len_trim(strings(i))
        end do

        ! 2. 計算した長さでメモリを一度だけ確保する
        allocate (character(len=total_len) :: key)

        ! 3. 確保したメモリに文字列を直接書き込んでいく
        current_pos = 1

        length_strings = len_trim(strings(1))
        key(current_pos:current_pos + length_strings - 1) = trim(adjustl(strings(1)))
        current_pos = current_pos + length_strings

        ! 2番目以降の要素
        do i = 2, n
            key(current_pos:current_pos + length_delimiter - 1) = write_delimiter
            current_pos = current_pos + length_delimiter

            length_strings = len_trim(strings(i))
            if (length_strings == 0) cycle ! 空の文字列はスキップ

            key(current_pos:current_pos + length_strings - 1) = trim(adjustl(strings(i)))
            current_pos = current_pos + length_strings
        end do

    end function join