summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/quantum-espresso/package.py
diff options
context:
space:
mode:
Diffstat (limited to 'var/spack/repos/builtin/packages/quantum-espresso/package.py')
-rw-r--r--var/spack/repos/builtin/packages/quantum-espresso/package.py175
1 files changed, 175 insertions, 0 deletions
diff --git a/var/spack/repos/builtin/packages/quantum-espresso/package.py b/var/spack/repos/builtin/packages/quantum-espresso/package.py
new file mode 100644
index 0000000000..96bdda65e2
--- /dev/null
+++ b/var/spack/repos/builtin/packages/quantum-espresso/package.py
@@ -0,0 +1,175 @@
+##############################################################################
+# Copyright (c) 2013-2018, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/spack/spack
+# Please also see the NOTICE and LICENSE files for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+import glob
+import os.path
+
+from spack import *
+
+
+class QuantumEspresso(Package):
+ """Quantum-ESPRESSO is an integrated suite of Open-Source computer codes
+ for electronic-structure calculations and materials modeling at the
+ nanoscale. It is based on density-functional theory, plane waves, and
+ pseudopotentials.
+ """
+
+ homepage = 'http://quantum-espresso.org'
+ url = 'https://github.com/QEF/q-e/archive/qe-5.3.tar.gz'
+
+ version(
+ '6.2.0',
+ '972176a58d16ae8cf0c9a308479e2b97',
+ url='https://github.com/QEF/q-e/archive/qe-6.2.0.tar.gz'
+ )
+
+ version(
+ '6.1.0',
+ '3fe861dcb5f6ec3d15f802319d5d801b',
+ url='https://github.com/QEF/q-e/archive/qe-6.1.0.tar.gz'
+ )
+
+ version(
+ '5.4.0',
+ '085f7e4de0952e266957bbc79563c54e',
+ url='https://github.com/QEF/q-e/archive/qe-5.4.tar.gz'
+ )
+
+ version(
+ '5.3.0',
+ 'be3f8778e302cffb89258a5f936a7592',
+ url='https://github.com/QEF/q-e/archive/qe-5.3.tar.gz'
+ )
+
+ variant('mpi', default=True, description='Builds with mpi support')
+ variant('openmp', default=False, description='Enables openMP support')
+ variant('scalapack', default=True, description='Enables scalapack support')
+ variant('elpa', default=True, description='Uses elpa as an eigenvalue solver')
+
+ # Support for HDF5 has been added starting in version 6.1.0 and is
+ # still experimental, therefore we default to False for the variant
+ variant('hdf5', default=False, description='Builds with HDF5 support')
+
+ depends_on('blas')
+ depends_on('lapack')
+ depends_on('mpi', when='+mpi')
+ depends_on('scalapack', when='+scalapack+mpi')
+
+ depends_on('fftw+mpi', when='+mpi')
+ depends_on('fftw~mpi', when='~mpi')
+ depends_on('elpa+openmp', when='+elpa+openmp')
+ depends_on('elpa~openmp', when='+elpa~openmp')
+ depends_on('hdf5', when='+hdf5')
+
+ patch('dspev_drv_elpa.patch', when='@6.1+elpa ^elpa@2016.05.004')
+ patch('dspev_drv_elpa.patch', when='@6.1+elpa ^elpa@2016.05.003')
+
+ # We can't ask for scalapack or elpa if we don't want MPI
+ conflicts(
+ '+scalapack',
+ when='~mpi',
+ msg='scalapack is a parallel library and needs MPI support'
+ )
+
+ conflicts(
+ '+elpa',
+ when='~mpi',
+ msg='elpa is a parallel library and needs MPI support'
+ )
+
+ # Elpa is formally supported by @:5.4.0, but QE configure searches
+ # for it in the wrong folders (or tries to download it within
+ # the build directory). Instead of patching Elpa to provide the
+ # folder QE expects as a link, we issue a conflict here.
+ conflicts('+elpa', when='@:5.4.0')
+ conflicts('+hdf5', when='@:5.4.0')
+
+ # Spurious problems running in parallel the Makefile
+ # generated by the configure
+ parallel = False
+
+ def install(self, spec, prefix):
+
+ prefix_path = prefix.bin if '@:5.4.0' in spec else prefix
+ options = ['-prefix={0}'.format(prefix_path)]
+
+ if '+mpi' in spec:
+ options.append('--enable-parallel=yes')
+ else:
+ options.append('--enable-parallel=no')
+
+ if '+openmp' in spec:
+ options.append('--enable-openmp')
+
+ if '+scalapack' in spec:
+ scalapack_option = 'intel' if '^intel-mkl' in spec else 'yes'
+ options.append('--with-scalapack={0}'.format(scalapack_option))
+
+ if '+elpa' in spec:
+
+ # Spec for elpa
+ elpa = spec['elpa']
+
+ # Find where the Fortran module resides
+ elpa_module = find(elpa.prefix, 'elpa.mod')
+
+ # Compute the include directory from there: versions
+ # of espresso prior to 6.1 requires -I in front of the directory
+ elpa_include = '' if '@6.1:' in spec else '-I'
+ elpa_include += os.path.dirname(elpa_module[0])
+
+ options.extend([
+ '--with-elpa-include={0}'.format(elpa_include),
+ '--with-elpa-lib={0}'.format(elpa.libs[0])
+ ])
+
+ if '+hdf5' in spec:
+ options.append('--with-hdf5={0}'.format(spec['hdf5'].prefix))
+
+ # Add a list of directories to search
+ search_list = []
+ for dependency_spec in spec.dependencies():
+ search_list.extend([
+ dependency_spec.prefix.lib,
+ dependency_spec.prefix.lib64
+ ])
+
+ search_list = " ".join(search_list)
+
+ options.extend([
+ 'LIBDIRS={0}'.format(search_list),
+ 'F90={0}'.format(env['SPACK_FC']),
+ 'CC={0}'.format(env['SPACK_CC'])
+ ])
+
+ configure(*options)
+
+ make('all')
+
+ if 'platform=darwin' in spec:
+ mkdirp(prefix.bin)
+ for filename in glob.glob("bin/*.x"):
+ install(filename, prefix.bin)
+ else:
+ make('install')