Packmol generate mixture
Skill jinzhezenggroup/computational-chemistry-agent-skills/data-processing/packmol-generate-mixture
Agent skills to run computational-chemistry tasks, used in OpenClaw
npx -y skills add jinzhezenggroup/computational-chemistry-agent-skills --skill packmol-generate-mixtureAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its author says it does
Copied from the file, not written here
A tool for generating initial packed molecular configurations (XYZ format) from single-molecule structures by calculating box dimensions, writing input scripts, and executing Packmol. USE WHEN you need to randomly pack a specific number of molecules into a simulation box (defined by target density or fixed lengths) to create starting geometries for molecular dynamics or related computational chemistry workflows.
The file declares its own license as LGPL-3.0-or-later. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
5.3 KB, as published. Nobody here has run it
packmol-generate-mixture
Use Packmol to generate an initial packed configuration for a molecular mixture.
Agent responsibilities (do these in order)
-
Collect inputs (ask if missing; do not guess):
- component structure files (XYZ), one per species (e.g.
species1.xyz,species2.xyz) - molecule counts for each species (e.g.
species1: 100,species2: 650) - either target density (g/cm^3) or a fixed cubic box length (Å)
- Packmol
tolerance(Å) - output location: output directory + output filename prefix (system name)
- component structure files (XYZ), one per species (e.g.
-
Validate inputs:
- confirm XYZ files exist and are readable
- confirm the first line (atom count) matches the number of coordinate lines
- if density-based box estimation is requested: confirm each molecule’s elemental composition can be inferred from the XYZ symbols
-
Decide box size:
- If user provides
box_length_A: use it. - Else compute
box_length_Afrom density (see formula below).
- If user provides
-
Create a working folder at the requested output location:
- copy the component XYZ files into it (or reference them with absolute paths)
-
Write Packmol input
${system_name}.inp:- one
structure ... end structureblock per component - all components share the same
inside box 0 0 0 L L L
- one
-
Run Packmol locally:
- Prefer:
uvx packmol -i ${system_name}.inp - If you need to force the source package:
uvx --from packmol packmol -i ${system_name}.inp
- Prefer:
-
Report results:
- exact output paths (inp, xyz, log)
- final box length (Å) and the parameters used (counts, density or fixed L, tolerance)
- basic sanity checks (total molecules, total atoms)
-
(Optional) Post-process for LAMMPS
If the user plans to run LAMMPS (especially ReaxFF), they often need a LAMMPS data file with correct box bounds.
- If you convert XYZ -> LAMMPS data with dpdata, dpdata may write default box bounds (e.g., 0..100 Å).
- Fix the bounds to match the Packmol cubic box length using
lammps-md-toolsfrom PyPI:
uvx --from lammps-md-tools lammps-fix-box \
--in input.data \
--out output.boxfix.data \
--L 60.690 \
--wrap
This rewrites xlo/xhi, ylo/yhi, zlo/zhi to 0..L, zeroes tilt factors, and optionally wraps atoms into the box.
What to ask the user (plain language)
If the user didn’t specify them, ask at minimum:
- Packing counts: how many molecules of each species? (e.g.,
species1=100, species2=650) - Box definition: do you want to estimate a cubic box from a target density (g/cm^3), or do you want to provide a fixed cubic box length L (Å)?
- Tolerance: what Packmol
tolerance(Å) should be used? (common starting point: 2.0 Å) - Output location: which directory should receive the results, and what system name / filename prefix should be used?
If the user says “use defaults”, propose defaults:
tolerance = 2.0 Å- output dir: a
packed/subfolder under the folder containing the input XYZ - (density) do not assume; ask for it, but you may suggest a starting value the user can confirm.
Input schema (recommended)
Example (replace with your own species/files):
system_name: mixture_pack
output_dir: /path/to/output/packed
# Choose ONE of the following:
density_g_cm3: 0.25
# box_length_A: 60.69
tolerance_A: 2.0
components:
- name: species1
structure_file: /path/to/species1.xyz
number: 100
- name: species2
structure_file: /path/to/species2.xyz
number: 650
Density → cubic box length (Å)
When density_g_cm3 is provided and box_length_A is not, estimate L from total mass:
- infer each molecule’s elemental composition from its XYZ symbols
- use standard atomic masses (g/mol)
- compute total molar mass of the whole configuration (g/mol)
- convert to mass per configuration:
m_cfg = M_total / N_A(g) - compute volume in cm^3:
V_cm3 = m_cfg / density_g_cm3 - convert to Å^3:
V_A3 = V_cm3 * 1e24 - cubic length:
L_A = V_A3 ** (1/3)
This is an initial packing estimate (geometry construction), not an equilibrated density.
Output contract
The run should produce (within output_dir):
${system_name}.inp(Packmol input)${system_name}.xyz(packed XYZ output; name may include_packedsuffix)packmol.out(stdout log; capture withtee)
Limitations (be explicit)
- Packed XYZ has coordinates only; no topology, no force-field types, no LAMMPS data.
- Packing success ≠ physically valid structure; minimization/equilibration still required.