init_reference_pressure Subroutine

private subroutine init_reference_pressure()

Uses

    • cam_logfile
    • cam_history_support
    • ref_pres
    • std_atm_profile
    • string_utils
    • cam_abortutils
    • dynconst
    • shr_kind_mod
    • dyn_comp
    • vert_coord
    • dyn_mpas_subdriver
  • proc~~init_reference_pressure~~UsesGraph proc~init_reference_pressure init_reference_pressure cam_abortutils cam_abortutils proc~init_reference_pressure->cam_abortutils cam_history_support cam_history_support proc~init_reference_pressure->cam_history_support cam_logfile cam_logfile proc~init_reference_pressure->cam_logfile dynconst dynconst proc~init_reference_pressure->dynconst module~dyn_comp dyn_comp proc~init_reference_pressure->module~dyn_comp module~dyn_mpas_subdriver dyn_mpas_subdriver proc~init_reference_pressure->module~dyn_mpas_subdriver ref_pres ref_pres proc~init_reference_pressure->ref_pres shr_kind_mod shr_kind_mod proc~init_reference_pressure->shr_kind_mod std_atm_profile std_atm_profile proc~init_reference_pressure->std_atm_profile string_utils string_utils proc~init_reference_pressure->string_utils vert_coord vert_coord proc~init_reference_pressure->vert_coord module~dyn_comp->module~dyn_mpas_subdriver iso_fortran_env iso_fortran_env module~dyn_mpas_subdriver->iso_fortran_env mpas_derived_types mpas_derived_types module~dyn_mpas_subdriver->mpas_derived_types mpas_kind_types mpas_kind_types module~dyn_mpas_subdriver->mpas_kind_types mpi mpi module~dyn_mpas_subdriver->mpi

Initialize reference pressure for use by physics. (KCW, 2024-03-25)

Arguments

None

Calls

proc~~init_reference_pressure~~CallsGraph proc~init_reference_pressure init_reference_pressure add_vert_coord add_vert_coord proc~init_reference_pressure->add_vert_coord check_allocate check_allocate proc~init_reference_pressure->check_allocate none~get_variable_pointer mpas_dynamical_core_type%get_variable_pointer proc~init_reference_pressure->none~get_variable_pointer proc~dyn_debug_print dyn_debug_print proc~init_reference_pressure->proc~dyn_debug_print ref_pres_init ref_pres_init proc~init_reference_pressure->ref_pres_init std_atm_pres std_atm_pres proc~init_reference_pressure->std_atm_pres stringify stringify proc~init_reference_pressure->stringify 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_debug_print->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~~init_reference_pressure~~CalledByGraph proc~init_reference_pressure init_reference_pressure proc~model_grid_init model_grid_init proc~model_grid_init->proc~init_reference_pressure

Variables

Type Visibility Attributes Name Initial
real(kind=kind_r8), private, allocatable :: dzw(:)
integer, private :: ierr
integer, private :: k
integer, private :: l
integer, private, parameter :: num_pure_p_lev = 0
real(kind=kind_r8), private, allocatable :: p_ref_int(:)
real(kind=kind_r8), private, allocatable :: p_ref_mid(:)
real(kind=kind_dyn_mpas), private, pointer :: rdzw(:)
character(len=*), private, parameter :: subname = 'dyn_grid::init_reference_pressure'
real(kind=kind_r8), private, pointer :: zu(:)
real(kind=kind_r8), private, pointer :: zw(:)

