Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ZEN-27471: PKG/SPEC - sdsc-0.17.3 - Update VASP to support v6.4.x #51

Open
mkandes opened this issue Mar 23, 2023 · 19 comments
Open

ZEN-27471: PKG/SPEC - sdsc-0.17.3 - Update VASP to support v6.4.x #51

mkandes opened this issue Mar 23, 2023 · 19 comments

Comments

@mkandes
Copy link
Member

mkandes commented Mar 23, 2023

No description provided.

@mkandes mkandes changed the title ZEN-27471: PKG - sdsc-0.17.3 - Update VASP to support v6.4.0 ZEN-27471: PKG/SPEC - sdsc-0.17.3 - Update VASP to support v6.4.0 Jun 16, 2023
@mkandes
Copy link
Member Author

mkandes commented Oct 18, 2023

A number of tickets have come in recently looking for an update to VASP v6.4.2 with Wannier90 integration.

@jerrypgreenberg updated his latest VASP v6.4.x Spack package to support these requests and has run build (and presumably runtime) tests successfully on Expanse. I am deploying the updated vasp6 package and spec build(s) into the expanse/0.17.3/cpu/b production instance now.

@mkandes
Copy link
Member Author

mkandes commented Oct 18, 2023

This is the current spack info vasp6 prior to deploying the updated package.

[mkandes@login02 ~]$ spack info vasp6
MakefilePackage:   vasp6

Description:
     The Vienna Ab initio Simulation Package (VASP) is a computer program
    for atomic scale materials modelling, e.g. electronic structure
    calculations and quantum-mechanical molecular dynamics, from first
    principles.

Homepage: https://vasp.at

Externally Detectable: 
    False

Tags: 
    None

Preferred version:  
    6.3.2        file:///home/mkandes/vasp.6.3.2.tgz

Safe versions:  
    6.3.2        file:///home/mkandes/vasp.6.3.2.tgz
    6.2.1        file:///home/mkandes/vasp.6.2.1.tgz
    6.2.0        file:///home/mkandes/vasp.6.2.0.tgz
    6.1.1        file:///home/mkandes/vasp.6.1.1.tgz
    5.4.4.pl2    file:///home/mkandes/vasp.5.4.4.pl2.tgz
    5.4.4        file:///home/mkandes/vasp.5.4.4.tgz

Deprecated versions:  
    None

Variants:
    Name [Default]     When    Allowed values    Description
    ===============    ====    ==============    =====================================

    cuda [off]         --      on, off           Enables running on Nvidia GPUs
    openmp [off]       --      on, off           Enable openmp build
    scalapack [off]    --      on, off           Enables build with SCALAPACK
    shmem [on]         --      on, off           Enable use_shmem build flag
    vaspsol [off]      --      on, off           Enable VASPsol implicit solvation
                                                 model
                                                 https://github.com/henniggroup/VASPso
                                                 l

Installation Phases:
    edit    build    install

Build Dependencies:
    blas  cuda  fftw-api  lapack  mpi  qd  rsync  scalapack

Link Dependencies:
    blas  cuda  fftw-api  lapack  mpi  qd  scalapack

Run Dependencies:
    mpi

Virtual Packages: 
    None

[mkandes@login02 ~]$

@mkandes
Copy link
Member Author

mkandes commented Oct 18, 2023

Here is the diff prior to update.

