| 372 | } |
| 373 | |
| 374 | void Sim1D::solve(int loglevel, bool refine_grid) |
| 375 | { |
| 376 | int new_points = 1; |
| 377 | m_attempt_counter = 0; |
| 378 | finalize(); |
| 379 | if (loglevel > 6) { |
| 380 | clearDebugFile(); |
| 381 | } |
| 382 | |
| 383 | while (new_points > 0) { |
| 384 | SteadyStateSystem::solve(loglevel); |
| 385 | if (loglevel > 0) { |
| 386 | writelog("\nNewton steady-state solve succeeded.\n\n"); |
| 387 | writelog("Problem solved on ["); |
| 388 | for (size_t mm = 1; mm < nDomains(); mm+=2) { |
| 389 | writelog("{}", domain(mm).nPoints()); |
| 390 | if (mm + 2 < nDomains()) { |
| 391 | writelog(", "); |
| 392 | } |
| 393 | } |
| 394 | writelog("] point grid(s).\n"); |
| 395 | if (loglevel > 3) { |
| 396 | show(); |
| 397 | } |
| 398 | } |
| 399 | if (m_steady_callback) { |
| 400 | m_steady_callback->eval(0); |
| 401 | } |
| 402 | if (refine_grid) { |
| 403 | new_points = refine(loglevel); |
| 404 | writeDebugInfo("Regridding", "After regridding", loglevel, |
| 405 | m_attempt_counter); |
| 406 | } else { |
| 407 | debuglog("grid refinement disabled.\n", loglevel); |
| 408 | new_points = 0; |
| 409 | } |
| 410 | } |
| 411 | if (new_points < 0) { |
| 412 | // If the solver finished after removing grid points, do one final evaluation |
| 413 | // of the governing equations to update internal arrays in each domain that may |
| 414 | // be used for data saved in output files. |
| 415 | for (auto dom : m_dom) { |
| 416 | dom->eval(npos, m_state->data() + dom->loc(), m_xnew.data() + dom->loc(), |
| 417 | m_mask.data()); |
| 418 | } |
| 419 | } |
| 420 | } |
| 421 | |
| 422 | int Sim1D::refine(int loglevel) |
| 423 | { |
no test coverage detected