From 92ec1c95925c151a2afffc380b0a385fbda6e45b Mon Sep 17 00:00:00 2001 From: Morten Ledum Date: Wed, 22 Dec 2021 05:26:38 +0100 Subject: [PATCH] Update readme and dockerfile --- .docker/hymd/Dockerfile | 27 ++++++++++ README.md | 84 ++++++++++++++++++++++-------- docs/img/hymd_logo_text_black.png | Bin 0 -> 8397 bytes hymd/version.py | 2 +- setup.py | 12 +++++ 5 files changed, 103 insertions(+), 22 deletions(-) create mode 100644 .docker/hymd/Dockerfile create mode 100644 docs/img/hymd_logo_text_black.png diff --git a/.docker/hymd/Dockerfile b/.docker/hymd/Dockerfile new file mode 100644 index 00000000..ad70341e --- /dev/null +++ b/.docker/hymd/Dockerfile @@ -0,0 +1,27 @@ +FROM ubuntu:20.04 + +# Fix for tzdata installation from +# https://rtfm.co.ua/en/docker-configure-tzdata-and-timezone-during-build/ +ENV TZ=Europe/Oslo +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN apt-get update && apt-get install -y \ + libopenmpi-dev \ + libhdf5-openmpi-dev \ + pkg-config \ + curl \ + python3.8 \ + python3-pip \ + python3-mpi4py \ + python3-numpy + +RUN python3 -m pip install --upgrade pip && \ + python3 -m pip install --no-cache-dir cython numpy mpi4py cython && \ + python3 -m pip install networkx sympy pytest pytest-mpi mpsort pfft-python pmesh tomli + +ENV CC=mpicc +ENV HDF5_MPI="ON" +RUN python3 -m pip install --no-cache-dir --no-binary=h5py h5py + +COPY . /app +WORKDIR /app diff --git a/README.md b/README.md index e7600cf0..2f680ced 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,79 @@ -HyMD testing and development · [![License: GPL v3](https://img.shields.io/badge/License-LGPLv3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0.html) ![build](https://github.com/Cascella-Group-UiO/HyMD-2021/workflows/build/badge.svg) + + +[![License: GPL v3](https://img.shields.io/badge/License-LGPLv3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0.html) ![build](https://github.com/Cascella-Group-UiO/HyMD-2021/workflows/build/badge.svg) [![docs_pages](https://github.com/Cascella-Group-UiO/HyMD/actions/workflows/docs_pages.yml/badge.svg?branch=docs_setup)](https://github.com/Cascella-Group-UiO/HyMD/actions/workflows/docs_pages.yml) [![codecov](https://codecov.io/gh/Cascella-Group-UiO/HyMD/branch/main/graph/badge.svg?token=BXZ7B9RXV9)](https://codecov.io/gh/Cascella-Group-UiO/HyMD) + --------- -HyMD is a software that can run coarse-grained molecular dynamics simulations -using the hybrid-particle field model approach, introduced initially in [1]. -In HyMD we implement the formulation presented in [2]. +**HylleraasMD** (HyMD) is a massively parallel Python package for hybrid particle-field molecular dynamics (hPF-MD) simulations of coarse-grained bio- and soft-matter systems. + +HyMD can run canonical hPF-MD simulations [[1]](#1), or filtered density Hamiltonian hPF (HhPF-MD) simulations [[2]](#2), with or without explicit PME electrostatic interactions [[3]](#3). It includes all standard intramolecular interactions, including stretching, bending, torsional, and combined bending-dihedral potentials. Additionally, topological reconstruction of permanent peptide chain backbone dipoles is possible for accurate recreation of protein conformational dynamics [[4]](#4). Martini style elastic networks (ElNeDyn) [[5]](#5) are also supported. + +HyMD uses the [pmesh](github.com/rainwoodman/pmesh) library for particle-mesh operations, with the PPFT [[6]](#6) backend for FFTs through the [pfft-python bindings](github.com/rainwoodman/pfft-python). File IO is done via HDF5 formats to allow MPI parallel reads. + +## User Guide +Detailed installation and user guide, together with comprehensive example simulations are located in the [HylleraasMD documentation](https://cascella-group-uio.github.io/HyMD/index.html). + +Run simulations by +```bash +python3 -m hymd [CONFIGURATION_FILE] [TOPOLOGY_FILE] +``` -## Setup -First compile the FORTRAN modules: +## Installation +Install HyMD with `pip` by +```bash +python3 -m pip install hymd +``` +#### Install dependencies +HyMD installation **requires** a working MPI compiler. It is highly recommended to have *MPI-enabled* HDF5 and [h5py](https://docs.h5py.org/en/stable/mpi.html) for running parallel simulations with HyMD. Install both on Ubuntu with ```bash -> cd hymd/ -> make clean -> make -> cd .. +sudo apt-get update -y +sudo apt-get install -y curl pkg-config python3-pip python3-mpi4py libhdf5-mpi-dev +export CC=mpicc +export HDF5_MPI="ON" +python3 -m pip install --no-binary=h5py h5py ``` -Check out all the available options with +#### Run in docker +Alternatively, an up-to-date docker image is available from [docker hub](https://hub.docker.com/repository/docker/mortele/hymd) ```bash -> python3 hymd/main.py --help +docker pull mortele/hymd +docker run -it mortele/hymd +/app# apt-get install -y git +/app# git clone https://github.com/Cascella-Group-UiO/HyMD.git hymd +/app# cd hymd/ +/app/hymd# pip3 install . +/app/hymd# pytest ``` -Start a simple example simulation with: +## Run tests +Clone the repository and run tests with [pytest](https://docs.pytest.org/en/latest) ```bash -> mpirun -n 4 python3 hymd/main.py peptide.toml peptide.h5 -v +git clone https://github.com/Cascella-Group-UiO/HyMD.git hymd +cd hymd +pytest ``` +Running MPI enabled pytest tests is simplified with a convenient script +```bash +chmod +x pytest-mpi +pytest-mpi -oo -n 2 -ns +``` + +--------- -## References -[1] Milano, G. & Kawakatsu, T. Hybrid particle-field molecular dynamics -simulations for dense polymer systems Journal of Chemical Physics, American -Institute of Physics, 2009, 130, 214106 +### References +[1] +Milano, G.; Kawakatsu, T. Hybrid particle-field molecular dynamics simulations for densepolymer systems. J. Chem. Phys. **2009**, 130, 214106. -[2] Bore, S. L. & Cascella, M. Hamiltonian and alias-free hybrid -particle--field molecular dynamics The Journal of Chemical Physics, AIP -Publishing LLC, 2020, 153, 094106 +[2] +Bore, S. L.; Cascella, M. Hamiltonian and alias-free hybrid particle–field molecular dynam-ics. J. Chem. Phys. **2020**, 153, 094106. +[3] +Kolli, H. B.; De Nicola, A.; Bore, S. L.; Schäfer, K.; Diezemann, G.; Gauss, J.; Kawakatsu, T.;Lu, Z.-Y.; Zhu, Y.-L.; Milano, G.; Cascella, M. Hybrid Particle-Field Molecular DynamicsSimulations of Charged Amphiphiles in an Aqueous Environment. J. Chem. Theory Comput. **2018**, 14, 4928–4937. +[4] +Bore, S. L.; Milano, G.; Cascella, M. Hybrid Particle-Field Model for Conformational Dy-namics of Peptide Chains. J. Chem. Theory Comput. **2018**, 14, 1120–1130. +[5] +Periole, X.; Cavalli, M.; Marrink, S. J.; Ceruso, M. A. Combining an elastic network with a coarse-grained molecular force field: structure, dynamics, and intermolecular recognition. J. Chem. Theory Comput. **2009**, 5.9, 2531-2543. +[6] +Pippig, M. PFFT: An extension of FFTW to massively parallel architectures. SIAM J. Sci. Comput. **2013**, 35, C213–C236. diff --git a/docs/img/hymd_logo_text_black.png b/docs/img/hymd_logo_text_black.png new file mode 100644 index 0000000000000000000000000000000000000000..eecdc4eba4db7a5719e65e38077d09770c778e15 GIT binary patch literal 8397 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 U5&D)8_ay$Ayo|DRt&}O~f9J?(YXATM literal 0 HcmV?d00001 diff --git a/hymd/version.py b/hymd/version.py index 5c4105cd..7863915f 100644 --- a/hymd/version.py +++ b/hymd/version.py @@ -1 +1 @@ -__version__ = "1.0.1" +__version__ = "1.0.2" diff --git a/setup.py b/setup.py index 8677c917..9276c48b 100644 --- a/setup.py +++ b/setup.py @@ -41,6 +41,18 @@ def find_version(path): packages=["hymd"], version=find_version("hymd/version.py"), ext_modules=[force_kernels], + install_requires=[ + "cython", + "h5py", + "mpi4py", + "mpsort", + "networkx", + "numpy", + "pfft-python", + "pmesh", + "sympy", + "tomli", + ], python_requires=">=3.6", classifiers=[ "Development Status :: 5 - Production/Stable",