GCC GFortran, LLVM Flang, and Intel oneAPI are among the most advanced free-to-usemodern Fortran compilers.
Currently we recommend writing Fortran code to support:
To get recent GCC is usually straightforward.
Red Hat should use
GCC Toolset.
macOS Homebrew quickly adds the latest
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 16 adds improved Fortran 2023 support including the split intrinsic subroutine, optional lower argument to c_f_pointer, and additional trigonometric functions (sinpi, etc.). It also enhances coarray support with native shared memory multithreading on single-node machines and better Fortran 2018 TEAM handling, improves Fortran 2003 parameterized derived types (LEN parameters), and adds Fortran 2018 extensions to the IMPORT statement, the REDUCE intrinsic, and the new GENERIC statement.
Gfortran 15 adds experimental support for unsigned modular integers (-funsigned), Fortran 2018/2023 locality specifiers in do concurrent, and stricter format string parsing (missing commas in I/O descriptors are now rejected by default). The module file format is now incompatible with GCC 8–14 (but older .mod files can still be read). Coarray support has been significantly reworked.
Gfortran 14 adds -std=f2023 (prepares for Fortran 2023) with increased free-form line length (10,000 characters) and statement length (up to 1 million characters). It also improves preprocessing output with -save-temps (.fii/.fi files).
Gfortran 13 completes full support for finalization and improves OpenMP 5.0 support for Fortran (e.g. some non-rectangular loop nests).
Gfortran 12 enhances OpenMP 5 and OpenACC 2.6 support. Numerous bugfixes. bind(C) with character length greater than one. This is a groundbreaking improvement for C interoperability for character and strings, even C++ <string> using ISO_Fortran_binding.h.
Gfortran 11 completed OpenMP 4.5 support.
Gfortran 10 added select rank.
Gfortran 9 added random_init() to initialize the random generator seed.
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
useful
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 Fortran 2018 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.
Jupyter notebook outputs can be large (plots, images, etc.), making Git repo history excessively large and making Git operations slower as the Git history grows.
Jupyter notebook outputs can reveal personal information with regard to usernames, Python executable, directory layout, and data outputs.
Strip all Jupyter outputs from Git tracking with a client-side Git pre-commit
hook
by
configuring Git pre-commit hooks.
We use Git pre-commit hook because Git filters can interfere with other programs such as
CMake ExternalProject.
Configure Git user-wide where to use an IPython script to strip Jupyter notebook outputs by:
In some environments, Fortran Package Manager commands like fpm build or fpm test can fail when a dependency (say HDF5) is resolved through pkg-config and the .pc file includes a system include path such as -I/usr/include.
Continuous Integration services run user-defined self-checks on code on each “git push”.
GitHub Actions
is a popular service for CI.
CI is one part of the
DevOps lifecycle.
CI services generally have quotas and/or concurrency limits but these are currently no-cost for public Git repos:
Git does not have a integral mechanism to have multiple authors per Git commit.
A Git coauthor notation convention has become accepted by major services including
Github
and GitLab.
Git itself can programmatically
parse arbitrary Git commit trailers
but does not have a built-in notion of coauthors.
Indicate Git coauthor by placing plaintext in the commit message body.
The email address cited must match a registered email with the Git service.
The email can be a working public email or the “fake” noreply email provided by the Git service.
Multiple coauthors each use the same syntax on the same Git commit like:
added foo function to bar.py
Co-authored-by: David <snake@users.noreply.github.com>
The coauthor commits do show up in GitHub search under “Commits”.
Caveats: as with regular Git commits, there is no authentication to avoid someone masquerading as someone else with Git coauthor commits.
Git coauthor commits cannot be GPG signed for each coauthor, only the primary Git committer can GPG sign as usual.
Commands like git rebase can use --trailer to for example show who reviewed a rebase like:
git rebase can add trailers to the Git commit message to indicate who reviewed the rebase like:
git rebase --trailer "Reviewed-by: Nobody <nobody@users.noreply.github.com>"
When only a subdirectory of a Git repository is opened in Visual Studio Code, repo-root Copilot customizations like
.github/copilot-instructions.md
are not discovered by default.
This can make Copilot ignore repository-wide instructions even though they exist at the top of the current Git repository.
Visual Studio Code has a built-in configuration items to resolve this issue by enabling
parent repository discovery
for chat customizations.
With this setting enabled true, VS Code walks upward from the opened workspace folder until it finds .git.
It then discovers chat customizations between the opened folder and the repository root, including:
.github/copilot-instructions.md
.github/instructions/*.instructions.md
prompt files
agent files such as AGENTS.md
hooks and other chat customizations
This setting is especially useful for monorepos and for workflows that open a focused subdirectory such as content/posts/, src/, or packages/frontend/ instead of the full repository root.
Without parent repository discovery, Copilot can miss repository-specific style and validation rules.
A few conditions apply:
the opened folder must not itself be a separate Git repository (e.g. Git submodule)
a parent folder must contain .git
the parent repository folder must be trusted in VS Code
To verify that the repository instructions are in use, inspect the References list on a Copilot Chat response.
If parent discovery is working, the response references typically include the repo-root customization files.
A Linux computer temp folder can be purged on schedule to free up disk space and remove old temporary files.
The programs “tmpwatch” or “tmpreaper” can be used to purge the temp folder on a schedule.
tmpwatch
is available on Red Hat-based Linux distributions, while
tmpreaper
is available on Debian-based Linux distributions.
To do a “dry run” of the purge command to see what files would be deleted, use the “–test” flag:
<tmpwatch|tmpreaper> --test --mtime 7d /tmp
Set the temp path explicitly, especially on HPC systems where scratch space may be under system-specific paths.
Measuring the peak RAM usage of a process and all its children can be done using various tools and techniques.
OS-dependent tools may be the most accurate, but they can be complex to use.
A simpler approach is to periodically sample the RAM usage of the process and its children, like this scripts for Linux and macOS using
ps.
It is also possible though less accurate on macOS or Linux to use
/usr/bin/time,
but this only measures the peak RAM usage of the largest child process, not the total of all children, so this is unsuitable for multiprocess applications like “mpiexec”.
For Linux, a more accurate method is the Cgroup v2, such as implemented by
cgmemtime.
For macOS, the Instruments tool can be used to measure the RAM usage of a process and its children, but it requires a ‘codesign’d application and is more complex to set up.
xcrun xctrace record --template "Game Memory" --launch -- /path/to/application --output bench_game.trace --time-limit 30s
open bench_game.trace
This can be used to create compact commands for frequently used Git operations.
These aliases reduce typing (and typos) for frequent operations.
It can also be used in some cases for older versions of Git to use newer-style syntax (at least for the compatible parts of the command).