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 = '87ea17ced9fb56b90ab45298489116883743fd15' # main feb-19-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