Executing a LAMMPS Workflow
This workflow template has a number of parameters including the following:
- The workflow template describes an ephemeral
ScratchVolumethat will be used to set up a LAMMPS simulation by theStageinScriptdownloaded fromExperimentUrlduring the ingress phase of the workflow. A stagein script takes the name of the experiment (RunName) as an argument. - If a
StageoutScriptis provided it will also be downloaded fromExperimentUrland will take care to save the LAMMPS output to, for example, the persistentDataVolumewhich will be mounted if aStageoutScriptis used. The stageout script takes the name of the run as well as an output location as an argument. - Resources used for the simulation run as well as optional LAMMPS arguments.
This allows you the flexibility to set up many different LAMMPS runs. The default values
will set up and run a simple Lennard Jones fluid with input data from the
LAMMPS tutorial inputs repository and
the data will be written to a persistent DataVolume. In this example the StageinScript
looks like so:
#! /bin/sh
# used to set up example from https://github.com/lammpstutorials/lammpstutorials-inputs
set -ex
run="${1}"
mkdir -p "${run}" && cd "${run}"
commit="4e249a6f7a0f8f8057bf72c07d39841a297e69a6"
url="https://raw.githubusercontent.com/lammpstutorials/lammpstutorials-inputs/${commit}"
wget -q -O input.lammps "${url}/level1/lennard-jones-fluid/my-first-input/input.lammps"
And this is the StageoutScript:
#! /bin/sh
set -ex
run="${1}"
dest="${2}"
mkdir -p "${dest}"
if [ -d "${run}" ] ; then
tar -czf "${dest}/${FB_WORKFLOW_ID}-${run}.tar.gz" "${run}"
echo "saved results to ${dest}/${FB_WORKFLOW_ID}-${run}.tar.gz"
else
echo "did not save results to persistent store"
fi
The instructions on this page will show you how to execute a LAMMPS CPU workflow using the workflow catalog with the Fuzzball web UI and CLI.
You can run the LAMMPS CPU workflow template with your inputs or example data from the workflow catalog page by locating the LAMPS CPU card with the CIQ badge and clicking “Run”.

You will be prompted to supply values for the configurable options of the template. You can examine all the options and their documentation and either accept the defaults or provide your own.

Click “Validate” to check the options you provided against the workflow template. If there were no errors “Validate” will be replaced by “Continue”

After clicking “Continue” you will be prompted in a dialog box to “Start Workflow” to submit the Fuzzfile rendered from the workflow template and your inputs. At this stage you can modify the name of the run or accept the default.

Once the workflow has been submitted successfully, you can select “Go to status” to view the status of the workflow’s stages

Select a stage that produces output and choose the “Logs” tab to see the output generated by the
stage as we did in an earlier
example with a manually
written workflow. In the example below, we see the beginning of LAMMPS output from the run-lammps
stage

