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 指出的那样,冒号经常让初学者感到困惑。您正在使用索引值(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)
相同,它是 ny 的 j-index 处每个可能的 i-index 的一维数组。所以你一直在一次将整个边界条件设置为一个值。
另一条快速建议:一定要缩进循环和其他结构。这样代码可读性更高。
您好,我无法在 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 指出的那样,冒号经常让初学者感到困惑。您正在使用索引值(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)
相同,它是 ny 的 j-index 处每个可能的 i-index 的一维数组。所以你一直在一次将整个边界条件设置为一个值。
另一条快速建议:一定要缩进循环和其他结构。这样代码可读性更高。