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);
168 const double dt = (t1-t0) / numSteps;
171 if(!base_type::m_bNoLogOut)
173 UG_LOG(
"+++ Integrating: [\t"<< t0 <<
"\t, \t"<< t1 <<
"\t] with dt=\t" << dt <<
"("<< numSteps<<
" iters)" << std::endl);
177 for(
int step = 1; step<=numSteps; ++step)
180 if(!base_type::m_bNoLogOut)
182 UG_LOG(
"+++ Const timestep +++" << step<<
"(t=" << t <<
", dt=" << dt <<
")"<< std::endl);
184 this->notify_init_step(u1, step, t, dt);
191 if(!base_type::m_bNoLogOut)
192 {
UG_LOG(
"+++ Assemble (t=" << t <<
", dt=" << dt <<
")" << std::endl); }
196 (base_type::m_spLinearSolver)->init(spAssOp, *u1);
206 if (base_type::m_spLinearSolver->apply(*u1, *b))
210 this->notify_finalize_step(u1, step, t+dt, dt);
215 VecAssign(*tmp, *u1.template cast_dynamic<typename base_type::vector_type>());
216 m_spSolTimeSeries->push_discard_oldest(tmp, t);
221 UG_THROW(
"ConstStepLinearTimeIntegrator::apply failed!!!");
222 this->notify_rewind_step(u1, step, t+dt, dt);
227 this->notify_end(u1, numSteps, t1, dt);
260 m_spSolTimeSeries->push(uold, t0);
264 m_spSolTimeSeries2->push(u2old, t0);
267 if (m_dtmin <= 0.0) { m_dtmin = (t1 - t0)/1.0e+5; }
268 if (m_dtmax <= 0.0) { m_dtmax = (t1 - t0)/10.0; }
271 const size_t tsteps[2] = {1,2};
272 std::vector<size_t> vsteps (tsteps, tsteps+2);
276 if(!base_type::m_bNoLogOut)
277 UG_LOG(
"+++ Integrating: ["<< t0 <<
", "<< t1 <<
"]\n");
282 number dt = base_type::m_dt;
283 while((t < t1) && (t1-t > base_type::m_precisionBound))
286 bool bSuccess =
false;
291 if(!base_type::m_bNoLogOut)
292 UG_LOG(
"Step size below minimum")
294 dt = std::min(dt, t1-t);
297 if(!base_type::m_bNoLogOut)
298 UG_LOG(
"+++ Timestep: " << ++step <<
"\n");
302 base_type::m_spLinearSolver->init(spAssOp, *u1);
303 base_type::m_spLinearSolver->apply(*u1, *b);
307 if(!base_type::m_bNoLogOut)
308 UG_LOG(
"+++ Control: " << step <<
"\n");
312 base_type::m_spLinearSolver->init(spAssOp, *u2);
313 base_type::m_spLinearSolver->apply(*u2, *b);
317 (*tmp2)=*(u2.template cast_static<typename base_type::vector_type>());
318 m_spSolTimeSeries2->push_discard_oldest(tmp2, t + 0.5*dt);
323 base_type::m_spLinearSolver->init(spAssOp, *u2);
324 base_type::m_spLinearSolver->apply(*u2, *b);
333 number lambda = std::pow(0.8* m_tol/eps, 0.5);
336 dtEst = std::min(dtEst, 1.5*dt);
337 dtEst = std::min(dtEst, m_dtmax);
343 if(!base_type::m_bNoLogOut)
344 UG_LOG(
"ACCEPTING solution, dtnew=" << dt);
351 if(!base_type::m_bNoLogOut)
352 UG_LOG(
"DISCARDING solution, dtnew=" << dt);
355 VecAssign(*u1.template cast_dynamic<typename base_type::vector_type>(), *uold);
360 m_spSolTimeSeries2->push_discard_oldest(tmp, t);
373 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:1064
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:234