hawaii 发表于 2008-3-5 14:52:58

fortran简单循环问题求助!

fortran简单循环问题求助!
在FORTRAN的三重循环中,每重为3次循环,总共有27次循环,但循环到20次时则无法进行下去,
百思不得其解,现上网求助各位高手。谢谢!
以下先贴出全部3个程序,其中第1个为主程序program callcdi,第2、第3个为被调用的子程序
subroutine cdi(kxyzi,wi,nIntPnts,nDim)和subroutine kxcd1(xc,hc,nIntPnt1)。问题出在第2个
子程序subroutine cdi(kxyzi,wi,nIntPnts,nDim)的
else if (nDim==3) then
      i=0
      do 40 r=1,nIntPnt1
            do 50 s=1,nIntPnt1
                do 60 t=1,nIntPnt1
                  i=i+1
                  kxyzi(1,i)=xc(r)
                  kxyzi(2,i)=xc(s)
                  kxyzi(3,i)=xc(t)
                  wi(i)=hc(r)*hc(s)*hc(t)
60            end do
50          end do
40      end do
      end if
中。
如果直接把第2个子程序的变量nIntPnts改为常数27,则可顺利执行完其3重循环共27次,
但在第1个主程序仍仅能输出到20次循环的结果,即使也依照处理第2个子程序的办法,
也把把第1个主程序的变量nIntPnts改为常数27,问题也无法等到解决。所以上网来请
教大家。希望大家不吝指教。谢谢大家!
贴子的最后贴出各种调试中间结果和出错信息。

完整的3个程序:

    program callcdi
    external cdi
    integer nIntPnts,nDim,i,j
    double precision kxyzi(3,20),wi(20)
    open (1,file='cdio.txt',status='unknown')
    write(*,*) '请输入总积分点nIntPnts值:'
    read(*,*) nIntPnts
    write(*,*) '请输入维数nDim值:'
    read(*,*) nDim
    call cdi(kxyzi,wi,nIntPnts,nDim)
    do 10 i=1,nIntPnts
      do20 j=1,nDim
            write(1,100) 'kxyzi=(',j,i,')',kxyzi(j,i),'wi=(',i,')',wi(i)
100         format(1x,a10,2i5,a2,e15.2,a10,i5,a2,e15.2)
20      end do
10end do
    close(1)
    end program callcdi
      subroutine cdi(kxyzi,wi,nIntPnts,nDim)
      external kxcd1
      integer nIntPnts,nDim,nIntPnt1,r,s,t,i,j
      double precision kxyzi(nDim,nIntPnts),wi(nIntPnts),xc(nIntPnts),&
   &hc(nIntPnts)
      open (1,file='cdio.txt',status='old')
      nIntPnt1=exp(log(nIntPnts*1.0)/(1.0*nDim))
      write(1,11) 'nDim=',nDim
11   format(1x,a10,i10)
   write(1,15) 'nIntPnts=',nIntPnts
15   format(1x,a10,i10)
      write(1,100) 'nIntPnt1=',nIntPnt1
100   format(1x,a10,i10)
   do 70 i=1,nIntPnts
      do80 j=1,nDim
            write(1,90) 'kxyzi=(',j,i,')',kxyzi(j,i),'wi=(',i,')',wi(i)
90         format(1x,a10,2i5,a2,e15.2,a10,i5,a2,e15.2)
80      end do
70end do
      call kxcd1(xc,hc,nIntPnt1)
      do85 j=1,nIntPnt1
            write(1,95) 'xc=(',j,')',xc(j),'hc=(',j,')',hc(j)
95         format(1x,a10,i5,a2,e15.2,a10,i5,a2,e15.2)
85      end do
      if (nDim==1) then
      do 10 i=1,nIntPnt1
            kxyzi(1,i)=xc(i)
            wi(i)=hc(i)
