1046ed546SBarry Smith #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/
2046ed546SBarry Smith
327710113SBarry Smith /*@C
427710113SBarry Smith PetscGetVersion - Gets the PETSc version information in a string.
527710113SBarry Smith
6cf53795eSBarry Smith Not Collective; No Fortran Support
7cf53795eSBarry Smith
827710113SBarry Smith Input Parameter:
927710113SBarry Smith . len - length of the string
1027710113SBarry Smith
1127710113SBarry Smith Output Parameter:
1227710113SBarry Smith . version - version string
1327710113SBarry Smith
1427710113SBarry Smith Level: developer
1527710113SBarry Smith
16811af0c4SBarry Smith Note:
17811af0c4SBarry Smith For doing runtime checking of supported versions we recommend using `PetscGetVersionNumber()` instead of this routine.
18811af0c4SBarry Smith
19db781477SPatrick Sanan .seealso: `PetscGetProgramName()`, `PetscGetVersionNumber()`
2027710113SBarry Smith @*/
PetscGetVersion(char version[],size_t len)21d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetVersion(char version[], size_t len)
22d71ae5a4SJacob Faibussowitsch {
238cf9f3d7SBarry Smith PetscFunctionBegin;
2427710113SBarry Smith #if (PETSC_VERSION_RELEASE == 1)
25*7766ff4bSPierre Jolivet PetscCall(PetscSNPrintf(version, len, "PETSc Release Version %d.%d.%d, %s", PETSC_VERSION_MAJOR, PETSC_VERSION_MINOR, PETSC_VERSION_SUBMINOR, PETSC_VERSION_DATE));
2627710113SBarry Smith #else
27*7766ff4bSPierre Jolivet PetscCall(PetscSNPrintf(version, len, "PETSc Development Git Revision: %s Git Date: %s", PETSC_VERSION_GIT, PETSC_VERSION_DATE_GIT));
2827710113SBarry Smith #endif
293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3027710113SBarry Smith }
3127710113SBarry Smith
32cc4c1da9SBarry Smith /*@
335f309d01SBarry Smith PetscGetVersionNumber - Gets the PETSc version information from the library
345f309d01SBarry Smith
3520f4b53cSBarry Smith Not Collective
365f309d01SBarry Smith
37d8d19677SJose E. Roman Output Parameters:
3820f4b53cSBarry Smith + major - the major version (optional, pass `NULL` if not requested)
3920f4b53cSBarry Smith . minor - the minor version (optional, pass `NULL` if not requested)
4020f4b53cSBarry Smith . subminor - the subminor version (patch number) (optional, pass `NULL` if not requested)
4120f4b53cSBarry Smith - release - indicates the library is from a release, not random git repository (optional, pass `NULL` if not requested)
425f309d01SBarry Smith
435f309d01SBarry Smith Level: developer
445f309d01SBarry Smith
4595452b02SPatrick Sanan Notes:
46811af0c4SBarry Smith The C macros `PETSC_VERSION_MAJOR`, `PETSC_VERSION_MINOR`, `PETSC_VERSION_SUBMINOR`, `PETSC_VERSION_RELEASE` provide the information at
475f309d01SBarry Smith compile time. This can be used to confirm that the shared library being loaded at runtime has the appropriate version updates.
485f309d01SBarry Smith
49811af0c4SBarry Smith This function can be called before `PetscInitialize()`
508cf9f3d7SBarry Smith
51db781477SPatrick Sanan .seealso: `PetscGetProgramName()`, `PetscGetVersion()`, `PetscInitialize()`
525f309d01SBarry Smith @*/
PetscGetVersionNumber(PetscInt * major,PetscInt * minor,PetscInt * subminor,PetscInt * release)53d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetVersionNumber(PetscInt *major, PetscInt *minor, PetscInt *subminor, PetscInt *release)
54d71ae5a4SJacob Faibussowitsch {
555f309d01SBarry Smith if (major) *major = PETSC_VERSION_MAJOR;
565f309d01SBarry Smith if (minor) *minor = PETSC_VERSION_MINOR;
575f309d01SBarry Smith if (subminor) *subminor = PETSC_VERSION_SUBMINOR;
585f309d01SBarry Smith if (release) *release = PETSC_VERSION_RELEASE;
593ba16761SJacob Faibussowitsch return PETSC_SUCCESS;
605f309d01SBarry Smith }
6167833fbbSSebastian Grimberg #if defined(PETSC_HAVE_BLI_THREAD_SET_NUM_THREADS)
6267833fbbSSebastian Grimberg EXTERN_C_BEGIN
6367833fbbSSebastian Grimberg void bli_thread_set_num_threads(int);
6467833fbbSSebastian Grimberg EXTERN_C_END
6567833fbbSSebastian Grimberg #elif defined(PETSC_HAVE_MKL_SET_NUM_THREADS)
66046ed546SBarry Smith #include <mkl.h>
67046ed546SBarry Smith #elif defined(PETSC_HAVE_OPENBLAS_SET_NUM_THREADS)
68046ed546SBarry Smith EXTERN_C_BEGIN
69046ed546SBarry Smith void openblas_set_num_threads(int);
70046ed546SBarry Smith EXTERN_C_END
71046ed546SBarry Smith #endif
72046ed546SBarry Smith PetscInt PetscNumBLASThreads = 1;
73046ed546SBarry Smith
74046ed546SBarry Smith /*@
75046ed546SBarry Smith PetscBLASSetNumThreads - set the number of threads for calls to BLAS to use
76046ed546SBarry Smith
77046ed546SBarry Smith Input Parameter:
78046ed546SBarry Smith . nt - the number of threads
79046ed546SBarry Smith
80046ed546SBarry Smith Options Database Key:
81046ed546SBarry Smith . -blas_num_threads <nt> - set the number of threads when PETSc is initialized
82046ed546SBarry Smith
83046ed546SBarry Smith Level: intermediate
84046ed546SBarry Smith
85046ed546SBarry Smith Notes:
86046ed546SBarry Smith The environmental variables `BLIS_NUM_THREADS`, `MKL_NUM_THREADS`, or `OPENBLAS_NUM_THREADS`, `OMP_NUM_THREADS`
87046ed546SBarry Smith may also affect the number of threads used depending on the BLAS libraries being used. A call to this function
88046ed546SBarry Smith overwrites those values.
89046ed546SBarry Smith
90046ed546SBarry Smith With the BLIS BLAS implementation one can use `BLIS_THREAD_IMPL=pthread` or `BLIS_THREAD_IMPL=openmp` to determine how
91046ed546SBarry Smith BLIS implements the parallelism.
92046ed546SBarry Smith
93046ed546SBarry Smith .seealso: `PetscInitialize()`, `PetscBLASGetNumThreads()`
94046ed546SBarry Smith @*/
PetscBLASSetNumThreads(PetscInt nt)95046ed546SBarry Smith PetscErrorCode PetscBLASSetNumThreads(PetscInt nt)
96046ed546SBarry Smith {
97046ed546SBarry Smith PetscFunctionBegin;
98046ed546SBarry Smith PetscNumBLASThreads = nt;
99046ed546SBarry Smith #if defined(PETSC_HAVE_BLI_THREAD_SET_NUM_THREADS)
100046ed546SBarry Smith bli_thread_set_num_threads(nt);
101f1e39ca5SPierre Jolivet PetscCall(PetscInfo(NULL, "Setting number of threads used for BLIS provided BLAS %" PetscInt_FMT "\n", PetscNumBLASThreads));
102046ed546SBarry Smith #elif defined(PETSC_HAVE_MKL_SET_NUM_THREADS)
103046ed546SBarry Smith mkl_set_num_threads((int)nt);
104f1e39ca5SPierre Jolivet PetscCall(PetscInfo(NULL, "Setting number of threads used for MKL provided BLAS %" PetscInt_FMT "\n", PetscNumBLASThreads));
105046ed546SBarry Smith #elif defined(PETSC_HAVE_OPENBLAS_SET_NUM_THREADS)
106046ed546SBarry Smith openblas_set_num_threads((int)nt);
107f1e39ca5SPierre Jolivet PetscCall(PetscInfo(NULL, "Setting number of threads used for OpenBLAS provided BLAS %" PetscInt_FMT "\n", PetscNumBLASThreads));
108046ed546SBarry Smith #else
109f1e39ca5SPierre Jolivet PetscCall(PetscInfo(NULL, "Cannot set number of threads used for BLAS %" PetscInt_FMT ", will be ignored\n", PetscNumBLASThreads));
110046ed546SBarry Smith #endif
111046ed546SBarry Smith PetscFunctionReturn(PETSC_SUCCESS);
112046ed546SBarry Smith }
113046ed546SBarry Smith
114046ed546SBarry Smith /*@
115046ed546SBarry Smith PetscBLASGetNumThreads - get the number of threads for calls to BLAS to use
116046ed546SBarry Smith
117046ed546SBarry Smith Output Parameter:
118046ed546SBarry Smith . nt - the number of threads
119046ed546SBarry Smith
120046ed546SBarry Smith Level: intermediate
121046ed546SBarry Smith
122046ed546SBarry Smith .seealso: `PetscInitialize()`, `PetscBLASSetNumThreads()`
123046ed546SBarry Smith @*/
PetscBLASGetNumThreads(PetscInt * nt)124046ed546SBarry Smith PetscErrorCode PetscBLASGetNumThreads(PetscInt *nt)
125046ed546SBarry Smith {
126046ed546SBarry Smith PetscFunctionBegin;
127046ed546SBarry Smith PetscAssertPointer(nt, 1);
128046ed546SBarry Smith *nt = PetscNumBLASThreads;
129046ed546SBarry Smith PetscFunctionReturn(PETSC_SUCCESS);
130046ed546SBarry Smith }
131