Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
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