Mercurial > repos > public > sbplib_julia
annotate src/SimpleTimeSteppers/SimpleTimeSteppers.jl @ 862:a382942e5437 feature/subpackage_simple_timesteppers
Add a few simple timesteppers
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Tue, 18 Jan 2022 15:29:54 +0100 |
parents | |
children |
rev | line source |
---|---|
862
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
1 """ |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
2 SimpleTimeSteppers |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
3 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
4 Implements a few simple time integration schemes useful for testing the accuracy of spatial discretisations. |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
5 """ |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
6 module SimpleTimeSteppers |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
7 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
8 export rk4 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
9 export rkn4 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
10 export centered_2nd_order_fd |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
11 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
12 """ |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
13 rk4(F, vₙ, tₙ, Δtₙ) |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
14 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
15 Solves ``vₜ = F(v,t)`` using the standard 4th order RK-method. |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
16 """ |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
17 function rk4(F, vₙ, tₙ, Δtₙ) |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
18 k₁ = F(vₙ,tₙ) |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
19 k₂ = F(vₙ + Δtₙ/2*k₁, tₙ + Δtₙ/2) |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
20 k₃ = F(vₙ + Δtₙ/2*k₂, tₙ + Δtₙ/2) |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
21 k₄ = F(vₙ + Δtₙ *k₃, tₙ + Δtₙ ) |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
22 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
23 vₙ₊₁ = vₙ + (1/6)*(k₁+2*(k₂+k₃)+k₄)*Δtₙ |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
24 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
25 return vₙ₊₁ |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
26 end |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
27 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
28 """ |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
29 rkn4(F, vₙ, v̇ₙ, tₙ, Δtₙ) |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
30 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
31 Solves ``vₜₜ = F(v,v̇,t)`` using the Runge-Kutta-Nyström method based on the |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
32 standard 4th order RK-method. |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
33 """ |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
34 function rkn4(F, vₙ, v̇ₙ, tₙ, Δtₙ) |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
35 k₁ = F(vₙ, v̇ₙ, tₙ ) |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
36 k₂ = F(vₙ + Δtₙ/2*v̇ₙ, v̇ₙ + Δtₙ/2*k₁, tₙ + Δtₙ/2) |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
37 k₃ = F(vₙ + Δtₙ/2*v̇ₙ + Δtₙ^2/4*k₁, v̇ₙ + Δtₙ/2*k₂, tₙ + Δtₙ/2) |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
38 k₄ = F(vₙ + Δtₙ *v̇ₙ + Δtₙ^2/2*k₂, v̇ₙ + Δtₙ *k₃, tₙ + Δtₙ ) |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
39 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
40 vₙ₊₁ = vₙ + Δtₙ*v̇ₙ + Δtₙ^2*(1/6)*(k₁ + k₂ + k₃); |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
41 v̇ₙ₊₁ = v̇ₙ + Δtₙ*(k₁ + 2*k₂ + 2*k₃ + k₄)/6; |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
42 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
43 return vₙ₊₁, v̇ₙ₊₁ |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
44 end |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
45 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
46 """ |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
47 centered_2nd_order_fd(F, vₙ, vₙ₋₁, Δtₙ) |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
48 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
49 Solves ``vₜₜ = F(v,t)`` using the 2nd order discretization |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
50 ``(vₙ₊₁ - 2vₙ + vₙ₋₁)/Δt² = F(vₙ,tₙ)``. |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
51 """ |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
52 function centered_2nd_order_fd(F, vₙ, vₙ₋₁, tₙ, Δt) |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
53 vₙ₊₁ = Δt^2*F(vₙ,tₙ) + 2vₙ - vₙ₋₁ |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
54 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
55 return vₙ₊₁, vₙ |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
56 end |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
57 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
58 # TODO: Rewrite without allocations |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
59 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
60 |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
61 # TODO: Add euler forward and try a local error estimate for testing |
a382942e5437
Add a few simple timesteppers
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
62 end # module |