10      end do
      else if (nDim==2) then
      i=0
      do 20 s=1,nIntPnt1
            do 30 t=1,nIntPnt1
                i=i+1
                kxyzi(1,i)=xc(s)
                kxyzi(2,i)=xc(t)
                wi(i)=hc(s)*hc(t)
30          end do
20      end do
      else if (nDim==3) then
      i=0
      do 40 r=1,nIntPnt1
            do 50 s=1,nIntPnt1
                do 60 t=1,nIntPnt1
                  i=i+1
      write(1,110) 'r=',r
110   format(1x,a10,i10)
      write(1,115) 's=',s
115   format(1x,a10,i10)
      write(1,1000) 't=',t
1000format(1x,a10,i10)
      write(1,1100) 'i=',i
1100format(1x,a10,i10)
      write(1,25) 'nIntPnts=',nIntPnts
25    format(1x,a10,i10)
                  kxyzi(1,i)=xc(r)
                  kxyzi(2,i)=xc(s)
                  kxyzi(3,i)=xc(t)
                  wi(i)=hc(r)*hc(s)*hc(t)
                  
       write(1,1200) 'kxyzi=(',1,i,')',kxyzi(1,i),'wi=(',i,')',wi(i)
1200   format(1x,a10,2i5,a2,e15.2,a10,i5,a2,e15.2)
       write(1,1300) 'kxyzi=(',2,i,')',kxyzi(2,i),'wi=(',i,')',wi(i)
1300   format(1x,a10,2i5,a2,e15.2,a10,i5,a2,e15.2)
       write(1,1400) 'kxyzi=(',3,i,')',kxyzi(3,i),'wi=(',i,')',wi(i)
1400   format(1x,a10,2i5,a2,e15.2,a10,i5,a2,e15.2)
60            end do
50          end do
40      end do
      end if
!      close(1)
      return
      end subroutine cdi
      
      
      subroutine kxcd1(xc,hc,nIntPnt1)
      double precision xc(nIntPnt1),hc(nIntPnt1)
      if (nIntPnt1==1) then
      xc(1)=0.0
      hc(1)=2.0
      else if (nIntPnt1==2) then
      xc(1)=-0.577350269189626
      xc(2)=-xc(1)
      hc(1)=1.0
      hc(2)=1.0
      else if (nIntPnt1==3) then
      xc(1)=-0.774596669241483
      xc(2)=0.0
      xc(3)=-xc(1)
      hc(1)=0.555555555555556
      hc(2)=0.888888888888889
      hc(3)=hc(1)
      end if
      return
      end subroutine kxcd1

用作调试的中间结果:

      nDim=         3
