Fortran语言中的二维边界条件

Fortran语言中的二维边界条件,fortran,numerical-methods,differential-equations,boundary,Fortran,Numerical Methods,Differential Equations,Boundary,您好,我在fortran中对二维离散化问题施加边界条件时遇到困难。我的离散化网格是一个在x,y方向上从-L到L的二维正方形 我想施加边界条件,这样, 在x=L的边界线上,指定函数的值。 我还想在边界线y=L处指定边界条件。然后对x,y=-L执行相同的操作 下面是正确语法的基本尝试。 我想知道这个语法是否正确和/或是我正在做的事情的最快方式。我假设有一种方法可以不用do循环,也可以使用冒号表示法,只是不知道怎么做 我的语法可能不正确,因为我不确定如何正确使用u(:)符号,或者:对我来说到底是什么。

您好,我在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

冒号在这里是不必要的,正如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索引处每个可能i索引的1D数组。因此,您已将整个边界条件一次性设置为单个值


另一条快速建议:确保缩进循环和其他结构。这样代码的可读性就大得多。

为什么在i或j上循环,而在循环内部根本不使用循环变量?在这种情况下,您应该使用冒号表示法或循环。@Ross我在第一个循环中循环I,在第一行中使用循环变量I,因为x是根据I定义的。同样在j上的循环中,当我定义y时,我在第一行使用循环变量。这对不对?我如何使用冒号表示法来实现这一点?冒号符号在循环符号中起作用吗?(看来我两者都混在一起了)。谢谢你的帮助!我忽略了x是一个点值。然后,我认为你很接近了,但是你需要设置
u(I,ny)
,而不是
u(:,ny)
。冒号表示“此行/列中的所有位置”,您只需根据x值一次设置一个。@Ross感谢您的帮助,这很有意义。如果有疑问,请首先使用循环显式写出它。将工作循环重写为数组代码所需的时间几乎总是远远少于从一开始就编写工作的非平凡数组代码。在代码运行之后,您可以随时对其进行优化和澄清。