A module is like a package where you can keep your functions and subroutines, in case you are writing a very big program, or your functions or subroutines can be used in more than one program.
Modules provide you a way of splitting your programs between multiple files.
Modules are used for −
Packaging subprograms, data and interface blocks.
Defining global data that can be used by more than one routine.
Declaring variables that can be made available within any routines you choose.
Importing a module entirely, for use, into another program or subroutine.
A module consists of two parts −
The general form of a module is −
module name [statement declarations] [contains [subroutine and function definitions] ] end module [name]
You can incorporate a module in a program or subroutine by the use statement −
use name
Please note that
You can add as many modules as needed, each will be in separate files and compiled separately.
A module can be used in various different programs.
A module can be used many times in the same program.
The variables declared in a module specification part, are global to the module.
The variables declared in a module become global variables in any program or routine where the module is used.
The use statement can appear in the main program, or any other subroutine or module which uses the routines or variables declared in a particular module.
The following example demonstrates the concept −
module constants implicit none real, parameter :: pi = 3.1415926536 real, parameter :: e = 2.7182818285 contains subroutine show_consts() print*, "Pi = ", pi print*, "e = ", e end subroutine show_consts end module constants program module_example use constants implicit none real :: x, ePowerx, area, radius x = 2.0 radius = 7.0 ePowerx = e ** x area = pi * radius**2 call show_consts() print*, "e raised to the power of 2.0 = ", ePowerx print*, "Area of a circle with radius 7.0 = ", area end program module_example
When you compile and execute the above program, it produces the following result −
Pi = 3.14159274 e = 2.71828175 e raised to the power of 2.0 = 7.38905573 Area of a circle with radius 7.0 = 153.938049
By default, all the variables and subroutines in a module is made available to the program that is using the module code, by the use statement.
However, you can control the accessibility of module code using the private and public attributes. When you declare some variable or subroutine as private, it is not available outside the module.
The following example illustrates the concept −
In the previous example, we had two module variables, e and pi. Let us make them private and observe the output −
module constants implicit none real, parameter,private :: pi = 3.1415926536 real, parameter, private :: e = 2.7182818285 contains subroutine show_consts() print*, "Pi = ", pi print*, "e = ", e end subroutine show_consts end module constants program module_example use constants implicit none real :: x, ePowerx, area, radius x = 2.0 radius = 7.0 ePowerx = e ** x area = pi * radius**2 call show_consts() print*, "e raised to the power of 2.0 = ", ePowerx print*, "Area of a circle with radius 7.0 = ", area end program module_example
When you compile and execute the above program, it gives the following error message −
ePowerx = e ** x 1 Error: Symbol 'e' at (1) has no IMPLICIT type main.f95:19.13: area = pi * radius**2 1 Error: Symbol 'pi' at (1) has no IMPLICIT type
Since e and pi, both are declared private, the program module_example cannot access these variables anymore.
However, other module subroutines can access them −
module constants implicit none real, parameter,private :: pi = 3.1415926536 real, parameter, private :: e = 2.7182818285 contains subroutine show_consts() print*, "Pi = ", pi print*, "e = ", e end subroutine show_consts function ePowerx(x)result(ePx) implicit none real::x real::ePx ePx = e ** x end function ePowerx function areaCircle(r)result(a) implicit none real::r real::a a = pi * r**2 end function areaCircle end module constants program module_example use constants implicit none call show_consts() Print*, "e raised to the power of 2.0 = ", ePowerx(2.0) print*, "Area of a circle with radius 7.0 = ", areaCircle(7.0) end program module_example
When you compile and execute the above program, it produces the following result −
Pi = 3.14159274 e = 2.71828175 e raised to the power of 2.0 = 7.38905573 Area of a circle with radius 7.0 = 153.938049