Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
update-SuiteSparse: Single configure script for SuiteSparse
PETSc currently has interfaces for three packages (UMFPACK, CHOLMOD, and KLU) from SuiteSparse and each have their own configure file. This single SuiteSparse.py file downloads the entire SuiteSparse package and installs the three packages (and their associated dependencies). This also updates CHOLMOD and UMFPACK to use the latest versions available via SuiteSparse version 4.2.1.
- Loading branch information
Shri Abhyankar
committed
Feb 8, 2014
1 parent
462104a
commit 350ae3a
Showing
1 changed file
with
74 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
import PETSc.package | ||
|
||
class Configure(PETSc.package.NewPackage): | ||
def __init__(self, framework): | ||
PETSc.package.NewPackage.__init__(self,framework) | ||
self.download = ['http://www.cise.ufl.edu/research/sparse/SuiteSparse/SuiteSparse-4.2.1.tar.gz'] | ||
self.liblist = [['libumfpack.a','libklu.a','libcholmod.a','libbtf.a','libccolamd.a','libcolamd.a','libcamd.a','libamd.a','libsuitesparseconfig.a'], | ||
['libumfpack.a','libklu.a','libcholmod.a','libbtf.a','libccolamd.a','libcolamd.a','libcamd.a','libamd.a','libmetis.a','libsuitesparseconfig.a']] | ||
self.functions = ['umfpack_dl_wsolve','cholmod_l_solve','klu_l_solve'] | ||
self.includes = ['umfpack.h','cholmod.h','klu.h'] | ||
self.needsMath = 1 | ||
self.complex = 1 | ||
self.requires32bitint = 0 | ||
return | ||
|
||
def setupDependencies(self, framework): | ||
PETSc.package.NewPackage.setupDependencies(self, framework) | ||
self.blasLapack = framework.require('config.packages.BlasLapack',self) | ||
self.deps = [self.blasLapack] | ||
return | ||
|
||
def Install(self): | ||
import os | ||
self.framework.log.write('SuiteSparseDir = '+self.packageDir+' installDir '+self.installDir+'\n') | ||
|
||
mkfile = 'SuiteSparse_config/SuiteSparse_config.mk' | ||
g = open(os.path.join(self.packageDir, mkfile), 'w') | ||
self.setCompilers.pushLanguage('C') | ||
g.write('CC = '+self.setCompilers.getCompiler()+'\n') | ||
if self.checkCompile('#ifdef PETSC_HAVE_LIMITS_H\n #include <limits.h>\n#endif\n', 'long long i=ULONG_MAX;\n\nif (i);\n'): | ||
ulong_max = 'ULONG_MAX' | ||
else: | ||
ulong_max = '9223372036854775807LL' | ||
g.write('CF = '+self.setCompilers.getCompilerFlags()+''' -DSuiteSparse_long="long long" -DSuiteSparse_long_max=''' + ulong_max + ''' -DSuiteSparse_long_id='"lld"'\n''') | ||
self.setCompilers.popLanguage() | ||
g.write('RANLIB = '+self.setCompilers.RANLIB+'\n') | ||
g.write('ARCHIVE = '+self.setCompilers.AR+' '+self.setCompilers.AR_FLAGS+'\n') | ||
g.write('RM = '+self.programs.RM+'\n') | ||
g.write('MV = '+self.programs.mv+'\n') | ||
g.write('CP = '+self.programs.cp+'\n') | ||
g.write('CLEAN = *.o *.obj *.ln *.bb *.bbg *.da *.tcov *.gcov gmon.out *.bak *.d\n') | ||
g.write('INSTALL_LIB = ' + self.libDir + '\n') | ||
g.write('INSTALL_INCLUDE = ' + self.includeDir + '\n') | ||
if self.blasLapack.mangling == 'underscore': | ||
flg = '' | ||
elif self.blasLapack.mangling == 'caps': | ||
flg = '-DBLAS_CAPS_DOES_NOT_WORK' | ||
else: | ||
flg = '-DBLAS_NO_UNDERSCORE' | ||
g.write('UMFPACK_CONFIG = '+flg+'\n') | ||
g.write('CHOLMOD_CONFIG = '+flg+' -DNPARTITION\n') | ||
g.close() | ||
|
||
if self.installNeeded(mkfile): | ||
try: | ||
self.logPrintBox('Compiling SuiteSparse; this may take several minutes') | ||
output,err,ret = PETSc.package.NewPackage.executeShellCommand('cd '+self.packageDir+'/SuiteSparse_config && make && make install && make clean', timeout=2500, log=self.framework.log) | ||
output,err,ret = PETSc.package.NewPackage.executeShellCommand('cd '+self.packageDir+'/AMD && make library && make install && make clean', timeout=2500, log=self.framework.log) | ||
output,err,ret = PETSc.package.NewPackage.executeShellCommand('cd '+self.packageDir+'/COLAMD && make library && make install && make clean', timeout=2500, log=self.framework.log) | ||
output,err,ret = PETSc.package.NewPackage.executeShellCommand('cd '+self.packageDir+'/BTF && make library && make install && make clean', timeout=2500, log=self.framework.log) | ||
output,err,ret = PETSc.package.NewPackage.executeShellCommand('cd '+self.packageDir+'/CAMD && make library && make install && make clean', timeout=2500, log=self.framework.log) | ||
output,err,ret = PETSc.package.NewPackage.executeShellCommand('cd '+self.packageDir+'/CCOLAMD && make library && make install && make clean', timeout=2500, log=self.framework.log) | ||
output,err,ret = PETSc.package.NewPackage.executeShellCommand('cd '+self.packageDir+'/CHOLMOD && make library && make install && make clean', timeout=2500, log=self.framework.log) | ||
output,err,ret = PETSc.package.NewPackage.executeShellCommand('cd '+self.packageDir+'/UMFPACK && make library && make install && make clean', timeout=2500, log=self.framework.log) | ||
output,err,ret = PETSc.package.NewPackage.executeShellCommand('cd '+self.packageDir+'/KLU && make library && make install && make clean', timeout=2500, log=self.framework.log) | ||
|
||
self.addDefine('HAVE_UMFPACK',1) | ||
self.addDefine('HAVE_CHOLMOD',1) | ||
self.addDefine('HAVE_KLU',1) | ||
except RuntimeError, e: | ||
raise RuntimeError('Error running make on SuiteSparse: '+str(e)) | ||
self.postInstall(output+err, mkfile) | ||
return self.installDir | ||
|