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