Fortran offers two different procedures:
subroutine. Subroutines are more general and offer the possibility to return multiple values whereas functions only return one value.
subroutine looks similar to a
program except that it also takes input parameters. It is invoked by a oneline command
<keywords> subroutine <name> (<parameters>) <statements> end subroutine <name>
Subroutines must be invoked on separate lines by the
... call <subroutine_name>(<parameters>) ...
Each parameter must have its
intent declared. The intent shows what the subroutine can do with each parameter. Possible intents are:
in, out, inout.
in: The parameter will have an initial value and its value is not allowed to change.
out: The parameter will not have an initial value and one can set its value. The parameter retains the final value even after the procedure has ended.
inout(can also we written as
in out): An initial value is set and one can change its value. The parameter retains the final value even after the procedure has ended.
Additionally, one can set the
value attribute. This allows the parameter to be changed inside of the procedure but the after its end the parameter will change back to its original value. This is useful for describing C functions.
Functions always return at most one value which can be of default type or derived type.
There are multiple ways to write identical functions. One method is
<keywords> function <func_name> (<parameters>) result (<res_name>) <statements> end function <func_name>
res_name has automatically the intent
Functions can be invoked in the same manner as built-in functions, e.g.
sin. The following simplified example tries to show an invocation for a function
some_function which returns a
... use some_module, only : some_function real :: x = 1, y y = x**3 + 3*x*some_function(x) ...
Only procedures with the keyword
recursive are permitted to call themselves.
For easy vectorization use the keyword
elemental. See also elemental.
pure keyword indicates that the procedure has no side effects, e.g. does not alter gloabl variables, or prints messages.