Implicit recursive array construction, F90

Click For Summary

Discussion Overview

The discussion revolves around constructing an array in Fortran 90 using an implicit do loop, specifically focusing on achieving this without explicit do loops. Participants explore the challenges of using recursion within implied do loops and seek alternative solutions for array construction.

Discussion Character

  • Technical explanation
  • Homework-related
  • Debate/contested

Main Points Raised

  • One participant expresses a desire to construct an array using an implicit do loop instead of an explicit do loop, providing an example of the desired array construction.
  • Another participant argues that the recursive use of implied do loops is not valid, as the implied do on the right-hand side executes before the assignment.
  • Concerns are raised about integer division in the original code, suggesting the need for floating-point division to achieve correct calculations.
  • A participant acknowledges the correct terminology of "implied do-loops" and notes that these loops are typically used for specific scenarios like array initialization, questioning the appropriateness of their use in recursive contexts.
  • One participant shares a workaround using two functions to achieve the desired results, although they express uncertainty about whether this aligns with their teacher's expectations.
  • A question is posed regarding how to access individual values from an array returned by a function, highlighting potential naming conflicts between function names and variable names.

Areas of Agreement / Disagreement

Participants do not reach consensus on the validity of using implied do loops for recursive array construction, and multiple competing views regarding the approach remain evident throughout the discussion.

Contextual Notes

Participants note limitations in the use of implied do loops for recursive definitions and highlight the need for careful consideration of integer versus floating-point arithmetic in their implementations.

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