| 140 | } |
| 141 | |
| 142 | void Solver::Run() { |
| 143 | auto sem = m.GetSem(); |
| 144 | auto state = g_state; |
| 145 | auto& s = *state; |
| 146 | if (sem("init") && s.to_init_field) { |
| 147 | Init(fcu, m); |
| 148 | } |
| 149 | if (sem("flux")) { |
| 150 | for (auto f : m.Faces()) { |
| 151 | ff_flux[f] = s.velocity.dot(m.GetSurface(f)); |
| 152 | } |
| 153 | } |
| 154 | if (sem()) { |
| 155 | s.to_init_field = false; |
| 156 | const Scal h = m.GetCellSize()[0]; |
| 157 | s.dt = std::min( |
| 158 | 0.125 * h * h / s.diffusion, 0.25 * h / s.velocity.abs().max()); |
| 159 | Step(fcu, s.dt, s.diffusion, ff_flux, m); |
| 160 | Render(*g_canvas, fcu, m); |
| 161 | m.Comm(&fcu); |
| 162 | if (m.IsRoot()) { |
| 163 | s.time += s.dt; |
| 164 | ++s.step; |
| 165 | } |
| 166 | } |
| 167 | } |
| 168 | |
| 169 | static void main_loop() { |
| 170 | auto state = g_state; |
no test coverage detected