metrics_fill_coriolis Subroutine

public subroutine metrics_fill_coriolis(this, scheme, f_0, beta, y_ref, omega, grid, f_corner, f_centre)

Fill a corner array AND a centre array with the Coriolis parameter, from one of two schemes (D7). Does NOT touch any existing fill sites in coriolis_adv / EPBL / kappa-shear (that re-routing is M2d); this routine just exists + is tested.

beta_plane : f = f_0 + beta(y - y_ref), y from the GLOBAL CARTESIAN coordinate. On an undecomposed grid (grid%j_offset_global == 0) the corner fill is BIT-IDENTICAL to coriolis_adv_set_beta_plane (y = (j-1-nghost)dy, raw f) and the centre fill is BIT-IDENTICAL to the EPBL / kappa-shear set_f_centre (y = (j-nghost-0.5)dy, abs(f)). Under MPI y-decomposition grid%j_offset_global shifts the local index to the GLOBAL row so each rank’s beta-plane y is correct. planetary : f = 2omega*sin(geolat) at the respective stagger — uses this%geolatBu (corner) and this%geolatT (centre), so a spherical generator must have run first.

f_corner is shaped (nx+1,ny+1) (like the metric corner arrays / coriolis_adv%f_corner); f_centre is (nx,ny).

Arguments

Type IntentOptional Attributes Name
type(ocean_metrics_t), intent(in) :: this
integer, intent(in) :: scheme
real(kind=wp), intent(in) :: f_0
real(kind=wp), intent(in) :: beta
real(kind=wp), intent(in) :: y_ref
real(kind=wp), intent(in) :: omega
type(hgrid_t), intent(in) :: grid
real(kind=wp), intent(out) :: f_corner(:,:)

Coriolis at C-grid corners (1/s).

real(kind=wp), intent(out) :: f_centre(:,:)

|Coriolis| at cell centres (1/s).


Called by

proc~~metrics_fill_coriolis~~CalledByGraph proc~metrics_fill_coriolis metrics_fill_coriolis proc~bt_wide_init bt_wide_t%bt_wide_init proc~bt_wide_init->proc~metrics_fill_coriolis proc~fill_coriolis_centre fill_coriolis_centre proc~fill_coriolis_centre->proc~metrics_fill_coriolis proc~fill_coriolis_corner fill_coriolis_corner proc~fill_coriolis_corner->proc~metrics_fill_coriolis proc~configure_ocean_cavity_melt configure_ocean_cavity_melt proc~configure_ocean_cavity_melt->proc~fill_coriolis_centre proc~configure_ocean_epbl configure_ocean_epbl proc~configure_ocean_epbl->proc~fill_coriolis_centre proc~configure_ocean_forcing configure_ocean_forcing proc~configure_ocean_forcing->proc~fill_coriolis_corner proc~configure_ocean_kappa_shear configure_ocean_kappa_shear proc~configure_ocean_kappa_shear->proc~fill_coriolis_centre proc~configure_ocean_kappa_shear->proc~fill_coriolis_corner proc~configure_ocean_meke configure_ocean_meke proc~configure_ocean_meke->proc~fill_coriolis_centre proc~configure_ocean_varmix configure_ocean_varmix proc~configure_ocean_varmix->proc~fill_coriolis_centre proc~configure_ocean_wavespeed configure_ocean_wavespeed proc~configure_ocean_wavespeed->proc~fill_coriolis_centre proc~ocean_dyn_enable_bt_wide ocean_dyn_enable_bt_wide proc~ocean_dyn_enable_bt_wide->proc~bt_wide_init proc~configure_ocean_lateral configure_ocean_lateral proc~configure_ocean_lateral->proc~configure_ocean_epbl proc~configure_ocean_lateral->proc~configure_ocean_kappa_shear proc~configure_ocean_lateral->proc~configure_ocean_meke proc~configure_ocean_lateral->proc~configure_ocean_varmix proc~configure_ocean_lateral->proc~configure_ocean_wavespeed proc~engine_enter_data engine_enter_data proc~engine_enter_data->proc~ocean_dyn_enable_bt_wide proc~engine_setup engine_setup proc~engine_setup->proc~configure_ocean_cavity_melt proc~engine_setup->proc~configure_ocean_forcing proc~engine_setup->proc~configure_ocean_lateral proc~complete_ocean_create complete_ocean_create proc~complete_ocean_create->proc~engine_enter_data proc~complete_ocean_create->proc~engine_setup proc~driver_run_ocean driver_run_ocean proc~driver_run_ocean->proc~engine_enter_data proc~driver_run_ocean->proc~engine_setup proc~driver_validate driver_validate proc~driver_validate->proc~engine_setup proc~driver_run driver_run proc~driver_run->proc~driver_run_ocean proc~rdb_ocean_create_finalize rdb_ocean_create_finalize proc~rdb_ocean_create_finalize->proc~complete_ocean_create proc~rdb_ocean_create_from_string rdb_ocean_create_from_string proc~rdb_ocean_create_from_string->proc~complete_ocean_create

