A contact solver for physics-based simulations involving 👚 shells, 🪵 solids and 🪢 rods. All made by ZOZO, Inc., the largest fashion e-commerce company in Japan.
We highly respect that readers expect human-written content. The majority of texts are human-typed. Our use of LLMs is clarified in 🤖 LLM Transparency.
🚀 Double click start.bat (Windows) or run a Docker command (Linux/Windows) to get it running

🌐 Click the URL and explore our examples

⚠️ Built for offline uses; not real time. Some examples may run at an interactive rate.
More history records
560.94 (Issue Link)The main branch is undergoing frequent updates and will deviate from the paper.
To retain consistency with the paper, we have created a new branch sigasia-2024.
ghcr.io/st-tech/ppf-contact-solver-compiled-sigasia-2024:latest of this branch.⚠️ Do not run
warmup.pylocally. If you do, you are very likely to hit failures and find it difficult to cleanup.
For Windows 10/11 users, a self-contained executable (~230MB) is available. No Python, Docker, or CUDA Toolkit installation is needed. All should simply work out of the box (Video).
🤔 If you are cautious, you can review the build workflow to verify safety yourself. We try to maximize transparency; we never build locally and upload.
start.batJupyterLab frontend will auto-start. You should be able to access it at http://localhost:8080.
Install a NVIDIA driver (Link) on your host system and follow the instructions below specific to the operating system to get a Docker running:
| 🐧 Linux | 🪟 Windows |
|---|---|
Install the Docker engine from here (Link). Also, install the NVIDIA Container Toolkit (Link). Just to make sure that the Container Toolkit is loaded, run sudo service docker restart. |
Install the Docker Desktop (Link). You may need to log out or reboot after the installation. After logging back in, launch Docker Desktop to ensure that Docker is running. |
Next, run the following command to start the container. If no edits are needed, just copy and paste:
$MY_WEB_PORT = 8080 # Web port on your side
$IMAGE_NAME = "ghcr.io/st-tech/ppf-contact-solver-compiled:latest"
docker run --rm -it `
--name ppf-contact-solver `
--gpus all `
-p ${MY_WEB_PORT}:${MY_WEB_PORT} `
-e WEB_PORT=${MY_WEB_PORT} `
$IMAGE_NAME # Image size ~1GB
MY_WEB_PORT=8080 # Web port on your side
IMAGE_NAME=ghcr.io/st-tech/ppf-contact-solver-compiled:latest
docker run --rm -it \
--name ppf-contact-solver \
--gpus all \
-p ${MY_WEB_PORT}:${MY_WEB_PORT} \
-e WEB_PORT=${MY_WEB_PORT} \
$IMAGE_NAME # Image size ~1GB
The image download shall be started. Our image is hosted on GitHub Container Registry (~1GB). JupyterLab will then auto-start. Eventually you should be seeing:
==== JupyterLab Launched! 🚀 ====
http://localhost:8080
Press Ctrl+C to shutdown
================================
Next, open your browser and navigate to http://localhost:8080. The port 8080 can change if you change the MY_WEB_PORT variable.
Keep your terminal window open.
Now you are ready to go! 🎉
To shut down the container, just press Ctrl+C in the terminal.
The container will be removed and all traces will be cleaned up. 🧹
If you wish to keep the container running in the background, replace
--rmwith-d. To shutdown the container and remove it, rundocker stop ppf-contact-solver && docker rm ppf-contact-solver.
If you wish to build the docker image from scratch, please refer to the cleaner installation guide (Markdown).
Our frontend is accessible through a browser using our built-in JupyterLab interface. All is set up when you
$ claude mcp add ppf-contact-solver \
-- python -m otcore.mcp_server <graph>