I find the Elf90 (www.lahey.com) and F (www.imagine1.com/imagine1)
subset Fortran 90 compilers to be useful supplements to a full
Fortran 90 compiler (in my case Digital Visual Fortran) . I think they
meet the creators' stated goal of preserving the power of Fortran while
eliminating redundancies. The Elf90 features of (1) disallowing unreferenced
variables, variables used before set, and variables set but never later used
and (2) the tracing of execution errors to a specific line in the code
are very valuable.
An obvious problem one has in writing Essential Fortran 90 (Loren Meissner's
term for Elf90 + F) programs is that the vast majority of code in the public
domain and in commercial libraries such as IMSL is unavailable.
Michael Metcalf has written a program to make some F77 to F90 conversions,
and Alan Miller has done this as well as write a program to make some
F90 -> Elf90 conversions. There are many other transformations to be done to
get an F program.
Below is an incomplete list of changes that need to be made to a free source
form F90 program to make it an Elf90/F compatible -- (mi) means that Miller's
code makes the transformation, and (met) is for Metcalf's program. Any
programs
to implement some of the other transformations from F90 to Elf90/F would
be much appreciated.
Vivek Rao
******************************************************************************
**************
INCOMPLETE LIST OF CHANGES TO MAKE TO F90 CODE TO GET F/ELF90 CODE
Note that almost all changes required by Elf90 are required by F, but not
vice-versa.
<GENERAL RULES>
Use only the generic form of intrinsic functions.
Do not use semicolons to start a new statement.
Place each statement on a separate line.
replace a 'data' statements with regular
assignment statements
replace
'real x ; parameter x = 5.0'
with
'real, parameter :: x = 5.0'
(mi) replace 'endif' with 'end if' , 'elseif' with 'else if' , 'enddo' with
'end do'
replace the 'where' statement with a where construct
replace single quotes with double quotes to
enclose strings
do not use keywords as variable names ; for example,
replace 'real, parameter :: tiny = 1.0e-6' with
'real, parameter :: tiny_real = 1.0e-6'
replace 'print*,' with 'write (unit=*,fmt=*)'
replace 'open (1,file_name)' with 'open (unit=1,file=file_name,status="read
write",action="replace")'
replace one-line if statements with if-then-end if structures
convert all keywords to lower case
replace 'stop "program is stopping"' with
'write (unit=*,fmt=*) "program is stopping" ; stop'
replace tabs with spaces
(mi,met) get rid of labeled statements ; replace do-continue with do - end do
(mi) replace '.lt. .le. .eq. .ge. .gt.' with '< <= == >= >' respectively
<DECLARATIONS IN MAIN PROGRAM AND PROCEDURES>
(mi) replace 'character*5' with 'character (len=5)'
use double colons in all declaration statements
replace 'pause' statements with 'stop' or by prompting for input
<MODULES>
declare all module procedures 'public' or 'private'
if a module 'A' USEs another module, place a 'private' statement in module A
place the 'implicit none' statement after any use statements
in the beginning of a module, and remove 'implicit none' statements
from module procedures
<PROCEDURES>
place a 'return' statement just before the end of each procedure
replace statements such as 'real, allocatable :: x(:),y(:,:)' with
'real, dimension(:), allocatable :: x ; real, dimension(:,:), allocatable ::
y'
replace statements such as 'real :: x(n),y(n,n)' with
'real, dimension(n) :: x ; real, dimension(n,n) :: y'
do not call subroutines from functions
replace 'intent(inout)' with 'intent(in out)'
in a subroutine, all arguments must have specified intent
in a function, all arguments must have specified intent(in)
in a subroutine, first declare all intent(in) arguments, then all intent(out)
arguments,
then local variables
always use a result statement for functions -- replace
'function func(x)' with 'function func(x) result(value)'
in a function, first declare all intent(in) arguments, then the function
result, then
local variables
in a procedure, put all optional arguments at the end of the argument list
replace 'common' statement with a module
(mi,met) replace 'end' with 'end program program_name' , and do an analogous
replacement
for subroutines and functions
(mi) replace 'go to' with a cycle or exit statement where possible
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|