Modifying iteration of DO-loop dynamically

  • Thread starter Thread starter chaim
  • Start date Start date
Click For Summary
SUMMARY

This discussion focuses on modifying the iteration variable of a DO-loop dynamically in Fortran, specifically addressing the limitations encountered with the g77 compiler. The user seeks to change the starting integer of the loop based on calculations from previous iterations, which is not feasible with a standard DO-loop. The recommended solutions include using GOTO statements or switching to a DO WHILE loop, which allows for modification of the loop index variable during execution.

PREREQUISITES
  • Understanding of Fortran programming language
  • Familiarity with DO-loops and GOTO statements
  • Knowledge of compiler behavior, specifically g77
  • Basic concepts of control flow in programming
NEXT STEPS
  • Explore the differences between DO-loops and DO WHILE loops in Fortran
  • Learn about control flow constructs in Fortran, including GOTO and IF statements
  • Investigate compiler-specific behavior and limitations in Fortran, focusing on g77
  • Review best practices for dynamic iteration in Fortran programming
USEFUL FOR

This discussion is beneficial for Fortran developers, particularly those working with legacy code or optimizing iterative processes in scientific computing.

chaim
Messages
5
Reaction score
0
I would like to change the start integer for a DO-loop each time the DO runs as a result of the calculations of the previous iteration. For example the first time the DO runs it should start at 1, the second time at 33, the third time at 60. The numerical value for the end of the loop stays the same. I have tried to change the iterator dynamically as can be seen in the code below, but the g77 gives an error.

ACS = 1
NUME = 0
DO 12, AC = ACS,NH

IF (VI(AC) .NE. 100.0) THEN
VF(AC) = VI(AC)
GOTO 12

ELSEIF (VI(AC) .EQ. 100.0) THEN
DO 80,AB = AC,AC+24
IF (VI(AB) .EQ. 100) NUME = NUME + 1
IF (VI(AB) .NE. 100) GOTO 81

80 CONTINUE
81 IF ((VI(AC-1)- VI(AC+NUME)) .GT. 0.0) THEN
DO 77, VAL = AC,AC+NUME+1
VF(VAL)=VI(AC)-((VI(AC-1)-VI(AC+NUME))/(NUME+1))

77 CONTINUE

ELSEIF ((VI(AC-1)- VI(AC+NUME)) .LT. 0.0) THEN
NUM = 0
DO 99, VAL = AC,AC+NUME-1
NUM = NUM + 1
VF(VAL)=VF(AC+NUM-2)+((VI(AC+NUME)-VI(AC-1))/(NUME+1))
AC = VAL -1 <=== compiler error
99 CONTINUE

How can I modify AC without getting a compiler error or is an alernative logic necessary??
 
Technology news on Phys.org
You cannot do it with a do loop. You must construct one out of goto and if statements. You are then free to modify the dummy variable any way you like.
 
Or use a DO WHILE loop. The following two loops are equivalent:

Code:
      do 99 k = start, stop
          print *, k
99    continue

Code:
      k = start
      do 99 while (k .le. stop)
          print *, k
          k = k + 1
99    continue

except that with the DO WHILE loop you can modify the loop index variable inside the loop (in fact, that's what this example does!) whereas with the regular DO loop you can't.
 

Similar threads

  • · Replies 7 ·
Replies
7
Views
8K
Replies
6
Views
4K
  • · Replies 10 ·
Replies
10
Views
3K
  • · Replies 3 ·
Replies
3
Views
4K
  • · Replies 6 ·
Replies
6
Views
5K
  • · Replies 27 ·
Replies
27
Views
7K
  • · Replies 3 ·
Replies
3
Views
5K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 6 ·
Replies
6
Views
3K