Dycore numerical documentation (solve nonhydro)

This page documents the “solve-nonhydro” part of the dycore.

SolveNonhydro.run_predictor_step(diagnostic_state_nh: DiagnosticStateNonHydro, prognostic_states: TimeStepPair[PrognosticState], z_fields: IntermediateFields, dtime: float, at_initial_timestep: bool, at_first_substep: bool)

self._predictor_stencils_2_3

Outputs
  • \(\color{grey}{\scriptstyle{\texttt{self.}}}\)z_exner_ex_pr: Field[Dims[Cell, K], float]

    \[\begin{split} & \exnerprime{\ntilde}{\c}{\k} = (1 + \WtimeExner) \exnerprime{\n}{\c}{\k} - \WtimeExner\,\exnerprime{\n-1}{\c}{\k}, \k \in [0, \nlev) \\[3pt] & \exnerprime{\ntilde}{\c}{\nlev} = 0 \end{split}\]
    Compute the temporal extrapolation of perturbed exner function using the time backward scheme (see the ICON_Tutorial page 74). This variable has nlev+1 levels even though it is defined on full levels.

  • \(\color{grey}{\scriptstyle{\texttt{diagnostic_state_nh.}}}\)exner_pr: Field[Dims[Cell, K], float]

    \[ \exnerprime{\n-1}{\c}{\k} = \exnerprime{\ntilde}{\c}{\k} \]
    Store the perturbed exner function from the previous time step.

Inputs
  • \(\WtimeExner\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._metric_state_nonhydro.}}}\)exner_exfac: Field[Dims[Cell, K], float]

  • \(\exnerprime{\n}{\c}{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{prognostic_states.current.}}}\)exner: Field[Dims[Cell, K], float] - \(\color{grey}{\scriptstyle{\texttt{self._metric_state_nonhydro.}}}\)exner_ref_mc: Field[Dims[Cell, K], float]

  • \(\exnerprime{\n-1}{\c}{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{diagnostic_state_nh.}}}\)exner_pr: Field[Dims[Cell, K], float]

Source code
self._predictor_stencils_2_3(
    exner_exfac=self._metric_state_nonhydro.exner_exfac,
    exner=prognostic_states.current.exner,
    exner_ref_mc=self._metric_state_nonhydro.exner_ref_mc,
    exner_pr=diagnostic_state_nh.exner_pr,
    z_exner_ex_pr=self.z_exner_ex_pr,
    horizontal_start=self._start_cell_lateral_boundary_level_3,
    horizontal_end=self._end_cell_halo,
    vertical_start=0,
    vertical_end=self._grid.num_levels + 1,
    offset_provider={},
)

self._predictor_stencils_4_5_6

Outputs
  • \(\color{grey}{\scriptstyle{\texttt{self.}}}\)z_exner_ic: Field[Dims[Cell, K], float]

    \[\begin{split} & \exnerprime{\ntilde}{\c}{\k-1/2} = \Wlev\,\exnerprime{\ntilde}{\c}{\k} + (1 - \Wlev) \exnerprime{\ntilde}{\c}{\k-1}, \quad \k \in [\max(1,\nflatlev), \nlev) \\[3pt] & \exnerprime{\ntilde}{\c}{\nlev-1/2} = \sum_{\k=\nlev-1}^{\nlev-3} \Wlev_{\k} \exnerprime{\ntilde}{\c}{\k} \end{split}\]
    Interpolate the perturbation exner from full to half levels. The ground level is based on quadratic extrapolation (with hydrostatic assumption?).

  • \(\color{grey}{\scriptstyle{\texttt{self.}}}\)z_dexner_dz_c_1: Field[Dims[Cell, K], float]

    \[ \exnerprimedz{\ntilde}{\c}{\k} \approx \frac{\exnerprime{\ntilde}{\c}{\k-1/2} - \exnerprime{\ntilde}{\c}{\k+1/2}}{\Dz{\k}}, \quad \k \in [\max(1,\nflatlev), \nlev] \]
    Use the interpolated values to compute the vertical derivative of perturbation exner at full levels.

Inputs
  • \(\Wlev\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._metric_state_nonhydro.}}}\)wgtfac_c: Field[Dims[Cell, K], float]

  • \(\Wlev_{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._metric_state_nonhydro.}}}\)wgtfacq_c: Field[Dims[Cell, K], float]

  • \(\exnerprime{\ntilde}{\c}{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self.}}}\)z_exner_ex_pr: Field[Dims[Cell, K], float]

  • \(\exnerprime{\ntilde}{\c}{\k\pm1/2}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self.}}}\)z_exner_ic: Field[Dims[Cell, K], float]

  • \(1 / \Dz{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._metric_state_nonhydro.}}}\)inv_ddqz_z_full: Field[Dims[Cell, K], float]