nIntPnts=      27
nIntPnt1=         3
    kxyzi=(    1    1 )       0.00E+00      wi=(    1 )       0.00E+00
    kxyzi=(    2    1 )       0.00E+00      wi=(    1 )       0.00E+00
    kxyzi=(    3    1 )       0.00E+00      wi=(    1 )       0.00E+00
    kxyzi=(    1    2 )       0.00E+00      wi=(    2 )       0.00E+00
    kxyzi=(    2    2 )       0.00E+00      wi=(    2 )       0.00E+00
    kxyzi=(    3    2 )       0.00E+00      wi=(    2 )       0.00E+00
    kxyzi=(    1    3 )       0.00E+00      wi=(    3 )       0.00E+00
    kxyzi=(    2    3 )       0.00E+00      wi=(    3 )       0.00E+00
    kxyzi=(    3    3 )       0.00E+00      wi=(    3 )       0.00E+00
    kxyzi=(    1    4 )       0.00E+00      wi=(    4 )       0.00E+00
    kxyzi=(    2    4 )       0.00E+00      wi=(    4 )       0.00E+00
    kxyzi=(    3    4 )       0.00E+00      wi=(    4 )       0.00E+00
    kxyzi=(    1    5 )       0.00E+00      wi=(    5 )       0.00E+00
    kxyzi=(    2    5 )       0.00E+00      wi=(    5 )       0.00E+00
    kxyzi=(    3    5 )       0.00E+00      wi=(    5 )       0.00E+00
    kxyzi=(    1    6 )       0.00E+00      wi=(    6 )       0.00E+00
    kxyzi=(    2    6 )       0.00E+00      wi=(    6 )       0.00E+00
    kxyzi=(    3    6 )       0.00E+00      wi=(    6 )       0.00E+00
    kxyzi=(    1    7 )       0.00E+00      wi=(    7 )       0.00E+00
    kxyzi=(    2    7 )       0.00E+00      wi=(    7 )       0.00E+00
    kxyzi=(    3    7 )       0.00E+00      wi=(    7 )       0.00E+00
    kxyzi=(    1    8 )       0.00E+00      wi=(    8 )       0.00E+00
    kxyzi=(    2    8 )       0.00E+00      wi=(    8 )       0.00E+00
    kxyzi=(    3    8 )       0.00E+00      wi=(    8 )       0.00E+00
    kxyzi=(    1    9 )       0.00E+00      wi=(    9 )       0.00E+00
    kxyzi=(    2    9 )       0.00E+00      wi=(    9 )       0.00E+00
    kxyzi=(    3    9 )       0.00E+00      wi=(    9 )       0.00E+00
    kxyzi=(    1   10 )       0.00E+00      wi=(   10 )       0.00E+00
    kxyzi=(    2   10 )       0.00E+00      wi=(   10 )       0.00E+00
    kxyzi=(    3   10 )       0.00E+00      wi=(   10 )       0.00E+00
    kxyzi=(    1   11 )       0.00E+00      wi=(   11 )       0.00E+00
    kxyzi=(    2   11 )       0.00E+00      wi=(   11 )       0.00E+00
    kxyzi=(    3   11 )       0.00E+00      wi=(   11 )       0.00E+00
    kxyzi=(    1   12 )       0.00E+00      wi=(   12 )       0.00E+00
    kxyzi=(    2   12 )       0.00E+00      wi=(   12 )       0.00E+00
    kxyzi=(    3   12 )       0.00E+00      wi=(   12 )       0.00E+00
    kxyzi=(    1   13 )       0.00E+00      wi=(   13 )       0.00E+00
    kxyzi=(    2   13 )       0.00E+00      wi=(   13 )       0.00E+00
    kxyzi=(    3   13 )       0.00E+00      wi=(   13 )       0.00E+00
    kxyzi=(    1   14 )       0.00E+00      wi=(   14 )       0.00E+00
    kxyzi=(    2   14 )       0.00E+00      wi=(   14 )       0.00E+00
    kxyzi=(    3   14 )       0.00E+00      wi=(   14 )       0.00E+00
    kxyzi=(    1   15 )       0.00E+00      wi=(   15 )       0.00E+00
    kxyzi=(    2   15 )       0.00E+00      wi=(   15 )       0.00E+00
    kxyzi=(    3   15 )       0.00E+00      wi=(   15 )       0.00E+00
    kxyzi=(    1   16 )       0.00E+00      wi=(   16 )       0.00E+00
    kxyzi=(    2   16 )       0.00E+00      wi=(   16 )       0.00E+00
    kxyzi=(    3   16 )       0.00E+00      wi=(   16 )       0.00E+00
    kxyzi=(    1   17 )       0.00E+00      wi=(   17 )       0.00E+00
    kxyzi=(    2   17 )       0.00E+00      wi=(   17 )       0.00E+00
    kxyzi=(    3   17 )       0.00E+00      wi=(   17 )       0.00E+00
    kxyzi=(    1   18 )       0.00E+00      wi=(   18 )       0.00E+00
    kxyzi=(    2   18 )       0.00E+00      wi=(   18 )       0.00E+00
    kxyzi=(    3   18 )       0.00E+00      wi=(   18 )       0.00E+00
    kxyzi=(    1   19 )       0.00E+00      wi=(   19 )       0.00E+00
    kxyzi=(    2   19 )       0.00E+00      wi=(   19 )       0.00E+00
    kxyzi=(    3   19 )       0.00E+00      wi=(   19 )       0.00E+00
    kxyzi=(    1   20 )       0.00E+00      wi=(   20 )       0.00E+00
    kxyzi=(    2   20 )       0.00E+00      wi=(   20 )       0.00E+00
    kxyzi=(    3   20 )       0.00E+00      wi=(   20 )       0.00E+00
    kxyzi=(    1   21 )       0.57-312      wi=(   21 )       0.00E+00
    kxyzi=(    2   21 )       0.00E+00      wi=(   21 )       0.00E+00
    kxyzi=(    3   21 )       0.00E+00      wi=(   21 )       0.00E+00
    kxyzi=(    1   22 )       0.00E+00      wi=(   22 )       0.00E+00
    kxyzi=(    2   22 )       0.00E+00      wi=(   22 )       0.00E+00
    kxyzi=(    3   22 )       0.21-313      wi=(   22 )       0.00E+00
    kxyzi=(    1   23 )       0.21-313      wi=(   23 )       0.00E+00
    kxyzi=(    2   23 )       0.00E+00      wi=(   23 )       0.00E+00
    kxyzi=(    3   23 )       0.00E+00      wi=(   23 )       0.00E+00
    kxyzi=(    1   24 )       0.00E+00      wi=(   24 )       0.00E+00
    kxyzi=(    2   24 )       0.00E+00      wi=(   24 )       0.00E+00
    kxyzi=(    3   24 )       0.00E+00      wi=(   24 )       0.00E+00
    kxyzi=(    1   25 )       0.00E+00      wi=(   25 )       0.00E+00
    kxyzi=(    2   25 )       0.00E+00      wi=(   25 )       0.00E+00
    kxyzi=(    3   25 )       0.00E+00      wi=(   25 )       0.00E+00
    kxyzi=(    1   26 )       0.00E+00      wi=(   26 )       0.00E+00
    kxyzi=(    2   26 )       0.00E+00      wi=(   26 )       0.00E+00
    kxyzi=(    3   26 )       0.00E+00      wi=(   26 )       0.00E+00
    kxyzi=(    1   27 )       0.00E+00      wi=(   27 )       0.00E+00
    kxyzi=(    2   27 )       0.00E+00      wi=(   27 )       0.00E+00
    kxyzi=(    3   27 )       0.00E+00      wi=(   27 )       0.00E+00
       xc=(    1 )      -0.77E+00      hc=(    1 )       0.56E+00
       xc=(    2 )       0.00E+00      hc=(    2 )       0.89E+00
       xc=(    3 )       0.77E+00      hc=(    3 )       0.56E+00
         r=         1
         s=         1
         t=         1
         i=         1
