xref: /petsc/config/PETSc/options/libraryOptions.py (revision 22b6d1ca80e4f79123036fb6afd7eb4463b3692a)
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