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,
349 smax = std::min(s_,5);
369 MFEM_ASSERT( (i >= 0) && ( i < s ),
370 " AdamsBashforthSolver::GetStateVector \n" <<
371 " - Tried to get non-existent state "<<i);
378 MFEM_ASSERT( (i >= 0) && ( i < s ),
379 " AdamsBashforthSolver::GetStateVector \n" <<
380 " - Tried to get non-existent state "<<i);
388 MFEM_ASSERT( (i >= 0) && ( i < smax ),
389 " AdamsBashforthSolver::SetStateVector \n" <<
390 " - Tried to set non-existent state "<<i);
400 for (
int i = 0; i < smax; i++)
402 idx[i] = (smax-i)%smax;
411 s = std::min(s, smax);
415 f->
Mult(x, k[idx[0]]);
416 for (
int i = 0; i < s; i++)
418 x.
Add(a[i]*dt, k[idx[i]]);
423 f->
Mult(x,k[idx[0]]);
424 RKsolver->
Step(x,t,dt);
429 for (
int i = 0; i < smax; i++) { idx[i] = ++idx[i]%smax; }
432 const double AB1Solver::a[] =
434 const double AB2Solver::a[] =
436 const double AB3Solver::a[] =
437 {23.0/12.0,-4.0/3.0, 5.0/12.0};
438 const double AB4Solver::a[] =
439 {55.0/24.0,-59.0/24.0, 37.0/24.0,-9.0/24.0};
440 const double AB5Solver::a[] =
441 {1901.0/720.0,-2774.0/720.0, 2616.0/720.0,-1274.0/720.0, 251.0/720.0};
446 smax = std::min(s_+1,5);
462 MFEM_ASSERT( (i >= 0) && ( i < s ),
463 " AdamsMoultonSolver::GetStateVector \n" <<
464 " - Tried to get non-existent state "<<i);
470 MFEM_ASSERT( (i >= 0) && ( i < s ),
471 " AdamsMoultonSolver::GetStateVector \n" <<
472 " - Tried to get non-existent state "<<i);
478 MFEM_ASSERT( (i >= 0) && ( i < smax ),
479 " AdamsMoultonSolver::SetStateVector \n" <<
480 " - Tried to set non-existent state "<<i);
491 for (
int i = 0; i < smax; i++)
493 idx[i] = (smax-i)%smax;
501 if ((s == 0)&&(smax>1))
503 f->
Mult(x,k[idx[1]]);
506 s = std::min(s, smax);
511 for (
int i = 1; i < smax; i++)
513 x.
Add(a[i]*dt, k[idx[i]]);
516 x.
Add(a[0]*dt, k[idx[0]]);
520 RKsolver->
Step(x,t,dt);
521 f->
Mult(x,k[idx[0]]);
526 for (
int i = 0; i < smax; i++) { idx[i] = ++idx[i]%smax; }
529 const double AM0Solver::a[] =
531 const double AM1Solver::a[] =
533 const double AM2Solver::a[] =
534 {5.0/12.0, 2.0/3.0, -1.0/12.0};
535 const double AM3Solver::a[] =
536 {3.0/8.0, 19.0/24.0,-5.0/24.0, 1.0/24.0};
537 const double AM4Solver::a[] =
538 {251.0/720.0,646.0/720.0,-264.0/720.0, 106.0/720.0, -19.0/720.0};
575 gamma = (3. - sqrt(3.))/6.;
577 else if (gamma_opt == 2)
579 gamma = (2. - sqrt(2.))/2.;
581 else if (gamma_opt == 3)
583 gamma = (2. + sqrt(2.))/2.;
587 gamma = (3. + sqrt(3.))/6.;
634 const double a = 1./sqrt(3.)*cos(M_PI/18.) + 0.5;
635 const double b = 1./(6.*(2.*a-1.)*(2.*a-1.));
639 add(x, (0.5-a)*dt,
k,
y);
640 add(x, (2.*a)*dt,
k,
z);
645 z.
Add((1.-4.*a)*dt,
k);
646 x.
Add((1.-2.*b)*dt,
k);
669 const double a = 0.435866521508458999416019;
670 const double b = 1.20849664917601007033648;
671 const double c = 0.717933260754229499708010;
675 add(x, (c-a)*dt,
k,
y);
680 x.
Add((1.0-a-b)*dt,
k);
703 add(x, dt/2.0,
k,
y);
727 const double a = (2.0 - sqrt(2.0)) / 2.0;
728 const double b = (1.0 - 2.0*
a) / (4.0*a);
733 add(x, (1.0-b-a)*dt,
k,
z);
734 x.
Add((1.0-b-a)*dt,
k);
762 const double a = (3.0 + sqrt(3.0)) / 6.0;
763 const double b = (1.0 - 2.0*
a) / (4.0*a);
764 const double b_2 = 1.0 / ( 12.0*a*(1.0 - 2.0*
a) );
765 const double b_3 = (1.0 - 3.0*
a) / ( 3.0*(1.0 - 2.0*a) );
770 add(x, (1.0-b-a)*dt,
k,
z);
771 x.
Add((1.0-b_2-b_3)*dt,
k);
796 MFEM_ASSERT( (i == 0) && (
nstate == 1),
797 "GeneralizedAlphaSolver::GetStateVector \n" <<
798 " - Tried to get non-existent state "<<i);
804 MFEM_ASSERT( (i == 0) && (
nstate == 1),
805 "GeneralizedAlphaSolver::GetStateVector \n" <<
806 " - Tried to get non-existent state "<<i);
812 MFEM_ASSERT( (i == 0),
813 "GeneralizedAlphaSolver::SetStateVector \n" <<
814 " - Tried to set non-existent state "<<i);
821 rho_inf = (rho_inf > 1.0) ? 1.0 : rho_inf;
822 rho_inf = (rho_inf < 0.0) ? 0.0 : rho_inf;
825 alpha_m = 0.5*(3.0 - rho_inf)/(1.0 + rho_inf);
832 out <<
"Generalized alpha time integrator:" << std::endl;
833 out <<
"alpha_m = " <<
alpha_m << std::endl;
834 out <<
"alpha_f = " <<
alpha_f << std::endl;
835 out <<
"gamma = " <<
gamma << std::endl;
839 out<<
"Second order"<<
" and ";
843 out<<
"First order"<<
" and ";
848 out<<
"Stable"<<std::endl;
852 out<<
"Unstable"<<std::endl;
949 a_[0] = (2.0+pow(2.0,1.0/3.0)+pow(2.0,-1.0/3.0))/6.0;
950 a_[1] = (1.0-pow(2.0,1.0/3.0)-pow(2.0,-1.0/3.0))/6.0;
954 b_[1] = 1.0/(2.0-pow(2.0,1.0/3.0));
955 b_[2] = 1.0/(1.0-pow(2.0,2.0/3.0));
959 MFEM_ASSERT(
false,
"Unsupported order in SIAVSolver");
966 for (
int i=0; i<order_; i++)
1005 out <<
"Newmark time integrator:" << std::endl;
1006 out <<
"beta = " << beta << std::endl;
1007 out <<
"gamma = " << gamma << std::endl;
1011 out<<
"Second order"<<
" and ";
1015 out<<
"First order"<<
" and ";
1018 if ((gamma >= 0.5) && (beta >= (gamma + 0.5)*(gamma + 0.5)/4))
1020 out<<
"A-Stable"<<std::endl;
1022 else if ((gamma >= 0.5) && (beta >= 0.5*gamma))
1024 out<<
"Conditionally stable"<<std::endl;
1028 out<<
"Unstable"<<std::endl;
1034 double fac0 = 0.5 - beta;
1035 double fac2 = 1.0 - gamma;
1037 double fac4 = gamma;
1042 f->
Mult(x, dxdt, d2xdt2);
1048 x.
Add(fac0*dt*dt, d2xdt2);
1049 dxdt.
Add(fac2*dt, d2xdt2);
1054 x .
Add(fac3*dt*dt, d2xdt2);
1055 dxdt.
Add(fac4*dt, d2xdt2);
1072 MFEM_ASSERT( (i == 0) && (
nstate == 1),
1073 "GeneralizedAlpha2Solver::GetStateVector \n" <<
1074 " - Tried to get non-existent state "<<i);
1081 MFEM_ASSERT( (i == 0) && (
nstate == 1),
1082 "GeneralizedAlpha2Solver::GetStateVector \n" <<
1083 " - Tried to get non-existent state "<<i);
1089 MFEM_ASSERT( (i == 0),
1090 "GeneralizedAlpha2Solver::SetStateVector \n" <<
1091 " - Tried to set non-existent state "<<i);
1098 out <<
"Generalized alpha time integrator:" << std::endl;
1099 out <<
"alpha_m = " <<
alpha_m << std::endl;
1100 out <<
"alpha_f = " <<
alpha_f << std::endl;
1101 out <<
"beta = " <<
beta << std::endl;
1102 out <<
"gamma = " <<
gamma << std::endl;
1106 out<<
"Second order"<<
" and ";
1110 out<<
"First order"<<
" and ";
1117 out<<
"Stable"<<std::endl;
1121 out<<
"Unstable"<<std::endl;
1126 double &
t,
double &dt)
1156 x *= 1.0 - 1.0/fac1;
1157 x.
Add (1.0/fac1,
xa);
1159 dxdt *= 1.0 - 1.0/fac1;
1160 dxdt.
Add (1.0/fac1,
va);
1162 d2xdt2 *= 1.0 - 1.0/fac5;
void Step(Vector &x, double &t, double &dt) override
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
void Init(SecondOrderTimeDependentOperator &f_) override
Associate a TimeDependentOperator with the ODE solver.
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 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 Step(Vector &x, double &t, double &dt) override
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
void PrintProperties(std::ostream &out=mfem::out)
virtual void Init(Operator &P, TimeDependentOperator &F)
void Step(Vector &x, double &t, double &dt) override
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
void Step(Vector &x, double &t, double &dt) override
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.
void SetRhoInf(double rho_inf)
void Init(TimeDependentOperator &f_) override
Associate a TimeDependentOperator with the ODE solver.
virtual void ImplicitSolve(const double fac0, const double fac1, const Vector &x, const Vector &dxdt, Vector &k)
Solve the equation: k = f(x + fac0 k, dxdt + fac1 k, t), for the unknown k at the current time t...
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)
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)=0
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
void Step(Vector &x, Vector &dxdt, double &t, double &dt) override
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
void Step(Vector &q, Vector &p, double &t, double &dt) override
void Init(TimeDependentOperator &f_) override
Associate a TimeDependentOperator with the ODE solver.
ExplicitRKSolver(int s_, const double *a_, const double *b_, const double *c_)
virtual void Mult(const Vector &x, Vector &y) const =0
Operator application: y=A(x).
virtual void SetTime(const double t_)
Set the current time.
const Vector & GetStateVector(int i) override
void Init(TimeDependentOperator &f_) override
Associate a TimeDependentOperator with the ODE solver.
virtual void Init(TimeDependentOperator &f_)
Associate a TimeDependentOperator with the ODE solver.
void add(const Vector &v1, const Vector &v2, Vector &v)
void Step(Vector &q, Vector &p, double &t, double &dt) override
void Step(Vector &x, Vector &dxdt, double &t, double &dt) override
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
void Init(TimeDependentOperator &f_) override
Associate a TimeDependentOperator with the ODE solver.
void PrintProperties(std::ostream &out=mfem::out)
void SetStateVector(int i, Vector &state) override
double f(const Vector &xvec)
void Init(TimeDependentOperator &f_) override
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()
void Init(TimeDependentOperator &f_) override
Associate a TimeDependentOperator with the ODE solver.
virtual void Init(SecondOrderTimeDependentOperator &f)
Associate a TimeDependentOperator with the ODE solver.
void SetStateVector(int i, Vector &state) override
void Step(Vector &x, double &t, double &dt) override
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
void Step(Vector &x, double &t, double &dt) override
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]...
bool isExplicit() const
True if type is EXPLICIT.
void Step(Vector &x, double &t, double &dt) override
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
const Vector & GetStateVector(int i) override
void Step(Vector &x, double &t, double &dt) override
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.
The classical explicit forth-order Runge-Kutta method, RK4.
double p(const Vector &x, double t)
TimeDependentOperator * F_
void Init(TimeDependentOperator &f_) override
Associate a TimeDependentOperator with the ODE solver.
void SetSize(int nsize)
Change the 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.
void PrintProperties(std::ostream &out=mfem::out)
void Init(TimeDependentOperator &f_) override
Associate a TimeDependentOperator with the ODE solver.
void Init(TimeDependentOperator &f_) override
Associate a TimeDependentOperator with the ODE solver.
void Init(SecondOrderTimeDependentOperator &f_) override
Associate a TimeDependentOperator with the ODE solver.
AdamsBashforthSolver(int s_, const double *a_)
void SetStateVector(int i, Vector &state) override
void Init(TimeDependentOperator &f_) override
Associate a TimeDependentOperator with the ODE solver.
Vector & Add(const double a, const Vector &Va)
(*this) += a * Va
void Init(TimeDependentOperator &f_) override
Associate a TimeDependentOperator with the ODE solver.
void Init(TimeDependentOperator &f_) override
Associate a TimeDependentOperator with the ODE solver.
const Vector & GetStateVector(int i) override
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...
void Step(Vector &x, double &t, double &dt) override
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
const Vector & GetStateVector(int i) override
void Step(Vector &x, double &t, double &dt) override
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
void Step(Vector &x, double &t, double &dt) override
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
void Init(TimeDependentOperator &f_) override
Associate a TimeDependentOperator with the ODE solver.
void Step(Vector &x, double &t, double &dt) override
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.
void SetStateVector(int i, Vector &state) override
void Step(Vector &q, Vector &p, double &t, double &dt) override
OutStream out(std::cout)
Global stream used by the library for standard output. Initially it uses the same std::streambuf as s...
SDIRK23Solver(int gamma_opt=1)
void Step(Vector &x, double &t, double &dt) override
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.
AdamsMoultonSolver(int s_, const double *a_)
SecondOrderTimeDependentOperator * f
Pointer to the associated TimeDependentOperator.