def propagate(self, pulse_in, fiber, n_steps, output_power=None, reload_fiber_each_step=False):
        """
        This is the main user-facing function that allows a pulse to be 
        propagated along a fiber (or other nonlinear medium).