dyn_mpas_read_namelist Subroutine

private subroutine dyn_mpas_read_namelist(self, namelist_path, cf_calendar, start_date_time, stop_date_time, run_duration, initial_run)

This subroutine calls upstream MPAS functionality for reading its own namelist. After that, override designated namelist variables according to the information provided from CAM-SIMA.

Type Bound

mpas_dynamical_core_type

Arguments

Type IntentOptional Attributes Name
class(mpas_dynamical_core_type), intent(in) :: self
character(len=*), intent(in) :: namelist_path
character(len=*), intent(in) :: cf_calendar
integer, intent(in) :: start_date_time(6)
integer, intent(in) :: stop_date_time(6)
integer, intent(in) :: run_duration(4)
logical, intent(in) :: initial_run

Calls

proc~~dyn_mpas_read_namelist~~CallsGraph proc~dyn_mpas_read_namelist mpas_dynamical_core_type%dyn_mpas_read_namelist none~get_variable_pointer mpas_dynamical_core_type%get_variable_pointer proc~dyn_mpas_read_namelist->none~get_variable_pointer proc~dyn_mpas_debug_print mpas_dynamical_core_type%dyn_mpas_debug_print proc~dyn_mpas_read_namelist->proc~dyn_mpas_debug_print proc~stringify stringify proc~dyn_mpas_read_namelist->proc~stringify setup_namelist setup_namelist proc~dyn_mpas_read_namelist->setup_namelist proc~dyn_mpas_get_variable_pointer_c0 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_c0 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_c0 proc~dyn_mpas_get_variable_pointer_c1 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_c1 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_c1 proc~dyn_mpas_get_variable_pointer_i0 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_i0 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_i0 proc~dyn_mpas_get_variable_pointer_i1 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_i1 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_i1 proc~dyn_mpas_get_variable_pointer_i2 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_i2 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_i2 proc~dyn_mpas_get_variable_pointer_i3 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_i3 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_i3 proc~dyn_mpas_get_variable_pointer_l0 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_l0 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_l0 proc~dyn_mpas_get_variable_pointer_r0 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_r0 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_r0 proc~dyn_mpas_get_variable_pointer_r1 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_r1 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_r1 proc~dyn_mpas_get_variable_pointer_r2 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_r2 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_r2 proc~dyn_mpas_get_variable_pointer_r3 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_r3 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_r3 proc~dyn_mpas_get_variable_pointer_r4 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_r4 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_r4 proc~dyn_mpas_get_variable_pointer_r5 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_r5 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_r5 proc~dyn_mpas_debug_print->proc~stringify mpas_pool_get_array mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_c0->mpas_pool_get_array mpas_pool_get_config mpas_pool_get_config proc~dyn_mpas_get_variable_pointer_c0->mpas_pool_get_config proc~dyn_mpas_get_pool_pointer mpas_dynamical_core_type%dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_c0->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_c1->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_c1->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_i0->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_i0->mpas_pool_get_config mpas_pool_get_dimension mpas_pool_get_dimension proc~dyn_mpas_get_variable_pointer_i0->mpas_pool_get_dimension proc~dyn_mpas_get_variable_pointer_i0->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_i1->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_i1->mpas_pool_get_dimension proc~dyn_mpas_get_variable_pointer_i1->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_i2->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_i2->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_i3->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_i3->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_l0->mpas_pool_get_config proc~dyn_mpas_get_variable_pointer_l0->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r0->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_r0->mpas_pool_get_config proc~dyn_mpas_get_variable_pointer_r0->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r1->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_r1->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r2->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_r2->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r3->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_r3->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r4->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_r4->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r5->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_r5->proc~dyn_mpas_get_pool_pointer mpas_pool_get_subpool mpas_pool_get_subpool proc~dyn_mpas_get_pool_pointer->mpas_pool_get_subpool

Called by

proc~~dyn_mpas_read_namelist~~CalledByGraph proc~dyn_mpas_read_namelist mpas_dynamical_core_type%dyn_mpas_read_namelist proc~dyn_readnl dyn_readnl proc~dyn_readnl->proc~dyn_mpas_read_namelist

Variables

Type Visibility Attributes Name Initial
character(len=strkind), private, pointer :: config_pointer_c
logical, private, pointer :: config_pointer_l
integer, private :: ierr
character(len=strkind), private :: mpas_calendar
character(len=*), private, parameter :: subname = 'dyn_mpas_subdriver::dyn_mpas_read_namelist'