Source code
self._predictor_stencils_4_5_6(
    wgtfacq_c_dsl=self._metric_state_nonhydro.wgtfacq_c,
    z_exner_ex_pr=self.z_exner_ex_pr,
    z_exner_ic=self.z_exner_ic,
    wgtfac_c=self._metric_state_nonhydro.wgtfac_c,
    inv_ddqz_z_full=self._metric_state_nonhydro.inv_ddqz_z_full,
    z_dexner_dz_c_1=self.z_dexner_dz_c_1,
    horizontal_start=self._start_cell_lateral_boundary_level_3,
    horizontal_end=self._end_cell_halo,
    vertical_start=max(1, self._vertical_params.nflatlev),
    vertical_end=self._grid.num_levels + 1,
    offset_provider=self._grid.offset_providers,
)

self._compute_approx_of_2nd_vertical_derivative_of_exner

Outputs
  • \(\color{grey}{\scriptstyle{\texttt{self.}}}\)z_dexner_dz_c_2: Field[Dims[Cell, K], float64]

    \[\begin{split} & \exnerprimedzz{\ntilde}{\c}{\k} = - \frac{1}{2} \left( (\vpotempprime{\n}{\c}{\k-1/2} - \vpotempprime{\n}{\c}{\k+1/2}) \dexrefdz{\c}{\k} + \vpotempprime{\n}{\c}{\k} \ddexrefdzz{\c}{\k} \right), \quad \k \in [\nflatgradp, \nlev) \\[3pt] & \ddz{\exnerref{}{}} = - \frac{g}{\cpd \vpotempref{}{}} \end{split}\]
    Compute the second vertical derivative of the perturbed exner function. This uses the hydrostatic approximation (see eqs. 13 and 7,8 in Zangl_2012). Note that the reference state of temperature (eq. 15 in Zangl_2012) is used when computing \(\ddz{\vpotempref{\c}{\k}}\) in \(\ddexrefdzz{\c}{\k}\).

Inputs
  • \(\vpotempprime{\n}{\c}{\k\pm1/2}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self.}}}\)z_theta_v_pr_ic: Field[Dims[Cell, K], float64]

  • \(\vpotempprime{\n}{\c}{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self.}}}\)z_rth_pr_2: Field[Dims[Cell, K], float64]

  • \(\dexrefdz{}{}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._metric_state_nonhydro.}}}\)d2dexdz2_fac1_mc: Field[Dims[Cell, K], float64]

  • \(\ddexrefdzz{}{}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._metric_state_nonhydro.}}}\)d2dexdz2_fac2_mc: Field[Dims[Cell, K], float64]

Source code
self._compute_approx_of_2nd_vertical_derivative_of_exner(
    z_theta_v_pr_ic=self.z_theta_v_pr_ic,
    d2dexdz2_fac1_mc=self._metric_state_nonhydro.d2dexdz2_fac1_mc,
    d2dexdz2_fac2_mc=self._metric_state_nonhydro.d2dexdz2_fac2_mc,
    z_rth_pr_2=self.z_rth_pr_2,
    z_dexner_dz_c_2=self.z_dexner_dz_c_2,
    horizontal_start=self._start_cell_lateral_boundary_level_3,
    horizontal_end=self._end_cell_halo,
    vertical_start=self._vertical_params.nflat_gradp,
    vertical_end=self._grid.num_levels,
    offset_provider=self._grid.offset_providers,
)

self._compute_horizontal_gradient_of_exner_pressure_for_flat_coordinates

Outputs
  • \(\color{grey}{\scriptstyle{\texttt{z_fields.}}}\)z_gradh_exner: Field[Dims[Edge, K], float64]

    \[ \exnerprimegradh{\ntilde}{\e}{\k} = \Cgrad \Gradn_{\offProv{e2c}} \exnerprime{\ntilde}{\c}{\k}, \quad \k \in [0, \nflatlev) \]
    Compute the horizontal gradient (at constant height) of the temporal extrapolation of perturbed exner function on flat levels, unaffected by the terrain following deformation.

Inputs
  • \(\exnerprime{\ntilde}{\c}{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self.}}}\)z_exner_ex_pr: Field[Dims[Cell, K], float64]

  • \(\Cgrad\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._edge_geometry.}}}\)inverse_dual_edge_lengths: Field[Dims[Edge], float64]

