Geometric Numerical Integration: Structure-Preserving Algorithms for Ordinary Differential Equations