Fortran 中的二维边界条件

2D boundary conditions in Fortran

您好,我无法在 Fortran 中对二维离散化问题施加边界条件。我的离散化网格是一个二维正方形,在 x、y 方向上从 -L 到 L。

我想施加这样的边界条件, 在 x=L 的边界线上,指定了函数的值。 我还想在边界线 y=L 处指定边界条件。然后对 x,y=-L.

做同样的事情

下面是对正确语法的基本尝试。 我想知道这种语法是否正确 and/or 是我正在做的最快的方法。我假设有一种方法可以不用 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

这里不需要冒号,正如 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) 相同,它是 ny 的 j-index 处每个可能的 i-index 的一维数组。所以你一直在一次将整个边界条件设置为一个值。

另一条快速建议:一定要缩进循环和其他结构。这样代码可读性更高。