14bcd95a3SBarry Smith(style)= 24bcd95a3SBarry Smith 34bcd95a3SBarry Smith# PETSc Style and Usage Guide 44bcd95a3SBarry Smith 54bcd95a3SBarry SmithThe PETSc team uses certain conventions to make the source code 64bcd95a3SBarry Smithconsistent and easier to maintain. We will interchangeably use the 74bcd95a3SBarry Smithterminology *subclass*, *implementation*, or *type* [^footnote-1] to refer to a 84bcd95a3SBarry Smithconcrete realization of an abstract base class. For example, 94bcd95a3SBarry Smith`KSPGMRES` is a type for the base class `KSP`. 104bcd95a3SBarry Smith 114bcd95a3SBarry Smith## Names 124bcd95a3SBarry Smith 134bcd95a3SBarry SmithConsistency of names for variables, functions, and so on is extremely 144bcd95a3SBarry Smithimportant. We use several conventions 154bcd95a3SBarry Smith 164bcd95a3SBarry Smith01. All function names and enum types consist of acronyms or words, each 174bcd95a3SBarry Smith of which is capitalized, for example, `KSPSolve()` and 184bcd95a3SBarry Smith `MatGetOrdering()`. 194bcd95a3SBarry Smith 204bcd95a3SBarry Smith02. All enum elements and macro variables are named with all capital 214bcd95a3SBarry Smith letters. When they consist of several complete words, there is an 224bcd95a3SBarry Smith underscore between each word. For example, `MAT_FINAL_ASSEMBLY`. 234bcd95a3SBarry Smith 244bcd95a3SBarry Smith03. Functions that are private to PETSc (not callable by the application 254bcd95a3SBarry Smith code) either 264bcd95a3SBarry Smith 274bcd95a3SBarry Smith - have an appended `_Private` (for example, `StashValues_Private`) 284bcd95a3SBarry Smith or 294bcd95a3SBarry Smith - have an appended `_Subtype` (for example, `MatMultSeq_AIJ`). 304bcd95a3SBarry Smith 314bcd95a3SBarry Smith In addition, functions that are not intended for use outside of a 324bcd95a3SBarry Smith particular file are declared `static`. Also, see the item 334bcd95a3SBarry Smith on symbol visibility in {ref}`usage_of_petsc_functions_and_macros`. 344bcd95a3SBarry Smith 354bcd95a3SBarry Smith04. Function names in structures (for example, `_matops`) are the same 364bcd95a3SBarry Smith as the base application function name without the object prefix and 374bcd95a3SBarry Smith in lowercase. For example, `MatMultTranspose()` has a 384bcd95a3SBarry Smith structure name of `multtranspose`. 394bcd95a3SBarry Smith 404bcd95a3SBarry Smith05. Names of implementations of class functions should begin with the 414bcd95a3SBarry Smith function name, an underscore, and the name of the implementation, for 424bcd95a3SBarry Smith example, `KSPSolve_GMRES()`. 434bcd95a3SBarry Smith 444bcd95a3SBarry Smith06. Each application-usable function begins with the name of the class 454bcd95a3SBarry Smith object, followed by any subclass name, for example, 464bcd95a3SBarry Smith `ISInvertPermutation()`, `MatMult()`, or 474bcd95a3SBarry Smith `KSPGMRESSetRestart()`. 484bcd95a3SBarry Smith 494bcd95a3SBarry Smith07. Functions that PETSc provides as defaults for user-providable 504bcd95a3SBarry Smith functions end with `Default` (for example, `PetscSignalHandlerDefault()`). 514bcd95a3SBarry Smith 524bcd95a3SBarry Smith08. Options database keys are lower case, have an underscore between 534bcd95a3SBarry Smith words, and match the function name associated with the option without 544bcd95a3SBarry Smith the word “set” or “get”, for example, `-ksp_gmres_restart`. 554bcd95a3SBarry Smith 564bcd95a3SBarry Smith09. Specific `XXXType` values (for example, `MATSEQAIJ`) do not have 574bcd95a3SBarry Smith an underscore in them unless they refer to another package that uses 584bcd95a3SBarry Smith an underscore, for example, `MATSOLVERSUPERLU_DIST`. 594bcd95a3SBarry Smith 604bcd95a3SBarry Smith10. Typedefs for functions should end in `Fn` as in, for example, `SNESFunctionFn`. 614bcd95a3SBarry Smith 624bcd95a3SBarry Smith(stylepetsccount)= 634bcd95a3SBarry Smith 644bcd95a3SBarry Smith## PETSc and standard datatypes 654bcd95a3SBarry Smith 664bcd95a3SBarry Smith1. `PetscInt` is generally used for array indices, and array lengths. It 674bcd95a3SBarry Smith is a signed 32-bit or 64-bit `int` depending on the `./configure` option 684bcd95a3SBarry Smith `--with-64-bit-indices`. There is the possibility of integer overflow with the 694bcd95a3SBarry Smith 32-bit version. 704bcd95a3SBarry Smith 714bcd95a3SBarry Smith2. `PetscCount` is `ptrdiff_t`, (on 64-bit systems it is 64-bits) and should be used for array sizes (number of entries) 724bcd95a3SBarry Smith and indices that may become large. `PetscIntCast()` should always be used when converting 734bcd95a3SBarry Smith to `PetscInt` from `PetscCount`. Since, in most configurations an array of `PetscCount` requires twice the memory 744bcd95a3SBarry Smith of an array of `PetscInt` most index arrays (such as `ISGetIndices()` use `PetscInt`, 754bcd95a3SBarry Smith when these arrays get too large then `--with-64-bit-indices` must be used to 764bcd95a3SBarry Smith `./configure` PETSc. In most cases it is appropriate to use `PetscCount` in lieu of `PetscInt64`. 774bcd95a3SBarry Smith 784bcd95a3SBarry Smith3. `size_t` is used for variables that contain the amount of memory, generally in bytes. 794bcd95a3SBarry Smith It should **not** be used for the number of 804bcd95a3SBarry Smith entries in an array, or to index into an array, that should be `PetscCount`, or `PetscInt`. 814bcd95a3SBarry Smith Though `size_t` is unsigned and hence can have values larger then those that can be stored 824bcd95a3SBarry Smith in a `PetscCount` those sizes will never be reached in practice so it is ok to cast with `(PetscCount)` 834bcd95a3SBarry Smith from a `size_t` variable to a `PetscCount` variable, but **not** a `PetscInt`. 844bcd95a3SBarry Smith One should not blindly cast from a `PetscCount` or a `PetscInt` 854bcd95a3SBarry Smith to `size_t` since, when the value is negative, it will produce garbage. 864bcd95a3SBarry Smith 874bcd95a3SBarry Smith4. **Never** blindly put in a cast from a potentially longer (in number of bits) to a shorter integer such as 884bcd95a3SBarry Smith 894bcd95a3SBarry Smith ``` 904bcd95a3SBarry Smith PetscInt64 a 914bcd95a3SBarry Smith PetscInt b 924bcd95a3SBarry Smith b = (PetscInt)a 934bcd95a3SBarry Smith ``` 944bcd95a3SBarry Smith 954bcd95a3SBarry Smith simply to prevent a compiler warning. Use the appropriate PETSc cast function unless you 964bcd95a3SBarry Smith absolutely know the value will fit in the lesser number of bits. 974bcd95a3SBarry Smith 984bcd95a3SBarry Smith5. MPI 4.0 supports the use of `MPI_Count` (large count) for many MPI functions that previously used `int` in a new API where the MPI function 994bcd95a3SBarry Smith names end in `_c`. Since not all installed MPI implementations have such support, use `MPIU_XXX()` routines 1004bcd95a3SBarry Smith that use `PetscCount` for count arguments and use the large count MPI versions when possible. 1014bcd95a3SBarry Smith When not possible they first check the size of the input count arguments and error if they 1024bcd95a3SBarry Smith will not fit in the MPI required `int`, if they fit then the standard MPI functions are automatically called. 1034bcd95a3SBarry Smith 1044bcd95a3SBarry Smith ``` 1054bcd95a3SBarry Smith sizeof(MPI_Count) >= sizeof(PetscCount) >= sizeof(PetscInt) 1064bcd95a3SBarry Smith sizeof(PetscInt64) >= sizeof(PetscCount) >= sizeof(PetscInt) 1074bcd95a3SBarry Smith sizeof(MPI_Count) may be strictly greater than sizeof(PetscInt64) 1084bcd95a3SBarry Smith ``` 1094bcd95a3SBarry Smith 1104bcd95a3SBarry Smith## Coding Conventions and Style 1114bcd95a3SBarry Smith 1124bcd95a3SBarry SmithWithin the PETSc source code, we adhere to the following guidelines so 1134bcd95a3SBarry Smiththat the code is uniform and easily maintained. 1144bcd95a3SBarry Smith 1154bcd95a3SBarry Smith### C Formatting 1164bcd95a3SBarry Smith 1174bcd95a3SBarry SmithThe `.clang-format` file in the PETSc root directory controls the white space and basic layout. You can run the formatter in the entire repository with `make clangformat`. All merge requests must be properly formatted; this is automatically checked for merge requests with `make checkclangformat`. 1184bcd95a3SBarry Smith 1194bcd95a3SBarry SmithEven with the use of `clang-format` there are still many decisions about code formatting that must be constantly made. A subset of these is automatically checked for merge requests with `make checkbadSource`. 1204bcd95a3SBarry Smith 1214bcd95a3SBarry Smith01. The prototypes for functions should not include the names of the 1224bcd95a3SBarry Smith variables 1234bcd95a3SBarry Smith 1244bcd95a3SBarry Smith ``` 1254bcd95a3SBarry Smith PETSC_EXTERN PetscErrorCode MyFunction(PetscInt); // Correct 1264bcd95a3SBarry Smith PETSC_EXTERN PetscErrorCode MyFunction(PetscInt myvalue); // Incorrect 1274bcd95a3SBarry Smith ``` 1284bcd95a3SBarry Smith 1294bcd95a3SBarry Smith02. All local variables of a particular type (for example, `PetscInt`) should be listed 1304bcd95a3SBarry Smith on the same line if possible; otherwise, they should be listed on adjacent lines. Note 1314bcd95a3SBarry Smith that pointers of different arity (levels of indirection) are considered to be different types. `clang-format` automatically 1324bcd95a3SBarry Smith handles the indenting shown below. 1334bcd95a3SBarry Smith 1344bcd95a3SBarry Smith ``` 1354bcd95a3SBarry Smith // Correct 1364bcd95a3SBarry Smith PetscInt a, b, c; 1374bcd95a3SBarry Smith PetscInt *d, *e; 1384bcd95a3SBarry Smith PetscInt **f; 1394bcd95a3SBarry Smith 1404bcd95a3SBarry Smith // Incorrect 1414bcd95a3SBarry Smith PetscInt a, b, c, *d, *e, **f; 1424bcd95a3SBarry Smith ``` 1434bcd95a3SBarry Smith 1444bcd95a3SBarry Smith03. Local variables should be initialized in their declaration when possible 1454bcd95a3SBarry Smith 1464bcd95a3SBarry Smith ``` 1474bcd95a3SBarry Smith // Correct 1484bcd95a3SBarry Smith PetscInt a = 11; 1494bcd95a3SBarry Smith 1504bcd95a3SBarry Smith PetscFunctionBegin; 1514bcd95a3SBarry Smith // use a 1524bcd95a3SBarry Smith 1534bcd95a3SBarry Smith // Incorrect 1544bcd95a3SBarry Smith PetscInt a; 1554bcd95a3SBarry Smith 1564bcd95a3SBarry Smith PetscFunctionBegin; 1574bcd95a3SBarry Smith a = 11; 1584bcd95a3SBarry Smith // use a 1594bcd95a3SBarry Smith ``` 1604bcd95a3SBarry Smith 1614bcd95a3SBarry Smith04. All PETSc subroutine code blocks *must* start with a single blank line between the local variable 1624bcd95a3SBarry Smith declarations followed by `PetscFunctionBegin`. 1634bcd95a3SBarry Smith 1644bcd95a3SBarry Smith ``` 1654bcd95a3SBarry Smith // Correct 1664bcd95a3SBarry Smith PetscInt x; 1674bcd95a3SBarry Smith 1684bcd95a3SBarry Smith PetscFunctionBegin; 1694bcd95a3SBarry Smith 1704bcd95a3SBarry Smith // Incorrect 1714bcd95a3SBarry Smith PetscInt x; 1724bcd95a3SBarry Smith PetscFunctionBegin; 1734bcd95a3SBarry Smith 1744bcd95a3SBarry Smith // Incorrect 1754bcd95a3SBarry Smith PetscInt x; 1764bcd95a3SBarry Smith y = 11; 1774bcd95a3SBarry Smith ``` 1784bcd95a3SBarry Smith 1794bcd95a3SBarry Smith05. Functions in PETSc examples, including `main()` should have `PetscFunctionBeginUser` as the first line after the local variable declarations. 1804bcd95a3SBarry Smith 1814bcd95a3SBarry Smith06. PETSc functions that begin `PetscFunctionBegin` must always return via `PetscFunctionReturn()`, or `PetscFunctionReturnVoid()`, not `return`. If the function returns a `PetscErrorCode`, then it must always return with `PetscFunctionReturn(PETSC_SUCCESS)`. 1824bcd95a3SBarry Smith 1834bcd95a3SBarry Smith07. Functions that do use return should use `return xx;` rather than `return(xx);` 1844bcd95a3SBarry Smith 1854bcd95a3SBarry Smith08. All PETSc function calls must have their return value checked for errors using the 1864bcd95a3SBarry Smith `PetscCall()` macro. This should be wrapped around the function in question. 1874bcd95a3SBarry Smith 1884bcd95a3SBarry Smith ``` 1894bcd95a3SBarry Smith PetscCall(MyFunction(...)); // Correct 1904bcd95a3SBarry Smith PetscErrorCode ierr = MyFunction(...);PetscCall(ierr); // Incorrect 1914bcd95a3SBarry Smith ``` 1924bcd95a3SBarry Smith 1934bcd95a3SBarry Smith The only exceptions to this rule are begin-end style macros which embed local variables 1944bcd95a3SBarry Smith or loops as part of their expansion 1954bcd95a3SBarry Smith (e.g. `PetscOptionsBegin()`/`PetscOptionsEnd()`). These handle errors internally 1964bcd95a3SBarry Smith and do not need error checking. 1974bcd95a3SBarry Smith 1984bcd95a3SBarry Smith ``` 1994bcd95a3SBarry Smith // Correct 2004bcd95a3SBarry Smith PetscOptionsBegin(...); 2014bcd95a3SBarry Smith PetscOptionsEnd(); 2024bcd95a3SBarry Smith ``` 2034bcd95a3SBarry Smith 2044bcd95a3SBarry Smith As a rule, always try to wrap the function first; if this fails to compile, you do 2054bcd95a3SBarry Smith not need to add the error checking. 2064bcd95a3SBarry Smith 2074bcd95a3SBarry Smith Calls to external package functions are generally made with `PetscCallExternal()` or its variants that are specialized for particular packages, for example `PetscCallBLAS()` 2084bcd95a3SBarry Smith 2094bcd95a3SBarry Smith09. Single operation `if` and `else` commands should not be wrapped in braces. They should be done as follows, 2104bcd95a3SBarry Smith 2114bcd95a3SBarry Smith ``` 2124bcd95a3SBarry Smith if ( ) XXXX; 2134bcd95a3SBarry Smith else YYY; 2144bcd95a3SBarry Smith ``` 2154bcd95a3SBarry Smith 2164bcd95a3SBarry Smith not 2174bcd95a3SBarry Smith 2184bcd95a3SBarry Smith ``` 2194bcd95a3SBarry Smith if ( ) {XXXX;} 2204bcd95a3SBarry Smith else {YYY;} 2214bcd95a3SBarry Smith ``` 2224bcd95a3SBarry Smith 2234bcd95a3SBarry Smith10. Do not leave sections of commented-out code or dead source code protected with `ifdef foo` in the source files. 2244bcd95a3SBarry Smith 2254bcd95a3SBarry Smith11. Use classic block comments (`/* There must be a space before the first word in the comment and a space at the end */`, 2264bcd95a3SBarry Smith (`/*Do not do this*/`) for multi-line comments, and `// Comment` for single-line comments in source files. 2274bcd95a3SBarry Smith 2284bcd95a3SBarry Smith12. Do not put a `*` at the beginning or end of each line of a multi-line comment. 2294bcd95a3SBarry Smith 2304bcd95a3SBarry Smith13. Do not use `/* ---- ... ----- */` or similar constructs to separate parts of source code files. 2314bcd95a3SBarry Smith 2324bcd95a3SBarry Smith14. Use appropriate grammar and spelling in the comments. 2334bcd95a3SBarry Smith 2344bcd95a3SBarry Smith15. All variables must be declared at the beginning of the code block (C89 2354bcd95a3SBarry Smith style), never mixed in with code. However, when variables are only used in a limited 2364bcd95a3SBarry Smith scope, it is encouraged to declare them in that scope. For example: 2374bcd95a3SBarry Smith 2384bcd95a3SBarry Smith ``` 2394bcd95a3SBarry Smith if (cond) { 2404bcd95a3SBarry Smith PetscScalar *tmp; 2414bcd95a3SBarry Smith 2424bcd95a3SBarry Smith PetscCall(PetscMalloc1(10, &tmp)); 2434bcd95a3SBarry Smith // use tmp 2444bcd95a3SBarry Smith PetscCall(PetscFree(tmp)); 2454bcd95a3SBarry Smith } 2464bcd95a3SBarry Smith ``` 2474bcd95a3SBarry Smith 2484bcd95a3SBarry Smith The only exception to this is variables used exclusively within a `for` loop, which must 2494bcd95a3SBarry Smith be declared inside the loop initializer: 2504bcd95a3SBarry Smith 2514bcd95a3SBarry Smith ``` 2524bcd95a3SBarry Smith // Correct 2534bcd95a3SBarry Smith for (PetscInt i = 0; i < n; ++i) { 2544bcd95a3SBarry Smith // loop body 2554bcd95a3SBarry Smith } 2564bcd95a3SBarry Smith ``` 2574bcd95a3SBarry Smith 2584bcd95a3SBarry Smith ``` 2594bcd95a3SBarry Smith // Correct, variable used outside of loop 2604bcd95a3SBarry Smith PetscInt i; 2614bcd95a3SBarry Smith ``` 2624bcd95a3SBarry Smith 2634bcd95a3SBarry Smith ``` 2644bcd95a3SBarry Smith for (i = 0; i < n; ++i) { 2654bcd95a3SBarry Smith // loop body 2664bcd95a3SBarry Smith } 2674bcd95a3SBarry Smith j = i; 2684bcd95a3SBarry Smith ``` 2694bcd95a3SBarry Smith 2704bcd95a3SBarry Smith ``` 2714bcd95a3SBarry Smith // Incorrect 2724bcd95a3SBarry Smith PetscInt i; 2734bcd95a3SBarry Smith ... 2744bcd95a3SBarry Smith for (i = 0; i < n; ++i) { 2754bcd95a3SBarry Smith // loop body 2764bcd95a3SBarry Smith } 2774bcd95a3SBarry Smith ``` 2784bcd95a3SBarry Smith 2794bcd95a3SBarry Smith16. Developers can use // to split very long lines when it improves code readability. For example 2804bcd95a3SBarry Smith 2814bcd95a3SBarry Smith ``` 2824bcd95a3SBarry Smith f[j][i].omega = xdot[j][i].omega + uxx + uyy // 2834bcd95a3SBarry Smith + (vxp * (u - x[j][i - 1].omega) + vxm * (x[j][i + 1].omega - u)) * hy // 2844bcd95a3SBarry Smith + (vyp * (u - x[j - 1][i].omega) + vym * (x[j + 1][i].omega - u)) * hx // 2854bcd95a3SBarry Smith - .5 * grashof * (x[j][i + 1].temp - x[j][i - 1].temp) * hy; 2864bcd95a3SBarry Smith ``` 2874bcd95a3SBarry Smith 2884bcd95a3SBarry Smith17. The use of `// clang-format off` is allowed in the source code but should only be used when necessary. It should not 2894bcd95a3SBarry Smith be used when trailing // to split lines works. 2904bcd95a3SBarry Smith 2914bcd95a3SBarry Smith ``` 2924bcd95a3SBarry Smith // clang-format off 2934bcd95a3SBarry Smith f ... 2944bcd95a3SBarry Smith // clang-format on 2954bcd95a3SBarry Smith ``` 2964bcd95a3SBarry Smith 2974bcd95a3SBarry Smith18. `size` and `rank` should be used exclusively for the results of `MPI_Comm_size()` and `MPI_Comm_rank()` and other variable names for these values should be avoided unless necessary. 2984bcd95a3SBarry Smith 2994bcd95a3SBarry Smith### C Usage 3004bcd95a3SBarry Smith 3014bcd95a3SBarry Smith01. Do not use language features that are not in the intersection of C99, C++11, and MSVC 3024bcd95a3SBarry Smith v1900+ (Visual Studio 2015). Examples of such banned features include variable-length arrays. 3034bcd95a3SBarry Smith Note that variable-length arrays (including VLA-pointers) are not supported in C++ and 3044bcd95a3SBarry Smith were made optional in C11. You may use designated initializers via the 3054bcd95a3SBarry Smith `PetscDesignatedInitializer()` macro. 3064bcd95a3SBarry Smith 3074bcd95a3SBarry Smith02. Array and pointer arguments where the array values are not changed 3084bcd95a3SBarry Smith should be labeled as `const` arguments. 3094bcd95a3SBarry Smith 3104bcd95a3SBarry Smith03. Scalar values passed to functions should *never* be labeled as 3114bcd95a3SBarry Smith `const`. 3124bcd95a3SBarry Smith 3134bcd95a3SBarry Smith04. Subroutines that would normally have a `void **` argument to return 3144bcd95a3SBarry Smith a pointer to some data should be prototyped as `void *`. 3154bcd95a3SBarry Smith This prevents the caller from having to put a `(void **)` cast in 3164bcd95a3SBarry Smith each function call. See, for example, `DMDAVecGetArray()`. 3174bcd95a3SBarry Smith 3184bcd95a3SBarry Smith05. Do not use the `register` directive. 3194bcd95a3SBarry Smith 3204bcd95a3SBarry Smith06. Use `if (v == NULL)` or `if (flg == PETSC_TRUE)`, instead of using `if (!v)` or `if (flg)` or `if (!flg)`. 3214bcd95a3SBarry Smith 3224bcd95a3SBarry Smith07. Avoid `#ifdef` or `#ifndef` when possible. Rather, use `#if defined` or `#if 3234bcd95a3SBarry Smith !defined`. Better, use `PetscDefined()` (see below). The only exception to this 3244bcd95a3SBarry Smith rule is for header guards, where the `#ifndef` form is preferred (see below). 3254bcd95a3SBarry Smith 3264bcd95a3SBarry Smith08. Header guard macros should be done using `#pragma once`. This must be the very first 3274bcd95a3SBarry Smith non-comment line of the file. There must be no leading or trailing empty (non-comment) 3284bcd95a3SBarry Smith lines in the header. For example, do 3294bcd95a3SBarry Smith 3304bcd95a3SBarry Smith ``` 3314bcd95a3SBarry Smith /* 3324bcd95a3SBarry Smith It's OK to have 3334bcd95a3SBarry Smith 3344bcd95a3SBarry Smith comments 3354bcd95a3SBarry Smith */ 3364bcd95a3SBarry Smith // before the guard 3374bcd95a3SBarry Smith #pragma once 3384bcd95a3SBarry Smith 3394bcd95a3SBarry Smith // OK, other headers included after the guard 3404bcd95a3SBarry Smith #include <petscdm.h> 3414bcd95a3SBarry Smith #include <petscdevice.h> 3424bcd95a3SBarry Smith 3434bcd95a3SBarry Smith // OK, other preprocessor symbols defined after the guard 3444bcd95a3SBarry Smith #define FOO_BAR_BAZ 3454bcd95a3SBarry Smith 3464bcd95a3SBarry Smith // OK, regular symbols defined after the guard 3474bcd95a3SBarry Smith typedef struct _p_PetscFoo *PetscFoo; 3484bcd95a3SBarry Smith ... 3494bcd95a3SBarry Smith ``` 3504bcd95a3SBarry Smith 3514bcd95a3SBarry Smith Do not do 3524bcd95a3SBarry Smith 3534bcd95a3SBarry Smith ``` 3544bcd95a3SBarry Smith // ERROR, empty lines at the beginning of the header 3554bcd95a3SBarry Smith 3564bcd95a3SBarry Smith 3574bcd95a3SBarry Smith 3584bcd95a3SBarry Smith // ERROR, included other headers before the guard 3594bcd95a3SBarry Smith #include <petscdm.h> 3604bcd95a3SBarry Smith #include <petscdevice.h> 3614bcd95a3SBarry Smith 3624bcd95a3SBarry Smith // ERROR, defined other preprocessor symbols before the guard 3634bcd95a3SBarry Smith #define FOO_BAR_BAZ 3644bcd95a3SBarry Smith 3654bcd95a3SBarry Smith // ERROR, defined regular symbols before the guard 3664bcd95a3SBarry Smith typedef struct _p_PetscFoo *PetscFoo; 3674bcd95a3SBarry Smith 3684bcd95a3SBarry Smith #pragma once 3694bcd95a3SBarry Smith ``` 3704bcd95a3SBarry Smith 3714bcd95a3SBarry Smith09. Never use system random number generators such as `rand()` in PETSc 3724bcd95a3SBarry Smith code or examples because these can produce different results on 3734bcd95a3SBarry Smith different systems, thus making portability testing difficult. Instead, 3744bcd95a3SBarry Smith use `PetscRandom` which produces the same results regardless 3754bcd95a3SBarry Smith of the system used. 3764bcd95a3SBarry Smith 3774bcd95a3SBarry Smith10. Variadic macros may be used in PETSc, but must work with MSVC v1900+ (Visual Studio 3784bcd95a3SBarry Smith 2015). Most compilers have conforming implementations of the C99/C++11 rules for 3794bcd95a3SBarry Smith `__VA_ARGS__`, but MSVC's implementation is not conforming and may need workarounds. 3804bcd95a3SBarry Smith See `PetscDefined()` for an example of how to work around MSVC's limitations to write 3814bcd95a3SBarry Smith a macro that is usable in both. 3824bcd95a3SBarry Smith 3834bcd95a3SBarry Smith(usage_of_petsc_functions_and_macros)= 3844bcd95a3SBarry Smith 3854bcd95a3SBarry Smith### Usage of PETSc Functions and Macros 3864bcd95a3SBarry Smith 3874bcd95a3SBarry Smith01. Lengthy conditional preprocessor blocks should mark any `#else` or `#endif` 3884bcd95a3SBarry Smith directives with a comment containing (or explaining) either the boolean condition or 3894bcd95a3SBarry Smith the macro's name if the first directive tests whether one is defined. One 3904bcd95a3SBarry Smith should be able to read any part of the macroblock and find or deduce the 3914bcd95a3SBarry Smith initial `#if`. That is: 3924bcd95a3SBarry Smith 3934bcd95a3SBarry Smith ``` 3944bcd95a3SBarry Smith #if defined(MY_MACRO) 3954bcd95a3SBarry Smith // many lines of code 3964bcd95a3SBarry Smith #else // MY_MACRO (use name of macro) 3974bcd95a3SBarry Smith // many more lines of code 3984bcd95a3SBarry Smith #endif // MY_MACRO 3994bcd95a3SBarry Smith 4004bcd95a3SBarry Smith #if MY_MACRO > 10 4014bcd95a3SBarry Smith // code 4024bcd95a3SBarry Smith #else // MY_MACRO < 10 4034bcd95a3SBarry Smith // more code 4044bcd95a3SBarry Smith #endif // MY_MACRO > 10 4054bcd95a3SBarry Smith ``` 4064bcd95a3SBarry Smith 4074bcd95a3SBarry Smith02. Public PETSc include files, `petsc*.h`, should not reference 4084bcd95a3SBarry Smith private PETSc `petsc/private/*impl.h` include files. 4094bcd95a3SBarry Smith 4104bcd95a3SBarry Smith03. Public and private PETSc include files cannot reference include files 4114bcd95a3SBarry Smith located in the PETSc source tree. 4124bcd95a3SBarry Smith 4134bcd95a3SBarry Smith04. All public functions must sanity-check their arguments using the appropriate 4144bcd95a3SBarry Smith `PetscValidXXX()` macros. These must appear between `PetscFunctionBegin` and 4154bcd95a3SBarry Smith `PetscFunctionReturn()` For example 4164bcd95a3SBarry Smith 4174bcd95a3SBarry Smith ``` 4184bcd95a3SBarry Smith PetscErrorCode PetscPublicFunction(Vec v, PetscScalar *array, PetscInt collectiveInt) 4194bcd95a3SBarry Smith { 4204bcd95a3SBarry Smith PetscFunctionBegin; 4214bcd95a3SBarry Smith PetscValidHeaderSpecific(v, VEC_CLASSID, 1); 4224bcd95a3SBarry Smith PetscAssertPointer(array, 2); 4234bcd95a3SBarry Smith PetscValidLogicalCollectiveInt(v, collectiveInt, 3); 4244bcd95a3SBarry Smith ... 4254bcd95a3SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 4264bcd95a3SBarry Smith } 4274bcd95a3SBarry Smith ``` 4284bcd95a3SBarry Smith 4294bcd95a3SBarry Smith See `include/petsc/private/petscimpl.h` and search for "PetscValid" to see all 4304bcd95a3SBarry Smith available checker macros. 4314bcd95a3SBarry Smith 4324bcd95a3SBarry Smith05. When possible, use `PetscDefined()` instead of preprocessor conditionals. 4334bcd95a3SBarry Smith For example, use: 4344bcd95a3SBarry Smith 4354bcd95a3SBarry Smith ``` 4364bcd95a3SBarry Smith if (PetscDefined(USE_DEBUG)) { ... } 4374bcd95a3SBarry Smith ``` 4384bcd95a3SBarry Smith 4394bcd95a3SBarry Smith instead of: 4404bcd95a3SBarry Smith 4414bcd95a3SBarry Smith ``` 4424bcd95a3SBarry Smith #if defined(PETSC_USE_DEBUG) 4434bcd95a3SBarry Smith ... 4444bcd95a3SBarry Smith #endif 4454bcd95a3SBarry Smith ``` 4464bcd95a3SBarry Smith 4474bcd95a3SBarry Smith The former usage allows syntax and type-checking in all configurations of 4484bcd95a3SBarry Smith PETSc, whereas the latter needs to be compiled with and without debugging 4494bcd95a3SBarry Smith to confirm that it compiles. 4504bcd95a3SBarry Smith 4514bcd95a3SBarry Smith06. *Never* put a function call in a `return` statement; do not write 4524bcd95a3SBarry Smith 4534bcd95a3SBarry Smith ``` 4544bcd95a3SBarry Smith PetscFunctionReturn( somefunction(...) ); /* Incorrect */ 4554bcd95a3SBarry Smith ``` 4564bcd95a3SBarry Smith 4574bcd95a3SBarry Smith07. Do *not* put a blank line immediately after `PetscFunctionBegin;` 4584bcd95a3SBarry Smith or a blank line immediately before `PetscFunctionReturn(PETSC_SUCCESS);`. 4594bcd95a3SBarry Smith 4604bcd95a3SBarry Smith08. Do not include `assert.h` in PETSc source code. Do not use 4614bcd95a3SBarry Smith `assert()`, it doesn’t play well in the parallel MPI world. 4624bcd95a3SBarry Smith You may use `PetscAssert()` where appropriate. See `PetscCall()` documentation 4634bcd95a3SBarry Smith for guidance of when to use `PetscCheck()` vs. `PetscAssert()`. 4644bcd95a3SBarry Smith 4654bcd95a3SBarry Smith09. Make error messages short but informative. The user should be able to reasonably 4664bcd95a3SBarry Smith diagnose the greater problem from your error message. 4674bcd95a3SBarry Smith 4684bcd95a3SBarry Smith10. Except in code that may be called before PETSc is fully initialized, 4694bcd95a3SBarry Smith always use `PetscMallocN()` (for example, `PetscMalloc1()`), 4704bcd95a3SBarry Smith `PetscCallocN()`, `PetscNew()`, and `PetscFree()`, not 4714bcd95a3SBarry Smith `malloc()` and `free()`. 4724bcd95a3SBarry Smith 4734bcd95a3SBarry Smith11. MPI routines and macros that are not part of the 2.1 standard 4744bcd95a3SBarry Smith should not be used in PETSc without appropriate `configure` 4754bcd95a3SBarry Smith checks and `#if PetscDefined()` checks. Code should also be provided 4764bcd95a3SBarry Smith that works if the MPI feature is not available; for example, 4774bcd95a3SBarry Smith 4784bcd95a3SBarry Smith ``` 4794bcd95a3SBarry Smith #if PetscDefined(HAVE_MPI_REDUCE_LOCAL) 4804bcd95a3SBarry Smith PetscCallMPI(MPI_Reduce_local(inbuf, inoutbuf, count, MPIU_INT, MPI_SUM)); 4814bcd95a3SBarry Smith #else 4824bcd95a3SBarry Smith PetscCallMPI(MPI_Reduce(inbuf, inoutbuf, count, MPIU_INT, MPI_SUM, 0, PETSC_COMM_SELF); 4834bcd95a3SBarry Smith #endif 4844bcd95a3SBarry Smith ``` 4854bcd95a3SBarry Smith 4864bcd95a3SBarry Smith12. Do not introduce PETSc routines that provide essentially the same 4874bcd95a3SBarry Smith functionality as an available MPI routine. For example, do not write 4884bcd95a3SBarry Smith a routine `PetscGlobalSum()` that takes a scalar value and performs 4894bcd95a3SBarry Smith an `MPI_Allreduce()` on it. Instead, use the MPI routine 4904bcd95a3SBarry Smith `MPI_Allreduce()` directly in the code. 4914bcd95a3SBarry Smith 4924bcd95a3SBarry Smith13. Never use a local variable counter such as `PetscInt flops = 0;` to 4934bcd95a3SBarry Smith accumulate flops and then call `PetscLogFlops();` *always* just 4944bcd95a3SBarry Smith call `PetscLogFlops()` directly when needed. 4954bcd95a3SBarry Smith 4964bcd95a3SBarry Smith14. Library symbols meant to be directly usable by the user should be declared 4974bcd95a3SBarry Smith `PETSC_EXTERN` in their respective public header file. Symbols intended for internal use should instead be declared `PETSC_INTERN`. Note that doing so is 4984bcd95a3SBarry Smith unnecessary in the case of symbols local to a single translation unit; these should 4994bcd95a3SBarry Smith be declared `static`. PETSc can be configured to build a separate shared 5004bcd95a3SBarry Smith library for each top-level class (`Mat`, `Vec`, `KSP`, and so on), and that plugin 5014bcd95a3SBarry Smith implementations of these classes can be included as separate shared libraries; thus, 5024bcd95a3SBarry Smith otherwise private symbols may need to be marked `PETSC_SINGLE_LIBRARY_INTERN`. For 5034bcd95a3SBarry Smith example 5044bcd95a3SBarry Smith 5054bcd95a3SBarry Smith - `MatStashCreate_Private()` is marked `PETSC_INTERN` as it is used 5064bcd95a3SBarry Smith across compilation units, but only within the `Mat` package; 5074bcd95a3SBarry Smith - all functions, such as `KSPCreate()`, included in the public 5084bcd95a3SBarry Smith headers (`include/petsc*.h`) should be marked `PETSC_EXTERN`; 5094bcd95a3SBarry Smith - `VecLoad_Default()` is marked 5104bcd95a3SBarry Smith `PETSC_SINGLE_LIBRARY_INTERN` as it may be used across library boundaries, but is 5114bcd95a3SBarry Smith not intended to be visible to users; 5124bcd95a3SBarry Smith 5134bcd95a3SBarry Smith15. Before removing or renaming an API function, type, or enumerator, 5144bcd95a3SBarry Smith `PETSC_DEPRECATED_XXX()` should be used in the relevant header file 5154bcd95a3SBarry Smith to indicate the new usage and the PETSc version number where the 5164bcd95a3SBarry Smith deprecation will first appear. The old function or type, with the 5174bcd95a3SBarry Smith deprecation warning, should remain for at least one major release. We do not remove support for the 5184bcd95a3SBarry Smith deprecated functionality unless there is a specific reason to remove it; it is not removed simply because 5194bcd95a3SBarry Smith it has been deprecated for "a long time." 5204bcd95a3SBarry Smith 5214bcd95a3SBarry Smith The function or type’s manual page should be updated (see {ref}`manual_page_format`). 5224bcd95a3SBarry Smith For example, 5234bcd95a3SBarry Smith 5244bcd95a3SBarry Smith ``` 5254bcd95a3SBarry Smith typedef NewType OldType PETSC_DEPRECATED_TYPEDEF("Use NewType (since version 3.9)"); 5264bcd95a3SBarry Smith 5274bcd95a3SBarry Smith PETSC_DEPRECATED_FUNCTION("Use NewFunction() (since version 3.9)") PetscErrorCode OldFunction(); 5284bcd95a3SBarry Smith 5294bcd95a3SBarry Smith #define OLD_ENUMERATOR_DEPRECATED OLD_ENUMERATOR PETSC_DEPRECATED_ENUM("Use NEW_ENUMERATOR (since version 3.9)") 5304bcd95a3SBarry Smith typedef enum { 5314bcd95a3SBarry Smith OLD_ENUMERATOR_DEPRECATED = 3, 5324bcd95a3SBarry Smith NEW_ENUMERATOR = 3 5334bcd95a3SBarry Smith } MyEnum; 5344bcd95a3SBarry Smith ``` 5354bcd95a3SBarry Smith 5364bcd95a3SBarry Smith Note that after compiler preprocessing, the enum above would be transformed into something like 5374bcd95a3SBarry Smith 5384bcd95a3SBarry Smith ``` 5394bcd95a3SBarry Smith typedef enum { 5404bcd95a3SBarry Smith OLD_ENUMERATOR __attribute__((deprecated)) = 3, 5414bcd95a3SBarry Smith NEW_ENUMERATOR = 3 5424bcd95a3SBarry Smith } MyEnum; 5434bcd95a3SBarry Smith ``` 5444bcd95a3SBarry Smith 5454bcd95a3SBarry Smith16. Before removing or renaming an options database key, 5464bcd95a3SBarry Smith `PetscOptionsDeprecated()` should be used for at least one major 5474bcd95a3SBarry Smith release. We do not remove support for the 5484bcd95a3SBarry Smith deprecated functionality unless there is a specific reason to remove it; it is not removed simply because 5494bcd95a3SBarry Smith it has been deprecated for "a long time." 5504bcd95a3SBarry Smith 5514bcd95a3SBarry Smith17. The format strings in PETSc ASCII output routines, such as 5524bcd95a3SBarry Smith `PetscPrintf()`, take a `%" PetscInt_FMT "` for all PETSc variables of type `PetscInt`, 5534bcd95a3SBarry Smith not a `%d`. 5544bcd95a3SBarry Smith 5554bcd95a3SBarry Smith18. All arguments of type `PetscReal` to PETSc ASCII output routines, 5564bcd95a3SBarry Smith such as `PetscPrintf`, must be cast to `double`, for example, 5574bcd95a3SBarry Smith 5584bcd95a3SBarry Smith ``` 5594bcd95a3SBarry Smith PetscPrintf(PETSC_COMM_WORLD, "Norm %g\n", (double)norm); 5604bcd95a3SBarry Smith ``` 5614bcd95a3SBarry Smith 5624bcd95a3SBarry Smith## Formatted Comments 5634bcd95a3SBarry Smith 5644bcd95a3SBarry SmithPETSc uses formatted comments and the Sowing packages {cite}`gropp1993sowing` {cite}`gropp1993sowing2` 5654bcd95a3SBarry Smithto generate documentation (manual pages) and the Fortran interfaces. Documentation 5664bcd95a3SBarry Smithfor Sowing and the formatting may be found at 5674bcd95a3SBarry Smith<http://wgropp.cs.illinois.edu/projects/software/sowing/>; in particular, 5684bcd95a3SBarry Smithsee the documentation for `doctext`. Currently, doctext produces Markdown files ending in `.md`, which 5694bcd95a3SBarry SmithSphinx later processes. 5704bcd95a3SBarry Smith 5714bcd95a3SBarry Smith- `/*@` 5724bcd95a3SBarry Smith a formatted comment of a function that will be used for documentation and a Fortran interface. 5734bcd95a3SBarry Smith- `/*@C` 5744bcd95a3SBarry Smith a formatted comment of a function that will be used only for documentation, not to generate a Fortran interface. Certain constructs and usages do not yet support automatically generating a Fortran interface. In general, such labeled C functions should have a custom Fortran interface provided. 5754bcd95a3SBarry Smith- `/*E` 576*fa084801SBarry Smith a formatted comment of an enum used for documentation only. 5774bcd95a3SBarry Smith . 5784bcd95a3SBarry Smith- `/*S` 5794bcd95a3SBarry Smith a formatted comment for a data type such as 5804bcd95a3SBarry Smith `KSP` 5814bcd95a3SBarry Smith . 5824bcd95a3SBarry Smith- `/*J` 5834bcd95a3SBarry Smith a formatted comment for a string type such as 5844bcd95a3SBarry Smith `KSPType` 5854bcd95a3SBarry Smith . 5864bcd95a3SBarry Smith- `/*MC` 5874bcd95a3SBarry Smith a formatted comment of a CPP macro or enum value for documentation. 5884bcd95a3SBarry Smith 5894bcd95a3SBarry SmithThe Fortran interface files supplied manually by the developer go into the two 5904bcd95a3SBarry Smithdirectories `ftn-custom` and `f90-custom`, while those generated by 5914bcd95a3SBarry SmithSowing go into `ftn-auto` directories in the \$PETSC_ARCH/src\`\` directory tree. 5924bcd95a3SBarry Smith 5934bcd95a3SBarry SmithEach include file that contains formatted comments needs to have a line of the form 5944bcd95a3SBarry Smith 5954bcd95a3SBarry Smith> ``` 5964bcd95a3SBarry Smith> /* SUBMANSEC = submansec (for example Sys) */ 5974bcd95a3SBarry Smith> ``` 5984bcd95a3SBarry Smith 5994bcd95a3SBarry Smithpreceded by and followed by a blank line. For source code, this information is found in the makefile in that source code's directory in the format 6004bcd95a3SBarry Smith 6014bcd95a3SBarry Smith> ``` 6024bcd95a3SBarry Smith> MANSEC = DM 6034bcd95a3SBarry Smith> SUBMANSEC= DMPlex 6044bcd95a3SBarry Smith> ``` 6054bcd95a3SBarry Smith 6064bcd95a3SBarry Smith(manual_page_format)= 6074bcd95a3SBarry Smith 6084bcd95a3SBarry Smith### Manual Page Format 6094bcd95a3SBarry Smith 6104bcd95a3SBarry SmithEach function, typedef, class, macro, enum, and so on in the public API 6114bcd95a3SBarry Smithshould include the following data, correctly formatted (see codes 6124bcd95a3SBarry Smithsection) to generate complete manual pages and (possibly) Fortran interfaces with 6134bcd95a3SBarry SmithSowing. All entries below should be separated by blank lines. Except 6144bcd95a3SBarry Smithwhere noted, add a newline after the section headings. 6154bcd95a3SBarry Smith 6164bcd95a3SBarry Smith01. The item’s name, followed by a dash and brief (one-sentence) 6174bcd95a3SBarry Smith description. 6184bcd95a3SBarry Smith 6194bcd95a3SBarry Smith02. If documenting a function implemented with a preprocessor macro 6204bcd95a3SBarry Smith (e.g., `PetscOptionsBegin()`), an explicit `Synopsis:` section 6214bcd95a3SBarry Smith noting the required header and the function signature. 6224bcd95a3SBarry Smith 6234bcd95a3SBarry Smith03. If documenting a function, a description of the function’s 6244bcd95a3SBarry Smith “collectivity”. 6254bcd95a3SBarry Smith 6264bcd95a3SBarry Smith - `Not Collective` if the function need not be called on multiple (or possibly all) MPI 6274bcd95a3SBarry Smith processes 6284bcd95a3SBarry Smith - `Collective` if the function is a collective operation. 6294bcd95a3SBarry Smith - `Logically Collective; yyy must contain common value]` 6304bcd95a3SBarry Smith if the function is collective but does not require any actual 6314bcd95a3SBarry Smith synchronization (e.g., setting class parameters uniformly). Any 6324bcd95a3SBarry Smith argument yyy, which must have the same value on all ranks of the 6334bcd95a3SBarry Smith MPI communicator should be noted here. 6344bcd95a3SBarry Smith 6354bcd95a3SBarry Smith04. If the function is not supported in Fortran, then after the collective information, on the same line, 6364bcd95a3SBarry Smith one should provide `; No Fortran support`. 6374bcd95a3SBarry Smith 6384bcd95a3SBarry Smith05. If documenting a function with input parameters, a list of input 6394bcd95a3SBarry Smith parameter descriptions in an `Input Parameter(s):` section. 6404bcd95a3SBarry Smith 6414bcd95a3SBarry Smith06. If documenting a function with output parameters, a list of output 6424bcd95a3SBarry Smith parameter descriptions in an `Output Parameter(s):` section. 6434bcd95a3SBarry Smith 6444bcd95a3SBarry Smith07. If any input or output parameters are function pointers, they should be documented in the style 6454bcd95a3SBarry Smith 6464bcd95a3SBarry Smith ```console 6474bcd95a3SBarry Smith Calling sequence of `func()`: 6484bcd95a3SBarry Smith . arg - the integer argument description 6494bcd95a3SBarry Smith ``` 6504bcd95a3SBarry Smith 6514bcd95a3SBarry Smith08. If documenting a function that interacts with the options database, a 6524bcd95a3SBarry Smith list of options database keys in an `Options Database Key(s):` 6534bcd95a3SBarry Smith section. 6544bcd95a3SBarry Smith 6554bcd95a3SBarry Smith09. `Level:` (no newline) followed by `beginner`, 6564bcd95a3SBarry Smith `intermediate`, `advanced`, `developer`, or `deprecated`. This 6574bcd95a3SBarry Smith should be listed before the various `Note(s):` sections. 6584bcd95a3SBarry Smith 6594bcd95a3SBarry Smith10. (Optional) a `Note(s):` section containing in-depth discussion, 6604bcd95a3SBarry Smith technical caveats, special cases, and so on. If it is ambiguous 6614bcd95a3SBarry Smith whether returned pointers/objects need to be freed/destroyed by the 6624bcd95a3SBarry Smith user or not, this information should be mentioned here. 6634bcd95a3SBarry Smith 6644bcd95a3SBarry Smith11. (If applicable) a `Fortran Note(s):` section detailing any relevant 6654bcd95a3SBarry Smith differences in calling or using the item from Fortran. 6664bcd95a3SBarry Smith 6674bcd95a3SBarry Smith12. (If applicable) a `Developer Note(s):` section detailing any relevant 6684bcd95a3SBarry Smith information about the code for developers, for example, why a 6694bcd95a3SBarry Smith particular algorithm was implemented. 6704bcd95a3SBarry Smith 6714bcd95a3SBarry Smith13. (If applicable) references should be indicated inline with \{cite}\`Bibtex-key\` where 6724bcd95a3SBarry Smith Bibtex-key is in the file `doc/petsc.bib`, as in the manual page for `PCFIELDSPLIT`. 6734bcd95a3SBarry Smith 6744bcd95a3SBarry Smith14. `.seealso:` (no newline, no spaces to the left of this text), followed by a list of related manual 6754bcd95a3SBarry Smith pages. These manual pages should usually also point back to this 676f8d70eaaSPierre Jolivet manual page in their `.seealso:` sections. This is the final entry in the 6774bcd95a3SBarry Smith comment. There should be no blank line after the `.seealso:` items. 6784bcd95a3SBarry Smith 6794bcd95a3SBarry Smith15. All PETSc functions that appear in a manual page (except the one in the header at the top) should end with a `()` and be enclosed 6804bcd95a3SBarry Smith in single back tick marks. All PETSc enum types and macros etc, should also be enclosed in single back tick marks. 6814bcd95a3SBarry Smith This includes each item listed in the `.seealso:` lines. 6824bcd95a3SBarry Smith 6834bcd95a3SBarry Smith[^footnote-1]: Type also refers to the string name of the subclass. 6844bcd95a3SBarry Smith 6854bcd95a3SBarry Smith### Spelling and Capitalization 6864bcd95a3SBarry Smith 6874bcd95a3SBarry Smith1. Proper nouns, including Unix, Linux, X Windows, and Microsoft Windows, should be fully written and capitalized. This includes all operating systems. 6884bcd95a3SBarry Smith The Apple computer operating system is written as macOS. 6894bcd95a3SBarry Smith2. Company names and product names should be capitalized. 6904bcd95a3SBarry Smith3. Company names and terms that are traditionally all capitalized, for example, MATLAB, NVIDIA, and CUDA, should be all capitalized. 6914bcd95a3SBarry Smith4. ARM is a family of processor designs, while Arm is the company that licenses them. 6924bcd95a3SBarry Smith5. Unix should not be all capitalized. 6934bcd95a3SBarry Smith6. Microsoft Windows should always be written out with two words. That is, it should not be shortened to Windows or MS Win etc. 6944bcd95a3SBarry Smith7. CMake should be capitalized as shown. 6954bcd95a3SBarry Smith8. BLAS and LAPACK are written in full capitalization. 6964bcd95a3SBarry Smith9. Open MPI is written as two words. 6974bcd95a3SBarry Smith 6984bcd95a3SBarry Smith## References 6994bcd95a3SBarry Smith 7004bcd95a3SBarry Smith```{bibliography} /petsc.bib 7014bcd95a3SBarry Smith:filter: docname in docnames 7024bcd95a3SBarry Smith``` 703