[spack_cpu@exp-15-56 vasp6]$ pwd
/cm/shared/apps/spack/0.17.3/cpu/b/var/spack/repos/sdsc/packages/vasp6
[spack_cpu@exp-15-56 vasp6]$ ls -lahtr
total 9.5K
-rw-r--r--  1 spack_cpu spack 9.1K Apr 15  2023 package.py
drwxr-sr-x 35 spack_cpu spack   33 Sep 26 13:32 ..
drwxr-sr-x  2 spack_cpu spack    1 Oct 18 09:48 .
[spack_cpu@exp-15-56 vasp6]$ ls -lahtr /home/jpg/.spack/0.17.3/var/spack/repos/jpg/packages/vasp
total 712K
drwxr-xr-x 3 jpg use300 224K Oct  4 11:08 ..
-rw-r--r-- 1 jpg use300  11K Oct  4 19:38 package.py
drwxr-xr-x 2 jpg use300 224K Oct  4 19:39 __pycache__
drwxr-xr-x 3 jpg use300 224K Oct 16 21:58 .
[spack_cpu@exp-15-56 vasp6]$ diff package.py /home/jpg/.spack/0.17.3/var/spack/repos/jpg/packages/vasp/package.py
1c1
< # Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
---
> # Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
6a7
> import glob
11c12
< class Vasp6(MakefilePackage):
---
> class Vasp(MakefilePackage):
20c21
<     url = "file://{0}/vasp.5.4.4.pl2.tgz".format(os.getcwd())
---
>     url      = "file://{0}/vasp.5.4.4.pl2.tgz".format(os.getcwd())
23,65c24,60
<     version("6.3.2", sha256="f7595221b0f9236a324ea8afe170637a578cdd5a837cc7679e7f7812f6edf25a")
<     version("6.2.1", sha256="d25e2f477d83cb20fce6a2a56dcee5dccf86d045dd7f76d3ae19af8343156a13")
<     version("6.2.0", sha256="49e7ba351bd634bc5f5f67a8ef1e38e64e772857a1c02f602828898a84197e25")
<     version("6.1.1", sha256="e37a4dfad09d3ad0410833bcd55af6b599179a085299026992c2d8e319bf6927")
<     version("5.4.4.pl2", sha256="98f75fd75399a23d76d060a6155f4416b340a1704f256a00146f89024035bc8e")
<     version("5.4.4", sha256="5bd2449462386f01e575f9adf629c08cb03a13142806ffb6a71309ca4431cfb3")
< 
<     resource(
<         name="vaspsol",
<         git="https://github.com/henniggroup/VASPsol.git",
<         tag="V1.0",
<         when="+vaspsol",
<     )
< 
<     variant("openmp", default=False, description="Enable openmp build")
< 
<     variant("scalapack", default=False, description="Enables build with SCALAPACK")
< 
<     variant("cuda", default=False, description="Enables running on Nvidia GPUs")
< 
<     variant(
<         "vaspsol",
<         default=False,
<         description="Enable VASPsol implicit solvation model\n"
<         "https://github.com/henniggroup/VASPsol",
<     )
< 
<     variant("shmem", default=True, description="Enable use_shmem build flag")
< 
<     depends_on("rsync", type="build")
<     depends_on("blas")
<     depends_on("lapack")
<     depends_on("fftw-api")
<     depends_on("mpi", type=("build", "link", "run"))
<     depends_on("scalapack", when="+scalapack")
<     depends_on("cuda", when="+cuda")
<     depends_on("qd", when="%nvhpc")
< 
<     conflicts(
<         "%gcc@:8", msg="GFortran before 9.x does not support all features needed to build VASP"
<     )
<     conflicts("+vaspsol", when="+cuda", msg="+vaspsol only available for CPU")
<     conflicts("+openmp", when="@:6.1.1", msg="openmp support started from 6.2")
---
>     version('6.4.2', sha256='b704637f7384673f91adfbc803edc5cc7fe736d9623453461f7cdc29b123410e')
> 
>     resource(name='vaspsol',
>              git='https://github.com/henniggroup/VASPsol.git',
>              tag='V1.0',
>              when='+vaspsol')
> 
>     variant('openmp', default=False,
>             description='Enable openmp build')
> 
>     variant('scalapack', default=False,
>             description='Enables build with SCALAPACK')
> 
>     variant('acc', default=False,
>             description='Enables running on Nvidia GPUs')
> 
>     variant('vaspsol', default=False,
>             description='Enable VASPsol implicit solvation model\n'
>             'https://github.com/henniggroup/VASPsol')
>     variant('wannier90', default=False,
>             description='Enable wannier90\n')
> 
>  
> 
> 
>     depends_on('rsync', type='build')
>     depends_on('blas')
>     depends_on('lapack')
>     depends_on('fftw-api')
>     depends_on('mpi', type=('build', 'link', 'run'))
>     depends_on('scalapack', when='+scalapack')
>     depends_on('qd', when='%nvhpc')
>     depends_on('wannier90', when='+wannier90')
> 
>     conflicts('%gcc@:8', msg='GFortran before 9.x does not support all features needed to build VASP')
>     conflicts('+vaspsol', when='acc', msg='+vaspsol only available for CPU')
>     conflicts('+openmp', when='@:6.1.1', msg='openmp support started from 6.2')
70,72c65,74
<         if "%gcc" in spec:
<             if "+openmp" in spec:
<                 make_include = join_path("arch", "makefile.include.linux_gnu_omp")
---
> 
>         if '%gcc' in spec:
>             if '+openmp' in spec:
>                 if spec['mpi'].name == "openmpi":
>                     if spec['blas'].name == "intel-mkl":
>                         make_include='makefile.include.gnu_ompi_mkl_omp'
>                     else:
>                         sys.exit("makefile does not exist")
>                 else:
>                     make_include = join_path('arch', 'makefile.include.gnu_omp')
74,86c76,93
<                 make_include = join_path("arch", "makefile.include.linux_gnu")
<         elif "%nvhpc" in spec:
<             make_include = join_path("arch", "makefile.include.linux_pgi")
<             filter_file("-pgc++libs", "-c++libs", make_include, string=True)
<             filter_file("pgcc", spack_cc, make_include)
<             filter_file("pgc++", spack_cxx, make_include, string=True)
<             filter_file("pgfortran", spack_fc, make_include)
<             filter_file(
<                 "/opt/pgi/qd-2.3.17/install/include", spec["qd"].prefix.include, make_include
<             )
<             filter_file("/opt/pgi/qd-2.3.17/install/lib", spec["qd"].prefix.lib, make_include)
<         elif "%aocc" in spec:
<             if "+openmp" in spec:
---
>                 make_include = join_path('arch', 'makefile.include.gnu')
>         elif '%nvhpc' in spec:
>             if spec['blas'].name == 'intel-mkl' :
>                 if spec['mpi'].name == "openmpi":
>                     if '+acc' in spec:         
>                         make_include = join_path('arch','makefile.include.makefile.include.nvhpc_ompi_mkl_omp_acc')
>                     else:
>                         make_include = join_path('arch','makefile.include.makefile.include.nvhpc_ompi_mkl_omp')
>                 else:
>                     sys.exit('makefile does not exist')
>             else:
>                 if '+acc' in spec:         
>                     if '+openmp' in spec:
>                         make_include = join_path('arch','makefile.include.nvhpc_omp_acc')
>                     else:
>                         make_include = join_path('arch','makefile.include.nvhpc_acc')
>         elif '%aocc' in spec:
>             if '+openmp' in spec:
88,89c95,96
<                     join_path("arch", "makefile.include.linux_gnu_omp"),
<                     join_path("arch", "makefile.include.linux_aocc_omp"),
---
>                     join_path('arch', 'makefile.include.gnu_omp'),
>                     join_path('arch', 'makefile.include.aocc_omp')
91c98
<                 make_include = join_path("arch", "makefile.include.linux_aocc_omp")
---
>                 make_include = join_path('arch', 'makefile.include.aocc_omp')
94,95c101,102
<                     join_path("arch", "makefile.include.linux_gnu"),
<                     join_path("arch", "makefile.include.linux_aocc"),
---
>                     join_path('arch', 'makefile.include.gnu'),
>                     join_path('arch', 'makefile.include.aocc')
97,102c104
<                 make_include = join_path("arch", "makefile.include.linux_aocc")
<             filter_file("gcc", "{0} {1}".format(spack_cc, "-Mfree"), make_include, string=True)
<             filter_file("g++", spack_cxx, make_include, string=True)
<             filter_file("^CFLAGS_LIB[ ]{0,}=.*$", "CFLAGS_LIB = -O3", make_include)
<             filter_file("^FFLAGS_LIB[ ]{0,}=.*$", "FFLAGS_LIB = -O2", make_include)
<             filter_file("^OFLAG[ ]{0,}=.*$", "OFLAG = -O3", make_include)
---
>                 make_include = join_path('arch', 'makefile.include.aocc')
104,107c106,107
<                 "^FC[ ]{0,}=.*$", "FC = {0}".format(spec["mpi"].mpifc), make_include, string=True
<             )
<             filter_file(
<                 "^FCL[ ]{0,}=.*$", "FCL = {0}".format(spec["mpi"].mpifc), make_include, string=True
---
>                 'gcc', '{0} {1}'.format(spack_cc, '-Mfree'),
>                 make_include, string=True
108a109,121
>             filter_file('g++', spack_cxx, make_include, string=True)
>             filter_file('^CFLAGS_LIB[ ]{0,}=.*$',
>                         'CFLAGS_LIB = -O3', make_include)
>             filter_file('^FFLAGS_LIB[ ]{0,}=.*$',
>                         'FFLAGS_LIB = -O2', make_include)
>             filter_file('^OFLAG[ ]{0,}=.*$',
>                         'OFLAG = -O3', make_include)
>             filter_file('^FC[ ]{0,}=.*$',
>                         'FC = {0}'.format(spec['mpi'].mpifc),
>                         make_include, string=True)
>             filter_file('^FCL[ ]{0,}=.*$',
>                         'FCL = {0}'.format(spec['mpi'].mpifc),
>                         make_include, string=True)
110,113c123,133
<             if "+openmp" in spec:
<                 make_include = join_path(
<                     "arch", "makefile.include.linux_{0}_omp".format(spec.compiler.name)
<                 )
---
>             if '+openmp' in spec:
>                 if spec['mpi'].name == "openmpi":
>                     if spec['blas'].name == "intel-mkl":
>                         make_include = join_path('arch', 'makefile.include.intel_ompi_mkl_omp')
>                     else:
>                         sys.exit('makefile does not exist')
>                 else:
>                     if spec['blas'].name != "intel-mkl":
>                         sys.exit('makefile does not exist')
>                     else:
>                         make_include = join_path('arch', 'makefile.include.intel_omp')
115c135,139
<                 make_include = join_path("arch", "makefile.include.linux_" + spec.compiler.name)
---
>                 make_include = join_path('arch', 'makefile.include.intel')
>           
>          
>             
>         os.rename(make_include, 'makefile.include')
117,121c141,143
<         # Recent versions of vasp have renamed the makefile.include files
<         # to leave out the linux_ string
<         if not os.path.exists(make_include):
<             make_include = make_include.replace("linux_", "")
<         os.rename(make_include, "makefile.include")
---
>         if '+wannier90' in spec:
>             filter_file('^#WANNIER90_ROOT*','WANNIER90_ROOT = '+spec['wannier90'].prefix,'makefile.include')
>             filter_file('^#LLIBS.*wannier.*','LLIBS          += -L'+spec['wannier90'].prefix+'/lib -lwannier','makefile.include')
123,126d144
<         # This bunch of 'filter_file()' is to make these options settable
<         # as environment variables
<         filter_file("^CPP_OPTIONS[ ]{0,}=[ ]{0,}", "CPP_OPTIONS ?= ", "makefile.include")
<         filter_file("^FFLAGS[ ]{0,}=[ ]{0,}", "FFLAGS ?= ", "makefile.include")
128,137d145
<         filter_file("^LIBDIR[ ]{0,}=.*$", "", "makefile.include")
<         filter_file("^BLAS[ ]{0,}=.*$", "BLAS ?=", "makefile.include")
<         filter_file("^LAPACK[ ]{0,}=.*$", "LAPACK ?=", "makefile.include")
<         filter_file("^FFTW[ ]{0,}?=.*$", "FFTW ?=", "makefile.include")
<         filter_file("^MPI_INC[ ]{0,}=.*$", "MPI_INC ?=", "makefile.include")
<         filter_file("-DscaLAPACK.*$\n", "", "makefile.include")
<         filter_file("^SCALAPACK[ ]{0,}=.*$", "SCALAPACK ?=", "makefile.include")
< 
<         if "+cuda" in spec:
<             filter_file("^OBJECTS_GPU[ ]{0,}=.*$", "OBJECTS_GPU ?=", "makefile.include")
139c147,149
<             filter_file("^CPP_GPU[ ]{0,}=.*$", "CPP_GPU ?=", "makefile.include")
---
>         if '%intel' in spec:
>             filter_file('qmkl','mkl','makefile.include')
>             filter_file('^VASP_TARGET_CPU.*','VASP_TARGET_CPU = -march=core-avx2','makefile.include')
141c151
<             filter_file("^CFLAGS[ ]{0,}=.*$", "CFLAGS ?=", "makefile.include")
---
>         filter_file('OBJECTS_LIB = linpack_double.o','OBJECTS_LIB = linpack_double.o getshmem.o','makefile.include')
143,144c153,178
<         if "+vaspsol" in spec:
<             copy("VASPsol/src/solvation.F", "src/")
---
>         # This bunch of 'filter_file()' is to make these options settable
>         # as environment variables
>         filter_file('^CPP_OPTIONS[ ]{0,}=[ ]{0,}',
>                     'CPP_OPTIONS ?= ',
>                     'makefile.include')
>         filter_file('^FFLAGS[ ]{0,}=[ ]{0,}',
>                     'FFLAGS ?= ',
>                     'makefile.include')
> 
>         filter_file('^LIBDIR[ ]{0,}=.*$', '', 'makefile.include')
>         filter_file('^BLAS[ ]{0,}=.*$', 'BLAS ?=', 'makefile.include')
>         filter_file('^LAPACK[ ]{0,}=.*$', 'LAPACK ?=', 'makefile.include')
>         filter_file('^FFTW[ ]{0,}?=.*$', 'FFTW ?=', 'makefile.include')
>         filter_file('^MPI_INC[ ]{0,}=.*$', 'MPI_INC ?=', 'makefile.include')
>         filter_file('-DscaLAPACK.*$\n', '', 'makefile.include')
>         filter_file('^SCALAPACK[ ]{0,}=.*$', 'SCALAPACK ?=', 'makefile.include')
> 
>         if '+vaspsol' in spec:
>             copy('VASPsol/src/solvation.F', 'src/')
> 
>         if spec['blas'].name == 'intel-mkl':
>             filter_file(r'INCS.*=.*FFTW.*/include','INCS = -I'+join_path(spec['intel-mkl'].prefix,'compilers_and_libraries_'+str(spec['intel-mkl'].version),'linux','mkl','include','fftw'),'makefile.include')
>             filter_file(r'LLIBS.*lfftw3.*','','makefile.include')
> 
>         if '+acc' in spec:
>             filter_file('cuda11.0','cuda11.5','makefile.include')
149,166c183,191
<         cpp_options = [
<             "-DMPI -DMPI_BLOCK=8000",
<             "-Duse_collective",
<             "-DCACHE_SIZE=4000",
<             "-Davoidalloc",
<             "-Duse_bse_te",
<             "-Dtbdyn",
<         ]
< 
<         if "+shmem" in spec:
<             cpp_options.append("-Duse_shmem")
< 
<         if "%nvhpc" in self.spec:
<             cpp_options.extend(['-DHOST=\\"LinuxPGI\\"', "-DPGI16", "-Dqd_emulate"])
<         elif "%aocc" in self.spec:
<             cpp_options.extend(['-DHOST=\\"LinuxGNU\\"', "-Dfock_dblbuf"])
<             if "+openmp" in self.spec:
<                 cpp_options.extend(["-D_OPENMP"])
---
>         cpp_options = ['-DMPI -DMPI_BLOCK=8000',
>                        '-Duse_collective', '-DCACHE_SIZE=4000',
>                        '-Davoidalloc', '-Duse_bse_te',
>                        '-Dtbdyn', '-Duse_shmem','-Dfock_dblbuf']
>         if '+openmp' in spec:
>             cpp_options.extend(['-D_OPENMP'])
>         if '%aocc' in spec:
>             cpp_options.extend(['-DHOST=\\"LinuxGNU\\"',
>                                 '-Dfock_dblbuf'])
170,171c195,196
<         if self.spec.satisfies("@6:"):
<             cpp_options.append("-Dvasp6")
---
>         if spec.satisfies('@6:'):
>             cpp_options.append('-Dvasp6')
173c198
<         cflags = ["-fPIC", "-DADD_"]
---
>         cflags = ['-fPIC', '-DADD_']
175,214c200,226
<         if "%gcc" in spec or "%intel" in spec:
<             fflags.append("-w")
<         elif "%nvhpc" in spec:
<             fflags.extend(["-Mnoupcase", "-Mbackslash", "-Mlarge_arrays"])
<         elif "%aocc" in spec:
<             fflags.extend(["-fno-fortran-main", "-Mbackslash", "-ffast-math"])
< 
<         spack_env.set("BLAS", spec["blas"].libs.ld_flags)
<         spack_env.set("LAPACK", spec["lapack"].libs.ld_flags)
<         spack_env.set("FFTW", spec["fftw-api"].prefix)
<         spack_env.set("MPI_INC", spec["mpi"].prefix.include)
< 
<         if "%nvhpc" in spec:
<             spack_env.set("QD", spec["qd"].prefix)
< 
<         if "+scalapack" in spec:
<             cpp_options.append("-DscaLAPACK")
<             spack_env.set("SCALAPACK", spec["scalapack"].libs.ld_flags)
< 
<         if "+cuda" in spec:
<             cpp_gpu = [
<                 "-DCUDA_GPU",
<                 "-DRPROMU_CPROJ_OVERLAP",
<                 "-DCUFFT_MIN=28",
<                 "-DUSE_PINNED_MEMORY",
<             ]
< 
<             objects_gpu = [
<                 "fftmpiw.o",
<                 "fftmpi_map.o",
<                 "fft3dlib.o",
<                 "fftw3d_gpu.o",
<                 "fftmpiw_gpu.o",
<             ]
< 
<             cflags.extend(["-DGPUSHMEM=300", "-DHAVE_CUBLAS"])
< 
<             spack_env.set("CUDA_ROOT", spec["cuda"].prefix)
<             spack_env.set("CPP_GPU", " ".join(cpp_gpu))
<             spack_env.set("OBJECTS_GPU", " ".join(objects_gpu))
---
>         if '%gcc' in spec or '%intel' in spec:
>             fflags.append('-w')
>         elif '%nvhpc' in spec:
>             fflags.extend(['-Mnoupcase', '-Mbackslash', '-Mlarge_arrays'])
>         elif '%aocc' in spec:
>             fflags.extend(['-fno-fortran-main', '-Mbackslash', '-ffast-math'])
> 
>         spack_env.set('BLAS', spec['blas'].libs.ld_flags)
>         spack_env.set('LAPACK', spec['lapack'].libs.ld_flags)
>         spack_env.set('FFTW', spec['fftw-api'].prefix)
>         spack_env.set('MPI_INC', self.spec['mpi'].prefix.include)
> 
>         if '%nvhpc' in spec:
>             spack_env.set('QD', spec['qd'].prefix)
> 
>         if '+acc' in spec:
>             cpp_options.extend(['-DMPI_INPLACE','-D_OPENACC','-DUSENCCL','-DUSENCCLP2P'])
> 
>         if '%nvhpc' in spec:
>             cpp_options.append('-Dqd_emulate')
> 
>         if '+scalapack' in spec:
>             cpp_options.append('-DscaLAPACK')
>             spack_env.set('SCALAPACK', spec['scalapack'].libs.ld_flags)
> 
>         if '+vaspsol' in spec:
>             cpp_options.append('-Dsol_compat')
216,217c228,229
<         if "+vaspsol" in spec:
<             cpp_options.append("-Dsol_compat")
---
>         if spec.satisfies('%gcc@10:'):
>             fflags.append('-fallow-argument-mismatch')
219,220c231,232
<         if spec.satisfies("%gcc@10:"):
<             fflags.append("-fallow-argument-mismatch")
---
>         if '+wannier90' in spec:
>             cpp_options.append('-DVASP2WANNIER90')
223,225c235,245
<         spack_env.set("CPP_OPTIONS", " ".join(cpp_options))
<         spack_env.set("CFLAGS", " ".join(cflags))
<         spack_env.set("FFLAGS", " ".join(fflags))
---
>         spack_env.set('CPP_OPTIONS', ' '.join(cpp_options))
>         spack_env.set('FFLAGS', ' '.join(fflags))
> 
>         if '%nvhpc' in spec:
>             spack_env.prepend_path('LD_LIBRARY_PATH',join_path(spec['mpi'].prefix,'lib'))
>             nvc_cuda_path = join_path(ancestor(self.compiler.cc, 3),'cuda')
>             nvc_cuda_path =  glob.glob(join_path(nvc_cuda_path,'*'))[0]
>             spack_env.set('NVHPC_CUDA_HOME',nvc_cuda_path)
>             spack_env.prepend_path('PATH',join_path(nvc_cuda_path,'bin'))
>             spack_env.prepend_path('LD_LIBRARY_PATH',join_path(nvc_cuda_path,'targets','x86_64-linux','lib'))
> 
228,231c248
<         if "+cuda" in self.spec:
<             make("gpu", "gpu_ncl")
<         else:
<             make("std", "gam", "ncl")
---
>         make('std', 'gam', 'ncl')
234c251,268
<         install_tree("bin/", prefix.bin)
---
>         install_tree('bin/', prefix.bin)
> 
> #   @run_after('install')
> #   def install_test(self):
> #       mkdirp(join_path(self.prefix,'test'))
> #       with working_dir(self.prefix.test):
> #          tar=which('tar')
> #          tar('xvzf',join_path(os.path.dirname(self.module.__file__),'H2O.tgz'))
> #          with working_dir('H2O'):
> #              if self.spec['mpi'].name == 'mvapich2' and 'slurm' in str(self.spec['mpi'].token):
> #                  output=Executable('srun')('-n','4','--mpi=pmi2',join_path(self.prefix.bin,'vasp_std'),output=str,error=str)
> #              else:
> #                  output=Executable('mpirun')('-np','4',join_path(self.prefix.bin,'vasp_std'),output=str,error=str)
> #              teststring='F= -.14223'
> #              if teststring in output:
> #                  print("PASSED")
> #              else:
> #                  print("FAILED")
[spack_cpu@exp-15-56 vasp6]$

@mkandes
Copy link
Member Author

mkandes commented Oct 18, 2023

Making a minor change to ensure group permissions are set correctly when deployed.

[spack_cpu@exp-15-56 vasp6]$ cp -rp /home/jpg/.spack/0.17.3/var/spack/repos/jpg/packages/vasp/package.py ./
[spack_cpu@exp-15-56 vasp6]$ vi package.py 
[spack_cpu@exp-15-56 vasp6]$ diff package.py /home/jpg/.spack/0.17.3/var/spack/repos/jpg/packages/vasp/package.py
12c12
< class Vasp6(MakefilePackage):
---
> class Vasp(MakefilePackage):
[spack_cpu@exp-15-56 vasp6]$

@mkandes
Copy link
Member Author

mkandes commented Oct 18, 2023

After the updated package has been deployment, here is the new spack info vasp6.

[mkandes@login02 ~]$ spack info vasp6
MakefilePackage:   vasp6

Description:
     The Vienna Ab initio Simulation Package (VASP) is a computer program
    for atomic scale materials modelling, e.g. electronic structure
    calculations and quantum-mechanical molecular dynamics, from first
    principles.

Homepage: https://vasp.at

Externally Detectable: 
    False

Tags: 
    None

Preferred version:  
    6.4.2    file:///home/mkandes/vasp.6.4.2.tgz

Safe versions:  
    6.4.2    file:///home/mkandes/vasp.6.4.2.tgz

Deprecated versions:  
    None

Variants:
    Name [Default]     When    Allowed values    Description
    ===============    ====    ==============    =====================================

    acc [off]          --      on, off           Enables running on Nvidia GPUs
    openmp [off]       --      on, off           Enable openmp build
    scalapack [off]    --      on, off           Enables build with SCALAPACK
    vaspsol [off]      --      on, off           Enable VASPsol implicit solvation
                                                 model
                                                 https://github.com/henniggroup/VASPso
                                                 l
    wannier90 [off]    --      on, off           Enable wannier90

Installation Phases:
    edit    build    install

Build Dependencies:
    blas  fftw-api  lapack  mpi  qd  rsync  scalapack  wannier90

Link Dependencies:
    blas  fftw-api  lapack  mpi  qd  scalapack  wannier90

Run Dependencies:
    mpi

Virtual Packages: 
    None

[mkandes@login02 ~]$

@mkandes
Copy link
Member Author

mkandes commented Oct 18, 2023

@jerrypgreenberg ran his build (and runtime) tests using an Intel and Intel MPI combo.

[spack_cpu@login01 vasp]$ pwd
/home/spack_cpu/software/vasp
[spack_cpu@login01 vasp]$ cat wannier90@3.1.0.sh 
#!/usr/bin/env bash

#SBATCH --job-name=wannier@3.1.0
#SBATCH --account=use300
#SBATCH --partition=shared
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=8
#SBATCH --time=02:00:00
#SBATCH --output=%x.o%j.%N

declare -xr LOCAL_TIME="$(date +'%Y%m%dT%H%M%S%z')"
declare -xir UNIX_TIME="$(date +'%s')"

declare -xr SYSTEM_NAME='expanse'

declare -xr SPACK_VERSION='0.17.3'
declare -xr SPACK_INSTANCE_NAME='cpu'
declare -xr SPACK_INSTANCE_DIR="/cm/shared/apps/spack/${SPACK_VERSION}/${SPACK_INSTANCE_NAME}/b"

declare -xr SLURM_JOB_SCRIPT="$(scontrol show job ${SLURM_JOB_ID} | awk -F= '/Command=/{print $2}')"
declare -xr SLURM_JOB_MD5SUM="$(md5sum ${SLURM_JOB_SCRIPT})"

declare -xr SCHEDULER_MODULE='slurm'

echo "${UNIX_TIME} ${SLURM_JOB_ID} ${SLURM_JOB_MD5SUM} ${SLURM_JOB_DEPENDENCY}" 
echo ""

cat "${SLURM_JOB_SCRIPT}"

. "${SPACK_INSTANCE_DIR}/share/spack/setup-env.sh"

declare -xr SPACK_PACKAGE='wannier90@3.1.0'
declare -xr SPACK_COMPILER='intel@19.1.3.304'
declare -xr SPACK_VARIANTS='+shared'
declare -xr SPACK_DEPENDENCIES="^intel-mpi@2019.10.317/$(spack find --format '{hash:7}' intel-mpi@2019.10.317 % ${SPACK_COMPILER}  arch=linux-rocky8-zen2) ^intel-mkl@2020.4.304/$(spack find --format '{hash:7}' intel-mkl@2020.4.304 % ${SPACK_COMPILER}  arch=linux-rocky8-zen2)"
declare -xr SPACK_SPEC="${SPACK_PACKAGE} % ${SPACK_COMPILER} ${SPACK_VARIANTS} ${SPACK_DEPENDENCIES}"

module purge
module load "${SCHEDULER_MODULE}"
module load "${SPACK_COMPILER}"
module list

printenv

spack config get compilers
spack config get config  
spack config get mirrors
spack config get modules
spack config get packages
spack config get repos
spack config get upstreams

spack spec --long --namespaces --types "${SPACK_SPEC}"
if [[ "${?}" -ne 0 ]]; then
  echo 'ERROR: spack concretization failed.'
  exit 1
fi

time -p spack install -v --jobs "${SLURM_TASKS_PER_NODE}" --fail-fast --yes-to-all "${SPACK_SPEC}"
if [[ "${?}" -ne 0 ]]; then
  echo 'ERROR: spack install failed.'
  exit 1
fi

spack module lmod refresh --delete-tree -y

sbatch --dependency="afterok:${SLURM_JOB_ID}" 'vasp@6.4.2.sh'

sleep 20


[spack_cpu@login01 vasp]$
[spack_cpu@login01 vasp]$ cat vasp@6.4.2.sh 
#!/usr/bin/env bash

#SBATCH --job-name=vasp@6.4.2
#SBATCH --account=use300
#SBATCH --partition=shared
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=8
#SBATCH --time=02:00:00
#SBATCH --output=%x.o%j.%N

declare -xr LOCAL_TIME="$(date +'%Y%m%dT%H%M%S%z')"
declare -xir UNIX_TIME="$(date +'%s')"

declare -xr SYSTEM_NAME='expanse'

declare -xr SPACK_VERSION='0.17.3'
declare -xr SPACK_INSTANCE_NAME='cpu'
declare -xr SPACK_INSTANCE_DIR="/cm/shared/apps/spack/${SPACK_VERSION}/${SPACK_INSTANCE_NAME}/b"

declare -xr SLURM_JOB_SCRIPT="$(scontrol show job ${SLURM_JOB_ID} | awk -F= '/Command=/{print $2}')"
declare -xr SLURM_JOB_MD5SUM="$(md5sum ${SLURM_JOB_SCRIPT})"

declare -xr SCHEDULER_MODULE='slurm'

echo "${UNIX_TIME} ${SLURM_JOB_ID} ${SLURM_JOB_MD5SUM} ${SLURM_JOB_DEPENDENCY}" 
echo ""

cat "${SLURM_JOB_SCRIPT}"

. "${SPACK_INSTANCE_DIR}/share/spack/setup-env.sh"

declare -xr SPACK_PACKAGE='vasp@6.4.2'
declare -xr SPACK_COMPILER='intel@19.1.3.304'
declare -xr SPACK_VARIANTS='+openmp +scalapack +wannier90 ~acc'
declare -xr SPACK_DEPENDENCIES="^intel-mpi@2019.10.317/$(spack find --format '{hash:7}' intel-mpi@2019.10.317 % ${SPACK_COMPILER}  arch=linux-rocky8-zen2) ^intel-mkl@2020.4.304/$(spack find --format '{hash:7}' intel-mkl@2020.4.304 % ${SPACK_COMPILER}  arch=linux-rocky8-zen2)"
declare -xr SPACK_SPEC="${SPACK_PACKAGE} % ${SPACK_COMPILER} ${SPACK_VARIANTS} ${SPACK_DEPENDENCIES}"

module purge
module load "${SCHEDULER_MODULE}"
module load "${SPACK_COMPILER}"
module list

printenv

spack config get compilers
spack config get config  
spack config get mirrors
spack config get modules
spack config get packages
spack config get repos
spack config get upstreams

spack spec --long --namespaces --types "${SPACK_SPEC}"
if [[ "${?}" -ne 0 ]]; then
  echo 'ERROR: spack concretization failed.'
  exit 1
fi

time -p spack install -v --jobs "${SLURM_TASKS_PER_NODE}" --fail-fast --yes-to-all "${SPACK_SPEC}"
if [[ "${?}" -ne 0 ]]; then
  echo 'ERROR: spack install failed.'
  exit 1
fi

spack module lmod refresh --delete-tree -y

#sbatch --dependency="afterok:${SLURM_JOB_ID}" 'vasp@6.4.2.sh'

sleep 20


[spack_cpu@login01 vasp]$

However, the existing VASP and Wannier90 deployments already available in expanse/0.17.3/cpu/b use either AOCC or GCC + OpenMPI.

[mkandes@login02 ~]$ spack find -lvd wannier90
==> 1 installed package
-- linux-rocky8-zen2 / gcc@10.2.0 -------------------------------
4b3fvlj wannier90@3.1.0+shared
fgk2tlu     openblas@0.3.18~bignuma~consistent_fpcsr~ilp64+locking+pic+shared threads=none
oq3qvsv     openmpi@4.1.3~atomics~cuda~cxx~cxx_exceptions~gpfs~internal-hwloc~java+legacylaunchers+lustre~memchecker+pmi+pmix+romio~rsh~singularity+static+vt+wrapper-rpath cuda_arch=none fabrics=ucx schedulers=slurm
7rqkdv4         hwloc@2.6.0~cairo~cuda~gl~libudev+libxml2~netloc~nvml~opencl+pci~rocm+shared
ykynzrw             libpciaccess@0.16
mgovjpj             libxml2@2.9.12~python
zduoj2d                 libiconv@1.16 libs=shared,static
paz7hxz                 xz@5.2.5~pic libs=shared,static
ws4iari                 zlib@1.2.11+optimize+pic+shared
5lhvslt             ncurses@6.2~symlinks+termlib abi=none
bimlmtn         libevent@2.1.8~openssl
fy2cjdg         lustre@2.15.2
ckhyr5e         numactl@2.0.14 patches=4e1d78cbbb85de625bad28705e748856033eaafab92a66dffd383a3d7e00cc94,62fc8a8bf7665a60e8f4c93ebbd535647cebf74198f7afafec4c085a8825c006,ff37630df599cfabf0740518b91ec8daaf18e8f288b19adaae5364dc1f6b2296
dpvrfip         pmix@3.2.1~docs+pmi_backwards_compatibility~restful
4kvl3fd         slurm@21.08.8~gtk~hdf5~hwloc~mariadb~pmix+readline~restd sysconfdir=PREFIX/etc
dnpjjuc         ucx@1.10.1~assertions~cm+cma~cuda+dc~debug+dm~gdrcopy+ib-hw-tm~java~knem~logging+mlx5-dv+optimizations~parameter_checking+pic+rc~rocm+thread_multiple+ud~xpmem cuda_arch=none
xjr3cuj             rdma-core@43.0~ipo build_type=RelWithDebInfo

[mkandes@login02 ~]$ spack find -lvd vasp6
==> 2 installed packages
-- linux-rocky8-zen2 / aocc@3.2.0 -------------------------------
ysnddtb vasp6@6.2.1~cuda~openmp+scalapack+shmem~vaspsol
6sfatsa     amdblis@3.1+blas+cblas~ilp64+shared+static threads=none
kiytcz3         python@3.8.12+bz2+ctypes+dbm~debug+libxml2+lzma~nis~optimizations+pic+pyexpat+pythoncmd+readline+shared+sqlite3~ssl~tix~tkinter~ucs4+uuid+zlib patches=0d98e93189bc278fbc37a50ed7f183bd8aaf249a8e1670a465f0db6bb4f8cf87,4c2457325f2b608b1b6a2c63087df8c26e07db3e3d493caf36a56f0ecf6fb768,f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4
pvpmqs4             bzip2@1.0.8~debug~pic+shared
d4wiitw             expat@2.4.1+libbsd
zpca44r                 libbsd@0.11.3
tlqbjjl                     libmd@1.0.3
fwban2n             gdbm@1.19
zcvyw4d                 readline@8.1
vrkfn5j                     ncurses@6.2~symlinks+termlib abi=none
a5ype3y             gettext@0.21+bzip2+curses+git~libunistring+libxml2+tar+xz
wsl5g6s                 libiconv@1.16 libs=shared,static
6xxubr4                 libxml2@2.9.12~python
pc3ghll                     xz@5.2.5~pic libs=shared,static
4flcxn7                     zlib@1.2.11+optimize+pic+shared
zn3a5tk                 tar@1.34
34w374u             libffi@3.3 patches=26f26c6f29a7ce9bf370ad3ab2610f99365b4bdd7b82e7c31df41a3370d685c0
5h6inaj             sqlite@3.36.0+column_metadata+fts~functions~rtree
bj7ksgi             util-linux-uuid@2.36.2
t757st4     amdfftw@3.1~amd-app-opt~amd-fast-planner~amd-mpi-vader-limit~amd-top-n-planner~amd-trans~debug~mpi~openmp+shared~static~threads precision=double,float
qn3awdo         texinfo@6.5 patches=12f6edb0c6b270b8c8dba2ce17998c580db01182d871ee32b7b6e4129bd1d23a,1732115f651cff98989cb0215d8f64da5e0f7911ebf0c13b064920f088f2ffe1
cytiibn             perl@5.32.0+cpanm+shared+threads
cthafj2                 berkeley-db@18.1.40+cxx~docs+stl patches=b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522
f37pl2z     amdlibflame@3.1~debug~ilp64+lapack2flame+shared+static threads=none
7qg2ts5     amdscalapack@3.1~ilp64~ipo+pic+shared build_type=Release
xigazqd         openmpi@4.1.3~atomics~cuda~cxx~cxx_exceptions~gpfs~internal-hwloc~java+legacylaunchers+lustre~memchecker+pmi+pmix+romio~rsh~singularity+static+vt+wrapper-rpath cuda_arch=none fabrics=ucx schedulers=slurm
2ewlbuo             hwloc@2.6.0~cairo~cuda~gl~libudev+libxml2~netloc~nvml~opencl+pci~rocm+shared
whgqok2                 libpciaccess@0.16
tax5liq             libevent@2.1.8~openssl
soqjoas             lustre@2.15.2
g44vo3y             numactl@2.0.14 patches=4e1d78cbbb85de625bad28705e748856033eaafab92a66dffd383a3d7e00cc94,62fc8a8bf7665a60e8f4c93ebbd535647cebf74198f7afafec4c085a8825c006,ff37630df599cfabf0740518b91ec8daaf18e8f288b19adaae5364dc1f6b2296
y33fcsl             pmix@3.2.1~docs+pmi_backwards_compatibility~restful
3r2kfj2             slurm@21.08.8~gtk~hdf5~hwloc~mariadb~pmix+readline~restd sysconfdir=PREFIX/etc
wla3unl             ucx@1.10.1~assertions~cm+cma~cuda+dc~debug+dm~gdrcopy+ib-hw-tm~java~knem~logging+mlx5-dv+optimizations~parameter_checking+pic+rc~rocm+thread_multiple+ud~xpmem cuda_arch=none
wbadl55                 rdma-core@43.0~ipo build_type=RelWithDebInfo


-- linux-rocky8-zen2 / gcc@10.2.0 -------------------------------
tqvsz4d vasp6@6.2.1~cuda~openmp+scalapack+shmem~vaspsol
qogw3ss     fftw@3.3.10~mpi~openmp~pfft_patches precision=double,float
pywku55     netlib-scalapack@2.1.0~ipo+pic+shared build_type=Release patches=1c9ce5fee1451a08c2de3cc87f446aeda0b818ebbce4ad0d980ddf2f2a0b2dc4,f2baedde688ffe4c20943c334f580eb298e04d6f35c86b90a1f4e8cb7ae344a2
fgk2tlu         openblas@0.3.18~bignuma~consistent_fpcsr~ilp64+locking+pic+shared threads=none
oq3qvsv         openmpi@4.1.3~atomics~cuda~cxx~cxx_exceptions~gpfs~internal-hwloc~java+legacylaunchers+lustre~memchecker+pmi+pmix+romio~rsh~singularity+static+vt+wrapper-rpath cuda_arch=none fabrics=ucx schedulers=slurm
7rqkdv4             hwloc@2.6.0~cairo~cuda~gl~libudev+libxml2~netloc~nvml~opencl+pci~rocm+shared
ykynzrw                 libpciaccess@0.16
mgovjpj                 libxml2@2.9.12~python
zduoj2d                     libiconv@1.16 libs=shared,static
paz7hxz                     xz@5.2.5~pic libs=shared,static
ws4iari                     zlib@1.2.11+optimize+pic+shared
5lhvslt                 ncurses@6.2~symlinks+termlib abi=none
bimlmtn             libevent@2.1.8~openssl
fy2cjdg             lustre@2.15.2
ckhyr5e             numactl@2.0.14 patches=4e1d78cbbb85de625bad28705e748856033eaafab92a66dffd383a3d7e00cc94,62fc8a8bf7665a60e8f4c93ebbd535647cebf74198f7afafec4c085a8825c006,ff37630df599cfabf0740518b91ec8daaf18e8f288b19adaae5364dc1f6b2296
dpvrfip             pmix@3.2.1~docs+pmi_backwards_compatibility~restful
4kvl3fd             slurm@21.08.8~gtk~hdf5~hwloc~mariadb~pmix+readline~restd sysconfdir=PREFIX/etc
dnpjjuc             ucx@1.10.1~assertions~cm+cma~cuda+dc~debug+dm~gdrcopy+ib-hw-tm~java~knem~logging+mlx5-dv+optimizations~parameter_checking+pic+rc~rocm+thread_multiple+ud~xpmem cuda_arch=none
xjr3cuj                 rdma-core@43.0~ipo build_type=RelWithDebInfo

[mkandes@login02 ~]$

To keep this initial deployment from further expanding the scope of using additional compiler and MPI combinations with VASP and Wannier90, we will attempt to reuse the existing wannier90 % gcc10.2.0 build available.

@mkandes
Copy link
Member Author

mkandes commented Oct 18, 2023

The build spec script last ran from the spack_cpu user account used for deployment was the AOCC one.

[spack_cpu@exp-15-56 vasp]$ pwd
/home/spack_cpu/software/vasp
[spack_cpu@exp-15-56 vasp]$ ls
vasp.6.2.1.tgz  vasp6@6.2.1.o21817698.exp-15-56  wannier90@3.1.0.sh
vasp@6.4.2.sh   vasp6@6.2.1.o21821372.exp-15-56
vasp.6.4.2.tgz  vasp6@6.2.1.sh
[spack_cpu@exp-15-56 vasp]$ diff vasp6@6.2.1.sh /cm/shared/apps/spack/0.17.3/cpu/b/etc/spack/sdsc/expanse/0.17.3/cpu/b/specs/gcc@10.2.0/openmpi@4.1.3/vasp6@6.2.1.sh
30a31,34
> #declare -xr COMPILER_MODULE='gcc/10.2.0'
> #declare -xr MPI_MODULE='openmpi/4.1.3'
> #declare -xr CUDA_MODULE='cuda/11.2.2'
> #declare -xr CMAKE_MODULE='cmake/3.21.4'
40a45,48
> #module load "${COMPILER_MODULE}"
> #module load "${MPI_MODULE}"
> #module load "${CUDA_MODULE}"
> #module load "${CMAKE_MODULE}"
43,75c51,100
< # >> 1216    ld.lld: error: unable to find library -lfftw3_omp
< #  >> 1217    clang-13: error: linker command failed with exit code 1 (use -v to
< #              see invocation)
< #     1218    make[2]: *** [makefile:149: vasp] Error 1
< #     1219    make[2]: Leaving directory '/scratch/spack_cpu/job_21117029/spack-
< #             stage/spack-stage/spack-stage-vasp6-6.2.1-vu7hji2vkfvdaommo64n4y4z
< #             hajhvydt/spack-src/build/std'
< #  >> 1220    cp: cannot stat 'vasp': No such file or directory
< #     1221    make[1]: *** [makefile:146: all] Error 1
< #     1222    make[1]: Leaving directory '/scratch/spack_cpu/job_21117029/spack-
< #             stage/spack-stage/spack-stage-vasp6-6.2.1-vu7hji2vkfvdaommo64n4y4z
< #             hajhvydt/spack-src/build/std'
< #     1223    make: *** [makefile:17: std] Error 2
< 
< # >> 1057    ld.lld: error: undefined symbol: m_sum_s_
< #     1058    >>> referenced by solvation.f90:1687
< #     1059    >>>               solvation.o:(pot_k_vcorrection_)
< #     1060    >>> referenced by solvation.f90:1697
< #     1061    >>>               solvation.o:(pot_k_vcorrection_)
< #     1062    >>> did you mean: m_sumb_s_
< #     1063    >>> defined in: mpi.o
< #  >> 1064    clang-13: error: linker command failed with exit code 1 (use -v to
< #              see invocation)
< #     1065    make[2]: *** [makefile:149: vasp] Error 1
< #     1066    make[2]: Leaving directory '/scratch/spack_cpu/job_21126571/spack-
< #             stage/spack-stage/spack-stage-vasp6-6.2.1-c4lbyn5edkydi42hwwnot3wo
< #             v25v7z3e/spack-src/build/std'
< #  >> 1067    cp: cannot stat 'vasp': No such file or directory
< #     1068    make[1]: *** [makefile:146: all] Error 1
< #     1069    make[1]: Leaving directory '/scratch/spack_cpu/job_21126571/spack-
< #             stage/spack-stage/spack-stage-vasp6-6.2.1-c4lbyn5edkydi42hwwnot3wo
< #             v25v7z3e/spack-src/build/std'
< #     1070    make: *** [makefile:17: std] Error 2
---
> #2 errors found in build log:
> #     138    gcc -E -P -C -w fock_glb.F >fock_glb.f90 -DMPI -DMPI_BLOCK=8000 -Du
> #            se_collective -DCACHE_SIZE=4000 -Davoidalloc -Duse_bse_te -Dtbdyn -
> #            Duse_shmem -DHOST=\"LinuxGNU\" -Dvasp6 -DscaLAPACK -Dsol_compat -DN
> #            GZhalf
> #     139    mpif90 -fopenmp -ffree-form -ffree-line-length-none -w -fallow-argu
> #            ment-mismatch -O2 -I/cm/shared/apps/spack/0.17.3/cpu/a/opt/spack/li
> #            nux-rocky8-zen2/gcc-10.2.0/fftw-3.3.10-qogw3ssyk3cwr5qiwik3eetj22cr
> #            yewg/include  -c fock_glb.f90
> #     140    fock_glb.f90:325:31:
> #     141
> #     142      325 | !$   INTEGER(KIND=OMP_LOCK_KIND), POINTER :: OMP_LCK1(:),OM
> #            P_LCK2(:)
> #     143          |                               1
> #  >> 144    Error: Symbol 'omp_lock_kind' at (1) has no IMPLICIT type; did you
> #            mean 'mpi_count_kind'?
> #     145    make[2]: *** [makefile:181: fock_glb.o] Error 1
> #     146    make[2]: Leaving directory '/scratch/spack_cpu/job_21114617/spack-s
> #            tage/spack-stage/spack-stage-vasp6-6.2.1-5y35k7dgxh6pnpxcyztndscnw6
> #            dl2xg3/spack-src/build/std'
> #  >> 147    cp: cannot stat 'vasp': No such file or directory
> #     148    make[1]: *** [makefile:146: all] Error 1
> #     149    make[1]: Leaving directory '/scratch/spack_cpu/job_21114617/spack-s
> #            tage/spack-stage/spack-stage-vasp6-6.2.1-5y35k7dgxh6pnpxcyztndscnw6
> #            dl2xg3/spack-src/build/std'
> #     150    make: *** [makefile:17: std] Error 2
> 
> # ==> Error: ProcessError: Command exited with status 77:
> #    '/scratch/spack_cpu/job_21114756/spack-stage/spack-stage/spack-stage-popt-1.16-mr4trumi3p2tfdyfurp226nvsy7uruom/spack-src/configure' '--prefix=/cm/shared/apps/spa
> #ck/0.17.3/cpu/a/opt/spack/linux-rocky8-zen2/intel-19.1.3.304/popt-1.16-mr4trumi3p2tfdyfurp226nvsy7uruom'
> #
> #2 errors found in build log:
> #     10    checking for gawk... gawk
> #     11    checking whether make sets $(MAKE)... yes
> #     12    checking whether to enable maintainer-specific portions of Makefiles
> #           ... no
> #     13    checking for style of include used by make... GNU
> #     14    checking for gcc... /cm/shared/apps/spack/0.17.3/cpu/a/lib/spack/env
> #           /intel/icc
> #     15    checking for C compiler default output file name...
> #  >> 16    configure: error: in `/scratch/spack_cpu/job_21114756/spack-stage/sp
> #           ack-stage/spack-stage-popt-1.16-mr4trumi3p2tfdyfurp226nvsy7uruom/spa
> #           ck-src':
> #  >> 17    configure: error: C compiler cannot create executables
> #     18    See `config.log' for more details.
> 
> # solvation.o: In function `__pot_k_MOD_vcorrection':
> # solvation.f90:(.text+0x72ad): undefined reference to `m_sum_s_'
> # solvation.f90:(.text+0x72e8): undefined reference to `m_sum_s_'
> # collect2: error: ld returned 1 exit status
78c103
< declare -xr SPACK_COMPILER='aocc@3.2.0'
---
> declare -xr SPACK_COMPILER='gcc@10.2.0'
80c105
< declare -xr SPACK_DEPENDENCIES="^amdfftw@3.1/$(spack find --format '{hash:7}' amdfftw@3.1 % ${SPACK_COMPILER} ~mpi ~openmp) ^amdscalapack@3.1/$(spack find --format '{hash:7}' amdscalapack@3.1 % ${SPACK_COMPILER} ^openmpi@4.1.3)"
---
> declare -xr SPACK_DEPENDENCIES="^fftw@3.3.10/$(spack find --format '{hash:7}' fftw@3.3.10 % ${SPACK_COMPILER} ~mpi ~openmp) ^netlib-scalapack@2.1.0/$(spack find --format '{hash:7}' netlib-scalapack@2.1.0 % ${SPACK_COMPILER} ^openmpi@4.1.3)"
107c132
< #sbatch --dependency="afterok:${SLURM_JOB_ID}" ''
---
> #sbatch --dependency="afterok:${SLURM_JOB_ID}" 'gamess@2021.09.sh'
[spack_cpu@exp-15-56 vasp]$ diff vasp6@6.2.1.sh /cm/shared/apps/spack/0.17.3/cpu/b/etc/spack/sdsc/expanse/0.17.3/cpu/b/specs/aocc@3.2.0/openmpi@4.1.3/vasp6@6.2.1.sh
[spack_cpu@exp-15-56 vasp]$

@mkandes
Copy link
Member Author

mkandes commented Oct 18, 2023

Copying over the GCC version ...

[spack_cpu@exp-15-56 vasp]$ cp -rp /cm/shared/apps/spack/0.17.3/cpu/b/etc/spack/sdsc/expanse/0.17.3/cpu/b/specs/gcc@10.2.0/openmpi@4.1.3/vasp6@6.2.1.sh vasp6@6.4.2.sh
[spack_cpu@exp-15-56 vasp]$ ls
vasp.6.2.1.tgz  vasp6@6.2.1.o21817698.exp-15-56  vasp6@6.4.2.sh
vasp@6.4.2.sh   vasp6@6.2.1.o21821372.exp-15-56  wannier90@3.1.0.sh
vasp.6.4.2.tgz  vasp6@6.2.1.sh
[spack_cpu@exp-15-56 vasp]$

we will modify this spec build script to deploy the VASP v6.4.2 with the Wannier90 integration.

@mkandes
Copy link
Member Author

mkandes commented Oct 18, 2023

Initial build launched ...

[spack_cpu@exp-15-56 vasp]$ cat vasp6@6.4.2.sh 
#!/usr/bin/env bash

#SBATCH --job-name=vasp6@6.4.2
#SBATCH --account=use300
#SBATCH --reservation=root_73
#SBATCH --partition=ind-shared
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=16
#SBATCH --mem=32G
#SBATCH --time=01:00:00
#SBATCH --output=%x.o%j.%N

declare -xr LOCAL_TIME="$(date +'%Y%m%dT%H%M%S%z')"
declare -xir UNIX_TIME="$(date +'%s')"

declare -xr LOCAL_SCRATCH_DIR="/scratch/${USER}/job_${SLURM_JOB_ID}"
declare -xr TMPDIR="${LOCAL_SCRATCH_DIR}"

declare -xr SYSTEM_NAME='expanse'

declare -xr SPACK_VERSION='0.17.3'
declare -xr SPACK_INSTANCE_NAME='cpu'
declare -xr SPACK_INSTANCE_VERSION='b'
declare -xr SPACK_INSTANCE_DIR="/cm/shared/apps/spack/${SPACK_VERSION}/${SPACK_INSTANCE_NAME}/${SPACK_INSTANCE_VERSION}"

declare -xr SLURM_JOB_SCRIPT="$(scontrol show job ${SLURM_JOB_ID} | awk -F= '/Command=/{print $2}')"
declare -xr SLURM_JOB_MD5SUM="$(md5sum ${SLURM_JOB_SCRIPT})"

declare -xr SCHEDULER_MODULE='slurm'

echo "${UNIX_TIME} ${SLURM_JOB_ID} ${SLURM_JOB_MD5SUM} ${SLURM_JOB_DEPENDENCY}" 
echo ""

cat "${SLURM_JOB_SCRIPT}"

module purge
module load "${SCHEDULER_MODULE}"
. "${SPACK_INSTANCE_DIR}/share/spack/setup-env.sh"
module use "${SPACK_ROOT}/share/spack/lmod/linux-rocky8-x86_64/Core"
module list
shopt -s expand_aliases

declare -xr SPACK_PACKAGE='vasp6@6.4.2'
declare -xr SPACK_COMPILER='gcc@10.2.0'
declare -xr SPACK_VARIANTS='~acc +openmp +scalapack ~vaspsol +wannier90'
declare -xr SPACK_DEPENDENCIES="^fftw@3.3.10/$(spack find --format '{hash:7}' fftw@3.3.10 % ${SPACK_COMPILER} ~mpi ~openmp) ^netlib-scalapack@2.1.0/$(spack find --format '{hash:7}' netlib-scalapack@2.1.0 % ${SPACK_COMPILER} ^openmpi@4.1.3) ^wannier90@3.1.0/$(spack find --format '{hash:7}' wannier90@3.1.0 % ${SPACK_COMPILER} ^openmpi@4.1.3)"
declare -xr SPACK_SPEC="${SPACK_PACKAGE} % ${SPACK_COMPILER} ${SPACK_VARIANTS} ${SPACK_DEPENDENCIES}"

printenv

spack config get compilers
spack config get config  
spack config get mirrors
spack config get modules
spack config get package
spack config get repos
spack config get upstreams

time -p spack spec --long --namespaces --types --reuse $(echo "${SPACK_SPEC}")
if [[ "${?}" -ne 0 ]]; then
  echo 'ERROR: spack concretization failed.'
  exit 1
fi

time -p spack install --jobs "${SLURM_CPUS_PER_TASK}" --fail-fast --yes-to-all --reuse $(echo "${SPACK_SPEC}")
if [[ "${?}" -ne 0 ]]; then
  echo 'ERROR: spack install failed.'
  exit 1
fi

spack module lmod refresh --delete-tree -y

#sbatch --dependency="afterok:${SLURM_JOB_ID}" 'gamess@2021.09.sh'

sleep 30
[spack_cpu@exp-15-56 vasp]$ sbatch vasp6@6.4.2.sh 
Submitted batch job 25742320
[spack_cpu@exp-15-56 vasp]$ squeue -u $USER
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
          25742320 ind-share vasp6@6. spack_cp  R       0:04      1 exp-15-56
          25740986 ind-share     bash spack_cp  R    1:32:22      1 exp-15-56
[spack_cpu@exp-15-56 vasp]$ pwd
/home/spack_cpu/software/vasp
[spack_cpu@exp-15-56 vasp]$ ls -lahtr
total 144M
-rw-r-----  1 spack_cpu use300  50M Dec 23  2022 vasp.6.2.1.tgz
-rw-r--r--  1 spack_cpu spack  4.2K Apr 18  2023 vasp6@6.2.1.sh
-rw-r--r--  1 spack_cpu spack   38K Apr 21 08:43 vasp6@6.2.1.o21817698.exp-15-56
-rw-r--r--  1 spack_cpu spack   47K Apr 21 09:48 vasp6@6.2.1.o21821372.exp-15-56
drwxr-xr-x 13 spack_cpu spack    13 Jul 25 08:07 ..
-rw-r--r--  1 spack_cpu vasp    95M Oct  4 11:31 vasp.6.4.2.tgz
-rw-r--r--  1 spack_cpu use300 2.1K Oct 16 22:42 vasp@6.4.2.sh
-rw-r--r--  1 spack_cpu use300 2.1K Oct 16 22:43 wannier90@3.1.0.sh
-rw-r--r--  1 spack_cpu spack   12K Oct 18 10:31 .vasp@6.4.2.sh.swp
-rw-r--r--  1 spack_cpu spack  2.5K Oct 18 10:34 vasp6@6.4.2.sh
drwxr-xr-x  2 spack_cpu spack    12 Oct 18 10:35 .
-rw-r--r--  1 spack_cpu spack   21K Oct 18 10:35 vasp6@6.4.2.o25742320.exp-15-56
[spack_cpu@exp-15-56 vasp]$ squeue -u $USER
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
          25742320 ind-share vasp6@6. spack_cp  R       0:19      1 exp-15-56
          25740986 ind-share     bash spack_cp  R    1:32:37      1 exp-15-56
[spack_cpu@exp-15-56 vasp]$

@mkandes mkandes changed the title ZEN-27471: PKG/SPEC - sdsc-0.17.3 - Update VASP to support v6.4.0 ZEN-27471: PKG/SPEC - sdsc-0.17.3 - Update VASP to support v6.4.x Oct 18, 2023
@mkandes
Copy link
Member Author

mkandes commented Oct 18, 2023

Build failed on problem with the updated Spack package not being able to use Python sys library?

==> Installing vasp6-6.4.2-4akqxfpu52besnoolonhsy6zdopchekt
==> No binary for vasp6-6.4.2-4akqxfpu52besnoolonhsy6zdopchekt found: installing from source
==> Warning: Skipping package at /cm/shared/apps/spack/0.17.3/cpu/b/var/spack/repos/sdsc/packages/amber.configure. "amber.configure" is not a valid Spack module name.
==> Warning: Expected user 527834 to own /scratch/spack_cpu, but it is owned by 0
==> Fetching file:///home/spack_cpu/software/vasp/vasp.6.4.2.tgz
==> No patches needed for vasp6
==> vasp6: Executing phase: 'edit'
==> Error: NameError: name 'sys' is not defined

/cm/shared/apps/spack/0.17.3/cpu/b/var/spack/repos/sdsc/packages/vasp6/package.py:72, in edit:
         69                    if spec['blas'].name == "intel-mkl":
         70                        make_include='makefile.include.gnu_ompi_mkl_omp'
         71                    else:
  >>     72                        sys.exit("makefile does not exist")
         73                else:
         74                    make_include = join_path('arch', 'makefile.include.gnu_omp')
         75            else:

See build log for details:
  /scratch/spack_cpu/job_25742320/spack-stage/spack-stage-vasp6-6.4.2-4akqxfpu52besnoolonhsy6zdopchekt/spack-build-out.txt

==> Error: Terminating after first install failure: NameError: name 'sys' is not defined
real 14.29
user 10.44
sys 0.87
ERROR: spack install failed.

@mkandes
Copy link
Member Author

mkandes commented Oct 18, 2023

Yup. It's not being imported for some reason ...

[spack_cpu@exp-15-56 vasp]$ head -n 20 /cm/shared/apps/spack/0.17.3/cpu/b/var/spack/repos/sdsc/packages/vasp6/package.py 
# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)

import os
import glob

from spack import *


class Vasp6(MakefilePackage):
    """
    The Vienna Ab initio Simulation Package (VASP)
    is a computer program for atomic scale materials modelling,
    e.g. electronic structure calculations
    and quantum-mechanical molecular dynamics, from first principles.
    """

    homepage = "https://vasp.at"
[spack_cpu@exp-15-56 vasp]$

@mkandes
Copy link
Member Author

mkandes commented Oct 18, 2023

Fixed.

[spack_cpu@exp-15-56 vasp]$ vi /cm/shared/apps/spack/0.17.3/cpu/b/var/spack/repos/sdsc/packages/vasp6/package.py 
[spack_cpu@exp-15-56 vasp]$ head -n 20 /cm/shared/apps/spack/0.17.3/cpu/b/var/spack/repos/sdsc/packages/vasp6/package.py 
# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)

import os
import sys
import glob

from spack import *


class Vasp6(MakefilePackage):
    """
    The Vienna Ab initio Simulation Package (VASP)
    is a computer program for atomic scale materials modelling,
    e.g. electronic structure calculations
    and quantum-mechanical molecular dynamics, from first principles.
    """

[spack_cpu@exp-15-56 vasp]$

@mkandes
Copy link
Member Author

mkandes commented Oct 18, 2023

Let's try that build again now ...

[spack_cpu@exp-15-56 vasp]$ pwd
/home/spack_cpu/software/vasp
[spack_cpu@exp-15-56 vasp]$ ls
vasp.6.2.1.tgz                   vasp6@6.2.1.sh
vasp@6.4.2.sh                    vasp6@6.4.2.o25742320.exp-15-56
vasp.6.4.2.tgz                   vasp6@6.4.2.sh
vasp6@6.2.1.o21817698.exp-15-56  wannier90@3.1.0.sh
vasp6@6.2.1.o21821372.exp-15-56
[spack_cpu@exp-15-56 vasp]$ sbatch vasp6@6.4.2.sh 
Submitted batch job 25742382
[spack_cpu@exp-15-56 vasp]$ squeue -u $USER
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
          25742382 ind-share vasp6@6. spack_cp  R       0:04      1 exp-15-56
          25740986 ind-share     bash spack_cp  R    1:39:39      1 exp-15-56
[spack_cpu@exp-15-56 vasp]$

@mkandes
Copy link
Member Author

mkandes commented Oct 18, 2023

Progress. But the build failed again.

==> Installing vasp6-6.4.2-4akqxfpu52besnoolonhsy6zdopchekt
==> No binary for vasp6-6.4.2-4akqxfpu52besnoolonhsy6zdopchekt found: installing from source
==> Warning: Skipping package at /cm/shared/apps/spack/0.17.3/cpu/b/var/spack/repos/sdsc/packages/amber.configure. "amber.configure" is not a valid Spack module name.
==> Warning: Expected user 527834 to own /scratch/spack_cpu, but it is owned by 0
==> Using cached archive: /cm/shared/apps/spack/0.17.3/cpu/b/var/spack/cache/_source-cache/archive/b7/b704637f7384673f91adfbc803edc5cc7fe736d9623453461f7cdc29b123410e.tgz
==> No patches needed for vasp6
==> vasp6: Executing phase: 'edit'
==> Error: SystemExit: makefile does not exist

/cm/shared/apps/spack/0.17.3/cpu/b/var/spack/repos/sdsc/packages/vasp6/package.py:73, in edit:
         70                    if spec['blas'].name == "intel-mkl":
         71                        make_include='makefile.include.gnu_ompi_mkl_omp'
         72                    else:
  >>     73                        sys.exit("makefile does not exist")
         74                else:
         75                    make_include = join_path('arch', 'makefile.include.gnu_omp')
         76            else:

See build log for details:
  /scratch/spack_cpu/job_25742382/spack-stage/spack-stage-vasp6-6.4.2-4akqxfpu52besnoolonhsy6zdopchekt/spack-build-out.txt

==> Error: Terminating after first install failure: SystemExit: makefile does not exist
real 11.95
user 10.53
sys 0.77
ERROR: spack install failed.

It looks like @jerrypgreenberg may have designed the latest version of the package to only work with Intel MKL support to satisfy the BLAS virtual dependency, which will likely preclude reusing the existing copy of Wannier90 available.

mkandes added a commit that referenced this issue Oct 18, 2023
…0.17.3/cpu/b

This deployment is in support of recent user requests for VASP v6.4.x
compiled with Wannier90 integration [1].

[1] #51
@mkandes
Copy link
Member Author

mkandes commented Oct 18, 2023

Deployed wannier90@3.1.0 % intel@19.1.3.304 ^intel-mpi@2019.10.317 to expanse/0.17.3/cpu/b

9e63860

@mkandes
Copy link
Member Author

mkandes commented Oct 19, 2023

vasp6@6.4.2 % intel@19.1.3.304 ^intel-mpi@2019.10.317 build is failing.

==> Installing vasp6-6.4.2-nfkttoplgemyx6ocwm5osos76s64h4f6
==> No binary for vasp6-6.4.2-nfkttoplgemyx6ocwm5osos76s64h4f6 found: installing from source
==> Warning: Skipping package at /cm/shared/apps/spack/0.17.3/cpu/b/var/spack/repos/sdsc/packages/amber.configure. "amber.configure" is not a valid Spack module name.
==> Warning: Expected user 527834 to own /scratch/spack_cpu, but it is owned by 0
==> Using cached archive: /cm/shared/apps/spack/0.17.3/cpu/b/var/spack/cache/_source-cache/archive/b7/b704637f7384673f91adfbc803edc5cc7fe736d9623453461f7cdc29b123410e.tgz
==> No patches needed for vasp6
==> Warning: Intel's compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not unique to Intel microprocessors
==> vasp6: Executing phase: 'edit'
==> vasp6: Executing phase: 'build'
==> Error: ProcessError: Command exited with status 2:
    'make' 'std' 'gam' 'ncl'
See build log for details:
  /scratch/spack_cpu/job_25752189/spack-stage/spack-stage-vasp6-6.4.2-nfkttoplgemyx6ocwm5osos76s64h4f6/spack-build-out.txt

==> Error: Terminating after first install failure: ProcessError: Command exited with status 2:
    'make' 'std' 'gam' 'ncl'
real 13.53
user 11.44
sys 1.07
==> Warning: Skipping package at /cm/shared/apps/spack/0.17.3/cpu/b/var/spack/repos/sdsc/packages/amber.configure. "amber.configure" is not a valid Spack module name.
==> Regenerating lmod module files
==> OpenFOAM bashrc env: /cm/shared/apps/spack/0.17.3/cpu/b/opt/spack/linux-rocky8-zen2/aocc-3.2.0/openfoam-2106-jz42us227mirxrhqjvojlaut2giuh74j/etc/bashrc
==> vasp6: Executing phase: 'build'
==> [2023-10-18-16:57:59.615141] 'make' 'std' 'gam' 'ncl'
if [ ! -d build/std ] ; then mkdir -p build/std  ; fi
cp src/makefile src/.objects src/makedeps.awk makefile.include build/std 
make -C build/std VERSION=std check
make[1]: Entering directory '/scratch/spack_cpu/job_25752189/spack-stage/spack-stage-vasp6-6.4.2-nfkttoplgemyx6ocwm5osos76s64h4f6/spack-src/build/std'
exit 0
make[1]: Leaving directory '/scratch/spack_cpu/job_25752189/spack-stage/spack-stage-vasp6-6.4.2-nfkttoplgemyx6ocwm5osos76s64h4f6/spack-src/build/std'
make -C build/std VERSION=std cleandependencies -j1
make[1]: Entering directory '/scratch/spack_cpu/job_25752189/spack-stage/spack-stage-vasp6-6.4.2-nfkttoplgemyx6ocwm5osos76s64h4f6/spack-src/build/std'
rm -f .depend
make[1]: Leaving directory '/scratch/spack_cpu/job_25752189/spack-stage/spack-stage-vasp6-6.4.2-nfkttoplgemyx6ocwm5osos76s64h4f6/spack-src/build/std'
make -C build/std VERSION=std all
make[1]: Entering directory '/scratch/spack_cpu/job_25752189/spack-stage/spack-stage-vasp6-6.4.2-nfkttoplgemyx6ocwm5osos76s64h4f6/spack-src/build/std'
rsync -ru ../../src/lib .
cp makefile.include lib
make -C lib -j1
make[2]: Entering directory '/scratch/spack_cpu/job_25752189/spack-stage/spack-stage-vasp6-6.4.2-nfkttoplgemyx6ocwm5osos76s64h4f6/spack-src/build/std/lib'
make libdmy.a
make[3]: Entering directory '/scratch/spack_cpu/job_25752189/spack-stage/spack-stage-vasp6-6.4.2-nfkttoplgemyx6ocwm5osos76s64h4f6/spack-src/build/std/lib'
fpp -f_com=no -free -w0 preclib.F preclib.f90
make[3]: fpp: Command not found
make[3]: *** [makefile:25: preclib.f90] Error 127
make[3]: Leaving directory '/scratch/spack_cpu/job_25752189/spack-stage/spack-stage-vasp6-6.4.2-nfkttoplgemyx6ocwm5osos76s64h4f6/spack-src/build/std/lib'
make[2]: *** [makefile:18: all] Error 2
make[2]: Leaving directory '/scratch/spack_cpu/job_25752189/spack-stage/spack-stage-vasp6-6.4.2-nfkttoplgemyx6ocwm5osos76s64h4f6/spack-src/build/std/lib'
make[1]: *** [makefile:146: lib] Error 2
make[1]: Leaving directory '/scratch/spack_cpu/job_25752189/spack-stage/spack-stage-vasp6-6.4.2-nfkttoplgemyx6ocwm5osos76s64h4f6/spack-src/build/std'
make: *** [makefile:17: std] Error 2

@jerrypgreenberg
Copy link
Member

jerrypgreenberg commented Oct 19, 2023 via email

mkandes added a commit that referenced this issue Oct 19, 2023
….3/cpu/b

This deployment is in support of recent user requests for VASP v6.4.x
compiled with Wannier90 integration [1]. Please note, however, to
satisfy the requests, we have utlized an updated Spack package from
@jerrypgreenberg for VASP v6.4.x, which has significant changes to its
build process and GPU support --- e.g., moving from CUDA to OpenACC. As
such, the Spack package in the sdsc package repo has been update as
well, but will not be backwards-compatible with earlier versions of
VASP.

[1] #51
@mkandes
Copy link
Member Author

mkandes commented Oct 19, 2023

Build successful.

3cbfd1b

P.S. @jerrypgreenberg - I typically fix these types of issues by explicitly loading the required modules within the spec build script for future documentation/reference.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants