Конечные разности для 2D Parabolic PDE

Это модифицированная задача из книги Numerical Computing-Kincaid, глава 15 (не физика).

Как я могу правильно реализовать граничные условия? Условия

u(0,y,t) = u(x,0,t) = u(nx,y,t) = u(x,ny,t) = 0.

Я не правильно делаю, видимо. Мой код ниже.

Я пытаюсь написать код Fortran для решения двумерного (параболического) уравнения тепла с использованием конечных разностей. Когда я распечатываю свои результаты, я получаю расходящиеся результаты и «NaN». Кажется, я неправильно определяю граничные условия. Я правильно сделал код в 1 измерении, пытаясь обобщить его в двух у меня проблемы на границе.

Обратите внимание, что i,j — это циклы выполнения по осям x и y соответственно, а m — цикл выполнения по времени. nx,ny,W — это количество точек сетки в направлении x, y и времени соответственно. Lx,Ly и tmax — размер позиции и временных интервалов сетки. Шаги положения (x, y) и временные шаги задаются hx,hy,k соответственно, а hx и hy равны для приведенного ниже примера. Я сохраняю свои решения в переменных u и v, как показано ниже.

program parabolic2D

implicit none

integer :: i,j,m 
integer, parameter :: nx=10., ny=10., W=21. 
real, parameter :: Lx=1.0, Ly=1.0, tmax=0.1 
real :: hx,hy,k,pi,pi2,R,t 
real, dimension (0:nx,0:ny) :: u,v 


hx=(Lx-0.0)/nx 
hy=(Ly-0.0)/ny 
k=(tmax-0.0)/W
R=k/hx**2.
u(0,0)=0.0; v(0,0)=0.0; u(nx,ny)=0.0; v(nx,ny)=0.0 !boundary conditions u(0,0,t)=0=u(nx,ny,t)
pi=4.0*atan(1.0) 
pi2=pi*pi



do i=1,nx-1
do j=1,ny-1
u(i,j)=sin(pi*real(i)*hx)*sin(pi*real(j)*hy)  !initial condition
end do
end do

do m=1,W

do i=1,nx-1
do j=1,ny-1
v(i,j) = R*(u(i+1,j)+u(i-1,j)+u(i,j+1)+u(i,j-1))+(1-4*R)*u(i,j) !Discretization for u(x,y,t+k)
end do
end do

t = real(m)*k ! t refers to time in the problem.

do i=1,nx-1
do j=1,ny-1
u(i,j)=v(i,j) !redefining variables.
end do
end do
write(*,*) 'for all times m, this prints out u(x,y,t)',m,((u(i,j),i=0,nx),j=0,ny)

end do

end program parabolic2D

person Joe    schedule 07.03.2016    source источник
comment
Мы не решаем здесь задачи по физике, извините. Если у вас есть конкретная проблема с кодированием, мы, вероятно, сможем помочь, но этот тип проблемы, вероятно, выходит за рамки stackoverflow.   -  person Ross    schedule 07.03.2016
comment
С учетом сказанного я могу предложить пару вопросов, которые могут помочь вам на вашем пути. Вы уверены, что правильно устанавливаете граничные условия? Похоже, вы устанавливаете только u(0,0) и u(nx,ny), но затем используете, например, u(0,1:ny-1).   -  person Ross    schedule 07.03.2016
comment
Кроме того, поскольку похоже, что вы пытаетесь учиться, я рекомендую сделать отступ в коде. Очень трудно читать неправильно отформатированный код, и отступы для циклов и условий являются ключевой частью этого.   -  person Ross    schedule 07.03.2016
comment
От Джо: спасибо за ваши комментарии ниже. Я не могу ответить, потому что у меня нет рейтинга ›50. Как вы предлагаете исправить граничные условия? Я не понимаю вашего комментария, когда вы говорите, но затем используете u(0,1:ny-1),. Я пытаюсь изучить Фортран.   -  person Vladimir F    schedule 07.03.2016
comment
@Joe Вы всегда можете прокомментировать свои вопросы, вам не нужен представитель. Что еще более важно, этот вопрос относится к другому. Лучше всего на scicomp.stackexchange.com   -  person Vladimir F    schedule 07.03.2016


Ответы (1)


Как указывает Росс, вы не полностью указали граничные условия для ребер i=j=0, i=nx и j=nx. Указаны только углы вашего домена.

Изменять

u(0,0)=0.0; v(0,0)=0.0; u(nx,ny)=0.0; v(nx,ny)=0.0 !boundary conditions u(0,0,t)=0=u(nx,ny,t)

to

u(0,:)=0.0 u(nx,:)=0.0 u(:,0)=0.0 u(:,ny)=0.0

или даже

u=0.0.

Внутренние точки перезаписываются позже.

person RussF    schedule 07.03.2016