1#!/usr/bin/env python 2from __future__ import generators 3import config.base 4 5class Configure(config.base.Configure): 6 def __init__(self, framework): 7 config.base.Configure.__init__(self, framework) 8 self.headerPrefix = '' 9 self.substPrefix = '' 10 return 11 12 def __str1__(self): 13 desc = [] 14 if hasattr(self, 'integerSize'): 15 desc.append(' Integer size: ' + str(self.integerSize//8) + ' bytes') 16 return '\n'.join(desc)+'\n' 17 18 def setupHelp(self, help): 19 import nargs 20 help.addArgument('PETSc', '-with-64-bit-indices=<bool>', nargs.ArgBool(None, 0, 'Use 64 bit integers (long long) for indexing in vectors and matrices')) 21 return 22 23 def setupDependencies(self, framework): 24 config.base.Configure.setupDependencies(self, framework) 25 self.setCompilers = framework.require('config.setCompilers', self) 26 self.libraries = framework.require('config.libraries', None) 27 self.compilers = framework.require('config.compilers', None) 28 return 29 30 def fortranPromoteInteger(self): 31 self.pushLanguage('FC') 32 flags = self.getCompilerFlags() 33 self.popLanguage() 34 # ifort compiler flag gfortran compiler flag 35 if '-integer-size 64' in flags or '-fdefault-integer-8' in flags: 36 return 1 37 return 0 38 39 def configureIndexSize(self): 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.logPrintBox('Warning: you have a Fortran compiler option to promote integer to 8 bytes.\nThis is fragile and not supported by the MPI standard.\nYou 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