312
6. Semi-Lagrangian Methods
becomes
s = t!.t U(Xj + S - u(Xj + S, t n)t!.t/2 , t" + t!.t/2) .
Thus, S = Ud t!.t + 0 [(t!.t)2], which may be substituted into the right side of the
preceding to yield
S = udt!.t + (t!.t)2 2
Substituting (6.22) into (6.8) gives
at
+ ax
UI + 0 [(t!.t)3].
d
(6.22)
u(tn+2) = -U(t n) - -u(t n- ).
1
3
1
1
trI = td+t!.t(:t +ua:)tl + (t!.2
d
2
(:t +ua:r tl +O[(t!.t)3J.
which implies that the Runge-Kutta scheme (6.18H6.19) generates an 0 [(t!.t)2]
contribution toward the total error in the semi-Lagrangian approximation.
Now suppose that the velocity data are available only at discrete locations on
the space-time mesh. Ideally, the velocity at time t n +! would be computed by
interpolation between times t" and t n +I . Such interpolation cannot, however, be
performed when semi-Lagrangian methods are used to solve prognostic equations
for the velocity itself, because the velocity at t n +I will be needed for the trajectory
calculations before it has been computed. This problem is generally avoided by
extrapolating the velocity field forward in time using data from the two previous
time levels such that
(6.23)
2
2
Suppose that the extrapolated velocity field at U (t
n +! ) is then Iinearly interpolated
to x* using data at the nearest spatial nodes, and let U* denote this interpolated
and extrapolated velocity. Since linear interpolation and extrapolation are secondorder accurate,
U(x.,t n+!) = U. + 0 [(t!.X)2] + 0 [(t!.t)2J.
Substituting the preceding into (6.20) shows that the use of U. instead of the
exact velocity adds an 0 [t!.t(t!.x)2)] + 0 [(t!.t)3] error to the back-trajectory
calculation, and thereby contributes a term of 0 [(t!.x)2] + 0 [(t!.t)2] to the
global truncation error in the serni-Lagrangian solution . A fully second-order
semi-Lagrangian scheme can therefore be obtained by (i) using (6.18) to estimate
the midpoint ofthe back trajectory, (ii) computing U. by linearly interpolating and
extrapolating the velocity field, (iii) determining the departure point from
(iv) evaluating rjJ(x'j , r") using quadratic interpolation, and (v) setting rjJ'j+l to this
value.
Précédent

- 325/476

Suivant