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 revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
dev:codingconventions [2016/12/07 14:29] – Add a coding convention. agloessdev:codingconventions [2018/12/21 08:41] – [Use existing infrastructure] tmueller
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
-  * 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 38: 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, ,,,)''.
dev/codingconventions.txt · Last modified: 2020/08/21 10:15 by 127.0.0.1