Implicit recursive array construction, F90

Click For Summary
SUMMARY

The discussion focuses on constructing an array in Fortran 90 using implied do-loops without explicit do-loops. The user, Boltzmann, attempts to create an array with recursive calculations but encounters issues with the syntax and functionality of implied do-loops. Key insights include the clarification that implied do-loops can only be used for specific scenarios like array initialization and that the correct syntax for floating-point division must be used to avoid integer division errors. The conversation also highlights the importance of function naming conventions in Fortran.

PREREQUISITES
  • Understanding of Fortran 90 syntax and structure
  • Familiarity with array initialization techniques in Fortran
  • Knowledge of floating-point arithmetic in programming
  • Awareness of function and variable naming conventions in Fortran
NEXT STEPS
  • Research "Fortran 90 implied do-loops" for proper usage and limitations
  • Explore "Fortran 90 array initialization techniques" for alternative methods
  • Learn about "Fortran 90 function return types" to handle array outputs
  • Investigate "Fortran 90 floating-point division" to avoid integer division pitfalls
USEFUL FOR

This discussion is beneficial for Fortran developers, students tackling array manipulation assignments, and anyone looking to deepen their understanding of Fortran 90 programming techniques.

Boltzmann
Messages
7
Reaction score
2
Hello there,
I again have a problem with programming in Fortran 90.1. Homework Statement

I would like to construct an array with an implicit do loop.
I know how to get the array I want to with usual do-loop but I would like to do it without do loops.

So this is the array I want to construct:

a(0:f)
a(0)=4
DO i=1,f
a(i)=a(i-1)+4*(-1)**i*1/(2*i+1)
ENDDO

So, I want get this array, without using an explicit do-loop.
For example, I know, that the implicit do-loops work like this:

a=(/(i+1,i=1,5)/)

But it doesn't work with recursion. So what I've tried for my array is:

a(0)=4
a=(/(a(i-1)+4*(-1)**i*1/(2*i+1),i=1,f)/)

It doesn't work at all.

Does someone know how to use this in the right way or maybe any other solutions to construct the array without an explicit do-loop.Many thanks in advance.

greets Boltzmann
 
Physics news on Phys.org
I don't see why this should work. The implied do on the right-hand side will be executed before the assignment, and hence can't be recursive.

Note also that as written, the code probably doesn't calculate what you want. 1/(2*i+1) will be calculated as an integer, and hence can only return 1 if i=0, 0 otherwise. You have to use 1./(2.*i+1.)
 
Boltzmann said:
Hello there,
I again have a problem with programming in Fortran 90.1. Homework Statement

I would like to construct an array with an implicit do loop.
I know how to get the array I want to with usual do-loop but I would like to do it without do loops.

So this is the array I want to construct:

a(0:f)
a(0)=4
DO i=1,f
a(i)=a(i-1)+4*(-1)**i*1/(2*i+1)
ENDDO

So, I want get this array, without using an explicit do-loop.
For example, I know, that the implicit do-loops work like this:

a=(/(i+1,i=1,5)/)

But it doesn't work with recursion. So what I've tried for my array is:

a(0)=4
a=(/(a(i-1)+4*(-1)**i*1/(2*i+1),i=1,f)/)

It doesn't work at all.

Does someone know how to use this in the right way or maybe any other solutions to construct the array without an explicit do-loop.Many thanks in advance.

greets Boltzmann

The actual term of art in Fortran is "implied do-loops", not "implicit do-loops".

AFAIK, implied do-loops can only be used in certain situations for initializing array variables and for input/output involving arrays. I don't think your recursive use of the implied-do loop fits either of those scenarios. It's also not clear why just a plain old do-loop would not suffice.

Here are some examples of using implied do-loops:

http://www.personal.psu.edu/jhm/f90/lectures/19.html#1 {scroll down to the section entitled Array Initialization}
 
First of all thanks for answering.

Thanks for your note Claude. I will change this but I also got the right values writing it like integers.
So is there any other way, I could use the recursive code with?

@SteamKing

I later recognized, that its implied do and not implicit after reading some more about it. I am sorry for this.

Usually a plain do-loop would suffice but its part of my homework, to realize it without explicit do-loops (do , enddo).

Right now I solved the problem by using two functions but I don't think that it's the way how my teacher wanted me to do.
1. Function
ho=4.*(-1)**r*1./(2.*r+1.)+ho1(x)
2. Function
ho1=ho(y-1)

a=(/(ho(i),i=0,f)/)

So this works but I think there has to be way a better way.Some other question. If a function returns an array. Who can I access to single values and not the whole array. I need it for a proper output.
So if a is an array I can just use a(i) but how does it work if for example add(x) is a function and an array. How can I get access to add(x)(i) ?
 
Last edited:
Boltzmann said:
Some other question. If a function returns an array. Who can I access to single values and not the whole array. I need it for a proper output.
So if a is an array I can just use a(i) but how does it work if for example add(x) is a function and an array. How can I get access to add(x)(i) ?

It's not clear what you are describing here.

AFAIK, function names must not be identical to variable names in Fortran. You can, for example, declare a real array ADD (N), where N = some integer, or you can define a FUNCTION ADD ("argument list"), but you can't do both:

http://www.chem.ox.ac.uk/fortran/subprograms.html {See the section External Functions}
 
  • Like
Likes   Reactions: Boltzmann

Similar threads

  • · Replies 3 ·
Replies
3
Views
2K
Replies
7
Views
3K
Replies
43
Views
5K
  • · Replies 2 ·
Replies
2
Views
6K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 5 ·
Replies
5
Views
4K
Replies
5
Views
4K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 10 ·
Replies
10
Views
2K