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陣列。所以你一直把整個邊界條件設置爲一個單一的值。

另一個快速建議:確保縮進循環和其他結構。代碼更具可讀性。