Variables

Type Visibility Attributes Name Initial
integer, private :: i
integer, private :: j
integer, private :: ng
real(kind=wp), private :: y

Source Code

   subroutine metrics_fill_coriolis(this, scheme, f_0, beta, y_ref, omega, &
                                    grid, f_corner, f_centre)
      !! Fill a corner array AND a centre array with the Coriolis
      !! parameter, from one of two schemes (D7).  Does NOT touch any
      !! existing fill sites in coriolis_adv / EPBL / kappa-shear (that
      !! re-routing is M2d); this routine just exists + is tested.
      !!
      !!   `beta_plane` : f = f_0 + beta*(y - y_ref), y from the
      !!      GLOBAL CARTESIAN coordinate.  On an undecomposed grid
      !!      (`grid%j_offset_global == 0`) the corner fill is
      !!      BIT-IDENTICAL to `coriolis_adv_set_beta_plane`
      !!      (y = (j-1-nghost)*dy, raw f) and the centre fill is
      !!      BIT-IDENTICAL to the EPBL / kappa-shear `set_f_centre`
      !!      (y = (j-nghost-0.5)*dy, abs(f)).  Under MPI y-decomposition
      !!      `grid%j_offset_global` shifts the local index to the GLOBAL
      !!      row so each rank's beta-plane y is correct.
      !!   `planetary` : f = 2*omega*sin(geolat) at the respective
      !!      stagger — uses `this%geolatBu` (corner) and `this%geolatT`
      !!      (centre), so a spherical generator must have run first.
      !!
      !! `f_corner` is shaped `(nx+1,ny+1)` (like the metric corner
      !! arrays / `coriolis_adv%f_corner`); `f_centre` is `(nx,ny)`.
      type(ocean_metrics_t), intent(in) :: this
      integer, intent(in) :: scheme
      real(wp), intent(in) :: f_0, beta, y_ref, omega
      type(hgrid_t), intent(in) :: grid
      real(wp), intent(out) :: f_corner(:, :)
         !! Coriolis at C-grid corners (1/s).
      real(wp), intent(out) :: f_centre(:, :)
         !! |Coriolis| at cell centres (1/s).

      integer :: i, j, ng
      real(wp) :: y

      ng = grid%nghost

      select case (scheme)
      case (CORIOLIS_SCHEME_PLANETARY)
         ! 2*omega*sin(geolat) at the respective stagger.
         do j = 1, size(f_corner, 2)
            do i = 1, size(f_corner, 1)
               f_corner(i, j) = 2.0_wp*omega*sin(this%geolatBu(i, j)*DEG2RAD)
            end do
         end do
         do j = 1, size(f_centre, 2)
            do i = 1, size(f_centre, 1)
               f_centre(i, j) = abs(2.0_wp*omega*sin(this%geolatT(i, j)*DEG2RAD))
            end do
         end do
      case default   ! CORIOLIS_SCHEME_BETA_PLANE
         ! Corner: BIT-IDENTICAL to coriolis_adv_set_beta_plane on an
         ! undecomposed grid (j_offset_global == 0).  Under MPI y-split
         ! the global row index is j + j_offset_global, giving the correct
         ! physical y coordinate on every rank.
         do j = 1, size(f_corner, 2)
            y = real(j + grid%j_offset_global - 1 - ng, wp)*grid%dy
            do i = 1, size(f_corner, 1)
               f_corner(i, j) = f_0 + beta*(y - y_ref)
            end do
         end do
         ! Centre: BIT-IDENTICAL to EPBL / kappa-shear set_f_centre on an
         ! undecomposed grid (j_offset_global == 0).
         do j = 1, size(f_centre, 2)
            y = (real(j + grid%j_offset_global - ng, wp) - 0.5_wp)*grid%dy
            do i = 1, size(f_centre, 1)
               f_centre(i, j) = abs(f_0 + beta*(y - y_ref))
            end do
         end do
      end select
   end subroutine metrics_fill_coriolis