Source Code

    subroutine dyn_mpas_read_namelist(self, namelist_path, &
            cf_calendar, start_date_time, stop_date_time, run_duration, initial_run)
        class(mpas_dynamical_core_type), intent(in) :: self
        character(*), intent(in) :: namelist_path, cf_calendar
        integer, intent(in) :: start_date_time(6), & ! YYYY, MM, DD, hh, mm, ss.
                               stop_date_time(6),  & ! YYYY, MM, DD, hh, mm, ss.
                               run_duration(4)       ! DD, hh, mm, ss.
        logical, intent(in) :: initial_run

        character(*), parameter :: subname = 'dyn_mpas_subdriver::dyn_mpas_read_namelist'
        character(strkind) :: mpas_calendar
        character(strkind), pointer :: config_pointer_c
        integer :: ierr
        logical, pointer :: config_pointer_l

        call self % debug_print(log_level_debug, subname // ' entered')

        nullify(config_pointer_c)
        nullify(config_pointer_l)

        call self % debug_print(log_level_info, 'Reading namelist at "' // trim(adjustl(namelist_path)) // '"')

        ! Override namelist filename so that we can rely on upstream MPAS functionality for reading its own namelist.
        ! The case of missing namelist groups (i.e., `iostat == iostat_end` or `iostat == iostat_eor`) will be handled gracefully.
        ! All namelist variables will have reasonable default values even if they are missing.
        self % domain_ptr % namelist_filename = trim(adjustl(namelist_path))

        ierr = self % domain_ptr % core % setup_namelist( &
            self % domain_ptr % configs, self % domain_ptr % namelist_filename, self % domain_ptr % dminfo)

        if (ierr /= 0) then
            call self % model_error('Namelist setup failed for core ' // trim(self % domain_ptr % core % corename), &
                subname, __LINE__)
        end if

        ! Override designated namelist variables according to the information provided from CAM-SIMA.
        ! These include run-time settings that cannot be determined beforehand.

        call self % debug_print(log_level_info, 'Overriding designated namelist variables')

        ! CAM-SIMA seems to follow "NetCDF Climate and Forecast (CF) Metadata Conventions" for calendar names. See
        ! CF-1.12, section "4.4.2. Calendar", in doi:10.5281/zenodo.14275599.
        ! However, this is not the case for MPAS. Translate calendar names between CF and MPAS.
        select case (trim(adjustl(cf_calendar)))
            case ('360_day')
                mpas_calendar = '360day'
            case ('365_day', 'noleap')
                mpas_calendar = 'gregorian_noleap'
            case ('gregorian', 'standard')
                ! "gregorian" is a deprecated alternative name for "standard".
                mpas_calendar = 'gregorian'
            case default
                call self % model_error('Unsupported calendar type "' // trim(adjustl(cf_calendar)) // '"', &
                    subname, __LINE__)
        end select

        call self % get_variable_pointer(config_pointer_c, 'cfg', 'config_calendar_type')

        config_pointer_c = trim(adjustl(mpas_calendar))
        call self % debug_print(log_level_debug, 'config_calendar_type = ' // trim(config_pointer_c))
        nullify(config_pointer_c)

        ! MPAS represents date and time in ISO 8601 format. However, the separator between date and time is "_"
        ! instead of standard "T".
        ! Format in "YYYY-MM-DD_hh:mm:ss" is acceptable.
        call self % get_variable_pointer(config_pointer_c, 'cfg', 'config_start_time')

        config_pointer_c = stringify(start_date_time(1:3), '-') // '_' // stringify(start_date_time(4:6), ':')
        call self % debug_print(log_level_debug, 'config_start_time = ' // trim(config_pointer_c))
        nullify(config_pointer_c)

        call self % get_variable_pointer(config_pointer_c, 'cfg', 'config_stop_time')

        config_pointer_c = stringify(stop_date_time(1:3), '-') // '_' // stringify(stop_date_time(4:6), ':')
        call self % debug_print(log_level_debug, 'config_stop_time = ' // trim(config_pointer_c))
        nullify(config_pointer_c)

        ! Format in "DD_hh:mm:ss" is acceptable.
        call self % get_variable_pointer(config_pointer_c, 'cfg', 'config_run_duration')

        config_pointer_c = stringify([run_duration(1)]) // '_' // stringify(run_duration(2:4), ':')
        call self % debug_print(log_level_debug, 'config_run_duration = ' // trim(config_pointer_c))
        nullify(config_pointer_c)

        ! Reflect current run type to MPAS.
        call self % get_variable_pointer(config_pointer_l, 'cfg', 'config_do_restart')

        if (initial_run) then
            ! Run type is initial run.
            config_pointer_l = .false.
        else
            ! Run type is branch or restart run.
            config_pointer_l = .true.
        end if

        call self % debug_print(log_level_debug, 'config_do_restart = ' // stringify([config_pointer_l]))
        nullify(config_pointer_l)

        ! At this point, we should be ready to follow up with the rest of MPAS framework initialization
        ! in `dyn_mpas_init_phase2`.
        call self % debug_print(log_level_debug, subname // ' completed')
    end subroutine dyn_mpas_read_namelist