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\n This does not affect indexing for BLAS/LAPACK, see --with-64-bit-blas-indices')) 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 '''Determine the size of PETSc indices (32 or 64-bit), from -with-64-bit-indices''' 40 if self.framework.argDB['with-64-bit-indices']: 41 self.integerSize = 64 42 self.addDefine('USE_64BIT_INDICES', 1) 43 if self.libraries.check('-lgcc_s.1', '__floatdidf'): 44 self.compilers.LIBS += ' '+self.libraries.getLibArgument('-lgcc_s.1') 45 self.addMakeMacro('PETSC_INDEX_SIZE', '64') 46 if self.fortranPromoteInteger(): 47 self.addDefine('PROMOTE_FORTRAN_INTEGER', 1) 48 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.') 49 else: 50 self.integerSize = 32 51 self.addMakeMacro('PETSC_INDEX_SIZE', '32') 52 if self.fortranPromoteInteger(): 53 raise RuntimeError('Fortran compiler flag to promote integers to 8 bytes has been set, but PETSc is being built with 4-byte integers.') 54 return 55 56 def configure(self): 57 self.executeTest(self.configureIndexSize) 58 return 59