def __call__(self, obs: Observer): msg = None # loop until the ode object halts while self._ode.status == "running": # if the stepper has no remaining work, leave loop if self._stepper.emit_done(): msg = "complete (stepper reports no longer changing)" break # reset timer and take timestep _xtime0 = default_timer() msg = self._ode.step() self._tot_steptime += (default_timer() - _xtime0) self._avg_steptime = (self._tot_steptime / float(self._steps + 1)) if np.any(np.isnan(self._ode.y)): obs(self._steps, force_screen=True) raise ValueError("NAN detected, leaving") obs(self._steps) self._steps = self._steps + 1 print( f"ODE loop exist\n\tstep msg=\'{msg}\'\n\tstatus=\'{self._ode.status}\'\n" ) obs.dump(self._steps)
def duster(settings, model_id, zone_id): assert ONLY_MODEL_2 and model_id == 2, "ONLY HAVE HYDRO DATA FOR MODEL_IDX=2" print(f"M{model_id} (Z{zone_id}) loading input...(slow for now)") p = load_particle(settings["particle_inputfile"], \ settings["hydrorun_inputfile"], \ model_id, zone_id) output_d = f"output_M{model_id:03d}" os.makedirs(output_d, exist_ok=True) output_f = os.path.join(output_d, f"dust{zone_id:04}") net = Network(settings["network_file"]) print( f"M{model_id} (Z{zone_id}) loaded, beginnging run: output[{output_f}]") gas = SNGas(p, net) step = Stepper(gas, net) spec = SolverSpec(time_start = p.times[p.first_idx], time_bound = p.times[p.last_idx], absolute_tol = settings["abs_tol"], \ relative_tol = settings["rel_tol"], max_timestep = settings["max_dt"]) solv = Solver(spec, step) obs = Observer(output_f, net, gas, step, solv, screen_every=settings["screen_every"], store_every=settings["store_every"], write_every=settings["write_every"]) msg = f"M{model_id} (Z{zone_id}) ok" try: solv(obs) except Exception as e: msg = f"M{model_id} (Z{zone_id}) did not finish ok\n{repr(e)}" print(msg) traceback.print_exc(file=sys.stdout) obs.dump(solv._steps) finally: obs.runout(solv._steps, settings["align_tend_value"], res=settings["align_tend_resolution"]) return msg