'Perform one integration step.
Returns
message : string or None
Report from the solver. Typically a reason for a failure if
`self.status` is \'failed\' after the step was taken or None
otherwise.'

def step(self):

    if (self.status != 'running'):
        raise RuntimeError('Attempt    to    step    on    a    failed    or    finished    solver.')
    if ((self.n == 0) or (self.t == self.t_bound)):
        self.t_old = self.t
        self.t = self.t_bound
        message = None
        self.status = 'finished'
    else:
        t = self.t
        (success, message) = self._step_impl()
        if (not success):
            self.status = 'failed'
        else:
            self.t_old = t
            if ((self.direction * (self.t - self.t_bound)) >= 0):
                self.status = 'finished'
    return message
