1*9d310bb7SBarry Smith#!/usr/bin/env python 2*9d310bb7SBarry Smithfrom __future__ import generators 3*9d310bb7SBarry Smithimport user 4*9d310bb7SBarry Smithimport config.base 5*9d310bb7SBarry Smithimport os 6*9d310bb7SBarry Smith 7*9d310bb7SBarry Smithclass Configure(config.base.Configure): 8*9d310bb7SBarry Smith def __init__(self, framework): 9*9d310bb7SBarry Smith config.base.Configure.__init__(self, framework) 10*9d310bb7SBarry Smith self.headerPrefix = '' 11*9d310bb7SBarry Smith self.substPrefix = '' 12*9d310bb7SBarry Smith return 13*9d310bb7SBarry Smith 14*9d310bb7SBarry Smith def __str__(self): 15*9d310bb7SBarry Smith return '' 16*9d310bb7SBarry Smith 17*9d310bb7SBarry Smith def setupHelp(self, help): 18*9d310bb7SBarry Smith import nargs 19*9d310bb7SBarry Smith help.addArgument('PETSc', '-with-log=<bool>', nargs.ArgBool(None, 1, 'Activate logging code in PETSc')) 20*9d310bb7SBarry Smith help.addArgument('PETSc', '-with-info=<bool>', nargs.ArgBool(None, 1, 'Activate PetscInfo() (i.e. -info) code in PETSc')) 21*9d310bb7SBarry Smith help.addArgument('PETSc', '-with-ctable=<bool>', nargs.ArgBool(None, 1, 'Activate CTABLE hashing for certain search functions - to conserve memory')) 22*9d310bb7SBarry Smith help.addArgument('PETSc', '-with-fortran-kernels=<bool>', nargs.ArgBool(None, 0, 'Use Fortran for linear algebra kernels')) 23*9d310bb7SBarry Smith help.addArgument('PETSc', '-with-64-bit-indices=<bool>', nargs.ArgBool(None, 0, 'Use 64 bit integers (long long) for indexing in vectors and matrices')) 24*9d310bb7SBarry Smith help.addArgument('PETSc', '-with-is-color-value-type=<char,short>',nargs.ArgString(None, 'short', 'char, short can store 256, 65536 colors')) 25*9d310bb7SBarry Smith return 26*9d310bb7SBarry Smith 27*9d310bb7SBarry Smith def setupDependencies(self, framework): 28*9d310bb7SBarry Smith config.base.Configure.setupDependencies(self, framework) 29*9d310bb7SBarry Smith self.debugging = framework.require('PETSc.options.debugging', self) 30*9d310bb7SBarry Smith self.compilers = framework.require('config.compilers', self) 31*9d310bb7SBarry Smith self.libraries = framework.require('config.libraries', self) 32*9d310bb7SBarry Smith self.types = framework.require('config.types', self) 33*9d310bb7SBarry Smith self.scalarTypes = framework.require('PETSc.options.scalarTypes', self) 34*9d310bb7SBarry Smith return 35*9d310bb7SBarry Smith 36*9d310bb7SBarry Smith 37*9d310bb7SBarry Smith 38*9d310bb7SBarry Smith def configureLibraryOptions(self): 39*9d310bb7SBarry Smith '''Sets PETSC_USE_DEBUG, PETSC_USE_INFO, PETSC_USE_LOG, PETSC_USE_CTABLE and PETSC_USE_FORTRAN_KERNELS''' 40*9d310bb7SBarry Smith '''Also sets PETSC_AssertAlignx() in Fortran and PETSC_Alignx() in C for IBM BG/P compiler ''' 41*9d310bb7SBarry Smith self.useLog = self.framework.argDB['with-log'] 42*9d310bb7SBarry Smith self.addDefine('USE_LOG', self.useLog) 43*9d310bb7SBarry Smith 44*9d310bb7SBarry Smith if self.debugging.debugging: 45*9d310bb7SBarry Smith self.addDefine('USE_DEBUG', '1') 46*9d310bb7SBarry Smith elif not config.setCompilers.Configure.isIBM(self.framework.getCompiler()): 47*9d310bb7SBarry Smith # IBM XLC version 12.1 (BG/Q and POWER) miscompiles PetscMalloc3() 48*9d310bb7SBarry Smith # by reordering "*(void**)&ptr = x" as though ptr was not modified 49*9d310bb7SBarry Smith # by this statement. 50*9d310bb7SBarry Smith self.addDefine('USE_MALLOC_COALESCED',1) 51*9d310bb7SBarry Smith 52*9d310bb7SBarry Smith self.useInfo = self.framework.argDB['with-info'] 53*9d310bb7SBarry Smith self.addDefine('USE_INFO', self.useInfo) 54*9d310bb7SBarry Smith 55*9d310bb7SBarry Smith self.useCtable = self.framework.argDB['with-ctable'] 56*9d310bb7SBarry Smith if self.useCtable: 57*9d310bb7SBarry Smith self.addDefine('USE_CTABLE', '1') 58*9d310bb7SBarry Smith 59*9d310bb7SBarry Smith # used in src/mat/impls/sbaij/seq/relax.h 60*9d310bb7SBarry Smith if not self.libraries.isBGL(): 61*9d310bb7SBarry Smith self.addDefine('USE_BACKWARD_LOOP','1') 62*9d310bb7SBarry Smith 63*9d310bb7SBarry Smith self.useFortranKernels = self.framework.argDB['with-fortran-kernels'] 64*9d310bb7SBarry Smith if not hasattr(self.compilers, 'FC') and self.useFortranKernels: 65*9d310bb7SBarry Smith raise RuntimeError('Cannot use fortran kernels without a Fortran compiler') 66*9d310bb7SBarry Smith if self.useFortranKernels: 67*9d310bb7SBarry Smith self.addDefine('USE_FORTRAN_KERNELS', 1) 68*9d310bb7SBarry Smith if self.libraries.isBGL(): 69*9d310bb7SBarry Smith self.addDefine('AssertAlignx(a,b)','call ALIGNX(a,b)') 70*9d310bb7SBarry Smith else: 71*9d310bb7SBarry Smith self.addDefine('AssertAlignx(a,b)',' ') 72*9d310bb7SBarry Smith 73*9d310bb7SBarry Smith if self.libraries.isBGL(): 74*9d310bb7SBarry Smith self.addDefine('Alignx(a,b)','__alignx(a,b)') 75*9d310bb7SBarry Smith else: 76*9d310bb7SBarry Smith self.addDefine('Alignx(a,b)',' ') 77*9d310bb7SBarry Smith 78*9d310bb7SBarry Smith if self.framework.argDB['with-64-bit-indices']: 79*9d310bb7SBarry Smith self.integerSize = 64 80*9d310bb7SBarry Smith self.addDefine('USE_64BIT_INDICES', 1) 81*9d310bb7SBarry Smith if self.libraries.check('-lgcc_s.1', '__floatdidf'): 82*9d310bb7SBarry Smith self.compilers.LIBS += ' '+self.libraries.getLibArgument('-lgcc_s.1') 83*9d310bb7SBarry Smith else: 84*9d310bb7SBarry Smith self.integerSize = 32 85*9d310bb7SBarry Smith return 86*9d310bb7SBarry Smith 87*9d310bb7SBarry Smith def configureISColorValueType(self): 88*9d310bb7SBarry Smith '''Sets PETSC_IS_COLOR_VALUE_TYPE, MPIU_COLORING_VALUE, IS_COLORING_MAX required by ISColor''' 89*9d310bb7SBarry Smith self.isColorValueType = self.framework.argDB['with-is-color-value-type'] 90*9d310bb7SBarry Smith if self.isColorValueType != 'char' and self.isColorValueType != 'short': 91*9d310bb7SBarry Smith raise RuntimeError('Incorrect --with-is-color-value-type value specified. Can be either char or short. Specified value is :'+self.isColorValueType) 92*9d310bb7SBarry Smith if self.isColorValueType == 'char': 93*9d310bb7SBarry Smith max = pow(2,self.types.sizes['known-sizeof-char']*self.types.bits_per_byte)-1 94*9d310bb7SBarry Smith mpi_type = 'MPI_UNSIGNED_CHAR' 95*9d310bb7SBarry Smith sz = 'PETSC_SIZEOF_CHAR' 96*9d310bb7SBarry Smith else: 97*9d310bb7SBarry Smith max = pow(2,self.types.sizes['known-sizeof-short']*self.types.bits_per_byte)-1 98*9d310bb7SBarry Smith mpi_type = 'MPI_UNSIGNED_SHORT' 99*9d310bb7SBarry Smith sz = 'PETSC_SIZEOF_SHORT' 100*9d310bb7SBarry Smith 101*9d310bb7SBarry Smith self.framework.addDefine('MPIU_COLORING_VALUE',mpi_type) 102*9d310bb7SBarry Smith self.framework.addDefine('IS_COLORING_MAX',max) 103*9d310bb7SBarry Smith self.addDefine('IS_COLOR_VALUE_TYPE', self.isColorValueType) 104*9d310bb7SBarry Smith self.addDefine('IS_COLOR_VALUE_TYPE_SIZE', sz) 105*9d310bb7SBarry Smith return 106*9d310bb7SBarry Smith 107*9d310bb7SBarry Smith def configure(self): 108*9d310bb7SBarry Smith self.executeTest(self.configureLibraryOptions) 109*9d310bb7SBarry Smith self.executeTest(self.configureISColorValueType) 110*9d310bb7SBarry Smith return 111