code: def _do_run(self, mode='1'):
          
          for a in range(len(self.particle_groups)):
              group = self.particle_groups[a]
              lp = LMParticles(self.state, group, **self._kwargs)
              if mode == 'internal':
                  lp.J, lp.JTJ, lp._dif_tile = self._load_j_diftile(a)
  
              if mode == '1':
                  lp.do_run_1()
              if mode == '2':
                  lp.do_run_2()
              if mode == 'internal':
                  lp.do_internal_run()
  
              self.stats.append(lp.get_termination_stats(get_cos=self.get_cos))
              if self.save_J and (mode != 'internal'):
                  self._dump_j_diftile(a, lp.J, lp._dif_tile)
                  self._has_saved_J[a] = True
docs: workhorse for the self.do_run_xx methods.