回 帖 发 新 帖 刷新版面

主题:继续求解答!求指导!我承认我比较笨~

很感谢之前几位前辈的指导,我把程序重新整理了一下,发现还是越界了。而且我不知道我的输出是否是正确的。请指导。万分感谢!

对了,我觉得问题就是出在后面那个收敛条件。
program main
implicit none

!参数设置
integer,parameter::N=11,K=1000
real t(K,N) !温度的二维数组,K表示时刻,N表示节点
integer i,j,C
real tf1,tf2,h
real Bi,Fo,e
tf1=10.0
tf2=20.0
h=1000.0
Bi=0.3
Fo=0.08617
e=0.01

!设置初始温度
DO j=1,N
   t(1,j)=100.0
end do
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!计算节点温度

C=0 !设置一个计数器,代表迭代次数
do i=1,k-1
  C=C+1
  do j=1,N
      if(j==1)then
            t(i+1,j)=t(i,j)*(1-2*Fo*Bi-2*Fo)+2*Fo*t(i,j+1)+2*Fo*Bi*tf1 !计算左边节点的温度
      else if(j>1.AND.j<N)then

              t(i+1,j)=Fo*(t(i,j+1)+t(i,j-1))+(1-2*Fo)*t(i,j) !计算中间节点的温度
      else
             t(i+1,j)=t(i,j)*(1-2*Fo*Bi-2*Fo)+2*Fo*t(i,j-1)+2*Fo*Bi*tf2 !计算右边节点的温度
      end if
   end do
   if(ABS(t(i+1,j)-t(i,j)).LE.e)exit  !收敛条件,即当两个时刻的温度差的绝对值小于e时退出循环
end do

!输出结果,即输出收敛时刻的温度值
do j=1,11
    write(*,*)t(C,j)
end do
stop
end program

回复列表 (共2个回复)

沙发


现在我找到错误的原因了,就是那个收敛条件,程序无法判断是哪个节点的上下时刻的温度差,我只要把abs(t(i+1,j)-t(i,j).LE.e 改为abs(t(i+1,1)-t(i,1).LE.e 就可以了。
可是我想问,我如何才能让他自行判断当每一个节点的上下时刻温度差都小于e呢?

板凳

可以考虑用forall判断是不是所有的节点都达到要求. 具体可以查查资料.
ABS(t(i+1,j)-t(i,j)).LE.e 这一句出错可能是因为j已经离开循环区域. 离开循环区域 j=1,N 循环指标j具体值由编译器决定, 所以不要主观判断它的值.(就是说j不一定等于N, 虽然很多情况是会是.)

我来回复

您尚未登录,请登录后再回复。点此登录或注册