1import config.package 2 3class Configure(config.package.Package): 4 def __init__(self, framework): 5 config.package.Package.__init__(self, framework) 6 self.gitcommit = 'MUMPS_5.0.1-p1.tar.gz' 7 self.download = ['git://https://bitbucket.org/petsc/pkg-mumps.git', 8 'http://ftp.mcs.anl.gov/pub/petsc/externalpackages/MUMPS_5.0.1-p1.tar.gz'] 9 self.liblist = [['libcmumps.a','libdmumps.a','libsmumps.a','libzmumps.a','libmumps_common.a','libpord.a'], 10 ['libcmumps.a','libdmumps.a','libsmumps.a','libzmumps.a','libmumps_common.a','libpord.a','libpthread.a'], 11 ['libcmumps.a','libdmumps.a','libsmumps.a','libzmumps.a','libmumps_common.a','libpord.a','libmpiseq.a']] 12 self.functions = ['dmumps_c'] 13 self.includes = ['dmumps_c.h'] 14 # 15 # Mumps does NOT work with 64 bit integers without a huge number of hacks we ain't making 16 self.requires32bitint = 1; # 1 means that the package will not work with 64 bit integers 17 self.downloadonWindows= 1 18 self.hastests = 1 19 self.hastestsdatafiles= 1 20 return 21 22 def setupHelp(self, help): 23 import nargs 24 config.package.Package.setupHelp(self, help) 25 help.addArgument('MUMPS', '-with-mumps-serial', nargs.ArgBool(None, 0, 'Use serial build of MUMPS')) 26 return 27 28 def setupDependencies(self, framework): 29 config.package.Package.setupDependencies(self, framework) 30 self.blasLapack = framework.require('config.packages.BlasLapack',self) 31 self.mpi = framework.require('config.packages.MPI',self) 32 if self.argDB['with-mumps-serial']: 33 self.deps = [self.blasLapack] 34 else: 35 self.scalapack = framework.require('config.packages.scalapack',self) 36 self.deps = [self.scalapack,self.mpi,self.blasLapack] 37 self.parmetis = framework.require('config.packages.parmetis',self) 38 self.ptscotch = framework.require('config.packages.PTScotch',self) 39 return 40 41 def consistencyChecks(self): 42 config.package.Package.consistencyChecks(self) 43 if self.argDB['with-mumps-serial']: 44 if not self.mpi.usingMPIUni: 45 raise RuntimeError('Serial MUMPS version is only compatible with MPIUni\nReconfigure using --with-mpi=0') 46 elif self.mpi.usingMPIUniFortranBinding: 47 raise RuntimeError('Serial MUMPS version is incompatible with the MPIUni Fortran bindings\nReconfigure using --with-mpiuni-fortran-binding=0') 48 return 49 50 def Install(self): 51 import os 52 53 if not hasattr(self.compilers, 'FC'): 54 raise RuntimeError('Cannot install '+self.name+' without Fortran, make sure you do NOT have --with-fc=0') 55 if not self.compilers.FortranDefineCompilerOption: 56 raise RuntimeError('Fortran compiler cannot handle preprocessing directives from command line.') 57 if self.argDB['with-mumps-serial']: 58 raise RuntimeError('Cannot automatically install the serial version of MUMPS.') 59 g = open(os.path.join(self.packageDir,'Makefile.inc'),'w') 60 g.write('LPORDDIR = $(topdir)/PORD/lib/\n') 61 g.write('IPORD = -I$(topdir)/PORD/include/\n') 62 g.write('LPORD = -L$(LPORDDIR) -lpord\n') 63 g.write('PLAT = \n') 64 orderingsc = '-Dpord' 65 orderingsf = self.compilers.FortranDefineCompilerOption+'pord' 66 # Disable threads on BGL 67 if self.libraries.isBGL(): 68 orderingsc += ' -DWITHOUT_PTHREAD' 69 if self.parmetis.found: 70 g.write('IMETIS = '+self.headers.toString(self.parmetis.include)+'\n') 71 g.write('LMETIS = '+self.libraries.toString(self.parmetis.lib)+'\n') 72 orderingsc += ' -Dmetis -Dparmetis' 73 orderingsf += ' '+self.compilers.FortranDefineCompilerOption+'metis '+self.compilers.FortranDefineCompilerOption+'parmetis' 74 if self.ptscotch.found: 75 g.write('ISCOTCH = '+self.headers.toString(self.ptscotch.include)+'\n') 76 g.write('LSCOTCH = '+self.libraries.toString(self.ptscotch.lib)+'\n') 77 orderingsc += ' -Dscotch -Dptscotch' 78 orderingsf += ' '+self.compilers.FortranDefineCompilerOption+'scotch '+self.compilers.FortranDefineCompilerOption+'ptscotch' 79 80 g.write('ORDERINGSC = '+orderingsc+'\n') 81 g.write('ORDERINGSF = '+orderingsf+'\n') 82 g.write('LORDERINGS = $(LMETIS) $(LPORD) $(LSCOTCH)\n') 83 g.write('IORDERINGSC = $(IMETIS) $(IPORD) $(ISCOTCH)\n') 84 g.write('IORDERINGSF = $(ISCOTCH)\n') 85 86 g.write('RM = /bin/rm -f\n') 87 self.setCompilers.pushLanguage('C') 88 g.write('CC = '+self.setCompilers.getCompiler()+'\n') 89 g.write('OPTC = ' + self.setCompilers.getCompilerFlags().replace('-Wall','').replace('-Wshadow','') +'\n') 90 g.write('OUTC = -o \n') 91 self.setCompilers.popLanguage() 92 if not self.compilers.fortranIsF90: 93 raise RuntimeError('Installing MUMPS requires a F90 compiler') 94 self.setCompilers.pushLanguage('FC') 95 g.write('FC = '+self.setCompilers.getCompiler()+'\n') 96 g.write('FL = '+self.setCompilers.getCompiler()+'\n') 97 g.write('OPTF = ' + self.setCompilers.getCompilerFlags().replace('-Wall','').replace('-Wshadow','').replace('-Mfree','') +'\n') 98 g.write('OUTF = -o \n') 99 self.setCompilers.popLanguage() 100 101 # set fortran name mangling 102 # this mangling information is for both BLAS and the Fortran compiler so cannot use the BlasLapack mangling flag 103 if self.compilers.fortranManglingDoubleUnderscore: 104 g.write('CDEFS = -DAdd__\n') 105 elif self.compilers.fortranMangling == 'underscore': 106 g.write('CDEFS = -DAdd_\n') 107 elif self.compilers.fortranMangling == 'caps': 108 g.write('CDEFS = -DUPPPER\n') 109 110 g.write('AR = '+self.setCompilers.AR+' '+self.setCompilers.AR_FLAGS+' \n') 111 g.write('LIBEXT = .'+self.setCompilers.AR_LIB_SUFFIX+'\n') 112 g.write('RANLIB = '+self.setCompilers.RANLIB+'\n') 113 g.write('SCALAP = '+self.libraries.toString(self.scalapack.lib)+'\n') 114 g.write('INCPAR = '+self.headers.toString(self.mpi.include)+'\n') 115 g.write('LIBPAR = $(SCALAP) '+self.libraries.toString(self.mpi.lib)+'\n') #PARALLE LIBRARIES USED by MUMPS 116 g.write('INCSEQ = -I$(topdir)/libseq\n') 117 g.write('LIBSEQ = $(LAPACK) -L$(topdir)/libseq -lmpiseq\n') 118 g.write('LIBBLAS = '+self.libraries.toString(self.blasLapack.dlib)+'\n') 119 g.write('OPTL = -O -I.\n') 120 g.write('INCS = $(INCPAR)\n') 121 g.write('LIB = $(LIBPAR)\n') 122 g.write('LIBSEQNEEDED =\n') 123 g.close() 124 if self.installNeeded('Makefile.inc'): 125 try: 126 output1,err1,ret1 = config.package.Package.executeShellCommand('cd '+self.packageDir+' && make clean', timeout=2500, log = self.log) 127 except RuntimeError, e: 128 pass 129 try: 130 self.logPrintBox('Compiling Mumps; this may take several minutes') 131 output2,err2,ret2 = config.package.Package.executeShellCommand('cd '+self.packageDir+' && make alllib',timeout=2500, log = self.log) 132 libDir = os.path.join(self.installDir, self.libdir) 133 includeDir = os.path.join(self.installDir, self.includedir) 134 self.logPrintBox('Installing Mumps; this may take several minutes') 135 self.installDirProvider.printSudoPasswordMessage() 136 output,err,ret = config.package.Package.executeShellCommand(self.installSudo+'mkdir -p '+os.path.join(self.installDir,self.libdir)+' && cd '+self.packageDir+' && '+self.installSudo+'cp -f lib/*.* '+libDir+'/. && '+self.installSudo+'mkdir -p '+includeDir+' && '+self.installSudo+'cp -f include/*.* '+includeDir+'/.', timeout=2500, log = self.log) 137 except RuntimeError, e: 138 raise RuntimeError('Error running make on MUMPS: '+str(e)) 139 self.postInstall(output1+err1+output2+err2,'Makefile.inc') 140 return self.installDir 141 142 def configureLibrary(self): 143 if not self.argDB['with-mumps-serial']: 144 if self.parmetis.found: 145 self.deps.append(self.parmetis) 146 if self.ptscotch.found: 147 self.deps.append(self.ptscotch) 148 config.package.Package.configureLibrary(self) 149 # [parallem mumps] make sure either ptscotch or parmetis is enabled 150 if not self.argDB['with-mumps-serial'] and not self.ptscotch.found and not self.parmetis.found: 151 raise RuntimeError('MUMPS requires either Parmetis or PTScotch. Use either --download-parmetis or --download-ptscotch') 152