def _rk4_step(eom, y, t, h, *args):
    """

    Propagate a solution of the differential equation

      y' = f(t,y, args)

    for one time step from t to t+h with the 4th order Runge-Kutta method.

    Parameters
    ----------
    eom  :  :obj:`EquationsOfMotion`
      eom.f(t, y, args) should give derivative y'
    y    :  Tensor
      solution at initial time, y(t)
    t    :  float
      time
    h    :  float
      time steps
    args : additional arguments passed to `f`

    Returns
    -------
    y1 : Tensor
      solution at end of time step, y(t+h)

    """
    # displacements
    k1 = eom.f(t,         y,            *args)
    k2 = eom.f(t + 0.5*h, y + 0.5*h*k1, *args)
    k3 = eom.f(t + 0.5*h, y + 0.5*h*k2, *args)
    k4 = eom.f(t +     h, y +     h*k3, *args)
    #
    return y + h/6.0 * (k1 + 2*k2 + 2*k3 + k4)