nIntPnts=      27
    kxyzi=(    1    1 )      -0.77E+00      wi=(    1 )       0.17E+00
    kxyzi=(    2    1 )      -0.77E+00      wi=(    1 )       0.17E+00
    kxyzi=(    3    1 )      -0.77E+00      wi=(    1 )       0.17E+00
         r=         1
         s=         1
         t=         2
         i=         2
nIntPnts=      27
    kxyzi=(    1    2 )      -0.77E+00      wi=(    2 )       0.27E+00
    kxyzi=(    2    2 )      -0.77E+00      wi=(    2 )       0.27E+00
    kxyzi=(    3    2 )       0.00E+00      wi=(    2 )       0.27E+00
         r=         1
         s=         1
         t=         3
         i=         3
nIntPnts=      27
    kxyzi=(    1    3 )      -0.77E+00      wi=(    3 )       0.17E+00
    kxyzi=(    2    3 )      -0.77E+00      wi=(    3 )       0.17E+00
    kxyzi=(    3    3 )       0.77E+00      wi=(    3 )       0.17E+00
         r=         1
         s=         2
         t=         1
         i=         4
nIntPnts=      27
    kxyzi=(    1    4 )      -0.77E+00      wi=(    4 )       0.27E+00
    kxyzi=(    2    4 )       0.00E+00      wi=(    4 )       0.27E+00
    kxyzi=(    3    4 )      -0.77E+00      wi=(    4 )       0.27E+00
         r=         1
         s=         2
         t=         2
         i=         5
