Skip to content

Commit

Permalink
Merge dbb8979 into 9cf5404
Browse files Browse the repository at this point in the history
  • Loading branch information
adamjstewart committed May 11, 2016
2 parents 9cf5404 + dbb8979 commit efe7c64
Showing 1 changed file with 46 additions and 34 deletions.
80 changes: 46 additions & 34 deletions var/spack/repos/builtin/packages/elk/package.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from spack import *
import spack
from spack import *


class Elk(Package):
'''An all-electron full-potential linearised augmented-plane wave
Expand All @@ -11,79 +12,90 @@ class Elk(Package):
version('3.3.17', 'f57f6230d14f3b3b558e5c71f62f0592')

# Elk provides these libraries, but allows you to specify your own
variant('blas', default=True, description='Build with custom BLAS library')
variant('lapack', default=True, description='Build with custom LAPACK library')
variant('fft', default=True, description='Build with custom FFT library')
variant('blas', default=True,
description='Build with custom BLAS library')
variant('lapack', default=True,
description='Build with custom LAPACK library')
variant('fft', default=True,
description='Build with custom FFT library')

# Elk does not provide these libraries, but allows you to use them
variant('mpi', default=True, description='Enable MPI parallelism')
variant('openmp', default=True, description='Enable OpenMP support')
variant('libxc', default=True, description='Link to Libxc functional library')
variant('mpi', default=True,
description='Enable MPI parallelism')
variant('openmp', default=True,
description='Enable OpenMP support')
variant('libxc', default=True,
description='Link to Libxc functional library')

depends_on('blas', when='+blas')
depends_on('lapack', when='+lapack')
depends_on('fftw', when='+fft')
depends_on('mpi', when='+mpi')
depends_on('mpi@2:', when='+mpi')
depends_on('libxc', when='+libxc')

# Cannot be built in parallel
parallel = False


def configure(self, spec):
# Dictionary of configuration options
config = {
'MAKE': 'make',
'F90': join_path(spack.build_env_path, 'f90'),
'F77': join_path(spack.build_env_path, 'f77'),
'AR': 'ar',
'LIB_FFT': 'fftlib.a',
'SRC_MPI': 'mpi_stub.f90',
'SRC_OMP': 'omp_stub.f90',
'SRC_libxc': 'libxcifc_stub.f90',
'SRC_FFT': 'zfftifc.f90'
'MAKE': 'make',
'AR': 'ar'
}

# Compiler-specific flags
flags = ''
if self.compiler.name == 'intel':
flags = '-O3 -ip -unroll -no-prec-div -openmp'
if self.compiler.name == 'intel':
flags = '-O3 -ip -unroll -no-prec-div'
elif self.compiler.name == 'gcc':
flags = '-O3 -ffast-math -funroll-loops -fopenmp'
flags = '-O3 -ffast-math -funroll-loops'
elif self.compiler.name == 'pgi':
flags = '-O3 -mp -lpthread'
flags = '-O3 -lpthread'
elif self.compiler.name == 'g95':
flags = '-O3 -fno-second-underscore'
elif self.compiler.name == 'nag':
flags = '-O4 -kind=byte -dusty -dcfuns'
elif self.compiler.name == 'xl':
flags = '-O3 -qsmp=omp'
flags = '-O3'
config['F90_OPTS'] = flags
config['F77_OPTS'] = flags

# BLAS/LAPACK support
# Note: BLAS/LAPACK must be compiled with OpenMP support
# if the +openmp variant is chosen
blas = 'blas.a'
lapack = 'lapack.a'
if '+blas' in spec:
blas = join_path(spec['blas'].prefix.lib, 'libblas.so')
if '+blas' in spec:
blas = spec['blas'].blas_shared_lib
if '+lapack' in spec:
lapack = join_path(spec['lapack'].prefix.lib, 'liblapack.so')
config['LIB_LPK'] = ' '.join([lapack, blas]) # lapack must come before blas
lapack = spec['lapack'].lapack_shared_lib
# lapack must come before blas
config['LIB_LPK'] = ' '.join([lapack, blas])

# FFT support
if '+fft' in spec:
config['LIB_FFT'] = join_path(spec['fftw'].prefix.lib, 'libfftw3.so')
config['LIB_FFT'] = join_path(spec['fftw'].prefix.lib,
'libfftw3.so')
config['SRC_FFT'] = 'zfftifc_fftw.f90'
else:
config['LIB_FFT'] = 'fftlib.a'
config['SRC_FFT'] = 'zfftifc.f90'

# MPI support
if '+mpi' in spec:
config.pop('SRC_MPI')
config['F90'] = join_path(spec['mpi'].prefix.bin, 'mpif90')
config['F77'] = join_path(spec['mpi'].prefix.bin, 'mpif77')
config['F90'] = spec['mpi'].mpifc
config['F77'] = spec['mpi'].mpif77
else:
config['F90'] = join_path(spack.build_env_path, 'f90')
config['F77'] = join_path(spack.build_env_path, 'f77')
config['SRC_MPI'] = 'mpi_stub.f90'

# OpenMP support
if '+openmp' in spec:
config.pop('SRC_OMP')
config['F90_OPTS'] += ' ' + self.compiler.openmp_flag
config['F77_OPTS'] += ' ' + self.compiler.openmp_flag
else:
config['SRC_OMP'] = 'omp_stub.f90'

# Libxc support
if '+libxc' in spec:
Expand All @@ -96,13 +108,14 @@ def configure(self, spec):
'libxc.f90',
'libxcifc.f90'
])
else:
config['SRC_libxc'] = 'libxcifc_stub.f90'

# Write configuration options to include file
with open('make.inc', 'w') as inc:
for key in config:
inc.write('{0} = {1}\n'.format(key, config[key]))


def install(self, spec, prefix):
# Elk only provides an interactive setup script
self.configure(spec)
Expand All @@ -119,4 +132,3 @@ def install(self, spec, prefix):

install_tree('examples', join_path(prefix, 'examples'))
install_tree('species', join_path(prefix, 'species'))

0 comments on commit efe7c64

Please sign in to comment.