scipy.integrate.solve_ivp allows for callable "event" objects to be passed to the solver. This is an elegant way to handle the disc hitting the ground, since it can let the integrator terminate early.
This could also let the code support non-flat grounds (e.g. simulating throwing over a hill).