Check Error In Fortran

• Fortran

Main Question or Discussion Point

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.

Related Programming and Computer Science News on Phys.org
Mark44
Mentor
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.
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.

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.

Yes I doing any division in my code. I tried to put flags in my code the error messages still same.

Mark44
Mentor
Yes I doing any division in my code.
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:
IF radius .neq. 0 THEN
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:
IF ABS(radius) .leq. 1E-07 THEN
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.
I tried to put flags in my code the error messages still same.

Thank Mark44 I will try your solution.

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 ?

Mark44
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.

I still figure out the error base from your suggestion Mark44

Mark44
Mentor
I still figure out the error base from your suggestion Mark44
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.

Yes I still figured out the problem. Because I tried check again and I still got the same error massage.

Mark44
Mentor
Yes I still figured out the problem.
When you "figure out" a problem, you are finding a solution for it.
Because I tried check again and I still got the same error massage.
So you are still experiencing the problem. You did NOT figure it out.

Did you try the suggestion I made in post #8?

I tried your suggestion moreover I found the new documentation for f07aef but I still cant find the solution.

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

Code:
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:
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 :

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

do i = 1,n
do j = 1,n
end do
end do

do i = 1,n
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

Borek
Mentor

Code:
print *,'I am here!'
or

Code:
print *,'Data read properly'

Your suggestion really help me. Thank you very much

Mark44
Mentor
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 :
You haven't shown us the complete main program, especially where the variables are declared.

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

do i = 1,n
do j = 1,n
end do
end do

do i = 1,n
end do

DO I = 1,N
DO J = 1,N
a(I,J) = (a1(I,J),1.1d0)
END DO
END DO
What are you doing in the loop above? I'm pretty sure it's not allowed.
DO I = 1,N
DO J = 1, NRHS
b(I,J) = (b1(I,J),1.0d0)
END DO
END DO
Same question as above.
! 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)
I don't see a variable named trans anywhere in your code. That variable needs to have a value before you call this function.
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)
What's the purpose of this subroutine? You don't call it anywhere in the code above.
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