Implicit recursive array construction, F90

AI Thread Summary
The discussion focuses on constructing an array in Fortran 90 using an implicit do loop, specifically without explicit do loops. The user is attempting to create a recursive array but encounters issues, as the implied do loop cannot reference previous array elements in this manner. It is clarified that the term "implied do-loops" is correct, and such loops are not suitable for recursive definitions. The user ultimately finds a workaround using two functions but questions whether this aligns with the assignment's requirements. Additionally, there is a query about accessing individual values from a function that returns an array.
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 Boltzmann
Back
Top