xref: /petsc/config/PETSc/options/libraryOptions.py (revision 984ed092ecc7313e63e6aa733432dfb60d929fa3)
19d310bb7SBarry Smith#!/usr/bin/env python
29d310bb7SBarry Smithfrom __future__ import generators
39d310bb7SBarry Smithimport config.base
49d310bb7SBarry Smithimport os
59d310bb7SBarry Smith
69d310bb7SBarry Smithclass Configure(config.base.Configure):
79d310bb7SBarry Smith  def __init__(self, framework):
89d310bb7SBarry Smith    config.base.Configure.__init__(self, framework)
99d310bb7SBarry Smith    self.headerPrefix = ''
109d310bb7SBarry Smith    self.substPrefix  = ''
119d310bb7SBarry Smith    return
129d310bb7SBarry Smith
139d310bb7SBarry Smith  def __str__(self):
149d310bb7SBarry Smith    return ''
159d310bb7SBarry Smith
169d310bb7SBarry Smith  def setupHelp(self, help):
179d310bb7SBarry Smith    import nargs
189d310bb7SBarry Smith    help.addArgument('PETSc', '-with-log=<bool>',              nargs.ArgBool(None, 1, 'Activate logging code in PETSc'))
1922b6d1caSBarry Smith    help.addArgument('PETSc', '-with-threadsafety=<bool>',     nargs.ArgBool(None, 0, 'Allow individual threads in PETSc to call PETSc routines'))
209d310bb7SBarry Smith    help.addArgument('PETSc', '-with-info=<bool>',             nargs.ArgBool(None, 1, 'Activate PetscInfo() (i.e. -info)  code in PETSc'))
219d310bb7SBarry Smith    help.addArgument('PETSc', '-with-ctable=<bool>',           nargs.ArgBool(None, 1, 'Activate CTABLE hashing for certain search functions - to conserve memory'))
22*984ed092SMark Adams    help.addArgument('PETSc', '-with-dmlandau-2d=<bool>',      nargs.ArgBool(None, 0, 'Enable 2.5D DM Landau, default use full 3D'))
239d310bb7SBarry Smith    help.addArgument('PETSc', '-with-fortran-kernels=<bool>',  nargs.ArgBool(None, 0, 'Use Fortran for linear algebra kernels'))
2415681d7cSHong Zhang    help.addArgument('PETSc', '-with-avx512-kernels=<bool>',   nargs.ArgBool(None, 1, 'Use AVX-512 intrinsics for linear algebra kernels when available'))
259d310bb7SBarry Smith    help.addArgument('PETSc', '-with-is-color-value-type=<char,short>',nargs.ArgString(None, 'short', 'char, short can store 256, 65536 colors'))
269d310bb7SBarry Smith    return
279d310bb7SBarry Smith
289d310bb7SBarry Smith  def setupDependencies(self, framework):
299d310bb7SBarry Smith    config.base.Configure.setupDependencies(self, framework)
309d310bb7SBarry Smith    self.compilers        = framework.require('config.compilers', self)
3160da17ecSBarry Smith    self.setCompilers     = framework.require('config.setCompilers', self)
329d310bb7SBarry Smith    self.libraries        = framework.require('config.libraries', self)
339d310bb7SBarry Smith    self.types            = framework.require('config.types', self)
343d744f9eSBarry Smith    self.compilerFlags    = framework.require('config.compilerFlags', self)
3560da17ecSBarry Smith    self.sharedLibraries  = framework.require('PETSc.options.sharedLibraries', None)
3660da17ecSBarry Smith    self.petscConfigure   = framework.require('PETSc.Configure', None)
379d310bb7SBarry Smith    return
389d310bb7SBarry Smith
399d310bb7SBarry Smith  def configureLibraryOptions(self):
40*984ed092SMark Adams    '''Sets PETSC_USE_DEBUG, PETSC_USE_INFO, PETSC_USE_LOG, PETSC_USE_CTABLE, PETSC_USE_DMLANDAU_2D, PETSC_USE_FORTRAN_KERNELS, and PETSC_USE_AVX512_KERNELS'''
419d310bb7SBarry Smith    '''Also sets PETSC_AssertAlignx() in Fortran and PETSC_Alignx() in C for IBM BG/P compiler '''
4222b6d1caSBarry Smith    if self.framework.argDB['with-threadsafety']:
43f79c285dSBarry Smith      self.addDefine('HAVE_THREADSAFETY',1)
4422b6d1caSBarry Smith      self.useThreadSafety = 1
4522b6d1caSBarry Smith    else:
4622b6d1caSBarry Smith      self.useThreadSafety = 0
4722b6d1caSBarry Smith
4822b6d1caSBarry Smith    if self.useThreadSafety and self.framework.argDB['with-log']:
4922b6d1caSBarry Smith      raise RuntimeError('Must use --with-log=0 with --with-threadsafety')
5022b6d1caSBarry Smith
51fb33c7d2SBarry Smith    if self.useThreadSafety and not ((self.sharedLibraries.useShared and self.setCompilers.dynamicLibraries) or self.framework.argDB['with-single-library']):
5260da17ecSBarry Smith      raise RuntimeError('Must use --with-shared-libraries or --with-single-library with --with-threadsafety')
5360da17ecSBarry Smith
549d310bb7SBarry Smith    self.useLog   = self.framework.argDB['with-log']
559d310bb7SBarry Smith    self.addDefine('USE_LOG',   self.useLog)
569d310bb7SBarry Smith
573d744f9eSBarry Smith    if self.compilerFlags.debugging:
582e3e7a57SBarry Smith      if self.useThreadSafety:
592e3e7a57SBarry Smith        raise RuntimeError('Must use --with-debugging=0 with --with-threadsafety')
60f79c285dSBarry Smith      self.addDefine('USE_DEBUG',1)
617fca349cSMatthew G. Knepley    elif not config.setCompilers.Configure.isIBM(self.framework.getCompiler(), self.log):
629d310bb7SBarry Smith      # IBM XLC version 12.1 (BG/Q and POWER) miscompiles PetscMalloc3()
639d310bb7SBarry Smith      # by reordering "*(void**)&ptr = x" as though ptr was not modified
649d310bb7SBarry Smith      # by this statement.
659d310bb7SBarry Smith      self.addDefine('USE_MALLOC_COALESCED',1)
669d310bb7SBarry Smith
679d310bb7SBarry Smith    self.useInfo   = self.framework.argDB['with-info']
689d310bb7SBarry Smith    self.addDefine('USE_INFO',   self.useInfo)
699d310bb7SBarry Smith
709d310bb7SBarry Smith    self.useCtable = self.framework.argDB['with-ctable']
719d310bb7SBarry Smith    if self.useCtable:
729d310bb7SBarry Smith      self.addDefine('USE_CTABLE', '1')
739d310bb7SBarry Smith
74*984ed092SMark Adams    self.useDmLandau2d = self.framework.argDB['with-dmlandau-2d']
75*984ed092SMark Adams    if self.useDmLandau2d:
76*984ed092SMark Adams      self.addDefine('USE_DMLANDAU_2D',1)
77*984ed092SMark Adams
789d310bb7SBarry Smith    # used in src/mat/impls/sbaij/seq/relax.h
793cafa982SMatthew G. Knepley    self.libraries.saveLog()
809d310bb7SBarry Smith    if not self.libraries.isBGL():
819d310bb7SBarry Smith      self.addDefine('USE_BACKWARD_LOOP','1')
823cafa982SMatthew G. Knepley    self.logWrite(self.libraries.restoreLog())
839d310bb7SBarry Smith
849d310bb7SBarry Smith    self.useFortranKernels = self.framework.argDB['with-fortran-kernels']
859d310bb7SBarry Smith    if not hasattr(self.compilers, 'FC') and self.useFortranKernels:
869d310bb7SBarry Smith      raise RuntimeError('Cannot use fortran kernels without a Fortran compiler')
879d310bb7SBarry Smith    if self.useFortranKernels:
889d310bb7SBarry Smith      self.addDefine('USE_FORTRAN_KERNELS', 1)
899d310bb7SBarry Smith      if self.libraries.isBGL():
909d310bb7SBarry Smith        self.addDefine('AssertAlignx(a,b)','call ALIGNX(a,b)')
919d310bb7SBarry Smith      else:
929d310bb7SBarry Smith        self.addDefine('AssertAlignx(a,b)','  ')
939d310bb7SBarry Smith
94ef4c6e81SRichard Tran Mills    self.useAVX512Kernels = self.framework.argDB['with-avx512-kernels']
95ef4c6e81SRichard Tran Mills    if self.useAVX512Kernels:
96ef4c6e81SRichard Tran Mills      self.addDefine('USE_AVX512_KERNELS', 1)
97ef4c6e81SRichard Tran Mills
989d310bb7SBarry Smith    if self.libraries.isBGL():
999d310bb7SBarry Smith      self.addDefine('Alignx(a,b)','__alignx(a,b)')
1009d310bb7SBarry Smith    else:
1019d310bb7SBarry Smith      self.addDefine('Alignx(a,b)','  ')
1029d310bb7SBarry Smith    return
1039d310bb7SBarry Smith
1049d310bb7SBarry Smith  def configureISColorValueType(self):
105569ea7c4SPierre Jolivet    '''Sets PETSC_IS_COLORING_VALUE_TYPE, PETSC_MPIU_IS_COLORING_VALUE_TYPE, and PETSC_IS_COLORING_MAX as required by ISColoring'''
1069d310bb7SBarry Smith    self.isColorValueType  = self.framework.argDB['with-is-color-value-type']
1079d310bb7SBarry Smith    if self.isColorValueType != 'char' and self.isColorValueType != 'short':
1089d310bb7SBarry Smith      raise RuntimeError('Incorrect --with-is-color-value-type value specified. Can be either char or short. Specified value is :'+self.isColorValueType)
1099d310bb7SBarry Smith    if self.isColorValueType == 'char':
11015a5570dSLisandro Dalcin      max_value = 'UCHAR_MAX'
1119d310bb7SBarry Smith      mpi_type = 'MPI_UNSIGNED_CHAR'
1126564ec32SJed Brown      type_f = 'integer1'
1139d310bb7SBarry Smith    else:
11415a5570dSLisandro Dalcin      max_value = 'USHRT_MAX'
1159d310bb7SBarry Smith      mpi_type = 'MPI_UNSIGNED_SHORT'
1166564ec32SJed Brown      type_f = 'integer2'
1179d310bb7SBarry Smith
118569ea7c4SPierre Jolivet    self.addDefine('MPIU_IS_COLORING_VALUE_TYPE',mpi_type)
119569ea7c4SPierre Jolivet    self.addDefine('IS_COLORING_MAX',max_value)
120569ea7c4SPierre Jolivet    self.addDefine('IS_COLORING_VALUE_TYPE',self.isColorValueType)
121569ea7c4SPierre Jolivet    self.addDefine('IS_COLORING_VALUE_TYPE_F',type_f)
1229d310bb7SBarry Smith    return
1239d310bb7SBarry Smith
1249d310bb7SBarry Smith  def configure(self):
1259d310bb7SBarry Smith    self.executeTest(self.configureLibraryOptions)
1269d310bb7SBarry Smith    self.executeTest(self.configureISColorValueType)
1279d310bb7SBarry Smith    return
128