24小时热门版块排行榜    

查看: 2747  |  回复: 10

fish8900

金虫 (小有名气)

[求助] fortran的debug调试

1、调试过程中设置断点后,程序运行到断点后停止,接下来让程序继续运行应该按哪个图标啊?
2、有一个程序会循环很多次,前面都不会出问题,到后面某一步会出现错误,对于这种情况应该怎么设置断点?例如
do time=1,2000

PW(1)=1
DO 203 w1=1,100
   DO 202 w0=1,100
   AXA1=0.0
   bxb1=0.0
     DO I=NIF1,NIF2
           DO J=0,JF(I)   
                   S1(I,J)=S(I,J)
       end do
     end do

     DO I=NIB1,NIB2
           DO J=0,JB(I)
                   BS1(I,J)=BS(I,J)
       end do
         end do


do w2=1,20

  DO I=NIF1,NIF2

         S(I,-1)=S(I,1)
          S(I+1,-1)=S(I+1,1)
         S(I-1,-1)=S(I-1,1)

         DO J=0,JF(I)
           if(t(i,j,0)<=tm)then
                          s(i,j)=0.0
                          else
               SX=0.5*(S(I+1,J)-S(I-1,J))/DI
                   SY=0.5*(S(I,J+1)-S(I,J-1))/DJ
                    if((abs(sx)>=1.0e+7).or.(abs(sy)>=1.0e+7))then
                          s(i,j)=tl
                          bs(i,j)=0.0
                        else

                 SYY=(S(I,J+1)-2.0*S(I,J)+S(I,J-1))/(DJ*DJ)
                 SXX=(S(I+1,J)-2.0*S(I,J)+S(I-1,J))/(DI*DI)
                SXY=0.25*(S(I+1,J+1)-S(I-1,J+1)-S(I+1,J-1)+S(I-1,J-1))/(DI*DJ)            
                SS1=1.0+SX*SX
                SS2=1.0+SY*SY
                SS3=SQRT(1.0+SX**2+SY**2)**3
                SS4=2.0*SX*SY*SXY
                             E1=SS3*P9*G9
                                 E2=SS3*(P(I,J)-PW(w1))-SGM(I,J,0)*SS4
                                G1=SGM(I,J,0)*SS1/(DJ*DJ)
                                G2=SGM(I,J,0)*SS2/(DI*DI)

S(I,J)=(E2+G1*(S(I,J+1)+S(I,J-1))+G2*(S(I+1,J)+S(I-1,J)))/(E1+2.0*G1+2.0*G2)
             end if
                end if

               
      if(w2/=20)goto 200

     AXA1=AXA1+S(I,J)*DI*DJ*1.0E+3
      AXA(w1)=AXA1

200               end do
      end do

end do

do w2=1,20

  DO I=NIB1,nib2

        BS(I,-1)=BS(I,1)
        BS(I+1,-1)=BS(I+1,1)
        BS(I-1,-1)=BS(I-1,1)

        DO J=0,JB(I)
            if(t(i,j,mz)<=tm)then
                          bs(i,j)=0.0
                          else
                BSX=0.5*(BS(I+1,J)-BS(I-1,J))/DI
                BSY=0.5*(BS(I,J+1)-BS(I,J-1))/DJ
                   if((abs(bsx)>=1.0e+7).or.(abs(bsy)>=1.0e+7))then
                         s(i,j)=tl
                         bs(i,j)=0.0
                                else
                BSXX=(BS(I+1,J)-2.0*BS(I,J)+BS(I-1,J))/(DI*DI)
                BSYY=(BS(I,J+1)-2.0*BS(I,J)+BS(I,J-1))/(DJ*DJ)
                BSXY=0.25*(BS(I+1,J+1)-BS(I-1,J+1)-BS(I+1,J-1)+BS(I-1,J-1))/(DI*DJ)
                BSS1=1.0+BSX*BSX
                BSS2=1.0+BSY*BSY                   
                BSS3=SQRT(1.0+BSX**2+BSY**2)**3
                BSS4=2.0*BSX*BSY*BSXY

                          BE1=BSS3*P9*G9
                        BE2=BSS3*(-PW(w1)-P9*G9*TL)+SGM(I,J,mz)*BSS4
                        BG1=SGM(I,J,mz)*BSS1/(DJ*DJ)
                        BG2=SGM(I,J,mz)*BSS2/(DI*DI)

                  BS(I,J)=(BE2-BG1*(BS(I,J+1)+BS(I,J-1))-BG2*(BS(I+1,J)+BS(I-1,J)))/(BE1-2.0*BG1-2.0*BG2)
                end if

                end if

     if(w2/=20)goto 201

     BXB1=BXB1+BS(I,J)*DI*DJ*1.0E+3
     BXB(w1)=BXB1

201             end do
       end do

end do

      DO I=NIF1,NIF2
        DO J=0,JF(I)

          S2=S(I,J)-S1(I,J)
            IF(ABS(S2/MAX(ABS(S1(I,J)),1.0E-5)).GE.1.0E-3) GO TO 202           
                 end do
          end do

      do I=NIB1,NIB2
        do J=0,JB(I)
          BS2=BS(I,J)-BS1(I,J)
            IF(ABS(BS2/MAX(ABS(BS1(I,J)),1.0E-5)).GE.1.0E-3) GO TO 202        
                end do
          end do


GOTO 204

202 continue



