Fortran

时间:2016-09-23 19:10:55

标签: fortran numerical-methods differential-equations boundary

您好我在Fortran中对二维离散化问题施加边界条件时遇到了麻烦。我的离散化网格是一个二维正方形,在x,y方向从-L到L.

我想强加边界条件, 在x = L的边界线上,指定了函数的值。 我还想在边界线y = L处指定边界条件。然后对x,y = -L进行相同的操作。

正确语法的基本尝试如下。 我想知道这种语法是否正确和/或最快捷的方式来做我正在做的事情。我假设有一种方法可以在没有do循环的情况下使用冒号,但不确定如何。

我的语法可能不正确,因为我不确定如何正确使用u(:)符号,或者:我真正在做什么。谢谢!

integer :: i,j
integer, parameter :: nx=60, ny=60
real, parameter :: h=0.1 !step size
real, dimension(-nx:nx,-ny:ny) :: u
real :: L

L=h*nx

do i = -nx, nx

x = real(i)*h

u(:,ny) = cos(atan(L/x)) ! is this correct?
u(:,-ny) = cos(atan((-L)/x))

end do

do j = -ny, ny

y = real(j)*h

u(nx, :) = cos(atan(y/L))
u(-nx, :) = cos(atan(y/(-L)))

end do

1 个答案:

答案 0 :(得分:4)

在这里不需要冒号,正如arclight指出的那样,经常会为初学者混淆问题。您使用索引值(ij)循环遍历边界,这是正确的。您只需设置与索引变量索引的相应u值。例如,对于i上的循环:

do i = -nx, nx
   x = real(i)*h
   u(i,ny) = cos(atan(L/x))
   u(i,-ny) = cos(atan((-L)/x))
end do

冒号在其他地方很有用,它引用了数组的一个子集。 u(:,ny)u(-nx:nx,ny)相同,它是jy的j-index处每个可能的i-index的一维数组。因此,您一直将整个边界条件设置为单个值。

另一个快速建议:确保缩进循环和其他结构。代码在这方面更具可读性。