To run this workflow through the CLI you will need access to the Fuzzball CLI. You can install it using the Fuzzball CLI installation instructions.
When using the CLI to execute workflow templates from the workflow catalog you need to supply parameters in the form of a yaml file. For the LAMMPS workflow simulating a simple Lennard Jones fluid you can create this file like so:
$ cat > lj.yaml <<EOF
values:
- name: "ScratchVolume"
string_value: "volume://user/ephemeral"
- name: "DataVolume"
string_value: "volume://user/persistent"
- name: "ExperimentUrl"
string_value: "https://raw.githubusercontent.com/wresch/lammps_examples/refs/heads/main/level1/lenard-jones-fluid/my-first-input"
- name: "StageinScript"
string_value: "stagein.sh"
- name: "StageoutScript"
string_value: "stageout.sh"
- name: "RunName"
string_value: "lj-my-first-input"
- name: "OutputPath"
string_value: "results/lammps_cpu"
- name: "LammpsContainerUri"
string_value: "docker://community.wave.seqera.io/library/lammps:2024.08.29--4e9c8f5535deab3e"
- name: "LammpsOptions"
string_value: ""
- name: "Cores"
uint_value: 4
- name: "Memory"
string_value: "32768MiB"
- name: "Nodes"
uint_value: 2
- name: "MpiFlavor"
string_value: "openmpi"
- name: "Timeout"
string_value: "30m"
EOF
Next you need to obtain the ID of the LAMMPS workflow template. That can be done in a few different ways. For example:
$ fuzzball application list
NAME | ID | OWNER | PROVIDER | UPDATETIME | DISABLED
SomeApp | 1767f241-c9ad-44ae-a2b6-e1edbf00770d | ACCOUNT | | 2025-04-21 04:38:09PM | false
...
Hello World (example) | 00000001-aaaa-bbbb-cccc-dddddddddddd | PROVIDER | CIQ | 2025-03-06 08:00:00PM | false
Jupyter Notebook | 00000002-aaaa-bbbb-cccc-dddddddddddd | PROVIDER | CIQ | 2025-03-06 08:00:00PM | false
Jupyter Notebook (VDI) | 00000003-aaaa-bbbb-cccc-dddddddddddd | PROVIDER | CIQ | 2025-03-06 08:00:00PM | false
ParaView | 00000004-aaaa-bbbb-cccc-dddddddddddd | PROVIDER | CIQ | 2025-03-06 08:00:00PM | false
Xfce Desktop Environment | 00000005-aaaa-bbbb-cccc-dddddddddddd | PROVIDER | CIQ | 2025-03-06 08:00:00PM | false
LAMMPS (CPU) | 00000006-aaaa-bbbb-cccc-dddddddddddd | PROVIDER | CIQ | 2025-03-06 08:00:00PM | false
...
$ id="$(fuzzball application list | awk -F'|' '$4 ~ /CIQ/ && $1 ~ /LAMMPS \(CPU\)/{print $2}' | tr -d ' ')"
Of if you have jq installed you could make use of the option to return json format metadata about
all applications as shown below:
$ id="$(fuzzball application list --json | jq -r '.applications[] | select(.name == "LAMMPS (CPU)" and .provider=="CIQ") | .id')"
Or you can copy and paste the workflow template id instead of assigning it to a variable. Once you have the id of the workflow template and a values file you can use them to create a Fuzzfile for submission like so:
$ fuzzball application render-application $id lj.yaml | awk '/^version/{p=1} p==1' > lj.fz
$ head lj.fz
version: v1
volumes:
scratch:
reference: volume://user/ephemeral
ingress:
- destination:
uri: file://stagein.sh
source:
uri: https://raw.githubusercontent.com/wresch/lammps_examples/refs/heads/main/level1/lenard-jones-fluid/my-first-input/stagein.sh
- destination:
Note that we used awk to remove any content above the initial version line in case there were any
lines at the top.
The Fuzzfile is then submitted and monitored as described previously like so:
$ fuzzball workflow start lj.fz
Workflow "faa08e43-30e6-4fa3-b820-76b0d1d7517e" started.
$ sleep 10m # or just wait until the submitted workflow is finished
$ fuzzball workflow describe faa08e43-30e6-4fa3-b820-76b0d1d7517e
Name: lj.fz
Email: wresch@ciq.com
UserId: 87145648-b830-4291-ab7e-40880d61334e
Status: STAGE_STATUS_FINISHED
Cluster: fuzzball-aws-stable
Created: 2025-04-25 10:59:16AM
Started: 2025-04-25 10:59:17AM
Finished: 2025-04-25 11:03:46AM
Error:
Stages:
KIND | STATUS | NAME | STARTED | FINISHED
Workflow | Finished | faa08e43-30e6-4fa3-b820-76b0d1d7517e | 2025-04-25 10:59:16AM | 2025-04-25 11:03:46AM
Volume | Finished | data | 2025-04-25 10:59:17AM | 2025-04-25 10:59:45AM
Volume | Finished | scratch | 2025-04-25 10:59:17AM | 2025-04-25 10:59:45AM
Image | Finished | docker://community.wave.seqera.io/library/... | 2025-04-25 10:59:17AM | 2025-04-25 10:59:43AM
Image | Finished | docker://alpine:latest | 2025-04-25 10:59:17AM | 2025-04-25 10:59:43AM
File | Finished | https://raw.githubusercontent.com/wresch/l... | 2025-04-25 11:00:11AM | 2025-04-25 11:00:15AM
File | Finished | https://raw.githubusercontent.com/wresch/l... | 2025-04-25 11:00:11AM | 2025-04-25 11:00:14AM
Job | Finished | stagein | 2025-04-25 11:00:41AM | 2025-04-25 11:00:46AM
Job | Finished | run-lammps | 2025-04-25 11:02:36AM | 2025-04-25 11:02:52AM
Job | Finished | stageout | 2025-04-25 11:03:13AM | 2025-04-25 11:03:23AM
$ fuzzball workflow log faa08e43-30e6-4fa3-b820-76b0d1d7517e run-lammps
LAMMPS (29 Aug 2024)
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
Created orthogonal box = (-20 -20 -20) to (20 20 20)
2 by 2 by 2 MPI processor grid
Created 1500 atoms
using lattice units in orthogonal box = (-20 -20 -20) to (20 20 20)
create_atoms CPU = 0.010 seconds
...
Loop time of 6.36845 on 8 procs for 10000 steps with 1600 atoms
Performance: 678343.507 tau/day, 1570.240 timesteps/s, 2.512 Matom-step/s
41.4% CPU use with 8 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0.02315 | 0.027141 | 0.03132 | 1.5 | 0.43
Neigh | 0.049026 | 0.051735 | 0.05648 | 0.9 | 0.81
Comm | 1.8219 | 1.9563 | 2.1093 | 6.2 | 30.72
Output | 0.38267 | 1.2437 | 3.506 | 82.6 | 19.53
Modify | 0.10159 | 0.11591 | 0.13687 | 3.5 | 1.82
Other | | 2.974 | | | 46.69
Nlocal: 200 ave 221 max 172 min
Histogram: 1 0 0 0 1 2 2 1 0 1
Nghost: 222.75 ave 255 max 199 min
Histogram: 1 2 1 1 0 0 1 1 0 1
Neighs: 244.25 ave 302 max 196 min
Histogram: 1 1 0 1 1 2 1 0 0 1
Total # of neighbors = 1954
Ave neighs/atom = 1.22125
Neighbor list builds = 1249
Dangerous builds = 0
Total wall time: 0:00:06