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,
350 smax = std::min(_s,5);
373 for (
int i = 0; i < smax; i++)
375 idx[i] = (smax-i)%smax;
384 s = std::min(s, smax);
388 f->
Mult(x, k[idx[0]]);
389 for (
int i = 0; i < s; i++)
391 x.
Add(a[i]*dt, k[idx[i]]);
396 f->
Mult(x,k[idx[0]]);
397 RKsolver->
Step(x,t,dt);
402 for (
int i = 0; i < smax; i++) { idx[i] = ++idx[i]%smax; }
405 const double AB1Solver::a[] =
407 const double AB2Solver::a[] =
409 const double AB3Solver::a[] =
410 {23.0/12.0,-4.0/3.0, 5.0/12.0};
411 const double AB4Solver::a[] =
412 {55.0/24.0,-59.0/24.0, 37.0/24.0,-9.0/24.0};
413 const double AB5Solver::a[] =
414 {1901.0/720.0,-2774.0/720.0, 2616.0/720.0,-1274.0/720.0, 251.0/720.0};
419 smax = std::min(_s+1,5);
439 for (
int i = 0; i < smax; i++)
441 idx[i] = (smax-i)%smax;
449 if ((s == 0)&&(smax>1))
451 f->
Mult(x,k[idx[1]]);
454 s = std::min(s, smax);
459 for (
int i = 1; i < smax; i++)
461 x.
Add(a[i]*dt, k[idx[i]]);
464 x.
Add(a[0]*dt, k[idx[0]]);
468 RKsolver->
Step(x,t,dt);
469 f->
Mult(x,k[idx[0]]);
474 for (
int i = 0; i < smax; i++) { idx[i] = ++idx[i]%smax; }
477 const double AM0Solver::a[] =
479 const double AM1Solver::a[] =
481 const double AM2Solver::a[] =
482 {5.0/12.0, 2.0/3.0, -1.0/12.0};
483 const double AM3Solver::a[] =
484 {3.0/8.0, 19.0/24.0,-5.0/24.0, 1.0/24.0};
485 const double AM4Solver::a[] =
486 {251.0/720.0,646.0/720.0,-264.0/720.0, 106.0/720.0, -19.0/720.0};
523 gamma = (3. - sqrt(3.))/6.;
525 else if (gamma_opt == 2)
527 gamma = (2. - sqrt(2.))/2.;
529 else if (gamma_opt == 3)
531 gamma = (2. + sqrt(2.))/2.;
535 gamma = (3. + sqrt(3.))/6.;
582 const double a = 1./sqrt(3.)*cos(M_PI/18.) + 0.5;
583 const double b = 1./(6.*(2.*a-1.)*(2.*a-1.));
587 add(x, (0.5-a)*dt,
k,
y);
588 add(x, (2.*a)*dt,
k,
z);
593 z.
Add((1.-4.*a)*dt,
k);
594 x.
Add((1.-2.*b)*dt,
k);
617 const double a = 0.435866521508458999416019;
618 const double b = 1.20849664917601007033648;
619 const double c = 0.717933260754229499708010;
623 add(x, (c-a)*dt,
k,
y);
628 x.
Add((1.-a-b)*dt,
k);
649 rho_inf = (rho_inf > 1.0) ? 1.0 : rho_inf;
650 rho_inf = (rho_inf < 0.0) ? 0.0 : rho_inf;
653 alpha_m = 0.5*(3.0 - rho_inf)/(1.0 + rho_inf);
660 out <<
"Generalized alpha time integrator:" << std::endl;
661 out <<
"alpha_m = " <<
alpha_m << std::endl;
662 out <<
"alpha_f = " <<
alpha_f << std::endl;
663 out <<
"gamma = " <<
gamma << std::endl;
667 out<<
"Second order"<<
" and ";
671 out<<
"First order"<<
" and ";
676 out<<
"Stable"<<std::endl;
680 out<<
"Unstable"<<std::endl;
777 a_[0] = (2.0+pow(2.0,1.0/3.0)+pow(2.0,-1.0/3.0))/6.0;
778 a_[1] = (1.0-pow(2.0,1.0/3.0)-pow(2.0,-1.0/3.0))/6.0;
782 b_[1] = 1.0/(2.0-pow(2.0,1.0/3.0));
783 b_[2] = 1.0/(1.0-pow(2.0,2.0/3.0));
787 MFEM_ASSERT(
false,
"Unsupported order in SIAVSolver");
794 for (
int i=0; i<order_; i++)
833 out <<
"Newmark time integrator:" << std::endl;
834 out <<
"beta = " << beta << std::endl;
835 out <<
"gamma = " << gamma << std::endl;
839 out<<
"Second order"<<
" and ";
843 out<<
"First order"<<
" and ";
846 if ((gamma >= 0.5) && (beta >= (gamma + 0.5)*(gamma + 0.5)/4))
848 out<<
"A-Stable"<<std::endl;
850 else if ((gamma >= 0.5) && (beta >= 0.5*gamma))
852 out<<
"Conditionally stable"<<std::endl;
856 out<<
"Unstable"<<std::endl;
862 double fac0 = 0.5 - beta;
863 double fac2 = 1.0 - gamma;
870 f->
Mult(x, dxdt, d2xdt2);
876 x.
Add(fac0*dt*dt, d2xdt2);
877 dxdt.
Add(fac2*dt, d2xdt2);
882 x .
Add(fac3*dt*dt, d2xdt2);
883 dxdt.
Add(fac4*dt, d2xdt2);
900 out <<
"Generalized alpha time integrator:" << std::endl;
901 out <<
"alpha_m = " <<
alpha_m << std::endl;
902 out <<
"alpha_f = " <<
alpha_f << std::endl;
903 out <<
"beta = " <<
beta << std::endl;
904 out <<
"gamma = " <<
gamma << std::endl;
908 out<<
"Second order"<<
" and ";
912 out<<
"First order"<<
" and ";
919 out<<
"Stable"<<std::endl;
923 out<<
"Unstable"<<std::endl;
928 double &t,
double &dt)
960 x.
Add (1.0/fac1,
xa);
962 dxdt *= 1.0 - 1.0/fac1;
963 dxdt.
Add (1.0/fac1,
va);
virtual void Mult(const Vector &x, const Vector &dxdt, Vector &y) const
Perform the action of the operator: y = k = f(x,@ dxdt, t), where k solves the algebraic equation F(x...
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 Step(Vector &x, Vector &dxdt, 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]...
void SetSize(int s)
Resize the vector to size s.
Base abstract class for first order time dependent operators.
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.
int Width() const
Get the width (size of input) of the Operator. Synonym with NumCols().
virtual void Step(Vector &x, double &t, double &dt)=0
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 SetTime(const double _t)
Set the current time.
virtual void Step(Vector &x, Vector &dxdt, 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(SecondOrderTimeDependentOperator &_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]...
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 PrintProperties(std::ostream &out=mfem::out)
AdamsMoultonSolver(int _s, const double *_a)
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 void Init(TimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.
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(SecondOrderTimeDependentOperator &f)
Associate a TimeDependentOperator with the ODE solver.
virtual void Init(SecondOrderTimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.
virtual void Init(TimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.
bool isExplicit() const
True if type is EXPLICIT.
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.
The classical explicit forth-order Runge-Kutta method, RK4.
virtual void Init(TimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.
TimeDependentOperator * F_
virtual void Init(TimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.
void SetSize(int nsize)
Change logical size of the array, keep existing entries.
Third-order, strong stability preserving (SSP) Runge-Kutta method.
Base abstract class for second order time dependent operators.
virtual void PrintProperties(std::ostream &out=mfem::out)
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 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 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]...
AdamsBashforthSolver(int _s, const double *_a)
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 ImplicitSolve(const double dt0, const double dt1, const Vector &x, const Vector &dxdt, Vector &k)
Solve the equation: k = f(x + 1/2 dt0^2 k, dxdt + dt1 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]...
SDIRK23Solver(int gamma_opt=1)
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]...
SecondOrderTimeDependentOperator * f
Pointer to the associated TimeDependentOperator.
virtual void Init(TimeDependentOperator &_f)
Associate a TimeDependentOperator with the ODE solver.