Basilisk CFD
Adaptive Cartesian mesh PDE framework
Loading...
Searching...
No Matches
runge-kutta.h
Go to the documentation of this file.
1/** @file runge-kutta.h
2 */
3/**
4# Runge--Kutta time integrators
5*/
6
7static double update (scalar * ul, scalar * kl, double t, double dt,
8 void (* Lu) (scalar * ul, double t, scalar * kl),
9 scalar * dul, double w)
10{
11 scalar * u1l = list_clone (ul);
12 for (int _i = 0; _i < _N; _i++) /* foreach */ {
13 scalar u1, u, k;
14 for (u1,u,k in u1l,ul,kl)
15 u1[] = u[] + dt*k[];
16 }
17 Lu (u1l, t + dt, kl);
18 for (int _i = 0; _i < _N; _i++) /* foreach */ {
19 scalar du, k;
20 for (du,k in dul,kl)
21 du[] += w*k[];
22 }
23 delete (u1l), free (u1l);
24 return w;
25}
26
27/**
28The *runge_kutta()* function implements the classical first- (Euler),
29second- and fourth-order Runge--Kutta time integrators for evolution
30equations of the form
31\f[
32\frac{\partial\mathbf{u}}{\partial t} = L(\mathbf{u}, t)
33\f]
34with \f$\mathbf{u}\f$ a vector (i.e. list) of evolving fields and \f$L()\f$ a
35generic, user-defined operator.
36
37Given \f$\mathbf{u}\f$, the initial time *t*, a timestep *dt* and the
38function \f$L()\f$ which should fill *kl* with the right-hand-side of the
39evolution equation, the function below will return \f$\mathbf{u}\f$ at
40time \f$t + dt\f$ using the Runge--Kutta scheme specified by *order*. */
41
42void runge_kutta (scalar * ul, double t, double dt,
43 void (* Lu) (scalar * ul, double t, scalar * kl),
44 int order)
45{
46 scalar * dul = list_clone (ul);
47 scalar * kl = list_clone (ul);
48 Lu (ul, t, kl);
49 for (int _i = 0; _i < _N; _i++) /* foreach */ {
50 scalar du, k;
51 for (du,k in dul,kl)
52 du[] = k[];
53 }
54
55 double w = 1.;
56 switch (order) {
57 case 1: // Euler
58 break;
59 case 2:
60 w += update (ul, kl, t, dt, Lu, dul, 1.);
61 break;
62 case 4:
63 w += update (ul, kl, t, dt/2., Lu, dul, 2.);
64 w += update (ul, kl, t, dt/2., Lu, dul, 2.);
65 w += update (ul, kl, t, dt, Lu, dul, 1.);
66 break;
67 default:
68 assert (false); // not implemented
69 }
70
71 for (int _i = 0; _i < _N; _i++) /* foreach */ {
72 scalar u, du;
73 for (u,du in ul,dul)
74 u[] += dt/w*du[];
75 }
76
77 delete (dul), free (dul);
78 delete (kl), free (kl);
79}
#define u
Definition advection.h:30
define k
scalar * list_clone(scalar *l)
free(list1)
int x
Definition common.h:76
vector w[]
#define assert(a)
Definition config.h:107
double dt
double t
Definition events.h:24
vector * ul
Definition multilayer.h:42
double(* update)(scalar *evolving, scalar *updates, double dtmax)
void runge_kutta(scalar *ul, double t, double dt, void(*Lu)(scalar *ul, double t, scalar *kl), int order)
The runge_kutta() function implements the classical first- (Euler), second- and fourth-order Runge–Ku...
Definition runge-kutta.h:42
def _i
Definition stencils.h:405