您好我在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
答案 0 :(得分:4)
在这里不需要冒号,正如arclight指出的那样,经常会为初学者混淆问题。您使用索引值(i
或j
)循环遍历边界,这是正确的。您只需设置与索引变量索引的相应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的一维数组。因此,您一直将整个边界条件设置为单个值。
另一个快速建议:确保缩进循环和其他结构。代码在这方面更具可读性。