Offset providerse2c
Source code
self._compute_horizontal_gradient_of_exner_pressure_for_flat_coordinates(
    inv_dual_edge_length=self._edge_geometry.inverse_dual_edge_lengths,
    z_exner_ex_pr=self.z_exner_ex_pr,
    z_gradh_exner=z_fields.z_gradh_exner,
    horizontal_start=self._start_edge_nudging_level_2,
    horizontal_end=self._end_edge_local,
    vertical_start=0,
    vertical_end=self._vertical_params.nflatlev,
    offset_provider=self._grid.offset_providers,
)

self._compute_horizontal_gradient_of_exner_pressure_for_nonflat_coordinates

Outputs
  • \(\color{grey}{\scriptstyle{\texttt{z_fields.}}}\)z_gradh_exner: Field[Dims[Edge, K], float64]

    \[\begin{split} & \exnerprimegradh{\ntilde}{\e}{\k} &&= \left.\pdxn{\exnerprime{}{}{}}\right|_{s} - \left.\pdxn{h}\right|_{s}\exnerprimedz{}{}{}\\[3pt] & &&= \Wedge \Gradn_{\offProv{e2c}} \exnerprime{\ntilde}{\c}{\k} - \pdxn{h} \sum_{\offProv{e2c}} \Whor \exnerprimedz{\ntilde}{\c}{\k}, \quad \k \in [\nflatlev, \nflatgradp] \end{split}\]
    Compute \(\exnerprimegradh{}{}{}\) on non-flat levels, affected by the terrain following deformation, i.e. those levels for which \(\pdxn{h} \neq 0\) (eq. 14 in Zangl_etal_2015 or eq. 5 in Zangl_2012).

Inputs
  • \(\exnerprime{\ntilde}{\c}{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self.}}}\)z_exner_ex_pr: Field[Dims[Cell, K], float64]

  • \(\Wedge\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._edge_geometry.}}}\)inverse_dual_edge_lengths: Field[Dims[Edge], float64]

  • \(\exnerprimedz{\ntilde}{\c}{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self.}}}\)z_dexner_dz_c_1: Field[Dims[Cell, K], float64]

  • \(\Whor\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._interpolation_state.}}}\)c_lin_e: Field[Dims[Edge, E2C], float64]

Offset providerse2c
Source code
self._compute_horizontal_gradient_of_exner_pressure_for_nonflat_coordinates(
    inv_dual_edge_length=self._edge_geometry.inverse_dual_edge_lengths,
    z_exner_ex_pr=self.z_exner_ex_pr,
    ddxn_z_full=self._metric_state_nonhydro.ddxn_z_full,
    c_lin_e=self._interpolation_state.c_lin_e,
    z_dexner_dz_c_1=self.z_dexner_dz_c_1,
    z_gradh_exner=z_fields.z_gradh_exner,
    horizontal_start=self._start_edge_nudging_level_2,
    horizontal_end=self._end_edge_local,
    vertical_start=self._vertical_params.nflatlev,
    vertical_end=gtx.int32(self._vertical_params.nflat_gradp + 1),
    offset_provider=self._grid.offset_providers,
)

self._compute_horizontal_gradient_of_exner_pressure_for_multiple_levels

Outputs
  • \(\color{grey}{\scriptstyle{\texttt{z_fields.}}}\)z_gradh_exner: Field[Dims[Edge, K], float64]

    \[\begin{split} & \exnerprimegradh{\ntilde}{\e}{\k} &&= \Wedge (\exnerprime{*}{\c_1}{} - \exnerprime{*}{\c_0}{}) \\[3pt] & &&= \Wedge \Gradn_{\offProv{e2c}} \left[ \exnerprime{\ntilde}{\c}{\k^*} + \dzgradp \left( \exnerprimedz{\ntilde}{\c}{\k^*} + \dzgradp \exnerprimedzz{\ntilde}{\c}{\k^*} \right) \right], \quad \k \in [\nflatgradp+1, \nlev) \end{split}\]
    Compute \(\exnerprimegradh{}{}{}\) when the height of neighboring cells is in another level. The usual centered difference approximation is used for the gradient (eq. 6 in Zangl_2012), but instead of cell center values, the exner function is reconstructed using a second order Taylor-series expansion (eq. 8 in Zangl_2012). \(k^*\) is the level index of the neighboring (horizontally, not terrain-following) cell center and \(h^*\) is its height.

