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))
114 VecAssign(*tmp, *u1.template cast_dynamic<typename base_type::vector_type>());
115 m_spSolTimeSeries->push_discard_oldest(tmp, t);
117 this->notify_finalize_step(u1, step++, t+dt, dt);
127 this->notify_end(u1, step, t1, currdt);
143 UG_COND_THROW(!base_type::m_spLinearSolver.valid(),
"Linear solver invalid");
156 m_spSolTimeSeries->push(uold, t0);
162 int numSteps = round((t1-t0) / base_type::m_dt);
163 number currdt = (t1-t0) / numSteps;
168 if(!base_type::m_bNoLogOut)
170 UG_LOG(
"+++ Integrating: [\t"<< t0 <<
"\t, \t"<< t1 <<
"\t] with dt=\t" << currdt <<
"("<< numSteps<<
" iters)" << std::endl);
174 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)
UG_LOG(
"+++ Assemble (t=" << t <<
", dt=" << dt <<
")" << std::endl);
195 (base_type::m_spLinearSolver)->init(spAssOp, *u1);
205 if (base_type::m_spLinearSolver->apply(*u1, *b))
210 VecAssign(*tmp, *u1.template cast_dynamic<typename base_type::vector_type>());
211 m_spSolTimeSeries->push_discard_oldest(tmp, t);
212 this->notify_finalize_step(u1, step, t, dt);
216 UG_THROW(
"ConstStepLinearTimeIntegrator::apply failed!!!");
217 this->notify_rewind_step(u1, step, t+dt, dt);
222 this->notify_end(u1, numSteps, t1, currdt);
255 m_spSolTimeSeries->push(uold, t0);
259 m_spSolTimeSeries2->push(u2old, t0);
262 if (m_dtmin <= 0.0) { m_dtmin = (t1 - t0)/1.0e+5; }
263 if (m_dtmax <= 0.0) { m_dtmax = (t1 - t0)/10.0; }
266 const size_t tsteps[2] = {1,2};
267 std::vector<size_t> vsteps (tsteps, tsteps+2);
271 if(!base_type::m_bNoLogOut)
272 UG_LOG(
"+++ Integrating: ["<< t0 <<
", "<< t1 <<
"]\n");
277 number dt = base_type::m_dt;
278 while((t < t1) && (t1-t > base_type::m_precisionBound))
281 bool bSuccess =
false;
286 if(!base_type::m_bNoLogOut)
287 UG_LOG(
"Step size below minimum")
289 dt = std::min(dt, t1-t);
292 if(!base_type::m_bNoLogOut)
293 UG_LOG(
"+++ Timestep: " << ++step <<
"\n");
297 base_type::m_spLinearSolver->init(spAssOp, *u1);
298 base_type::m_spLinearSolver->apply(*u1, *b);
302 if(!base_type::m_bNoLogOut)
303 UG_LOG(
"+++ Control: " << step <<
"\n");
307 base_type::m_spLinearSolver->init(spAssOp, *u2);
308 base_type::m_spLinearSolver->apply(*u2, *b);
312 (*tmp2)=*(u2.template cast_static<typename base_type::vector_type>());
313 m_spSolTimeSeries2->push_discard_oldest(tmp2, t + 0.5*dt);
318 base_type::m_spLinearSolver->init(spAssOp, *u2);
319 base_type::m_spLinearSolver->apply(*u2, *b);
328 number lambda = std::pow(0.8* m_tol/eps, 0.5);
331 dtEst = std::min(dtEst, 1.5*dt);
332 dtEst = std::min(dtEst, m_dtmax);
338 if(!base_type::m_bNoLogOut)
339 UG_LOG(
"ACCEPTING solution, dtnew=" << dt);
346 if(!base_type::m_bNoLogOut)
347 UG_LOG(
"DISCARDING solution, dtnew=" << dt);
350 VecAssign(*u1.template cast_dynamic<typename base_type::vector_type>(), *uold);
355 m_spSolTimeSeries2->push_discard_oldest(tmp, t);
368 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:135
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:229