Source Code

    subroutine init_reference_pressure()
        ! Module(s) from CAM-SIMA.
        use cam_abortutils, only: check_allocate
        use cam_history_support, only: add_vert_coord
        use cam_logfile, only: debugout_debug, debugout_verbose
        use dyn_comp, only: dyn_debug_print, mpas_dynamical_core
        use dynconst, only: constant_p0 => pref
        use ref_pres, only: ref_pres_init
        use std_atm_profile, only: std_atm_pres
        use string_utils, only: stringify
        use vert_coord, only: pver, pverp
        ! Module(s) from CESM Share.
        use shr_kind_mod, only: kind_r8 => shr_kind_r8
        ! Module(s) from MPAS.
        use dyn_mpas_subdriver, only: kind_dyn_mpas => mpas_dynamical_core_real_kind

        character(*), parameter :: subname = 'dyn_grid::init_reference_pressure'
        ! Number of pure pressure levels at model top.
        integer, parameter :: num_pure_p_lev = 0
        integer :: ierr
        integer :: k, l
        ! Reference pressure (Pa) at layer interfaces and midpoints.
        real(kind_r8), allocatable :: p_ref_int(:)
        real(kind_r8), allocatable :: p_ref_mid(:)
        ! In MPAS, the vertical coordinate is denoted as lowercase "zeta", a Greek alphabet.
        ! `zu` denotes zeta at u-wind levels (i.e., at layer midpoints).
        ! `zw` denotes zeta at w-wind levels (i.e., at layer interfaces).
        ! `dzw` denotes the delta/difference between `zw`.
        ! `rdzw` denotes the reciprocal of `dzw`.
        real(kind_r8), allocatable :: dzw(:)
        real(kind_dyn_mpas), pointer :: rdzw(:)
        real(kind_r8), pointer :: zu(:) ! CANNOT be safely deallocated because `add_vert_coord`
                                        ! just uses pointers to point at it internally.
        real(kind_r8), pointer :: zw(:) ! CANNOT be safely deallocated because `add_vert_coord`
                                        ! just uses pointers to point at it internally.

        call dyn_debug_print(debugout_debug, subname // ' entered')

        nullify(rdzw)
        nullify(zu)
        nullify(zw)

        ! Compute reference height.
        call mpas_dynamical_core % get_variable_pointer(rdzw, 'mesh', 'rdzw')

        allocate(dzw(pver), stat=ierr)
        call check_allocate(ierr, subname, 'dzw(pver)', 'dyn_grid', __LINE__)

        dzw(:) = 1.0_kind_r8 / real(rdzw(:), kind_r8)

        nullify(rdzw)

        allocate(zw(pverp), stat=ierr)
        call check_allocate(ierr, subname, 'zw(pverp)', 'dyn_grid', __LINE__)
        allocate(zu(pver), stat=ierr)
        call check_allocate(ierr, subname, 'zu(pver)', 'dyn_grid', __LINE__)

        ! In MPAS, zeta coordinates are stored in increasing order (i.e., bottom to top of atmosphere).
        ! In CAM-SIMA, however, index order is reversed (i.e., top to bottom of atmosphere).
        ! Compute in reverse below.
        zw(pverp) = 0.0_kind_r8

        do k = pver, 1, -1
            zw(k) = zw(k + 1) + dzw(pver - k + 1)
            zu(k) = 0.5_kind_r8 * (zw(k + 1) + zw(k))
        end do

        deallocate(dzw)

        ! Register zeta coordinates with history.
        call add_vert_coord('ilev', pverp, 'Height (zeta) level at layer interfaces', 'm', zw, &
            positive='up')
        call add_vert_coord('lev', pver, 'Height (zeta) level at layer midpoints', 'm', zu, &
            positive='up')

        ! Compute reference pressure from reference height.
        allocate(p_ref_int(pverp), stat=ierr)
        call check_allocate(ierr, subname, 'p_ref_int(pverp)', 'dyn_grid', __LINE__)

        call std_atm_pres(zw, p_ref_int, user_specified_ps=constant_p0)

        allocate(p_ref_mid(pver), stat=ierr)
        call check_allocate(ierr, subname, 'p_ref_mid(pver)', 'dyn_grid', __LINE__)

        p_ref_mid(:) = 0.5_kind_r8 * (p_ref_int(1:pver) + p_ref_int(2:pverp))

        ! Print a nice table of reference height and pressure.
        call dyn_debug_print(debugout_verbose, 'Reference layer information:')
        call dyn_debug_print(debugout_verbose, '----- | -------------- | --------------')
        call dyn_debug_print(debugout_verbose, 'Index |     Height (m) | Pressure (hPa)')

        do k = 1, pver
            call dyn_debug_print(debugout_verbose, repeat('-', 5) // ' |  ' // stringify([zw(k)]) // &
                ' |  ' // stringify([p_ref_int(k) / 100.0_kind_r8]))

            l = len(stringify([k]))

            call dyn_debug_print(debugout_verbose, repeat(' ', 5 - l) // stringify([k]) // ' |  ' // stringify([zu(k)]) // &
                ' |  ' // stringify([p_ref_mid(k) / 100.0_kind_r8]))
        end do

        k = pverp

        call dyn_debug_print(debugout_verbose, repeat('-', 5) // ' |  ' // stringify([zw(k)]) // &
            ' |  ' // stringify([p_ref_int(k) / 100.0_kind_r8]))

        call ref_pres_init(p_ref_int, p_ref_mid, num_pure_p_lev)

        deallocate(p_ref_int)
        deallocate(p_ref_mid)

        nullify(zu)
        nullify(zw)

        call dyn_debug_print(debugout_debug, subname // ' completed')
    end subroutine init_reference_pressure