xref: /petsc/config/BuildSystem/config/packages/HPDDM.py (revision bcd4bb4a4158aa96f212e9537e87b40407faf83e)
1import config.package
2
3class Configure(config.package.Package):
4  def __init__(self,framework):
5    config.package.Package.__init__(self,framework)
6    self.version                = '2.3.5'
7    self.gitcommit              = '9ee87008fe7d92ed30a4359a2baae6d868233da0' # main jan-14-2026 'v'+self.version # main sep-27-2025
8    self.download               = ['git://https://github.com/hpddm/hpddm','https://github.com/hpddm/hpddm/archive/'+self.gitcommit+'.tar.gz']
9    self.minversion             = '2.2.1'
10    self.versionname            = 'HPDDM_VERSION'
11    self.versioninclude         = 'HPDDM_define.hpp'
12    self.buildLanguages         = ['Cxx']
13    self.functions              = []
14    self.includes               = ['HPDDM.hpp']
15    self.skippackagewithoptions = 1
16    self.linkedbypetsc          = 0
17    self.builtafterpetsc        = 1
18    self.hastestsdatafiles      = 1
19    return
20
21  def setupDependencies(self,framework):
22    config.package.Package.setupDependencies(self,framework)
23    self.setCompilers    = framework.require('config.setCompilers',self)
24    self.sharedLibraries = framework.require('PETSc.options.sharedLibraries',self)
25    self.blasLapack      = framework.require('config.packages.BlasLapack',self)
26    self.cxxlibs         = framework.require('config.packages.cxxlibs',self)
27    self.mathlib         = framework.require('config.packages.mathlib',self)
28    self.flibs           = framework.require('config.packages.flibs',self)
29    self.deps            = [self.blasLapack,self.cxxlibs,self.mathlib,self.flibs] # KSPHPDDM
30    self.mpi             = framework.require('config.packages.MPI',self)
31    self.slepc           = framework.require('config.packages.SLEPc',self)
32    self.odeps           = [self.mpi,self.slepc] # KSPHPDDM + PCHPDDM
33    return
34
35  def Install(self):
36    import os
37    if self.blasLapack.mkl and not self.blasLapack.mkl_spblas_h:
38      raise RuntimeError('Cannot use HPDDM with the MKL as \'mkl_spblas.h\' was not found, check for missing --with-blaslapack-include=/opt/intel/mkl/include (or similar)')
39    buildDir = os.path.join(self.packageDir,'petsc-build')
40    self.pushLanguage('Cxx')
41    cxx = self.getCompiler()
42    cxxflags = self.getCompilerFlags()
43    self.popLanguage()
44    if self.framework.argDB['prefix'] and not 'package-prefix-hash' in self.argDB:
45      PETSC_DIR  = os.path.abspath(os.path.expanduser(self.argDB['prefix']))
46      PETSC_ARCH = ''
47      prefix     = os.path.abspath(os.path.expanduser(self.argDB['prefix']))
48    else:
49      PETSC_DIR  = self.petscdir.dir
50      PETSC_ARCH = self.arch
51      prefix     = os.path.join(self.petscdir.dir,self.arch)
52    incDir = os.path.join(prefix,'include')
53    libDir = os.path.join(prefix,self.libDirs[0])
54    self.include = [incDir]
55    try:
56      self.logPrintBox('Copying HPDDM; this may take several seconds')
57      output,err,ret = config.package.Package.executeShellCommand(['cp','-rf',os.path.join(self.packageDir,'include'),prefix],timeout=100,log=self.log) # cannot use shutil.copytree since target directory likely exists
58      self.log.write(output+err)
59    except RuntimeError as e:
60      raise RuntimeError('Error copying HPDDM: '+str(e))
61    if self.checkSharedLibrariesEnabled():
62      ldflags = ' '.join(self.setCompilers.sharedLibraryFlags)
63      cxxflags += ' '+self.headers.toStringNoDupes(self.dinclude+[os.path.join(PETSC_DIR,'include'),incDir])
64      if self.argDB['with-single-library']:
65        ldflags += ' '+self.libraries.toStringNoDupes(self.dlib+[os.path.join(libDir,'libpetsc')])
66      else:
67        ldflags += ' '+self.libraries.toStringNoDupes(self.dlib+[os.path.join(libDir,'libpetscml'),'-lpetsctao -lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys'])
68      oldFlags = self.compilers.CXXPPFLAGS
69      self.compilers.CXXPPFLAGS += ' -I'+incDir
70      self.checkVersion()
71      self.compilers.CXXPPFLAGS = oldFlags
72      # check for Windows-specific define
73      if self.sharedLibraries.getMakeMacro('PETSC_DLL_EXPORTS'):
74        cxxflags += ' -Dpetsc_EXPORTS'
75      if self.slepc.found:
76        self.addPost(self.packageDir, cxx + ' ' + cxxflags + ' ' + os.path.join(self.packageDir,'interface','hpddm_petsc.cpp') + ' ' + ldflags + ' -o ' + os.path.join(libDir,'libhpddm_petsc.' + self.setCompilers.sharedLibraryExt))
77        return self.installDir
78      else:
79        self.logPrintWarning('Compiling HPDDM without SLEPc, PCHPDDM won\'t be available, unless reconfiguring with --download-slepc or configuring SLEPc with --download-hpddm')
80    else:
81      self.logPrintWarning('Skipping PCHPDDM installation, remove --with-shared-libraries=0')
82    self.logPrintBox('HPDDM examples are available at '+os.path.join(self.packageDir,'examples'))
83    return self.installDir
84