54 const double b = 0.5/a;
58 add(x, (1. - b)*dt, dxdt, x1);
63 add(x1, b*dt, dxdt, x);
89 add(3./4, x, 1./4, y, y);
95 add(1./3, x, 2./3, y, x);
153 for (
int i = 0; i < s; i++)
171 for (
int l = 0, i = 1; i < s; i++)
173 add(x, a[l++]*dt, k[0], y);
174 for (
int j = 1; j < i; j++)
176 y.
Add(a[l++]*dt, k[j]);
182 for (
int i = 0; i < s; i++)
184 x.
Add(b[i]*dt, k[i]);
194 const double RK6Solver::a[] =
197 .1923996296296296296296296296296296296296e-1,
198 .7669337037037037037037037037037037037037e-1,
202 1.318683415233148260919747276431735612861,
204 -5.042058063628562225427761634715637693344,
205 4.220674648395413964508014358283902080483,
206 -41.87259166432751461803757780644346812905,
208 159.4325621631374917700365669070346830453,
209 -122.1192135650100309202516203389242140663,
210 5.531743066200053768252631238332999150076,
211 -54.43015693531650433250642051294142461271,
213 207.0672513650184644273657173866509835987,
214 -158.6108137845899991828742424365058599469,
215 6.991816585950242321992597280791793907096,
216 -.1859723106220323397765171799549294623692e-1,
217 -54.66374178728197680241215648050386959351,
219 207.9528062553893734515824816699834244238,
220 -159.2889574744995071508959805871426654216,
221 7.018743740796944434698170760964252490817,
222 -.1833878590504572306472782005141738268361e-1,
223 -.5119484997882099077875432497245168395840e-3
225 const double RK6Solver::b[] =
227 .3438957868357036009278820124728322386520e-1,
230 .2582624555633503404659558098586120858767,
231 .4209371189673537150642551514069801967032,
232 4.405396469669310170148836816197095664891,
233 -176.4831190242986576151740942499002125029,
234 172.3641334014150730294022582711902413315
236 const double RK6Solver::c[] =
239 .9593333333333333333333333333333333333333e-1,
247 const double RK8Solver::a[] =
255 .3613975628004575124052940721184028345129,
257 -1.341524066700492771819987788202715834917,
258 1.370126503900035259414693716084313000404,
259 .490472027972027972027972027972027972028e-1,
262 .2350972042214404739862988335493427143122,
263 .180855592981356728810903963653454488485,
264 .6169289044289044289044289044289044289044e-1,
267 .1123656831464027662262557035130015442303,
268 -.3885046071451366767049048108111244567456e-1,
269 .1979188712522045855379188712522045855379e-1,
270 -1.767630240222326875735597119572145586714,
274 -6.061889377376669100821361459659331999758,
275 5.650823198222763138561298030600840174201,
276 65.62169641937623283799566054863063741227,
277 -1.180945066554970799825116282628297957882,
280 -41.50473441114320841606641502701994225874,
281 -4.434438319103725011225169229846100211776,
282 4.260408188586133024812193710744693240761,
283 43.75364022446171584987676829438379303004,
284 .787142548991231068744647504422630755086e-2,
285 -1.281405999441488405459510291182054246266,
288 -45.04713996013986630220754257136007322267,
289 -4.731362069449576477311464265491282810943,
290 4.514967016593807841185851584597240996214,
291 47.44909557172985134869022392235929015114,
292 .1059228297111661135687393955516542875228e-1,
293 -.5746842263844616254432318478286296232021e-2,
294 -1.724470134262485191756709817484481861731,
297 -60.92349008483054016518434619253765246063,
298 -5.95151837622239245520283276706185486829,
299 5.556523730698456235979791650843592496839,
300 63.98301198033305336837536378635995939281,
301 .1464202825041496159275921391759452676003e-1,
302 .6460408772358203603621865144977650714892e-1,
303 -.7930323169008878984024452548693373291447e-1,
304 -3.301622667747079016353994789790983625569,
307 -118.011272359752508566692330395789886851,
308 -10.14142238845611248642783916034510897595,
309 9.139311332232057923544012273556827000619,
310 123.3759428284042683684847180986501894364,
311 4.623244378874580474839807625067630924792,
312 -3.383277738068201923652550971536811240814,
313 4.527592100324618189451265339351129035325,
314 -5.828495485811622963193088019162985703755
316 const double RK8Solver::b[] =
318 .4427989419007951074716746668098518862111e-1,
323 .3541049391724448744815552028733568354121,
324 .2479692154956437828667629415370663023884,
325 -15.69420203883808405099207034271191213468,
326 25.08406496555856261343930031237186278518,
327 -31.73836778626027646833156112007297739997,
328 22.93828327398878395231483560344797018313,
329 -.2361324633071542145259900641263517600737
331 const double RK8Solver::c[] =
340 .901802041735856958259707940678372149956,
381 gamma = (3. - sqrt(3.))/6.;
383 else if (gamma_opt == 2)
385 gamma = (2. - sqrt(2.))/2.;
387 else if (gamma_opt == 3)
389 gamma = (2. + sqrt(2.))/2.;
393 gamma = (3. + sqrt(3.))/6.;
440 const double a = 1./sqrt(3.)*cos(M_PI/18.) + 0.5;
441 const double b = 1./(6.*(2.*a-1.)*(2.*a-1.));
445 add(x, (0.5-a)*dt,
k,
y);
446 add(x, (2.*a)*dt,
k,
z);
451 z.
Add((1.-4.*a)*dt,
k);
452 x.
Add((1.-2.*b)*dt,
k);
475 const double a = 0.435866521508458999416019;
476 const double b = 1.20849664917601007033648;
477 const double c = 0.717933260754229499708010;
481 add(x, (c-a)*dt,
k,
y);
486 x.
Add((1.-a-b)*dt,
k);
507 rho_inf = (rho_inf > 1.0) ? 1.0 : rho_inf;
508 rho_inf = (rho_inf < 0.0) ? 0.0 : rho_inf;
510 alpha_m = 0.5*(3.0 - rho_inf)/(1.0 + rho_inf);
517 out <<
"Generalized alpha time integrator:" << std::endl;
518 out <<
"alpha_m = " <<
alpha_m << std::endl;
519 out <<
"alpha_f = " <<
alpha_f << std::endl;
520 out <<
"gamma = " <<
gamma << std::endl;
524 out<<
"Second order"<<
" and ";
528 out<<
"First order"<<
" and ";
533 out<<
"Stable"<<std::endl;
537 out<<
"Unstable"<<std::endl;
550 if (
first && (dt_fac1 != 0.0))
562 add(
y, dt_fac2*dt,
k, x);
635 a_[0] = (2.0+pow(2.0,1.0/3.0)+pow(2.0,-1.0/3.0))/6.0;
636 a_[1] = (1.0-pow(2.0,1.0/3.0)-pow(2.0,-1.0/3.0))/6.0;
640 b_[1] = 1.0/(2.0-pow(2.0,1.0/3.0));
641 b_[2] = 1.0/(1.0-pow(2.0,2.0/3.0));
645 MFEM_ASSERT(
false,
"Unsupported order in SIAVSolver");
652 for (
int i=0; i<order_; i++)
virtual void Init(TimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.
void PrintProperties(std::ostream &out=mfem::out)
virtual void Init(Operator &P, TimeDependentOperator &F)
void SetRhoInf(double rho_inf)
void Step(Vector &q, Vector &p, double &t, double &dt)
virtual void Init(TimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.
virtual void Step(Vector &x, double &t, double &dt)
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
void SetSize(int s)
Resize the vector to size s.
Base abstract class for time dependent operators.
int Width() const
Get the width (size of input) of the Operator. Synonym with NumCols().
virtual void Init(TimeDependentOperator &f)
Associate a TimeDependentOperator with the ODE solver.
virtual void SetTime(const double _t)
Set the current time.
virtual void Step(Vector &x, double &t, double &dt)
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
virtual void Mult(const Vector &x, Vector &y) const =0
Operator application: y=A(x).
virtual void Step(Vector &x, double &t, double &dt)
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
void add(const Vector &v1, const Vector &v2, Vector &v)
virtual void Step(Vector &x, double &t, double &dt)
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
virtual void Init(TimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.
virtual void Init(TimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.
virtual MemoryClass GetMemoryClass() const
Return the MemoryClass preferred by the Operator.
int Height() const
Get the height (size of output) of the Operator. Synonym with NumRows().
virtual ~ExplicitRKSolver()
virtual void Step(Vector &x, double &t, double &dt)
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
virtual void Init(TimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.
bool isExplicit() const
True if type is EXPLICIT.
virtual void ImplicitSolve(const double dt, const Vector &x, Vector &k)
Solve the equation: k = f(x + dt k, t), for the unknown k at the current time t.
virtual void Step(Vector &x, double &t, double &dt)
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
ExplicitRKSolver(int _s, const double *_a, const double *_b, const double *_c)
virtual void Step(Vector &x, double &t, double &dt)
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
virtual void Init(TimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.
virtual void Init(TimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.
virtual void Init(TimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.
virtual void Mult(const Vector &x, Vector &y) const
Perform the action of the operator: y = k = f(x, t), where k solves the algebraic equation F(x...
virtual void Init(TimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.
TimeDependentOperator * F_
void SetSize(int nsize)
Change logical size of the array, keep existing entries.
Vector & Add(const double a, const Vector &Va)
(*this) += a * Va
void Step(Vector &q, Vector &p, double &t, double &dt)
void Step(Vector &q, Vector &p, double &t, double &dt)
MemoryType GetMemoryType(MemoryClass mc)
Return a suitable MemoryType for a given MemoryClass.
virtual void Step(Vector &x, double &t, double &dt)
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
virtual void Step(Vector &x, double &t, double &dt)
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
virtual void Init(TimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.
virtual void Step(Vector &x, double &t, double &dt)
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
TimeDependentOperator * f
Pointer to the associated TimeDependentOperator.
OutStream out(std::cout)
Global stream used by the library for standard output. Initially it uses the same std::streambuf as s...
virtual void Step(Vector &x, double &t, double &dt)
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
SDIRK23Solver(int gamma_opt=1)
virtual void Init(TimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.