19d310bb7SBarry Smith#!/usr/bin/env python 29d310bb7SBarry Smithfrom __future__ import generators 39d310bb7SBarry Smithimport user 49d310bb7SBarry Smithimport config.base 59d310bb7SBarry Smithimport os 69d310bb7SBarry Smith 79d310bb7SBarry Smithclass Configure(config.base.Configure): 89d310bb7SBarry Smith def __init__(self, framework): 99d310bb7SBarry Smith config.base.Configure.__init__(self, framework) 109d310bb7SBarry Smith self.headerPrefix = '' 119d310bb7SBarry Smith self.substPrefix = '' 129d310bb7SBarry Smith return 139d310bb7SBarry Smith 149d310bb7SBarry Smith def __str__(self): 159d310bb7SBarry Smith return '' 169d310bb7SBarry Smith 179d310bb7SBarry Smith def setupHelp(self, help): 189d310bb7SBarry Smith import nargs 199d310bb7SBarry Smith help.addArgument('PETSc', '-with-log=<bool>', nargs.ArgBool(None, 1, 'Activate logging code in PETSc')) 20*22b6d1caSBarry Smith help.addArgument('PETSc', '-with-threadsafety=<bool>', nargs.ArgBool(None, 0, 'Allow individual threads in PETSc to call PETSc routines')) 219d310bb7SBarry Smith help.addArgument('PETSc', '-with-info=<bool>', nargs.ArgBool(None, 1, 'Activate PetscInfo() (i.e. -info) code in PETSc')) 229d310bb7SBarry Smith help.addArgument('PETSc', '-with-ctable=<bool>', nargs.ArgBool(None, 1, 'Activate CTABLE hashing for certain search functions - to conserve memory')) 239d310bb7SBarry Smith help.addArgument('PETSc', '-with-fortran-kernels=<bool>', nargs.ArgBool(None, 0, 'Use Fortran for linear algebra kernels')) 249d310bb7SBarry Smith help.addArgument('PETSc', '-with-is-color-value-type=<char,short>',nargs.ArgString(None, 'short', 'char, short can store 256, 65536 colors')) 259d310bb7SBarry Smith return 269d310bb7SBarry Smith 279d310bb7SBarry Smith def setupDependencies(self, framework): 289d310bb7SBarry Smith config.base.Configure.setupDependencies(self, framework) 299d310bb7SBarry Smith self.debugging = framework.require('PETSc.options.debugging', self) 309d310bb7SBarry Smith self.compilers = framework.require('config.compilers', self) 319d310bb7SBarry Smith self.libraries = framework.require('config.libraries', self) 329d310bb7SBarry Smith self.types = framework.require('config.types', self) 339d310bb7SBarry Smith return 349d310bb7SBarry Smith 359d310bb7SBarry Smith 369d310bb7SBarry Smith 379d310bb7SBarry Smith def configureLibraryOptions(self): 389d310bb7SBarry Smith '''Sets PETSC_USE_DEBUG, PETSC_USE_INFO, PETSC_USE_LOG, PETSC_USE_CTABLE and PETSC_USE_FORTRAN_KERNELS''' 399d310bb7SBarry Smith '''Also sets PETSC_AssertAlignx() in Fortran and PETSC_Alignx() in C for IBM BG/P compiler ''' 40*22b6d1caSBarry Smith if self.framework.argDB['with-threadsafety']: 41*22b6d1caSBarry Smith self.addDefine('HAVE_THREADSAFETY') 42*22b6d1caSBarry Smith self.useThreadSafety = 1 43*22b6d1caSBarry Smith else: 44*22b6d1caSBarry Smith self.useThreadSafety = 0 45*22b6d1caSBarry Smith 46*22b6d1caSBarry Smith if self.useThreadSafety and self.framework.argDB['with-log']: 47*22b6d1caSBarry Smith raise RuntimeError('Must use --with-log=0 with --with-threadsafety') 48*22b6d1caSBarry Smith 499d310bb7SBarry Smith self.useLog = self.framework.argDB['with-log'] 509d310bb7SBarry Smith self.addDefine('USE_LOG', self.useLog) 519d310bb7SBarry Smith 529d310bb7SBarry Smith if self.debugging.debugging: 53*22b6d1caSBarry Smith if self.useThreadSafety: 54*22b6d1caSBarry Smith raise RuntimeError('Must use --with-debugging=0 with --with-threadsafety') 559d310bb7SBarry Smith self.addDefine('USE_DEBUG', '1') 569d310bb7SBarry Smith elif not config.setCompilers.Configure.isIBM(self.framework.getCompiler()): 579d310bb7SBarry Smith # IBM XLC version 12.1 (BG/Q and POWER) miscompiles PetscMalloc3() 589d310bb7SBarry Smith # by reordering "*(void**)&ptr = x" as though ptr was not modified 599d310bb7SBarry Smith # by this statement. 609d310bb7SBarry Smith self.addDefine('USE_MALLOC_COALESCED',1) 619d310bb7SBarry Smith 629d310bb7SBarry Smith self.useInfo = self.framework.argDB['with-info'] 639d310bb7SBarry Smith self.addDefine('USE_INFO', self.useInfo) 649d310bb7SBarry Smith 659d310bb7SBarry Smith self.useCtable = self.framework.argDB['with-ctable'] 669d310bb7SBarry Smith if self.useCtable: 679d310bb7SBarry Smith self.addDefine('USE_CTABLE', '1') 689d310bb7SBarry Smith 699d310bb7SBarry Smith # used in src/mat/impls/sbaij/seq/relax.h 709d310bb7SBarry Smith if not self.libraries.isBGL(): 719d310bb7SBarry Smith self.addDefine('USE_BACKWARD_LOOP','1') 729d310bb7SBarry Smith 739d310bb7SBarry Smith self.useFortranKernels = self.framework.argDB['with-fortran-kernels'] 749d310bb7SBarry Smith if not hasattr(self.compilers, 'FC') and self.useFortranKernels: 759d310bb7SBarry Smith raise RuntimeError('Cannot use fortran kernels without a Fortran compiler') 769d310bb7SBarry Smith if self.useFortranKernels: 779d310bb7SBarry Smith self.addDefine('USE_FORTRAN_KERNELS', 1) 789d310bb7SBarry Smith if self.libraries.isBGL(): 799d310bb7SBarry Smith self.addDefine('AssertAlignx(a,b)','call ALIGNX(a,b)') 809d310bb7SBarry Smith else: 819d310bb7SBarry Smith self.addDefine('AssertAlignx(a,b)',' ') 829d310bb7SBarry Smith 839d310bb7SBarry Smith if self.libraries.isBGL(): 849d310bb7SBarry Smith self.addDefine('Alignx(a,b)','__alignx(a,b)') 859d310bb7SBarry Smith else: 869d310bb7SBarry Smith self.addDefine('Alignx(a,b)',' ') 879d310bb7SBarry Smith return 889d310bb7SBarry Smith 899d310bb7SBarry Smith def configureISColorValueType(self): 909d310bb7SBarry Smith '''Sets PETSC_IS_COLOR_VALUE_TYPE, MPIU_COLORING_VALUE, IS_COLORING_MAX required by ISColor''' 919d310bb7SBarry Smith self.isColorValueType = self.framework.argDB['with-is-color-value-type'] 929d310bb7SBarry Smith if self.isColorValueType != 'char' and self.isColorValueType != 'short': 939d310bb7SBarry Smith raise RuntimeError('Incorrect --with-is-color-value-type value specified. Can be either char or short. Specified value is :'+self.isColorValueType) 949d310bb7SBarry Smith if self.isColorValueType == 'char': 959d310bb7SBarry Smith max = pow(2,self.types.sizes['known-sizeof-char']*self.types.bits_per_byte)-1 969d310bb7SBarry Smith mpi_type = 'MPI_UNSIGNED_CHAR' 979d310bb7SBarry Smith sz = 'PETSC_SIZEOF_CHAR' 989d310bb7SBarry Smith else: 999d310bb7SBarry Smith max = pow(2,self.types.sizes['known-sizeof-short']*self.types.bits_per_byte)-1 1009d310bb7SBarry Smith mpi_type = 'MPI_UNSIGNED_SHORT' 1019d310bb7SBarry Smith sz = 'PETSC_SIZEOF_SHORT' 1029d310bb7SBarry Smith 1039d310bb7SBarry Smith self.framework.addDefine('MPIU_COLORING_VALUE',mpi_type) 1049d310bb7SBarry Smith self.framework.addDefine('IS_COLORING_MAX',max) 1059d310bb7SBarry Smith self.addDefine('IS_COLOR_VALUE_TYPE', self.isColorValueType) 1069d310bb7SBarry Smith self.addDefine('IS_COLOR_VALUE_TYPE_SIZE', sz) 1079d310bb7SBarry Smith return 1089d310bb7SBarry Smith 1099d310bb7SBarry Smith def configure(self): 1109d310bb7SBarry Smith self.executeTest(self.configureLibraryOptions) 1119d310bb7SBarry Smith self.executeTest(self.configureISColorValueType) 1129d310bb7SBarry Smith return 113