User Tools

Site Tools


dev:codingconventions

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
dev:codingconventions [2015/11/09 10:34]
oschuett
dev:codingconventions [2020/05/05 07:51]
oschuett
Line 1: Line 1:
 ====== Coding Conventions ====== ====== Coding Conventions ======
 +
 ===== Stick to the standard ===== ===== 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. +  * Code enabled by default should be standard Fortran 2008 [-std=f2008] and C99 [-std=c99
-  * OpenMP code should follow the version 3.X of the standard +  * OpenMP code should follow version 3.X of the standard 
-  * MPI should should follow the version 2.X of the standard +  * MPI should should follow version of the standard 
-  * Extended functionality should match [[wp>POSIX]] [[wp>Linux_Standard_Base|LSB]].+  * Extended functionality should match [[wp>POSIX]] and [[wp>Linux_Standard_Base|LSB]].
  
 ===== Write explicit code ===== ===== Write explicit code =====
Line 15: Line 16:
     * INTEGER i=4.9999, i.e. i=INT(4.9999) implies i==4. Use NINT(4.9999) as appropriate.     * 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.     * natom*natom, nrow_global*ncol_global overflows INT(KIND=4) for large simulations.
 +    * always use REAL() with KIND parameter, i.e. r = REAL(i, KIND=dp).
 +    * avoid FLOAT() in favour of REAL(, KIND=dp).
     * the global number of grid points (pw_grid_type%ngpts,ngpts_cut) 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 ===== ===== Don't use poorly designed language features =====
   * Do not use the ''GOTO''-statement. See also [[http://xkcd.com/292/]] and [[doi>10.1145/362929.362947]]   * Do not use the ''GOTO''-statement. See also [[http://xkcd.com/292/]] and [[doi>10.1145/362929.362947]]
-  * Do not use left-hand-side (lhs) reallocations of allocatables [-Wrealloc-lhs-all]. [[http://www.tddft.org/pipermail/octopus-devel/2012-February/005510.html | Why? ]] +  * Do not use left-hand-side (lhs) reallocations of allocatables [-Wrealloc-lhs]. [[https://github.com/cp2k/cp2k/issues/726 | Why? ]] 
   * Do not use ''FORALL'' constructs. [[https://gcc.gnu.org/ml/fortran/2012-04/msg00025.html | Why? ]]   * Do not use ''FORALL'' constructs. [[https://gcc.gnu.org/ml/fortran/2012-04/msg00025.html | Why? ]]
   * Do not use ''OMP THREADPRIVATE'' variables.   * Do not use ''OMP THREADPRIVATE'' variables.
Line 36: Line 39:
  
 ===== Use existing infrastructure ===== ===== Use existing infrastructure =====
-For many common operation there exist wrappers in CP2K to prevent usage errors and to allow for central redirections.+ 
 +Always prefer [[https://gcc.gnu.org/onlinedocs/gcc-8.2.0/gfortran/Intrinsic-Procedures.html|built-in (intrinsic) functions]] instead of hand-coded routines since they usually include extra numerical checks to avoid intermediate under- or overflow while still performing optimally. Examples: 
 + 
 +  * ''NORM2(x)'' instead of ''%%SQRT(x(1)**2 + x(2)**2 + x(3)**2)%%'' 
 +  * ''DOT_PRODUCT(x, x)'' instead of ''%%x(1)**2 + x(2)**2 + x(3)**2%%'' 
 +  * ''DOT_PRODUCT(x, y)'' instead of ''%%x(1)*y(1) + x(2)*y(2) + x(3)*y(3)%%'' 
 + 
 + 
 +For many common operations there exist wrappers in CP2K to prevent usage errors and to allow for central redirections, i.e. avoid to use direct calls to external libraries in CP2K 
   * Use the routines from ''cp_files.F'' instead of calling ''OPEN'' and ''CLOSE'' directly.   * Use the routines from ''cp_files.F'' instead of calling ''OPEN'' and ''CLOSE'' directly.
   * Use the routines from the full-matrix ''fm''-package instead of calling BLAS or Scalapack 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 ''message_passing.F'' instead of calling MPI directly.
 +  * Use the routines from ''fft_lib.F'' instead of calling FFT (any library) directly.
   * Use the routines from ''machine.F'' to access architecture depended things like e.g. the working directory.   * Use the routines from ''machine.F'' to access architecture depended things like e.g. the working directory.
   * Don't use ''UNIT=*'' in ''WRITE'' or ''PRINT'' statements. Instead request a unit from the logger: ''iw=cp_logger_get_default_unit_nr()'' and write only if you actually received a unit: ''IF(iw>0) WRITE (UNIT=iw, ,,,)''.   * Don't use ''UNIT=*'' in ''WRITE'' or ''PRINT'' statements. Instead request a unit from the logger: ''iw=cp_logger_get_default_unit_nr()'' and write only if you actually received a unit: ''IF(iw>0) WRITE (UNIT=iw, ,,,)''.
Line 53: Line 66:
   * Each module and routine should be annotated with [[dev:codingconventions#Doxygen| Doxygen documentation]].   * Each module and routine should be annotated with [[dev:codingconventions#Doxygen| 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).   * 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''. +  * The code should be formatted with the [[dev:formattingconventions| prettify tool]] by running ''make -j pretty''.
 ===== Write tests ===== ===== Write tests =====
   * Every feature should be tested, with the goal of complete [[ http://www.cp2k.org/static/coverage/ | code coverage by regtesting ]].   * Every feature should be tested, with the goal of complete [[ http://www.cp2k.org/static/coverage/ | code coverage by regtesting ]].
dev/codingconventions.txt · Last modified: 2020/08/21 10:15 (external edit)