[![Rust](https://github.com/mlund/cppm-generator/actions/workflows/rust.yml/badge.svg)](https://github.com/mlund/cppm-generator/actions/workflows/rust.yml)
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.6487965.svg)](https://doi.org/10.5281/zenodo.6487965)
# CPPM generator
## Overview
This is a single command-line tool that generates spherical
Charged Patchy Particle Models (CPPM) which mimic bio-colloidal
particles, _e.g._ globular proteins.
The figure below shows examples of interacting CPPMs taken from https://doi.org/10.1063/1.4928077:
`cppm-generator` generates CPPMs by placing neutral, positive, and negative particles
on the surface of a sphere, and minimise the (free) energy using
Metropolis-Hastings Monte Carlo sampling.
## Installing
~~~ bash
$ cargo install cppm-generator
~~~
## Usage
The default parameters produce an isotropic, charged particle similar to `P00` from Table 1 in
[this](https://doi.org/10.48550/arXiv.1701.02457) publication.
It is also possible to impose a target molecular dipole moment using the `--dipole` option.
~~~
$ cppm-generator --help
USAGE:
cppm-generator [OPTIONS] --file
OPTIONS:
-b, --bjerrum-length Bjerrum length (Å) [default: 7.0]
-h, --help Print help information
-m, --minus Number of negative (-1e) particles [default: 37]
-N Total number of particles [default: 643]
-o, --file Output structure (.xyz or .pqr)
-p, --plus Number of positive (+1e) particles [default: 29]
-r, --radius Sphere radius (Å) [default: 20.0]
-s, --steps Number of Monte Carlo iterations [default: 10000]
-u, --dipole Target dipole moment (Debye)
-V, --version Print version information
~~~
## Details and status:
- [x] Random walk on a sphere using spherical coordinates
- [x] Particle-particle interactions using a Coulomb/softcore potential
- [x] Arbitrary mixing of neutral and charged particles
- [x] Output to `.xyz` and `.pqr` files
- [x] Command line interface
- [x] Dipole moment analysis
- [ ] External electric field to induce arbitrary patches
- [x] Constrain to target dipole moment w. harmonic potential
- [x] Written in Rust
- [ ] Use [uon](https://crates.io/crates/uom) for dimensional analysis
- [x] IO error handling
- [ ] Unittests
- [ ] Logging support
## Motivation
Besides some scientific use, this project is mainly a first dive
into the Rust programming language.