51 UG_COND_THROW(!base_type::m_spLinearSolver.valid(),
"Linear solver invalid");
64 m_spSolTimeSeries->clear();
65 m_spSolTimeSeries->push(uold, t0);
71 if(!base_type::m_bNoLogOut)
72 UG_LOG(
"+++ Integrating: ["<< t0 <<
", "<< t1 <<
"]\n");
75 number dt_assembled = -1.0;
78 number currdt = base_type::m_dt;
80 while((t < t1) && (t1-t > base_type::m_precisionBound))
83 if(!base_type::m_bNoLogOut)
84 {
UG_LOG(
"+++ Timestep +++" << step <<
"\n"); }
87 number dt = std::min(currdt, t1-t);
91 if (fabs(dt-dt_assembled) > base_type::m_precisionBound)
94 if(!base_type::m_bNoLogOut)
95 UG_LOG(
"+++ Reassemble (t=" << t <<
", dt=" << dt <<
")\n");
98 (base_type::m_spLinearSolver)->init(spAssOp, *u1);
108 if (base_type::m_spLinearSolver->apply(*u1, *b))
112 this->notify_finalize_step(u1, step++, t+dt, dt);
118 VecAssign(*tmp, *u1.template cast_dynamic<typename base_type::vector_type>());
119 m_spSolTimeSeries->push_discard_oldest(tmp, t);
130 this->notify_end(u1, step, t1, currdt);
146 UG_COND_THROW(!base_type::m_spLinearSolver.valid(),
"Linear solver invalid");
159 m_spSolTimeSeries->push(uold, t0);
165 int numSteps = round((t1-t0) / base_type::m_dt);
166 number currdt = (t1-t0) / numSteps;
171 if(!base_type::m_bNoLogOut)
173 UG_LOG(
"+++ Integrating: [\t"<< t0 <<
"\t, \t"<< t1 <<
"\t] with dt=\t" << currdt <<
"("<< numSteps<<
" iters)" << std::endl);
177 for(
int step = 1; step<=numSteps; ++step)
183 if(!base_type::m_bNoLogOut)
185 UG_LOG(
"+++ Const timestep +++" << step<<
"(t=" << t <<
", dt=" << dt <<
")"<< std::endl);
187 this->notify_init_step(u1, step, t, dt);
194 if(!base_type::m_bNoLogOut)
UG_LOG(
"+++ Assemble (t=" << t <<
", dt=" << dt <<
")" << std::endl);
198 (base_type::m_spLinearSolver)->init(spAssOp, *u1);
208 if (base_type::m_spLinearSolver->apply(*u1, *b))
212 this->notify_finalize_step(u1, step, t+dt, dt);
217 VecAssign(*tmp, *u1.template cast_dynamic<typename base_type::vector_type>());
218 m_spSolTimeSeries->push_discard_oldest(tmp, t);
223 UG_THROW(
"ConstStepLinearTimeIntegrator::apply failed!!!");
224 this->notify_rewind_step(u1, step, t+dt, dt);
229 this->notify_end(u1, numSteps, t1, currdt);
262 m_spSolTimeSeries->push(uold, t0);
266 m_spSolTimeSeries2->push(u2old, t0);
269 if (m_dtmin <= 0.0) { m_dtmin = (t1 - t0)/1.0e+5; }
270 if (m_dtmax <= 0.0) { m_dtmax = (t1 - t0)/10.0; }
273 const size_t tsteps[2] = {1,2};
274 std::vector<size_t> vsteps (tsteps, tsteps+2);
278 if(!base_type::m_bNoLogOut)
279 UG_LOG(
"+++ Integrating: ["<< t0 <<
", "<< t1 <<
"]\n");
284 number dt = base_type::m_dt;
285 while((t < t1) && (t1-t > base_type::m_precisionBound))
288 bool bSuccess =
false;
293 if(!base_type::m_bNoLogOut)
294 UG_LOG(
"Step size below minimum")
296 dt = std::min(dt, t1-t);
299 if(!base_type::m_bNoLogOut)
300 UG_LOG(
"+++ Timestep: " << ++step <<
"\n");
304 base_type::m_spLinearSolver->init(spAssOp, *u1);
305 base_type::m_spLinearSolver->apply(*u1, *b);
309 if(!base_type::m_bNoLogOut)
310 UG_LOG(
"+++ Control: " << step <<
"\n");
314 base_type::m_spLinearSolver->init(spAssOp, *u2);
315 base_type::m_spLinearSolver->apply(*u2, *b);
319 (*tmp2)=*(u2.template cast_static<typename base_type::vector_type>());
320 m_spSolTimeSeries2->push_discard_oldest(tmp2, t + 0.5*dt);
325 base_type::m_spLinearSolver->init(spAssOp, *u2);
326 base_type::m_spLinearSolver->apply(*u2, *b);
335 number lambda = std::pow(0.8* m_tol/eps, 0.5);
338 dtEst = std::min(dtEst, 1.5*dt);
339 dtEst = std::min(dtEst, m_dtmax);
345 if(!base_type::m_bNoLogOut)
346 UG_LOG(
"ACCEPTING solution, dtnew=" << dt);
353 if(!base_type::m_bNoLogOut)
354 UG_LOG(
"DISCARDING solution, dtnew=" << dt);
357 VecAssign(*u1.template cast_dynamic<typename base_type::vector_type>(), *uold);
362 m_spSolTimeSeries2->push_discard_oldest(tmp, t);
375 m_spSolTimeSeries->push_discard_oldest(tmp, t);
void set_solution(SmartPtr< vector_type > soli, int i)
set solution (for stage i)
Definition time_extrapolation.h:1016
bool apply(SmartPtr< grid_function_type > u1, number t1, ConstSmartPtr< grid_function_type > u0, number t0)
Definition time_integrator_impl.hpp:138
bool apply(SmartPtr< grid_function_type > u1, number t1, ConstSmartPtr< grid_function_type > u0, number t0)
Definition time_integrator_impl.hpp:42
bool apply(SmartPtr< grid_function_type > u1, number t1, ConstSmartPtr< grid_function_type > u0, number t0)
Definition time_integrator_impl.hpp:236