dyn_mpas_compute_unit_vector Subroutine

private subroutine dyn_mpas_compute_unit_vector(self)

Uses

    • mpas_vector_operations
    • mpas_derived_types
  • proc~~dyn_mpas_compute_unit_vector~~UsesGraph proc~dyn_mpas_compute_unit_vector mpas_dynamical_core_type%dyn_mpas_compute_unit_vector mpas_derived_types mpas_derived_types proc~dyn_mpas_compute_unit_vector->mpas_derived_types mpas_vector_operations mpas_vector_operations proc~dyn_mpas_compute_unit_vector->mpas_vector_operations

This subroutine computes the local east and north unit vectors at all cells, storing the results in MPAS "mesh" pool as the "east" and "north" variables, respectively. It also computes the edge-normal unit vectors at all edges by calling mpas_initialize_vectors. Before calling this subroutine, MPAS "mesh" pool must contain the "latCell" and "lonCell" variables that are valid for all cells (not just solve cells), plus any additional variables that are required by mpas_initialize_vectors. For stand-alone MPAS, the whole deal is handled by init_dirs_forphys during physics initialization. However, MPAS as a dynamical core does not have physics, hence the existence of this subroutine. Ported and refactored for CAM-SIMA. (KCW, 2024-04-23)

Type Bound

mpas_dynamical_core_type

Arguments

Type IntentOptional Attributes Name
class(mpas_dynamical_core_type), intent(in) :: self

Calls

proc~~dyn_mpas_compute_unit_vector~~CallsGraph proc~dyn_mpas_compute_unit_vector mpas_dynamical_core_type%dyn_mpas_compute_unit_vector mpas_initialize_vectors mpas_initialize_vectors proc~dyn_mpas_compute_unit_vector->mpas_initialize_vectors none~get_variable_pointer mpas_dynamical_core_type%get_variable_pointer proc~dyn_mpas_compute_unit_vector->none~get_variable_pointer proc~dyn_mpas_debug_print mpas_dynamical_core_type%dyn_mpas_debug_print proc~dyn_mpas_compute_unit_vector->proc~dyn_mpas_debug_print proc~dyn_mpas_get_pool_pointer mpas_dynamical_core_type%dyn_mpas_get_pool_pointer proc~dyn_mpas_compute_unit_vector->proc~dyn_mpas_get_pool_pointer 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~stringify stringify proc~dyn_mpas_debug_print->proc~stringify mpas_pool_get_subpool mpas_pool_get_subpool proc~dyn_mpas_get_pool_pointer->mpas_pool_get_subpool proc~dyn_mpas_get_variable_pointer_c0->proc~dyn_mpas_get_pool_pointer 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_variable_pointer_c1->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_c1->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_i0->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_i1->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_i2->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_i2->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_i3->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_i3->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_l0->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_l0->mpas_pool_get_config proc~dyn_mpas_get_variable_pointer_r0->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_r1->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r1->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_r2->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r2->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_r3->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r3->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_r4->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r4->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_r5->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r5->mpas_pool_get_array

Called by

proc~~dyn_mpas_compute_unit_vector~~CalledByGraph proc~dyn_mpas_compute_unit_vector mpas_dynamical_core_type%dyn_mpas_compute_unit_vector proc~model_grid_init model_grid_init proc~model_grid_init->proc~dyn_mpas_compute_unit_vector

Variables

Type Visibility Attributes Name Initial
real(kind=rkind), private, pointer :: east(:,:)
integer, private :: i
real(kind=rkind), private, pointer :: latcell(:)
real(kind=rkind), private, pointer :: loncell(:)
type(mpas_pool_type), private, pointer :: mpas_pool
integer, private, pointer :: ncells
real(kind=rkind), private, pointer :: north(:,:)
character(len=*), private, parameter :: subname = 'dyn_mpas_subdriver::dyn_mpas_compute_unit_vector'

Source Code

    subroutine dyn_mpas_compute_unit_vector(self)
        ! Module(s) from MPAS.
        use mpas_derived_types, only: mpas_pool_type
        use mpas_vector_operations, only: mpas_initialize_vectors

        class(mpas_dynamical_core_type), intent(in) :: self

        character(*), parameter :: subname = 'dyn_mpas_subdriver::dyn_mpas_compute_unit_vector'
        integer :: i
        integer, pointer :: ncells
        real(rkind), pointer :: latcell(:), loncell(:)
        real(rkind), pointer :: east(:, :), north(:, :)
        type(mpas_pool_type), pointer :: mpas_pool

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

        nullify(ncells)
        nullify(latcell, loncell)

        nullify(east, north)

        nullify(mpas_pool)

        ! Input.
        call self % get_variable_pointer(ncells, 'dim', 'nCells')
        call self % get_variable_pointer(latcell, 'mesh', 'latCell')
        call self % get_variable_pointer(loncell, 'mesh', 'lonCell')

        ! Output.
        call self % get_variable_pointer(east, 'mesh', 'east')
        call self % get_variable_pointer(north, 'mesh', 'north')

        call self % debug_print(log_level_info, 'Computing unit vectors')

        do i = 1, ncells
            east(1, i) = -sin(loncell(i))
            east(2, i) =  cos(loncell(i))
            east(3, i) =  0.0_rkind
            ! `r3_normalize` has been inlined below.
            east(1:3, i) = east(1:3, i) / sqrt(sum(east(1:3, i) * east(1:3, i)))

            north(1, i) = -cos(loncell(i)) * sin(latcell(i))
            north(2, i) = -sin(loncell(i)) * sin(latcell(i))
            north(3, i) =  cos(latcell(i))
            ! `r3_normalize` has been inlined below.
            north(1:3, i) = north(1:3, i) / sqrt(sum(north(1:3, i) * north(1:3, i)))
        end do

        nullify(ncells)
        nullify(latcell, loncell)

        nullify(east, north)

        call self % get_pool_pointer(mpas_pool, 'mesh')
        call mpas_initialize_vectors(mpas_pool)

        nullify(mpas_pool)

        call self % debug_print(log_level_debug, subname // ' completed')
    end subroutine dyn_mpas_compute_unit_vector