- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

I am working with a package provided by a university-affiliated organization. I keep hitting an arithmetic exception on a particular line of code, and there seems to be no reason. I am wondering what actions I can take. I am already running with -debug and no optimization. Below is the code snippet, with the "offending" line indicated in bold:

DO k=1,nz-1

DO j=1,ny-1

DO i=1,nx-1

dzp = zp(i,j,k+1)-zp(i,j,k)

IF( runmod == 1 ) THEN

**grdscl(i,j,k) = dxdy3rd * dzp**one3rd**

ELSE IF( runmod == 2 ) THEN

grdscl(i,j,k) = SQRT(dx*dzp)

ELSE IF( runmod == 3 ) THEN

grdscl(i,j,k) = SQRT(dy*dzp)

ELSE IF( runmod == 4 ) THEN

grdscl(i,j,k) = dzp

END IF

END DO

END DO

END DO

All variables on this line are REAL (including the 3-dimensional array). The values are:

one3rd = 1.0/3.0 (so 0.3333333...)

dzp = -16.666626

dxdy3rd = 9.65489483

so basically the expression is taking a negative real number, raising it to a real fraction (should be fine), and the multiplying it by a positive real number.

Regarding the loop through the arrays, the indexes and the variable runmod are all correctly INTEGER. nx is 100, ny is 400, and nz is 10.

I am running on Ubuntu 16.04.

Here is the compilation command; my only contribution was replacing -O3 wth -O0 -debug:

ifort -w -convert big_endian -fp-model source -I/home/braun/arps/include -I/usr/local/hdf/include -module /home/braun/arps/modules -O0 -debug -fpe0 -check bounds -traceback -c tmix3d.f90

I'm starting to suspect a compiler option. I tried a small test case with no options, and the result was correct.

Thanks,

Jay

Link Copied

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

Um, raising a negative value to a fractional exponent results in a complex value, and hence an error for REAL values. Right?

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

Funny, I was so intent on creating a small test case, I did not consider the basic math. My "should be fine" comment came from first getting a result on my computer's calculator and then this little program:

program j

real :: dzp, one3rd, result

one3rd = 1.0 / 3.0

dzp = -16.666626

result = dzp**one3rd

print *, result

end program j

So I compile and run it:

braun@audrey-00:~$ ifort -c j.f90

braun@audrey-00:~$ ifort -o j j.o

braun@audrey-00:~$ ./j

-2.554363

In any case, my task is to find out why dzp is negative. Maybe the real "bug" is the apparently reasonable result in the small test case.

Thanks as always, Steve.

j

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

I added an additional step to the test case, multiplying that result by a real number, and got NaN.

OK, on to the next step: where did that negative number come from?

Thanks!

j

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

Just to close this discussion -- the negative values resulted from a mismatch of parametric data. By changing one setting that was inconsistent with the dimensions chosen for my particular data set, I eliminated the issue. This was consistent with some documentation that I later found.

j

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page