Inputs
  • \(\exnerprime{\ntilde}{\c}{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self.}}}\)z_exner_ex_pr: Field[Dims[Cell, K], float64]

  • \(\exnerprimedz{\ntilde}{\c}{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self.}}}\)z_dexner_dz_c_1: Field[Dims[Cell, K], float64]

  • \(\exnerprimedzz{\ntilde}{\c}{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self.}}}\)z_dexner_dz_c_2: Field[Dims[Cell, K], float64]

  • \(\Wedge\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._edge_geometry.}}}\)inverse_dual_edge_lengths: Field[Dims[Edge], float64]

  • \(\dzgradp\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._metric_state_nonhydro.}}}\)zdiff_gradp: Field[Dims[EC, K], float64]

  • \(\k^*\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._metric_state_nonhydro.}}}\)vertoffset_gradp: Field[Dims[EC, K], int32]

Offset providerse2c
Source code
self._compute_horizontal_gradient_of_exner_pressure_for_multiple_levels(
    inv_dual_edge_length=self._edge_geometry.inverse_dual_edge_lengths,
    z_exner_ex_pr=self.z_exner_ex_pr,
    zdiff_gradp=self._metric_state_nonhydro.zdiff_gradp,
    ikoffset=self._metric_state_nonhydro.vertoffset_gradp,
    z_dexner_dz_c_1=self.z_dexner_dz_c_1,
    z_dexner_dz_c_2=self.z_dexner_dz_c_2,
    z_gradh_exner=z_fields.z_gradh_exner,
    horizontal_start=self._start_edge_nudging_level_2,
    horizontal_end=self._end_edge_local,
    vertical_start=gtx.int32(self._vertical_params.nflat_gradp + 1),
    vertical_end=self._grid.num_levels,
    offset_provider=self._grid.offset_providers,
)

self._compute_hydrostatic_correction_term

Outputs
  • \(\color{grey}{\scriptstyle{\texttt{self.}}}\)z_hydro_corr: Field[Dims[Edge, K], float64]

    \[ \exnhydrocorr{\e} = \frac{g}{\cpd} \Wedge 4 \frac{ \vpotemp{}{\c_1}{\k} - \vpotemp{}{\c_0}{\k} }{ (\vpotemp{}{\c_1}{\k} + \vpotemp{}{\c_0}{\k})^2 }, \]
    with
    \[ \vpotemp{}{\c_i}{\k} = \vpotemp{}{\c_i}{\k^*} + \dzgradp \frac{\vpotemp{}{\c_i}{\k^*-1/2} - \vpotemp{}{\c_i}{\k^*+1/2}}{\Dz{\k^*}} \]
    Compute the hydrostatically approximated correction term that replaces the downward extrapolation (last term in eq. 10 in Zangl_2012). This is only computed for the bottom-most level because all edges which have a neighboring cell center inside terrain beyond a certain limit use the same correction term at \(k^*\) level in eq. 10 in Zangl_2012 (see also the last paragraph on page 3724 for the discussion). \(\c_i\) are the indexes of the adjacent cell centers using \(\offProv{e2c}\); \(k^*\) is the level index of the neighboring (horizontally, not terrain-following) cell center and \(h^*\) is its height.

Inputs
  • \(\vpotemp{}{\c}{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{prognostic_states.current.}}}\)theta_v: Field[Dims[Cell, K], float64]

  • \(\vpotemp{}{\c}{\k\pm1/2}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{diagnostic_state_nh.}}}\)theta_v_ic: Field[Dims[Cell, K], float64]

  • \(\frac{g}{\cpd}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._params.}}}\)grav_o_cpd: float64

  • \(\Wedge\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._edge_geometry.}}}\)inverse_dual_edge_lengths: Field[Dims[Edge], float64]

  • \(1 / \Dz{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._metric_state_nonhydro.}}}\)inv_ddqz_z_full: Field[Dims[Cell, K], float64]

  • \(\dzgradp\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._metric_state_nonhydro.}}}\)zdiff_gradp: Field[Dims[EC, K], float64]

  • \(\k^*\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._metric_state_nonhydro.}}}\)vertoffset_gradp: Field[Dims[EC, K], int32]

Offset providerse2c
Source code
self._compute_hydrostatic_correction_term(
    theta_v=prognostic_states.current.theta_v,
    ikoffset=self._metric_state_nonhydro.vertoffset_gradp,
    zdiff_gradp=self._metric_state_nonhydro.zdiff_gradp,
    theta_v_ic=diagnostic_state_nh.theta_v_ic,
    inv_ddqz_z_full=self._metric_state_nonhydro.inv_ddqz_z_full,
    inv_dual_edge_length=self._edge_geometry.inverse_dual_edge_lengths,
    z_hydro_corr=self.z_hydro_corr,
    grav_o_cpd=self._params.grav_o_cpd,
    horizontal_start=self._start_edge_nudging_level_2,
    horizontal_end=self._end_edge_local,
    vertical_start=self._grid.num_levels - 1,
    vertical_end=self._grid.num_levels,
    offset_provider=self._grid.offset_providers,
)

