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