virtual void solve(int nt) final { // multiple calls to sovlve() are meant to advance the solution by nt nt += timestep; // being generous about out-of-loop barriers if (timestep == 0) { mem->barrier(); #if !defined(NDEBUG) hook_ante_loop_called = false; #endif hook_ante_loop(nt); mem->barrier(); } // moved here so that if an exception is thrown from hook_ante_loop these do not cause complaints #if !defined(NDEBUG) hook_ante_step_called = false; hook_post_step_called = false; #endif while (timestep < nt) { // progress-bar info through thread name (check top -H) monitor(float(timestep) / nt); // TODO: does this value make sanse with repeated advence() calls? // might be used to implement multi-threaded signal handling mem->barrier(); if (mem->panic) break; // proper solver stuff hook_ante_step(); for (int e = 0; e < n_eqns; ++e) scale(e, ct_params_t::hint_scale(e)); for (int e = 0; e < n_eqns; ++e) xchng(e); for (int e = 0; e < n_eqns; ++e) { advop(e); if (e != n_eqns - 1) mem->barrier(); } for (int e = 0; e < n_eqns; ++e) cycle(e); // note: cycle assumes ascending loop index for (int e = 0; e < n_eqns; ++e) scale(e, -ct_params_t::hint_scale(e)); timestep++; hook_post_step(); } mem->barrier(); // note: hook_post_loop was removed as conficling with multiple-advance()-call logic }