self._apply_hydrostatic_correction_to_horizontal_gradient_of_exner_pressure

Outputs
  • \(\color{grey}{\scriptstyle{\texttt{z_fields.}}}\)z_gradh_exner: Field[Dims[Edge, K], float64]

    \[ \exnerprimegradh{\ntilde}{\e}{\k} = \exnerprimegradh{\ntilde}{\e}{\k} + \exnhydrocorr{\e} (h_k - h_{k^*}), \quad \e \in \IDXpg \]
    Apply the hydrostatic correction term to the horizontal gradient (at constant height) of the temporal extrapolation of perturbed exner function (eq. 10 in Zangl_2012). This is only applied to edges for which the adjacent cell center (horizontally, not terrain-following) would be underground, i.e. edges in the \(\IDXpg\) set.

Inputs
  • \(\exnerprimegradh{\ntilde}{\e}{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{z_fields.}}}\)z_gradh_exner: Field[Dims[Edge, K], float64]

  • \(\exnhydrocorr{\e}\) \(\rightarrow\) hydro_corr_horizontal: Field[Dims[Edge], float64]

  • \((h_k - h_{k^*})\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._metric_state_nonhydro.}}}\)pg_exdist: Field[Dims[Edge, K], float64]

  • \(\IDXpg\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{self._metric_state_nonhydro.}}}\)ipeidx_dsl: Field[Dims[Edge, K], bool]

Source code
self._apply_hydrostatic_correction_to_horizontal_gradient_of_exner_pressure(
    ipeidx_dsl=self._metric_state_nonhydro.ipeidx_dsl,
    pg_exdist=self._metric_state_nonhydro.pg_exdist,
    z_hydro_corr=hydro_corr_horizontal,
    z_gradh_exner=z_fields.z_gradh_exner,
    horizontal_start=self._start_edge_nudging_level_2,
    horizontal_end=self._end_edge_end,
    vertical_start=0,
    vertical_end=self._grid.num_levels,
    offset_provider={},
)

self._add_temporal_tendencies_to_vn

Outputs
  • \(\color{grey}{\scriptstyle{\texttt{prognostic_states.next.}}}\)vn: Field[Dims[Edge, K], float64]

    \[ \vn{\n+1^*}{\e}{\k} = \vn{\n}{\e}{\k} - \Dt \left( \advvn{\n}{\e}{\k} + \cpd \vpotemp{\n}{\e}{\k} \exnerprimegradh{\ntilde}{\e}{\k} \right) \]
    Update the normal wind speed with the advection and pressure gradient terms.

Inputs
  • \(\vn{\n}{\e}{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{prognostic_states.next.}}}\)vn: Field[Dims[Edge, K], float64]

  • \(\Dt\) \(\rightarrow\) dtime: float64

  • \(\advvn{\n}{\e}{\k}\) \(\rightarrow\) ddt_vn_apc_pc[self.ntl1]

  • \(\vpotemp{\n}{\e}{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{z_fields.}}}\)z_theta_v_e: Field[Dims[Edge, K], float64]

  • \(\exnerprimegradh{\ntilde}{\e}{\k}\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{z_fields.}}}\)z_gradh_exner: Field[Dims[Edge, K], float64]

  • \(\cpd\) \(\rightarrow\) \(\color{grey}{\scriptstyle{\texttt{constants.}}}\)CPD: float64

Source code
self._add_temporal_tendencies_to_vn(
    vn_nnow=prognostic_states.current.vn,
    ddt_vn_apc_ntl1=diagnostic_state_nh.ddt_vn_apc_pc.predictor,
    ddt_vn_phy=diagnostic_state_nh.ddt_vn_phy,
    z_theta_v_e=z_fields.z_theta_v_e,
    z_gradh_exner=z_fields.z_gradh_exner,
    vn_nnew=prognostic_states.next.vn,
    dtime=dtime,
    cpd=constants.CPD,
    horizontal_start=self._start_edge_nudging_level_2,
    horizontal_end=self._end_edge_local,
    vertical_start=0,
    vertical_end=self._grid.num_levels,
    offset_provider={},
)