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