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.-a-b)*dt,
k);
701 MFEM_ASSERT( (i == 0) && (
nstate == 1),
702 "GeneralizedAlphaSolver::GetStateVector \n" <<
703 " - Tried to get non-existent state "<<i);
709 MFEM_ASSERT( (i == 0) && (
nstate == 1),
710 "GeneralizedAlphaSolver::GetStateVector \n" <<
711 " - Tried to get non-existent state "<<i);
717 MFEM_ASSERT( (i == 0),
718 "GeneralizedAlphaSolver::SetStateVector \n" <<
719 " - Tried to set non-existent state "<<i);
726 rho_inf = (rho_inf > 1.0) ? 1.0 : rho_inf;
727 rho_inf = (rho_inf < 0.0) ? 0.0 : rho_inf;
730 alpha_m = 0.5*(3.0 - rho_inf)/(1.0 + rho_inf);
737 out <<
"Generalized alpha time integrator:" << std::endl;
738 out <<
"alpha_m = " <<
alpha_m << std::endl;
739 out <<
"alpha_f = " <<
alpha_f << std::endl;
740 out <<
"gamma = " <<
gamma << std::endl;
744 out<<
"Second order"<<
" and ";
748 out<<
"First order"<<
" and ";
753 out<<
"Stable"<<std::endl;
757 out<<
"Unstable"<<std::endl;
854 a_[0] = (2.0+pow(2.0,1.0/3.0)+pow(2.0,-1.0/3.0))/6.0;
855 a_[1] = (1.0-pow(2.0,1.0/3.0)-pow(2.0,-1.0/3.0))/6.0;
859 b_[1] = 1.0/(2.0-pow(2.0,1.0/3.0));
860 b_[2] = 1.0/(1.0-pow(2.0,2.0/3.0));
864 MFEM_ASSERT(
false,
"Unsupported order in SIAVSolver");
871 for (
int i=0; i<order_; i++)
910 out <<
"Newmark time integrator:" << std::endl;
911 out <<
"beta = " << beta << std::endl;
912 out <<
"gamma = " << gamma << std::endl;
916 out<<
"Second order"<<
" and ";
920 out<<
"First order"<<
" and ";
923 if ((gamma >= 0.5) && (beta >= (gamma + 0.5)*(gamma + 0.5)/4))
925 out<<
"A-Stable"<<std::endl;
927 else if ((gamma >= 0.5) && (beta >= 0.5*gamma))
929 out<<
"Conditionally stable"<<std::endl;
933 out<<
"Unstable"<<std::endl;
939 double fac0 = 0.5 - beta;
940 double fac2 = 1.0 - gamma;
947 f->
Mult(x, dxdt, d2xdt2);
953 x.
Add(fac0*dt*dt, d2xdt2);
954 dxdt.
Add(fac2*dt, d2xdt2);
959 x .
Add(fac3*dt*dt, d2xdt2);
960 dxdt.
Add(fac4*dt, d2xdt2);
977 MFEM_ASSERT( (i == 0) && (
nstate == 1),
978 "GeneralizedAlpha2Solver::GetStateVector \n" <<
979 " - Tried to get non-existent state "<<i);
986 MFEM_ASSERT( (i == 0) && (
nstate == 1),
987 "GeneralizedAlpha2Solver::GetStateVector \n" <<
988 " - Tried to get non-existent state "<<i);
994 MFEM_ASSERT( (i == 0),
995 "GeneralizedAlpha2Solver::SetStateVector \n" <<
996 " - Tried to set non-existent state "<<i);
1003 out <<
"Generalized alpha time integrator:" << std::endl;
1004 out <<
"alpha_m = " <<
alpha_m << std::endl;
1005 out <<
"alpha_f = " <<
alpha_f << std::endl;
1006 out <<
"beta = " <<
beta << std::endl;
1007 out <<
"gamma = " <<
gamma << std::endl;
1011 out<<
"Second order"<<
" and ";
1015 out<<
"First order"<<
" and ";
1022 out<<
"Stable"<<std::endl;
1026 out<<
"Unstable"<<std::endl;
1031 double &t,
double &dt)
1061 x *= 1.0 - 1.0/fac1;
1062 x.
Add (1.0/fac1,
xa);
1064 dxdt *= 1.0 - 1.0/fac1;
1065 dxdt.
Add (1.0/fac1,
va);
1067 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]...
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...
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]...
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]...
void SetRhoInf(double rho_inf)
void Init(TimeDependentOperator &_f) override
Associate a TimeDependentOperator with the ODE solver.
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().
void Init(TimeDependentOperator &_f) override
Associate a TimeDependentOperator with the ODE solver.
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]...
virtual void Init(TimeDependentOperator &f)
Associate a TimeDependentOperator with the ODE solver.
virtual void SetTime(const double _t)
Set the current time.
void Step(Vector &q, Vector &p, double &t, double &dt) override
void Init(TimeDependentOperator &_f) override
Associate a TimeDependentOperator with the ODE solver.
virtual void Mult(const Vector &x, Vector &y) const =0
Operator application: y=A(x).
void Init(SecondOrderTimeDependentOperator &_f) override
Associate a TimeDependentOperator with the ODE solver.
const Vector & GetStateVector(int i) override
void Init(TimeDependentOperator &_f) override
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 Init(TimeDependentOperator &_f) override
Associate a TimeDependentOperator with the ODE solver.
AdamsMoultonSolver(int _s, const double *_a)
void SetStateVector(int i, Vector &state) override
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()
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 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]...
bool isExplicit() const
True if type is EXPLICIT.
ExplicitRKSolver(int _s, const double *_a, const double *_b, const double *_c)
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]...
The classical explicit forth-order Runge-Kutta method, RK4.
double p(const Vector &x, double t)
TimeDependentOperator * F_
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 Init(TimeDependentOperator &_f) override
Associate a TimeDependentOperator with the ODE solver.
void PrintProperties(std::ostream &out=mfem::out)
void Init(TimeDependentOperator &_f) override
Associate a TimeDependentOperator with the ODE solver.
void Init(SecondOrderTimeDependentOperator &_f) override
Associate a TimeDependentOperator with the ODE solver.
void SetStateVector(int i, Vector &state) override
Vector & Add(const double a, const Vector &Va)
(*this) += a * Va
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
AdamsBashforthSolver(int _s, const double *_a)
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...
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...
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]...
void Init(TimeDependentOperator &_f) override
Associate a TimeDependentOperator with the ODE solver.
double f(const Vector &p)
SecondOrderTimeDependentOperator * f
Pointer to the associated TimeDependentOperator.