nIntPnts=      27
    kxyzi=(    1    5 )      -0.77E+00      wi=(    5 )       0.44E+00
    kxyzi=(    2    5 )       0.00E+00      wi=(    5 )       0.44E+00
    kxyzi=(    3    5 )       0.00E+00      wi=(    5 )       0.44E+00
         r=         1
         s=         2
         t=         3
         i=         6
nIntPnts=      27
    kxyzi=(    1    6 )      -0.77E+00      wi=(    6 )       0.27E+00
    kxyzi=(    2    6 )       0.00E+00      wi=(    6 )       0.27E+00
    kxyzi=(    3    6 )       0.77E+00      wi=(    6 )       0.27E+00
         r=         1
         s=         3
         t=         1
         i=         7
nIntPnts=      27
    kxyzi=(    1    7 )      -0.77E+00      wi=(    7 )       0.17E+00
    kxyzi=(    2    7 )       0.77E+00      wi=(    7 )       0.17E+00
    kxyzi=(    3    7 )      -0.77E+00      wi=(    7 )       0.17E+00
         r=         1
         s=         3
         t=         2
         i=         8
nIntPnts=      27
    kxyzi=(    1    8 )      -0.77E+00      wi=(    8 )       0.27E+00
    kxyzi=(    2    8 )       0.77E+00      wi=(    8 )       0.27E+00
    kxyzi=(    3    8 )       0.00E+00      wi=(    8 )       0.27E+00
         r=         1
         s=         3
         t=         3
         i=         9
nIntPnts=      27
    kxyzi=(    1    9 )      -0.77E+00      wi=(    9 )       0.17E+00
    kxyzi=(    2    9 )       0.77E+00      wi=(    9 )       0.17E+00
    kxyzi=(    3    9 )       0.77E+00      wi=(    9 )       0.17E+00
         r=         2
         s=         1
         t=         1
         i=      10
nIntPnts=      27
    kxyzi=(    1   10 )       0.00E+00      wi=(   10 )       0.27E+00
    kxyzi=(    2   10 )      -0.77E+00      wi=(   10 )       0.27E+00
    kxyzi=(    3   10 )      -0.77E+00      wi=(   10 )       0.27E+00
         r=         2
         s=         1
         t=         2
         i=      11
nIntPnts=      27
    kxyzi=(    1   11 )       0.00E+00      wi=(   11 )       0.44E+00
    kxyzi=(    2   11 )      -0.77E+00      wi=(   11 )       0.44E+00
    kxyzi=(    3   11 )       0.00E+00      wi=(   11 )       0.44E+00
         r=         2
         s=         1
         t=         3
         i=      12
nIntPnts=      27
    kxyzi=(    1   12 )       0.00E+00      wi=(   12 )       0.27E+00
    kxyzi=(    2   12 )      -0.77E+00      wi=(   12 )       0.27E+00
    kxyzi=(    3   12 )       0.77E+00      wi=(   12 )       0.27E+00
         r=         2
         s=         2
         t=         1
         i=      13
nIntPnts=      27
    kxyzi=(    1   13 )       0.00E+00      wi=(   13 )       0.44E+00
    kxyzi=(    2   13 )       0.00E+00      wi=(   13 )       0.44E+00
    kxyzi=(    3   13 )      -0.77E+00      wi=(   13 )       0.44E+00
         r=         2
         s=         2
         t=         2
         i=      14
