Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran Lid.exe中0x001D6653处未处理的异常:0xc0000094:整数除零_Fortran - Fatal编程技术网

Fortran Lid.exe中0x001D6653处未处理的异常:0xc0000094:整数除零

Fortran Lid.exe中0x001D6653处未处理的异常:0xc0000094:整数除零,fortran,Fortran,我正在尝试用Fortran编写盖子驱动型腔的代码 当我想运行代码时,突然出现整数除以零的错误 我知道问题出在哪里,但不知道如何解决。为了避免这个问题,我甚至改变了一些数字,但还是发生了。 我上传了错误的照片 我搜索过,并且有一些C++的答案,但是我找不到FORTRAN的任何东西。 Program Lid implicit none Integer :: I,J,nx, ny, dx, dy, L, W, Iteration, Max_Iteration , Re, M

我正在尝试用Fortran编写盖子驱动型腔的代码

当我想运行代码时,突然出现
整数除以零的错误

我知道问题出在哪里,但不知道如何解决。为了避免这个问题,我甚至改变了一些数字,但还是发生了。 我上传了错误的照片

我搜索过,并且有一些C++的答案,但是我找不到FORTRAN的任何东西。

Program Lid
    
    implicit none
    Integer :: I,J,nx, ny, dx, dy, L, W, Iteration, Max_Iteration , Re, M, N, dt
    Real :: Delta
    Real, allocatable :: u(:,:), v(:,:), p(:,:), u_old(:,:), v_old(:,:), p_old(:,:), X(:), Y(:)
    !***************************************************!

    PRINT *, "ENTER THE DESIRED POINTS ..." 
    PRINT *, "... IN X DIRECTION:  SUGGESTED RANGE (20-200)" 
    READ*, M 
    PRINT *, "... IN Y DIRECTION:  SUGGESTED RANGE (10-100)" 
    READ*, N 
    
    ! Define Geometry
    dt = 0.001
    Delta = 2
    Re = 100
    L = 10
    W = 10
    dx = L /Real(M-1)
    dy = W /Real(N-1)
    
    ALLOCATE (X(M),Y(N),u(M,N),u_old(M,N),v(M,N),v_old(M,N),p(M,N),p_old(M,N))
    
    ! Grid Generation
    
    Do I = 1, M
        x(I) = (I-1)* dx
    End Do
    
    Do J=1 , N
        y(J) = (J-1) * dy
    End Do
     
    ! Boundray Condition
    Do I=1 , M
        u(I,1) = 0
        u(1,I) = 0
        u(M,I) = 0
        u(I,M) = 1       ! Lid Velocity
    End Do
    
    Do J=1, N
        v(J,1) = 0
        v(1,J) = 0
        v(J,N) = 0
        v(M,J) = 0
    End Do
    
    ! Initialization
    
    Do I=2, M-1
        Do J=2, N-1
            
            u(I,J) = 0
            v(I,J) = 0
            p(I,J) = 0
            
        End Do
        
    End Do
    
    ! Solver
        Do I=2, M-1
            Do J=2, N-1
                u_old(I,J) = u(I,J) 
                v_old(I,J) = v(I,J)
                p_old(I,J) = p(I,J)
            
                u(I,J) = - dt / 4* dx * (( u(I, J+1)+ u_old(I,J))**2 - (u_old(I, J)+u(I,J-1))**2) - dt / 4* dy * ((u_old(I,J)+ u(I-1,J)) &
                    * (v(I-1,J) + v(I-1, J+1)) - (u_old(I,J) + u(I+1,J)) * (v_old(I,J) + v(I,J+1))) - dt / dx *(p(I, J+1) - p(I,J)) &
                    + dt / Re * ((u(I+1,J) - 2 * u_old(I,J) + u(I-1,J)) / dx**2 + (u(I,J+1) - 2 * u_old(I,J) + u(I,J+1)) / dy**2) + u_old(I,J)
            
                v(I,J) = - dt / 4* dy * (( v(I-1, J)+ v(I-1,J+1))**2 - (v_old(I, J)+v(I,J+1))**2) - dt / 4* dx * ((u_old(I,J)+ u(I,J+1)) &
                    * (v(I,J+1) + v(I-1, J+1)) - (u_old(I,J) + u(I,J-1)) * (v_old(I,J) + v(I-1,J))) - dt / dy *(p(I, J+1) - p(I,J)) &
                    + dt / Re * ((v(I+1,J) - 2 * v_old(I,J) + v(I-1,J)) / dx**2 + (v(I,J+1) - 2 * v_old(I,J) + v(I,J+1)) / dy**2) + v_old(I,J)
            
                p(I,J) = - Delta * dt / 2 * ((u(I,J+1)+ u_old(I,J)) - (u_old(I,J) + u(I,J-1))) - Delta * dt / 2 &
                    * ((v(I-1,J)+ v(I-1,J+1)) - (v_old(I,J) + v(I,J+1)))
            
            End Do
        
        End Do
        
    
    !-----------------------OUTPUTS GENERATION----------------------------- 
OPEN (1,FILE='FIELD.PLT') 
WRITE (1,*) 'VARIABLES=X,Y,u,v,p' 
WRITE (1,*) 'ZONE I=',M,' J=',N 
DO J=1,N 
  DO I=1,M 
    WRITE (1,*) X(I),Y(J),u(I,J),v(I,J),p(I,J)
  END DO 
END DO 
    
End Program Lid

假设图像上显示的黄色箭头指示发生异常的行(72):

显然,
dx
为零或变为零,因为这是在该行上进行的唯一除法

您必须知道当
dx
为零时它意味着什么,或者是什么导致它,除非是编程或数据输入问题导致它

在任何情况下,都必须确保不执行代码中被零除的部分


您需要做什么来防止这种情况,完全取决于您的代码应该做什么。我帮不了你。

如果你用调试器运行它,你可能会逐步解决并缩小问题范围。与理论相比,它是一个代码错误,或者理论错误,或者输入错误,或者被0除,应该被允许,并且可能导致+/-无穷大。编译标志可以修改如何处理0除法。如果您使用ifort,这里有一些帮助谢谢。。。这个问题已经解决了…但还有另一个问题。当我运行代码时,完全没有发生任何事情,只是说“…已退出代码0(0x0)…”。我不知道是问新问题还是在这里问我的问题,我相信如果M或N大于10,那么dx(整数)可能最终为0。(我想我的编译器会对我大喊大叫,说dx是整数,需要四舍五入)也许在计算dx或dy之后进行检查。它没有给不向前迈进的意义…而且我认为在结束程序之前关闭文件将是一件好事。