Anaconda Python by default auto-activates the “base” environment each time a new Terminal is opened.
This slows opening new Terminals, particularly on systems with slow or virtual disks.
Particularly if the user isn’t constantly using Python, it can be beneficial to make conda only active when specified.
To disable conda auto-activation on new Terminals, type:
Fortran compilers typically have options for enforcing Fortran standards.
The compilers raise additional warnings or errors for code that is not deemed compliant.
Fortran standard options can make false warnings, so we generally do not enable standards checking for user defaults.
However, we do enforce implicit none as a quality measure.
It’s also important to use implicit none so that each variable must be assigned beforehand.
We recommend the Fortran 2018 statement:
implicit none (type, external)
which requires explicitly defined procedure interfaces as well.
the traditional implicit none default
new for Fortran 2018, requires explicit interface for external procedures.
Major projects with CPU arch-specific code take a while to implement new CPU architectures.
Apple Silicon (M1, etc.) are a key example.
For example, Anaconda Python has Intel and Apple Silicon installers.
Check if a C++, GNU Octave, Matlab, or Python
executable on Apple Silicon is using native or Rosetta:
GCC Gfortran and Intel oneAPI are the most advanced, widely available modern Fortran compilers.
Useful Fortran 2018 enhancements include:
assumed array rank,
within pure procedures,
to initialize random number seed, and
implicit none (type, external)
to require external procedures to be explicitly declared.
GCC 9 is the
Intel oneAPI has full Fortran 2018
To get recent GCC is usually straightforward.
Red Hat should use
MacOS Homebrew quickly adds the latest
If Ubuntu gfortran repo
aren’t adequate, get recent Gfortran via
Here are some of the major changes in Gfortran by version:
Gfortran 12 enhances OpenMP 5 and OpenACC 2.6 support. Numerous bugfixes. bind(C) with character length greater than one.
Gfortran 11 completed OpenMP 4.5 support
Gfortran 10 added select rank
Gfortran 9 added random_init() to initialize the random generator seed…randomly
Gfortran 8 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 kind at initialization) and coarray support for teams. Standard flag -std=f2018 added and deprecated -std=f2008ts.
Gfortran 7 added derived type IO select type. Complete Fortran 2003 support, Fortran 2018 non-constant stop and error stop codes, and -fdec- options to help compile very old non-standard code.
Gfortran 6 added Fortran 2008 submodule support, useful for large projects to save compilation time and allow powerful use scenarios.
Fortran 2003 deferred-length character are
for avoiding bothersome trim() everywhere.
GCC 5 added full support for OpenMP 4.0, Fortran 2003 ieee_ intrinsics, Fortran 2008 error stop in pure procedures 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 select type, class(*), type(*), and assumed rank dimension(..).
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 iso_fortran_env.
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.
Example CMakeLists.txt for Fortran compiler version dependent options.
detect the host CPU arch
to use with Intel compilers.
We discourage package maintainers from settings flags like “-march=native” (GCC, Clang) and “-xHost” (Intel oneAPI) because they may break on user systems such as ARM or HPC.
However, the user can set flags for a project by setting environment variables like CFLAGS before the first project configure in CMake.
This allows optimizing for a target compiler while compiling from a different host.
Or, the user on an appropriate system may simply set their ~/.profile to have CFLAG=-march=native or similar.
Projects use a variety of methods to detect which compiler is being used to thereby set compilation options.
Although this discussion focuses on Fortran, it is easily and equally applicable to other languages such as C and C++.
is a Visual-Studio only function.
Therefore, C++ programs that call it should use a preprocessor conditional: