##################
Coding Conventions
##################
A code is generally written once but read many times. Consistent style
improves readability and makes collaboration easier. This page describes the
conventions to follow for Python and Fortran code in SPECTRE.
.. contents:: On this page
:local:
:depth: 1
Python
======
Style
-----
Python code in SPECTRE follows `PEP 8 `_.
The specific settings are configured in ``pyproject.toml``:
- Line length: **100 characters**
- Indentation: **4 spaces**
- String quotes: **double quotes**
Linting and formatting with Ruff
---------------------------------
`Ruff `_ is used for both linting and
formatting. Install the development dependencies to get it:
.. code-block:: bash
pip install -e ".[dev]"
Run the formatter to auto-fix style issues:
.. code-block:: bash
ruff format .
Run the linter to check for code quality issues:
.. code-block:: bash
ruff check .
Both checks are enforced by the CI pipeline on every merge request. Make sure
your code passes both before pushing.
Docstrings
----------
Docstrings follow the `Google style
`_
convention, as enforced by Ruff's ``pydocstyle`` plugin. Every public
function, method, and class should have a docstring. A minimal example:
.. code-block:: python
def compute_flux(field: np.ndarray, area: float) -> np.ndarray:
"""Compute the flux of a field through a surface.
Args:
field: Array of field values at each point on the surface.
area: Total surface area.
Returns:
Array of flux values, one per field component.
Raises:
ValueError: If ``field`` is empty.
"""
...
Use the ``Args``, ``Returns``, ``Raises``, and ``Note`` sections as needed.
Omit sections that do not apply.
Fortran
=======
Files and general rules
------------------------
- All Fortran files use the ``.F90`` (capital F) extension.
- The file name must match the program unit it contains. For example, module
``my_mod`` must be in file ``my_mod.F90``.
- Only one module per file.
- Every function or subroutine must be contained in a module.
- Line length is limited to **132 characters**.
- Use lowercase Fortran intrinsics.
- Indentation uses **2 spaces**. Never use the tab character.
- Do not put commented blank lines; use an empty line instead.
- Avoid trailing whitespace.
Module structure
----------------
All modules should follow this structure:
.. code-block:: fortran
module my_mod
! First the Fortran intrinsic modules (in alphabetical order)
use intrinsic_mod_a
use intrinsic_mod_b
! Then third-party and local modules (in alphabetical order)
use mod_a
use mod_b
! Always use a single implicit none at the beginning
implicit none (type, external)
! Everything should be private by default
private
public :: ! Add your list of public functions/subroutines
contains
end module my_mod
Style rules
-----------
- Do not use semicolons (``;``) for multiple statements per line.
- Always use the double colon after a type declaration:
.. code-block:: fortran
integer :: a
real(dp) :: x, y
- Use modern comparison operators: ``==``, ``/=``, ``>``, ``<``, ``<=``,
``>=`` instead of ``.eq.``, ``.neq.``, ``.gt.``, ``.lt.``, ``.leq.``,
``.geq.``.
- Use spaced ``end`` keywords: ``end if``, ``end do``, ``end subroutine``,
not ``endif``, ``enddo``, *etc*.
- Avoid non-standard Fortran extensions.
- Do not use Fortran keywords (*e.g.* ``data``) as variable names.
- Put a space before and after operators (``=``, ``.and.``, ``<=``, *etc*.)
and punctuation (``.``, ``,``).
- Add spaces between mathematical operators to improve readability. Grouping
related terms is allowed:
.. code-block:: fortran
a = 2*b + c ! Acceptable — multiplication groups b and 2
a = 2 * b + c ! Also acceptable
Comments
--------
Use ``!`` for inline and block comments. Prefer comments that explain *why*
the code does something rather than restating *what* it does. Place block
comments on a separate line directly above the code they describe:
.. code-block:: fortran
! Normalize the vector before computing the dot product to avoid
! floating-point overflow for large field values.
norm = sqrt(sum(v**2))
v = v / norm
Note that many editors can automate the enforcement of these conventions (*e.g.*
automatic trailing whitespace removal, indentation guides).