Fortran has many intrinsic functions like sin(), sqrt(), etc. for common mathematical operations, but no language can provide a function for everything a programmer might want to compute.
Hence, Fortran allows us to define our own functions and even make them available for use in other programs.
A Fortran function definition looks almost exactly like the main program. There are only a few subtle differences. The general form of a function definition is as follows:
! Define function
function function_name(argument variable list)
data type :: function_name
implicit none
! Define arguments
data type, intent(in|out|inout) :: arg1, arg2, ...
! Define local variables
data type :: var1, var2, ...
! Function body
! Return value by assigning to function name
! Every function MUST do this before returning to the caller!
function_name = some-expression
end function function_name
Below is a complete program with a user-defined function. In addition to the function definition, the program contains a subprogram interface for the function, which is explained in the section called “Type Matching”.
!-----------------------------------------------------------------------
! Program description:
! Program to print a table of integer powers
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
! Modification history:
! Date Name Modification
! 2011-03-23 Jason Bacon Begin
!-----------------------------------------------------------------------
! Subprogram interfaces
module subprograms
interface
function power(base, exponent)
real(8) :: power
real(8) :: base
integer :: exponent
end function
end interface
end module
! Main program body
program function_example
use subprograms
! Disable implicit declarations (i-n rule)
implicit none
! Variable definitions
integer :: exponent
! Statements
print *, 'Powers of 2'
do exponent = 0, 10
! Will not work with 2.0 instead of 2.0d0
print *, '2 ^ ', exponent, ' = ', power(2.0d0, exponent)
enddo
print *, ''
print *, 'Powers of 3'
do exponent = 0, 10
! Will not work with 3.0 instead of 3.0d0
print *, '3 ^ ', exponent, ' = ', power(3.0d0, exponent)
enddo
end program
!-----------------------------------------------------------------------
! Description:
! Compute base ** exponent for any non-negative integer exponent
!
! Arguments:
! base: The real base of base ** exponent
! exponment: The non-negative integer exponent
!
! Returns:
! base ** exponent
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
! Modification history:
! Date Name Modification
! 2011-03-23 Jason Bacon Begin
!-----------------------------------------------------------------------
function power(base, exponent)
! Disable implicit declarations (i-n rule)
implicit none
! Function type
! Factorials grow beyond the range of a 32-bit integer very quickly
! so we use a data type with greater range
real(8) :: power
! Dummy variables
real(8), intent(in) :: base
integer, intent(in) :: exponent
! Local variables
integer :: x
! Compute n!
power = 1.0
do x = 1, exponent
power = power * base
enddo
end function