主题:[讨论]大计算量程序无故退出,如果才能够进行跟踪?求高人指教。
bluefrog76
[专家分:0] 发布于 2012-05-08 19:01:00
与伙伴共同编写了一个工程计算程序。基本的结构为,按照物理方程进行多次迭代的微分计算。计算中有些量需要从已有的dat数据库文件获取,计算结束后将结果写入输出文件。
程序规模不大,大概有十多个子模块,在计算时有大量的循环与调用。
目前碰到的问题是:
1.当外循环计算到数千次,但还未达到循环结束条件时,程序会自动退出。
2.退出时无任何报错,控制台和xp系统均无报错。程序编译完全正常,无任何错误。
3.从退出的计算状态继续算,可以算下去,但是再运行数千次,再次自动退出。
检查了所有的动态数值均有deallocate,检查了程序中的exit的所在位置。
由于程序并不是在刚开始计算时就退出,故无法debug跟踪,不知道有什么好的方法可以找出程序自动退出的原因?
恳请大家指导。
回复列表 (共5个回复)
沙发
dongyuanxun [专家分:7180] 发布于 2012-05-08 21:08:00
“由于程序并不是在刚开始计算时就退出,故无法debug跟踪”
明显不是因果关系,刚开始crt初始化错误才没法debug,其他都不可能
debug不加断点不就得了,看哪里会跳出,然后看堆栈
板凳
臭石头雪球 [专家分:23030] 发布于 2012-05-09 16:15:00
楼主的意思是,单步调试太复杂,因为循环量很大。点 step in ,step out 很累
其实可以在代码的开始,前期,中间,后期,结尾 出分别加断点,看运行到哪里就不行了。然后逐步找出错误的代码段,缩小到错误的循环处。
3 楼
bluefrog76 [专家分:0] 发布于 2012-05-09 21:58:00
我尝试过了。因为每次计算都要算2-3个小时才会意外退出。
所以我如果使用debug模式根本没办法设置断点,不是循环量大的问题,想想估计键盘都按坏了都还没跟踪到相应位置。
目前我用的笨办法,就是每个模块进入时print一下,退出时print一下,然后将屏幕输出写入文件,乖乖,这文件有6个G。还好用UEDIT打开了,发现每次都在一个调用数据库并进行插值的模块退出。
该模块其实在计算中一直被反复调用,至少被调用了数万次吧,为虾米会在某一时刻自动退出呢。
关键是从退出点继续算又可以算,然后算个数万次又退出。郁闷。
4 楼
bluefrog76 [专家分:0] 发布于 2012-05-09 22:03:00
我把这段代码帖出来给大家看看吧,我确实检查不出问题来了。
SUBROUTINE ****************(LogBook,SizeLB,DataPath,SizeDP,AirCond,AntiIce,TDISA,PA,Mach,ThrustNTO,GRAVITY)
IMPLICIT NONE
INTEGER :: SizeLB,SizeDP,AirCond,AntiIce
REAL :: TDISA,PA,Mach,ThrustNTO,GRAVITY
CHARACTER(SizeLB) :: LogBook
CHARACTER(SizeDP) :: DataPath
INTEGER :: I,J
INTEGER :: NumTemp,NumPA,NumPerL
REAL,ALLOCATABLE :: TempDTBS(:),PADTBS(:),MachDTBS(:),ThrustDTBS(:),ThrustPA(:),ThrustTemp(:)
CHARACTER*200 :: FilePathName
FilePathName(1:SizeDP) = DataPath
FilePathName(SizeDP+1:SizeDP+16) = 'ENG_110413.NTOTH'
OPEN(10,FILE = FilePathName)
READ(10,*) NumPerL,NumPA,NumTemp
READ(10,*)
ALLOCATE(TempDTBS(NumTemp))
ALLOCATE(PADTBS(NumPA))
ALLOCATE(MachDTBS(NumPerL))
ALLOCATE(ThrustDTBS(NumPerL))
ALLOCATE(ThrustPA(NumPA))
ALLOCATE(ThrustTemp(NumTemp))
DO I = 1,NumTemp
READ(10,*) TempDTBS(I)
DO J=1,NumPA
READ(10,*) PADTBS(J)
READ(10,*) MachDTBS(1:NumPerL)
READ(10,*) ThrustDTBS(1:NumPerL)
CALL LINEAR_INTERPOLATION(MachDTBS,ThrustDTBS,NumPerL,Mach,ThrustPA(J))
END DO
CALL LINEAR_INTERPOLATION(PADTBS,ThrustPA,NumPA,PA,ThrustTemp(I))
END DO
CALL LINEAR_INTERPOLATION(TempDTBS,ThrustTemp,NumTemp,TDisa,ThrustNTO)
ThrustNTO = ThrustNTO*GRAVITY
CLOSE(10)
DEALLOCATE(TempDTBS,PADTBS,MachDTBS,ThrustDTBS,ThrustPA,ThrustTemp)
END SUBROUTINE ******************
5 楼
bluefrog76 [专家分:0] 发布于 2012-05-09 22:06:00
退出发生在进入以下循环后
DO J=1,NumPA
READ(10,*) PADTBS(J)
READ(10,*) MachDTBS(1:NumPerL)
READ(10,*) ThrustDTBS(1:NumPerL)
CALL LINEAR_INTERPOLATION(MachDTBS,ThrustDTBS,NumPerL,Mach,ThrustPA(J))
END DO
下面是插值代码
SUBROUTINE LINEAR_INTERPOLATION(INDER_VAR,DER_VAR,Size,INTER_VALUE,OUT_VALUE)
IMPLICIT NONE
INTEGER :: I,J,Size
REAL :: INTER_VALUE,OUT_VALUE,TEMP1,TEMP2,K,INDER_VAR(Size),DER_VAR(Size)
DO J = Size-1,1,-1
DO I = 1,J
IF(INDER_VAR(I)>INDER_VAR(I+1)) THEN
TEMP1 = INDER_VAR(I)
TEMP2 = DER_VAR(I)
INDER_VAR(I) = INDER_VAR(I+1)
DER_VAR(I) = DER_VAR(I+1)
INDER_VAR(I+1) = TEMP1
DER_VAR(I+1) = TEMP2
ENDIF
ENDDO
ENDDO
DO I = 1,Size
IF(INTER_VALUE.LE.INDER_VAR(I)) EXIT
END DO
IF(INTER_VALUE.LE.INDER_VAR(1)) I = 2
IF(INTER_VALUE.GE.INDER_VAR(Size)) I = Size
K = (DER_VAR(I)-DER_VAR(I-1))/(INDER_VAR(I)-INDER_VAR(I-1))
OUT_VALUE = K*INTER_VALUE+(DER_VAR(I)-K*INDER_VAR(I))
END SUBROUTINE LINEAR_INTERPOLATION
我来回复