dev:codingconventions
This is an old revision of the document!
Table of Contents
Coding Conventions
Stick to the standard
- Code enabled by default should be standard Fortran2003 [-std=f2003]
- Avoid using new OOP aspects, because compilers do not yet support them well enough.
- OpenMP code should follow the version 3.X of the standard
- MPI should should follow the version 2.X of the standard
Write explicit code
- Every
USE
-statement should have anONLY:
-clause, which lists the imported symbols [-Wuse-without-only]. - Every
OMP PARALLEL
-region should declaredefault(none)
. - Every static variable should be marked with the
SAVE
attribute. - Every Fortran module should contain the line
IMPLICIT NONE
[-fimplicit-none]. - Every conversion that might change value should be explicit [-Wconversion]. Rationale:
- INTEGER i=4.9999, i.e. i=INT(4.9999) implies i==4. Use NINT(4.9999) as appropriate.
- natom*natom, nrow_global*ncol_global overflows INT(KIND=4) for large simulations.
- the global number of grid points (pw_grid_type%ngpts,ngpts_cut) overflows INT(KIND=4) for large simulations.
Don't use poorly designed language features
Fight spaghetti code
There are two measure of defense against spaghetti code:
- Decoupling on the module and package level:
- Every module should depend on as few other modules as possible.
- Every package should depend on as few other packages as possible.
- Information hiding, also known as encapsulation.
- External libraries should be wrapped within a single module or package.
- Every module should hide its content by containing the line
PRIVATE
and only few public symbols. - Every package should hide its content by providing only a small public API through a single module.
Use existing infrastructure
For many common operation there exist wrappers in CP2K to prevent usage errors and to allow for central redirections.
- Use the routines from
cp_files.F
instead of callingOPEN
andCLOSE
directly. - Use the routines from the full-matrix
fm
-package instead of calling BLAS or Scalapack directly. - Use the routines from
message_passing.F
instead of calling MPI directly. - Use the routines from
machine.F
to access architecture depended things like e.g. the working directory.
Remove dead code
Every line of code has to be compiled and maintained. Hence, unused variables and code poses an unnecessary burden and should be removed. However, sometimes it is beneficial to keep debugging code around. Such code should be put into a IF(debug_this_module)
-block, with a parameter set to .FALSE.
. This way the code will stay up-to-date and easily callable.
Format and document code
- Each files should start with the official CP2K header.
- Each
.F
file should contain either aPROGRAM
or a singleMODULE
, whose name matches the filename. - Each module and routine should be annotated with Doxygen documentation.
- Each preprocessor flag should start with two underscores and be documented in the
INSTALL
-file and added to the cp2k_flags function (cp2k_info.F). - The code should be formatted with the prettify-tool by running
make -j pretty
.
Write tests
- Every feature should be tested, with the goal of complete code coverage by regtesting .
Doxygen documentation
- Every
FUNCTION
andSUBROUTINE
should be preceded by a valid doxygen block. - The following keywords are required:
\brief
,\param
(for each parameter),\retval
(for functions) - The following keywords are optional:
\note
,\par
,\date
,\author
- Please run
make doxify
to format your doxygen comments, or the generate templates where none exist - See our doxygen pages for the result
dev/codingconventions.1423691942.txt.gz · Last modified: 2020/08/21 10:14 (external edit)