docs: def iterate(self,
                  n=None, n_upto=None, t=None, t_upto=None,
                  output_every=None, t_output_every=None):
          """Run the model for a number of iterations, expressed in a number
          of options.
          Only one iteration argument should be passed.
          Only one output arguments should be passed.
  
          Parameters
          ----------
          n: int
              Run the model for `n` iterations from its current point.
          n_upto: int
              Run the model so that its iteration number is at
              least `n_upto`.
          t: float
              Run the model for `t` time from its current point.
          t_upto: float
              Run the model so that its time is
              at least `t_upto`.
  
          output_every: int
              How many iterations should elapse between making model snapshots.
          t_upto: float
              How much time should elapse between making model snapshots.
          """
          if t is not None:
              t_upto = self.model.t + t
          if t_upto is not None:
              n_upto = int(round(t_upto // self.model.dt))
          if n is not None:
              n_upto = self.model.i + n
  
          while self.model.i <= n_upto:
              if self.is_snapshot_time(output_every, t_output_every):
                  self.make_snapshot()
              self.model.iterate()