Why is my FORTRAN 90 Program Producing Unexpected Matrix Elements?

  • Context: Fortran 
  • Thread starter Thread starter rizzodex
  • Start date Start date
  • Tags Tags
    Bug Fortran
Click For Summary
SUMMARY

The FORTRAN 90 program in question produces unexpected values in the beta matrix due to an out-of-bounds write operation. Specifically, the line alpha(4*k+3,4*k+3+5)=5. causes an index overflow when k reaches its maximum value, leading to unintended modifications in the beta matrix. Consequently, the (4,1) element of the beta matrix is incorrectly set to 5.0 instead of 2.0, and the (5,8) element is non-zero due to this memory corruption. Proper bounds checking and index management are essential to prevent such issues.

PREREQUISITES
  • Understanding of FORTRAN 90 syntax and programming concepts
  • Knowledge of matrix operations and indexing in programming
  • Familiarity with memory management and out-of-bounds errors
  • Experience with debugging techniques in FORTRAN
NEXT STEPS
  • Review FORTRAN 90 array bounds and memory management practices
  • Learn about debugging tools for FORTRAN, such as GDB or Valgrind
  • Study the implications of out-of-bounds errors in programming
  • Explore best practices for writing maintainable FORTRAN code, including index management
USEFUL FOR

FORTRAN developers, programmers working with numerical methods, and anyone troubleshooting matrix-related issues in scientific computing applications.

rizzodex
Messages
12
Reaction score
0
Hi all,
I encountered a problem while running a FORTRAN 90 program, which appears (to me) to be quite surprising. Can someone please explain the following things:
1. Why the (4,1) element of the beta matrix is 5.0 instead of being 2.0 ??
2. Why the (5,8) element of the beta matrix is non-zero instead of being zero ??

Here comes the program with the results at the end:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

PROGRAM hamiltonian
IMPLICIT NONE
INTEGER :: N,i,j,k
REAL, ALLOCATABLE, DIMENSION (:,:) :: alpha,beta
COMPLEX, ALLOCATABLE, DIMENSION (:,:) :: hk


N=8

ALLOCATE (alpha(N,N),beta(N,N),hk(N,N))

alpha=0.
beta=0.
hk=(0.,0.)

DO k=0,(N-4)/4

alpha(4*k+1,4*k+1-3)=5.
alpha(4*k+1,4*k+1+1)=5.
alpha(4*k+2,4*k+2-1)=5.
alpha(4*k+2,4*k+2+1)=5.
alpha(4*k+2,4*k+2+3)=5.
alpha(4*k+3,4*k+3-1)=5.
alpha(4*k+3,4*k+3+1)=5.
alpha(4*k+3,4*k+3+5)=5.
alpha(4*k+4,4*k+4-5)=5.
alpha(4*k+4,4*k+4-1)=5.

beta(4*k+4,4*k+4-3)=2.

END DO

DO i=1,N
OPEN (UNIT=10,FILE='alpha.dat')
WRITE(10,100)(alpha(i,j),j=1,N)
100 FORMAT(8(3X,F3.1))
OPEN (UNIT=20,FILE='beta.dat')
WRITE(20,200)(beta(i,j),j=1,N)
200 FORMAT(8(3X,F3.1))
END DO

CLOSE (10)
CLOSE (20)

END PROGRAM

============================================================
~ RESULTS ~

alpha.dat :


0.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0
5.0 0.0 5.0 0.0 5.0 0.0 0.0 0.0
0.0 5.0 0.0 5.0 0.0 0.0 0.0 5.0
0.0 0.0 5.0 0.0 0.0 0.0 0.0 0.0
0.0 5.0 0.0 0.0 0.0 5.0 0.0 0.0
0.0 0.0 0.0 0.0 5.0 0.0 5.0 0.0
0.0 0.0 0.0 0.0 0.0 5.0 0.0 5.0
0.0 0.0 5.0 0.0 0.0 0.0 5.0 0.0


beta.dat :

0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 5.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
 
Technology news on Phys.org
For some reason the above post doesn't have the last row of the beta matrix which is:

0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0

So, the total form of the beta matrix is :

beta.dat :

0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 5.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0
 
This line is probably a problem:

alpha(4*k+3,4*k+3+5)=5.

When k = N-4/4 then the second index is 4*k+8 = N+4 which is out of bounds of alpha. So you are writing to something else in the heap which is probably beta. Generally writing out of bounds is a very bad thing, and a variety of strange things can happen as a result.

You're getting a value at row 8, column 5 in your beta matrix because of this one:
beta(4*k+4,4*k+4-3)=2.
When N = 1 the indices evaluate to beta(8,5).

You could make your code a bit easier to read by defining a quantity like index = 4*k+1 inside your loop.
 

Similar threads

  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 6 ·
Replies
6
Views
2K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 17 ·
Replies
17
Views
3K
  • · Replies 6 ·
Replies
6
Views
5K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
Replies
1
Views
3K
  • · Replies 6 ·
Replies
6
Views
3K