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