Fortran is a high-level programming language primarily used in scientific computing, numerical simulations, and engineering applications. Functions in Fortran are subprograms that perform a specific task and return a value. Functions help organize code, avoid repetition, and make programs modular, readable, and maintainable.
This post provides a comprehensive discussion on declaring and using functions in Fortran, including syntax, arguments, return types, intent attributes, examples with real, integer, logical, and character types, function calls, recursion, best practices, and advanced usage.
1. Introduction to Functions
A function in Fortran is a subprogram designed to compute a value based on given inputs and return the result. Unlike subroutines, which perform tasks but do not return a value directly, functions are specifically intended to produce a single return value.
Key points about functions:
- Must have a return type (integer, real, logical, character, or derived type)
- Can accept arguments (inputs) and modify them based on their intent
- Supports intent attributes:
intent(in),intent(out),intent(inout) - Can be called from the main program or other subprograms
- Encourages modular programming
2. Syntax of a Function
The basic syntax for a function is:
function function_name(arg1, arg2, ...)
return_type :: function_name
type, intent(in/out/inout) :: arg1, arg2, ...
! function body
function_name = result
end function function_name
2.1 Explanation
function_name: Name of the function; also used as the return variablereturn_type: Specifies the data type of the value returnedintent: Optional, specifies how arguments are treatedintent(in)→ argument is input onlyintent(out)→ argument is output onlyintent(inout)→ argument can be modified and returned
- Function body contains computations that assign a value to
function_name
3. Simple Function Example
program function_demo
real :: result
result = add(2.5, 3.5)
print *, "Sum:", result
end program function_demo
function add(a, b)
real :: add
real, intent(in) :: a, b
add = a + b
end function add
Explanation:
- Function
addtakes two real arguments and returns their sum intent(in)ensuresaandbare read-only within the functionresultstores the value returned by the function
4. Function Arguments and Intent
4.1 Input Arguments
intent(in)indicates the argument is read-only- Example:
function square(x)
real :: square
real, intent(in) :: x
square = x * x
end function square
4.2 Output Arguments
intent(out)indicates the argument is used to return a value- Example:
function compute_area(length, width)
real :: compute_area
real, intent(in) :: length, width
compute_area = length * width
end function compute_area
4.3 Input-Output Arguments
intent(inout)allows modification of the argument- Example:
function increment(x)
integer :: increment
integer, intent(inout) :: x
x = x + 1
increment = x
end function increment
Explanation:
xis modified inside the function- New value is also returned as the function result
5. Calling Functions
Functions are called by using their name as part of an expression:
result = add(2.5, 3.5)
total = square(5.0)
area = compute_area(10.0, 5.0)
Explanation:
- Function calls can be part of assignments, print statements, or expressions
- Functions return a value that can be directly used in calculations
6. Functions with Integer Return Type
Functions can return integer values:
function factorial(n)
integer :: factorial
integer, intent(in) :: n
integer :: i
factorial = 1
do i = 1, n
factorial = factorial * i
end do
end function factorial
program test_factorial
integer :: result
result = factorial(5)
print *, "Factorial of 5:", result
end program test_factorial
Explanation:
- Computes factorial using a loop
- Returns integer result to main program
7. Functions with Logical Return Type
Logical functions return .true. or .false.:
function is_even(n)
logical :: is_even
integer, intent(in) :: n
if (mod(n,2) == 0) then
is_even = .true.
else
is_even = .false.
end if
end function is_even
program test_even
logical :: result
result = is_even(10)
print *, "Is 10 even?", result
end program test_even
Explanation:
- Checks whether a number is even
- Returns logical value usable in conditional statements
8. Functions with Character Return Type
Functions can also return strings:
function greet(name)
character(len=20) :: greet
character(len=20), intent(in) :: name
greet = "Hello, "//trim(name)//"!"
end function greet
program test_greet
character(len=20) :: message
message = greet("Alice")
print *, message
end program test_greet
Explanation:
- Concatenates input string with greeting
- Demonstrates character type functions and string manipulation
9. Functions with Multiple Statements
Functions can include multiple statements, loops, and conditionals:
function max_of_three(a, b, c)
real :: max_of_three
real, intent(in) :: a, b, c
if (a >= b .and. a >= c) then
max_of_three = a
else if (b >= a .and. b >= c) then
max_of_three = b
else
max_of_three = c
end if
end function max_of_three
program test_max
real :: result
result = max_of_three(5.0, 8.0, 3.0)
print *, "Maximum value:", result
end program test_max
Explanation:
- Returns the largest of three numbers
- Demonstrates conditionals inside a function
10. Recursive Functions
Functions in Fortran can be recursive, meaning they can call themselves. Use the recursive keyword:
recursive function factorial(n) result(res)
integer, intent(in) :: n
integer :: res
if (n == 0) then
res = 1
else
res = n * factorial(n-1)
end if
end function factorial
program test_recursive
integer :: result
result = factorial(5)
print *, "Factorial using recursion:", result
end program test_recursive
Explanation:
- Computes factorial recursively
recursivekeyword allows function to call itself safely
11. Function Interfaces
Fortran allows explicit interfaces when calling functions from different scopes or modules:
module math_functions
implicit none
contains
function add(a, b)
real :: add
real, intent(in) :: a, b
add = a + b
end function add
end module math_functions
program test_module_function
use math_functions
real :: result
result = add(3.0, 4.5)
print *, "Sum using module function:", result
end program test_module_function
Explanation:
- Using modules improves organization
- Explicit interface ensures correct argument types and return type
12. Function Return Values
- The function name itself is used to store the return value
- Alternatively, Fortran 90+ supports
result()syntax:
function add(a, b) result(res)
real, intent(in) :: a, b
real :: res
res = a + b
end function add
Explanation:
result(res)makes it clearer which variable is returned- Avoids confusion when function name and return variable are different
13. Best Practices for Functions
- Use descriptive names for functions to clarify purpose.
- Specify intent for all arguments (
in,out,inout). - Initialize local variables inside the function.
- Use modules to organize related functions.
- Keep functions focused on a single task for clarity.
- Prefer
result()syntax for readability in larger programs. - Avoid side effects unless using
intent(out)orintent(inout)deliberately.
14. Advanced Example: Multiple Functions
program calculator
real :: x, y, result
x = 10.0
y = 3.0
result = add(x, y)
print *, "Addition:", result
result = subtract(x, y)
print *, "Subtraction:", result
result = multiply(x, y)
print *, "Multiplication:", result
result = divide(x, y)
print *, "Division:", result
end program calculator
function add(a, b) result(res)
real, intent(in) :: a, b
real :: res
res = a + b
end function add
function subtract(a, b) result(res)
real, intent(in) :: a, b
real :: res
res = a - b
end function subtract
function multiply(a, b) result(res)
real, intent(in) :: a, b
real :: res
res = a * b
end function multiply
function divide(a, b) result(res)
real, intent(in) :: a, b
real :: res
if (b /= 0.0) then
res = a / b
else
res = 0.0
end if
end function divide
Explanation:
- Demonstrates multiple functions performing arithmetic
result()syntax clarifies return value- Shows proper use of
intent(in)for inputs
Leave a Reply