siesta: add v4.1.5, v5.0.0 and v5.0.1, add variants and build v5 using cmake (#45518)
Co-authored-by: Bernhard Kaindl <bernhardkaindl7@gmail.com>
This commit is contained in:
		| @@ -5,16 +5,40 @@ | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| import os | import os | ||||||
|  | import shutil | ||||||
| 
 | 
 | ||||||
|  | from spack.build_systems import cmake | ||||||
| from spack.package import * | from spack.package import * | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class Siesta(MakefilePackage): | class Siesta(MakefilePackage, CMakePackage): | ||||||
|     """SIESTA performs electronic structure calculations and ab initio molecular |     """SIESTA performs electronic structure calculations and ab initio molecular | ||||||
|     dynamics simulations of molecules and solids. |     dynamics simulations of molecules and solids. | ||||||
|     """ |     """ | ||||||
| 
 | 
 | ||||||
|  |     build_system( | ||||||
|  |         conditional("cmake", when="@5:"), conditional("makefile", when="@:4"), default="cmake" | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|     homepage = "https://departments.icmab.es/leem/siesta/" |     homepage = "https://departments.icmab.es/leem/siesta/" | ||||||
|  |     git = "https://gitlab.com/siesta-project/siesta" | ||||||
|  | 
 | ||||||
|  |     version( | ||||||
|  |         "5.0.1", | ||||||
|  |         url="https://gitlab.com/siesta-project/siesta/-/archive/5.0.1/siesta-5.0.1.tar.gz", | ||||||
|  |         sha256="800a22a831c1d36c6f5fe4aa9c49ee510cbd49a0b2f87b3c8bf3edb6ebd0193a", | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     version( | ||||||
|  |         "5.0.0", | ||||||
|  |         url="https://gitlab.com/siesta-project/siesta/-/archive/rel-5.0/siesta-rel-5.0.tar.gz", | ||||||
|  |         sha256="0b40c341dfd47e99e7e191189600bbcaadb0f9af03977fefed6a69836bd523e4", | ||||||
|  |     ) | ||||||
|  |     version( | ||||||
|  |         "4.1.5", | ||||||
|  |         url="https://gitlab.com/siesta-project/siesta/-/archive/v4.1.5/siesta-v4.1.5.tar.gz", | ||||||
|  |         sha256="adc88619bf7e17fca2c67ecdcdae1f07ec4b3caf3541c0edf12964c8c330edc9", | ||||||
|  |     ) | ||||||
| 
 | 
 | ||||||
|     license("GPL-3.0-or-later") |     license("GPL-3.0-or-later") | ||||||
| 
 | 
 | ||||||
| @@ -30,17 +54,43 @@ class Siesta(MakefilePackage): | |||||||
|         url="http://departments.icmab.es/leem/siesta/CodeAccess/Code/siesta-3.2-pl-5.tgz", |         url="http://departments.icmab.es/leem/siesta/CodeAccess/Code/siesta-3.2-pl-5.tgz", | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
|     depends_on("c", type="build")  # generated |  | ||||||
|     depends_on("fortran", type="build")  # generated |  | ||||||
| 
 |  | ||||||
|     patch("configure.patch", when="@:4.0") |     patch("configure.patch", when="@:4.0") | ||||||
| 
 | 
 | ||||||
|     depends_on("mpi") |     variant("mpi", default=True, description="Builds with mpi support") | ||||||
|  |     variant("openmp", default=True, description="Enables OpenMP support") | ||||||
|  |     variant("netcdf", default=False, description="Compile with Netcdf") | ||||||
|  |     variant("metis", default=False, description="Activate Metis as a possible ordering library") | ||||||
|  |     variant("elpa", default=False, description="Use ELPA") | ||||||
|  |     variant("mumps", default=False, description="Compile with support for MUMPS solvers") | ||||||
|  |     variant("pexsi", default=False, description="Compile with PEXSI") | ||||||
|  |     variant( | ||||||
|  |         "cray", | ||||||
|  |         default=False, | ||||||
|  |         description="Enable specific cray settings for using cray-hdf5" | ||||||
|  |         " and cray-netcdf modulefiles", | ||||||
|  |     ) | ||||||
|  |     variant("debug", default=False, description="Build in debug  mode") | ||||||
|  |     variant( | ||||||
|  |         "build_type", | ||||||
|  |         default="Release", | ||||||
|  |         description="The build type to build", | ||||||
|  |         values=("Debug", "Release", "RelWithDebInfo", "MinSizeRel", "check"), | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     depends_on("mpi", when="+mpi") | ||||||
|     depends_on("blas") |     depends_on("blas") | ||||||
|     depends_on("lapack") |     depends_on("lapack") | ||||||
|     depends_on("scalapack") |     depends_on("scalapack", when="+mpi") | ||||||
|     depends_on("netcdf-c") |     depends_on("netcdf-c") | ||||||
|     depends_on("netcdf-fortran") |     depends_on("netcdf-fortran") | ||||||
|  |     depends_on("cray-libsci+openmp", when="^[virtuals=cray-libsci] cray-libsci") | ||||||
|  |     depends_on("metis@5:", when="+metis") | ||||||
|  |     depends_on("elpa", when="+elpa") | ||||||
|  |     depends_on("mumps", when="+mumps") | ||||||
|  |     depends_on("pexsi", when="+pexsi") | ||||||
|  | 
 | ||||||
|  |     with when("build_system=cmake"): | ||||||
|  |         depends_on("cmake@3.20:", type="build") | ||||||
| 
 | 
 | ||||||
|     def flag_handler(self, name, flags): |     def flag_handler(self, name, flags): | ||||||
|         if "%gcc@10:" in self.spec and name == "fflags": |         if "%gcc@10:" in self.spec and name == "fflags": | ||||||
| @@ -49,49 +99,210 @@ def flag_handler(self, name, flags): | |||||||
| 
 | 
 | ||||||
|     def edit(self, spec, prefix): |     def edit(self, spec, prefix): | ||||||
|         sh = which("sh") |         sh = which("sh") | ||||||
|         configure_args = [ |         if "+cray" in spec: | ||||||
|             "--enable-mpi", |             netcdff_prefix = os.environ.get("NETCDF_DIR", "") | ||||||
|             "--with-blas=%s" % spec["blas"].libs, |             hdf5_prefix = os.environ.get("HDF5_DIR", "") | ||||||
|             "--with-lapack=%s" % spec["lapack"].libs, |         if spec.satisfies("@:4.0.2 +mpi"): | ||||||
|             # need to include BLAS below because Intel MKL's |             configure_args = [ | ||||||
|             # BLACS depends on BLAS, otherwise the compiler |                 "--enable-mpi", | ||||||
|             # test fails |                 "--with-blas=%s" % spec["blas"].libs, | ||||||
|             "--with-blacs=%s" % (spec["scalapack"].libs + spec["blas"].libs), |                 "--with-lapack=%s" % spec["lapack"].libs, | ||||||
|             "--with-scalapack=%s" % spec["scalapack"].libs, |                 # need to include BLAS below because Intel MKL's | ||||||
|             "--with-netcdf=%s" % (spec["netcdf-fortran"].libs + spec["netcdf-c"].libs), |                 # BLACS depends on BLAS, otherwise the compiler | ||||||
|             # need to specify MPIFC explicitly below, otherwise |                 # test fails | ||||||
|             # Intel's mpiifort is not found |                 "--with-blacs=%s" % (spec["scalapack"].libs + spec["blas"].libs), | ||||||
|             "MPIFC=%s" % spec["mpi"].mpifc, |                 "--with-scalapack=%s" % spec["scalapack"].libs, | ||||||
|         ] |                 # need to specify MPIFC explicitly below, otherwise | ||||||
|         if self.spec.satisfies("%gcc"): |                 # Intel's mpiifort is not found | ||||||
|             configure_args.append("FCFLAGS=-ffree-line-length-0") |                 "MPIFC=%s" % spec["mpi"].mpifc, | ||||||
|         for d in ["Obj", "Obj_trans"]: |             ] | ||||||
|             with working_dir(d, create=True): |             if "+cray" in spec: | ||||||
|                 sh("../Src/configure", *configure_args) |                 configure_args += ["--with-netcdf={0}/lib/libnetcdff.so".format(netcdff_prefix)] | ||||||
|                 if spec.satisfies("@:4.0%intel"): |             else: | ||||||
|                     with open("arch.make", "a") as f: |                 configure_args += [ | ||||||
|                         f.write("\natom.o: atom.F\n") |                     "--with-netcdf=%s" % (spec["netcdf-fortran"].libs + spec["netcdf-c"].libs) | ||||||
|                         f.write("\t$(FC) -c $(FFLAGS) -O1") |                 ] | ||||||
|                         f.write("$(INCFLAGS) $(FPPFLAGS) $<") | 
 | ||||||
|  |             if self.spec.satisfies("%gcc"): | ||||||
|  |                 if "+cray" in spec: | ||||||
|  |                     configure_args.append( | ||||||
|  |                         "FCFLAGS=-ffree-line-length-0 -I{0}/include".format(netcdff_prefix) | ||||||
|  |                     ) | ||||||
|  |                 else: | ||||||
|  |                     configure_args.append("FCFLAGS=-ffree-line-length-0") | ||||||
|  |             for d in ["Obj", "Obj_trans"]: | ||||||
|  |                 with working_dir(d, create=True): | ||||||
|  |                     sh("../Src/configure", *configure_args) | ||||||
|  |                     if spec.satisfies("@:4.0%intel"): | ||||||
|  |                         with open("arch.make", "a") as f: | ||||||
|  |                             f.write("\natom.o: atom.F\n") | ||||||
|  |                             f.write("\t$(FC) -c $(FFLAGS) -O1") | ||||||
|  |                             f.write("$(INCFLAGS) $(FPPFLAGS) $<") | ||||||
|  |                     sh("../Src/obj_setup.sh") | ||||||
|  | 
 | ||||||
|  |         elif self.spec.satisfies("@:4.1.5"): | ||||||
|  |             with working_dir("Obj", create=True): | ||||||
|                 sh("../Src/obj_setup.sh") |                 sh("../Src/obj_setup.sh") | ||||||
|  |                 if spec.satisfies("@:4.1.5%gcc"): | ||||||
|  |                     shutil.copy("./gfortran.make", "./arch.make") | ||||||
|  |                     libs_arg = [] | ||||||
|  |                     fppflags_arg = [] | ||||||
|  |                     arch_make = FileFilter("./arch.make") | ||||||
|  |                     arch_make.filter( | ||||||
|  |                         "FFLAGS = .*", | ||||||
|  |                         "FFLAGS = {0}".format( | ||||||
|  |                             "-O2 -fPIC -ftree-vectorize -fallow-argument-mismatch" | ||||||
|  |                         ), | ||||||
|  |                     ) | ||||||
|  | 
 | ||||||
|  |                     if "+debug" in spec: | ||||||
|  |                         arch_make.filter("FFLAGS_DEBUG=.*", "FFLAGS_DEBUG= -g -O1") | ||||||
|  | 
 | ||||||
|  |                     if "^cray-libsci" in spec: | ||||||
|  |                         libs_arg.append("-L{0}/lib -lsci_gnu".format(spec["cray-libsci"].prefix)) | ||||||
|  | 
 | ||||||
|  |                     with open("arch.make", "a") as f: | ||||||
|  |                         if "+mpi" in spec: | ||||||
|  |                             arch_make.filter("CC = .*", "CC = {0}".format(spec["mpi"].mpicc)) | ||||||
|  |                             arch_make.filter("FC = .*", "FC = {0}".format(spec["mpi"].mpifc)) | ||||||
|  |                             if "^cray-libsci" in spec: | ||||||
|  |                                 libs_arg.append("-lsci_gnu_mpi") | ||||||
|  |                             f.write("MPI_INTERFACE = libmpi_f90.a\n") | ||||||
|  |                             f.write("MPI_INCLUDE = .\n") | ||||||
|  |                             f.write("LIBS += " + spec["scalapack"].libs.ld_flags + "\n") | ||||||
|  |                             fppflags_arg.append("-DMPI ") | ||||||
|  | 
 | ||||||
|  |                         if "+openmp" in spec: | ||||||
|  |                             f.write("FFLAGS += -fopenmp\n") | ||||||
|  |                             f.write("LIBS += -fopenmp\n") | ||||||
|  | 
 | ||||||
|  |                         if "+netcdf" in spec: | ||||||
|  |                             if "+cray" in spec: | ||||||
|  |                                 libs_arg.append( | ||||||
|  |                                     "-L{0}/lib -lnetcdff -lnetcdf".format(netcdff_prefix) | ||||||
|  |                                 ) | ||||||
|  |                                 libs_arg.append( | ||||||
|  |                                     "-L{0}/lib -lhdf5_fortran -lhdf5".format(hdf5_prefix) | ||||||
|  |                                 ) | ||||||
|  |                             else: | ||||||
|  |                                 libs_arg.append( | ||||||
|  |                                     "-L{0}/lib -lnetcdff -lnetcdf".format( | ||||||
|  |                                         spec["netcdf-fortran"].prefix | ||||||
|  |                                     ) | ||||||
|  |                                 ) | ||||||
|  |                                 libs_arg.append( | ||||||
|  |                                     "-L{0}/lib -lhdf5_fortran -lhdf5".format(spec["hdf5"].prefix) | ||||||
|  |                                 ) | ||||||
|  | 
 | ||||||
|  |                         if "+metis" in spec: | ||||||
|  |                             libs_arg.append("-L{0} -lmetis".format(self.spec["metis"].prefix.lib)) | ||||||
|  |                             fppflags_arg.append("-DSIESTA__METIS ") | ||||||
|  | 
 | ||||||
|  |                         if "elpa" in spec: | ||||||
|  |                             elpa = spec["elpa"] | ||||||
|  |                             elpa_suffix = "_openmp" if "+openmp" in elpa else "" | ||||||
|  |                             elpa_incdir = elpa.headers.directories[0] | ||||||
|  |                             libs_arg.append( | ||||||
|  |                                 "-L{0} -lelpa{1}".format(self.spec["elpa"].prefix.lib, elpa_suffix) | ||||||
|  |                             ) | ||||||
|  |                             fppflags_arg.append( | ||||||
|  |                                 "-DSIESTA__ELPA  -I{0}".format(join_path(elpa_incdir, "modules")) | ||||||
|  |                             ) | ||||||
|  | 
 | ||||||
|  |                         if "mumps" in spec: | ||||||
|  |                             libs_arg.append( | ||||||
|  |                                 "-L{0} -lmumps_common -lzmumps".format( | ||||||
|  |                                     self.spec["mumps"].prefix.lib | ||||||
|  |                                 ) | ||||||
|  |                             ) | ||||||
|  |                             fppflags_arg.append("-DSIESTA__MUMPS ") | ||||||
|  | 
 | ||||||
|  |                         if "+pexsi" in spec: | ||||||
|  |                             libs_arg.append( | ||||||
|  |                                 "-L{0} -lpexsi_linux".format(self.spec["pexsi"].prefix.lib) | ||||||
|  |                             ) | ||||||
|  |                             fppflags_arg.append("-DSIESTA__PEXSI ") | ||||||
|  |                             f.write("INCFLAGS += -I{0}/include".format(self.spec["pexsi"].prefix)) | ||||||
|  | 
 | ||||||
|  |                         arch_make.filter("^LIBS =.*", "LIBS = {0}".format(" ".join(libs_arg))) | ||||||
|  |                         f.write("FPPFLAGS = {0}".format(" ".join(fppflags_arg))) | ||||||
| 
 | 
 | ||||||
|     def build(self, spec, prefix): |     def build(self, spec, prefix): | ||||||
|         with working_dir("Obj"): |         with working_dir("Obj"): | ||||||
|             make(parallel=False) |             make(parallel=False) | ||||||
|         with working_dir("Obj_trans"): |         if spec.satisfies("@:4.0.2"): | ||||||
|             make("transiesta", parallel=False) |             with working_dir("Obj_trans"): | ||||||
|         with working_dir("Util"): |                 make("transiesta", parallel=False) | ||||||
|             sh = which("sh") |             with working_dir("Util"): | ||||||
|             sh("build_all.sh") |                 sh = which("sh") | ||||||
|  |                 sh("build_all.sh") | ||||||
| 
 | 
 | ||||||
|     def install(self, spec, prefix): |     def install(self, spec, prefix): | ||||||
|         mkdir(prefix.bin) |         mkdir(prefix.bin) | ||||||
|         with working_dir("Obj"): |         with working_dir("Obj"): | ||||||
|             install("siesta", prefix.bin) |             install("siesta", prefix.bin) | ||||||
|         with working_dir("Obj_trans"): |         if spec.satisfies("@:4.0.2"): | ||||||
|             install("transiesta", prefix.bin) |             with working_dir("Obj_trans"): | ||||||
|  |                 install("transiesta", prefix.bin) | ||||||
|         for root, _, files in os.walk("Util"): |         for root, _, files in os.walk("Util"): | ||||||
|             for fname in files: |             for fname in files: | ||||||
|                 fname = join_path(root, fname) |                 fname = join_path(root, fname) | ||||||
|                 if os.access(fname, os.X_OK): |                 if os.access(fname, os.X_OK): | ||||||
|                     install(fname, prefix.bin) |                     install(fname, prefix.bin) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class CMakeBuilder(cmake.CMakeBuilder): | ||||||
|  |     """Use the new CMake build system to build siesta@5.0.0:.""" | ||||||
|  | 
 | ||||||
|  |     def cmake_args(self): | ||||||
|  |         spec = self.spec | ||||||
|  |         args = [] | ||||||
|  | 
 | ||||||
|  |         args += ["-DBLAS_LIBRARIES={0}".format(self.spec["blas"].libs.link_flags)] | ||||||
|  |         args += ["-DLAPACK_LIBRARIES={0}".format(self.spec["lapack"].libs.link_flags)] | ||||||
|  | 
 | ||||||
|  |         if "+mpi" in spec: | ||||||
|  |             args += [ | ||||||
|  |                 "-DCMAKE_C_COMPILER=%s" % spec["mpi"].mpicc, | ||||||
|  |                 "-DCMAKE_CXX_COMPILER=%s" % spec["mpi"].mpicxx, | ||||||
|  |                 "-DCMAKE_Fortran_COMPILER=%s" % spec["mpi"].mpifc, | ||||||
|  |             ] | ||||||
|  |             args += ["-DSIESTA_WITH_MPI=ON"] | ||||||
|  |             args += ["-DSCALAPACK_LIBRARY={0}".format(spec["scalapack"].libs.joined(";"))] | ||||||
|  | 
 | ||||||
|  |         if "+openmp" in spec: | ||||||
|  |             args += ["-DSIESTA_WITH_OPENMP=ON"] | ||||||
|  |             if "+cray" in spec: | ||||||
|  |                 args += ["-DFortran_FLAGS=-fopenmp"] | ||||||
|  | 
 | ||||||
|  |         if "build_type=Debug" in spec: | ||||||
|  |             args += [ | ||||||
|  |                 "-DFortran_FLAGS=-Og -g -Wall -fcheck=all -fbacktrace" | ||||||
|  |                 " -Warray-bounds -Wunused -Wuninitialized" | ||||||
|  |             ] | ||||||
|  |         else: | ||||||
|  |             args += ["-DFortran_FLAGS=-O2 -fPIC -ftree-vectorize  -fallow-argument-mismatch"] | ||||||
|  | 
 | ||||||
|  |         if "+netcdf" in spec: | ||||||
|  |             args += ["-DSIESTA_WITH_NETCDF=ON"] | ||||||
|  |             if "+cray" in spec: | ||||||
|  |                 args += ["-DNetCDF_PATH={0}".format(os.environ.get("NETCDF_DIR", ""))] | ||||||
|  |             else: | ||||||
|  |                 args += ["-DNetCDF_PATH={0}".format(spec["netcdf-fortran"].prefix)] | ||||||
|  | 
 | ||||||
|  |         if "+elpa" in spec: | ||||||
|  |             args += ["-DSIESTA_WITH_ELPA=ON"] | ||||||
|  | 
 | ||||||
|  |         if "+mumps" in spec: | ||||||
|  |             args += ["-DSIESTA__MUMPS=ON"] | ||||||
|  |             args += [ | ||||||
|  |                 "-DSIESTA_LINKER_FLAGS=-L{0} -lmumps_common -lzmumps".format( | ||||||
|  |                     self.spec["mumps"].prefix.lib | ||||||
|  |                 ) | ||||||
|  |             ] | ||||||
|  | 
 | ||||||
|  |         if "+metis" in spec: | ||||||
|  |             args += ["-DSIESTA__METIS=ON"] | ||||||
|  |             args += ["-DSIESTA_LINKER_FLAGS=-L{0} -lmetis".format(self.spec["metis"].prefix.lib)] | ||||||
|  | 
 | ||||||
|  |         return args | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 BOUDAOUD34
					BOUDAOUD34