Fortran passing parameters to a function of one variable

Click For Summary
SUMMARY

This discussion focuses on the efficient passing of parameters in Fortran functions, specifically when defining a function of one variable that relies on a constant second variable. The original poster (OP) demonstrates a method using data files to store and retrieve the constant parameter, which is deemed inefficient. Forum participants suggest alternatives, including using common blocks (Fortran 77) or modules (Fortran 90) to share values between the main program and functions without excessive file I/O operations. The consensus is that modifying the function to accept two parameters is a straightforward solution, but the OP's existing code constraints complicate this approach.

PREREQUISITES
  • Understanding of Fortran syntax and structure
  • Familiarity with function definitions in Fortran
  • Knowledge of common blocks in Fortran 77
  • Experience with modules in Fortran 90
NEXT STEPS
  • Learn about Fortran function parameter passing techniques
  • Explore common blocks in Fortran 77 for variable sharing
  • Study modules and the use statement in Fortran 90
  • Investigate performance implications of file I/O in Fortran
USEFUL FOR

Fortran developers, programmers working with legacy code, and anyone looking to optimize parameter handling in Fortran functions.

Thereso
Messages
1
Reaction score
0
Hi all! I have a question about fortran. So far in my coding, if i wanted to define a function ( say f(x) ) I would manually set a grid for x, and then define f for each x value, so that i would have a vector for f and a vector for x. However, I'd now like to use the 'function' command, so i can call f for ANY x.

I'll do my best to explain my question: say I define a function g(x,y) by

g(x,y) = x**2 + y

and I want to define another function f(x), which is EQUAL to g(x,y) but with y held constant. I want to use a set of subroutines on the function f, but the problem is that all of the subroutines call f as a function of one variable and not two. So basically I want to pass y as a parameter into a function defining f(x). Later I will change y and then repeat. One way I can do it is to write y to a data file, and then read it from inside the function f:
program lolz
implicit none
real, external :: f
real y,c,x
! g(x,y) = x^2 + y
!calculate g(3.0,2.0)
y=2.0
open(26,file='y.dat',status='unknown')
write(26,*) (y)
close(26)
!test
x=3.0
write(*,*)"f(x) is",f(x)

end

function f (x)
implicit none
real f
real x,y
open(26,file='y.dat',status='unknown')
read(26,*) y
close(26)
f= x**2.0 +y
return
end function f


this program correctly returns "f(x) is 11.". But I'm sure that this constant opening and closing of data files is inefficient, there must be a better way of doing it? Thanks everyone :D
 
Technology news on Phys.org
Well...I don't quite get what you REALLY are trying to achieve...why can't you just pass x AND y to the function f? ...just declare the function f to take two parameters and return one...nothing wrong with that.

Other than that, you could use common block (up to fortran 77 style) to set y before you start calling the function with just x; or, you could go the module/use route (fortran 90 forward style). These two methods allow the function and the main program to share values without having to pass them around as arguments/parameters.
 
gsal said:
Well...I don't quite get what you REALLY are trying to achieve...why can't you just pass x AND y to the function f? ...just declare the function f to take two parameters and return one...nothing wrong with that.

That won't work, because the OP has some existing code (which presumably can't be changed) that called f() as a function with one variable.

The way to do this in fortran 77 is use a common block, something like

Code:
function f(x)
common/fcom/y
...
g(x,y)
...
end

program main
common/fcom/y
...
y = 2.0
...
f(x)
...
y = 3.0
...
f(x)
...
end
I expect you can achieve the same effect in Fortran 90 without using COMMON, but with far more typing :smile:
 

Similar threads

  • · Replies 20 ·
Replies
20
Views
3K
  • · Replies 25 ·
Replies
25
Views
4K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 8 ·
Replies
8
Views
4K
  • · Replies 5 ·
Replies
5
Views
5K
  • · Replies 59 ·
2
Replies
59
Views
12K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K