xref: /petsc/config/PETSc/options/indexTypes.py (revision fb9312d2fb6d78ebd99ee87e0d7bb87c2de5d40e)
1from __future__ import generators
2import config.base
3
4class Configure(config.base.Configure):
5  def __init__(self, framework):
6    config.base.Configure.__init__(self, framework)
7    self.headerPrefix = ''
8    self.substPrefix  = ''
9    return
10
11  def __str1__(self):
12    desc = []
13    if hasattr(self, 'integerSize'):
14      desc.append('  Integer size: ' + str(self.integerSize//8) + ' bytes')
15    return '\n'.join(desc)+'\n'
16
17  def setupHelp(self, help):
18    import nargs
19    help.addArgument('PETSc', '-with-64-bit-indices=<bool>',   nargs.ArgBool(None, 0, 'Use 64 bit integers (long long) for indexing in vectors and matrices'))
20    return
21
22  def setupDependencies(self, framework):
23    config.base.Configure.setupDependencies(self, framework)
24    self.setCompilers = framework.require('config.setCompilers', self)
25    self.libraries    = framework.require('config.libraries', None)
26    self.compilers    = framework.require('config.compilers', None)
27    return
28
29  def fortranPromoteInteger(self):
30      self.pushLanguage('FC')
31      flags = self.getCompilerFlags()
32      self.popLanguage()
33      #   ifort compiler flag             gfortran compiler flag
34      if '-integer-size 64' in flags or '-fdefault-integer-8' in flags:
35        return 1
36      return 0
37
38  def configureIndexSize(self):
39    if self.framework.argDB['with-64-bit-indices']:
40      self.integerSize = 64
41      self.addDefine('USE_64BIT_INDICES', 1)
42      if self.libraries.check('-lgcc_s.1', '__floatdidf'):
43        self.compilers.LIBS += ' '+self.libraries.getLibArgument('-lgcc_s.1')
44      self.addMakeMacro('PETSC_INDEX_SIZE', '64')
45      if self.fortranPromoteInteger():
46        self.addDefine('PROMOTE_FORTRAN_INTEGER', 1)
47        self.logPrintWarning('You have a Fortran compiler option to promote integer to 8 bytes. This is fragile and not supported by the MPI standard. You must ensure in your code that all calls to MPI routines pass 4-byte integers.')
48    else:
49      self.integerSize = 32
50      self.addMakeMacro('PETSC_INDEX_SIZE', '32')
51      if self.fortranPromoteInteger():
52        raise RuntimeError('Fortran compiler flag to promote integers to 8 bytes has been set, but PETSc is being built with 4-byte integers.')
53    return
54
55  def configure(self):
56    self.executeTest(self.configureIndexSize)
57    return
58