Fortran, why do i suddenly get new errors?

  • Context: Fortran 
  • Thread starter Thread starter snipertje
  • Start date Start date
  • Tags Tags
    Errors Fortran
Join the discussion
Registration is free. Ask a follow-up in this thread, or start your own.
4 replies · 2K views
snipertje
Messages
11
Reaction score
0
Do subroutines return values only?

Sorry for the wrong title!

I currently have a subroutine which should return y like (the actual formula is a bit more complex): y=cos(t)

When i call the subroutine and then make a do-loop to test y for different t, it gives 1 value only. Does the subroutine give a value to y or am I doing something else wrong?

t doesn't have a value before the subroutine is called.
 
Last edited:
Physics news on Phys.org


snipertje said:
Sorry for the wrong title!

I currently have a subroutine which should return y like (the actual formula is a bit more complex): y=cos(t)

When i call the subroutine and then make a do-loop to test y for different t, it gives 1 value only. Does the subroutine give a value to y or am I doing something else wrong?

t doesn't have a value before the subroutine is called.
Fortran subroutines don't return values. By that, I mean that an expression that includes a subroutine call doesn't evaluate to anything.

Your routine should be a FUNCTION, which does return a value.
 


Mark44 said:
Fortran subroutines don't return values. By that, I mean that an expression that includes a subroutine call doesn't evaluate to anything.

Your routine should be a FUNCTION, which does return a value.
I have something like this, it's not about wether or not a subroutine is needed, I want to understand how it works.

Code:
call asd(y,t,a)
do i=1,10
t=i
test(i)=y
end do

subroutine asd(y,t,a)
y=a*cos(t)
end
For some reason test(i) gives the same value for every i, whereas the following works as i want it to, note that t doesn't have a value before the subroutine call.
Code:
do i=1,10
t=i
test(i)=a*cos(t)
end do
 
Last edited:
If your first code you only call the subroutine once. You need to call it inside the loop like this.
Code:
do i=1,10
    t=i
    call asd(y,t,a)
    test(i)=y
end do
You don't really need the variable y. You could do
Code:
do i=1,10
    t=i
    call asd(test(i),t,a)
end do
(Note, you DO need t, because by default t is a real variable and i is an integer, so
call asd(y,i,a) won't work. (It will probably compile, but give you the wrong answers).
 
AlephZero said:
If your first code you only call the subroutine once. You need to call it inside the loop like this.
Code:
do i=1,10
    t=i
    call asd(y,t,a)
    test(i)=y
end do
You don't really need the variable y. You could do
Code:
do i=1,10
    t=i
    call asd(test(i),t,a)
end do
(Note, you DO need t, because by default t is a real variable and i is an integer, so
call asd(y,i,a) won't work. (It will probably compile, but give you the wrong answers).
Ok, thanks I think I get it now. As soon as y has a value it's no longer a*cos(t), so by taking the subroutine in the loop, y get's redeclared as a*cos(t) every single loop, after which y can be calculated with a new t again.