Fortran 90 Subprograms

Fortran 90 Subprograms

Fortran 90 Subprograms If Fortran is the lingua franca, then certainly it must be true that BASIC is the lingua playpen Thomas E. Kurtz Co-Designer of the BASIC language1 Fall 2010 Functions and Subroutines zFortran 90 has two types of subprograms, functions and subroutines. zA Fortran 90 function is a function like those in C/C++. Thus, a function returns a computed result via the function name . zIf a function does not have to return a function value, use subtibroutine. 2 Function Syntax: 1/3 zA Fortran function,,pg, or function subprogram, has the following syntax: type FUNCTION function-name (arg1, arg2, ..., argn) IMPLICIT NONE [specification part] [execution part] [subprogram part] END FUNCTION function-name ztype is a Fortran 90 type ( ege.g., INTEGER, REAL, LOGICAL, etc) with or without KIND. zfunction-name is a Fortran 90 identifier zarg1, …, argn are formal arguments. 3 Function Syntax: 2/3 zA function is a self-contained unit that receives some “input” from the outside world via its formal arguments, does some computations, and returns the result with the name of the function. zSomewhere in a function there has to be one or more assignment statements like this: function-name = expression where the result of expression is saved to the name of the function. zNote that function-name cannot appear in the right-hand side of any expression. 4 Function Syntax: 3/3 zIn a type sp ecification , formal arg uments should have a new attribute INTENT(IN). zThe meaning of INTENT(IN) is that the function only takes the value from a formal argument and does not change its content. zAny statements that can be used in PROGRAM can also be used in a FUNCTION. 5 Function Example zNote that functions can have no formal argument. zBut, () is still required. Factorial computation Read and return a positive real number INTEGER FUNCTION Factorial(n) REAL FUNCTION GetNumber() IMPLICIT NONE IMPLICIT NONE INTEGER, INTENT(IN) :: n REAL :: Input_Value INTEGER :: i, Ans DO WRITE((,)*,*) 'A positive number: ' Ans = 1 READ(*,*) Input_Value DO i = 1, n IF (Input_Value > 0.0) EXIT Ans = Ans * i WRITE(*,*) 'ERROR. try again.' END DO END DO Factorial = Ans GetNumber = Input_Value END FUNCTION Factorial END FUNCTION GetNumber 6 Common Problems: 1/2 forggypet function type forget INTENT(IN) − not an error FUNCTION DoSomething(a, b) REAL FUNCTION DoSomething(a, b) IMPLICIT NONE IMPLICIT NONE INTEGER, INTENT(IN) :: a, b INTEGER :: a, b DoSomthing = SQRT(a*a + b*b) DoSomthing = SQRT(a*a + b*b) END FUNCTION DoSomething END FUNCTION DoSomething change INTENT(IN) argument forget to return a value REAL FUNCTION DoSomething(a, b) REAL FUNCTION DoSomething(a, b) IMPLICIT NONE IMPLICIT NONE INTEGER, INTENT(IN) :: a, b INTEGER, INTENT(IN) :: a, b IF (a > b) THEN INTEGER :: c a = a - b c = SQRT(a*a + b*b) ELSE END FUNCTION DoSomething a = a + b END IF DoSomthing = SQRT(a*a+b*b) END FUNCTION DoSomething 7 Common Problems: 2/2 incorrect use of function name only the most recent value is returned REAL FUNCTION DoSomething(a, b) REAL FUNCTION DoSomething(a, b) IMPLICIT NONE IMPLICIT NONE INTEGER, INTENT(IN) :: a, b INTEGER, INTENT(IN) :: a, b DoSomething = a*a + b*b DoSomething = a*a + b*b DoSomething = SQRT(DoSomething) DoSomething = SQRT(a*a - b*b) END FUNCTION DoSomething END FUNCTION DoSomething 8 Using Functions z The use of a user -defined function is similar to the use of a Fortran 90 intrinsic function. z The following uses function Factorial(n) to compute the combinatorial coefficient C(m,n) , where m and n are actual arguments: Cmn = Factorial(m)/(Factorial(n)*Factorial(m-n)) z Note that the combinatorial coefficient is defined as follows, although it is not the most efficient way: m! C(m,n) = nmn!(×− )! 9 Argument Association : 1/5 zArgument association is a way of passing values from actual arguments to formal arguments. zIf an actual argument is an expression, it is evaluated and stored in a temporary location from which the value is passed to the corresponding formal argument. zIf an ac tua l argumen t is a varibliable, its val ue i s passed to the corresponding formal argument. zCdConstant and (A), where A iiblis variable, are considered expressions. 10 Argument Association : 2/5 zActual arguments are variables: WRITE(*,*) Sum(a,b,c) abc INTEGER FUNCTION Sum(x,y,z) IMPLICIT NONE INTEGER,INTENT(IN)::x , y, z x y z …….. END FUNCTION Sum 11 Argument Association : 3/5 zExpressions as actual arguments. Dashed line boxes are temporary locations. WRITE(*,*) Sum(a+b,b+c,c) a+b b+c c INTEGER FUNCTION Sum(x,y,z) IMPLICIT NONE INTEGER,INTENT(IN)::x , y, z x y z …….. END FUNCTION Sum 12 Argument Association : 4/5 zConstants as actual arguments. Dashed line boxes are temporary locations. WRITE(*,*) Sum(1, 2, 3) 123 INTEGER FUNCTION Sum(x,y,z) IMPLICIT NONE INTEGER,INTENT(IN)::x , y, z x y z …….. END FUNCTION Sum 13 Argument Association : 5/5 zA variable in () is considered as an expression. Dashed line boxes are temporary locations. WRITE(*,*) Sum((a), (b), (c)) (a) (b) (c) INTEGER FUNCTION Sum(x,y,z) IMPLICIT NONE INTEGER,INTENT(IN)::x , y, z x y z …….. END FUNCTION Sum 14 Where Do Functions Go: 1/2 zFortran 90 functions can be internal or external. zInternal functions are inside of a PROGRAM,the main program : PROGRAM program-name IMPLICIT NONE [specification part] [execution part] CONTAINS [functions] END PROGRAM program-name zAlthough a function can contain other functions, itinternal lf functi ons cannot hitlftihave internal functions. 15 Where Do Functions Go: 2/2 zThe right shows PROGRAM TwoFunctions two internal IMPLICIT NONE REAL :: a, b, A_Mean, G_Mean functions, READ(*,*) a, b ArithMean() A_Mean = ArithMean(a, b) G_Mean = GeoMean(a,b) and GeoMean(). WRITE(*,*) a, b, A_Mean, G_Mean CONTAINS zThey take two REAL FUNCTION ArithMean(a, b) REAL actual IMPLICIT NONE REAL, INTENT(IN) :: a, b argumentdts and ArithMean = (a+b)/2.0 END FUNCTION ArithMean compute and REAL FUNCTION GeoMean(a, b) return a REAL IMPLICIT NONE REAL, INTENT(IN) :: a, b function value. GeoMean = SQRT(a*b) END FUNCTION GeoMean END PROGRAM TwoFunctions 16 Scope Rules: 1/5 zScope rules tell us if an entity ( i.e., variable, parameter and function) is visible or accessible at certain places. zPlaces where an entity can be accessed or visible is referred as the scope of that entity. 17 Scope Rules: 2/5 zScope Rule #1: The scope of an entity is the program or function in which it is declared. PROGRAM Scope_1 Scope of PI, m and n IMPLICIT NONE REAL, PARAMETER :: PI = 3.1415926 INTEGER :: m, n ................... CONTAINS INTEGER FUNCTION Funct1(k) Scope of k, f and g IMPLICIT NONE local to Funct1() INTEGER, INTENT(IN) :: k REAL :: f, g .......... END FUNCTION Funct1 REAL FUNCTION Funct2(u, v) IMPLICIT NONE Scope of u and v REAL, INTENT(IN) :: u, v local to Funct2() .......... END FUNCTION Funct2 18 END PROGRAM Scope_1 Scope Rules: 3/5 zScope Rule #2 :A global entity is visible to all contained functions. PROGRAM Scope_2 IMPLICIT NONE ¾a, b and c are global INTEGER :: a = 1, b = 2, c = 3 ¾The first Add(a) returns 4 WRITE(*,*) Add(a) c = 4 ¾The secon d Add(a) returns 5 WRITE(*,*) Add(a) WRITE(*,*) Mul(b,c) ¾Mul(b,c) returns 8 CONTAINS INTEGER FUNCTION Add(q) IMPLICIT NONE Thus, the two Add(a)’s produce different INTEGER, INTENT(IN) :: q results, even though the formal arguments Add = q + c are the same! This is usually referred to END FUNCTION Add INTEGER FUNCTION Mul(x, y) as side effect. IMPLICIT NONE INTEGER, INTENT(IN) :: x, y Mul = x * y Avoid using global entities! END FUNCTION Mul 19 END PROGRAM Scope_2 Scope Rules: 4/5 zScope Rule #2 :A global entity is visible to all contained functions. PROGRAM Global ¾The first Add(a,b) returns 30 IMPLICIT NONE ¾It also changes b to 30 INTEGER :: a = 10, b = 20 ¾The 2n d WRITE(*, *) shows 30 WRITE(*,*) Add(a,b) ¾The 2nd returns WRITE(*,*) b Add(a,b) 40 WRITE(*,*) Add(a,b) ¾This is a bad side effect CONTAINS ¾Avoid using global entities! INTEGER FUNCTION Add(x,y) IMPLICIT NONE INTEGER, INTENT(IN)::x, y b = x+y Add = b END FUNCTION Add END PROGRAM Global 20 Scope Rules: 5/5 zScope Rule #3 :An entity declared in the scope of another en tity is a lways a differen t one even if their names are identical. PROGRAM Scope_3 Although PROGRAM and FUNCTION IMPLICIT NONE Sum() both have INTEGER variable i, INTEGER :: i, Max = 5 They are TWO different entities. DO i = 1, Max Write(*,*) Sum(i) END DO Hence, any changes to i in Sum() will CONTAINS not affect the i in PROGRAM. INTEGER FUNCTION Sum(n) IMPLICIT NONE INTEGER, INTENT(IN) :: n INTEGER :: i, s s = 0 …… other computation …… Sum = s END FUNCTION Sum END PROGRAM Scope_3 21 Example: 1/4 zIf a triangle has side lengths a, b and c, the Heron formula computes the triangle area as follows, where s = (a+b+c)/2: Area=×−×−×− s()()() s a s b s c zTo form a triangle, a, b and c must fulfill the following two conditions: a > 0, b > 0 and c > 0 a+b > c, a+c > b and b+c > a 22 Example: 2/4 zLOGICAL Function Triangg()leTest() makes sure all sides are positive, and the sum of any two is larger than the third. LOGICAL FUNCTION TriangleTest(a, b, c) IMPLICIT NONE REAL, INTENT(IN) :: a, b, c LOGIC AL :: test1 , test2 test1 = (a > 0.0) .AND.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    56 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us