def TVD_RK3_step(dydt, t0, y0, dt):
    """Perform a single Third-order Strong Stability Preserving Runge-Kutta step, (SSPRK3).

    This is a convex combination of euler forward steps which results 
    in a Total Variational Diminishing (TVD) step if a single euler forward
    step of size dt is also TVD.

    citation:
        `Total Variation Diminishing Runge-Kutta Schemes,
        Sigal Gottlieb and Chi-Wang Shu,
        Methematics of Computation,
        Volume 67, Number 221, January 1998, Pages 73–85`_:

    .. _`Total Variation Diminishing Runge-Kutta Schemes,
        Sigal Gottlieb and Chi-Wang Shu,
        Methematics of Computation,
        Volume 67, Number 221, January 1998, Pages 73–85`: https://doi.org/10.1090/S0025-5718-98-00913-2

    Butcher tableau can be `found at wikipedia`_: 

    .. _`found at wikipedia`: https://en.wikipedia.org/wiki/List_of_Runge-Kutta_methods

    Args:
        dydt (:obj:`callable`): Derivative of target w.r.t time. ``dydt(t,y)`` should return the
            temporal derivative of a Parial Differential Equation (PDE) at time t for spatial field y.
        t0 (:obj:`float`): Time at which to start integration.
        y0 (:obj:`numpy array`): Spatial discretized field at ``t0``.
        dt (:obj:`callable`): Integration steplength.

    Returns:
        :obj:`numpy array` Spatial discretized field at time ``t0+dt``

    """
    t,y = t0,y0
    k1 = dydt(t, y)
    k2 = dydt(t + dt, y + dt*k1)
    k3 = dydt(t + dt/2., y + dt*( (1./4)*k1 + (1./4)*k2 ) )
    return y + dt*(1./6)*( k1 + k2 + 4*k3 )