回 帖 发 新 帖 刷新版面

主题:[讨论]大计算量程序无故退出,如果才能够进行跟踪?求高人指教。

与伙伴共同编写了一个工程计算程序。基本的结构为,按照物理方程进行多次迭代的微分计算。计算中有些量需要从已有的dat数据库文件获取,计算结束后将结果写入输出文件。

程序规模不大,大概有十多个子模块,在计算时有大量的循环与调用。

目前碰到的问题是:
1.当外循环计算到数千次,但还未达到循环结束条件时,程序会自动退出。

2.退出时无任何报错,控制台和xp系统均无报错。程序编译完全正常,无任何错误。

3.从退出的计算状态继续算,可以算下去,但是再运行数千次,再次自动退出。


检查了所有的动态数值均有deallocate,检查了程序中的exit的所在位置。

由于程序并不是在刚开始计算时就退出,故无法debug跟踪,不知道有什么好的方法可以找出程序自动退出的原因? 

恳请大家指导。

回复列表 (共5个回复)

沙发

“由于程序并不是在刚开始计算时就退出,故无法debug跟踪”

明显不是因果关系,刚开始crt初始化错误才没法debug,其他都不可能

debug不加断点不就得了,看哪里会跳出,然后看堆栈

板凳

楼主的意思是,单步调试太复杂,因为循环量很大。点 step in ,step out 很累

其实可以在代码的开始,前期,中间,后期,结尾 出分别加断点,看运行到哪里就不行了。然后逐步找出错误的代码段,缩小到错误的循环处。

3 楼

我尝试过了。因为每次计算都要算2-3个小时才会意外退出。

所以我如果使用debug模式根本没办法设置断点,不是循环量大的问题,想想估计键盘都按坏了都还没跟踪到相应位置。

目前我用的笨办法,就是每个模块进入时print一下,退出时print一下,然后将屏幕输出写入文件,乖乖,这文件有6个G。还好用UEDIT打开了,发现每次都在一个调用数据库并进行插值的模块退出。

该模块其实在计算中一直被反复调用,至少被调用了数万次吧,为虾米会在某一时刻自动退出呢。

关键是从退出点继续算又可以算,然后算个数万次又退出。郁闷。

4 楼

我把这段代码帖出来给大家看看吧,我确实检查不出问题来了。
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 楼

退出发生在进入以下循环后
            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

我来回复

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