Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Check Error In Fortran

  1. Oct 1, 2012 #1
    Dear all,

    I'm write code in Fortran language when compile my program I got error message :

    forrtl: severe (71): integer divide by zero
    Image PC Routine Line Source
    f0511 00000000007536A5 Unknown Unknown Unknown
    f0511 00000000007538C8 Unknown Unknown Unknown
    f0511 000000000040347C Unknown Unknown Unknown
    libc.so.6 000000338101ECDD Unknown Unknown Unknown
    f0511 0000000000403379 Unknown Unknown Unknown
    make: *** [all] Error 71

    How I can fix this problem if the error message didn't give the line that indicates error? I don't have idea to solve this.
     
  2. jcsd
  3. Oct 1, 2012 #2

    Mark44

    Staff: Mentor

    Are you doing any division in your code? That's where I would look.

    If you still can't find the problem, post your code and we'll take a look.
     
  4. Oct 1, 2012 #3
    read the user's manual for the compiler, look for flags to enhance runtime error reporting, like debug, or not removing the symbol table or divide-by-zero....I know that g95, for example, if you have an environment variable declared appropriately, it will tell you about it, etc.
     
  5. Oct 1, 2012 #4
    Yes I doing any division in my code. I tried to put flags in my code the error messages still same.
     
  6. Oct 2, 2012 #5

    Mark44

    Staff: Mentor

    Wherever you are doing division, put in a guard statement to prevent division by zero.
    For example, if I'm going to divide by radius (an integer value), I can do this:
    Code (Text):

    IF radius .neq. 0 THEN
       result = numerator / radius
    ELSE
       WRITE *, "Error - Division by zero."
    ENDIF
     
    If the denominator is a floating point value, the above won't work, but something like the following will work.
    Code (Text):

    IF ABS(radius) .leq. 1E-07 THEN
       result = numerator / radius
    ELSE
       WRITE *, "Error - Division by zero."
    ENDIF
     
    If radius is a number between -.0000001 and +.0000001, the division is not performed. I picked the value to test against somewhat arbitrarily - you can use a smaller value or one that is larger.
     
  7. Oct 2, 2012 #6
    Thank Mark44 I will try your solution. :smile:
     
  8. Oct 2, 2012 #7
    I forgot that I'm not use division. When I try put for if else end if, I still get error. This is my line code:

    Factorize A
    Factorize A
    call cpu_time(start)
    CALL dgetrf(n,n,a,lda,ipiv,info)

    IF (info==0) THEN
    ! Compute solution
    CALL dgetrs(trans,n,nrhs,a,lda,ipiv,b,ldb,info)
    call cpu_time(finish)
    ! Print solution
    ! ifail: behaviour on error exit
    ! =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft
    ifail = 0
    DO I = 1,N
    !print 1000, b(i,nrhs)
    END DO
    print*,B(5,1)
    !print*,B
    ELSE
    WRITE (nout,*) 'The factor U is singular'
    END IF
    print *,'time OV=',finish - start

    I already use else if for another purpose how I put another branch for condition integer divide by zero ?
     
  9. Oct 2, 2012 #8

    Mark44

    Staff: Mentor

    Your code isn't complete enough to determine what's going wrong, but I would bet that you are not calling dgetrs subroutine correctly or that your Fortran installation is not set up correctly so that the compiler is not able to find the lapack library code.

    Here's a link to some documentation for dgetrs - http://www.nag.co.uk/numeric/fl/manual/pdf/F07/f07aef.pdf.
     
  10. Oct 4, 2012 #9
    I still figure out the error base from your suggestion Mark44
     
  11. Oct 4, 2012 #10

    Mark44

    Staff: Mentor

    It is apparent to me that English is not your first language. What you said here means that you figured out the problem, but I suspect that is not the case.
     
  12. Oct 4, 2012 #11
    Yes I still figured out the problem. Because I tried check again and I still got the same error massage.
     
  13. Oct 4, 2012 #12

    Mark44

    Staff: Mentor

    When you "figure out" a problem, you are finding a solution for it.
    So you are still experiencing the problem. You did NOT figure it out.

    Did you try the suggestion I made in post #8?
     
  14. Oct 4, 2012 #13
    I tried your suggestion moreover I found the new documentation for f07aef but I still cant find the solution.
     
  15. Oct 5, 2012 #14

    Mark44

    Staff: Mentor

    I believe that the error you are seeing is due to incorrect parameters in your call to dgetrs.

    Code (Text):
    CALL dgetrs(trans,n,nrhs,a,lda,ipiv,b,ldb,info)
    What are the values of the parameters you are using when you call dgetrs?
    Section 5 Parameters in the documentation in the link I sent explains each parameter.
     
    Last edited: Oct 22, 2012
  16. Oct 8, 2012 #15
    I still cant find the solution. I post my code and tried your solution but still cant find the solution of my problem.
    This the main program of my code :

    READ (nin,*)
    READ (nin,*) n, nrhs

    lda = n
    ldb = n
    ALLOCATE (a(lda,n),b(ldb,nrhs),ipiv(n))
    ALLOCATE (a1(lda,n),b1(ldb,nrhs))
    ! Read A and B from data file

    ! READ (nin,*) (a1(i,1:n),i=1,n)
    ! READ (nin,*) (b1(i,1:nrhs),i=1,n)
    do i = 1,n
    do j = 1,n
    read (nin,*),a1(i,j)
    end do
    end do

    do i = 1,n
    read (nin,*),b1(i,nrhs)
    end do

    DO I = 1,N
    DO J = 1,N
    a(I,J) = (a1(I,J),1.1d0)
    END DO
    END DO
    DO I = 1,N
    DO J = 1, NRHS
    b(I,J) = (b1(I,J),1.0d0)
    END DO
    END DO
    ! Factorize A
    call cpu_time(start)
    CALL dgetrf(n,n,a,lda,ipiv,info)

    IF (info==0) THEN
    ! Compute solution

    CALL dgetrs(trans,n,nrhs,a,lda,ipiv,b,ldb,info)
    call cpu_time(finish)
    ! Print solution
    ! ifail: behaviour on error exit
    ! =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft
    ifail = 0
    !CALL x04caf('General',' ',n,nrhs,b,ldb,'Solution(s)',ifail)
    DO I = 1,N
    !print 1000, b(i,nrhs)
    END DO
    print*,B(5,1)
    !print*,B
    ELSE
    WRITE (nout,*) 'The factor U is singular'
    END IF
    print *,'time OV=',finish - start
    DEALLOCATE (A,B,IPIV,A1,B1)

    1000 FORMAT (F10.4)

    SUBROUTINE GET_INPUT(N,NRHS,A,B)
    INTEGER ::N, NRHS, I, J, K
    DOUBLE PRECISION :: A(N,N), B(N,NRHS)
    k = n*n+1
    DO I = 1,N
    B(I,NRHS) = 1.D0
    DO J = 1,N
    A(I,J) = ran(k)*(5-(-5)) -5
    END DO
    END DO
    END SUBROUTINE
     
  17. Oct 8, 2012 #16

    Borek

    User Avatar

    Staff: Mentor

    Add some tracing statements like

    Code (Text):
    print *,'I am here!'
    or

    Code (Text):
    print *,'Data read properly'
    It will help you localize the line that generates error.
     
  18. Oct 8, 2012 #17
    Your suggestion really help me. Thank you very much
     
  19. Oct 8, 2012 #18

    Mark44

    Staff: Mentor

    You haven't shown us the complete main program, especially where the variables are declared.
    What are you doing in the loop above? I'm pretty sure it's not allowed.
    Same question as above.
    I don't see a variable named trans anywhere in your code. That variable needs to have a value before you call this function.
    What's the purpose of this subroutine? You don't call it anywhere in the code above.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: Check Error In Fortran
  1. Fortran error (Replies: 33)

  2. Fortran NAN error (Replies: 4)

  3. [FORTRAN] Runtime error (Replies: 12)

Loading...