160fbe2beSVaclav Hapla #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/ 260fbe2beSVaclav Hapla 3*cc4c1da9SBarry Smith /*@ 460fbe2beSVaclav Hapla PetscHasExternalPackage - Determine whether PETSc has been configured with the given package 560fbe2beSVaclav Hapla 660fbe2beSVaclav Hapla Not Collective 760fbe2beSVaclav Hapla 82fe279fdSBarry Smith Input Parameter: 960fbe2beSVaclav Hapla . pkg - external package name 1060fbe2beSVaclav Hapla 112fe279fdSBarry Smith Output Parameter: 12811af0c4SBarry Smith . has - `PETSC_TRUE` if PETSc is configured with the given package, else `PETSC_FALSE`. 1360fbe2beSVaclav Hapla 1460fbe2beSVaclav Hapla Level: intermediate 1560fbe2beSVaclav Hapla 1660fbe2beSVaclav Hapla Notes: 1721532e8aSBarry Smith This is basically an alternative for `PETSC_HAVE_XXX` whenever a preprocessor macro is not available/desirable, e.g. in Python. 1860fbe2beSVaclav Hapla 1960fbe2beSVaclav Hapla The external package name pkg is e.g. "hdf5", "yaml", "parmetis". 2021532e8aSBarry Smith It should correspond to the name listed in `./configure --help` or e.g. in `PetscViewerType`, `MatPartitioningType`, `MatSolverType`. 2160fbe2beSVaclav Hapla 2260fbe2beSVaclav Hapla The lookup is case insensitive, i.e. looking for "HDF5" or "hdf5" is the same. 2360fbe2beSVaclav Hapla 24db781477SPatrick Sanan .seealso: `PetscViewerType`, `MatPartitioningType`, `MatSolverType` 2560fbe2beSVaclav Hapla @*/ 26d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscHasExternalPackage(const char pkg[], PetscBool *has) 27d71ae5a4SJacob Faibussowitsch { 2860fbe2beSVaclav Hapla char pkgstr[128], *loc; 2960fbe2beSVaclav Hapla size_t cnt; 3060fbe2beSVaclav Hapla 3160fbe2beSVaclav Hapla PetscFunctionBegin; 324f572ea9SToby Isaac PetscAssertPointer(pkg, 1); 334f572ea9SToby Isaac PetscAssertPointer(has, 2); 349566063dSJacob Faibussowitsch PetscCall(PetscSNPrintfCount(pkgstr, sizeof(pkgstr), ":%s:", &cnt, pkg)); 355f80ce2aSJacob Faibussowitsch PetscCheck(cnt < sizeof(pkgstr), PETSC_COMM_SELF, PETSC_ERR_SUP, "Package name is too long: \"%s\"", pkg); 369566063dSJacob Faibussowitsch PetscCall(PetscStrtolower(pkgstr)); 3760fbe2beSVaclav Hapla #if defined(PETSC_HAVE_PACKAGES) 389566063dSJacob Faibussowitsch PetscCall(PetscStrstr(PETSC_HAVE_PACKAGES, pkgstr, &loc)); 3960fbe2beSVaclav Hapla #else 4060fbe2beSVaclav Hapla #error "PETSC_HAVE_PACKAGES macro undefined. Please reconfigure" 4160fbe2beSVaclav Hapla #endif 4260fbe2beSVaclav Hapla *has = loc ? PETSC_TRUE : PETSC_FALSE; 433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4460fbe2beSVaclav Hapla } 45