1

Fortranで助けが必要です...

これがプログラムのメインループです。

do iStep=0,nStep
    write(7,*)iStep

    !* Compute new temperature using FTCS scheme.
    do i=1,N
        if( istep==0) then  !only for t=0
            tt_new(i)=250
    write(7,*)tt_new(i)
        else
            if(i==1) then
                tt_new(i)=2*coeff*(tt(i+1)+35.494)-0.036*tt(i)
                write(7,*)tt(i)
            else 
                if(i==N) then
                    tt_new(i)=2*coeff*(tt(i-1)+35.494)-0.036*tt(i)
                    write(7,*)tt(i)
                else           
                    tt_new(i) = coeff*(tt(i+1) + tt(i-1)+33.333)+(1 - 2*coeff)*tt(i)
                    write (7,*) tt_new(i)
                end if
            end if
        end if     
    end do

    do i=1,N
        tt(i) = tt_new(i)     ! Reset temperature to new values
    enddo
end do

これが出力です。

0
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
1
2.5000000E+02     <--
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.5000000E+02   <--

ご覧のとおり...プログラムは最初と最後のノードの値を計算しません...理由を教えてください???

4

3 に答える 3

5

i=1とについては、 - の代わりにi=N印刷していますが、計算は正しく行われていますが、結果が正しく表示されません。このような場合、デバッガーを使用してコードをステップ実行すると非常に役立ちます。tt(i)tt_new(i)

if私はあなたの声明を再構築することも提案しますが、ギメルまでは行きません- 意図は次のように明確になると思います

if (iStep == 0) then
    ! Perform actions for time 0
else
    ! Perform actions for time > 0
    if (i == 1) then
        ! Perform actions for first endpoint
    else if (i == N) then
        ! Perform actions for last endpoint
    else
        ! Perform actions for midsection
    end if
end if

空間的制約 (エンドポイントを異なる方法で処理する方法) と時間的制約 (初期条件を処理する方法) の 2 種類の特殊なケースがあるためです。

于 2008-12-07T07:08:17.143 に答える
3

内部IF ELSEをより読みやすい方法でフォーマットしてみてください。

if( istep==0) then  !only for t=0
    tt_new(i)=250
    write(7,*)tt_new(i)
else if(i==1) then
    tt_new(i)=2*coeff*(tt(i+1)+35.494)-0.036*tt(i)
    write(7,*)tt(i)
else if(i==N) then
    tt_new(i)=2*coeff*(tt(i-1)+35.494)-0.036*tt(i)
    write(7,*)tt(i)
else           
    tt_new(i) = coeff*(tt(i+1) + tt(i-1)+33.333)+(1 - 2*coeff)*tt(i)
    write (7,*) tt_new(i)

end if
end if //redundant
end if //redundant

END IFこのように、先頭のIF(またはELSE IF) 句は一致する によって閉じられるため、必要なのは1 つだけであることがわかりますELSE

(編集:質問の先頭の 2 行のコードは正常に表示されます - Jonathan Leffler のおかげです。)

于 2008-12-07T06:47:04.547 に答える
3

Tim Whitcomb と gimel は良い回答をしてくれました。ただし、複数の書き込みステートメント (または空白行、余分な END IF ステートメント) を使用する必要がないため、コードをさらに修正する必要があります。

if (istep==0) then  !only for t=0
    tt_new(i)=250
else if (i==1) then
    tt_new(i) = 2*coeff*(tt(i+1)+35.494)-0.036*tt(i)
else if (i==N) then
    tt_new(i) = 2*coeff*(tt(i-1)+35.494)-0.036*tt(i)
else           
    tt_new(i) = coeff*(tt(i+1) + tt(i-1)+33.333)+(1 - 2*coeff)*tt(i)
end if
write(7,*)tt_new(i)

それが私のコードだったら、行のスペースももっと自由に使うでしょう。

于 2008-12-07T07:22:30.110 に答える