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=1and i=N,您正在打印tt(i)而不是tt_new(i)- 计算正在正确执行,但结果将无法正确显示。在这种情况下,使用调试器单步执行代码非常有帮助。

我还建议重组你的if陈述,但我不会走得太远gimel - 我认为意图会更清楚

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

因为您有两种特殊情况 - 空间约束(如何以不同方式处理端点)和时间约束(如何处理初始条件)。

于 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)子句被匹配关闭ELSE

编辑:问题中的前 2 行代码显示正常 - 感谢 Jonathan Leffler。)

于 2008-12-07T06:47:04.547 回答
3

Tim Whitcomb 和 gimel 给出了很好的答案。不过,您应该更多地修改您的代码 - 因为不需要使用多个 write 语句(或空行或额外的 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 回答