xref: /petsc/src/sys/objects/package.c (revision 60fbe2bef0f9fc09fadbc0cc33f5102638a6e853)
1*60fbe2beSVaclav Hapla 
2*60fbe2beSVaclav Hapla #include <petsc/private/petscimpl.h>        /*I    "petscsys.h"   I*/
3*60fbe2beSVaclav Hapla 
4*60fbe2beSVaclav Hapla /*@C
5*60fbe2beSVaclav Hapla    PetscHasExternalPackage - Determine whether PETSc has been configured with the given package
6*60fbe2beSVaclav Hapla 
7*60fbe2beSVaclav Hapla    Not Collective
8*60fbe2beSVaclav Hapla 
9*60fbe2beSVaclav Hapla    Input Parameters:
10*60fbe2beSVaclav Hapla .  pkg - external package name
11*60fbe2beSVaclav Hapla 
12*60fbe2beSVaclav Hapla    Output Parameters:
13*60fbe2beSVaclav Hapla .  has - PETSC_TRUE if PETSc is configured with the given package, else PETSC_FALSE.
14*60fbe2beSVaclav Hapla 
15*60fbe2beSVaclav Hapla    Level: intermediate
16*60fbe2beSVaclav Hapla 
17*60fbe2beSVaclav Hapla    Notes:
18*60fbe2beSVaclav Hapla    This is basically an alternative for PETSC_HAVE_XXX whenever a preprocessor macro is not available/desirable, e.g. in Python.
19*60fbe2beSVaclav Hapla 
20*60fbe2beSVaclav Hapla    The external package name pkg is e.g. "hdf5", "yaml", "parmetis".
21*60fbe2beSVaclav Hapla    It should correspond to the name listed in  ./configure --help  or e.g. in PetscViewerType, MatPartitioningType, MatSolverType.
22*60fbe2beSVaclav Hapla 
23*60fbe2beSVaclav Hapla    The lookup is case insensitive, i.e. looking for "HDF5" or "hdf5" is the same.
24*60fbe2beSVaclav Hapla 
25*60fbe2beSVaclav Hapla .seealso: PetscViewerType, MatPartitioningType, MatSolverType
26*60fbe2beSVaclav Hapla @*/
27*60fbe2beSVaclav Hapla PetscErrorCode  PetscHasExternalPackage(const char pkg[], PetscBool *has)
28*60fbe2beSVaclav Hapla {
29*60fbe2beSVaclav Hapla   char                  pkgstr[128], *loc;
30*60fbe2beSVaclav Hapla   size_t                cnt;
31*60fbe2beSVaclav Hapla   PetscErrorCode        ierr;
32*60fbe2beSVaclav Hapla 
33*60fbe2beSVaclav Hapla   PetscFunctionBegin;
34*60fbe2beSVaclav Hapla   ierr = PetscSNPrintfCount(pkgstr,sizeof(pkgstr),":%s:",&cnt,pkg);CHKERRQ(ierr);
35*60fbe2beSVaclav Hapla   if (cnt >= sizeof(pkgstr)) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_SUP, "Package name is too long: \"%s\"", pkg);
36*60fbe2beSVaclav Hapla   ierr = PetscStrtolower(pkgstr);CHKERRQ(ierr);
37*60fbe2beSVaclav Hapla #if defined(PETSC_HAVE_PACKAGES)
38*60fbe2beSVaclav Hapla   ierr = PetscStrstr(PETSC_HAVE_PACKAGES, pkgstr, &loc);CHKERRQ(ierr);
39*60fbe2beSVaclav Hapla #else
40*60fbe2beSVaclav Hapla #error "PETSC_HAVE_PACKAGES macro undefined. Please reconfigure"
41*60fbe2beSVaclav Hapla #endif
42*60fbe2beSVaclav Hapla   *has = loc ? PETSC_TRUE : PETSC_FALSE;
43*60fbe2beSVaclav Hapla   PetscFunctionReturn(0);
44*60fbe2beSVaclav Hapla }
45