parse_stream_name Function

private pure function parse_stream_name(stream_name) result(var_info_list)

Uses

  • proc~~parse_stream_name~~UsesGraph proc~parse_stream_name parse_stream_name module~dyn_mpas_procedures dyn_mpas_procedures proc~parse_stream_name->module~dyn_mpas_procedures

Parse a stream name, which consists of one or more stream name fragments, and return the corresponding variable information as a list of var_info_type. Multiple stream name fragments should be separated by "+" (i.e., a plus, meaning "addition" operation) or "-" (i.e., a minus, meaning "subtraction" operation). A stream name fragment can be a predefined stream name (e.g., "invariant", "input", etc.) or a single variable name. For example, a stream name of "invariant+input+restart" means the union of variables in the "invariant", "input", and "restart" streams. Duplicate variable information in the resulting list is discarded. (KCW, 2024-06-01)

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: stream_name

Return Value type(var_info_type), allocatable, (:)


Calls

proc~~parse_stream_name~~CallsGraph proc~parse_stream_name parse_stream_name interface~tokenize tokenize proc~parse_stream_name->interface~tokenize proc~index_unique index_unique proc~parse_stream_name->proc~index_unique proc~parse_stream_name_fragment parse_stream_name_fragment proc~parse_stream_name->proc~parse_stream_name_fragment proc~tokenize_into_first_last tokenize_into_first_last interface~tokenize->proc~tokenize_into_first_last proc~tokenize_into_tokens_separator tokenize_into_tokens_separator interface~tokenize->proc~tokenize_into_tokens_separator proc~split split proc~tokenize_into_first_last->proc~split proc~tokenize_into_tokens_separator->interface~tokenize interface~clamp clamp proc~split->interface~clamp proc~clamp_int32 clamp_int32 interface~clamp->proc~clamp_int32 proc~clamp_int64 clamp_int64 interface~clamp->proc~clamp_int64 proc~clamp_real32 clamp_real32 interface~clamp->proc~clamp_real32 proc~clamp_real64 clamp_real64 interface~clamp->proc~clamp_real64

Called by

proc~~parse_stream_name~~CalledByGraph proc~parse_stream_name parse_stream_name proc~dyn_mpas_init_stream_with_pool mpas_dynamical_core_type%dyn_mpas_init_stream_with_pool proc~dyn_mpas_init_stream_with_pool->proc~parse_stream_name proc~dyn_mpas_read_write_stream mpas_dynamical_core_type%dyn_mpas_read_write_stream proc~dyn_mpas_read_write_stream->proc~parse_stream_name proc~dyn_mpas_read_write_stream->proc~dyn_mpas_init_stream_with_pool proc~dyn_init dyn_init proc~dyn_init->proc~dyn_mpas_read_write_stream proc~dyn_variable_dump dyn_variable_dump proc~dyn_variable_dump->proc~dyn_mpas_read_write_stream proc~model_grid_init model_grid_init proc~model_grid_init->proc~dyn_mpas_read_write_stream interface~dyn_init dyn_init interface~dyn_init->proc~dyn_init interface~model_grid_init model_grid_init interface~model_grid_init->proc~model_grid_init proc~dyn_final dyn_final proc~dyn_final->proc~dyn_variable_dump interface~dyn_final dyn_final interface~dyn_final->proc~dyn_final proc~stepon_final stepon_final proc~stepon_final->interface~dyn_final

Variables

Type Visibility Attributes Name Initial
integer, private :: i
integer, private :: j
character(len=:), private, allocatable :: stream_name_fragment(:)
character(len=:), private, allocatable :: stream_name_operator(:)
character(len=*), private, parameter :: supported_stream_name_operator = '+-'
type(var_info_type), private, allocatable :: var_info_list_buffer(:)
character(len=len(invariant_var_info_list%name)), private, allocatable :: var_name_list(:)

Source Code

    pure function parse_stream_name(stream_name) result(var_info_list)
        ! Module(s) from MPAS.
        use dyn_mpas_procedures, only: index_unique, tokenize

        character(*), intent(in) :: stream_name
        type(var_info_type), allocatable :: var_info_list(:)

        character(*), parameter :: supported_stream_name_operator = '+-'
        character(:), allocatable :: stream_name_fragment(:), stream_name_operator(:)
        character(len(invariant_var_info_list % name)), allocatable :: var_name_list(:)
        integer :: i, j
        type(var_info_type), allocatable :: var_info_list_buffer(:)

        call tokenize(stream_name, supported_stream_name_operator, stream_name_fragment, stream_name_operator)

        var_info_list = parse_stream_name_fragment(stream_name_fragment(1))

        do i = 2, size(stream_name_fragment)
            ! Process the stream name fragment according to the operator.
            var_info_list_buffer = parse_stream_name_fragment(stream_name_fragment(i))

            if (size(var_info_list_buffer) > 0) then
                select case (stream_name_operator(i - 1))
                    case ('+')
                        var_info_list = [var_info_list, var_info_list_buffer]
                    case ('-')
                        do j = 1, size(var_info_list_buffer)
                            var_name_list = var_info_list % name
                            var_info_list = pack(var_info_list, var_name_list /= var_info_list_buffer(j) % name)
                        end do
                    case default
                        ! Do nothing for unknown operators. Should not happen at all.
                end select
            end if
        end do

        ! Discard duplicate variable information by names.
        var_name_list = var_info_list % name
        var_info_list = var_info_list(index_unique(var_name_list))
    end function parse_stream_name