在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 <--
正如你所看到的......程序没有计算第一个和最后一个节点的值......你能告诉我为什么???
答案 0 :(得分:5)
对于i=1
和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
因为您有两种类型的特殊情况 - 空间约束(如何以不同方式处理端点)和时间约束(如何处理初始条件)。
答案 1 :(得分: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。)
答案 2 :(得分:3)
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)
如果是我的代码,我也会更加自由地使用行间距。