diff --git a/easybuild/easyconfigs/a/AmberTools/AmberTools-25.2-foss-2025a.eb b/easybuild/easyconfigs/a/AmberTools/AmberTools-25.2-foss-2025a.eb new file mode 100644 index 000000000000..9e8a8ba10268 --- /dev/null +++ b/easybuild/easyconfigs/a/AmberTools/AmberTools-25.2-foss-2025a.eb @@ -0,0 +1,114 @@ +easyblock = 'EB_Amber' + +name = 'AmberTools' +local_ambertools_ver = 25 +# Patch levels from http://ambermd.org/AmberPatches.php and http://ambermd.org/ATPatches.php +patchlevels = (2, 0) # (AmberTools, Amber) +version = '%s.%s' % (local_ambertools_ver, patchlevels[0]) + +homepage = 'https://ambermd.org/' +description = """AmberTools consists of several independently developed packages that work well by themselves, + and with Amber itself. The suite can also be used to carry out complete molecular dynamics simulations, + with either explicit water or generalized Born solvent models.""" + +toolchain = {'name': 'foss', 'version': '2025a'} +toolchainopts = {'usempi': True} + +# download requires registration +local_download_credentials = '?Name=Easybuild&Institution=Easybuild&City=Internet&State=Other&Country=Belgium' +source_urls = ['https://ambermd.org/cgi-bin/AmberTools%s-get.pl' % local_ambertools_ver] +sources = [{ + 'download_filename': local_download_credentials, + 'filename': 'AmberTools%s.tar.bz2' % local_ambertools_ver, +}] +patches = [ + 'AmberTools-20_cmake-locate-netcdf.patch', + 'AmberTools-20_fix_missing_MPI_LIBRARY_error.patch', + 'AmberTools-20_fix_xblas_missing_make_dependency.patch', + 'AmberTools-21_CMake-FlexiBLAS.patch', + 'AmberTools-21_fix_incorrect_dvout_call.patch', + 'AmberTools-21_fix_potential_use_before_init.patch', + 'AmberTools-21_fix_rism_argument_mismatch.patch', + 'AmberTools-21_fix_xray_fftpack_arg_mismatch.patch', + 'AmberTools-25_fix_test_missing_dirs.patch', + 'AmberTools-25_parmed-update.patch', + 'AmberTools-25_fix-boost.patch', + 'AmberTools-25_skip-tests.patch', + 'AmberTools-25_fix-sander-numpy.patch', +] +checksums = [ + {'AmberTools25.tar.bz2': 'ac009b2adeb25ccd2191db28905b867df49240e038dc590f423edf0d84f8a13b'}, + {'AmberTools-20_cmake-locate-netcdf.patch': '473e07c53b6f641d96d333974a6af2e03413fecef79f879d3fdecf7fecaab4d0'}, + {'AmberTools-20_fix_missing_MPI_LIBRARY_error.patch': + '0b89a0624167bc23876bcdefcb1055f591e38e3bd559a71d5749e342bd311acc'}, + {'AmberTools-20_fix_xblas_missing_make_dependency.patch': + 'ff25e91fdc72347a778c3837b581e174d6a8c71efa5b46e11391b18bca84fd65'}, + {'AmberTools-21_CMake-FlexiBLAS.patch': '9543812c24c4b7842f64f1f8abaf2c92b5c4c0fadcdbd9811e76b81a778f0d36'}, + {'AmberTools-21_fix_incorrect_dvout_call.patch': + '1054d4007f5c79126a41582e1e80514267cf406416ed6c471574cd708b16319b'}, + {'AmberTools-21_fix_potential_use_before_init.patch': + '377e645b5bd2c91ebb4d0b6fbca0407a94289e5ddc5b1e7ed0cb0b0724ad2139'}, + {'AmberTools-21_fix_rism_argument_mismatch.patch': + '14255e5739cec39303df570f06820c7532f7395e1b73b1e4104377984e2c9fc1'}, + {'AmberTools-21_fix_xray_fftpack_arg_mismatch.patch': + '99c954e693659efc2a1d121f91510f56408006f0751d91595f45a34b03364e2f'}, + {'AmberTools-25_fix_test_missing_dirs.patch': '1c4c44cb012b625933781e9811f1657d5ddfd14cfbf4894bb1f767995eadc3b6'}, + {'AmberTools-25_parmed-update.patch': '2216c7883be026ce48aac7589f75749f2a42ec74f6e3ceba378d762403c50924'}, + {'AmberTools-25_fix-boost.patch': 'f4ccf7dedb5aa5b289ad5f69f3c1dc808c3fcc226d7118eaba40b108688e37cc'}, + {'AmberTools-25_skip-tests.patch': '3de155ba9eedcbe84eb44962e9a5e66fda9d9dfff9ad50a356750baa286f8e21'}, + {'AmberTools-25_fix-sander-numpy.patch': '82b875153927b8a0977022d608bbf51513ea936384f3059ecd41a37dfb004d5e'}, +] + +builddependencies = [ + ('CMake', '3.31.3'), + ('pkgconf', '2.3.0'), + ('Bison', '3.8.2'), + ('flex', '2.6.4'), + ('make', '4.4.1'), + ('Cython', '3.1.1'), +] + +dependencies = [ + ('zlib', '1.3.1'), + ('bzip2', '1.0.8'), + ('Python', '3.13.1'), + ('SciPy-bundle', '2025.06'), + ('Perl', '5.40.0'), + ('Perl-bundle-CPAN', '5.40.0'), + ('Boost', '1.88.0'), + ('libreadline', '8.2'), + ('matplotlib', '3.10.3'), + ('netCDF', '4.9.3'), + ('netCDF-Fortran', '4.6.2'), + ('PnetCDF', '1.14.0'), + ('Tkinter', '%(pyver)s'), + ('X11', '20250521'), + ('mpi4py', '4.1.0'), + ('FFTW', '3.3.10'), + ('netcdf4-python', '1.7.2'), + ('PyYAML', '6.0.2'), + ('RDKit', '2025.03.4'), + ('PLUMED', '2.9.4'), +] + +_fe_toolkit_path = "%(builddir)s/%(name)s/src/fe-toolkit/" +_setup_path = "/src/python/setup.py" +_fe_toolkit_pkgs = ['edgembar', 'fetkutils', 'ndfes'] +# recythonize pytraj files - python3.13 compability +prebuildopts = "cd %(builddir)s/%(name)s/src/pytraj && find . -name '*.cpp' -delete && python setup.py --cythonize && " +prebuildopts += "cd %(builddir)s/easybuild_obj && " +# unpin numpy version restriction in fe-toolkit pkgs +prebuildopts += """sed -i "/'numpy<2',/d" """ +for _pkg in _fe_toolkit_pkgs: + prebuildopts += f"{_fe_toolkit_path}{_pkg}{_setup_path} " +prebuildopts += '&& ' + +sanity_check_commands = [ + f"python -c 'import {', '.join(_fe_toolkit_pkgs)}'", + "pip check", + "python -c 'import parmed'", +] + +runtest = True + +moduleclass = 'chem' diff --git a/easybuild/easyconfigs/a/AmberTools/AmberTools-25_fix-boost.patch b/easybuild/easyconfigs/a/AmberTools/AmberTools-25_fix-boost.patch new file mode 100644 index 000000000000..3609197e1548 --- /dev/null +++ b/easybuild/easyconfigs/a/AmberTools/AmberTools-25_fix-boost.patch @@ -0,0 +1,13 @@ +New Boost (here v1.88) needs newer cxx standard to work +From: https://aur.archlinux.org/cgit/aur.git/tree/0001-Use-cxx14-for-Boost.patch?h=ambertools +Added by: Pavel Tomanek (Inuits) +--- a/AmberTools/src/moft/CMakeLists.txt 2025-02-12 17:09:45.031074795 +0100 ++++ b/AmberTools/src/moft/CMakeLists.txt 2025-02-12 17:08:16.999758347 +0100 +@@ -4,6 +4,7 @@ + + target_include_directories(metatwist PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + target_compile_options(metatwist PRIVATE ${OPT_CXXFLAGS}) ++target_compile_features(metatwist PRIVATE cxx_std_14) + target_link_libraries(metatwist fftw boost_program_options boost_iostreams boost_regex boost_system boost_timer boost_chrono boost_filesystem boost_graph) + + install(TARGETS metatwist DESTINATION ${BINDIR}) \ No newline at end of file diff --git a/easybuild/easyconfigs/a/AmberTools/AmberTools-25_fix-sander-numpy.patch b/easybuild/easyconfigs/a/AmberTools/AmberTools-25_fix-sander-numpy.patch new file mode 100644 index 000000000000..4ccb37e63401 --- /dev/null +++ b/easybuild/easyconfigs/a/AmberTools/AmberTools-25_fix-sander-numpy.patch @@ -0,0 +1,21 @@ +Fix numpy syntax to be compatible with v2 +--- AmberTools/src/pysander/sander/__init__.py.orig 2025-08-08 11:21:39.084040000 +0200 ++++ AmberTools/src/pysander/sander/__init__.py 2025-08-08 11:22:44.758277000 +0200 +@@ -83,7 +83,7 @@ + # numpy arrays to solve this quickly, but in cases where the coordinates + # are given as a list (or tuple) of Vec3's (or tuples), this requires + # separate handling +- positions = _np.array(positions, copy=False, subok=True) ++ positions = _np.asarray(positions) + positions = positions.flatten() + natom = _pys.natom() + if len(positions) != natom * 3: +@@ -260,7 +260,7 @@ + box = rst.box + + # Convert from numpy arrays to regular arrays +- coordinates = _np.array(coordinates, copy=False, subok=True) ++ coordinates = _np.asarray(coordinates) + coordinates = coordinates.flatten().tolist() + if box is None or box is False: + box = _np.zeros(6) diff --git a/easybuild/easyconfigs/a/AmberTools/AmberTools-25_fix_test_missing_dirs.patch b/easybuild/easyconfigs/a/AmberTools/AmberTools-25_fix_test_missing_dirs.patch new file mode 100644 index 000000000000..551e8a1030c4 --- /dev/null +++ b/easybuild/easyconfigs/a/AmberTools/AmberTools-25_fix_test_missing_dirs.patch @@ -0,0 +1,17 @@ +Make sure test_amber_clean.sh dosen't try to cd into a possibly missing directory. +--- test/test_amber_clean.sh.orig 2025-07-14 13:34:48.866262000 +0200 ++++ test/test_amber_clean.sh 2025-07-14 13:35:44.941307000 +0200 +@@ -1273,7 +1273,11 @@ + echo $delete_list | xargs /bin/rm -f + + # Remove cuda remd test output +-cd cuda/remd && make clean && cd ../.. ++if [ -d "cuda/remd" ]; then ++ cd cuda/remd && make clean && cd ../.. ++fi + + # Remove hip remd test output +-cd hip/remd && make clean && cd ../.. ++if [ -d "hip/remd" ]; then ++ cd hip/remd && make clean && cd ../.. ++fi diff --git a/easybuild/easyconfigs/a/AmberTools/AmberTools-25_parmed-update.patch b/easybuild/easyconfigs/a/AmberTools/AmberTools-25_parmed-update.patch new file mode 100644 index 000000000000..0f619fed5fd7 --- /dev/null +++ b/easybuild/easyconfigs/a/AmberTools/AmberTools-25_parmed-update.patch @@ -0,0 +1,241 @@ +Fix parmed compatibility with Numpy 2.x and python 3.13 +From: https://aur.archlinux.org/cgit/aur.git/tree/0002-NumPy-2-compatibility.patch?h=ambertools +Added by: Pavel Tomanek (Inuits) +--- a/AmberTools/src/parmed/parmed/amber/_amberparm.py ++++ b/AmberTools/src/parmed/parmed/amber/_amberparm.py +@@ -2147,7 +2147,7 @@ class AmberParm(AmberFormat, Structure): + box[4] = box[4].value_in_unit(u.degrees) + if u.is_quantity(box[5]): + box[5] = box[5].value_in_unit(u.degrees) +- box = np.array(box, dtype=np.float64, copy=False, subok=True).reshape((-1, 6)) ++ box = np.asanyarray(box, dtype=np.float64).reshape((-1, 6)) + + # We are adding a box for the first time, so make sure we add some flags + if self._box is None: +@@ -2373,7 +2373,7 @@ class Rst7(object): + @property + def velocities(self): + """ Atomic velocities in units of angstroms/picoseconds """ +- return np.array(self.vels, copy=False).reshape(self.natom, 3) ++ return np.asarray(self.vels).reshape(self.natom, 3) + + @property + def box_vectors(self): +--- a/AmberTools/src/parmed/parmed/amber/asciicrd.py ++++ b/AmberTools/src/parmed/parmed/amber/asciicrd.py +@@ -317,7 +317,7 @@ class AmberAsciiRestart(_AmberAsciiCoordinateFile): + def coordinates(self, stuff): + if self._status == 'old': + raise RuntimeError('Cannot set coordinates on an old restart') +- stuff = np.array(stuff, copy=False).ravel() ++ stuff = np.asarray(stuff).ravel() + if self.natom > 0 and len(stuff) != 3 * self.natom: + raise ValueError(f'Got {len(stuff)} coordinates for {self.natom} atoms') + if self._coords_written: +@@ -351,7 +351,7 @@ class AmberAsciiRestart(_AmberAsciiCoordinateFile): + def velocities(self, stuff): + if self._status == 'old': + raise RuntimeError('Cannot set velocities on an old restart') +- stuff = np.array(stuff, copy=False).ravel() ++ stuff = np.asarray(stuff).ravel() + if not self._coords_written: + raise RuntimeError('Coordinates must be set before velocities') + if self._cell_lengths_written or self._cell_angles_written: +@@ -413,7 +413,7 @@ class AmberAsciiRestart(_AmberAsciiCoordinateFile): + raise RuntimeError('Can only write cell lengths once') + if len(stuff) != 3: + raise ValueError('Expected 3 numbers for cell lengths') +- self._cell_lengths = np.array(stuff, copy=False) ++ self._cell_lengths = np.asarray(stuff) + self._file.write('%12.7f%12.7f%12.7f' % (stuff[0], stuff[1], stuff[2])) + self._cell_lengths_written = True + +@@ -429,7 +429,7 @@ class AmberAsciiRestart(_AmberAsciiCoordinateFile): + raise RuntimeError('Can only write cell angles once') + if len(stuff) != 3: + raise ValueError('Expected 3 numbers for cell angles') +- self._cell_angles = np.array(stuff, copy=False) ++ self._cell_angles = np.asarray(stuff) + self._file.write('%12.7f%12.7f%12.7f\n' % (stuff[0],stuff[1],stuff[2])) + self._cell_angles_written = True + +--- a/AmberTools/src/parmed/parmed/amber/netcdffiles.py ++++ b/AmberTools/src/parmed/parmed/amber/netcdffiles.py +@@ -241,7 +241,7 @@ class NetCDFRestart(metaclass=FileFormatType): + + @coordinates.setter + def coordinates(self, stuff): +- stuff = np.array(stuff, copy=False).reshape((self.atom, 3)) ++ stuff = np.asarray(stuff).reshape((self.atom, 3)) + self._ncfile.variables['coordinates'][:] = stuff + self.flush() + +--- a/AmberTools/src/parmed/parmed/formats/pdb.py ++++ b/AmberTools/src/parmed/parmed/formats/pdb.py +@@ -971,7 +971,7 @@ class PDBFile(metaclass=FileFormatType): + symm_line = "REMARK 290 SMTRY" + fmt % tuple(arr_list) + dest.write(symm_line) + if coordinates is not None: +- coords = np.array(coordinates, copy=False, subok=True) ++ coords = np.asanyarray(coordinates) + try: + coords = coords.reshape((-1, len(struct.atoms), 3)) + except ValueError: +@@ -1646,7 +1646,7 @@ class CIFFile(metaclass=FileFormatType): + sym.append([struct.space_group]) + cont.append(sym) + if coordinates is not None: +- coords = np.array(coordinates, copy=False, subok=True) ++ coords = np.asanyarray(coordinates) + try: + coords = coords.reshape((-1, len(struct.atoms), 3)) + except ValueError: +--- a/AmberTools/src/parmed/parmed/formats/pqr.py ++++ b/AmberTools/src/parmed/parmed/formats/pqr.py +@@ -257,7 +257,7 @@ class PQRFile(metaclass=FileFormatType): + struct.box[0], struct.box[1], struct.box[2], struct.box[3], + struct.box[4], struct.box[5])) + if coordinates is not None: +- coords = np.array(coordinates, copy=False, subok=True) ++ coords = np.asanyarray(coordinates) + try: + coords = coords.reshape((-1, len(struct.atoms), 3)) + except ValueError: +--- a/AmberTools/src/parmed/parmed/structure.py ++++ b/AmberTools/src/parmed/parmed/structure.py +@@ -23,7 +23,7 @@ + OutOfPlaneExtraPointFrame, PiTorsion, ResidueList, StretchBend, + ThreeParticleExtraPointFrame, TorsionTorsion, TrackedList, + TrigonalAngle, TwoParticleExtraPointFrame, UnassignedAtomType, +- UreyBradley, Link, LocalCoordinatesFrame) ++ UreyBradley, Link, LocalCoordinatesFrame, QualitativeBondType) + from .utils import PYPY, find_atom_pairs, tag_molecules + from .utils.decorators import needs_openmm + from .vec3 import Vec3 +@@ -1796,7 +1796,7 @@ + if u.is_quantity(value): + value = value.value_in_unit(u.angstroms) + value = list(value) +- coords = np.array(value, dtype=np.float64, copy=False, subok=True) ++ coords = np.asanyarray(value, dtype=np.float64) + coords = coords.reshape((-1, len(self.atoms), 3)) + if len(coords) > 0: + for a, xyz in zip(self.atoms, coords[0]): +@@ -1877,7 +1877,7 @@ + box = value + else: + box = _strip_box_units(list(value)) +- box = np.array(box, dtype=np.float64, copy=False, subok=True) ++ box = np.asanyarray(box, dtype=np.float64) + if box.shape != (6,): + if len(box.shape) != 2 or box.shape[-1] != 6: + raise ValueError('Box information must be 6 floats') +@@ -1944,7 +1944,7 @@ + except AttributeError: + pass + else: +- value = np.array(value, copy=False).reshape( ++ value = np.asarray(value).reshape( + (-1, len(self.atoms), 3)) + for atom, xyz in zip(self.atoms, value[0]): + atom.vx, atom.vy, atom.vz = xyz +@@ -3833,7 +3833,7 @@ + + def idx(thing): + return thing.idx if thing is not None else None +- retdict['bonds'] = [(b.atom1.idx, b.atom2.idx, idx(b.type)) ++ retdict['bonds'] = [(b.atom1.idx, b.atom2.idx, idx(b.type), b.order, b.qualitative_type) + for b in self.bonds] + retdict['angles'] = [(a.atom1.idx, a.atom2.idx, a.atom3.idx, + idx(a.type)) for a in self.angles] +@@ -3910,15 +3910,27 @@ + return None + return typelist[idx] + ++ def assign_order(bond_tuple): ++ if len(bond_tuple) < 4: ++ return 1.0 ++ return bond_tuple[3] ++ ++ def assign_qualitative_type(bond_tuple): ++ if len(bond_tuple) < 5: ++ return None ++ qualitative_type = bond_tuple[4] ++ return QualitativeBondType(qualitative_type) if qualitative_type is not None else None ++ + # Set the topology arrays + self.bonds = TrackedList( +- Bond(self.atoms[it[0]], self.atoms[it[1]], +- type=assign_type(self.bond_types, it[2])) ++ Bond( ++ self.atoms[it[0]], self.atoms[it[1]], type=assign_type(self.bond_types, it[2]), ++ order=assign_order(it), qualitative_type=assign_qualitative_type(it), ++ ) + for it in d['bonds'] + ) + self.angles = TrackedList( +- Angle(self.atoms[it[0]], self.atoms[it[1]], self.atoms[it[2]], +- type=assign_type(self.angle_types, it[3])) ++ Angle(self.atoms[it[0]], self.atoms[it[1]], self.atoms[it[2]], type=assign_type(self.angle_types, it[3])) + for it in d['angles'] + ) + self.dihedrals = TrackedList( +@@ -3957,8 +3969,7 @@ + ) + self.pi_torsions = TrackedList( + PiTorsion(self.atoms[it[0]], self.atoms[it[1]], self.atoms[it[2]], self.atoms[it[3]], +- self.atoms[it[4]], self.atoms[it[5]], +- type=assign_type(self.pi_torsion_types, it[6])) ++ self.atoms[it[4]], self.atoms[it[5]], type=assign_type(self.pi_torsion_types, it[6])) + for it in d['pi_torsions'] + ) + self.stretch_bends = TrackedList( +@@ -3968,8 +3979,7 @@ + ) + self.torsion_torsions = TrackedList( + TorsionTorsion(self.atoms[it[0]], self.atoms[it[1]], self.atoms[it[2]], +- self.atoms[it[3]], self.atoms[it[4]], +- type=assign_type(self.torsion_torsion_types, it[5])) ++ self.atoms[it[3]], self.atoms[it[4]], type=assign_type(self.torsion_torsion_types, it[5])) + for it in d['torsion_torsions'] + ) + self.chiral_frames = TrackedList( +@@ -3979,8 +3989,7 @@ + MultipoleFrame(self.atoms[it[0]], *it[1:]) for it in d['multipole_frames'] + ) + self.adjusts = TrackedList( +- NonbondedException(self.atoms[it[0]], self.atoms[it[1]], +- assign_type(self.adjust_types, it[2])) ++ NonbondedException(self.atoms[it[0]], self.atoms[it[1]], assign_type(self.adjust_types, it[2])) + for it in d['adjusts'] + ) + self.acceptors = TrackedList( +--- a/AmberTools/src/parmed/parmed/utils/netcdf.py 2025-03-24 15:55:38.000000000 +0100 ++++ b/AmberTools/src/parmed/parmed/utils/netcdf.py 2025-07-15 14:14:34.000940000 +0200 +@@ -39,15 +39,25 @@ + from operator import mul + from collections import OrderedDict + from platform import python_implementation ++from typing import Any + + import mmap as mm + + import numpy as np +-from numpy.compat import asbytes, asstr + from numpy import frombuffer, dtype, empty, array, asarray + from numpy import little_endian as LITTLE_ENDIAN + from functools import reduce + ++def asbytes(s: Any) -> bytes: ++ """Ensures input is in bytes format. Mimics numpy.compat.asbytes""" ++ return str(s).encode("latin1") if isinstance(s, str) else s ++ ++ ++def asstr(b: Any) -> str: ++ """Ensures input is in string format. Mimics numpy.compat.asstr""" ++ return b.decode("latin1") if isinstance(b, bytes) else str(b) ++ ++ + + IS_PYPY = python_implementation() == 'PyPy' + \ No newline at end of file diff --git a/easybuild/easyconfigs/a/AmberTools/AmberTools-25_skip-tests.patch b/easybuild/easyconfigs/a/AmberTools/AmberTools-25_skip-tests.patch new file mode 100644 index 000000000000..892d0f318640 --- /dev/null +++ b/easybuild/easyconfigs/a/AmberTools/AmberTools-25_skip-tests.patch @@ -0,0 +1,190 @@ +Skip tests from /2048_wat_gem - all failing with: IEEE_DENORMAL + possible FAILURE +pmemd.gem not works with GEM, only with AMOEBA +cpptraj and pytraj are not compatible with python3.13 and cython 3.x +see: https://github.com/Amber-MD/pytraj/issues/1677 + https://github.com/Amber-MD/pytraj/issues/1648 +other failing comparasions: leap, reduce, kmmd +--- test/Makefile.orig 2025-08-04 14:40:37.401381000 +0200 ++++ test/Makefile 2025-08-04 14:41:01.054906000 +0200 +@@ -55,7 +55,7 @@ + test.serial.sander.MM: test.sander.BASIC.nopar test.sander.BASIC \ + test.sander.GB test.sander.LES test.sander.PIMD.partial \ + test.serial.sander.nfe test.sander.pgm test.pbsa test.sander.constph test.sander.conste \ +- test.sander.constphe test.sander.RISM test.serial.sander.kmmd \ ++ test.sander.constphe test.sander.RISM \ + test.sander.crgreloc test.serial.sander.AMD test.serial.sander.sgld \ + test.serial.sander.emap test.sander.OIN test.sander.CHARMM \ + test.sander.SINR test.sander.music test.sander.middle-scheme \ +@@ -128,7 +128,7 @@ + test.sander.crgreloc.MPI test.parallel.sander.AMD \ + test.parallel.sander.sgld test.parallel.sander.emap \ + test.sander.OIN.MPI test.sander.SINR.MPI test.sander.music.MPI \ +- test.sander.middle-scheme.MPI test.parallel.sander.kmmd \ ++ test.sander.middle-scheme.MPI \ + test.sander.TFE.MPI + + test.parallel.QMMM: \ +@@ -1644,21 +1644,21 @@ + -export TESTsander='$(BINDIR)/pmemd'; unset DO_PARALLEL; cd emil/emil_pmemd_tip3p && ./Run.emil $(EMIL) + + #KMMD TESTS +-test.serial.pmemd.kmmd: +- -export TESTsander='$(BINDIR)/pmemd'; unset DO_PARALLEL; cd kmmd/kmmd_pmemd && ./Run.kmmd +- -export TESTsander='$(BINDIR)/pmemd'; unset DO_PARALLEL; cd kmmd/kmmd_pmemd_gb && ./Run.kmmd +- +-test.serial.sander.kmmd: +- -export TESTsander='$(BINDIR)/sander'; unset DO_PARALLEL; cd ../AmberTools/test/kmmd/kmmd_sander && ./Run.kmmd +- -export TESTsander='$(BINDIR)/sander'; unset DO_PARALLEL; cd ../AmberTools/test/kmmd/kmmd_sander_gb && ./Run.kmmd ++# test.serial.pmemd.kmmd: ++# -export TESTsander='$(BINDIR)/pmemd'; unset DO_PARALLEL; cd kmmd/kmmd_pmemd && ./Run.kmmd ++# -export TESTsander='$(BINDIR)/pmemd'; unset DO_PARALLEL; cd kmmd/kmmd_pmemd_gb && ./Run.kmmd ++ ++# test.serial.sander.kmmd: ++# -export TESTsander='$(BINDIR)/sander'; unset DO_PARALLEL; cd ../AmberTools/test/kmmd/kmmd_sander && ./Run.kmmd ++# -export TESTsander='$(BINDIR)/sander'; unset DO_PARALLEL; cd ../AmberTools/test/kmmd/kmmd_sander_gb && ./Run.kmmd + + test.parallel.pmemd.kmmd: + -export TESTsander='$(BINDIR)/pmemd.MPI'; cd kmmd/kmmd_pmemd && ./Run.kmmd + -export TESTsander='$(BINDIR)/pmemd.MPI'; cd kmmd/kmmd_pmemd_gb && ./Run.kmmd + +-test.parallel.sander.kmmd: +- -export TESTsander='$(BINDIR)/sander.MPI'; cd ../AmberTools/test/kmmd/kmmd_sander && ./Run.kmmd +- -export TESTsander='$(BINDIR)/sander.MPI'; cd ../AmberTools/test/kmmd/kmmd_sander_gb && ./Run.kmmd ++# test.parallel.sander.kmmd: ++# -export TESTsander='$(BINDIR)/sander.MPI'; cd ../AmberTools/test/kmmd/kmmd_sander && ./Run.kmmd ++# -export TESTsander='$(BINDIR)/sander.MPI'; cd ../AmberTools/test/kmmd/kmmd_sander_gb && ./Run.kmmd + + + #TI TESTS +@@ -1777,10 +1777,10 @@ + -cd neb-testcases/neb_explicit && ./Run.neb_explicit_pmemd + + test.gem.pmemd.yes: +- -cd 2048_wat_gem && ./Run.2048_wat_nvt_gem.pmemd.gemstar +- -cd 2048_wat_gem && ./Run.2048_wat_MCbar_gem.pmemd.gemstar +- -cd 2048_wat_gem && ./Run.2048_wat_nvt_gem.pmemd.gem +- -cd 2048_wat_gem && ./Run.2048_wat_MCbar_gem.pmemd.gem ++# -cd 2048_wat_gem && ./Run.2048_wat_nvt_gem.pmemd.gemstar ++# -cd 2048_wat_gem && ./Run.2048_wat_MCbar_gem.pmemd.gemstar ++# -cd 2048_wat_gem && ./Run.2048_wat_nvt_gem.pmemd.gem ++# -cd 2048_wat_gem && ./Run.2048_wat_MCbar_gem.pmemd.gem + -cd amoeba_formbox && ./Run.amoeba_formbox.pmemd.gem + -cd amoeba_IL && ./Run.amoeba_IL.pmemd.gem + -cd amoeba_jac3 && ./Run.jac_amba_beeman_MCbar.pmemd.gem +@@ -1797,10 +1797,10 @@ + + test.gem.pmemd.MPI.yes: + +- -export TESTsander='${AMBERHOME}/bin/gem.pmemd.MPI'; cd 2048_wat_gem && ./Run.2048_wat_nvt_gem.pmemd.gemstar +- -export TESTsander='${AMBERHOME}/bin/gem.pmemd.MPI'; cd 2048_wat_gem && ./Run.2048_wat_MCbar_gem.pmemd.gemstar +- -export TESTsander='${AMBERHOME}/bin/gem.pmemd.MPI'; cd 2048_wat_gem && ./Run.2048_wat_nvt_gem.pmemd.gem +- -export TESTsander='${AMBERHOME}/bin/gem.pmemd.MPI'; cd 2048_wat_gem && ./Run.2048_wat_MCbar_gem.pmemd.gem ++# -export TESTsander='${AMBERHOME}/bin/gem.pmemd.MPI'; cd 2048_wat_gem && ./Run.2048_wat_nvt_gem.pmemd.gemstar ++# -export TESTsander='${AMBERHOME}/bin/gem.pmemd.MPI'; cd 2048_wat_gem && ./Run.2048_wat_MCbar_gem.pmemd.gemstar ++# -export TESTsander='${AMBERHOME}/bin/gem.pmemd.MPI'; cd 2048_wat_gem && ./Run.2048_wat_nvt_gem.pmemd.gem ++# -export TESTsander='${AMBERHOME}/bin/gem.pmemd.MPI'; cd 2048_wat_gem && ./Run.2048_wat_MCbar_gem.pmemd.gem + -export TESTsander='${AMBERHOME}/bin/gem.pmemd.MPI'; cd amoeba_formbox && ./Run.amoeba_formbox.pmemd.gem + -export TESTsander='${AMBERHOME}/bin/gem.pmemd.MPI'; cd amoeba_IL && ./Run.amoeba_IL.pmemd.gem + -export TESTsander='${AMBERHOME}/bin/gem.pmemd.MPI'; cd amoeba_jac3 && ./Run.jac_amba_beeman_MCbar.pmemd.gem + +--- AmberTools/test/Makefile.orig 2025-08-07 13:56:48.705382000 +0200 ++++ AmberTools/test/Makefile 2025-08-07 14:00:13.526533000 +0200 +@@ -39,8 +39,8 @@ + ###### Intermediate-level targets: ############################ + + fast.serial: clean is_amberhome_defined \ +- fast.cpptraj fast.ambpdb fast.pytraj fast.antechamber fast.mdgx \ +- fast.leap fast.unitcell fast.resp fast.py_resp fast.reduce fast.pbsa fast.gbnsr6 \ ++ fast.ambpdb fast.pytraj fast.antechamber fast.mdgx \ ++ fast.unitcell fast.resp fast.py_resp fast.pbsa fast.gbnsr6 \ + fast.parmed fast.elsize fast.sqm fast.rism1d \ + fast.rism3d fast.paramfit \ + fast.cphstats fast.cestats fast.charmmlipid2amber fast.cpinutil \ +@@ -86,9 +86,9 @@ + fast.unitcell: + + test.serial: clean is_amberhome_defined \ +- test.cpptraj test.pytraj test.antechamber test.mdgx \ +- test.leap test.unitcell test.resp test.py_resp test.reduce test.pbsa test.gbnsr6 \ +- test.parmed test.elsize test.sqm test.rism1d test.kmmd \ ++ test.antechamber test.mdgx \ ++ test.unitcell test.resp test.py_resp test.pbsa test.gbnsr6 \ ++ test.parmed test.elsize test.sqm test.rism1d \ + test.rism3d test.paramfit test.mm_pbsa \ + test.FEW test.cphstats test.cestats test.charmmlipid2amber \ + test.cpinutil test.ceinutil test.cpeinutil test.genremdinputs test.fitpkaeo \ +@@ -96,9 +96,9 @@ + test.Quick test.modxna test.pyperesp + + test.serial.nopython: clean is_amberhome_defined \ +- test.cpptraj test.antechamber test.mdgx \ +- test.leap test.unitcell test.resp test.reduce test.pbsa test.gbnsr6 \ +- test.elsize test.sqm test.rism1d test.kmmd \ ++ test.antechamber test.mdgx \ ++ test.unitcell test.resp test.pbsa test.gbnsr6 \ ++ test.elsize test.sqm test.rism1d \ + test.rism3d test.paramfit test.mm_pbsa \ + test.FEW test.cphstats test.cestats test.modxna + +@@ -106,7 +106,7 @@ + cd ../src/cpptraj/test && $(MAKE) -k test + + test.parallel2: clean is_amberhome_defined \ +- test.cpptraj test.rism3d \ ++ test.rism3d \ + test.Quick.MPI test.mmpbsa.parallel + + test.cuda.serial2: clean is_amberhome_defined \ +@@ -129,21 +129,21 @@ + cd mdgx && ./Run.existence + cd mdgx/Peptides && ./Test.peptides ${AMBERHOME}/bin/mdgx.cuda cuda + +-test.kmmd: +- cd kmmd/kmmd_sander && ./Run.kmmd +- cd kmmd/kmmd_sander_gb && ./Run.kmmd ++# test.kmmd: ++# cd kmmd/kmmd_sander && ./Run.kmmd ++# cd kmmd/kmmd_sander_gb && ./Run.kmmd + + test.ambermini: test.leap test.sqm test.antechamber test.reduce test.paramfit + +-test.ptraj: +- -cd ptraj_rmsa && ./Run.rms +- -cd ptraj_rms && ./Run.rms +-# -cd ptraj_les && ./Run.les +- -cd ptraj_matrix && ./Run.matrix +- -cd ptraj_order && ./Run.order +- -cd ptraj_trajectory && ./Run.ptraj +- -cd ptraj_remd_netcdf && ./Run.ptraj $(NETCDF) +- -cd ptraj_comprehensive && ./Run.comprehensive $(NETCDF) ++# test.ptraj: ++# -cd ptraj_rmsa && ./Run.rms ++# -cd ptraj_rms && ./Run.rms ++# # -cd ptraj_les && ./Run.les ++# -cd ptraj_matrix && ./Run.matrix ++# -cd ptraj_order && ./Run.order ++# -cd ptraj_trajectory && ./Run.ptraj ++# -cd ptraj_remd_netcdf && ./Run.ptraj $(NETCDF) ++# -cd ptraj_comprehensive && ./Run.comprehensive $(NETCDF) + + test.antechamber: + cd antechamber && $(MAKE) -k test +@@ -163,8 +163,8 @@ + test.cpptraj.hip: + cd ../src/cpptraj/test && $(MAKE) -k test.hip + +-test.pytraj: +- cd pytraj && $(MAKE) ++# test.pytraj: ++# cd pytraj && $(MAKE) + + test.pymsmt: + cd pymsmt/mcpb/g03-ff14SB && ./Run.pymsmt +@@ -494,7 +494,7 @@ + test.pysander: + cd ../../test/sanderapi && make Python + +-test.python: test.pysander test.parmed test.pytraj test.pymsmt \ ++test.python: test.pysander test.parmed test.pymsmt \ + test.cpinutil test.ceinutil test.cpeinutil test.genremdinputs test.fitpkaeo \ + test.fixremdcouts test.mmpbsa test.py_resp test.bar_pbsa + diff --git a/easybuild/easyconfigs/p/PLUMED/PLUMED-2.9.4-foss-2025a.eb b/easybuild/easyconfigs/p/PLUMED/PLUMED-2.9.4-foss-2025a.eb new file mode 100644 index 000000000000..0d61800b4056 --- /dev/null +++ b/easybuild/easyconfigs/p/PLUMED/PLUMED-2.9.4-foss-2025a.eb @@ -0,0 +1,55 @@ +easyblock = 'ConfigureMake' + +name = 'PLUMED' +version = '2.9.4' + +homepage = 'https://www.plumed.org' +description = """PLUMED is an open source library for free energy calculations in molecular systems which + works together with some of the most popular molecular dynamics engines. Free energy calculations can be + performed as a function of many order parameters with a particular focus on biological problems, using + state of the art methods such as metadynamics, umbrella sampling and Jarzynski-equation based steered MD. + The software, written in C++, can be easily interfaced with both fortran and C/C++ codes. +""" + +toolchain = {'name': 'foss', 'version': '2025a'} +toolchainopts = {'usempi': 'True'} + +source_urls = ['https://github.com/plumed/plumed2/archive'] +sources = ['v%(version)s.tar.gz'] +checksums = ['3068ab5e28cbae38b582d128fecac14c820762244d8eb87ad6030f04f96ecd78'] + +builddependencies = [ + ('xxd', '9.1.1457'), + ('Cython', '3.1.1'), +] + +dependencies = [ + ('zlib', '1.3.1'), + ('GSL', '2.8'), + ('Python', '3.13.1'), + ('SciPy-bundle', '2025.06'), + ('Boost', '1.88.0'), +] + +preconfigopts = 'env FC=$MPIF90 LIBS="$LIBLAPACK $LIBS" ' +configopts = '--exec-prefix=%(installdir)s --enable-gsl --enable-modules=all --enable-python ' +configopts += '--enable-boost_graph --enable-boost_serialization ' +prebuildopts = 'source sourceme.sh && ' + +# install path for PLUMED libraries must be included in $LD_LIBRARY_PATH when Python bindings get built/installed +preinstallopts = 'LD_LIBRARY_PATH="%(installdir)s/lib:$LD_LIBRARY_PATH" ' + +sanity_check_paths = { + 'files': ['bin/plumed', 'lib/libplumedKernel.%s' % SHLIB_EXT, 'lib/libplumed.%s' % SHLIB_EXT], + 'dirs': [], +} + +sanity_check_commands = ["python -c 'import plumed'"] + +modextrapaths = { + 'PLUMED_KERNEL': 'lib/libplumedKernel.%s' % SHLIB_EXT, + 'PLUMED_ROOT': 'lib/plumed', + 'PYTHONPATH': 'lib/plumed/python', +} + +moduleclass = 'chem'