xref: /petsc/src/sys/objects/package.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
160fbe2beSVaclav Hapla 
260fbe2beSVaclav Hapla #include <petsc/private/petscimpl.h>        /*I    "petscsys.h"   I*/
360fbe2beSVaclav Hapla 
460fbe2beSVaclav Hapla /*@C
560fbe2beSVaclav Hapla    PetscHasExternalPackage - Determine whether PETSc has been configured with the given package
660fbe2beSVaclav Hapla 
760fbe2beSVaclav Hapla    Not Collective
860fbe2beSVaclav Hapla 
960fbe2beSVaclav Hapla    Input Parameters:
1060fbe2beSVaclav Hapla .  pkg - external package name
1160fbe2beSVaclav Hapla 
1260fbe2beSVaclav Hapla    Output Parameters:
1360fbe2beSVaclav Hapla .  has - PETSC_TRUE if PETSc is configured with the given package, else PETSC_FALSE.
1460fbe2beSVaclav Hapla 
1560fbe2beSVaclav Hapla    Level: intermediate
1660fbe2beSVaclav Hapla 
1760fbe2beSVaclav Hapla    Notes:
1860fbe2beSVaclav Hapla    This is basically an alternative for PETSC_HAVE_XXX whenever a preprocessor macro is not available/desirable, e.g. in Python.
1960fbe2beSVaclav Hapla 
2060fbe2beSVaclav Hapla    The external package name pkg is e.g. "hdf5", "yaml", "parmetis".
2160fbe2beSVaclav Hapla    It should correspond to the name listed in  ./configure --help  or e.g. in PetscViewerType, MatPartitioningType, MatSolverType.
2260fbe2beSVaclav Hapla 
2360fbe2beSVaclav Hapla    The lookup is case insensitive, i.e. looking for "HDF5" or "hdf5" is the same.
2460fbe2beSVaclav Hapla 
2560fbe2beSVaclav Hapla .seealso: PetscViewerType, MatPartitioningType, MatSolverType
2660fbe2beSVaclav Hapla @*/
2760fbe2beSVaclav Hapla PetscErrorCode  PetscHasExternalPackage(const char pkg[], PetscBool *has)
2860fbe2beSVaclav Hapla {
2960fbe2beSVaclav Hapla   char   pkgstr[128], *loc;
3060fbe2beSVaclav Hapla   size_t cnt;
3160fbe2beSVaclav Hapla 
3260fbe2beSVaclav Hapla   PetscFunctionBegin;
33*5f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(pkg,1);
34*5f80ce2aSJacob Faibussowitsch   PetscValidBoolPointer(has,2);
35*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSNPrintfCount(pkgstr,sizeof(pkgstr),":%s:",&cnt,pkg));
36*5f80ce2aSJacob Faibussowitsch   PetscCheck(cnt < sizeof(pkgstr),PETSC_COMM_SELF, PETSC_ERR_SUP, "Package name is too long: \"%s\"", pkg);
37*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrtolower(pkgstr));
3860fbe2beSVaclav Hapla #if defined(PETSC_HAVE_PACKAGES)
39*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrstr(PETSC_HAVE_PACKAGES, pkgstr, &loc));
4060fbe2beSVaclav Hapla #else
4160fbe2beSVaclav Hapla #error "PETSC_HAVE_PACKAGES macro undefined. Please reconfigure"
4260fbe2beSVaclav Hapla #endif
4360fbe2beSVaclav Hapla   *has = loc ? PETSC_TRUE : PETSC_FALSE;
4460fbe2beSVaclav Hapla   PetscFunctionReturn(0);
4560fbe2beSVaclav Hapla }
46