GCC Gfortran and Intel oneAPI are the most advanced modern Fortran compilers.
Useful Fortran 2018 enhancements include:
assumed array rank,
to initialize random number seed, and
implicit none (type, external)
to require external procedures to be explicitly declared.
GCC 8 is the
Intel oneAPI also has full Fortran 2018
To get recent GCC is usually straightforward. Red Hat should use devtoolset. MacOS Homebrew quickly adds the lastest GCC version. If Ubuntu gfortran repo defaults aren’t adequate, get recent Gfortran via PPA.
Here are some of the major changes in Gfortran by version:
- Gfortran 10 added
- Gfortran 9 added
random_init()to initialize the random generator seed…randomly
- Gfortran 8.1 added automatic nested loop exchange with
do concurrent, actual argument array with too few elements for dummy argument now errors, initial support for parameterized derived types (simply define
kindat initialization) and coarray support for teams. Gfortran 8.2 and 8.3 did not introduce new Fortran features.
- Gfortran 8.0 added
- Gfortran 7 added derived type IO
select typeet all–complete Fortran 2003, Fortran 2018 non-constant
error stopcodes, and
-fdec-options to help compile very old non-standard code.
- Gfortran 6 added Fortran 2008
submodulesupport, useful for large projects to save compilation time and allow powerful
usescenarios. Fortran 2003 deferred-length
characterare useful for avoiding bothersome
- GCC 5 added full support for OpenMP 4.0, Fortran 2003
ieee_intrinsics, Fortran 2008
pureprocedures with constant error code.
GCC 4.9 added Fortran 2003 deferred-length character variables in derived types.
GCC 4.8 supported Fortran 2008 polymorphism, including
type(*), and assumed rank
GCC 4.6 was the first version of Gfortran reaching beyond Fortran 95, with Fortran 2003 deferred-length character variable and Fortran 2008
impure elemental support.
GCC 4.5 added Fortran 2008
GCC 4.4 added initial support for polymorphism and OpenMP 3.
CMake allows switching parameters based on compiler version. This is very useful for modern Fortran programs.
CMakeLists.txt for Fortran compiler version dependent options.
if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU) # option applying to any language for this compiler add_compile_options(-mtune=native) # language-specific, note LEADING space string(APPEND CMAKE_Fortran_FLAGS " -fimplicit-none") if(CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER_EQUAL 8) string(APPEND CMAKE_Fortran_FLAGS " -std=f2018") endif() endif() add_executable(myprog main.f90)
Reference: Gfortran changelog