Fortran Debugging Strange Fortran Code: A Simple Delta Function

AI Thread Summary
The discussion revolves around a Fortran code snippet intended to implement a delta function. The user encounters issues with the output when using a function to calculate the delta function, which produces unexpected results compared to a direct calculation. The problem is identified as a type mismatch: the function expects an eight-byte double-precision floating point value, but the user was passing a four-byte single-precision value due to the use of the `real()` function. The solution suggested is to use `dble(i)` instead of `real(i)` when calling the `del` function, ensuring the correct data type is passed. This adjustment resolves the accuracy issues, leading to the expected sharp Gaussian distribution around zero. The discussion emphasizes the importance of matching variable types in function calls to avoid computational errors.
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.
 
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I have a quick questions. I am going through a book on C programming on my own. Afterwards, I plan to go through something call data structures and algorithms on my own also in C. I also need to learn C++, Matlab and for personal interest Haskell. For the two topic of data structures and algorithms, I understand there are standard ones across all programming languages. After learning it through C, what would be the biggest issue when trying to implement the same data...

Similar threads

Replies
8
Views
2K
Replies
4
Views
2K
Replies
4
Views
2K
Replies
4
Views
2K
Replies
2
Views
1K
Replies
6
Views
3K
Replies
8
Views
2K
Back
Top