PageRenderTime 41ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/config/PETSc/packages/ml.py

https://bitbucket.org/memmett/petsc-memmett-old
Python | 110 lines | 94 code | 12 blank | 4 comment | 16 complexity | 9f1bccd1230c3c0f1743db5ec2cd2ddc MD5 | raw file
  1. import PETSc.package
  2. class Configure(PETSc.package.NewPackage):
  3. def __init__(self, framework):
  4. PETSc.package.NewPackage.__init__(self, framework)
  5. self.gitcommit = 'a7394f847c8953e1d3bdf35ba8569134b769b4a6'
  6. self.giturls = ['https://bitbucket.org/petsc/pkg-ml.git']
  7. self.download = ['http://ftp.mcs.anl.gov/pub/petsc/externalpackages/ml-6.2-win.tar.gz']
  8. self.functions = ['ML_Set_PrintLevel']
  9. self.includes = ['ml_include.h']
  10. self.liblist = [['libml.a']]
  11. self.license = 'http://trilinos.sandia.gov/'
  12. self.fc = 1
  13. self.worksonWindows = 1
  14. self.downloadonWindows = 1
  15. return
  16. def setupDependencies(self, framework):
  17. PETSc.package.NewPackage.setupDependencies(self, framework)
  18. self.mpi = framework.require('config.packages.MPI',self)
  19. self.blasLapack = framework.require('config.packages.BlasLapack',self)
  20. self.deps = [self.mpi,self.blasLapack]
  21. return
  22. def generateLibList(self,dir):
  23. import os
  24. '''Normally the one in package.py is used, but ML requires the extra C++ library'''
  25. libs = ['libml']
  26. alllibs = []
  27. for l in libs:
  28. alllibs.append(l+'.a')
  29. # Now specify -L ml-lib-path only to the first library
  30. alllibs[0] = os.path.join(dir,alllibs[0])
  31. import config.setCompilers
  32. if self.languages.clanguage == 'C':
  33. alllibs.extend(self.compilers.cxxlibs)
  34. return [alllibs]
  35. def Install(self):
  36. import os
  37. args = ['--prefix='+self.installDir]
  38. args.append('--libdir='+os.path.join(self.installDir,self.libdir))
  39. args.append('--disable-ml-epetra')
  40. args.append('--disable-ml-aztecoo')
  41. args.append('--disable-ml-examples')
  42. args.append('--disable-tests')
  43. self.framework.pushLanguage('C')
  44. args.append('CC="'+self.framework.getCompiler()+'"')
  45. args.append('--with-cflags="'+self.framework.getCompilerFlags()+' -DMPICH_SKIP_MPICXX -DOMPI_SKIP_MPICXX '+ self.headers.toStringNoDupes(self.mpi.include)+'"')
  46. args.append('CPPFLAGS="'+self.headers.toStringNoDupes(self.mpi.include)+'"')
  47. self.framework.popLanguage()
  48. if hasattr(self.compilers, 'FC'):
  49. self.framework.pushLanguage('FC')
  50. args.append('F77="'+self.framework.getCompiler()+'"')
  51. args.append('--with-fflags="'+self.framework.getCompilerFlags()+' '+ self.headers.toStringNoDupes(self.mpi.include)+'"')
  52. self.framework.popLanguage()
  53. else:
  54. args.append('F77=""')
  55. if hasattr(self.compilers, 'CXX'):
  56. self.framework.pushLanguage('Cxx')
  57. args.append('CXX="'+self.framework.getCompiler()+'"')
  58. args.append('--with-cxxflags="'+self.framework.getCompilerFlags()+' -DMPICH_SKIP_MPICXX -DOMPI_SKIP_MPICXX '+ self.headers.toStringNoDupes(self.mpi.include)+'"')
  59. self.framework.popLanguage()
  60. else:
  61. raise RuntimeError('Error: ML requires C++ compiler. None specified')
  62. # ML does not have --with-mpi-include - so specify includes with cflags,fflags,cxxflags,CPPFLAGS
  63. args.append('--enable-mpi')
  64. args.append('--with-mpi-libs="'+self.libraries.toString(self.mpi.lib)+'"')
  65. args.append('--with-blas="'+self.libraries.toString(self.blasLapack.dlib)+'"')
  66. args = ' '.join(args)
  67. fd = file(os.path.join(self.packageDir,'ml'), 'w')
  68. fd.write(args)
  69. fd.write('\n')
  70. fd.close()
  71. if self.installNeeded('ml'):
  72. try:
  73. self.logPrintBox('Configuring ml; this may take several minutes')
  74. output1,err1,ret1 = PETSc.package.NewPackage.executeShellCommand('cd '+self.packageDir+' && ./configure '+args, timeout=900, log = self.framework.log)
  75. except RuntimeError, e:
  76. raise RuntimeError('Error running configure on ML: '+str(e))
  77. try:
  78. self.logPrintBox('Compiling ml; this may take several minutes')
  79. output2,err2,ret2 = PETSc.package.NewPackage.executeShellCommand('cd '+self.packageDir+' && make clean && make && make install', timeout=2500, log = self.framework.log)
  80. except RuntimeError, e:
  81. raise RuntimeError('Error running make on ML: '+str(e))
  82. try:
  83. output3,err3,ret3 = PETSc.package.NewPackage.executeShellCommand(self.setCompilers.RANLIB+' '+os.path.join(self.installDir,self.libdir,'lib*.a'), timeout=2500, log = self.framework.log)
  84. except RuntimeError, e:
  85. raise RuntimeError('Error running ranlib on ML libraries: '+str(e))
  86. self.postInstall(output1+err1+output2+err2+output3+err3,'ml')
  87. return self.installDir
  88. def consistencyChecks(self):
  89. PETSc.package.NewPackage.consistencyChecks(self)
  90. if self.framework.argDB['with-'+self.package]:
  91. # ML requires LAPACK routine dgels() ?
  92. if not self.blasLapack.checkForRoutine('dgels'):
  93. raise RuntimeError('ML requires the LAPACK routine dgels(), the current Lapack libraries '+str(self.blasLapack.lib)+' does not have it')
  94. if not self.blasLapack.checkForRoutine('dsteqr'):
  95. raise RuntimeError('ML requires the LAPACK routine dsteqr(), the current Lapack libraries '+str(self.blasLapack.lib)+' does not have it')
  96. self.framework.log.write('Found dsteqr() in Lapack library as needed by ML\n')
  97. self.framework.log.write('Found dgels() in Lapack library as needed by ML\n')
  98. return