Debugging Strange Fortran Code: A Simple Delta Function

  • Context: Fortran 
  • Thread starter Thread starter phynewb
  • Start date Start date
  • Tags Tags
    Code Fortran Strange
Click For Summary

Discussion Overview

The discussion revolves around debugging a Fortran code that implements a delta function. Participants explore issues related to the output of the function compared to a direct calculation, focusing on the precision and data types used in the code.

Discussion Character

  • Technical explanation, Debugging, Conceptual clarification

Main Points Raised

  • One participant shares their Fortran code for a delta function and expresses confusion over discrepancies in output when using a function versus a direct calculation.
  • Another participant requests the output from the loops to better understand the issue.
  • A participant provides the output from both loops, noting that the function's output appears to be incorrect and does not resemble the expected sharp Gaussian distribution.
  • Some participants suggest that the problem may stem from using the wrong data type when passing values to the function, specifically pointing out the difference between single and double precision.
  • One participant proposes using the `dble()` function to convert the integer to double precision before passing it to the delta function, indicating this may resolve the issue.
  • Another participant reinforces the importance of ensuring that the data types match the function's expectations to avoid accuracy problems.

Areas of Agreement / Disagreement

Participants generally agree that the issue is related to data type mismatches, particularly between single and double precision. However, the discussion includes varying levels of understanding regarding the implications of these differences.

Contextual Notes

The discussion highlights the importance of data type compatibility in Fortran, particularly when dealing with floating-point calculations. There is an emphasis on ensuring that the correct precision is used when passing arguments to functions.

phynewb
Messages
13
Reaction score
0
Hi guys,
I just wrote a simple code for delta function and print it out. Here it is.

Code:
      program main
        implicit none
        integer i
        real*8 del
        real*8,parameter:: ep=1D-2
        real*8,parameter:: pi=3.1415926
        do i=-10,10,1
        write(*,*) i,del(real(i))  ! use function
        enddo
        do i=-10,10,1
        write(*,*) i,(1.0/pi*ep/((real(i))**2+ep**2)) ! no use function
        enddo
        end

      function del(x)
      implicit none
      real*8 del
      real*8 x
      real*8,parameter::ep=1D-2
      real*8,parameter:: pi=3.1415926

      del=(1.0/pi*ep/(x**2+ep**2))

      return
      end
It turns out to be quite wrong by using function del. I cannot figure out what's wrong with the function because the expression is the same. Can you tell me how to debug the function? Thanks!
 
Technology news on Phys.org
phynewb said:
Hi guys,
I just wrote a simple code for delta function and print it out. Here it is.

Code:
      program main
        implicit none
        integer i
        real*8 del
        real*8,parameter:: ep=1D-2
        real*8,parameter:: pi=3.1415926
        do i=-10,10,1
        write(*,*) i,del(real(i))  ! use function
        enddo
        do i=-10,10,1
        write(*,*) i,(1.0/pi*ep/((real(i))**2+ep**2)) ! no use function
        enddo
        end

      function del(x)
      implicit none
      real*8 del
      real*8 x
      real*8,parameter::ep=1D-2
      real*8,parameter:: pi=3.1415926

      del=(1.0/pi*ep/(x**2+ep**2))

      return
      end
It turns out to be quite wrong by using function del. I cannot figure out what's wrong with the function because the expression is the same. Can you tell me how to debug the function? Thanks!

What output do your two loops produce?
 
Mark44 said:
What output do your two loops produce?

It shows
-10 31.830990148286446
-9 4.42379935910539249E-054
-8 3.96072696157977595E-306
-7 31.830990148286446
-6 4.42379936653263965E-054
-5 0.0000000000000000
-4 31.830990148286446
-3 4.42379937841623373E-054
-2 0.0000000000000000
-1 31.830990148286446
0 4.42380394766179441E-054
1 31.830990148286446
2 4.42380242655975552E-054
3 31.830990148286446
4 4.42380241467614869E-054
5 31.830990148286446
6 4.42380240873434528E-054
7 31.830990148286446
8 4.42380240279254245E-054
9 31.830990148286446
10 4.42380239982164045E-054

-10 3.18309583173281331E-005
-9 3.92974701861929112E-005
-8 4.97358443944407051E-005
-7 6.49610718106421125E-005
-6 8.84191714697638248E-005
-5 1.27323451299340604E-004
-4 1.98942445036508832E-004
-3 3.53673738606087140E-004
-2 7.95754859835665312E-004
-1 3.18278073675496917E-003
0 31.830990148286446
1 3.18278073675496917E-003
2 7.95754859835665312E-004
3 3.53673738606087140E-004
4 1.98942445036508832E-004
5 1.27323451299340604E-004
6 8.84191714697638248E-005
7 6.49610718106421125E-005
8 4.97358443944407051E-005
9 3.92974701861929112E-005
10 3.18309583173281331E-005The upper part is from the function and the lower part is calculated without function. It shall look like sharp gaussian distribution around 0 instead of random distribution.
 
I'm pretty sure this line is causing the problem:
Code:
write(*,*) i,del(real(i))  ! use function

In the call to your del function, you are converting an integer value, i, to a four-byte real (a single-precision floating point value), but the function is expecting an eight-byte real (a double-precision floating point value).

I think this will fix the problem:
Code:
write(*,*) i,del(dble(i))  ! use function

Here's a link to a page with more information - http://www.liv.ac.uk/HPC/HTMLF90Course/HTMLF90CourseNotesnode114.html .
 
Last edited by a moderator:
Mark44 said:
I'm pretty sure this line is causing the problem:
Code:
write(*,*) i,del(real(i))  ! use function

In the call to your del function, you are converting an integer value, i, to a four-byte real (a single-precision floating point value), but the function is expecting an eight-byte real (a double-precision floating point value).

I think this will fix the problem:
Code:
write(*,*) i,del(dble(i))  ! use function

Here's a link to a page with more information - http://www.liv.ac.uk/HPC/HTMLF90Course/HTMLF90CourseNotesnode114.html .

Thanks Mark44. It really works! I am always troubled by this accuracy stuff...
Thank you a lot :p
 
Last edited by a moderator:
It's more about the size, in bytes, of the variables you're using. For floating point variables, the choices are real*4 (single precision - 4 bytes) and real*8 (double precision - 8 bytes). real() converts whatever to a 4-byte floating point value and dble() converts whatever to an 8-byte floating point value.

Make sure that what you pass to a function is what it is expecting - otherwise you'll have problems.
 

Similar threads

  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 5 ·
Replies
5
Views
5K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 6 ·
Replies
6
Views
3K
  • · Replies 8 ·
Replies
8
Views
2K