Loop - сохранить 2 предыдущих массива для реализации числовой схемы Leapfrog - PullRequest
0 голосов
/ 27 ноября 2018

В контексте численного решения адвекции я пытаюсь реализовать следующую формулу повторения во временном цикле:

Recurrence Leapfrog

Как видите,Мне нужно второе предыдущее значение времени для (j-1) и предыдущее (j) значение, чтобы вычислить (j + 1) временное значение.

Я не знаю, как реализовать эту формулу повторения.Здесь ниже моя попытка в python, где u представляет массив значений T для каждой итерации:

l = 1
# Time loop
for i in range(1,nt+1):                                                                  
# Leapfrog scheme                                                                        
    # Store (i-1) value for scheme formula                                               
    if (l < 2):                                                                          
       atemp = copy(u)                                                                   
       l = l+1                                                                           
    elif (l == 2):                                                                       
       btemp = copy(atemp)                                                               
       l = 1                                                                             
    u[1:nx-1] = btemp[1:nx-1] - cfl*(u[2:nx] - u[0:nx-2])                                
    t=t+dt                                                                               

Коэффициент cfl равен s.

Норезультаты моделирования не дают в полной мере хороших результатов.Я думаю, что мой способ сделать это не правильно.

Кто-нибудь может помочь мне реализовать эту повторяемость?, То есть, в основном, как сохранить значение (j-1) вовремя, чтобы ввести его в формулу для вычисления (j +1)?

ОБНОВЛЕНИЕ 1:

в формуле: recurrence formula

индекс времени j имеетчтобы начать с j=1, поскольку у нас есть термин T_(i,j-1).

Sor для первой итерации, мы имеем:

T_i,2 = T_i,0 - s (T_(i+1),1 - T_(i-1),1)

Тогда, если только виспользовать временной цикл (а не пространственный цикл таким образом, я не могу вычислить dudx[i]=T[i+1]-T[i-1]), как я могу вычислить (T_(i+1),1 - T_(i-1),1), я имею в виду, без предварительного вычисления dudx[i] = T_(i+1),1 - T_(i-1),1?

Это был трюк, который я пытаюсьЧтобы реализовать в моем первоначальном вопросе, можете ли вы увидеть мою проблему? Основная проблема заключается в том, что я вынужден использовать только временной цикл.

Код был бы проще, если бы я мог использовать 2D-массив с элементом T[i][j],i для пространственного и j для временного периода, но мне не разрешено использовать 2D-массив в моем экзамене.

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 28 ноября 2018

Есть несколько проблем, которые я вижу в вашем коде.Во-первых, это обозначение.Из числовой схемы, которую вы опубликовали, похоже, что вы дискретизируете время с j и пространство с i, используя центральные различия в обоих.Но в вашем коде похоже, что цикл времени записан в терминах i, и это сбивает с толку.Я буду использовать j для пробела и n для времени.

Во-вторых, эта строка

u[1:nx-1] = btemp[1:nx-1] - cfl*(u[2:nx] - u[0:nx-2]) 

неверна, поскольку для пространственного деривата du / dx вам нужно подать заявкуцентральная разностная схема в каждой пространственной точке из u.Следовательно, u[2:nx] - u[0:nx-2] не делает ничего подобного, он просто вычитает то, что кажется решением, включая граничные точки слева от решения, включая граничные точки справа.Вам необходимо правильно рассчитать эту пространственную производную.

Наконец, метод Leapfrog, который действительно учитывает решение n-1, обычно реализуется путем сохранения копии предыдущего временного шага в другой переменной, такой как u_prev,Так что, если вы используете временную схему Leapfrog плюс пространственную схему с центральной разностью, в итоге у вас должно получиться что-то вроде

u_prev = u_init
u = u_prev
for n in time...:
    u_new = u_prev - cfl*(dudx)
    u_prev = u
    u = u_new

Обратите внимание, что u на LHS рассчитывает время n+1, u_prevn-1 и dudx использует u в текущее время n.Кроме того, вы можете вычислить dudx с

for j in space...:
    dudx[j] = u[j+1]-u[j-1]
...