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