nIntPnts=      27
    kxyzi=(    1   14 )       0.00E+00      wi=(   14 )       0.70E+00
    kxyzi=(    2   14 )       0.00E+00      wi=(   14 )       0.70E+00
    kxyzi=(    3   14 )       0.00E+00      wi=(   14 )       0.70E+00
         r=         2
         s=         2
         t=         3
         i=      15
nIntPnts=      27
    kxyzi=(    1   15 )       0.00E+00      wi=(   15 )       0.44E+00
    kxyzi=(    2   15 )       0.00E+00      wi=(   15 )       0.44E+00
    kxyzi=(    3   15 )       0.77E+00      wi=(   15 )       0.44E+00
         r=         2
         s=         3
         t=         1
         i=      16
nIntPnts=      27
    kxyzi=(    1   16 )       0.00E+00      wi=(   16 )       0.27E+00
    kxyzi=(    2   16 )       0.77E+00      wi=(   16 )       0.27E+00
    kxyzi=(    3   16 )      -0.77E+00      wi=(   16 )       0.27E+00
         r=         2
         s=         3
         t=         2
         i=      17
nIntPnts=      27
    kxyzi=(    1   17 )       0.00E+00      wi=(   17 )       0.44E+00
    kxyzi=(    2   17 )       0.77E+00      wi=(   17 )       0.44E+00
    kxyzi=(    3   17 )       0.00E+00      wi=(   17 )       0.44E+00
         r=         2
         s=         3
         t=         3
         i=      18
nIntPnts=      27
    kxyzi=(    1   18 )       0.00E+00      wi=(   18 )       0.27E+00
    kxyzi=(    2   18 )       0.77E+00      wi=(   18 )       0.27E+00
    kxyzi=(    3   18 )       0.77E+00      wi=(   18 )       0.27E+00
         r=         3
         s=         1
         t=         1
         i=      19
nIntPnts=      27
    kxyzi=(    1   19 )       0.77E+00      wi=(   19 )       0.17E+00
    kxyzi=(    2   19 )      -0.77E+00      wi=(   19 )       0.17E+00
    kxyzi=(    3   19 )      -0.77E+00      wi=(   19 )       0.17E+00
         r=         3
         s=         1
         t=         2
         i=      20
nIntPnts=      27
    kxyzi=(    1   20 )       0.77E+00      wi=(   20 )       0.27E+00
    kxyzi=(    2   20 )      -0.77E+00      wi=(   20 )       0.27E+00
    kxyzi=(    3   20 )       0.00E+00      wi=(   20 )       0.27E+00
         r=         3
         s=         1
         t=         3
         i=      21
nIntPnts=      27


调试输出窗口信息:
“callcdi.exe”: 已加载“E:\...\callcdi\Debug\callcdi.exe”,已加载符号。
“callcdi.exe”: 已加载“C:\WINDOWS\system32\ntdll.dll”,未加载任何符号。
“callcdi.exe”: 已加载“C:\WINDOWS\system32\kernel32.dll”,未加载任何符号。
“callcdi.exe”: 已加载“C:\WINDOWS\system32\imagehlp.dll”,未加载任何符号。
“callcdi.exe”: 已加载“C:\WINDOWS\system32\msvcrt.dll”,未加载任何符号。
“callcdi.exe”: 已加载“C:\WINDOWS\system32\dbghelp.dll”,未加载任何符号。
“callcdi.exe”: 已加载“C:\WINDOWS\system32\version.dll”,未加载任何符号。
“callcdi.exe”: 已加载“C:\WINDOWS\system32\advapi32.dll”,未加载任何符号。
“callcdi.exe”: 已加载“C:\WINDOWS\system32\rpcrt4.dll”,未加载任何符号。
callcdi.exe 中的 0x0040e5ea 处未处理的异常: 用户断点 。
程序“ callcdi.exe: 本机”已退出,返回值为 0 (0x0)。


附图为另一调试输出窗口信息:
页: [1]
查看完整版本: fortran简单循环问题求助!