Fortran Fortran 77 variable declaration issue

  • Thread starter Thread starter AmenoParallax
  • Start date Start date
  • Tags Tags
    Fortran Variable
Click For Summary
The discussion revolves around issues encountered while rewriting a Fortran 77 code for an astrophysics thesis. The user aimed to enhance code readability and rigor by declaring all variables explicitly and switching to double precision. However, this led to unexpected differences in computational results. The problem was traced to the declaration of a double precision array within a common block. The original code used implicit declarations, while the updated version switched to explicit declarations. The user initially did not modify all common block declarations throughout the code, which may have contributed to the discrepancies. After ensuring uniformity in the common block declarations, the issue was resolved, although the user found it strange that the two seemingly equivalent declaration methods produced different results. The discussion highlights the importance of consistency in variable declarations, especially in legacy code.
AmenoParallax
Messages
11
Reaction score
0
Hi

I've been struggling with a fortran 77 code that I need for my astrophysics thesis... Since it's quite old, I'm trying to rewrite some features in order to make it more readable, and I'm trying to make it more rigorous by declaring all variables (I'm declaring "implicit none" everywhere), setting all real variable to double precision, and that kind of stuff. No main changes, and most importantly nothing that would alter the result of the computation.

However, something happened, and I got different results with respect to the original version. I spent hours debugging and looking for the exact place where the difference originated, and apparently the problem is due to the declaration of a variable (a double precision array) which is part of a common block.

More precisely, in the original version the variable was declared as:

IMPLICIT REAL*8 (A-H,L,M,O-Z)
COMMON /CMN1/ VA1(4),VA2(4),...

while in my updated version I changed it to:

IMPLICIT NONE
REAL*8 VA1(4),VA2(4),...
COMMON /CMN1/ VA1,VA2

Now, I wouldn't expect that this could change the calculations, but that's what happened... Anybody can explain why?

I don't think the rest of the code and the specific calculations performed are important in solving the issue, and beside that I can't post the code because it's not mine and anyway it's very long.

Any suggestion would be very appreciated. Thanks everybody!
 
Technology news on Phys.org
That should have worked. Maybe the compiler is doing something to the common blocks (aligning, etc.) that is causing an issue. Are the common blocks declared the same everywhere (have you modified them everywhere they appear in the code)?
 
DrClaude said:
That should have worked. Maybe the compiler is doing something to the common blocks (aligning, etc.) that is causing an issue. Are the common blocks declared the same everywhere (have you modified them everywhere they appear in the code)?
I have not modified the common blocks everywhere yet... I was trying to apply one change at a time in order to find the problematic part of the code. I'll try to uniform all the common block right away.
 
DrClaude said:
That should have worked. Maybe the compiler is doing something to the common blocks (aligning, etc.) that is causing an issue. Are the common blocks declared the same everywhere (have you modified them everywhere they appear in the code)?
I changed the way common blocks are declared everywhere, meaning that keeping the implicit declaration of double precision variables I explicitly declared the types of all variables belonging to any common blocks everywhere in the code.

It actually seems to have worked! But still it seems quite strange that the two ways of declaring a variables (apparently equivalent) give different results...

Anyway thanks, I think this solves my problem!
 
Learn If you want to write code for Python Machine learning, AI Statistics/data analysis Scientific research Web application servers Some microcontrollers JavaScript/Node JS/TypeScript Web sites Web application servers C# Games (Unity) Consumer applications (Windows) Business applications C++ Games (Unreal Engine) Operating systems, device drivers Microcontrollers/embedded systems Consumer applications (Linux) Some more tips: Do not learn C++ (or any other dialect of C) as a...

Similar threads

  • · Replies 25 ·
Replies
25
Views
3K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 8 ·
Replies
8
Views
4K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 9 ·
Replies
9
Views
5K
  • · Replies 12 ·
Replies
12
Views
3K
  • · Replies 5 ·
Replies
5
Views
2K