5

こんにちは、私はfortranの2次元離散化問題に境界条件を課すことに問題があります。私の離散化グリッドは、x、y方向に-LからLに向かう2次元の正方形です。Fortranの2D境界条件

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

ループ内でループ変数を使用していないのはなぜですか?この場合は、コロン表記*または*を使用する必要があります。 – Ross

+0

@Ross私は最初のループでiをループしています。そして、xはiに関して定義されているので、最初の行でループ変数iを使用しています。また、jを超えるループでは、yを定義するときに最初の行にループ変数を使用します。これは正しいのではありませんか?コロンの表記法を使用してこれをどうすればできますか?コロン記法はループ表記の中で機能しますか? (私は両方を混合しているようだ)。ご協力いただきありがとうございます! –

+1

私はxがポイント値であることを忘れました。それから、あなたは近いと思いますが、 'u(:、ny)'ではなく 'u(i、ny)'を設定する必要があります。コロンは「この行/列内のすべての場所」を示し、x値に基づいて一度に1つずつしか設定しません。 – Ross

答えて

4

ここではコロンは不要であり、アルクルートが指摘しているように、初心者のために問題を混乱させることがよくあります。境界値を指標値(iまたはj)でループしていますが、これは正しいです。対応するuの値をインデックス変数にインデックスを設定するだけで済みます。例えば、i上forループ:

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-jのjインデックスでの各iインデックスの1D配列です。したがって、境界条件全体を一度に1つの値に設定していました。

すぐにもう一度アドバイスしてください:ループや他の構造物を押し込んでください。コードはそれほど読みやすくなります。

関連する問題