From a3f8a89d41eb5610b082531c4de06fa61dbbe7b2 Mon Sep 17 00:00:00 2001 From: Lauren Chilutti Date: Thu, 3 Jun 2021 09:28:48 -0400 Subject: [PATCH] Adding Code Style guide to the repository. --- CODE_STYLE.md | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 CODE_STYLE.md diff --git a/CODE_STYLE.md b/CODE_STYLE.md new file mode 100644 index 000000000..733885f36 --- /dev/null +++ b/CODE_STYLE.md @@ -0,0 +1,127 @@ +# Coding Style + +## General + +* Trim all trailing whitespace from every line (some editors can do this + automatically). +* No tab characters. +* A copy of the FV3 Gnu Lesser General Public License Header + must be included at the top of each file. +* Supply an author block for each file with a description of the file and the author(s) + name or GitHub ID. +* Documentation may be written so that it can be parsed by [Doxygen](http://www.doxygen.nl/). +* All variables should be defined, and include units. Unit-less variables should be marked `unitless` +* Provide detailed descriptions of modules, interfaces, functions, and subroutines +* Define all function/subroutine arguments, and function results (see below) +* Follow coding style of the current file, as much as possible. + +## Fortran + +### General + +* Use Fortran 95 standard or newer +* Two space indentation +* Never use implicit variables (i.e., always specify `IMPLICIT NONE`) +* Lines must be <= 120 characters long (including comments) +* logical, compound logical, and relational if statements may be one line, + using “&” for line continuation if necessary: + ```Fortran + if(file_exists(fileName)) call open_file(fileObj,fileName, is_restart=.false) + ``` +* Avoid the use of `GOTO` statements +* Avoid the use of Fortran reserved words as variables (e.g. `DATA`, `NAME`) +* `COMMON` blocks should never be used + +### Derived types + +* Type names must be in CapitalWord format. +* Description on the line before the type definition. +* Inline doxygen descriptions for all member variables. + +## Functions +* Functions should include a result variable on its own line, that does not have + a specific intent. +* Inline descriptions for all arguments, except the result variable. +* Description on the line(s) before the function definition. Specify what the function is returning (with the `@return` doxygen keyword if using doxygen). + +## Blocks +* terminate `do` loops with `enddo` +* terminate block `if`, `then` statements with `endif` + +## OpenMP + +* All openMP directives should specify default(none), and then explicitly list + all shared and private variables. +* All critical sections must have a unique name. + +## Fortran Example + +```Fortran + +!*********************************************************************** +!* GNU Lesser General Public License +!* +!* This file is part of the FV3 dynamical core. +!* +!* The FV3 dynamical core is free software: you can redistribute it +!* and/or modify it under the terms of the +!* GNU Lesser General Public License as published by the +!* Free Software Foundation, either version 3 of the License, or +!* (at your option) any later version. +!* +!* The FV3 dynamical core is distributed in the hope that it will be +!* useful, but WITHOUT ANYWARRANTY; without even the implied warranty +!* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +!* See the GNU General Public License for more details. +!* +!* You should have received a copy of the GNU Lesser General Public +!* License along with the FV3 dynamical core. +!* If not, see . + +!*********************************************************************** + +!> @file +!! @brief Example code +!! @author +!! @email + +module example_mod + use util_mod, only: util_func1 + implicit none + private + + public :: sub1 + public :: func1 + + !> @brief Doxygen description of type. + type,public :: CustomType + integer(kind=) :: a_var !< Inline doxygen description. + real(kind=),dimension(:),allocatable :: b_arr !< long description + !! continued on + !! multiple lines. + endtype CustomType + + contains + + !> @brief Doxygen description. + subroutine sub1(arg1, & + & arg2, & + & arg3) + real(kind=),intent(in) :: arg1 !< Inline doxygen description. + integer(kind=),intent(inout) :: arg2 !< Inline doxygen description. + character(len=*),intent(inout) :: arg3 !< Long inline doxygen + !! description. + end subroutine sub1 + + !> @brief Doxygen description + !! @return Function return value. + function func1(arg1, & + & arg2) & + & result(res) + integer(kind=),intent(in) :: arg1 !< Inline doxygen description + integer(kind=),intent(in) :: arg2 !< Inline doxygen description + integer(kind=) :: res + end function func1 + +end module example_mod +```