TimeDiscretizedODESystem<ODESystemTag::FirstOrderImplicitQuasilinear, NonlinearSolverTag::Picard>:: TimeDiscretizedODESystem(ODE& ode, TimeDisc& time_discretization) : _ode(ode), _time_disc(time_discretization), _mat_trans(createMatrixTranslator<ODETag>(time_discretization)) { _M = &NumLib::GlobalMatrixProvider::provider.getMatrix( ode.getMatrixSpecifications(), _M_id); _K = &NumLib::GlobalMatrixProvider::provider.getMatrix( ode.getMatrixSpecifications(), _K_id); _b = &NumLib::GlobalVectorProvider::provider.getVector( ode.getMatrixSpecifications(), _b_id); }
Solution run_test(ODE& ode, TimeDisc& timeDisc, const unsigned num_timesteps) { using ODE_ = ODE; using ODET = ODETraits<ODE>; Solution sol; const int process_id = 0; NumLib::TimeDiscretizedODESystem<ODE_::ODETag, NLTag> ode_sys(process_id, ode, timeDisc); auto linear_solver = createLinearSolver(); auto conv_crit = std::make_unique<NumLib::ConvergenceCriterionDeltaX>( _tol, boost::none, MathLib::VecNormType::NORM2); auto nonlinear_solver = std::make_unique<NLSolver>(*linear_solver, _maxiter); NumLib::TimeLoopSingleODE<NLTag> loop(ode_sys, std::move(linear_solver), std::move(nonlinear_solver), std::move(conv_crit)); const double t0 = ODET::t0; const double t_end = ODET::t_end; const double delta_t = (num_timesteps == 0) ? -1.0 : ((t_end-t0) / num_timesteps); DBUG("Running test with %u timesteps of size %g s.", num_timesteps, delta_t); // initial condition GlobalVector x0(ode.getMatrixSpecifications(process_id).nrows); ODET::setIC(x0); sol.ts.push_back(t0); sol.solutions.push_back(x0); auto cb = [&sol](const double t, GlobalVector const& x) { sol.ts.push_back(t); sol.solutions.push_back(x); }; if (num_timesteps > 0) { EXPECT_TRUE(loop.loop(t0, x0, t_end, delta_t, cb)); } for (auto& x : sol.solutions) MathLib::LinAlg::setLocalAccessibleVector(x); return sol; }
void run_test(ODE& ode, TimeDisc& timeDisc, const unsigned num_timesteps) { using ODE_ = ODE; using ODET = ODETraits<ODE>; NumLib::TimeDiscretizedODESystem<ODE_::ODETag, NLTag> ode_sys(ode, timeDisc); auto linear_solver = std::unique_ptr<GlobalLinearSolver>{ new GlobalLinearSolver{"", nullptr}}; auto conv_crit = std::unique_ptr<NumLib::ConvergenceCriterion>( new NumLib::ConvergenceCriterionDeltaX( _tol, boost::none, MathLib::VecNormType::NORM2)); std::unique_ptr<NLSolver> nonlinear_solver( new NLSolver(*linear_solver, _maxiter)); NumLib::TimeLoopSingleODE<NLTag> loop(ode_sys, std::move(linear_solver), std::move(nonlinear_solver), std::move(conv_crit)); const double t0 = ODET::t0; const double t_end = ODET::t_end; const double delta_t = (num_timesteps == 0) ? -1.0 : ((t_end-t0) / num_timesteps); INFO("Running test %s with %u timesteps of size %g s.", _file_name_part.c_str(), num_timesteps, delta_t); init_file(delta_t); // initial condition Vector x0(ode.getMatrixSpecifications().nrows); ODET::setIC(x0); write(t0, x0, x0); auto cb = [this](const double t, Vector const& x) { loopCallback<ODE>(t, x); }; if (num_timesteps > 0) EXPECT_TRUE(loop.loop(t0, x0, t_end, delta_t, cb)); }