Когда я пытаюсь скомпилировать мой код, используя -fcheck=all
, я получаю ошибку во время выполнения, поскольку кажется, что я выхожу за пределы размера моего массива. Это происходит из части моего кода, показанной ниже. Я думаю, это потому, что мои циклы над i, j бегут только от -ny
до ny
, -nx
до nx
, но я стараюсь использовать точки на i+1,j+1,i-1,j-1
, что выводит меня за пределы моих массивов. Когда цикл над j
начинается с -ny
, ему нужно j-1
, поэтому он сразу выводит меня за пределы, поскольку я пытаюсь получить доступ к -ny-1
. Точно так же, когда j=ny, i=-nx,nx
.
У меня вопрос, как я могу эффективно решить эту проблему, используя минимальный код?
Мне нужно правильно определить array grad(1,i,j)
на границе, и оно должно быть определено точно так же, как в правой части приведенного ниже равенства, я просто не знаю эффективного способа сделать это. Я могу явно определить grad(1,nx,j), grad(1,-nx,j), etc,
отдельно и только зацикливаться на i=-nx+1,nx-1,j=-ny+1,ny-1
, но это вызывает много дублированного кода, и у меня есть много таких массивов, поэтому я не думаю, что это логический / эффективный подход. Если я сделаю это, я просто получу сотни строк дублированного кода, что делает его очень сложным для отладки. Спасибо.
integer :: i,j
integer, parameter :: nx = 50, ny = 50
complex, dimension (3,-nx:nx,-ny:ny) :: grad,psi
real, parameter :: h = 0.1
do j = -ny,ny
do i = -nx,nx
psi(1,i,j) = sin(i*h)+sin(j*h)
psi(2,i,j) = sin(i*h)+sin(j*h)
psi(3,i,j) = sin(i*h)+sin(j*h)
end do
end do
do j = -ny,ny
do i = -nx,nx
grad(1,i,j) = (psi(1,i+1,j)+psi(1,i-1,j)+psi(1,i,j+1)+psi(1,i,j-1)-4*psi(1,i,j))/h**2 &
- (psi(2,i+1,j)-psi(2,i,j))*psi(1,i,j)/h &
- (psi(3,i,j+1)-psi(3,i,j))*psi(1,i,j)/h &
- psi(2,i,j)*(psi(1,i+1,j)-psi(1,i,j))/h &
- psi(3,i,j)*(psi(1,i,j+1)-psi(1,i,j))/h
end do
end do
Если бы я должен был сделать это напрямую для grad(1,nx,j), grad(1,-nx,j)
, это было бы дано
do j = -ny+1,ny-1
grad(1,nx,j) = (psi(1,nx,j)+psi(1,nx-2,j)+psi(1,nx,j+1)+psi(1,nx,j-1)-2*psi(1,nx-1,j)-2*psi(1,nx,j))/h**2 &
- (psi(2,nx,j)-psi(2,nx-1,j))*psi(1,nx,j)/h &
- (psi(3,nx,j+1)-psi(3,nx,j))*psi(1,nx,j)/h &
- psi(2,nx,j)*(psi(1,nx,j)-psi(1,nx-1,j))/h &
- psi(3,nx,j)*(psi(1,nx,j+1)-psi(1,nx,j))/h
grad(1,-nx,j) = (psi(1,-nx+2,j)+psi(1,-nx,j)+psi(1,-nx,j+1)+psi(1,-nx,j-1)-2*psi(1,-nx+1,j)-2*psi(1,-nx,j))/h**2 &
- (psi(2,-nx+1,j)-psi(2,-nx,j))*psi(1,-nx,j)/h &
- (psi(3,-nx,j+1)-psi(3,-nx,j))*psi(1,-nx,j)/h &
- psi(2,-nx,j)*(psi(1,-nx+1,j)-psi(1,-nx,j))/h &
- psi(3,-nx,j)*(psi(1,-nx,j+1)-psi(1,-nx,j))/h
end do