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
7
static
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
/**
28
The *runge_kutta()* function implements the classical first- (Euler),
29
second- and fourth-order Runge--Kutta time integrators for evolution
30
equations of the form
31
\f[
32
\frac{\partial\mathbf{u}}{\partial t} = L(\mathbf{u}, t)
33
\f]
34
with \f$\mathbf{u}\f$ a vector (i.e. list) of evolving fields and \f$L()\f$ a
35
generic, user-defined operator.
36
37
Given \f$\mathbf{u}\f$, the initial time *t*, a timestep *dt* and the
38
function \f$L()\f$ which should fill *kl* with the right-hand-side of the
39
evolution equation, the function below will return \f$\mathbf{u}\f$ at
40
time \f$t + dt\f$ using the Runge--Kutta scheme specified by *order*. */
41
42
void
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
}
u
#define u
Definition
advection.h:30
k
define k
Definition
cartesian-common.h:8
list_clone
scalar * list_clone(scalar *l)
Definition
cartesian-common.h:400
free
free(list1)
x
int x
Definition
common.h:76
w
vector w[]
Definition
compressible.h:51
assert
#define assert(a)
Definition
config.h:107
dt
double dt
Definition
predictor-corrector.h:18
t
double t
Definition
events.h:24
ul
vector * ul
Definition
multilayer.h:42
update
double(* update)(scalar *evolving, scalar *updates, double dtmax)
Definition
predictor-corrector.h:11
runge_kutta
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
_i
def _i
Definition
stencils.h:405
scalar
Definition
common.h:44
runge-kutta.h
Generated by
1.9.8