5

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

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

下面是正确语法的基本尝试。 我在想,如果这个语法是正确的和/或在做我正在做的最快的方式。我假设有一种方法可以做到这一点,而不使用循环也使用冒号符号,只是不知道如何。

我的语法可能不正确,因为我不确定如何正确使用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

你为什么要循环遍历i或j,而不是在循环内部使用循环变量?在这种情况下,您应该*使用冒号记号*或*循环。 – Ross

+0

@Ross我在第一个循环中循环遍历i,并在第一行中使用循环变量i,因为x按i定义。同样在j上的循环中,当我定义y时,我在第一行使用循环变量。这不正确或不是?我如何使用冒号符号来做到这一点?循环表示法中冒号符号是否工作? (似乎我混在一起)。谢谢你的帮助! –

+1

我错过了x是一个点值。那么,我认为你很接近,但是你需要设置'u(i,ny)'而不是'u(:,ny)'。冒号表示'此行/列中的所有位置',并且您只需要基于x值一次设置一个。 – Ross

回答

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)相同,它是针对n-1的j-索引处的每个可能的i-索引的1D阵列。所以你一直把整个边界条件设置为一个单一的值。

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