Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Fortran passing parameters to a function of one variable

  1. Apr 15, 2012 #1
    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
     
  2. jcsd
  3. Apr 15, 2012 #2
    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.
     
  4. Apr 15, 2012 #3

    AlephZero

    User Avatar
    Science Advisor
    Homework Helper

    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 (Text):

    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 acheive the same effect in Fortran 90 without using COMMON, but with far more typing :smile:
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook