A numerical framework for simulating progressive fatigue failure in composite laminates