|
|
|
! This file is an example to test the syntax highlighting file F.xml
|
|
|
|
! (for fortran 90 and F)
|
|
|
|
|
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
! THIS IS AN EXAMPLE OF A MODULE !
|
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
module module_example
|
|
|
|
|
|
|
|
! use 'implicit none' when you want all variables to be declared
|
|
|
|
implicit none
|
|
|
|
|
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
! PUBLICS AND PRIVATES
|
|
|
|
|
|
|
|
! In fortran 90 you can define your own operator
|
|
|
|
public :: operator(.norm.)
|
|
|
|
public :: operator(+) ! <-- you can also overload the usual operators
|
|
|
|
public :: factorial
|
|
|
|
public :: example_fn
|
|
|
|
|
|
|
|
private :: point3d_add
|
|
|
|
private :: point3d_norm
|
|
|
|
|
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
! USER-DEFINED TYPES...
|
|
|
|
|
|
|
|
! This is a definition to use in declarations of real variables,
|
|
|
|
! parameters, etc.
|
|
|
|
integer, parameter, public :: kr = selected_real_kind(10)
|
|
|
|
|
|
|
|
! This is a user-defined type
|
|
|
|
type, public :: point3d
|
|
|
|
real(kind=kr) :: x, y, z
|
|
|
|
end type point3d
|
|
|
|
|
|
|
|
! This type is useless: it is only an example of type definition!
|
|
|
|
type, public :: example_type
|
|
|
|
complex(kind=kr) :: c ! <-- a complex number (two reals of kind kr)!
|
|
|
|
real, dimension(-10:10) :: & ! <-- this line does not end here!
|
|
|
|
r1, r2 ! <-- this is the final part of the previous line
|
|
|
|
real, pointer, dimension(:) :: pointer_to_array_of_real
|
|
|
|
real, dimension(:), pointer :: array_of_pointer_to_real
|
|
|
|
end type example_type
|
|
|
|
|
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
! INTERFACES...
|
|
|
|
|
|
|
|
! Interface for the norm of a 3-D vector
|
|
|
|
interface operator(.norm.)
|
|
|
|
module procedure point3d_norm
|
|
|
|
end interface
|
|
|
|
|
|
|
|
! Interface for the operator '+'
|
|
|
|
interface operator(+)
|
|
|
|
module procedure point3d_add
|
|
|
|
end interface
|
|
|
|
|
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
! SOME DECLARATIONS...
|
|
|
|
|
|
|
|
! A real number can be declared with the following line:
|
|
|
|
real(kind=kr) :: real_var1
|
|
|
|
! But if you are not interested on the precision of floating point numbers,
|
|
|
|
! you can use simply:
|
|
|
|
real :: real_var2
|
|
|
|
|
|
|
|
! An array can be declared in two ways:
|
|
|
|
real(kind=kr), dimension(1:10, -4:5), private :: a, b, c
|
|
|
|
real(kind=kr), private :: d(1:10, -4:5)
|
|
|
|
|
|
|
|
! This is a string with fixed lenght
|
|
|
|
character(len=10) :: str_var
|
|
|
|
|
|
|
|
! This is an allocatable array, which can be a target of a pointer
|
|
|
|
type(example_type), private, dimension(:), allocatable, target :: &
|
|
|
|
many_examples
|
|
|
|
|
|
|
|
! Fortran 90 hasn't got its own preprocessor, it uses the C preprocessor!
|
|
|
|
#ifdef XXX
|
|
|
|
c <-- this is a comment in the old fortran 77 style (fixed form)
|
|
|
|
c This is a free form file, so we shouldn't use this kind of comments!
|
|
|
|
c But fortran 90 still understands fixed form, when parsing sources with
|
|
|
|
c the *.f extension.
|
|
|
|
c ! <-- this 'c' shouldn't be highlighted as a comment!
|
|
|
|
#endif
|
|
|
|
|
|
|
|
contains
|
|
|
|
|
|
|
|
|
|
|
|
! The sum of two points
|
|
|
|
pure function point3d_add(a, b) result(rs)
|
|
|
|
type(point3d) :: rs
|
|
|
|
type(point3d), intent(in) :: a, b
|
|
|
|
rs%x = a%x + b%x
|
|
|
|
rs%y = a%y + b%y
|
|
|
|
rs%z = a%z + b%z
|
|
|
|
end function point3d_add
|
|
|
|
|
|
|
|
|
|
|
|
! The norm of a point
|
|
|
|
pure function point3d_norm(a) result(rs)
|
|
|
|
real(kind=kr) :: rs
|
|
|
|
type(point3d), intent(in) :: a
|
|
|
|
rs = sqrt(a%x * a%x + a%y * a%y + a%z * a%z)
|
|
|
|
end function point3d_norm
|
|
|
|
|
|
|
|
|
|
|
|
! A simple recursive function
|
|
|
|
recursive function factorial(i) result (rs)
|
|
|
|
integer :: rs
|
|
|
|
integer, intent(in) :: i
|
|
|
|
if ( i <= 1 ) then
|
|
|
|
rs = 1
|
|
|
|
else
|
|
|
|
rs = i * factorial(i - 1)
|
|
|
|
end if
|
|
|
|
end function factorial
|
|
|
|
|
|
|
|
|
|
|
|
! This is a useless function
|
|
|
|
subroutine example_fn(int_arg, real_arg, str_arg)
|
|
|
|
integer, intent(in) :: int_arg
|
|
|
|
real(kind=kr), intent(out) :: real_arg
|
|
|
|
character(len=*), intent(in) :: str_arg
|
|
|
|
|
|
|
|
type(example_type), pointer :: p
|
|
|
|
integer :: n, i, j
|
|
|
|
logical :: flag
|
|
|
|
|
|
|
|
flag = .true. ! .true. is not an operator!
|
|
|
|
if ( flag .and. flag ) then ! .and. is a pre-defined operator
|
|
|
|
print *, "blabla"
|
|
|
|
end if
|
|
|
|
|
|
|
|
! Examples of inquiry functions: allocated, lbound, ubound.
|
|
|
|
if ( .not. allocated(many_examples) ) then
|
|
|
|
allocate( many_examples(10) )
|
|
|
|
end if
|
|
|
|
print *, "Lower bound = ", lbound(many_examples, 1)
|
|
|
|
print *, "Upper bound = ", ubound(many_examples, 1)
|
|
|
|
|
|
|
|
p => many_examples(5) ! <-- p is a pointer
|
|
|
|
|
|
|
|
! A strange way to calculate i*i: add the first i odd numbers
|
|
|
|
i = 6
|
|
|
|
j = 0
|
|
|
|
do n = 1, i
|
|
|
|
j = j + (2*n - 1)
|
|
|
|
end do
|
|
|
|
print *, "i*i = ", i*i, j
|
|
|
|
|
|
|
|
real_arg = real(j) ! <-- here the highlighting is not very good:
|
|
|
|
! it is unable to distinguish between this and a definition like:
|
|
|
|
! real(kind=kr) :: a
|
|
|
|
deallocate( many_examples )
|
|
|
|
end subroutine example_fn
|
|
|
|
|
|
|
|
end module module_example
|
|
|
|
|
|
|
|
|
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
! THIS IS THE MAIN PROGRAM !
|
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
program example
|
|
|
|
use module_example
|
|
|
|
|
|
|
|
! this is another example of use of the 'implicit' keyword
|
|
|
|
implicit double precision (a-h,o-z)
|
|
|
|
|
|
|
|
real(kind=kr) :: var_out
|
|
|
|
|
|
|
|
type(point3d) :: &
|
|
|
|
a = point3d(0.0_kr, 1.0_kr, 2.0_kr), &
|
|
|
|
b = point3d(4.0_kr, 5.0_kr, 6.0_kr)
|
|
|
|
|
|
|
|
print *, "a + b = ", .norm. (a + b)
|
|
|
|
print *, "factorial of 5 = ", factorial(5)
|
|
|
|
|
|
|
|
call example_fn(1, var_out, "hello!")
|
|
|
|
|
|
|
|
end program example
|