
forums.silverfrost.com Welcome to the Silverfrost forums

View previous topic :: View next topic 
Author 
Message 
Miriam
Joined: 17 Nov 2011 Posts: 15

Posted: Sat Feb 25, 2012 12:33 pm Post subject: unknown floating point exception b8a1 


Since I am not a good programmer, I spent a couple of hours to figure out, where is this error coming from without any results. Here is the error message: "Floating point coprocessir fault at address 00404244 in file at line 364". This line is a function definition.
I load a file in the beginning of my program. The code is working if the loaded file has 1000 Data points but if I load a file with 2000 Data points, I get this error. I declared the arrays and preassigned them with the size 4000, so it wouldnt be the problem.
My code is very long I can not post it here.
Please help me if you can
nice Saturday
Miriam 

Back to top 


PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 6688 Location: Salford, UK

Posted: Sat Feb 25, 2012 12:52 pm Post subject: 


Posting some lines of code near to line 364 may help us to see the problem. 

Back to top 


Miriam
Joined: 17 Nov 2011 Posts: 15

Posted: Sat Feb 25, 2012 1:00 pm Post subject: 


FUNCTION F1(A,B,C)
IMPLICIT DOUBLE PRECISION (AH,OZ)
F1=B/(A*C) (LIne 364)
RETURN
END
and here is the call of the function
D1=F1(RAR,ETA2+(H*C2),E(J+1))
D2=F2(RAR,(ETA1+(H*C1)),VZ(J+1),Q,PER,E(J+1)) 

Back to top 


PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 6688 Location: Salford, UK

Posted: Sat Feb 25, 2012 1:17 pm Post subject: 


Make sure that F1 and its arguments are all DOUBLE PRECISION at the point of call.
Make sure that A and C are not very small.
Use CHECKMATE whilst testing. 

Back to top 


Miriam
Joined: 17 Nov 2011 Posts: 15

Posted: Sat Feb 25, 2012 2:45 pm Post subject: 


here is where and how I call F1 :
Code: 
FUNCTION RB(Q,E,VZ,R)
IMPLICIT DOUBLE PRECISION (AH,OZ)
DOUBLE PRECISION, DIMENSION (4000)::E,VZ,R
DOUBLE PRECISION ETA1, ETA2,RAR, H, C1, C2
COMMON/BOB/L,BI,IMAX,RE,REST,REPHI,FM,PR,PSI1,C3,UINF,PER
C
ETA1=1.0
ETA2=0.0
C
C
C
DO 20 J=1,IMAX1
H=R(J+1)R(J)
RAR=R(J)
C
IF(RAR.LT.1.0E06) THEN
A1=0.0
ELSE
A1=F1(RAR,ETA2,E(J))
END IF
A2=F2(RAR,ETA1,VZ(J),Q,PER,E(J))
C
RAR=RAR+H/2.0
EEE=(E(J)+E(J+1))/2.0
VVV=(VZ(J)+VZ(J+1))/2.0
C
B1=F1(RAR,ETA2+(H*A2)/2.0,EEE)
B2=F2(RAR,(ETA1+(H*A1)/2.0),VVV,Q,PER,EEE)
C1=F1(RAR,ETA2+(H*B2)/2.0,EEE)
C2=F2(RAR,(ETA1+(H*B1)/2.0),VVV,Q,PER,EEE)
C
RAR=RAR+H/2.0
C
D1=F1(RAR,ETA2+(H*C2),E(J+1))
D2=F2(RAR,(ETA1+(H*C1)),VZ(J+1),Q,PER,E(J+1))
C
ETA1=ETA1+(H*(A1+2.0*B1+2.0*C1+D1))/6.0
ETA2=ETA2+(H*(A2+2.0*B2+2.0*C2+D2))/6.0
C
20 CONTINUE
C
RB=ETA1
C
RETURN
END

EVery thing is double precision. I dont get it
P.S: A and C are very small, and it should be that way 

Back to top 


davidb
Joined: 17 Jul 2009 Posts: 559 Location: UK

Posted: Sat Feb 25, 2012 4:20 pm Post subject: Re: 


Miriam wrote: 
P.S: A and C are very small, and it should be that way 
Hi Miriam,
How small? If the product A*C on the denominator underflows, i.e. it becomes to small to represent you will get an error.
Can you post the values of A and C so we can check? Or you could try rewriting your function as F1=(B/A)/C which might help if B is small.
Also did you try compiling with Checkmate enabled as Paul suggested? _________________ Programmer in: Fortran 77/95/2003/2008, C, C++ (& OpenMP), java, Python, Perl 

Back to top 


Miriam
Joined: 17 Nov 2011 Posts: 15

Posted: Sat Feb 25, 2012 5:09 pm Post subject: 


I compiled with Checkmate, but also with Debug and ReleaseNet, no one is really working. I am now so confused about the values of A and C. 

Back to top 


Wilfried Linder
Joined: 14 Nov 2007 Posts: 314 Location: Düsseldorf, Germany

Posted: Mon Feb 27, 2012 12:14 pm Post subject: 


Perhaps you can define a minimum divisor and test the product A*C in your function F1 like here:
if (A*C) .lt. 10.D0*tiny(1.D0) > program stops
Regards  Wilfried 

Back to top 


JohnCampbell
Joined: 16 Feb 2006 Posts: 2252 Location: Sydney

Posted: Tue Feb 28, 2012 12:06 am Post subject: 


It appear to me that you should check the values of A*C. You could do this in Function RB by including Code: 
subroutine check_AC (R,E,IMAX)
!
real*8 R(*),e(*), tiny,RAR,EEE
integer*4 imax, n_err, j
!
n_err = 0 ! count of zero A*C
tiny = 1.d10 ! estimate of what is too small for calculation ??
DO J=1,IMAX1
RAR = R(J)
EEE = E(J)
if ( abs (RAR*EEE) < tiny) then
write (*,*) 'small A*C=', RAR*EEE,' at J=',j
n_err = n_err+1
end if
RAR = (R(J)+R(J+1))/2.0
EEE = (E(J)+E(J+1))/2.0
if ( abs (RAR*EEE) < tiny) then
n_err = n_err+1
write (*,*) 'small A*C=', RAR*EEE,' at J=',j,'.5'
end if
end do
if (n_err > 0) write (*,*) n_err,' too small values of A*C detected'
!
end

This could indicate how best to improve Function RB to cope with what is assumed to be unusual values in R or E. 

Back to top 




You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum

Powered by phpBB © 2001, 2005 phpBB Group