204  IF(w1<3) THEN
        PW(w1+1)=PW(w1)+10
        ELSE
         SD1=(AXA(w1-1)-BXB(w1-1))-(AXA(w1)-BXB(w1))
                 SD2=(PW(w1-1)-PW(w1))

      if(sd1==0.0)then
                sd1=1.0E-10
                end if

                  PW(w1+1)=PW(w1)-(AXA(w1)-BXB(w1))*SD2/SD1

        END IF

         if(w1.GT.6) THEN
                 !SDDX=AXA(w1)-BXB(w1)
                 SDDX=BXB(w1)-AXA(W1)

                 IF(ABS(SDDX).LE.1.0E-8)then                              
                 GOTO 205
                 ELSE
                 GOTO 203
             end if
         end if

203 continue
  
当time=1000时会出现出现报错,但前面都是好好的,我想从1000开始观察sqrt()函数里面的数值的变化,断点应该怎么设置啊
3、出现无穷大的数值时,无穷大的数能不能和具体的某个数进行比较啊?就像上面那个程序里的sx如果出现为无穷大,sx能和1.0e+8进行比较?
回复此楼

» 收录本帖的淘帖专辑推荐

Fortran程序

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   关注TA 给TA发消息 送TA红花 TA的回帖

oven1986

至尊木虫 (知名作家)

钓鱼岛岛主兼琉球地下党总书记

【答案】应助回帖


感谢参与,应助指数 +1
xzhdty: 金币+1, 谢谢参与 2013-04-29 08:13:54
先回答一个吧 如果要调试找出错误,可以用print,write,pause等语句写出来,观察是否能运行出来。这样慢慢就能逼近发生错误的地方。放置点肯定是完整的do..enddo语句之前之后。
优秀是一种习惯!
2楼2013-04-25 16:55:57
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

fish8900

金虫 (小有名气)

你说的方法我也试过哈,出现的错误是出现了NAN,我也不太懂为什么会出现这个,所以想请教下。还有就是实在无法避免的话,用什么判据能继续接着运行后面的程序
3楼2013-04-25 21:25:01
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

zhangghost

银虫 (初入文坛)

【答案】应助回帖


感谢参与,应助指数 +1
xzhdty: 金币+1, 谢谢参与 2013-04-29 08:13:40
你应该首先说明你的编译环境,CVF6.5还是IVF,当然这些也不重要

1. 断点处继续运行直接按F5,如果是CVF的话是感叹号右边的书页形符号,IVF点三角符号。

2.解决方法很多,给一个简单易懂的吧,添加一个if语句,在里面添加断点
  if(time=1000) then
      !在这里随便写个语句然后添加断点
  endif
3. 出现NAN基本上是你代码中有一些小问题,先解决掉。
4楼2013-04-27 16:32:31
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

fish8900

金虫 (小有名气)

引用回帖:
4楼: Originally posted by zhangghost at 2013-04-27 16:32:31
你应该首先说明你的编译环境,CVF6.5还是IVF,当然这些也不重要

1. 断点处继续运行直接按F5,如果是CVF的话是感叹号右边的书页形符号,IVF点三角符号。

2.解决方法很多,给一个简单易懂的吧,添加一个if语句, ...

出现NAN我找了很长时间的错误,都没能发现是哪出错了,所以很纠结啊!其实主要的还是第三个问题一直困扰着我
5楼2013-04-27 20:55:31
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

gaolugang

木虫 (小有名气)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
fish8900: 金币+30, ★★★很有帮助 2013-05-08 15:02:47
1. 看你的IDE, 一般是<F5>, 或者点<运行>那个按钮。
2. 用PAUSE 语句来实现。
do time=1,2000
...
...
if (time.eq.100) then
pause
...
...
enddo
3. NaN (Not a Number) 出现的情况,是因为你的程序中有0/0的运算。找到这个bug就可以解决。
至于楼主说的无穷大,我没有理解是什么意思。 NaN 不是无穷大, 他的意思是Not a Number.
6楼2013-05-03 01:42:48
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

spoweryang

新虫 (小有名气)

【答案】应助回帖

查一查你的变量定义类型,在计算中是否出现常量与变量运算不一致的情况

» 本帖已获得的红花(最新10朵)

7楼2013-05-03 04:55:03
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

fish8900

金虫 (小有名气)

送红花一朵
引用回帖:
7楼: Originally posted by spoweryang at 2013-05-03 04:55:03
查一查你的变量定义类型,在计算中是否出现常量与变量运算不一致的情况

常量与变量运算不一致指的是什么意思啊?
8楼2013-05-08 15:00:12
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

fish8900

金虫 (小有名气)

引用回帖:
6楼: Originally posted by gaolugang at 2013-05-03 01:42:48
1. 看你的IDE, 一般是<F5>, 或者点<运行>那个按钮。
2. 用PAUSE 语句来实现。
do time=1,2000
...
...
if (time.eq.100) then
pause
...
...
enddo
3. NaN (Not a Number) 出现的情况,是 ...

那应该具体如何找呢?能不能详细的说一下?
9楼2013-05-08 15:02:34
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

gaolugang

木虫 (小有名气)

【答案】应助回帖

引用回帖:
9楼: Originally posted by fish8900 at 2013-05-08 15:02:34
那应该具体如何找呢?能不能详细的说一下?...

我更倾向于吧变量的值打印出来,写到一个log文件里。然后观察在哪一步,哪个值出的问题。你也可以,一步一步的调试,找到出错的那条语句,出错的变量。
10楼2013-05-09 01:57:37
已阅   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 fish8900 的主题更新
信息提示
请填处理意见